Fresh IDE . Changes On Branch FreshLibDev
Not logged in

This repository is a mirror!

The original is located on: https://fresh.flatassembler.net/fossil/repo/fresh
If you want to follow the project, please update your remote-url

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch FreshLibDev Excluding Merge-Ins

This is equivalent to a diff from 3a7315a438 to 8d2859d862

2024-01-31
13:32
Windows support for the TWindows:WinIcon property. Leaf check-in: 8d2859d862 user: johnfound tags: FreshLibDev
10:06
Removed the OS dependent constant CRLF and replaced with bNEWLINE, wNEWLINE and dNEWLINE (byte, word and dword constants) in order to increase the consistency between the different OS versions. Some problems with the old sources are possible, but easyly fixable. check-in: 5d795952a2 user: johnfound tags: FreshLibDev
2011-03-01
09:15
Cleanup of FreshLib branch. It becomes now "trunk" of FreshLib project and should be kept up to date and stable. For development purposes is to be used FreshLibDev branch. check-in: d97e5cbbee user: lhmnai0 tags: FreshLib
08:53
Create new branch named "FreshLibDev". This branch have to be used for every development purposes. It may contains unstable and not working versions of the library. check-in: 8457878f01 user: lhmnai0 tags: FreshLibDev
08:28
Fixes in simpledebug - OS independent code was moved to the root directory. Some labels was renamed in order to separate internal code from user procedures. check-in: 3a7315a438 user: lhmnai0 tags: FreshLib
2011-02-28
20:46
Changed %OS% environment variable to %TargetOS% to avoid possible conflicts in Windows that have defined this variable. check-in: 7bde8f89b7 user: johnfound tags: FreshLib

Deleted freshlib/GUI/GUI.asm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
; includes OS specific utility procedures, data, etc.
include 'progutils.asm'


; OS independent template engine.
include 'ObjTemplates.asm'

; OS independent components
include 'objects.asm'

include 'TObject.asm'
include 'TWindow.asm'

include 'TApplication.asm'
include 'TForm.asm'
include 'TButton.asm'
include 'TEdit.asm'

; OS independent main procedures.
include 'Main.asm'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































Deleted freshlib/GUI/Linux/Main.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
uglobal
  _globalevent  XEvent
endg



proc ProcessSystemEvents
begin

.event_loop:
        cinvoke XPending, [hApplicationDisplay]
        test    eax, eax
        jz      .noevents

        cinvoke  XNextEvent, [hApplicationDisplay], _globalevent
        stdcall  __ProcessOneSystemEvent, _globalevent

; check for quit
        cmp     [_globalevent.type], DestroyNotify
        jne     .event_loop

        mov     eax, [_globalevent.window]
        mov     ecx, [Application]
        cmp     [ecx+TApplication.MainWindow], eax
        jne     .event_loop

; main window destroyed, so terminate whole application.
        xor     eax, eax
        stc
        return

.noevents:
        clc
        return
endp



proc WaitForSystemEvent
.event XEvent
begin
        lea     eax, [.event]
        cinvoke XPeekEvent, [hApplicationDisplay], eax
        return
endp




ExitApplication:
        push    eax
        FinalizeAll
        pop     eax
        cinvoke exit, eax
        int3



proc __ProcessOneSystemEvent, .linux_event
.event  rb 32
begin
        push    eax ebx ecx edx esi edi

        mov     ebx, [.linux_event]

        stdcall _GetWindowStruct, [ebx+XEvent.window]
        test    eax, eax
        jz      .notprocessed

        mov     esi, eax
        lea     edi, [.event]


        cmp     [ebx+XEvent.type], MotionNotify
        je      .mousemove

        cmp     [ebx+XEvent.type], EnterNotify
        je      .mouseenter

        cmp     [ebx+XEvent.type], LeaveNotify
        je      .mouseleave

        cmp     [ebx+XEvent.type], KeyPress
        je      .mouse_btn_press
        cmp     [ebx+XEvent.type], ButtonPress
        je      .mouse_btn_press

        cmp     [ebx+XEvent.type], KeyRelease
        je      .mouse_btn_release
        cmp     [ebx+XEvent.type], ButtonRelease
        je      .mouse_btn_release

        cmp     [ebx+XEvent.type], Expose
        je      .paint_window


.notprocessed:
        pop     edi esi edx ecx ebx eax
        stc
        return

.finish:
        pop     edi esi edx ecx ebx eax
        clc
        return

.mouseleave:
        mov     [edi+TMouseEnterEvent.event], seMouseLeave
        stdcall ExecEvent, esi, edi
        jmp     .finish

.mouseenter:
        mov     [edi+TMouseEnterEvent.event], seMouseEnter
        stdcall ExecEvent, esi, edi
        jmp     .finish

.mousemove:
        mov     [edi+TMouseMoveEvent.event], seMouseMove
        mov     eax, [ebx+XMotionEvent.x]
        mov     ecx, [ebx+XMotionEvent.y]
        mov     [edi+TMouseMoveEvent.x], eax
        mov     [edi+TMouseMoveEvent.y], ecx
        stdcall ExecEvent, esi, edi
        jmp     .finish


.paint_window:
        mov     [edi+TPaintEvent.event], sePaint

        mov     eax, [esi+TWindow.handle]
        mov     [edi+TPaintEvent.raster], eax

        mov     eax, [ebx+XExposeEvent.x]
        mov     ecx, [ebx+XExposeEvent.y]

        mov     [edi+TPaintEvent.rect.left], eax
        mov     [edi+TPaintEvent.rect.top], ecx

        mov     eax, [ebx+XExposeEvent.width]
        mov     ecx, [ebx+XExposeEvent.height]

        mov     [edi+TPaintEvent.rect.right], eax
        mov     [edi+TPaintEvent.rect.bottom], ecx

        pushad
        stdcall ExecEvent, esi, edi
        popad

        jmp     .finish

.mouse_btn_press:
.mouse_btn_release:

        mov     eax, [ebx+XButtonEvent.type]
        mov     [edi+TMouseButtonEvent.event], eax      ; seMouseBtnPress=ButtonPress and seMouseBtnRelease = ButtonRelease

        mov     eax, [ebx+XButtonEvent.button]
        dec     eax
        mov     [edi+TMouseButtonEvent.Button], eax

        mov     eax, [ebx+XButtonEvent.state]
        mov     [edi+TMouseButtonEvent.kbdStatus], eax

        stdcall ExecEvent, esi, edi
        jmp     .finish

.keyboard_events:

        jmp     .finish
endp






;proc _CommonWindowEventHandler, .ptrevent
;begin
;        push    esi edi ebx eax
;
;        mov     esi, [.ptrevent]
;        mov     ecx, [esi+XEvent.type]
;        mov     eax, [esi+XEvent.window]
;
;        stdcall _GetWindowStruct, [esi+XEvent.window]
;        test    eax, eax
;        jz      .finish
;
;        mov     edi, eax
;        mov     ebx, [edi+TObject.ptrClass]
;
;        mov     eax, [ebx+TObjectClass.procSysEventHandler]
;        cmp     eax, 0
;        je      .go_further
;
;        push    [.ptrevent]
;        call    eax
;        jc      .go_further
;
;.finish:
;        pop     eax ebx edi esi
;        return
;
;.go_further:
;        mov     eax, [esi+XEvent.type]
;        cmp     eax, CreateNotify
;        je      .create
;        cmp     eax, DestroyNotify
;        je      .destroy
;
;        stc
;        pop     eax ebx edi esi
;        return
;
;.create:
;        mov     eax, [edi+TWindow.OnCreate]
;        cmp     eax, 0
;        je      @f
;        call    eax
;@@:
;        clc
;        pop     eax ebx edi esi
;        return
;
;.destroy:
;        mov     eax, [edi+TWindow.OnDestroy]
;        cmp     eax, 0
;        je      @f
;        call    eax
;@@:
;        clc
;        pop     eax ebx edi esi
;        return
;endp
;
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































































































































































































































































































































































































Deleted freshlib/GUI/Linux/TApplication.asm.

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
uglobal
  hApplicationDisplay dd ?
  hRootWindow         dd ?
  wmdelete_atom       dd ?
  _SystemFont         dd ?
endg

iglobal
  _cWinDeleteName db 'WM_DELETE_WINDOW', 0
endg


win_structure_context = 1


proc TApplication.Create, .obj, .parent
begin
        cinvoke XOpenDisplay, 0
        test    eax, eax
        jz      .exit_error

        mov     [hApplicationDisplay], eax

        cinvoke XDefaultRootWindow, eax
        mov     [hRootWindow], eax

        cinvoke XInternAtom, [hApplicationDisplay], _cWinDeleteName, 0
        mov     [wmdelete_atom], eax

;cDefaultFont text 'DejaVu Sans-9:antialias=false:weight=medium'
cDefaultFont text 'Liberation sans-9'

        cinvoke XftFontOpenName, [hApplicationDisplay], 0, cDefaultFont
        mov   [_SystemFont], eax

        clc
        return

.exit_error:
        stc
        return
endp




proc TApplication.Get, .obj, .paramID
begin
        stc
        return
endp



proc TApplication.Set, .obj, .paramID, .value
begin
        stc
        return
endp



proc TApplication.SysEventHandler
begin
        clc
        return
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































Deleted freshlib/GUI/Linux/TWindow.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
proc TWindow.Create, .obj, .parent
begin
        push    eax ecx edx esi edi

        mov     ebx, [.obj]

        mov     eax, [.parent]
        test    eax, eax
        jz      .root
        mov     eax, [eax+TWindow.handle]
        jmp     .parentok

.root:
        mov     eax, [hRootWindow]

.parentok:
        cinvoke XCreateSimpleWindow, [hApplicationDisplay], eax, 0, 0, 1, 1, 0, 0, $d4d0c8
        mov     [ebx+TWindow.handle], eax

        stdcall _SetWindowStruct, eax, ebx

        cinvoke XSetWMProtocols, [hApplicationDisplay], [ebx+TForm.handle], wmdelete_atom, 1
        cinvoke XSelectInput, [hApplicationDisplay], [ebx+TWindow.handle], ExposureMask or KeyPressMask or KeyReleaseMask or SubstructureNotifyMask or ButtonPressMask or ButtonReleaseMask or EnterWindowMask or LeaveWindowMask

        clc
        pop     edi esi edx ecx eax
        return
endp




proc TWindow.Destroy, .obj
begin
        push    eax
        stdcall IsObject, [.obj], CWindow
        jc      .exit
        mov     eax, [.obj]
        cinvoke XDestroyWindow, [hApplicationDisplay], [eax+TWindow.handle]
.exit:
        pop     eax
        return
endp



proc TWindow.Get, .obj, .paramID
.rect RECT
begin
        stdcall IsObject, [.obj], CWindow
        jc      .fault

        push    ecx edx esi ebx

        mov     esi, [.obj]
        mov     eax, [.paramID]

        test    eax, maskParameter
        jz      .field

        cmp     eax, 4 or maskParameter
        jb      .getrect

        cmp     eax, TWindow.visible
        je      .getvisible

        cmp     eax, TWindow.caption
        je      .getcaption

.fault:
        stc
.finish:
        pop     ebx esi edx ecx
        return

.field:
        mov     ebx, [.paramID]
        mov     eax, [esi+ebx]
        clc
        jmp     .finish


.getcaption:
        stdcall StrDup, [esi+TWindow.Fcaption]
        clc
        jmp     .finish


.getvisible:
        clc
        jmp     .finish


.getrect:
locals
  .attr XWindowAttributes
endl
        lea     ecx, [.attr]
        cinvoke XGetWindowAttributes, [hApplicationDisplay], [esi+TWindow.handle], ecx

        mov     eax, [.paramID]
        sub     eax, TWindow.x
        mov     eax, [.attr+4*eax]
        jmp     .finish
endp




proc TWindow.Set, .obj, .idparam, .value
  .wch XWindowChanges
begin
        stdcall IsObject, [.obj], CWindow
        jc      .fault

        push    esi eax

        mov     esi, [.obj]
        mov     eax, [.idparam]

        test    eax, maskParameter
        jz      .field

        cmp     eax, 4 or maskParameter
        jb      .configure

        cmp     eax, TWindow.visible
        je      .setvisible

        cmp     eax, TWindow.caption
        je      .setcaption

        pop     eax esi
.fault:
        stc
        return


.field:
        stc
        pop     eax esi
        return


.setcaption:
        lea     eax, [esi+TWindow.Fcaption]
        stdcall SetString, eax, [.value]
        stdcall StrPtr, [eax]

        cinvoke XStoreName, [hApplicationDisplay], [esi+TWindow.handle], eax
        clc
        pop     eax esi
        return

.setvisible:
        cmp     [.value], 0
        je      .hide

        cinvoke XMapWindow, [hApplicationDisplay], [esi+TWindow.handle]
        clc
        pop     eax esi
        return

.hide:
        cinvoke XUnmapWindow, [hApplicationDisplay], [esi+TWindow.handle]
        clc
        pop     eax esi
        return

.configure:
        mov     cl, al
        mov     edx, 1
        shl     edx, cl

        pushd   [.value]
        popd    [.wch+ 4*eax]

        lea     eax, [.wch]
        cinvoke XConfigureWindow, [hApplicationDisplay], [esi+TWindow.handle], edx, eax
        clc
        pop     eax esi
        return
endp



proc _GetWindowStruct, .hwin
  .user_data dd ?
begin
        lea     eax, [.user_data]
        cinvoke XFindContext, [hApplicationDisplay], [.hwin], win_structure_context, eax
        test    eax, eax
        jnz     .error

        mov     eax, [.user_data]
        clc
        return

.error:
        DebugMsg 'FreshLib: Error find context.'
        int3
endp




proc _SetWindowStruct, .hwin, .value
begin
        cinvoke XSaveContext, [hApplicationDisplay], [.hwin], win_structure_context, [.value]
        return
endp






proc RefreshWindow, .ptrobj
.event XExposeEvent
begin
        push    eax ebx ecx edx esi edi
        mov     ebx, [.ptrobj]

        lea     eax, [.event]
        mov     ecx, [hApplicationDisplay]
        mov     edx, [ebx+TWindow.handle]
        mov     [eax+XExposeEvent.type], Expose
        mov     [eax+XExposeEvent.display], ecx
        mov     [eax+XExposeEvent.window], edx

        cinvoke XSendEvent, ecx, edx, FALSE, ExposureMask, eax

        pop     edi esi edx ecx ebx eax eax
        return
endp


proc GetRaster, .pObj
begin
        stdcall IsObject, [.pObj], CWindow
        jc      .exit

        mov     eax, [.pObj]
        mov     eax, [eax+TWindow.handle]
        clc
.exit:
        return
endp

proc FreeRaster, .raster
begin
        return
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































































































































































































































































































































































































Deleted freshlib/GUI/Main.asm.

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
uglobal
  Application dd ?
endg


proc Run
begin

.mainloop:
        stdcall ProcessSystemEvents
        jc      .terminate

        mov     eax, [Application]
        test    eax, eax
        jz      .eventok

        cmp     [eax+TApplication.OnIdle], 0
        je      .eventok

        pushad
        stdcall [eax+TApplication.OnIdle], eax
        popad

.eventok:
        stdcall WaitForSystemEvent
        jmp     .mainloop

.terminate:
        return
endp





include '%TargetOS%/Main.asm'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































Deleted freshlib/GUI/ObjTemplates.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
tfChild  = 0
tfParent = 1
tfEnd    = 2


struct TObjTemplate
  .flags     dd  ?         ; tfParent; tfEnd
  .class     dd  ?
  .ptrVar    dd  ?         ; can be NULL
  .paramsize dd  ?
  .params:
ends


macro ObjTemplate  flags, class, name, [id, param] {
common
local ..paramsize, ..prms
      dd  flags
      dd  C#class
      dd  name
      dd  ..paramsize
..prms:
forward
local ..value
      dd  T#class#.#id
      dd  ..value
common
      dd  -1
forward
  if param eqtype 2
    ..value = param
  else
    ..value db param, 0
  end if
common
  name dd ?
  ..paramsize = $ - ..prms
}


; returns the last created window in ebx.

proc CreateFromTemplate, .ptrTemplate, .parent
begin
        push    esi

        mov     esi, [.ptrTemplate]
        stdcall _DoCreateFromTemplate, [.parent]

        pop     esi
        return
endp


proc _DoCreateFromTemplate, .parent
begin
        push    eax ecx edx

.createloop:

        stdcall Create, [esi+TObjTemplate.class], [.parent]

        lea     ecx, [esi+TObjTemplate.params]

.paramloop:
        cmp     dword [ecx], -1
        je      .paramsok

        push    ebx ecx edx esi edi
        stdcall Set, ebx, [ecx], [ecx+4]
        pop     edi esi edx ecx ebx
        add     ecx, 8
        jmp     .paramloop

.paramsok:
        mov     eax, [esi+TObjTemplate.ptrVar]
        test    eax, eax
        jz      .oncreate

        mov     [eax], ebx      ; returned pointer/handle to the object.

.oncreate:
        cmp     [ebx+TObject.OnCreate], 0
        je      .gonext

; execute user OnCreate event.
        pushad
        stdcall [ebx+TObject.OnCreate], ebx
        popad

.gonext:
        mov     edx, [esi+TObjTemplate.flags]

        mov     eax, sizeof.TObjTemplate
        add     eax, [esi+TObjTemplate.paramsize]
        add     esi, eax

        test    edx, tfParent
        jz      .childrenok

        push    ebx
        stdcall _DoCreateFromTemplate, ebx
        pop     ebx

.childrenok:
        test    edx, tfEnd
        jz      .createloop

.exit:
        pop     edx ecx eax
        return
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
































































































































































































































Deleted freshlib/GUI/TApplication.asm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        ObjectClass Application,        \
            Object,                     \
            TApplication.Create,        \
            0,                          \
            TApplication.Get,           \
            TApplication.Set,           \
            TApplication.SysEventHandler

; The root object in the application.
; every other object will be child on the TApplication.MainWindow.
; only one instance of TApplication should be created.
;
object TApplication, TObject
  .MainWindow   dd ?
  .Accelerators dd ?    ; table of application wide hot keys.
  .OnIdle       dd ?    ; user event handler for idle state.
endobj


include '%TargetOS%/TApplication.asm'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































Deleted freshlib/GUI/TButton.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
ObjectClass Button,                     \
            Window,                     \
            0,                          \
            0,                          \
            TButton.Get,                \
            TButton.Set,                \
            TButton.SysEventHandler


; Button states for the field TButton.state
btnNormal    = 0
btnPressed   = 1
btnPointed   = 2
btnChecked   = 3



object TButton, TWindow
  .state      dd ?
  .icon       dd ?
  .Ftextalign dd ?

  .OnClick dd ?

  param .TextAlign
endobj



proc TButton.Get, .obj, .paramID
begin
        stdcall IsObject, [.obj], CButton
        jc      .exit

        cmp     [.paramID], TButton.OnClick
        je      .getonclick

        cmp     [.paramID], TButton.TextAlign
        je      .gettextalign

        stc
.exit:
        return

.gettextalign:
        mov     eax, [.obj]
        mov     eax, [eax+TButton.Ftextalign]
        clc
        return

.getonclick:
        mov     eax, [.obj]
        mov     eax, [eax+TButton.OnClick]
        clc
        return
endp




proc TButton.Set, .obj, .paramID, .value
begin
        push    eax
        cmp     [.paramID], TButton.OnClick
        je      .setonclick

        cmp     [.paramID], TButton.TextAlign
        je      .settextalign

        stc
        pop     eax
        return

.settextalign:
        mov     eax, [.obj]
        push    [.value]
        pop     [eax+TButton.Ftextalign]
        stdcall RefreshWindow, [.obj]
        clc
        pop     eax
        return

.setonclick:
        stdcall IsObject, [.obj], CButton
        jc      .exit

        mov     eax, [.obj]

        push    [.value]
        pop     [eax+TButton.OnClick]
        clc

.exit:
        pop     eax
        return
endp



proc TButton.SysEventHandler, .pObj, .pEvent
begin
        push    eax ebx ecx edx esi edi

        mov     esi, [.pObj]
        mov     ebx, [.pEvent]
        mov     eax, [ebx+TSysEvent.event]
        cmp     eax, sePaint
        je      .onpaint

        cmp     eax, seMouseEnter
        je      .enter
        cmp     eax, seMouseLeave
        je      .leave

        cmp     eax, seMouseBtnPress
        je      .pressed
        cmp     eax, seMouseBtnRelease
        je      .released

.finish:
        stc
        pop     edi esi edx ecx ebx eax
        return

.pressed:
        mov     [esi+TButton.state], btnPressed
        stdcall  RefreshWindow, esi
        jmp     .finish

.released:
        test    [ebx+TMouseButtonEvent.kbdStatus], maskBtnLeft or maskBtnMiddle or maskBtnRight
        jnz     .finish

        cmp     [esi+TButton.state], btnPressed
        jne     .finish

        mov     [esi+TButton.state], btnPointed
        stdcall RefreshWindow, esi

        cmp     [esi+TButton.OnClick], 0
        je      .finish

        pushad
        stdcall [esi+TButton.OnClick], esi, [ebx+TMouseButtonEvent.Button]
        popad
        jmp     .finish

.enter:
        mov     [esi+TButton.state], btnPointed
        stdcall  RefreshWindow, esi
        jmp     .finish

.leave:
        mov     [esi+TButton.state], btnNormal
        stdcall  RefreshWindow, esi
        jmp     .finish

.onpaint:
        stdcall Get, esi, TButton.width
        mov     ecx, eax
        stdcall Get, esi, TButton.height

        mov     edx, bxFlat
        cmp     [esi+TButton.state], btnNormal
        je      .drawit
        mov     edx, bxRaised
        cmp     [esi+TButton.state], btnPointed
        je      .drawit
        mov     edx, bxSunken
        cmp     [esi+TButton.state], btnPressed
        je      .drawit

        mov     edx, bxFlat

.drawit:
locals
 .bounds TBounds
endl
        stdcall DrawBox, [ebx+TPaintEvent.raster], 0, 0, ecx, eax, $c0c0c0, edx

        mov     [.bounds.x], 2
        mov     [.bounds.y], 2
        mov     [.bounds.width], ecx
        mov     [.bounds.height], eax
        sub     [.bounds.width], 4
        sub     [.bounds.height], 4

        stdcall Get, esi, TWindow.caption
        push    eax eax
        stdcall StrLen, eax
        mov     ecx, eax
        pop     eax
        lea     edx, [.bounds]
        stdcall DrawTextBox, [ebx+TPaintEvent.raster], eax, edx, [esi+TButton.Ftextalign], 0
        stdcall StrDel ; from the stack
        jmp     .finish
endp

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































Deleted freshlib/GUI/TEdit.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
; it is single line text edit widget for FreshLib

ObjectClass Edit,                       \
            Window,                     \
            TEdit.Create,               \
            TEdit.Destroy,              \
            TEdit.Get,                  \
            TEdit.Set,                  \
            TEdit.SysEventHandler


object TEdit, TWindow
  .Ftext dd ?

  param .Text
endobj


proc TEdit.Create, .obj, .parent
begin
        push    ecx eax
        stdcall StrNew
        mov     ecx, [.obj]
        mov     [ecx+TEdit.Ftext], eax

        mov     [ecx+TEdit.Fcursor], mcText
        pop     eax ecx
        clc
        return
endp


proc TEdit.Destroy, .obj
begin
        mov     eax, [.obj]
        stdcall StrDel, [eax+TEdit.Ftext]
        return
endp


proc TEdit.Get, .obj, .paramID
begin
        stdcall IsObject, [.obj], CEdit
        jc      .exit

        cmp     [.paramID], TEdit.Text
        je      .gettext

        stc
.exit:
        return

.gettext:
        mov     eax, [.obj]
        stdcall StrDup, [eax+TEdit.Ftext]
        clc
        return
endp




proc TEdit.Set, .obj, .paramID, .value
begin
        cmp     [.paramID], TEdit.Text
        je      .settext

        stc
        return

.settext:
        push    eax
        mov     eax, [.obj]
        lea     eax, [eax+TEdit.Ftext]
        stdcall SetString, eax, [.value]
        stdcall RefreshWindow, [.obj]
        pop     eax
        clc
        return
endp



proc TEdit.SysEventHandler, .pObj, .pEvent
begin
        push    eax ebx ecx edx esi edi

        mov     esi, [.pObj]
        mov     ebx, [.pEvent]
        mov     eax, [ebx+TSysEvent.event]

        cmp     eax, sePaint
        je      .onpaint

.finish:
        stc
        pop     edi esi edx ecx ebx eax
        return


.onpaint:
        stdcall Get, esi, TEdit.width
        mov     ecx, eax
        stdcall Get, esi, TEdit.height

locals
 .bounds TBounds
endl
        stdcall DrawBox, [ebx+TPaintEvent.raster], 0, 0, ecx, eax, $ffffff, bxSunken

        mov     [.bounds.x], 2
        mov     [.bounds.y], 2
        mov     [.bounds.width], ecx
        mov     [.bounds.height], eax
        sub     [.bounds.width], 4
        sub     [.bounds.height], 4

        stdcall Get, esi, TEdit.Text
        push    eax eax
        stdcall StrLen, eax
        mov     ecx, eax
        pop     eax
        lea     edx, [.bounds]
        stdcall DrawTextBox, [ebx+TPaintEvent.raster], eax, edx, dtfAlignLeft or dtfAlignTop, 0
        stdcall StrDel ; from the stack
        jmp     .finish
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























































































































































































































































Deleted freshlib/GUI/TForm.asm.

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
ObjectClass Form,                       \
            Window,                     \
            0,                          \
            0,                          \
            TForm.Get,                  \
            TForm.Set,                  \
            TForm.SysEventHandler


borderNone  = 0
borderFull  = 1
borderModal = 2
borderToolbox = 3


object TForm, TWindow
  param .type
endobj



; OS independent code.

proc TForm.Get, .obj, .paramID
begin
        stc
        return
endp



proc TForm.Set, .obj, .paramID, .value
begin
        stc
        return
endp



proc TForm.SysEventHandler, .pObj, .pEvent
begin
        push    ebx esi
        mov     ebx, [.pEvent]
        cmp     [ebx+TSysEvent.event], sePaint
        je      .onpaint

.finish:
        stc
        pop     esi ebx
        return

.onpaint:
        mov     esi, [.pObj]
        stdcall Get, esi, TForm.width
        mov     ecx, eax
        stdcall Get, esi, TForm.height

        stdcall DrawFillRect, [ebx+TPaintEvent.raster], 0, 0, ecx, eax, $c0c0c0
        jmp     .finish
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































































































Deleted freshlib/GUI/TLabel.asm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ObjectClass TextLabel,       \
            Window,          \
            Create,          \
            0,               \
            TLabel.Get,      \
            TLabel.Set,      \
            TLabel.SysEventHandler


object TLabel, TWindow
  .border     dd  ?     ; border flags.
  .TextAline  dd  ?     ; text align flags.
  .control    dd  ?     ; pointer of some control, that to get focus if the labels hot key is pressed.
endobj


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
































Deleted freshlib/GUI/TObject.asm.

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

ObjectClass  Object,                    \
             Root,                      \
             0,                         \
             TObject.Destroy,           \
             0,                         \
             0,                         \
             0




object TObject
  .ptrClass     dd ?    ; pointer to the object class structure.

  .OnCreate     dd ?    ; user event handlers.
  .OnDestroy    dd ?
endobj




proc TObject.Destroy, .obj
begin
        push    eax
        mov     eax, [.obj]

        cmp     [eax+TObject.OnDestroy], 0
        je      .freeit

        pushad
        stdcall [eax+TObject.OnDestroy], eax
        popad

.freeit:
        stdcall FreeMem, eax
        pop     eax
        return
endp


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































Deleted freshlib/GUI/TWindow.asm.

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
ObjectClass Window,             \
            Object,             \
            TWindow.Create,     \
            TWindow.Destroy,    \
            TWindow.Get,        \
            TWindow.Set,        \
            TWindow.SysEventHandler


object TWindow, TObject

  .handle        dd ?   ; it is handle to the system provided window.
  .ChildIndex    dd ?   ; index of the one children. Used for reading particular children from Child parameter.

  .Fcaption     dd ?    ; string handle with window caption.
  .Fcursor      dd ?    ; it is a handle to the mouse cursor.

; parameters
  param .x
  param .y
  param .width
  param .height
  param .visible
  param .caption
  param .parent
  param .cursor
  param .ChildrenCount  ; read only. Returns the count of the children windows.
  param .SelectedChild  ; read only. Returns pointer to the TObject that is selected in .ChildIndex

endobj


; OS dependend code
include '%TargetOS%/TWindow.asm'



; OS independent code.

proc TWindow.SysEventHandler, .pObj, .pEvent
begin
        push    eax ebx ecx edx esi edi

        mov     esi, [.pObj]
        mov     ebx, [.pEvent]
        mov     eax, [ebx+TSysEvent.event]

        cmp     eax, seMouseEnter
        je      .mouseenter


.finish:
        stc
        pop     edi esi edx ecx ebx eax
        return

.mouseenter:
        mov     eax, [esi+TWindow.Fcursor]
        test    eax, $ffffff00
        jnz     .customcursor

        stdcall GetStockCursor, eax

.customcursor:
        stdcall SetMouseCursor, eax
        jmp     .finish
endp






<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































































































Deleted freshlib/GUI/Win32/Main.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
proc ProcessSystemEvents
.msg MSG
begin
        push    eax ecx edx esi

.msgloop:
        lea     esi, [.msg]
        xor     eax, eax

        invoke  PeekMessage, esi, eax, eax, eax, PM_REMOVE
        test    eax, eax
        jz      .exitok

        cmp     [.msg.message], WM_QUIT
        je      .terminate

        stdcall __ProcessOneSystemEvent, [esi+MSG.hwnd], [esi+MSG.message], [esi+MSG.wParam], [esi+MSG.lParam]
        jnc     .msgloop                ; the message is translated to system event and the event is executed by the object SysEvent handler.

; the message is for window that is not an FreshLib object, so process with standard windows behaviour.
        invoke  TranslateMessage, esi
        invoke  DispatchMessage, esi
        jmp     .msgloop


.exitok:
        clc
        pop     esi edx ecx eax
        return


.terminate:
        mov     eax, [.msg.wParam]
        stc
        pop     esi edx ecx eax
        return
endp



proc WaitForSystemEvent
begin
        push    eax ecx edx
        invoke  WaitMessage
        pop     edx ecx eax
        return
endp



ExitApplication:
        push    eax
        FinalizeAll
        invoke  ExitProcess     ; from the stack.
        int3




;----------------------------------------------------------------------------------------------------------
; This procedure makes following:
;   1. Takes as arguments one windows message
;   2. Converts this message to FreshLib system event (or not, depending on the message)
;   3. Calls SysEventHandler procedures for the given object (if any) with the created event structure.
;   4. returns CF=0 if the event was properly processed.
;   5. returns CF=1 if the event was not processed.
;
; The event can be not processed in the following cases:
;   1. The window that receives the message is not FreshLib object.
;   2. TObjectClass.procSysEventHandler = 0 for the given class and all parents.
;   3. All procSysEventHandler procedures refuse to process the event (CF=1)
;----------------------------------------------------------------------------------------------------------
uglobal
  __LatestPointedObj dd ?
endg


winproc __ProcessOneSystemEvent
.event  rb 32
begin
        push    eax ebx ecx esi edi

        stdcall _GetWindowStruct, [.hwnd]
        test    eax, eax
        jz      .ondefault

        mov     esi, eax
        mov     ebx, [.wmsg]
        lea     edi, [.event]

ondefault
        pop     edi esi ecx ebx eax
        stc
        return

.finish:
        pop     edi esi ecx ebx eax
        clc
        return

onmessage WM_SETCURSOR

        movzx   eax, word [.lparam]
        cmp     eax, HTCLIENT
        jne     .ondefault

        mov     eax, [esi+TWindow.Fcursor]
        test    eax, $ffffff00
        jnz     .customcursor

        stdcall GetStockCursor, eax

.customcursor:
        stdcall SetMouseCursor, eax
        jmp     .finish


onmessage WM_MOUSEMOVE
        cmp     esi, [__LatestPointedObj]
        je      .normal_mouse_move

        mov     [edi+TMouseEnterEvent.event], seMouseLeave
        xchg    esi, [__LatestPointedObj]
        test    esi, esi
        jz      .leaveok
        stdcall ExecEvent, esi, edi

.leaveok:
        mov     esi, [__LatestPointedObj]
        mov     [edi+TMouseEnterEvent.event], seMouseEnter
        stdcall ExecEvent, esi, edi

.normal_mouse_move:
        mov     [edi+TMouseMoveEvent.event], seMouseMove
        movsx   eax, word [.lparam]
        movsx   ecx, word [.lparam+2]
        mov     [edi+TMouseMoveEvent.x], eax
        mov     [edi+TMouseMoveEvent.y], ecx
        stdcall ExecEvent, esi, edi
        jmp     .finish


onmessage WM_PAINT
locals
  .ps PAINTSTRUCT
endl
        lea     eax, [.ps]
        invoke  BeginPaint, [.hwnd], eax

        mov     [edi+TPaintEvent.event], sePaint
        push    [.ps.hdc]
        pop     [edi+TPaintEvent.raster]
        push    [.ps.rcPaint.left] [.ps.rcPaint.top]
        pop     [edi+TPaintEvent.rect.top] [edi+TPaintEvent.rect.left]
        push    [.ps.rcPaint.right] [.ps.rcPaint.bottom]
        pop     [edi+TPaintEvent.rect.bottom] [edi+TPaintEvent.rect.right]

        stdcall ExecEvent, esi, edi

        lea     eax, [.ps]
        invoke  EndPaint, [.hwnd], eax
        pop     edi esi ecx ebx eax
        clc
        return

onmessage WM_LBUTTONUP
onmessage WM_RBUTTONUP
onmessage WM_MBUTTONUP
onmessage WM_LBUTTONDOWN
onmessage WM_RBUTTONDOWN
onmessage WM_MBUTTONDOWN
onmessage WM_LBUTTONDBLCLK
onmessage WM_RBUTTONDBLCLK
onmessage WM_MBUTTONDBLCLK

        stdcall __MouseButton, [.wmsg]
        mov     [edi+TMouseButtonEvent.event], ecx
        mov     [edi+TMouseButtonEvent.Button], eax
        stdcall __KeyStatus, [.wparam]
        mov     [edi+TMouseButtonEvent.kbdStatus], eax

        stdcall ExecEvent, esi, edi
        jmp     .finish

onmessage WM_CHAR
onmessage WM_SYSCHAR

        jmp     .finish
endwp


proc __MouseButton, .msg
begin
        mov     eax, [.msg]
        sub     eax, WM_LBUTTONDOWN
        movzx   ecx, byte [__mouse_event_table+eax]
        movzx   eax, byte [__mouse_button_table+eax]
        return
endp


iglobal
  __mouse_button_table db mbLeft,        mbLeft,       mbLeft
                       db mbRight,       mbRight,      mbRight
                       db mbMiddle,      mbMiddle,     mbMiddle

  __mouse_event_table  db seMouseBtnPress, seMouseBtnRelease, seMouseBtnDblClick
                       db seMouseBtnPress, seMouseBtnRelease, seMouseBtnDblClick
                       db seMouseBtnPress, seMouseBtnRelease, seMouseBtnDblClick
endg

proc __KeyStatus, .status
begin
        xor     eax, eax
        test    [.status], MK_LBUTTON
        jz      @f
        or      eax, maskBtnLeft
@@:
        test    [.status], MK_RBUTTON
        jz      @f
        or      eax, maskBtnRight
@@:
        test    [.status], MK_MBUTTON
        jz      @f
        or      eax, maskBtnMiddle
@@:
        test    [.status], MK_SHIFT
        jz      @f
        or      eax, maskCtrl
@@:
        test    [.status], MK_CONTROL
        jz      @f
        or      eax, maskCtrl
@@:
        return
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































































































































































































































































































































































































































































Deleted freshlib/GUI/Win32/SysEvents.asm.

Deleted freshlib/GUI/Win32/TApplication.asm.

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
uglobal
  hInstance dd ?
endg

initialize InitApplication
begin
        invoke  GetModuleHandle, 0
        mov     [hInstance], eax
        return
endp


proc TApplication.Create, .obj, .parent
begin
        clc
        return
endp


proc TApplication.Get, .obj, .paramID
begin
        clc
        return
endp


proc TApplication.Set, .obj, .paramID, .value
begin
        clc
        return
endp



proc TApplication.SysEventHandler, .obj, .event
begin
        clc
        return
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































































Deleted freshlib/GUI/Win32/TLabel.asm.

Deleted freshlib/GUI/Win32/TWindow.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
cWindowClassName text 'FreshWin'

nWindowExtraBytes = 32
ofsWindowStruct = nWindowExtraBytes - 4

;*********************************************************************************************
; Registers common window class
; Call only once
;*********************************************************************************************
initialize RegisterWindowClass

.wc WNDCLASS

begin
        xor     eax, eax
        lea     edi, [.wc]
        mov     ecx, sizeof.WNDCLASS / 4
        rep stosd

        mov     [.wc.style], CS_OWNDC or CS_DBLCLKS; or CS_VREDRAW or CS_HREDRAW
        mov     [.wc.lpfnWndProc], CommonWindowProc
        mov     [.wc.cbWndExtra], nWindowExtraBytes

        mov     eax,[hInstance]
        mov     [.wc.hInstance],eax
        mov     [.wc.lpszClassName], cWindowClassName

        lea     eax, [.wc]
        invoke  RegisterClass, eax

        return
endp




proc TWindow.Create, .obj, .parent
begin
        push    eax ebx
        mov     ebx, [.obj]
        mov     eax, [.parent]
        test    eax, eax
        jz      .parentok

        mov     eax, [eax+TWindow.handle]

.parentok:
        mov     ecx, WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN
        test    eax, eax
        jz      .createit
        mov     ecx, WS_CHILDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN
.createit:
        invoke  CreateWindowEx, 0, cWindowClassName, 0, ecx, 0, 0, 0, 0, eax, 0, 0, 0
        mov     [ebx+TForm.handle], eax

        stdcall _SetWindowStruct, eax, ebx

        pop     ebx eax
        clc
        return
endp





proc TWindow.Destroy, .obj
begin
        push    eax
        stdcall IsObject, [.obj], CWindow
        jc      .exit
        mov     eax, [.obj]
        invoke  DestroyWindow, [eax+TWindow.handle]
.exit:
        pop     eax
        return
endp



proc TWindow.Get, .obj, .paramID
.rect RECT
begin
        stdcall IsObject, [.obj], CWindow
        jc      .fault

        push    ecx edx esi ebx

        mov     esi, [.obj]
        mov     eax, [.paramID]

        test    eax, maskParameter
        jz      .field

        cmp     eax, TWindow.x
        je      .getrect
        cmp     eax, TWindow.y
        je      .getrect
        cmp     eax, TWindow.width
        je      .getrect
        cmp     eax, TWindow.height
        je      .getrect

        cmp     eax, TWindow.visible
        je      .getvisible

        cmp     eax, TWindow.caption
        je      .getcaption

        cmp     eax, TWindow.ChildrenCount
        je      .childrencount

        cmp     eax, TWindow.SelectedChild
        je      .getchild

.fault:
        stc
        return

.field:
        mov     ebx, [.paramID]
        mov     eax, [esi+ebx]

.finish:
        clc
        pop     ebx esi edx ecx
        return


.childrencount:
        push    ecx edx
        xor     ebx, ebx
        invoke  GetWindow, [esi+TWindow.handle], GW_CHILD

.loopchild:
        test    eax, eax
        jz      .endchild

        inc     ebx

        invoke  GetWindow, eax, GW_HWNDNEXT
        jmp     .loopchild

.endchild:
        mov     eax, ebx
        jmp     .finish

.getchild:
        mov     ebx, [esi+TWindow.ChildIndex]

        invoke  GetWindow, [esi+TWindow.handle], GW_CHILD

.loopchild2:
        test    eax, eax
        jz      .endchild2
        dec     ebx
        jz      .endchild2

        invoke  GetWindow, eax, GW_HWNDNEXT
        jmp     .loopchild2

.endchild2:
        stdcall _GetWindowStruct, eax
        jmp     .finish


.getcaption:
        stdcall StrDup, [esi+TWindow.Fcaption]
        jmp     .finish

.getvisible:
        invoke  IsWindowVisible, [esi+TWindow.handle]
        jmp     .finish


.getrect:
        lea     ebx, [.rect]
        invoke  GetWindowRect, [esi+TWindow.handle], ebx
        invoke  GetParent, [esi+TWindow.handle]
        invoke  MapWindowPoints, NULL, eax, ebx, 2

        mov     eax, [.rect.right]
        mov     ebx, [.rect.bottom]
        sub     eax, [.rect.left]
        sub     ebx, [.rect.top]
        mov     [.rect.right],eax
        mov     [.rect.bottom], ebx

        mov     eax, [.paramID]
        sub     eax, TWindow.x
        mov     eax, [.rect+4*eax]

        jmp     .finish
endp



proc TWindow.Set, .obj, .paramID, .value
  .rect RECT
begin
        stdcall IsObject, [.obj], CWindow
        jc      .fault

        mov     esi, [.obj]
        mov     eax, [.paramID]

        test    eax, maskParameter
        jz      .field

        cmp     eax, TWindow.x
        je      .setrect
        cmp     eax, TWindow.y
        je      .setrect
        cmp     eax, TWindow.width
        je      .setrect
        cmp     eax, TWindow.height
        je      .setrect

        cmp     eax, TWindow.visible
        je      .setvisible

        cmp     eax, TWindow.caption
        je      .setcaption

.fault:
        stc
        return

.field:
        pushd   [.value]
        popd    [esi+eax]
        clc
        return


.setcaption:
        lea     eax, [esi+TWindow.Fcaption]
        stdcall SetString, eax, [.value]
        stdcall StrPtr, [eax]

        invoke  SendMessage, [esi+TWindow.handle], WM_SETTEXT, 0, [.value]
        clc
        return

.setvisible:
        invoke  ShowWindow, [esi+TWindow.handle], [.value]
        clc
        return

.setrect:
        push    ebx

        lea     ebx, [.rect]
        invoke  GetClientRect, [esi+TWindow.handle], ebx

        invoke  GetParent, [esi+TWindow.handle]
        invoke  MapWindowPoints, [esi+TWindow.handle], eax, ebx, 2

        invoke  GetWindowLong, [esi+TWindow.handle], GWL_EXSTYLE
        push    eax
        push    FALSE
        invoke  GetWindowLong, [esi+TWindow.handle], GWL_STYLE
        push    eax

        mov     eax, [.rect.right]
        mov     ecx, [.rect.bottom]
        sub     eax, [.rect.left]
        sub     ecx, [.rect.top]
        mov     [.rect.right], eax
        mov     [.rect.bottom], ecx

        mov     eax, [.paramID]
        sub     eax, TWindow.x
        push    [.value]
        popd    [.rect+4*eax]

        mov     eax, [.rect.left]
        mov     ecx, [.rect.top]
        add     [.rect.right], eax
        add     [.rect.bottom], ecx

        invoke  AdjustWindowRectEx, ebx ; and from the stack

        mov     eax, [.rect.right]
        mov     ecx, [.rect.bottom]
        sub     eax, [.rect.left]
        sub     ecx, [.rect.top]

        invoke  MoveWindow, [esi+TWindow.handle], [.rect.left], [.rect.top], eax, ecx, TRUE

        pop     ebx
        clc
        return
endp









; Common utility procedures.


;---------------------------------------------------------------
; Returns the window TObject structure, from the window handle.
;---------------------------------------------------------------
proc _GetWindowStruct, .hwin
begin
        push    ecx edx
        invoke  GetWindowLong, [.hwin], ofsWindowStruct
        pop     edx ecx
        return
endp




proc _SetWindowStruct, .hwin, .value
begin
        push    eax ecx edx
        invoke  SetWindowLong, [.hwin], ofsWindowStruct, [.value]
        pop     edx ecx eax
        return
endp





proc CommonWindowProc, .hwnd, .wmsg, .wparam, .lparam
begin
        stdcall __ProcessOneSystemEvent, [.hwnd], [.wmsg], [.wparam], [.lparam]         ; sometimes windows calls winproc directly instead of using postmessage.
        jnc     .finish

        invoke  DefWindowProc, [.hwnd], [.wmsg], [.wparam], [.lparam]

.finish:
        return
endp




proc RefreshWindow, .ptrobj
begin
        push    eax
        mov     eax, [.ptrobj]

        invoke  RedrawWindow, [eax+TWindow.handle], 0, 0, RDW_INVALIDATE

        pop     eax
        return
endp



proc GetRaster, .pObj
begin
        push    ecx edx
        stdcall IsObject, [.pObj], CWindow
        jc      .exit

        mov     eax, [.pObj]
        invoke  GetDC, [eax+TWindow.handle]
        clc
.exit:
        pop     edx ecx
        return
endp

proc FreeRaster, .raster
begin
        push    eax ecx edx
        invoke  ReleaseDC, [.raster]
        pop     edx ecx eax
        return
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































































































































































































































































































































































































































































































































































































































































































































































Deleted freshlib/GUI/objects.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
struct TObjectClass
  .ptrParent        dd 0   ; pointer to the parent TObjectClass
  .dataSize         dd 0   ; size of TObject structure.
  .procCreate       dd 0
  .procDestroy      dd 0
  .procGetParam     dd 0
  .procSetParam     dd 0
  .procSysEventHandler dd 0
ends



macro ObjectClass name*, parent*, procCreate*, procDestroy*, procGetParam*, procSetParam*,  procSysEvents* {
  if used C#name
    C#name TObjectClass
    store dword C#parent at C#name#.ptrParent
    store dword sizeof.T#name at C#name#.dataSize
    store dword procCreate at C#name#.procCreate
    store dword procDestroy at C#name#.procDestroy
    store dword procGetParam at C#name#.procGetParam
    store dword procSetParam at C#name#.procSetParam
    store dword procSysEvents at C#name#.procSysEventHandler
  end if
}



CRoot = 0

maskParameter = $80000000
Sequence param, maskParameter


macro object name*, parent {
  macro name@object \{ name name \}
  macro size@object \{ sizeof.#name = $ \}
  struc name \{
    param.current = maskParameter
    if ~parent eq
      . parent
    end if
}


endobj fix } obj_helper

macro obj_helper {
  virtual at 0
    name@object
    size@object
  end virtual
  purge name@object
  purge size@object
}


; common object procedures
; These procedures work with every TObject descendent object type.

;-----------------------------------------------------------------------
; proc Get, .obj, .paramID - returns the value of given parameter
;
; Arguments:
;   .obj - pointer to TObject descendent object.
;   .paramID - ID number of the parameter being read.
; Returns:
;   CF=0; eax = parameter value.
;   CF=1; the parameter is unknown and can not be retrived.
;
; This procedure calls procGet for the given object class and
; if the procedure returns CF=1; tries to call the parents procedure
; procGet, until the value is retrived, or the root level of inheritance
; is reached.
;-----------------------------------------------------------------------

proc Get, .obj, .paramID
begin
        push    ebx

        mov     ebx, [.obj]
        test    ebx, ebx
        jz      .error

        mov     ebx, [ebx+TObject.ptrClass]

.loop:
        cmp     [ebx+TObjectClass.procGetParam], 0    ; get GetParam procedure pointer
        je      .parent

        push    ebx
        stdcall [ebx+TObjectClass.procGetParam], [.obj], [.paramID]
        pop     ebx
        jnc     .exit

.parent:
        mov     ebx, [ebx+TObjectClass.ptrParent]
        test    ebx, ebx
        jnz     .loop

.error:
        stc
.exit:
        pop     ebx
        return
endp




;-----------------------------------------------------------------------
; proc Set, .obj, .paramID - sets the value of given parameter
;
; Arguments:
;   .obj - pointer to TObject descendent object.
;   .paramID - ID number of the parameter being read.
;   .value   - value of the parameter that should be set.
; Returns:
;   CF=0 - the value is successfully set.
;   CF=1; the value is not set, because the parameter is unknown.
;
; This procedure calls procSet for the given object class and
; if the procedure returns CF=1; tries to call the parents procedures
; procSet, until the value is set, or the root level of inheritance
; is reached.
;-----------------------------------------------------------------------
proc Set, .obj, .paramID, .value
begin
        push    ebx

        mov     ebx, [.obj]
        test    ebx, ebx
        jz      .error

        mov     ebx, [ebx+TObject.ptrClass]

.loop:
        cmp     [ebx+TObjectClass.procSetParam], 0    ; get SetParam procedure pointer
        je      .parent

        push    ebx
        stdcall [ebx+TObjectClass.procSetParam], [.obj], [.paramID], [.value]
        pop     ebx
        jnc     .exit

.parent:
        mov     ebx, [ebx+TObjectClass.ptrParent]
        test    ebx, ebx
        jnz     .loop

.error:
        stc
.exit:
        pop     ebx
        return
endp


;-----------------------------------------------------------------------
; proc Destroy, .obj - destroys the object instance.
;
; Arguments:
;   .obj - pointer to TObject descendent object.
;
; Returns:
;   nothing.
;
; This procedure calls procDestroy for the given object class and all
; parent classes. Note that the memory is freed only by the last
; destroy handled from CObject class.
;-----------------------------------------------------------------------
proc Destroy, .obj
begin
        push    ebx

        mov     ebx, [.obj]
        test    ebx, ebx
        jz      .error

        mov     ebx, [ebx+TObject.ptrClass]

.loop:
        cmp     [ebx+TObjectClass.procDestroy], 0
        je      .parent

        push    ebx
        stdcall [ebx+TObjectClass.procDestroy], [.obj]
        pop     ebx

.parent:
        mov     ebx, [ebx+TObjectClass.ptrParent]
        test    ebx, ebx
        jnz     .loop

        clc
        pop     ebx
        return

.error:
        stc
        pop     ebx
        return
endp



;-----------------------------------------------------------------------
; proc Create, .class, .lparam - creates an instance from the given class.
;
; Arguments:
;   .class - pointer to TObjectClass structure for needed object.
;   .lparam - additional parameter. For the object created from templates
;             it is the parent object from the template tree.
;
; Returns:
;   ebx = pointer to the instance of the object.
;
; This procedure calls procCreate for the given object class and all
; parent classes in reverce order.
;-----------------------------------------------------------------------
proc Create, .class, .lparam
begin
        push    eax ecx

        mov     ecx, [.class]
        stdcall GetMem, [ecx+TObjectClass.dataSize]
        mov     ebx, eax
        mov     [eax+TObject.ptrClass], ecx

        push    0

.loop:
        cmp     [ecx+TObjectClass.procCreate], 0
        je      .parent

        push    [ecx+TObjectClass.procCreate]

.parent:
        mov     ecx, [ecx+TObjectClass.ptrParent]
        test    ecx, ecx
        jnz     .loop

.loop2:
        pop     ecx
        jecxz   .endcreate

        push    ebx
        stdcall ecx, ebx, [.lparam]
        pop     ebx
        jmp     .loop2

.endcreate:
        pop     ecx eax
        return
endp




;-----------------------------------------------------------------------
; proc ExecEvent, .obj, .event, .inherited
; Arguments:
;   .obj - pointer to the TObject descendent object.
;   .class - pointer to TObjectClass structure that to be used for
;            event handler. if NULL, the native class of .obj is used.
;            this argument is used when there is a need to be called
;            some of the inherited event handlers.
;   .event - pointer to TSysEvent descendent structure.
;-----------------------------------------------------------------------
proc ExecEvent, .obj, .event
begin
        push    ebx

        mov     ebx, [.obj]
        test    ebx, ebx
        jz      .error

        mov     ebx, [ebx+TObject.ptrClass]

.loop:
        cmp     [ebx+TObjectClass.procSysEventHandler], 0    ; get SetParam procedure pointer
        je      .parent

        push    ebx
        stdcall [ebx+TObjectClass.procSysEventHandler], [.obj], [.event]
        pop     ebx
        jnc     .exit

.parent:
        mov     ebx, [ebx+TObjectClass.ptrParent]
        test    ebx, ebx
        jnz     .loop

.error:
        stc

.exit:
        pop     ebx
        return
endp




;-----------------------------------------------------------------------
; proc IsObject, .class - returns TRUE if the given object belongs to
;                         the given class.
;-----------------------------------------------------------------------
proc IsObject, .obj, .class
begin
        push    edx

        mov     edx, [.obj]
        test    ebx, ebx
        jz      .error

        mov     edx, [edx+TObject.ptrClass]

.loop:
        cmp     edx, [.class]
        je      .found

        mov     edx, [edx+TObjectClass.ptrParent]
        test    edx, edx
        jnz     .loop

.error:
        stc
        pop     edx
        return

.found:
        clc
        pop     edx
        return
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























































































































































































































































































































































































































































































































































































































































































Deleted freshlib/GUI/progutils.asm.

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
macro JumpList [id, target] {
  forward
        dw id, target - $ - 2
  common
        dd 0
}

macro JumpTable [id, target] {
if ~ msg eq
      call JumpTo
      JumpList msg, target
end if
}


;------------------------------------------------------
; proc JumpTo
; Searches for the message in the message table.
; Arguments:
;   ebx - message number to search in the table.
; Returns:
;   This procedure doesn't returns. It simply
;   jumps to the address from table or imediately
;   after the table if the message is not found.
;   in both cases esi = eip
; Changes:
;   eax, ecx
;------------------------------------------------------
proc JumpTo
begin
        pop     ecx             ; get table address, remove return address from the stack and save the value of esi.
.loop:
        mov     eax, [ecx]
        lea     ecx, [ecx+4]
        test    eax,eax
        jz      .exit

        cmp     bx, ax
        jne     .loop

        sar     eax, 16
        add     ecx, eax
.exit:
        jmp     ecx
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































Deleted freshlib/GUI/sysevents.asm.

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
seMouseMove        = $0001
seMouseEnter       = $0002
seMouseLeave       = $0003
seMouseBtnPress    = $0004
seMouseBtnRelease  = $0005
seMouseBtnClick    = $0006
seMouseBtnDblClick = $0007
seTimer            = $0008
seKbdKeyPress      = $0009
seKbdKeyRelease    = $000a
seKbdStatusChanged = $000b
seKbdChar          = $000c
sePaint            = $0100


struct TSysEvent
  .event  dd  ?
ends


struct TMouseMoveEvent
  . TSysEvent
  .x         dd ?
  .y         dd ?
ends

mbLeft   = 0
mbMiddle = 1
mbRight  = 2

maskBtnLeft   = $01
maskBtnMiddle = $02
maskBtnRight  = $04
maskCtrl      = $08
maskShift     = $10


struct TMouseButtonEvent
  . TSysEvent
  .Button    dd ?
  .kbdStatus dd ?
ends


struct TMouseEnterEvent
  . TSysEvent
ends


struct TKeyboardEvent
  . TSysEvent
  .key       dd  ?
  .kbdStatus dd  ?
ends


struct TTimerEvent
  . TSysEvent
ends


struct TPaintEvent
  . TSysEvent

  .raster dd ?  ; ID of the raster where you should paint.
  .rect   RECT
ends
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































Added freshlib/License.txt.

















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FreshLib library project is (c) 2003..2013, John Found, Fresh development team;
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

  * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

  * Redistributions in binary form must reproduce the above copyright notice, this
    list of conditions and the following disclaimer in the documentation and/or
    other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.

Changes to freshlib/TestFreshLib.fpr.

cannot compute difference between binary files

Deleted freshlib/TestLib.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
include 'compiler/executable.inc'

include 'macros/allmacros.inc'
include 'equates/allequates.inc'


_BinaryType GUI


_CodeSection


include  'simpledebug/debug.asm'

include 'GUI/SysEvents.asm'

include 'system/memory.asm'
include 'system/files.asm'
include 'data/arrays.asm'
include 'data/strlib.asm'

include 'graphics/text.asm'
include 'graphics/draw.asm'
include 'graphics/images.asm'
include 'graphics/giflib.asm'
include 'mouse/mouse.asm'

include 'GUI/GUI.asm'


options.FastEnter         = 0
options.ShowSkipped       = 0
options.CheckArguments    = 0
options.ShowSizes         = 1


iglobal

; This is a form template.
; It will be created by the visual editor.
; This template engine can contains any count of properties for every
; component of the template. Also it can contains non visual components
; such as action lists, image lists, etc.

frmMainForm:
        ObjTemplate  tfParent or tfEnd, Form, frmMain, \
                     visible, TRUE, \
                     x, 100,        \
                     y, 50,         \
                     width, 640,    \
                     height, 480,   \
                     caption, 'Fresh portable Win32/Linux application test.'

          ObjTemplate  tfChild, Button, btnChild1,          \
                     visible, TRUE, \
                     x, 64,         \
                     y, 48,         \
                     width, 64,     \
                     height, 24,    \
                     TextAlign, dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     caption, 'Button1',        \
                     OnClick, Button1Click

          ObjTemplate  tfChild, Button, btnChild3,          \
                     visible, TRUE, \
                     x, 64,         \
                     y, 80,         \
                     width, 64,     \
                     height, 48,    \
                     TextAlign, dtfAlignCenter or dtfAlignMiddle or dtfWordWrap,\
                     caption, 'Destroy the edit',        \
                     OnClick, Button3Click

          ObjTemplate  tfChild, Edit, editChild1,          \
                     visible, TRUE, \
                     x, 32,         \
                     y, 8,         \
                     width, 220,     \
                     height, 19,    \
                     caption, 'Edit1',        \
                     Text, 'This is example edit'

         ObjTemplate  tfChild or tfEnd, Button, btnChild2,          \
                     x, 136,         \
                     y, 48,         \
                     width, 202,     \
                     height, 202,        \
                     TextAlign, dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     caption, <'Facer percipit eam at, quod deterruisset mel te! Integre complectitur concludaturque an pri, te congue',        \
                               ' albucius dissentias ius, mel erat exerci contentiones ut. Congue aeterno aliquando mea ea. Brute tritani an',  \
                               ' eos, ea cum urbanitas adolescens! Ei pro fuisset accusamus, ad ludus tractatos erroribus per, esse exerci',    \
                               ' persecuti eos et. Ea eam tempor intellegebat, vitae semper pri no! Eam ea iisque eruditi detracto, velit',     \
                               ' commodo similique pri cu. Eam wisi augue dolore no, cum ut habemus voluptua abhorreant, vis feugiat saperet ex.',\
                               ' Cum ne modo dicunt, quo ad malis pericula urbanitas. Et eum saperet accusata, pro simul tamquam salutandi ea'>,\
                     visible, TRUE,  \
                     OnClick, Button2Click
endg



; Sample event handlers. They work with other objects on the form.


proc Button3Click, .self, .button
begin
        DebugMsg 'Button3 clicked'
        stdcall Destroy, [editChild1]   ; it is safe to call it with [.obj]=0
        mov     [editChild1], 0
        return
endp




proc Button1Click, .self, .button
begin
        DebugMsg 'Button1 clicked'

;        stdcall Get, [btnChild2], TButton.TextAlign
;        mov     ecx, eax
;        and     ecx, not $03
;        inc     eax
;        and     eax, 3
;        or      eax, ecx
;        stdcall Set, [btnChild2], TButton.TextAlign, eax
;
;        stdcall Get, [btnChild1], TButton.caption
;        stdcall Set, [editChild1], TEdit.Text, eax
;        stdcall StrDel, eax

iglobal
  cGifFile file '_test_images/test.gif'
  sizeof.cGifFile = $ - cGifFile
endg

        stdcall CreateImageGIF, cGifFile, sizeof.cGifFile
        mov     esi, eax

        stdcall OutputRegister, regEAX, 16

        stdcall GetRaster, [btnChild2]
        push    eax

        stdcall DrawImage, eax, esi, 1, 1

        stdcall FreeRaster ; from the stack
        stdcall DestroyImage, esi
        return
endp



proc Button2Click, .self, .button
begin
        DebugMsg 'Button2 clicked'

        stdcall Get, [btnChild1], TButton.TextAlign
        mov     ecx, eax
        and     ecx, not $0c
        add     eax, 4
        and     eax, $0c
        or      eax, ecx

        stdcall Set, [btnChild1], TButton.TextAlign, eax

        stdcall Get, [btnChild2], TButton.caption
        stdcall Set, [editChild1], TEdit.Text, eax
        stdcall StrDel, eax

        return
endp






; Main Program
start:
        InitializeAll

        stdcall Create, CApplication, 0
        jc      .start_error

        mov     [Application], ebx

        stdcall CreateFromTemplate, frmMainForm, 0
        mov     ecx, [Application]
        mov     [ecx+TApplication.MainWindow], ebx


DebugMsg 'After initializing.'

        stdcall Run
DebugMsg 'Just before end.'
        jmp     ExitApplication

.start_error:
        mov     eax, 1
        jmp     ExitApplication
; end of main program


_ImportSection

GlobalAPI equ ascii
include 'imports/allimports.asm'

_DataSection
IncludeAllGlobals
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































































Added freshlib/_doc/CheckListFresh3.txt.





























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
Legend:

[+] - Fully implemented (more or less).
[?] - Partially implemented/work in progress.
[ ] - Not even started.

Needed GUI controls in order to start work on Fresh IDE 3.0:

  [+]   TForm
  [+]   TSplitGrid
  [+]   TAction (and Action lists)
  [+]   TButton
  [+]   TCheckbox
  [?]   TTreeView
  [ ]   TabControl
  [?]   TSourceEditor
  [ ]   TToolbar
  [?]   TMenu
  [ ]   TMenuBar
  [ ]   TStatusbar
  [+]   TProgressbar
  [ ]   TListView, TListbox or other kind of table/grid control with columns.
  [+]   TEdit - line editor
  [ ]   THint

  [+]   General message dialog.
  [ ]   Open/Save dialogs.
  [ ]   Color selection dialog. (not so important).
  [ ]   Font select dialog. (not so important).

Changes to freshlib/_doc/FreshLibRefMan.odt.

cannot compute difference between binary files

Added freshlib/_doc/Fresh_IDE.wiki.















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<table class="index" align="right">
<tr><td class="index">
<b>Index</b><br>
[http://fresh.flatassembler.net | Fresh home]<br>
[FreshLib reference | FreshLib reference]<br>
[Fresh user guide | Fresh tips&tricks]<br>
</td></tr>
</table>

Fresh is a visual assembly language IDE with built-in FASM assembler.

The main goal of Fresh is to make programming in assembly as fast and
efficient as in other visual languages, without sacrificing the small
application size and the raw power of assembly language.

Because Fresh is the logical continuation of the FASM project in the
area of visual programming, it is perfectly compatible with FASM and you
can use all your knowledge about FASM to program in Fresh.

Of course, you can use Fresh not only for Windows programming, but also
to create programs for any OS that FASM supports - DOS, Linux, FreeBSD,
BeOS, MenuetOS - the same way as you do this in FASM.

Now, the main direction of Fresh development is towards creating FreshLib - freely portable library, that to
provide portability for Fresh and programs created with Fresh to number of different OSes. 
Initially for Win32 and Linux.

This site is [http://www.fossil-scm.org|fossil] repository of Fresh sources.
You can clone the repository with following fossil command:
<pre><b>fossil clone http://chiselapp.com/user/johnfound/repository/FreshIDE/ Fresh.fossil</b></pre>

In order to use more functionality in this site, please [/login|login] as "anonimous" user.
Particularly you will be able to follow the links in the source tree, to download code and to fill bug reports and feature requests.

If you want to contribute to the project, please contact me (johnfound) on [http://board.flatassembler.net|FASM message board]

In order to download compiled FreshIDE, visit [http://fresh.flatassembler.net|Fresh IDE home page.]

You can report bugs, or make some feature requests here, in the [/reportlist|Tickets system]

Added freshlib/_doc/Fresh_and_Linux.wiki.



























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<h4>Running and debugging Linux applications in Windows with Fresh IDE</h4>

Fresh can compile applications for Linux. But how to run and debug these applications? 

There are different approaches, including virtual machines, second computer, running Linux, or rebooting every time you want to test compiled project.

Fresh provides one very simple way of testing Linux applications. This method is to use [http://andlinux.org|andLinux]. andLinux is complete Ubuntu distribution, that uses coLinux kernel in order to allow running of Linux inside Windows OS.

How to setup andLinux to work with Fresh?

  <b>Step 1.</b> Download andLinux package from [http://andlinux.org/downloads.php|andLinux download page].

  There are two packages: "KDE version" and "minimal/XFCE version" available. For using with Fresh IDE, it is not important what version you will choose.

  KDE package is very big and very slow distribution that contains many bundled programs and tools, but in general you will not need them. The size of KDE package is 500MB download and 5GB installed.

  The XFCE package is relatively smaller and faster. Relatively means 200MB downloaded file and 2GB installed on the disk.

  It is obvious that the right choice is to use XFCE package.

  <b>Step 2.</b> Run the downloaded setup file and answer to the different questions of the setup wizard.

  The important features that we need are:

  *  coLinux version - choose the stable version (0.7.4 in my case) instead of latest (0.8.0) - we shall work with andLinux, not to play.

  *  Memory size - 256MB RAM (or maybe more - if you can afford it).

  *  Install XMing server on your primary screen.

  *  Sound - you can enable or disable sound in Linux option - it is harmless although it is one more running server.

  *  Startup type + Panel - select "run andLinux automatically as a NT service + use Windows shortcuts"; It is not very important, but can save you a little manual work and troubles later.

  *  andLinux login - just select your user name and password for Linux root.

  *  Windows File Access - it is important! - select "using CoFS", no matter it is not recommended.

  * File Access Using CoFS - important! - create one new directory somewhere and select it to be mount via CoFS. This will be the shared directory, visible from Windows and from Linux in the same time.

  All other features you can choose freely or simply leave them to default state.

  When you start installation, the installer will try to install network driver. It is possible Windows will protest and will atempt to mislead you by asking to not install not certified driver. You must ignore these attempts and firmly click "install".

  After installation of andLinux you have to restart Windows and probably andLinux will not run. :D It is because of the Windows firewall. All new network adapters are firewalled by default. As long as installed adapter (named TAP-Colinux) is virtual and local, you will not need any firewall so, go to control panel/Windows firewall/Advanced and uncheck "TAP-Colinux" adapter from the list of adapters.

  Then you can run some Linux program - in the Windows tray, there is a andLinux menu icon that have shortcuts to several Linux programs.

  <b>Step 3.</b> Install several additional Linux tools. You will need additionally debugger and come decent terminal emulator. I choose xterm for terminal, because it is small and white by default. ;) You can choose to use the built-in terminal named in the simple Linux manner: "xfce4-terminal" and console debugger "gdb". In this case you have skip this step.

  Start "Synaptic" - package manager for Ubuntu from the tray menu. You have to enter root password you choose on install.

  When Synaptic is started, click "Reload" to refresh the package list from the network and then use search to locate needed programs. I personally recommend "xterm" as terminal and "ddd" as a GUI front end to "gdb". 

  Well, I recommend "ddd" only because it is only Linux debugger that I was able to run under andLinux and able to show disassembled code of the program.
  
  Mark selected programs for install, click on Apply button and wait until downloading and installation. 

  Here you can encounter only one problem - your computer is behind a proxy server. 
  
  If the proxy is normal proxy, you simply have to set its address and port in the Synaptic preferences and it should work. 

  Completely another story is when the proxy is MS ISA server configured with NTLM user authorization. 

  Most Linux programs can't work with such authorization and Synaptic is not an exception.

  Fortunately, there is a workaround of this situation. You need [http://ntlmaps.sourceforge.net/|ntlmaps] authorization proxy server. 
  
  Setting up of this server is out of the scope of this article. On the ntlmaps home page you can read complete documentation and explanations.

  OK, we are ready with andLinux. Now you have working copy of Ubuntu inside your Windows box.

  It's time to configure Fresh to run Linux applications inside andLinux. Continue with:

  <b>Step 4.</b> Fresh IDE configuration.

  Run Fresh and open "Options|IDE options" dialog. Select "Debuggers and Emulators" page.

  Then select following directories and commands: 
  
  *  "andLinux directory" - the directory where you installed andLinux.

  *  "andLinux shared directory" - shared directory you selected during andLinux installation.

  *  "Linux debugger" - Enter "ddd" (or whatever debugger you choose).

  *  "Linux terminal" - Enter "xterm -hold +mesg -e" - note the options. 

  <h4>And voila! You finished the configuration!</h4>

  Now you can load the source of some Linux program (look at Fresh examples) and run it with shift+F9 or load it in the debugger with shift+F8. 
  
  Fresh will detect when you compiled ELF executable and will run it in andLinux instead of Windows.

Added freshlib/_doc/GUI.wiki.



































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
<nowiki>

<a name="GUI"><h1>FreshLib directory: GUI</h1></a>

<p>GUI library defines many data structures and procedures that together form
something that conditionally can be called "OOP". It is object oriented, as
long as it deals with GUI "objects" - forms, controls, menus etc.
All these objects are in fact structures of data. For every created object,
the library allocates some memory and fills this memory with object parameters
data.</p>

<p>There are two types of data structures that describe GUI objects - classes
and instances.</p>

<p>The class is a structure that contains data commonly used by all objects of given type - for example all buttons use one class structure CButton.</p>

<p>The instance is data structure that describes the properties and behavior of particular GUI object - for example button with icon "open file" that opens a file when the user click on it.</p>

<a name="Classes"><h2>Classes</h2></a>

<p>"Class" in FreshLib is a data structure, that have the following definition:</p>

<pre class="fasm-code">
struct TObjectClass
  .ptrParent           dd 0   
  .dataSize            dd 0   
  .procCreate          dd 0
  .procDestroy         dd 0
  .procGetParam        dd 0
  .procSetParam        dd 0
  .procExecCmd         dd 0
  .procSysEventHandler dd 0
ends
</pre>

<p><span class="variable">.ptrParent</span> is a pointer to other TObjectClass structure, that appears as a parent class for the given class.</p>
<p><span class="variable">.dataSize</span> contains the size of the object instance structure.</p>

<p>The following fields are the pointers to procedures that provides the "work" of the object. All of these pointers as a rule can be <span class="constant">NULL</span>, if there is no need for such processing.</p>

<a name="Create"><h4>Create</h4></a>
<p><span class="variable">.procCreate</span> is a procedure that creates instance object of the given class. This 
field can be <span class="constant">NULL</span>. It has the following definition:</p>
<pre class="fasm-code">
proc Create, .obj
</pre>
<p>This procedure sets needed values in the object instance data structure.</p>

<a name="Destroy"><h4>Destroy</h4></a>
<p><span class="variable">.procDestroy</span> is a procedure that destroys an instance of the given class.</p>
<pre class="fasm-code">
proc Destroy, .obj
</pre>
<p>Destroys the object passed in <span class="variable">[.obj]</span> and frees all memory allocated for this object.</p>

<a name="GetParam"><h4>GetParam</h4></a>
<p><span class="variable">.procGetParam</span> is a pointer to the procedure that retrieves and returns the properties of the object.</p>
<pre class="fasm-code">
proc GetParam, .obj, .paramID
</pre>
<p>Returns the value of the object <span class="variable">[.obj]</span> parameter with ID=<span class="variable">[.paramID]</span></p>

<a name="Set"><h4>Set</h4></a>
<p><span class="variable">.procSetParam</span> is a pointer to the procedure that set the properties of the object.</p>
<pre class="fasm-code">
proc Set, .obj, .paramID, .value
</pre>
<p>For object <span class="variable">[.obj]</span>, set the value of the parameter with ID=<span class="variable">[.paramID]</span></p>

<h4>ExecCmd</h4>
<p><span class="variable">.procExecCmd</span> is a pointer to the procedure that executes object method.</p>
<pre class="fasm-code">
proc ExecCmd, .obj, .method
</pre>
<p>For the object [.obj] this procedure executes the method with method ID in [.method].</p>
<p>The methods can have arbitrary number of arguments, that are defined in the "object" definition (see below). 
When the method is executed, the procedure <span class="procedure">[.procExecCmd]</span> accepts pointer to the arguments array in <span class="register">[ebx]</span></p>
<p>The user is supposed to call methods of the object with the macro "execute"
The macro is defined following way:</p>
<pre class="fasm-code">
macro execute obj*, meth*, [arg]
</pre>


<a name="SysEventHandler"><h4>SysEventHandler</h4></a>
<p><span class="variable">.procSysEventHandler</span> is a pointer to the procedure that process the system events that are send to the object, i.e. mouse events, keyboard events etc.</p>
<pre class="fasm-code">
proc SysEventHandler, .obj, .pEvent
</pre>
<p>Process one system event for object <span class="variable">[.obj]</span>. <span class="variable">[.pEvent]</span> contains pointer to the system event.</p>

<p>All of these procedures are called internally and should not be used by the user of the library. 
How these procedure are called will be described later.</p>

<p>TObjectClass structure is defined statically in memory in compile time, only once for every object class. Its definition is located in the library for the respective GUI element. For example CButton class structure is defined in the file TButton.asm that contains the code and data of the object class Button.</p>

<p>In order to make construction of such structures easy, macro with name ObjectClass is defined in objects.asm</p>

<a name="ObjectClass"><h3>ObjectClass Macro</h3></a>
<pre class="fasm-code">
macro ObjectClass name*, parent*, procCreate*, procDestroy*, procGetParam*, procSetParam*, procExecCmd*, procSysEvents*
</pre>

<p>Every defined ObjectClass have a label that points to the begin of the structure. The name of this label is the name of the class, prefixed with "C".</p>

<p>One example of ObjectClass definition is the definition of Window object class:</p>
<pre class="fasm-code">
ObjectClass Window,             \
            Object,             \
            TWindow.Create,     \
            TWindow.Destroy,    \
            TWindow.Get,        \
            TWindow.Set,        \
            TWindow.ExecCmd,    \
            TWindow.SysEventHandler
</pre>

<p>This definition creates following data structure:</p>
<pre class="fasm-code">
CWindow:
            dd  CObject         
            dd  sizeof.TWindow             
            dd  TWindow.Create
            dd  TWindow.Destroy    
            dd  TWindow.Get      
            dd  TWindow.Set,        
            dd  TWindow.ExecCmd
            dd  TWindow.SysEventHandler
</pre>



<a name="Object structure"><h3>Object structure</h3></a>
<p>Object instance is data structure that contains different fields. By that it is very similar to the normal FASM structures. As structures, the object is only description of the data but not the data itself. </p>
<p>Objects can inherit field definitions by its parent objects.
The memory instance of the object is allocated dynamically in runtime, when the object is created by call to the respective FreshLib functions.</p>
<p>The definition of the object looks like following:</p>

<pre class="fasm-code">
object TObject
  .ptrClass     dd ? 

  .OnCreate     dd ? 
  .OnDestroy    dd ?

  method .AddChild, .objchild
endobj


object TWindow, TObject
  .handle       dd ?   
  .Fcaption     dd ?    
  .Fcursor      dd ?    

  param .x
  param .y
  param .width
  param .height
  param .visible
  param .caption
  param .parent
  param .cursor

  method .Refresh
endobj


object TButton, TWindow
  .state      dd ?
  .Ficon      dd ?
  .FiconAlign dd ?
  .Ftextalign dd ?

  .OnClick dd ?

  param .TextAlign
  param .Icon
  param .IconPosition
endobj
</pre>

<p>By convention the names of the objects begin with "T".</p>
<p>You can see that the object TWindow contains data fields, parameters and methods. 
The parameters defined by "param" macro are compile time constants which values are assigned automatically. 
There constants are local labels for the object structure. They are also inherited from the parent structure.</p>
<p>The methods are very similar to parameters, in that they are constants, defined in compile time. 
But besides the constant, the method also have list of arguments, passed to the method, when executed.</p>


<p>In the above example, <span class="variable">TButton.width</span> parameter is inherited from <span class="variable">TWindow</span> and have the same value as <span class="variable">TWindow.width</span> parameter.</p>
<p>Also, <span class="variable">TWindow</span> have all fields of TObject defined as well.</p>
<p>If we have to translate TWindow definition in plain FASM syntax it will looks like this:</p>

<pre class="fasm-code">
struc TWindow {
  .ptrClass     dd ? 

  .OnCreate     dd ? 
  .OnDestroy    dd ?

  .handle       dd ?   
  .Fcaption     dd ?    
  .Fcursor      dd ?    

  .x       = $80000000
  .y       = $80000001
  .width   = $80000002
  .height  = $80000003
  .visible = $80000004
  .caption = $80000005
  .parent  = $80000006
  .cursor  = $80000007
}
virtual at 0
  TWindow TWindow
  sizeof.TWindow = $
end virtual
</pre>

<p>This directory contains the libraries providing portable GUI for assembly programming.</p>
<p class="note">Note that this libraries are in very early stage of development, so the description in this chapter is preliminary and probably will be changed in one or another way in the near future.</p>
<p>Later in this text, the whole GUI subsystem of FreshLib will be called FreshGUI</p>

<h2>FreshGUI structure</h2>
<p>The main idea behind the FreshGUI is to make one small OS dependent layer of functions, that to serve as an interface between the OS and the OS independent layer of the library.</p> 
<p>The first will translate OS events, such as mouse, keyboard, timers etc to one common standard of OS independent event handlers of the user interface objects – windows, buttons and other widgets.</p>
<p>The biggest advantage of this approach is that the portability of the library is very easy – most of the code is OS independent and only little  part of it have to be write in order to port the whole library to a new OS.</p>
<p>The biggest drawback of this approach is the bigger size of the library, because, with this architecture, all controls in the library have to be created  from scratch. It is impossible to use graphic controls that the OS provides – particularly Win32 controls - buttons, simple text editors, labels, combo boxes list and tree view controls etc.</p>
<p>FreshGUI is not aimed to use all complex GUI system of the target OS. At first time, the goal of FreshGUI is to provide minimal but decent functionality that will do the job – writing portable applications in assembly language.</p>
<h3>Graphics library</h3>
<p>The graphics library provides procedures that draw graphics images and text on the screen. The library is OS dependent and is placed in the directory "graphics" in the root directory of FreshLib. The main conception of this library is ".raster" - represented by handle, object where the drawing happens. The exact meaning for this object is different for the different OS – in Win32 it is named "device context", in Linux it is "drawable" - window or pixmap.</p>

<h3>Event translation layer</h3>

<h4>Library "sysevents.asm"</h4>
<p>This library contains event codes and data structures for FreshGUI OS independent events. For now only several events are defined:</p>
<pre class="fasm-code">
seMouseMove        
seMouseEnter       
seMouseLeave       
seMouseBtnPress    
seMouseBtnRelease  
seMouseBtnClick    
seMouseBtnDblClick 

seTimer            

seKbdKeyPress      
seKbdKeyRelease    
seKbdStatusChanged 
seKbdChar          

sePaint 
</pre>           
<p>These events cover mouse, keyboard, timers and paint events.</p>
<p>Every event have some arguments that have to be sent to the recipient event handler. The event code and the event arguments are contained in data structure, defined for every kind of events.</p>
<p>The first dword of the event structure is the field <span class="variable">.event</span> that contains the event code.</p>
<p>Here are the structures defined in sysevents.asm</p>
<pre class="fasm-code">
struct TSysEvent
  .event  dd  ?
ends
</pre>
<p>The base event structure.</p>

<pre class="fasm-code">
struct TMouseMoveEvent
  . TSysEvent
  .x         dd ?
  .y         dd ?
ends
</pre>
<p>The event is generated when the mouse cursor moves over some window or control. <span class="variable">.x</span> and <span class="variable">.y</span> contains the coordinates of the mouse cursor relative to the control this message is sent to.</p>

<pre class="fasm-code">
 struct TMouseButtonEvent
  . TSysEvent
  .Button    dd ?
  .kbdStatus dd ?
ends
</pre>
<p>This event is generated when some of the mouse buttons changes its state. The button that changes its state is specified in the field <span class="variable">.Button</span></p>
<p>This field can accept following values:</p>
<table style="margin-left: 40px;">
	<tr><td><span class="constant">mbLeft</span>  </td> <td align="right">= 0</td></tr>
	<tr><td><span class="constant">mbMiddle</span></td> <td align="right">= 1</td></tr>
	<tr><td><span class="constant">mbRight</span> </td> <td align="right">= 2</td></tr>
</table>
<p>The field <span class="variable">.kbdStatus</span> contains the status of remaining mouse buttons and keyboard modifying buttons. These buttons are represented by bits in the field:</p> 
<table style="margin-left: 40px;">
	<tr><td><span class="constant">maskBtnLeft</span>   </td> <td align="right">= $01</td></tr>
	<tr><td><span class="constant">maskBtnMiddle</span> </td> <td align="right">= $02</td></tr>
	<tr><td><span class="constant">maskBtnRight</span>  </td> <td align="right">= $04</td></tr>
	<tr><td><span class="constant">maskCtrl</span>      </td> <td align="right">= $08</td></tr>
	<tr><td><span class="constant">maskShift</span>     </td> <td align="right">= $10</td></tr>
</table>
<pre class="fasm-code">
struct TMouseEnterEvent
  . TSysEvent
ends
</pre>
<p>This event is generated when the mouse cursor enters or leaves some control. There is no additional parameters besides the event code.</p>

<pre class="fasm-code">
struct TKeyboardEvent
  . TSysEvent
  .key       dd  ?
  .kbdStatus dd  ?
ends
</pre>
<p>This event is generated on keyboard button press/release. The field <span class="variable">.key</span> contains the code of the pressed button. <span class="variable">.kbdStatus</span> have the same meaning and the same values as in TMouseButtonEvent.</p>

<pre class="fasm-code">
struct TTimerEvent
  . TSysEvent
ends
</pre>
<p>TTimerEvent is generated on timer events. :)</p>

<pre class="fasm-code">
struct TPaintEvent
  . TSysEvent
  .raster dd ?  ; ID of the raster where you should paint.
  .rect   RECT
ends  
</pre>
<p>TPaintEvent is generated when given control have to be repainted. The field <span class="variable">.raster</span> contains the handle to the graphic surface where the program have to draw. This handle have different meanings in the different target OS, but it simply need to be understandable by the graphics procedures from the OS dependent library graphics.asm.</p>
<p>The field <span class="variable">.rect</span> is the rectangle of the control that needs to be repainted.</p>

<h3>Library "main.asm"</h3>

<a name="Run"><h4>proc Run</h4></a>
<p>This procedure is the main program loop of the GUI application.</p>
<p>The procedure Run process all pending system events, then calls once the OnIdle event handler of the application object and then sleeps until new events are sent by the OS.</p>
<p>When the OS terminates the application – the procedure returns an exit code.</p>
<p>The user uses this procedure following way:</p>
<pre class="fasm-code">
        stdcall Run
        jmp     ExitApplication
</pre>

<a name="ProcessSystemEvents"><h4>proc ProcessSystemEvents</h4></a>
<p>This procedure process the events generated by the OS. If there are waiting events in the queue, the procedure reads them, translates them to FreshGUI  event data structures and calls the event handlers of the respective controls.</p>
<p>If there is no pending events in the queue, ProcessSystemEvents ends with <span class="flag">CF=0</span></p>
<p>The second task this procedure serves is to detect the end of the application. In this case it ends with <span class="flag">CF=1</span>.</p>
<p>This procedure is call from the main event loop of the application. Also, the user can periodically call this procedure in order to not allow hanging of the user interface during long processing of some data.</p>

<a name="WaitForSystemEvent"><h4>proc WaitForSystemEvent</h4></a>
<p>This procedure waits until some system message is posted to the application event queue. Then it exits. During the wait, very low CPU power is consumed by the application.</p>

<a name="Terminate"><h4>proc Terminate</h4></a>
<p>It provides all finalization tasks and ends the application. The exit code is provided in <span class="register">EAX</span>.</p>

<a name="Template engine"><h3>Template engine</h3></a>
<p>The template engine provides creation of complex window structures with tree layout from memory data structure, called template. The templates makes creation of dialog windows  containing children windows and non visual objects.</p>
<p>Templates can be visually created and edited. The template format used by FreshLib is flexible and allows all parameters and fields of the objects to be set to needed values during creation of the window.</p>
<p>The template engine is located in the file ObjTemplates.asm</p>

<a name="Template data structure"><h4>Template data structure</h4></a>
<p>The template is consisted from one or more data structures of type TObjTemplate, defined following way:</p>
<pre class="fasm-code">
struct TObjTemplate
  .flags     dd  ?     
  .class     dd  ?
  .ptrVar    dd  ?     
  .paramsize dd  ?
  .params:
ends
</pre>
<p><span class="variable">.flags</span> – controls what is the place of the object in the whole tree structure.</p>
<p>Can accept one or both of the following values, combined with OR:</p>
<table style="margin-left: 40px;">
	<tr><td><span class="constant">tfChild</span> </td><td>=0</td> <td>means the object is child of the last object with tfParent set.</td></tr>
	<tr><td><span class="constant">tfParent</span>  </td><td>=1</td> <td>means the given object is parent and there will be next TObjTemplate structure that will be a child object.</td></tr>
	<tr style="vertical-align: top;"><td><span class="constant">tfEnd</span>   </td><td> =2</td> <td>means the given object is the last child of its parent. Note, that one object can be parent and child in the same time. If the current template is at root level – the processing of template stops, after creating the current element and all its children.</td></tr>
</table>

<p><span class="variable">.class</span> – pointer to TObjectClass data structure for the created object.</p>
<p><span class="variable">.ptrVar</span> – pointer to dword variable that to accept the pointer to the created object.</p>
<p><span class="variable">.paramsize</span> – the size of the additional data to the end of the template. Note, that TObjTemplate is variable length structure, not fixed. sizeof.TObjTemplate contains the size of the header part of the structure.</p>
<p><span class="variable">.params</span>: after the header fields there can be arbitrary count of dword pairs: (<span class="variable">paramID</span>, <span class="variable">Value</span>) that to be set the the object during creation. This sequence ends with dword <span class="constant">$FFFFFF</span> (<span class="constant">-1</span>) value for paramID. </p>

<p>Easy creation of templates is provided with macro ObjTemplate:</p>
<pre class="fasm-code">
macro ObjTemplate  flags, class, name, [id, param]
</pre>
<p>This macro allows use of string values for params and computes automatically the values for <span class="variable">TObjTemplate.paramsize</span></p>
<p><span class="variable">flags</span> – set of (<span class="constant">tfParent</span>, <span class="constant">tfEnd</span>) constants.</p>
<p><span class="variable">class</span> – the base name of the object class (without prefix C) – i.e. Form, Window, Button, etc.</p>
<p><span class="variable">name</span> – label of the variable to receive the pointer to the created object.</p>
<p><span class="variable">id</span> – parameter ID or offset in the object structure.</p>
<p><span class="variable">param</span> – value of the parameter. Can be dword number or string constant. In the case the parameter value is string, it will be automatically created in the memory and the pointer to this string will be placed as a param value.</p>
<p>One simple example of template structure:</p>
<pre class="fasm-code">
ObjTemplate  tfParent or tfEnd, Form, frmMain, \
			 visible, TRUE, \
			 x, 100,        \
			 y, 50,         \
			 width, 640,    \
			 height, 480,   \
			 caption, 'Fresh portable Win32/Linux application test.'

  ObjTemplate  tfChild, Button, btnChild1,          \
			 visible, TRUE, \
			 x, 64,         \
			 y, 48,         \
			 width, 64,     \
			 height, 24,    \
			 caption, 'Button1',        \
			 OnClick, Button1Click

  ObjTemplate  tfChild or tfEnd, Button, btnChild2,          \
			 x, 136,         \
			 y, 48,         \
			 width, 64,     \
			 height, 24,        \
			 caption, 'Button2' ,\
			 visible, TRUE
</pre>

<a name="Template engine procedures"><h4>Template engine procedures</h4></a>
<p>Actually the procedure is one:</p>
<pre class="fasm-code">
proc CreateFromTemplate, .ptrTemplate, .parent
</pre>

<p>This procedure creates all objects from the template, pointed by <span class="variable">[.ptrTemplate]</span> as a parent of <span class="variable">[.parent]</span> argument.</p>
<p><span class="variable">.ptrTemplate</span> points to TObjTemplate structure.</p>
<p><span class="variable">.parent</span> points to TObject descendant structure. In most cases it will be actually descendant of TWindow or <span class="constant">NULL</span> if the created object is not a child of any window.</p>
<p>Returns: <span class="register">EBX</span> contains a pointer to the topmost of the created object (it is first of the created objects)</p>
<p>All pointers of the objects are stored in the specified in the template variables ( i.e. <span class="variable">[TObjTemplate.ptrVar]</span>)</p>
</nowiki>

Added freshlib/_doc/RFC/rfc1950.txt.























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619






Network Working Group					      P. Deutsch
Request for Comments: 1950			     Aladdin Enterprises
Category: Informational 				     J-L. Gailly
								Info-ZIP
								May 1996


	 ZLIB Compressed Data Format Specification version 3.3

Status of This Memo

   This memo provides information for the Internet community.  This memo
   does not specify an Internet standard of any kind.  Distribution of
   this memo is unlimited.

IESG Note:

   The IESG takes no position on the validity of any Intellectual
   Property Rights statements contained in this document.

Notices

   Copyright (c) 1996 L. Peter Deutsch and Jean-Loup Gailly

   Permission is granted to copy and distribute this document for any
   purpose and without charge, including translations into other
   languages and incorporation into compilations, provided that the
   copyright notice and this notice are preserved, and that any
   substantive changes or deletions from the original are clearly
   marked.

   A pointer to the latest version of this and related documentation in
   HTML format can be found at the URL
   <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>.

Abstract

   This specification defines a lossless compressed data format.  The
   data can be produced or consumed, even for an arbitrarily long
   sequentially presented input data stream, using only an a priori
   bounded amount of intermediate storage.  The format presently uses
   the DEFLATE compression method but can be easily extended to use
   other compression methods.  It can be implemented readily in a manner
   not covered by patents.  This specification also defines the ADLER-32
   checksum (an extension and improvement of the Fletcher checksum),
   used for detection of data corruption, and provides an algorithm for
   computing it.




Deutsch & Gailly	     Informational			[Page 1]

RFC 1950       ZLIB Compressed Data Format Specification	May 1996


Table of Contents

   1. Introduction ................................................... 2
      1.1. Purpose ................................................... 2
      1.2. Intended audience ......................................... 3
      1.3. Scope ..................................................... 3
      1.4. Compliance ................................................ 3
      1.5.  Definitions of terms and conventions used ................ 3
      1.6. Changes from previous versions ............................ 3
   2. Detailed specification ......................................... 3
      2.1. Overall conventions ....................................... 3
      2.2. Data format ............................................... 4
      2.3. Compliance ................................................ 7
   3. References ..................................................... 7
   4. Source code .................................................... 8
   5. Security Considerations ........................................ 8
   6. Acknowledgements ............................................... 8
   7. Authors' Addresses ............................................. 8
   8. Appendix: Rationale ............................................ 9
   9. Appendix: Sample code ..........................................10

1. Introduction

   1.1. Purpose

      The purpose of this specification is to define a lossless
      compressed data format that:

	  * Is independent of CPU type, operating system, file system,
	    and character set, and hence can be used for interchange;

	  * Can be produced or consumed, even for an arbitrarily long
	    sequentially presented input data stream, using only an a
	    priori bounded amount of intermediate storage, and hence can
	    be used in data communications or similar structures such as
	    Unix filters;

	  * Can use a number of different compression methods;

	  * Can be implemented readily in a manner not covered by
	    patents, and hence can be practiced freely.

      The data format defined by this specification does not attempt to
      allow random access to compressed data.







Deutsch & Gailly	     Informational			[Page 2]

RFC 1950       ZLIB Compressed Data Format Specification	May 1996


   1.2. Intended audience

      This specification is intended for use by implementors of software
      to compress data into zlib format and/or decompress data from zlib
      format.

      The text of the specification assumes a basic background in
      programming at the level of bits and other primitive data
      representations.

   1.3. Scope

      The specification specifies a compressed data format that can be
      used for in-memory compression of a sequence of arbitrary bytes.

   1.4. Compliance

      Unless otherwise indicated below, a compliant decompressor must be
      able to accept and decompress any data set that conforms to all
      the specifications presented here; a compliant compressor must
      produce data sets that conform to all the specifications presented
      here.

   1.5.  Definitions of terms and conventions used

      byte: 8 bits stored or transmitted as a unit (same as an octet).
      (For this specification, a byte is exactly 8 bits, even on
      machines which store a character on a number of bits different
      from 8.) See below, for the numbering of bits within a byte.

   1.6. Changes from previous versions

      Version 3.1 was the first public release of this specification.
      In version 3.2, some terminology was changed and the Adler-32
      sample code was rewritten for clarity.  In version 3.3, the
      support for a preset dictionary was introduced, and the
      specification was converted to RFC style.

2. Detailed specification

   2.1. Overall conventions

      In the diagrams below, a box like this:

	 +---+
	 |   | <-- the vertical bars might be missing
	 +---+




Deutsch & Gailly	     Informational			[Page 3]

RFC 1950       ZLIB Compressed Data Format Specification	May 1996


      represents one byte; a box like this:

	 +==============+
	 |		|
	 +==============+

      represents a variable number of bytes.

      Bytes stored within a computer do not have a "bit order", since
      they are always treated as a unit.  However, a byte considered as
      an integer between 0 and 255 does have a most- and least-
      significant bit, and since we write numbers with the most-
      significant digit on the left, we also write bytes with the most-
      significant bit on the left.  In the diagrams below, we number the
      bits of a byte so that bit 0 is the least-significant bit, i.e.,
      the bits are numbered:

	 +--------+
	 |76543210|
	 +--------+

      Within a computer, a number may occupy multiple bytes.  All
      multi-byte numbers in the format described here are stored with
      the MOST-significant byte first (at the lower memory address).
      For example, the decimal number 520 is stored as:

	     0	   1
	 +--------+--------+
	 |00000010|00001000|
	 +--------+--------+
	  ^	   ^
	  |	   |
	  |	   + less significant byte = 8
	  + more significant byte = 2 x 256

   2.2. Data format

      A zlib stream has the following structure:

	   0   1
	 +---+---+
	 |CMF|FLG|   (more-->)
	 +---+---+








Deutsch & Gailly	     Informational			[Page 4]

RFC 1950       ZLIB Compressed Data Format Specification	May 1996


      (if FLG.FDICT set)

	   0   1   2   3
	 +---+---+---+---+
	 |     DICTID	 |   (more-->)
	 +---+---+---+---+

	 +=====================+---+---+---+---+
	 |...compressed data...|    ADLER32    |
	 +=====================+---+---+---+---+

      Any data which may appear after ADLER32 are not part of the zlib
      stream.

      CMF (Compression Method and flags)
	 This byte is divided into a 4-bit compression method and a 4-
	 bit information field depending on the compression method.

	    bits 0 to 3  CM	Compression method
	    bits 4 to 7  CINFO	Compression info

      CM (Compression method)
	 This identifies the compression method used in the file. CM = 8
	 denotes the "deflate" compression method with a window size up
	 to 32K.  This is the method used by gzip and PNG (see
	 references [1] and [2] in Chapter 3, below, for the reference
	 documents).  CM = 15 is reserved.  It might be used in a future
	 version of this specification to indicate the presence of an
	 extra field before the compressed data.

      CINFO (Compression info)
	 For CM = 8, CINFO is the base-2 logarithm of the LZ77 window
	 size, minus eight (CINFO=7 indicates a 32K window size). Values
	 of CINFO above 7 are not allowed in this version of the
	 specification.  CINFO is not defined in this specification for
	 CM not equal to 8.

      FLG (FLaGs)
	 This flag byte is divided as follows:

	    bits 0 to 4  FCHECK  (check bits for CMF and FLG)
	    bit  5	 FDICT	 (preset dictionary)
	    bits 6 to 7  FLEVEL  (compression level)

	 The FCHECK value must be such that CMF and FLG, when viewed as
	 a 16-bit unsigned integer stored in MSB order (CMF*256 + FLG),
	 is a multiple of 31.




Deutsch & Gailly	     Informational			[Page 5]

RFC 1950       ZLIB Compressed Data Format Specification	May 1996


      FDICT (Preset dictionary)
	 If FDICT is set, a DICT dictionary identifier is present
	 immediately after the FLG byte. The dictionary is a sequence of
	 bytes which are initially fed to the compressor without
	 producing any compressed output. DICT is the Adler-32 checksum
	 of this sequence of bytes (see the definition of ADLER32
	 below).  The decompressor can use this identifier to determine
	 which dictionary has been used by the compressor.

      FLEVEL (Compression level)
	 These flags are available for use by specific compression
	 methods.  The "deflate" method (CM = 8) sets these flags as
	 follows:

	    0 - compressor used fastest algorithm
	    1 - compressor used fast algorithm
	    2 - compressor used default algorithm
	    3 - compressor used maximum compression, slowest algorithm

	 The information in FLEVEL is not needed for decompression; it
	 is there to indicate if recompression might be worthwhile.

      compressed data
	 For compression method 8, the compressed data is stored in the
	 deflate compressed data format as described in the document
	 "DEFLATE Compressed Data Format Specification" by L. Peter
	 Deutsch. (See reference [3] in Chapter 3, below)

	 Other compressed data formats are not specified in this version
	 of the zlib specification.

      ADLER32 (Adler-32 checksum)
	 This contains a checksum value of the uncompressed data
	 (excluding any dictionary data) computed according to Adler-32
	 algorithm. This algorithm is a 32-bit extension and improvement
	 of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073
	 standard. See references [4] and [5] in Chapter 3, below)

	 Adler-32 is composed of two sums accumulated per byte: s1 is
	 the sum of all bytes, s2 is the sum of all s1 values. Both sums
	 are done modulo 65521. s1 is initialized to 1, s2 to zero.  The
	 Adler-32 checksum is stored as s2*65536 + s1 in most-
	 significant-byte first (network) order.








Deutsch & Gailly	     Informational			[Page 6]

RFC 1950       ZLIB Compressed Data Format Specification	May 1996


   2.3. Compliance

      A compliant compressor must produce streams with correct CMF, FLG
      and ADLER32, but need not support preset dictionaries.  When the
      zlib data format is used as part of another standard data format,
      the compressor may use only preset dictionaries that are specified
      by this other data format.  If this other format does not use the
      preset dictionary feature, the compressor must not set the FDICT
      flag.

      A compliant decompressor must check CMF, FLG, and ADLER32, and
      provide an error indication if any of these have incorrect values.
      A compliant decompressor must give an error indication if CM is
      not one of the values defined in this specification (only the
      value 8 is permitted in this version), since another value could
      indicate the presence of new features that would cause subsequent
      data to be interpreted incorrectly.  A compliant decompressor must
      give an error indication if FDICT is set and DICTID is not the
      identifier of a known preset dictionary.	A decompressor may
      ignore FLEVEL and still be compliant.  When the zlib data format
      is being used as a part of another standard format, a compliant
      decompressor must support all the preset dictionaries specified by
      the other format. When the other format does not use the preset
      dictionary feature, a compliant decompressor must reject any
      stream in which the FDICT flag is set.

3. References

   [1] Deutsch, L.P.,"GZIP Compressed Data Format Specification",
       available in ftp://ftp.uu.net/pub/archiving/zip/doc/

   [2] Thomas Boutell, "PNG (Portable Network Graphics) specification",
       available in ftp://ftp.uu.net/graphics/png/documents/

   [3] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification",
       available in ftp://ftp.uu.net/pub/archiving/zip/doc/

   [4] Fletcher, J. G., "An Arithmetic Checksum for Serial
       Transmissions," IEEE Transactions on Communications, Vol. COM-30,
       No. 1, January 1982, pp. 247-252.

   [5] ITU-T Recommendation X.224, Annex D, "Checksum Algorithms,"
       November, 1993, pp. 144, 145. (Available from
       gopher://info.itu.ch). ITU-T X.244 is also the same as ISO 8073.







Deutsch & Gailly	     Informational			[Page 7]

RFC 1950       ZLIB Compressed Data Format Specification	May 1996


4. Source code

   Source code for a C language implementation of a "zlib" compliant
   library is available at ftp://ftp.uu.net/pub/archiving/zip/zlib/.

5. Security Considerations

   A decoder that fails to check the ADLER32 checksum value may be
   subject to undetected data corruption.

6. Acknowledgements

   Trademarks cited in this document are the property of their
   respective owners.

   Jean-Loup Gailly and Mark Adler designed the zlib format and wrote
   the related software described in this specification.  Glenn
   Randers-Pehrson converted this document to RFC and HTML format.

7. Authors' Addresses

   L. Peter Deutsch
   Aladdin Enterprises
   203 Santa Margarita Ave.
   Menlo Park, CA 94025

   Phone: (415) 322-0103 (AM only)
   FAX:   (415) 322-1734
   EMail: <ghost@aladdin.com>


   Jean-Loup Gailly

   EMail: <gzip@prep.ai.mit.edu>

   Questions about the technical content of this specification can be
   sent by email to

   Jean-Loup Gailly <gzip@prep.ai.mit.edu> and
   Mark Adler <madler@alumni.caltech.edu>

   Editorial comments on this specification can be sent by email to

   L. Peter Deutsch <ghost@aladdin.com> and
   Glenn Randers-Pehrson <randeg@alumni.rpi.edu>






Deutsch & Gailly	     Informational			[Page 8]

RFC 1950       ZLIB Compressed Data Format Specification	May 1996


8. Appendix: Rationale

   8.1. Preset dictionaries

      A preset dictionary is specially useful to compress short input
      sequences. The compressor can take advantage of the dictionary
      context to encode the input in a more compact manner. The
      decompressor can be initialized with the appropriate context by
      virtually decompressing a compressed version of the dictionary
      without producing any output. However for certain compression
      algorithms such as the deflate algorithm this operation can be
      achieved without actually performing any decompression.

      The compressor and the decompressor must use exactly the same
      dictionary. The dictionary may be fixed or may be chosen among a
      certain number of predefined dictionaries, according to the kind
      of input data. The decompressor can determine which dictionary has
      been chosen by the compressor by checking the dictionary
      identifier. This document does not specify the contents of
      predefined dictionaries, since the optimal dictionaries are
      application specific. Standard data formats using this feature of
      the zlib specification must precisely define the allowed
      dictionaries.

   8.2. The Adler-32 algorithm

      The Adler-32 algorithm is much faster than the CRC32 algorithm yet
      still provides an extremely low probability of undetected errors.

      The modulo on unsigned long accumulators can be delayed for 5552
      bytes, so the modulo operation time is negligible.  If the bytes
      are a, b, c, the second sum is 3a + 2b + c + 3, and so is position
      and order sensitive, unlike the first sum, which is just a
      checksum.  That 65521 is prime is important to avoid a possible
      large class of two-byte errors that leave the check unchanged.
      (The Fletcher checksum uses 255, which is not prime and which also
      makes the Fletcher check insensitive to single byte changes 0 <->
      255.)

      The sum s1 is initialized to 1 instead of zero to make the length
      of the sequence part of s2, so that the length does not have to be
      checked separately. (Any sequence of zeroes has a Fletcher
      checksum of zero.)








Deutsch & Gailly	     Informational			[Page 9]

RFC 1950       ZLIB Compressed Data Format Specification	May 1996


9. Appendix: Sample code

   The following C code computes the Adler-32 checksum of a data buffer.
   It is written for clarity, not for speed.  The sample code is in the
   ANSI C programming language. Non C users may find it easier to read
   with these hints:

      &      Bitwise AND operator.
      >>     Bitwise right shift operator. When applied to an
	     unsigned quantity, as here, right shift inserts zero bit(s)
	     at the left.
      <<     Bitwise left shift operator. Left shift inserts zero
	     bit(s) at the right.
      ++     "n++" increments the variable n.
      %      modulo operator: a % b is the remainder of a divided by b.

      #define BASE 65521 /* largest prime smaller than 65536 */

      /*
	 Update a running Adler-32 checksum with the bytes buf[0..len-1]
       and return the updated checksum. The Adler-32 checksum should be
       initialized to 1.

       Usage example:

	 unsigned long adler = 1L;

	 while (read_buffer(buffer, length) != EOF) {
	   adler = update_adler32(adler, buffer, length);
	 }
	 if (adler != original_adler) error();
      */
      unsigned long update_adler32(unsigned long adler,
	 unsigned char *buf, int len)
      {
	unsigned long s1 = adler & 0xffff;
	unsigned long s2 = (adler >> 16) & 0xffff;
	int n;

	for (n = 0; n < len; n++) {
	  s1 = (s1 + buf[n]) % BASE;
	  s2 = (s2 + s1)     % BASE;
	}
	return (s2 << 16) + s1;
      }

      /* Return the adler32 of the bytes buf[0..len-1] */




Deutsch & Gailly	     Informational		       [Page 10]

RFC 1950       ZLIB Compressed Data Format Specification	May 1996


      unsigned long adler32(unsigned char *buf, int len)
      {
	return update_adler32(1L, buf, len);
      }















































Deutsch & Gailly	     Informational		       [Page 11]


Added freshlib/_doc/RFC/rfc1951.txt.























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955






Network Working Group					      P. Deutsch
Request for Comments: 1951			     Aladdin Enterprises
Category: Informational 					May 1996


	DEFLATE Compressed Data Format Specification version 1.3

Status of This Memo

   This memo provides information for the Internet community.  This memo
   does not specify an Internet standard of any kind.  Distribution of
   this memo is unlimited.

IESG Note:

   The IESG takes no position on the validity of any Intellectual
   Property Rights statements contained in this document.

Notices

   Copyright (c) 1996 L. Peter Deutsch

   Permission is granted to copy and distribute this document for any
   purpose and without charge, including translations into other
   languages and incorporation into compilations, provided that the
   copyright notice and this notice are preserved, and that any
   substantive changes or deletions from the original are clearly
   marked.

   A pointer to the latest version of this and related documentation in
   HTML format can be found at the URL
   <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>.

Abstract

   This specification defines a lossless compressed data format that
   compresses data using a combination of the LZ77 algorithm and Huffman
   coding, with efficiency comparable to the best currently available
   general-purpose compression methods.  The data can be produced or
   consumed, even for an arbitrarily long sequentially presented input
   data stream, using only an a priori bounded amount of intermediate
   storage.  The format can be implemented readily in a manner not
   covered by patents.








Deutsch 		     Informational			[Page 1]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


Table of Contents

   1. Introduction ................................................... 2
      1.1. Purpose ................................................... 2
      1.2. Intended audience ......................................... 3
      1.3. Scope ..................................................... 3
      1.4. Compliance ................................................ 3
      1.5.  Definitions of terms and conventions used ................ 3
      1.6. Changes from previous versions ............................ 4
   2. Compressed representation overview ............................. 4
   3. Detailed specification ......................................... 5
      3.1. Overall conventions ....................................... 5
	  3.1.1. Packing into bytes .................................. 5
      3.2. Compressed block format ................................... 6
	  3.2.1. Synopsis of prefix and Huffman coding ............... 6
	  3.2.2. Use of Huffman coding in the "deflate" format ....... 7
	  3.2.3. Details of block format ............................. 9
	  3.2.4. Non-compressed blocks (BTYPE=00) ................... 11
	  3.2.5. Compressed blocks (length and distance codes) ...... 11
	  3.2.6. Compression with fixed Huffman codes (BTYPE=01) .... 12
	  3.2.7. Compression with dynamic Huffman codes (BTYPE=10) .. 13
      3.3. Compliance ............................................... 14
   4. Compression algorithm details ................................. 14
   5. References .................................................... 16
   6. Security Considerations ....................................... 16
   7. Source code ................................................... 16
   8. Acknowledgements .............................................. 16
   9. Author's Address .............................................. 17

1. Introduction

   1.1. Purpose

      The purpose of this specification is to define a lossless
      compressed data format that:
	  * Is independent of CPU type, operating system, file system,
	    and character set, and hence can be used for interchange;
	  * Can be produced or consumed, even for an arbitrarily long
	    sequentially presented input data stream, using only an a
	    priori bounded amount of intermediate storage, and hence
	    can be used in data communications or similar structures
	    such as Unix filters;
	  * Compresses data with efficiency comparable to the best
	    currently available general-purpose compression methods,
	    and in particular considerably better than the "compress"
	    program;
	  * Can be implemented readily in a manner not covered by
	    patents, and hence can be practiced freely;



Deutsch 		     Informational			[Page 2]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


	  * Is compatible with the file format produced by the current
	    widely used gzip utility, in that conforming decompressors
	    will be able to read data produced by the existing gzip
	    compressor.

      The data format defined by this specification does not attempt to:

	  * Allow random access to compressed data;
	  * Compress specialized data (e.g., raster graphics) as well
	    as the best currently available specialized algorithms.

      A simple counting argument shows that no lossless compression
      algorithm can compress every possible input data set.  For the
      format defined here, the worst case expansion is 5 bytes per 32K-
      byte block, i.e., a size increase of 0.015% for large data sets.
      English text usually compresses by a factor of 2.5 to 3;
      executable files usually compress somewhat less; graphical data
      such as raster images may compress much more.

   1.2. Intended audience

      This specification is intended for use by implementors of software
      to compress data into "deflate" format and/or decompress data from
      "deflate" format.

      The text of the specification assumes a basic background in
      programming at the level of bits and other primitive data
      representations.	Familiarity with the technique of Huffman coding
      is helpful but not required.

   1.3. Scope

      The specification specifies a method for representing a sequence
      of bytes as a (usually shorter) sequence of bits, and a method for
      packing the latter bit sequence into bytes.

   1.4. Compliance

      Unless otherwise indicated below, a compliant decompressor must be
      able to accept and decompress any data set that conforms to all
      the specifications presented here; a compliant compressor must
      produce data sets that conform to all the specifications presented
      here.

   1.5.  Definitions of terms and conventions used

      Byte: 8 bits stored or transmitted as a unit (same as an octet).
      For this specification, a byte is exactly 8 bits, even on machines



Deutsch 		     Informational			[Page 3]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


      which store a character on a number of bits different from eight.
      See below, for the numbering of bits within a byte.

      String: a sequence of arbitrary bytes.

   1.6. Changes from previous versions

      There have been no technical changes to the deflate format since
      version 1.1 of this specification.  In version 1.2, some
      terminology was changed.	Version 1.3 is a conversion of the
      specification to RFC style.

2. Compressed representation overview

   A compressed data set consists of a series of blocks, corresponding
   to successive blocks of input data.	The block sizes are arbitrary,
   except that non-compressible blocks are limited to 65,535 bytes.

   Each block is compressed using a combination of the LZ77 algorithm
   and Huffman coding. The Huffman trees for each block are independent
   of those for previous or subsequent blocks; the LZ77 algorithm may
   use a reference to a duplicated string occurring in a previous block,
   up to 32K input bytes before.

   Each block consists of two parts: a pair of Huffman code trees that
   describe the representation of the compressed data part, and a
   compressed data part.  (The Huffman trees themselves are compressed
   using Huffman encoding.)  The compressed data consists of a series of
   elements of two types: literal bytes (of strings that have not been
   detected as duplicated within the previous 32K input bytes), and
   pointers to duplicated strings, where a pointer is represented as a
   pair <length, backward distance>.  The representation used in the
   "deflate" format limits distances to 32K bytes and lengths to 258
   bytes, but does not limit the size of a block, except for
   uncompressible blocks, which are limited as noted above.

   Each type of value (literals, distances, and lengths) in the
   compressed data is represented using a Huffman code, using one code
   tree for literals and lengths and a separate code tree for distances.
   The code trees for each block appear in a compact form just before
   the compressed data for that block.










Deutsch 		     Informational			[Page 4]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


3. Detailed specification

   3.1. Overall conventions In the diagrams below, a box like this:

	 +---+
	 |   | <-- the vertical bars might be missing
	 +---+

      represents one byte; a box like this:

	 +==============+
	 |		|
	 +==============+

      represents a variable number of bytes.

      Bytes stored within a computer do not have a "bit order", since
      they are always treated as a unit.  However, a byte considered as
      an integer between 0 and 255 does have a most- and least-
      significant bit, and since we write numbers with the most-
      significant digit on the left, we also write bytes with the most-
      significant bit on the left.  In the diagrams below, we number the
      bits of a byte so that bit 0 is the least-significant bit, i.e.,
      the bits are numbered:

	 +--------+
	 |76543210|
	 +--------+

      Within a computer, a number may occupy multiple bytes.  All
      multi-byte numbers in the format described here are stored with
      the least-significant byte first (at the lower memory address).
      For example, the decimal number 520 is stored as:

	     0	      1
	 +--------+--------+
	 |00001000|00000010|
	 +--------+--------+
	  ^	   ^
	  |	   |
	  |	   + more significant byte = 2 x 256
	  + less significant byte = 8

      3.1.1. Packing into bytes

	 This document does not address the issue of the order in which
	 bits of a byte are transmitted on a bit-sequential medium,
	 since the final data format described here is byte- rather than



Deutsch 		     Informational			[Page 5]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


	 bit-oriented.	However, we describe the compressed block format
	 in below, as a sequence of data elements of various bit
	 lengths, not a sequence of bytes.  We must therefore specify
	 how to pack these data elements into bytes to form the final
	 compressed byte sequence:

	     * Data elements are packed into bytes in order of
	       increasing bit number within the byte, i.e., starting
	       with the least-significant bit of the byte.
	     * Data elements other than Huffman codes are packed
	       starting with the least-significant bit of the data
	       element.
	     * Huffman codes are packed starting with the most-
	       significant bit of the code.

	 In other words, if one were to print out the compressed data as
	 a sequence of bytes, starting with the first byte at the
	 *right* margin and proceeding to the *left*, with the most-
	 significant bit of each byte on the left as usual, one would be
	 able to parse the result from right to left, with fixed-width
	 elements in the correct MSB-to-LSB order and Huffman codes in
	 bit-reversed order (i.e., with the first bit of the code in the
	 relative LSB position).

   3.2. Compressed block format

      3.2.1. Synopsis of prefix and Huffman coding

	 Prefix coding represents symbols from an a priori known
	 alphabet by bit sequences (codes), one code for each symbol, in
	 a manner such that different symbols may be represented by bit
	 sequences of different lengths, but a parser can always parse
	 an encoded string unambiguously symbol-by-symbol.

	 We define a prefix code in terms of a binary tree in which the
	 two edges descending from each non-leaf node are labeled 0 and
	 1 and in which the leaf nodes correspond one-for-one with (are
	 labeled with) the symbols of the alphabet; then the code for a
	 symbol is the sequence of 0's and 1's on the edges leading from
	 the root to the leaf labeled with that symbol.  For example:











Deutsch 		     Informational			[Page 6]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


			  /\		  Symbol    Code
			 0  1		  ------    ----
			/    \		      A      00
		       /\     B 	      B       1
		      0  1		      C     011
		     /	  \		      D     010
		    A	  /\
			 0  1
			/    \
		       D      C

	 A parser can decode the next symbol from an encoded input
	 stream by walking down the tree from the root, at each step
	 choosing the edge corresponding to the next input bit.

	 Given an alphabet with known symbol frequencies, the Huffman
	 algorithm allows the construction of an optimal prefix code
	 (one which represents strings with those symbol frequencies
	 using the fewest bits of any possible prefix codes for that
	 alphabet).  Such a code is called a Huffman code.  (See
	 reference [1] in Chapter 5, references for additional
	 information on Huffman codes.)

	 Note that in the "deflate" format, the Huffman codes for the
	 various alphabets must not exceed certain maximum code lengths.
	 This constraint complicates the algorithm for computing code
	 lengths from symbol frequencies.  Again, see Chapter 5,
	 references for details.

      3.2.2. Use of Huffman coding in the "deflate" format

	 The Huffman codes used for each alphabet in the "deflate"
	 format have two additional rules:

	     * All codes of a given bit length have lexicographically
	       consecutive values, in the same order as the symbols
	       they represent;

	     * Shorter codes lexicographically precede longer codes.












Deutsch 		     Informational			[Page 7]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


	 We could recode the example above to follow this rule as
	 follows, assuming that the order of the alphabet is ABCD:

	    Symbol  Code
	    ------  ----
	    A	    10
	    B	    0
	    C	    110
	    D	    111

	 I.e., 0 precedes 10 which precedes 11x, and 110 and 111 are
	 lexicographically consecutive.

	 Given this rule, we can define the Huffman code for an alphabet
	 just by giving the bit lengths of the codes for each symbol of
	 the alphabet in order; this is sufficient to determine the
	 actual codes.	In our example, the code is completely defined
	 by the sequence of bit lengths (2, 1, 3, 3).  The following
	 algorithm generates the codes as integers, intended to be read
	 from most- to least-significant bit.  The code lengths are
	 initially in tree[I].Len; the codes are produced in
	 tree[I].Code.

	 1)  Count the number of codes for each code length.  Let
	     bl_count[N] be the number of codes of length N, N >= 1.

	 2)  Find the numerical value of the smallest code for each
	     code length:

		code = 0;
		bl_count[0] = 0;
		for (bits = 1; bits <= MAX_BITS; bits++) {
		    code = (code + bl_count[bits-1]) << 1;
		    next_code[bits] = code;
		}

	 3)  Assign numerical values to all codes, using consecutive
	     values for all codes of the same length with the base
	     values determined at step 2. Codes that are never used
	     (which have a bit length of zero) must not be assigned a
	     value.

		for (n = 0;  n <= max_code; n++) {
		    len = tree[n].Len;
		    if (len != 0) {
			tree[n].Code = next_code[len];
			next_code[len]++;
		    }



Deutsch 		     Informational			[Page 8]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


		}

	 Example:

	 Consider the alphabet ABCDEFGH, with bit lengths (3, 3, 3, 3,
	 3, 2, 4, 4).  After step 1, we have:

	    N	   bl_count[N]
	    -	   -----------
	    2	   1
	    3	   5
	    4	   2

	 Step 2 computes the following next_code values:

	    N	   next_code[N]
	    -	   ------------
	    1	   0
	    2	   0
	    3	   2
	    4	   14

	 Step 3 produces the following code values:

	    Symbol Length   Code
	    ------ ------   ----
	    A	    3	     010
	    B	    3	     011
	    C	    3	     100
	    D	    3	     101
	    E	    3	     110
	    F	    2	      00
	    G	    4	    1110
	    H	    4	    1111

      3.2.3. Details of block format

	 Each block of compressed data begins with 3 header bits
	 containing the following data:

	    first bit	    BFINAL
	    next 2 bits     BTYPE

	 Note that the header bits do not necessarily begin on a byte
	 boundary, since a block does not necessarily occupy an integral
	 number of bytes.





Deutsch 		     Informational			[Page 9]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


	 BFINAL is set if and only if this is the last block of the data
	 set.

	 BTYPE specifies how the data are compressed, as follows:

	    00 - no compression
	    01 - compressed with fixed Huffman codes
	    10 - compressed with dynamic Huffman codes
	    11 - reserved (error)

	 The only difference between the two compressed cases is how the
	 Huffman codes for the literal/length and distance alphabets are
	 defined.

	 In all cases, the decoding algorithm for the actual data is as
	 follows:

	    do
	       read block header from input stream.
	       if stored with no compression
		  skip any remaining bits in current partially
		     processed byte
		  read LEN and NLEN (see next section)
		  copy LEN bytes of data to output
	       otherwise
		  if compressed with dynamic Huffman codes
		     read representation of code trees (see
			subsection below)
		  loop (until end of block code recognized)
		     decode literal/length value from input stream
		     if value < 256
			copy value (literal byte) to output stream
		     otherwise
			if value = end of block (256)
			   break from loop
			otherwise (value = 257..285)
			   decode distance from input stream

			   move backwards distance bytes in the output
			   stream, and copy length bytes from this
			   position to the output stream.
		  end loop
	    while not last block

	 Note that a duplicated string reference may refer to a string
	 in a previous block; i.e., the backward distance may cross one
	 or more block boundaries.  However a distance cannot refer past
	 the beginning of the output stream.  (An application using a



Deutsch 		     Informational		       [Page 10]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


	 preset dictionary might discard part of the output stream; a
	 distance can refer to that part of the output stream anyway)
	 Note also that the referenced string may overlap the current
	 position; for example, if the last 2 bytes decoded have values
	 X and Y, a string reference with <length = 5, distance = 2>
	 adds X,Y,X,Y,X to the output stream.

	 We now specify each compression method in turn.

      3.2.4. Non-compressed blocks (BTYPE=00)

	 Any bits of input up to the next byte boundary are ignored.
	 The rest of the block consists of the following information:

	      0   1   2   3   4...
	    +---+---+---+---+================================+
	    |  LEN  | NLEN  |... LEN bytes of literal data...|
	    +---+---+---+---+================================+

	 LEN is the number of data bytes in the block.	NLEN is the
	 one's complement of LEN.

      3.2.5. Compressed blocks (length and distance codes)

	 As noted above, encoded data blocks in the "deflate" format
	 consist of sequences of symbols drawn from three conceptually
	 distinct alphabets: either literal bytes, from the alphabet of
	 byte values (0..255), or <length, backward distance> pairs,
	 where the length is drawn from (3..258) and the distance is
	 drawn from (1..32,768).  In fact, the literal and length
	 alphabets are merged into a single alphabet (0..285), where
	 values 0..255 represent literal bytes, the value 256 indicates
	 end-of-block, and values 257..285 represent length codes
	 (possibly in conjunction with extra bits following the symbol
	 code) as follows:
















Deutsch 		     Informational		       [Page 11]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


		 Extra		     Extra		 Extra
	    Code Bits Length(s) Code Bits Lengths   Code Bits Length(s)
	    ---- ---- ------	 ---- ---- -------   ---- ---- -------
	     257   0	 3	 267   1   15,16     277   4   67-82
	     258   0	 4	 268   1   17,18     278   4   83-98
	     259   0	 5	 269   2   19-22     279   4   99-114
	     260   0	 6	 270   2   23-26     280   4  115-130
	     261   0	 7	 271   2   27-30     281   5  131-162
	     262   0	 8	 272   2   31-34     282   5  163-194
	     263   0	 9	 273   3   35-42     283   5  195-226
	     264   0	10	 274   3   43-50     284   5  227-257
	     265   1  11,12	 275   3   51-58     285   0	258
	     266   1  13,14	 276   3   59-66

	 The extra bits should be interpreted as a machine integer
	 stored with the most-significant bit first, e.g., bits 1110
	 represent the value 14.

		  Extra 	  Extra 	      Extra
	     Code Bits Dist  Code Bits	 Dist	  Code Bits Distance
	     ---- ---- ----  ---- ----	------	  ---- ---- --------
	       0   0	1     10   4	 33-48	  20	9   1025-1536
	       1   0	2     11   4	 49-64	  21	9   1537-2048
	       2   0	3     12   5	 65-96	  22   10   2049-3072
	       3   0	4     13   5	 97-128   23   10   3073-4096
	       4   1   5,6    14   6	129-192   24   11   4097-6144
	       5   1   7,8    15   6	193-256   25   11   6145-8192
	       6   2   9-12   16   7	257-384   26   12  8193-12288
	       7   2  13-16   17   7	385-512   27   12 12289-16384
	       8   3  17-24   18   8	513-768   28   13 16385-24576
	       9   3  25-32   19   8   769-1024   29   13 24577-32768

      3.2.6. Compression with fixed Huffman codes (BTYPE=01)

	 The Huffman codes for the two alphabets are fixed, and are not
	 represented explicitly in the data.  The Huffman code lengths
	 for the literal/length alphabet are:

		   Lit Value	Bits	    Codes
		   ---------	----	    -----
		     0 - 143	 8	    00110000 through
					    10111111
		   144 - 255	 9	    110010000 through
					    111111111
		   256 - 279	 7	    0000000 through
					    0010111
		   280 - 287	 8	    11000000 through
					    11000111



Deutsch 		     Informational		       [Page 12]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


	 The code lengths are sufficient to generate the actual codes,
	 as described above; we show the codes in the table for added
	 clarity.  Literal/length values 286-287 will never actually
	 occur in the compressed data, but participate in the code
	 construction.

	 Distance codes 0-31 are represented by (fixed-length) 5-bit
	 codes, with possible additional bits as shown in the table
	 shown in Paragraph 3.2.5, above.  Note that distance codes 30-
	 31 will never actually occur in the compressed data.

      3.2.7. Compression with dynamic Huffman codes (BTYPE=10)

	 The Huffman codes for the two alphabets appear in the block
	 immediately after the header bits and before the actual
	 compressed data, first the literal/length code and then the
	 distance code.  Each code is defined by a sequence of code
	 lengths, as discussed in Paragraph 3.2.2, above.  For even
	 greater compactness, the code length sequences themselves are
	 compressed using a Huffman code.  The alphabet for code lengths
	 is as follows:

	       0 - 15: Represent code lengths of 0 - 15
		   16: Copy the previous code length 3 - 6 times.
		       The next 2 bits indicate repeat length
			     (0 = 3, ... , 3 = 6)
			  Example:  Codes 8, 16 (+2 bits 11),
				    16 (+2 bits 10) will expand to
				    12 code lengths of 8 (1 + 6 + 5)
		   17: Repeat a code length of 0 for 3 - 10 times.
		       (3 bits of length)
		   18: Repeat a code length of 0 for 11 - 138 times
		       (7 bits of length)

	 A code length of 0 indicates that the corresponding symbol in
	 the literal/length or distance alphabet will not occur in the
	 block, and should not participate in the Huffman code
	 construction algorithm given earlier.	If only one distance
	 code is used, it is encoded using one bit, not zero bits; in
	 this case there is a single code length of one, with one unused
	 code.	One distance code of zero bits means that there are no
	 distance codes used at all (the data is all literals).

	 We can now define the format of the block:

	       5 Bits: HLIT, # of Literal/Length codes - 257 (257 - 286)
	       5 Bits: HDIST, # of Distance codes - 1	     (1 - 32)
	       4 Bits: HCLEN, # of Code Length codes - 4     (4 - 19)



Deutsch 		     Informational		       [Page 13]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


	       (HCLEN + 4) x 3 bits: code lengths for the code length
		  alphabet given just above, in the order: 16, 17, 18,
		  0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15

		  These code lengths are interpreted as 3-bit integers
		  (0-7); as above, a code length of 0 means the
		  corresponding symbol (literal/length or distance code
		  length) is not used.

	       HLIT + 257 code lengths for the literal/length alphabet,
		  encoded using the code length Huffman code

	       HDIST + 1 code lengths for the distance alphabet,
		  encoded using the code length Huffman code

	       The actual compressed data of the block,
		  encoded using the literal/length and distance Huffman
		  codes

	       The literal/length symbol 256 (end of data),
		  encoded using the literal/length Huffman code

	 The code length repeat codes can cross from HLIT + 257 to the
	 HDIST + 1 code lengths.  In other words, all code lengths form
	 a single sequence of HLIT + HDIST + 258 values.

   3.3. Compliance

      A compressor may limit further the ranges of values specified in
      the previous section and still be compliant; for example, it may
      limit the range of backward pointers to some value smaller than
      32K.  Similarly, a compressor may limit the size of blocks so that
      a compressible block fits in memory.

      A compliant decompressor must accept the full range of possible
      values defined in the previous section, and must accept blocks of
      arbitrary size.

4. Compression algorithm details

   While it is the intent of this document to define the "deflate"
   compressed data format without reference to any particular
   compression algorithm, the format is related to the compressed
   formats produced by LZ77 (Lempel-Ziv 1977, see reference [2] below);
   since many variations of LZ77 are patented, it is strongly
   recommended that the implementor of a compressor follow the general
   algorithm presented here, which is known not to be patented per se.
   The material in this section is not part of the definition of the



Deutsch 		     Informational		       [Page 14]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


   specification per se, and a compressor need not follow it in order to
   be compliant.

   The compressor terminates a block when it determines that starting a
   new block with fresh trees would be useful, or when the block size
   fills up the compressor's block buffer.

   The compressor uses a chained hash table to find duplicated strings,
   using a hash function that operates on 3-byte sequences.  At any
   given point during compression, let XYZ be the next 3 input bytes to
   be examined (not necessarily all different, of course).  First, the
   compressor examines the hash chain for XYZ.	If the chain is empty,
   the compressor simply writes out X as a literal byte and advances one
   byte in the input.  If the hash chain is not empty, indicating that
   the sequence XYZ (or, if we are unlucky, some other 3 bytes with the
   same hash function value) has occurred recently, the compressor
   compares all strings on the XYZ hash chain with the actual input data
   sequence starting at the current point, and selects the longest
   match.

   The compressor searches the hash chains starting with the most recent
   strings, to favor small distances and thus take advantage of the
   Huffman encoding.  The hash chains are singly linked. There are no
   deletions from the hash chains; the algorithm simply discards matches
   that are too old.  To avoid a worst-case situation, very long hash
   chains are arbitrarily truncated at a certain length, determined by a
   run-time parameter.

   To improve overall compression, the compressor optionally defers the
   selection of matches ("lazy matching"): after a match of length N has
   been found, the compressor searches for a longer match starting at
   the next input byte.  If it finds a longer match, it truncates the
   previous match to a length of one (thus producing a single literal
   byte) and then emits the longer match.  Otherwise, it emits the
   original match, and, as described above, advances N bytes before
   continuing.

   Run-time parameters also control this "lazy match" procedure.  If
   compression ratio is most important, the compressor attempts a
   complete second search regardless of the length of the first match.
   In the normal case, if the current match is "long enough", the
   compressor reduces the search for a longer match, thus speeding up
   the process.  If speed is most important, the compressor inserts new
   strings in the hash table only when no match was found, or when the
   match is not "too long".  This degrades the compression ratio but
   saves time since there are both fewer insertions and fewer searches.





Deutsch 		     Informational		       [Page 15]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


5. References

   [1] Huffman, D. A., "A Method for the Construction of Minimum
       Redundancy Codes", Proceedings of the Institute of Radio
       Engineers, September 1952, Volume 40, Number 9, pp. 1098-1101.

   [2] Ziv J., Lempel A., "A Universal Algorithm for Sequential Data
       Compression", IEEE Transactions on Information Theory, Vol. 23,
       No. 3, pp. 337-343.

   [3] Gailly, J.-L., and Adler, M., ZLIB documentation and sources,
       available in ftp://ftp.uu.net/pub/archiving/zip/doc/

   [4] Gailly, J.-L., and Adler, M., GZIP documentation and sources,
       available as gzip-*.tar in ftp://prep.ai.mit.edu/pub/gnu/

   [5] Schwartz, E. S., and Kallick, B. "Generating a canonical prefix
       encoding." Comm. ACM, 7,3 (Mar. 1964), pp. 166-169.

   [6] Hirschberg and Lelewer, "Efficient decoding of prefix codes,"
       Comm. ACM, 33,4, April 1990, pp. 449-459.

6. Security Considerations

   Any data compression method involves the reduction of redundancy in
   the data.  Consequently, any corruption of the data is likely to have
   severe effects and be difficult to correct.	Uncompressed text, on
   the other hand, will probably still be readable despite the presence
   of some corrupted bytes.

   It is recommended that systems using this data format provide some
   means of validating the integrity of the compressed data.  See
   reference [3], for example.

7. Source code

   Source code for a C language implementation of a "deflate" compliant
   compressor and decompressor is available within the zlib package at
   ftp://ftp.uu.net/pub/archiving/zip/zlib/.

8. Acknowledgements

   Trademarks cited in this document are the property of their
   respective owners.

   Phil Katz designed the deflate format.  Jean-Loup Gailly and Mark
   Adler wrote the related software described in this specification.
   Glenn Randers-Pehrson converted this document to RFC and HTML format.



Deutsch 		     Informational		       [Page 16]

RFC 1951      DEFLATE Compressed Data Format Specification	May 1996


9. Author's Address

   L. Peter Deutsch
   Aladdin Enterprises
   203 Santa Margarita Ave.
   Menlo Park, CA 94025

   Phone: (415) 322-0103 (AM only)
   FAX:   (415) 322-1734
   EMail: <ghost@aladdin.com>

   Questions about the technical content of this specification can be
   sent by email to:

   Jean-Loup Gailly <gzip@prep.ai.mit.edu> and
   Mark Adler <madler@alumni.caltech.edu>

   Editorial comments on this specification can be sent by email to:

   L. Peter Deutsch <ghost@aladdin.com> and
   Glenn Randers-Pehrson <randeg@alumni.rpi.edu>






























Deutsch 		     Informational		       [Page 17]


Added freshlib/_doc/RFC/rfc2083.txt.



























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
Network Working Group				     T. Boutell, et. al.
Request for Comments: 2083			       Boutell.Com, Inc.
Category: Informational 				      March 1997


	     PNG (Portable Network Graphics) Specification
			      Version 1.0

Status of this Memo

   This memo provides information for the Internet community.  This memo
   does not specify an Internet standard of any kind.  Distribution of
   this memo is unlimited.

IESG Note:

   The IESG takes no position on the validity of any Intellectual
   Property Rights statements contained in this document.

Abstract

   This document describes PNG (Portable Network Graphics), an
   extensible file format for the lossless, portable, well-compressed
   storage of raster images.  PNG provides a patent-free replacement for
   GIF and can also replace many common uses of TIFF.  Indexed-color,
   grayscale, and truecolor images are supported, plus an optional alpha
   channel.  Sample depths range from 1 to 16 bits.

   PNG is designed to work well in online viewing applications, such as
   the World Wide Web, so it is fully streamable with a progressive
   display option.  PNG is robust, providing both full file integrity
   checking and simple detection of common transmission errors.  Also,
   PNG can store gamma and chromaticity data for improved color matching
   on heterogeneous platforms.

   This specification defines the Internet Media Type image/png.

Table of Contents

   1. Introduction ..................................................  4
   2. Data Representation ...........................................  5
      2.1. Integers and byte order ..................................  5
      2.2. Color values .............................................  6
      2.3. Image layout .............................................  6
      2.4. Alpha channel ............................................  7
      2.5. Filtering ................................................  8
      2.6. Interlaced data order ....................................  8
      2.7. Gamma correction ......................................... 10



Boutell, et. al.	     Informational			[Page 1]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      2.8. Text strings ............................................. 10
   3. File Structure ................................................ 11
      3.1. PNG file signature ....................................... 11
      3.2. Chunk layout ............................................. 11
      3.3. Chunk naming conventions ................................. 12
      3.4. CRC algorithm ............................................ 15
   4. Chunk Specifications .......................................... 15
      4.1. Critical chunks .......................................... 15
	  4.1.1. IHDR Image header .................................. 15
	  4.1.2. PLTE Palette ....................................... 17
	  4.1.3. IDAT Image data .................................... 18
	  4.1.4. IEND Image trailer ................................. 19
      4.2. Ancillary chunks ......................................... 19
	  4.2.1. bKGD Background color .............................. 19
	  4.2.2. cHRM Primary chromaticities and white point ........ 20
	  4.2.3. gAMA Image gamma ................................... 21
	  4.2.4. hIST Image histogram ............................... 21
	  4.2.5. pHYs Physical pixel dimensions ..................... 22
	  4.2.6. sBIT Significant bits .............................. 22
	  4.2.7. tEXt Textual data .................................. 24
	  4.2.8. tIME Image last-modification time .................. 25
	  4.2.9. tRNS Transparency .................................. 26
	  4.2.10. zTXt Compressed textual data ...................... 27
      4.3. Summary of standard chunks ............................... 28
      4.4. Additional chunk types ................................... 29
   5. Deflate/Inflate Compression ................................... 29
   6. Filter Algorithms ............................................. 31
      6.1. Filter types ............................................. 31
      6.2. Filter type 0: None ...................................... 32
      6.3. Filter type 1: Sub ....................................... 33
      6.4. Filter type 2: Up ........................................ 33
      6.5. Filter type 3: Average ................................... 34
      6.6. Filter type 4: Paeth...................................... 35
   7. Chunk Ordering Rules .......................................... 36
      7.1. Behavior of PNG editors .................................. 37
      7.2. Ordering of ancillary chunks ............................. 38
      7.3. Ordering of critical chunks .............................. 38
   8. Miscellaneous Topics .......................................... 39
      8.1. File name extension ...................................... 39
      8.2. Internet media type ...................................... 39
      8.3. Macintosh file layout .................................... 39
      8.4. Multiple-image extension ................................. 39
      8.5. Security considerations .................................. 40
   9. Recommendations for Encoders .................................. 41
      9.1. Sample depth scaling ..................................... 41
      9.2. Encoder gamma handling ................................... 42
      9.3. Encoder color handling ................................... 45
      9.4. Alpha channel creation ................................... 47



Boutell, et. al.	     Informational			[Page 2]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      9.5. Suggested palettes ....................................... 48
      9.6. Filter selection ......................................... 49
      9.7. Text chunk processing .................................... 49
      9.8. Use of private chunks .................................... 50
      9.9. Private type and method codes ............................ 51
   10. Recommendations for Decoders ................................. 51
      10.1. Error checking .......................................... 52
      10.2. Pixel dimensions ........................................ 52
      10.3. Truecolor image handling ................................ 52
      10.4. Sample depth rescaling .................................. 53
      10.5. Decoder gamma handling .................................. 54
      10.6. Decoder color handling .................................. 56
      10.7. Background color ........................................ 57
      10.8. Alpha channel processing ................................ 58
      10.9. Progressive display ..................................... 62
      10.10. Suggested-palette and histogram usage .................. 63
      10.11. Text chunk processing .................................. 64
   11. Glossary ..................................................... 65
   12. Appendix: Rationale .......................................... 69
      12.1. Why a new file format? .................................. 69
      12.2. Why these features? ..................................... 70
      12.3. Why not these features? ................................. 70
      12.4. Why not use format X? ................................... 72
      12.5. Byte order .............................................. 73
      12.6. Interlacing ............................................. 73
      12.7. Why gamma? .............................................. 73
      12.8. Non-premultiplied alpha ................................. 75
      12.9. Filtering ............................................... 75
      12.10. Text strings ........................................... 76
      12.11. PNG file signature ..................................... 77
      12.12. Chunk layout ........................................... 77
      12.13. Chunk naming conventions ............................... 78
      12.14. Palette histograms ..................................... 80
   13. Appendix: Gamma Tutorial ..................................... 81
   14. Appendix: Color Tutorial ..................................... 89
   15. Appendix: Sample CRC Code .................................... 94
   16. Appendix: Online Resources ................................... 96
   17. Appendix: Revision History ................................... 96
   18. References ................................................... 97
   19. Credits ......................................................100











Boutell, et. al.	     Informational			[Page 3]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


1. Introduction

   The PNG format provides a portable, legally unencumbered, well-
   compressed, well-specified standard for lossless bitmapped image
   files.

   Although the initial motivation for developing PNG was to replace
   GIF, the design provides some useful new features not available in
   GIF, with minimal cost to developers.

   GIF features retained in PNG include:

       * Indexed-color images of up to 256 colors.
       * Streamability: files can be read and written serially, thus
	 allowing the file format to be used as a communications
	 protocol for on-the-fly generation and display of images.
       * Progressive display: a suitably prepared image file can be
	 displayed as it is received over a communications link,
	 yielding a low-resolution image very quickly followed by
	 gradual improvement of detail.
       * Transparency: portions of the image can be marked as
	 transparent, creating the effect of a non-rectangular image.
       * Ancillary information: textual comments and other data can be
	 stored within the image file.
       * Complete hardware and platform independence.
       * Effective, 100% lossless compression.

   Important new features of PNG, not available in GIF, include:

       * Truecolor images of up to 48 bits per pixel.
       * Grayscale images of up to 16 bits per pixel.
       * Full alpha channel (general transparency masks).
       * Image gamma information, which supports automatic display of
	 images with correct brightness/contrast regardless of the
	 machines used to originate and display the image.
       * Reliable, straightforward detection of file corruption.
       * Faster initial presentation in progressive display mode.

   PNG is designed to be:

       * Simple and portable: developers should be able to implement PNG
	 easily.
       * Legally unencumbered: to the best knowledge of the PNG authors,
	 no algorithms under legal challenge are used.	(Some
	 considerable effort has been spent to verify this.)
       * Well compressed: both indexed-color and truecolor images are
	 compressed as effectively as in any other widely used lossless
	 format, and in most cases more effectively.



Boutell, et. al.	     Informational			[Page 4]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


       * Interchangeable: any standard-conforming PNG decoder must read
	 all conforming PNG files.
       * Flexible: the format allows for future extensions and private
	 add-ons, without compromising interchangeability of basic PNG.
       * Robust: the design supports full file integrity checking as
	 well as simple, quick detection of common transmission errors.

   The main part of this specification gives the definition of the file
   format and recommendations for encoder and decoder behavior.  An
   appendix gives the rationale for many design decisions.  Although the
   rationale is not part of the formal specification, reading it can
   help implementors understand the design.  Cross-references in the
   main text point to relevant parts of the rationale.	Additional
   appendixes, also not part of the formal specification, provide
   tutorials on gamma and color theory as well as other supporting
   material.

   In this specification, the word "must" indicates a mandatory
   requirement, while "should" indicates recommended behavior.

   See Rationale: Why a new file format? (Section 12.1), Why these
   features? (Section 12.2), Why not these features? (Section 12.3), Why
   not use format X? (Section 12.4).

   Pronunciation

      PNG is pronounced "ping".

2. Data Representation

   This chapter discusses basic data representations used in PNG files,
   as well as the expected representation of the image data.

   2.1. Integers and byte order

      All integers that require more than one byte must be in network
      byte order: the most significant byte comes first, then the less
      significant bytes in descending order of significance (MSB LSB for
      two-byte integers, B3 B2 B1 B0 for four-byte integers).  The
      highest bit (value 128) of a byte is numbered bit 7; the lowest
      bit (value 1) is numbered bit 0. Values are unsigned unless
      otherwise noted. Values explicitly noted as signed are represented
      in two's complement notation.

      See Rationale: Byte order (Section 12.5).






Boutell, et. al.	     Informational			[Page 5]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   2.2. Color values

      Colors can be represented by either grayscale or RGB (red, green,
      blue) sample data.  Grayscale data represents luminance; RGB data
      represents calibrated color information (if the cHRM chunk is
      present) or uncalibrated device-dependent color (if cHRM is
      absent).	All color values range from zero (representing black) to
      most intense at the maximum value for the sample depth.  Note that
      the maximum value at a given sample depth is (2^sampledepth)-1,
      not 2^sampledepth.

      Sample values are not necessarily linear; the gAMA chunk specifies
      the gamma characteristic of the source device, and viewers are
      strongly encouraged to compensate properly.  See Gamma correction
      (Section 2.7).

      Source data with a precision not directly supported in PNG (for
      example, 5 bit/sample truecolor) must be scaled up to the next
      higher supported bit depth.  This scaling is reversible with no
      loss of data, and it reduces the number of cases that decoders
      have to cope with.  See Recommendations for Encoders: Sample depth
      scaling (Section 9.1) and Recommendations for Decoders: Sample
      depth rescaling (Section 10.4).

   2.3. Image layout

      Conceptually, a PNG image is a rectangular pixel array, with
      pixels appearing left-to-right within each scanline, and scanlines
      appearing top-to-bottom.	(For progressive display purposes, the
      data may actually be transmitted in a different order; see
      Interlaced data order, Section 2.6.) The size of each pixel is
      determined by the bit depth, which is the number of bits per
      sample in the image data.

      Three types of pixel are supported:

	  * An indexed-color pixel is represented by a single sample
	    that is an index into a supplied palette.  The image bit
	    depth determines the maximum number of palette entries, but
	    not the color precision within the palette.
	  * A grayscale pixel is represented by a single sample that is
	    a grayscale level, where zero is black and the largest value
	    for the bit depth is white.
	  * A truecolor pixel is represented by three samples: red (zero
	    = black, max = red) appears first, then green (zero = black,
	    max = green), then blue (zero = black, max = blue).  The bit
	    depth specifies the size of each sample, not the total pixel
	    size.



Boutell, et. al.	     Informational			[Page 6]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Optionally, grayscale and truecolor pixels can also include an
      alpha sample, as described in the next section.

      Pixels are always packed into scanlines with no wasted bits
      between pixels.  Pixels smaller than a byte never cross byte
      boundaries; they are packed into bytes with the leftmost pixel in
      the high-order bits of a byte, the rightmost in the low-order
      bits.  Permitted bit depths and pixel types are restricted so that
      in all cases the packing is simple and efficient.

      PNG permits multi-sample pixels only with 8- and 16-bit samples,
      so multiple samples of a single pixel are never packed into one
      byte.  16-bit samples are stored in network byte order (MSB
      first).

      Scanlines always begin on byte boundaries.  When pixels have fewer
      than 8 bits and the scanline width is not evenly divisible by the
      number of pixels per byte, the low-order bits in the last byte of
      each scanline are wasted.  The contents of these wasted bits are
      unspecified.

      An additional "filter type" byte is added to the beginning of
      every scanline (see Filtering, Section 2.5).  The filter type byte
      is not considered part of the image data, but it is included in
      the datastream sent to the compression step.

   2.4. Alpha channel

      An alpha channel, representing transparency information on a per-
      pixel basis, can be included in grayscale and truecolor PNG
      images.

      An alpha value of zero represents full transparency, and a value
      of (2^bitdepth)-1 represents a fully opaque pixel.  Intermediate
      values indicate partially transparent pixels that can be combined
      with a background image to yield a composite image.  (Thus, alpha
      is really the degree of opacity of the pixel.  But most people
      refer to alpha as providing transparency information, not opacity
      information, and we continue that custom here.)

      Alpha channels can be included with images that have either 8 or
      16 bits per sample, but not with images that have fewer than 8
      bits per sample.	Alpha samples are represented with the same bit
      depth used for the image samples.  The alpha sample for each pixel
      is stored immediately following the grayscale or RGB samples of
      the pixel.





Boutell, et. al.	     Informational			[Page 7]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      The color values stored for a pixel are not affected by the alpha
      value assigned to the pixel.  This rule is sometimes called
      "unassociated" or "non-premultiplied" alpha.  (Another common
      technique is to store sample values premultiplied by the alpha
      fraction; in effect, such an image is already composited against a
      black background.  PNG does not use premultiplied alpha.)

      Transparency control is also possible without the storage cost of
      a full alpha channel.  In an indexed-color image, an alpha value
      can be defined for each palette entry.  In grayscale and truecolor
      images, a single pixel value can be identified as being
      "transparent".  These techniques are controlled by the tRNS
      ancillary chunk type.

      If no alpha channel nor tRNS chunk is present, all pixels in the
      image are to be treated as fully opaque.

      Viewers can support transparency control partially, or not at all.

      See Rationale: Non-premultiplied alpha (Section 12.8),
      Recommendations for Encoders: Alpha channel creation (Section
      9.4), and Recommendations for Decoders: Alpha channel processing
      (Section 10.8).

   2.5. Filtering

      PNG allows the image data to be filtered before it is compressed.
      Filtering can improve the compressibility of the data.  The filter
      step itself does not reduce the size of the data.  All PNG filters
      are strictly lossless.

      PNG defines several different filter algorithms, including "None"
      which indicates no filtering.  The filter algorithm is specified
      for each scanline by a filter type byte that precedes the filtered
      scanline in the precompression datastream.  An intelligent encoder
      can switch filters from one scanline to the next.  The method for
      choosing which filter to employ is up to the encoder.

      See Filter Algorithms (Chapter 6) and Rationale: Filtering
      (Section 12.9).

   2.6. Interlaced data order

      A PNG image can be stored in interlaced order to allow progressive
      display.	The purpose of this feature is to allow images to "fade
      in" when they are being displayed on-the-fly.  Interlacing
      slightly expands the file size on average, but it gives the user a
      meaningful display much more rapidly.  Note that decoders are



Boutell, et. al.	     Informational			[Page 8]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      required to be able to read interlaced images, whether or not they
      actually perform progressive display.

      With interlace method 0, pixels are stored sequentially from left
      to right, and scanlines sequentially from top to bottom (no
      interlacing).

      Interlace method 1, known as Adam7 after its author, Adam M.
      Costello, consists of seven distinct passes over the image.  Each
      pass transmits a subset of the pixels in the image.  The pass in
      which each pixel is transmitted is defined by replicating the
      following 8-by-8 pattern over the entire image, starting at the
      upper left corner:

	 1 6 4 6 2 6 4 6
	 7 7 7 7 7 7 7 7
	 5 6 5 6 5 6 5 6
	 7 7 7 7 7 7 7 7
	 3 6 4 6 3 6 4 6
	 7 7 7 7 7 7 7 7
	 5 6 5 6 5 6 5 6
	 7 7 7 7 7 7 7 7

      Within each pass, the selected pixels are transmitted left to
      right within a scanline, and selected scanlines sequentially from
      top to bottom.  For example, pass 2 contains pixels 4, 12, 20,
      etc. of scanlines 0, 8, 16, etc. (numbering from 0,0 at the upper
      left corner).  The last pass contains the entirety of scanlines 1,
      3, 5, etc.

      The data within each pass is laid out as though it were a complete
      image of the appropriate dimensions.  For example, if the complete
      image is 16 by 16 pixels, then pass 3 will contain two scanlines,
      each containing four pixels.  When pixels have fewer than 8 bits,
      each such scanline is padded as needed to fill an integral number
      of bytes (see Image layout, Section 2.3).  Filtering is done on
      this reduced image in the usual way, and a filter type byte is
      transmitted before each of its scanlines (see Filter Algorithms,
      Chapter 6).  Notice that the transmission order is defined so that
      all the scanlines transmitted in a pass will have the same number
      of pixels; this is necessary for proper application of some of the
      filters.

      Caution: If the image contains fewer than five columns or fewer
      than five rows, some passes will be entirely empty.  Encoders and
      decoders must handle this case correctly.  In particular, filter
      type bytes are only associated with nonempty scanlines; no filter
      type bytes are present in an empty pass.



Boutell, et. al.	     Informational			[Page 9]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      See Rationale: Interlacing (Section 12.6) and Recommendations for
      Decoders: Progressive display (Section 10.9).

   2.7. Gamma correction

      PNG images can specify, via the gAMA chunk, the gamma
      characteristic of the image with respect to the original scene.
      Display programs are strongly encouraged to use this information,
      plus information about the display device they are using and room
      lighting, to present the image to the viewer in a way that
      reproduces what the image's original author saw as closely as
      possible.  See Gamma Tutorial (Chapter 13) if you aren't already
      familiar with gamma issues.

      Gamma correction is not applied to the alpha channel, if any.
      Alpha samples always represent a linear fraction of full opacity.

      For high-precision applications, the exact chromaticity of the RGB
      data in a PNG image can be specified via the cHRM chunk, allowing
      more accurate color matching than gamma correction alone will
      provide.	See Color Tutorial (Chapter 14) if you aren't already
      familiar with color representation issues.

      See Rationale: Why gamma? (Section 12.7), Recommendations for
      Encoders: Encoder gamma handling (Section 9.2), and
      Recommendations for Decoders: Decoder gamma handling (Section
      10.5).

   2.8. Text strings

      A PNG file can store text associated with the image, such as an
      image description or copyright notice.  Keywords are used to
      indicate what each text string represents.

      ISO 8859-1 (Latin-1) is the character set recommended for use in
      text strings [ISO-8859].	This character set is a superset of 7-
      bit ASCII.

      Character codes not defined in Latin-1 should not be used, because
      they have no platform-independent meaning.  If a non-Latin-1 code
      does appear in a PNG text string, its interpretation will vary
      across platforms and decoders.  Some systems might not even be
      able to display all the characters in Latin-1, but most modern
      systems can.

      Provision is also made for the storage of compressed text.

      See Rationale: Text strings (Section 12.10).



Boutell, et. al.	     Informational		       [Page 10]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


3. File Structure

   A PNG file consists of a PNG signature followed by a series of
   chunks.  This chapter defines the signature and the basic properties
   of chunks.  Individual chunk types are discussed in the next chapter.

   3.1. PNG file signature

      The first eight bytes of a PNG file always contain the following
      (decimal) values:

	 137 80 78 71 13 10 26 10

      This signature indicates that the remainder of the file contains a
      single PNG image, consisting of a series of chunks beginning with
      an IHDR chunk and ending with an IEND chunk.

      See Rationale: PNG file signature (Section 12.11).

   3.2. Chunk layout

      Each chunk consists of four parts:

      Length
	 A 4-byte unsigned integer giving the number of bytes in the
	 chunk's data field. The length counts only the data field, not
	 itself, the chunk type code, or the CRC.  Zero is a valid
	 length.  Although encoders and decoders should treat the length
	 as unsigned, its value must not exceed (2^31)-1 bytes.

      Chunk Type
	 A 4-byte chunk type code.  For convenience in description and
	 in examining PNG files, type codes are restricted to consist of
	 uppercase and lowercase ASCII letters (A-Z and a-z, or 65-90
	 and 97-122 decimal).  However, encoders and decoders must treat
	 the codes as fixed binary values, not character strings.  For
	 example, it would not be correct to represent the type code
	 IDAT by the EBCDIC equivalents of those letters.  Additional
	 naming conventions for chunk types are discussed in the next
	 section.

      Chunk Data
	 The data bytes appropriate to the chunk type, if any.	This
	 field can be of zero length.







Boutell, et. al.	     Informational		       [Page 11]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      CRC
	 A 4-byte CRC (Cyclic Redundancy Check) calculated on the
	 preceding bytes in the chunk, including the chunk type code and
	 chunk data fields, but not including the length field. The CRC
	 is always present, even for chunks containing no data.  See CRC
	 algorithm (Section 3.4).

      The chunk data length can be any number of bytes up to the
      maximum; therefore, implementors cannot assume that chunks are
      aligned on any boundaries larger than bytes.

      Chunks can appear in any order, subject to the restrictions placed
      on each chunk type.  (One notable restriction is that IHDR must
      appear first and IEND must appear last; thus the IEND chunk serves
      as an end-of-file marker.)  Multiple chunks of the same type can
      appear, but only if specifically permitted for that type.

      See Rationale: Chunk layout (Section 12.12).

   3.3. Chunk naming conventions

      Chunk type codes are assigned so that a decoder can determine some
      properties of a chunk even when it does not recognize the type
      code.  These rules are intended to allow safe, flexible extension
      of the PNG format, by allowing a decoder to decide what to do when
      it encounters an unknown chunk.  The naming rules are not normally
      of interest when the decoder does recognize the chunk's type.

      Four bits of the type code, namely bit 5 (value 32) of each byte,
      are used to convey chunk properties.  This choice means that a
      human can read off the assigned properties according to whether
      each letter of the type code is uppercase (bit 5 is 0) or
      lowercase (bit 5 is 1).  However, decoders should test the
      properties of an unknown chunk by numerically testing the
      specified bits; testing whether a character is uppercase or
      lowercase is inefficient, and even incorrect if a locale-specific
      case definition is used.

      It is worth noting that the property bits are an inherent part of
      the chunk name, and hence are fixed for any chunk type.  Thus,
      TEXT and Text would be unrelated chunk type codes, not the same
      chunk with different properties.	Decoders must recognize type
      codes by a simple four-byte literal comparison; it is incorrect to
      perform case conversion on type codes.







Boutell, et. al.	     Informational		       [Page 12]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      The semantics of the property bits are:

      Ancillary bit: bit 5 of first byte
	 0 (uppercase) = critical, 1 (lowercase) = ancillary.

	 Chunks that are not strictly necessary in order to meaningfully
	 display the contents of the file are known as "ancillary"
	 chunks.  A decoder encountering an unknown chunk in which the
	 ancillary bit is 1 can safely ignore the chunk and proceed to
	 display the image. The time chunk (tIME) is an example of an
	 ancillary chunk.

	 Chunks that are necessary for successful display of the file's
	 contents are called "critical" chunks. A decoder encountering
	 an unknown chunk in which the ancillary bit is 0 must indicate
	 to the user that the image contains information it cannot
	 safely interpret.  The image header chunk (IHDR) is an example
	 of a critical chunk.

      Private bit: bit 5 of second byte
	 0 (uppercase) = public, 1 (lowercase) = private.

	 A public chunk is one that is part of the PNG specification or
	 is registered in the list of PNG special-purpose public chunk
	 types.  Applications can also define private (unregistered)
	 chunks for their own purposes.  The names of private chunks
	 must have a lowercase second letter, while public chunks will
	 always be assigned names with uppercase second letters.  Note
	 that decoders do not need to test the private-chunk property
	 bit, since it has no functional significance; it is simply an
	 administrative convenience to ensure that public and private
	 chunk names will not conflict.  See Additional chunk types
	 (Section 4.4) and Recommendations for Encoders: Use of private
	 chunks (Section 9.8).

      Reserved bit: bit 5 of third byte
	 Must be 0 (uppercase) in files conforming to this version of
	 PNG.

	 The significance of the case of the third letter of the chunk
	 name is reserved for possible future expansion.  At the present
	 time all chunk names must have uppercase third letters.
	 (Decoders should not complain about a lowercase third letter,
	 however, as some future version of the PNG specification could
	 define a meaning for this bit.  It is sufficient to treat a
	 chunk with a lowercase third letter in the same way as any
	 other unknown chunk type.)




Boutell, et. al.	     Informational		       [Page 13]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Safe-to-copy bit: bit 5 of fourth byte
	 0 (uppercase) = unsafe to copy, 1 (lowercase) = safe to copy.

	 This property bit is not of interest to pure decoders, but it
	 is needed by PNG editors (programs that modify PNG files).
	 This bit defines the proper handling of unrecognized chunks in
	 a file that is being modified.

	 If a chunk's safe-to-copy bit is 1, the chunk may be copied to
	 a modified PNG file whether or not the software recognizes the
	 chunk type, and regardless of the extent of the file
	 modifications.

	 If a chunk's safe-to-copy bit is 0, it indicates that the chunk
	 depends on the image data.  If the program has made any changes
	 to critical chunks, including addition, modification, deletion,
	 or reordering of critical chunks, then unrecognized unsafe
	 chunks must not be copied to the output PNG file.  (Of course,
	 if the program does recognize the chunk, it can choose to
	 output an appropriately modified version.)

	 A PNG editor is always allowed to copy all unrecognized chunks
	 if it has only added, deleted, modified, or reordered ancillary
	 chunks.  This implies that it is not permissible for ancillary
	 chunks to depend on other ancillary chunks.

	 PNG editors that do not recognize a critical chunk must report
	 an error and refuse to process that PNG file at all. The
	 safe/unsafe mechanism is intended for use with ancillary
	 chunks.  The safe-to-copy bit will always be 0 for critical
	 chunks.

	 Rules for PNG editors are discussed further in Chunk Ordering
	 Rules (Chapter 7).

      For example, the hypothetical chunk type name "bLOb" has the
      property bits:

	 bLOb  <-- 32 bit chunk type code represented in text form
	 ||||
	 |||+- Safe-to-copy bit is 1 (lower case letter; bit 5 is 1)
	 ||+-- Reserved bit is 0     (upper case letter; bit 5 is 0)
	 |+--- Private bit is 0      (upper case letter; bit 5 is 0)
	 +---- Ancillary bit is 1    (lower case letter; bit 5 is 1)

      Therefore, this name represents an ancillary, public, safe-to-copy
      chunk.




Boutell, et. al.	     Informational		       [Page 14]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      See Rationale: Chunk naming conventions (Section 12.13).

   3.4. CRC algorithm

      Chunk CRCs are calculated using standard CRC methods with pre and
      post conditioning, as defined by ISO 3309 [ISO-3309] or ITU-T V.42
      [ITU-V42].  The CRC polynomial employed is

	 x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1

      The 32-bit CRC register is initialized to all 1's, and then the
      data from each byte is processed from the least significant bit
      (1) to the most significant bit (128).  After all the data bytes
      are processed, the CRC register is inverted (its ones complement
      is taken).  This value is transmitted (stored in the file) MSB
      first.  For the purpose of separating into bytes and ordering, the
      least significant bit of the 32-bit CRC is defined to be the
      coefficient of the x^31 term.

      Practical calculation of the CRC always employs a precalculated
      table to greatly accelerate the computation. See Sample CRC Code
      (Chapter 15).

4. Chunk Specifications

   This chapter defines the standard types of PNG chunks.

   4.1. Critical chunks

      All implementations must understand and successfully render the
      standard critical chunks.  A valid PNG image must contain an IHDR
      chunk, one or more IDAT chunks, and an IEND chunk.

      4.1.1. IHDR Image header

	 The IHDR chunk must appear FIRST.  It contains:

	    Width:		4 bytes
	    Height:		4 bytes
	    Bit depth:		1 byte
	    Color type: 	1 byte
	    Compression method: 1 byte
	    Filter method:	1 byte
	    Interlace method:	1 byte







Boutell, et. al.	     Informational		       [Page 15]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	 Width and height give the image dimensions in pixels.	They are
	 4-byte integers. Zero is an invalid value. The maximum for each
	 is (2^31)-1 in order to accommodate languages that have
	 difficulty with unsigned 4-byte values.

	 Bit depth is a single-byte integer giving the number of bits
	 per sample or per palette index (not per pixel).  Valid values
	 are 1, 2, 4, 8, and 16, although not all values are allowed for
	 all color types.

	 Color type is a single-byte integer that describes the
	 interpretation of the image data.  Color type codes represent
	 sums of the following values: 1 (palette used), 2 (color used),
	 and 4 (alpha channel used). Valid values are 0, 2, 3, 4, and 6.

	 Bit depth restrictions for each color type are imposed to
	 simplify implementations and to prohibit combinations that do
	 not compress well.  Decoders must support all legal
	 combinations of bit depth and color type.  The allowed
	 combinations are:

	    Color    Allowed	Interpretation
	    Type    Bit Depths

	    0	    1,2,4,8,16	Each pixel is a grayscale sample.

	    2	    8,16	Each pixel is an R,G,B triple.

	    3	    1,2,4,8	Each pixel is a palette index;
				a PLTE chunk must appear.

	    4	    8,16	Each pixel is a grayscale sample,
				followed by an alpha sample.

	    6	    8,16	Each pixel is an R,G,B triple,
				followed by an alpha sample.

	 The sample depth is the same as the bit depth except in the
	 case of color type 3, in which the sample depth is always 8
	 bits.

	 Compression method is a single-byte integer that indicates the
	 method used to compress the image data.  At present, only
	 compression method 0 (deflate/inflate compression with a 32K
	 sliding window) is defined.  All standard PNG images must be
	 compressed with this scheme.  The compression method field is
	 provided for possible future expansion or proprietary variants.
	 Decoders must check this byte and report an error if it holds



Boutell, et. al.	     Informational		       [Page 16]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	 an unrecognized code.	See Deflate/Inflate Compression (Chapter
	 5) for details.

	 Filter method is a single-byte integer that indicates the
	 preprocessing method applied to the image data before
	 compression.  At present, only filter method 0 (adaptive
	 filtering with five basic filter types) is defined.  As with
	 the compression method field, decoders must check this byte and
	 report an error if it holds an unrecognized code.  See Filter
	 Algorithms (Chapter 6) for details.

	 Interlace method is a single-byte integer that indicates the
	 transmission order of the image data.	Two values are currently
	 defined: 0 (no interlace) or 1 (Adam7 interlace).  See
	 Interlaced data order (Section 2.6) for details.

      4.1.2. PLTE Palette

	 The PLTE chunk contains from 1 to 256 palette entries, each a
	 three-byte series of the form:

	    Red:   1 byte (0 = black, 255 = red)
	    Green: 1 byte (0 = black, 255 = green)
	    Blue:  1 byte (0 = black, 255 = blue)

	 The number of entries is determined from the chunk length.  A
	 chunk length not divisible by 3 is an error.

	 This chunk must appear for color type 3, and can appear for
	 color types 2 and 6; it must not appear for color types 0 and
	 4. If this chunk does appear, it must precede the first IDAT
	 chunk.  There must not be more than one PLTE chunk.

	 For color type 3 (indexed color), the PLTE chunk is required.
	 The first entry in PLTE is referenced by pixel value 0, the
	 second by pixel value 1, etc.	The number of palette entries
	 must not exceed the range that can be represented in the image
	 bit depth (for example, 2^4 = 16 for a bit depth of 4).  It is
	 permissible to have fewer entries than the bit depth would
	 allow.  In that case, any out-of-range pixel value found in the
	 image data is an error.

	 For color types 2 and 6 (truecolor and truecolor with alpha),
	 the PLTE chunk is optional.  If present, it provides a
	 suggested set of from 1 to 256 colors to which the truecolor
	 image can be quantized if the viewer cannot display truecolor
	 directly.  If PLTE is not present, such a viewer will need to
	 select colors on its own, but it is often preferable for this



Boutell, et. al.	     Informational		       [Page 17]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	 to be done once by the encoder.  (See Recommendations for
	 Encoders: Suggested palettes, Section 9.5.)

	 Note that the palette uses 8 bits (1 byte) per sample
	 regardless of the image bit depth specification.  In
	 particular, the palette is 8 bits deep even when it is a
	 suggested quantization of a 16-bit truecolor image.

	 There is no requirement that the palette entries all be used by
	 the image, nor that they all be different.

      4.1.3. IDAT Image data

	 The IDAT chunk contains the actual image data.  To create this
	 data:

	     * Begin with image scanlines represented as described in
	       Image layout (Section 2.3); the layout and total size of
	       this raw data are determined by the fields of IHDR.
	     * Filter the image data according to the filtering method
	       specified by the IHDR chunk.  (Note that with filter
	       method 0, the only one currently defined, this implies
	       prepending a filter type byte to each scanline.)
	     * Compress the filtered data using the compression method
	       specified by the IHDR chunk.

	 The IDAT chunk contains the output datastream of the
	 compression algorithm.

	 To read the image data, reverse this process.

	 There can be multiple IDAT chunks; if so, they must appear
	 consecutively with no other intervening chunks.  The compressed
	 datastream is then the concatenation of the contents of all the
	 IDAT chunks.  The encoder can divide the compressed datastream
	 into IDAT chunks however it wishes.  (Multiple IDAT chunks are
	 allowed so that encoders can work in a fixed amount of memory;
	 typically the chunk size will correspond to the encoder's
	 buffer size.) It is important to emphasize that IDAT chunk
	 boundaries have no semantic significance and can occur at any
	 point in the compressed datastream.  A PNG file in which each
	 IDAT chunk contains only one data byte is legal, though
	 remarkably wasteful of space.	(For that matter, zero-length
	 IDAT chunks are legal, though even more wasteful.)

	 See Filter Algorithms (Chapter 6) and Deflate/Inflate
	 Compression (Chapter 5) for details.




Boutell, et. al.	     Informational		       [Page 18]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      4.1.4. IEND Image trailer

	 The IEND chunk must appear LAST.  It marks the end of the PNG
	 datastream.  The chunk's data field is empty.

   4.2. Ancillary chunks

      All ancillary chunks are optional, in the sense that encoders need
      not write them and decoders can ignore them.  However, encoders
      are encouraged to write the standard ancillary chunks when the
      information is available, and decoders are encouraged to interpret
      these chunks when appropriate and feasible.

      The standard ancillary chunks are listed in alphabetical order.
      This is not necessarily the order in which they would appear in a
      file.

      4.2.1. bKGD Background color

	 The bKGD chunk specifies a default background color to present
	 the image against.  Note that viewers are not bound to honor
	 this chunk; a viewer can choose to use a different background.

	 For color type 3 (indexed color), the bKGD chunk contains:

	    Palette index:  1 byte

	 The value is the palette index of the color to be used as
	 background.

	 For color types 0 and 4 (grayscale, with or without alpha),
	 bKGD contains:

	    Gray:  2 bytes, range 0 .. (2^bitdepth)-1

	 (For consistency, 2 bytes are used regardless of the image bit
	 depth.)  The value is the gray level to be used as background.

	 For color types 2 and 6 (truecolor, with or without alpha),
	 bKGD contains:

	    Red:   2 bytes, range 0 .. (2^bitdepth)-1
	    Green: 2 bytes, range 0 .. (2^bitdepth)-1
	    Blue:  2 bytes, range 0 .. (2^bitdepth)-1

	 (For consistency, 2 bytes per sample are used regardless of the
	 image bit depth.)  This is the RGB color to be used as
	 background.



Boutell, et. al.	     Informational		       [Page 19]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	 When present, the bKGD chunk must precede the first IDAT chunk,
	 and must follow the PLTE chunk, if any.

	 See Recommendations for Decoders: Background color (Section
	 10.7).

      4.2.2. cHRM Primary chromaticities and white point

	 Applications that need device-independent specification of
	 colors in a PNG file can use the cHRM chunk to specify the 1931
	 CIE x,y chromaticities of the red, green, and blue primaries
	 used in the image, and the referenced white point. See Color
	 Tutorial (Chapter 14) for more information.

	 The cHRM chunk contains:

	    White Point x: 4 bytes
	    White Point y: 4 bytes
	    Red x:	   4 bytes
	    Red y:	   4 bytes
	    Green x:	   4 bytes
	    Green y:	   4 bytes
	    Blue x:	   4 bytes
	    Blue y:	   4 bytes

	 Each value is encoded as a 4-byte unsigned integer,
	 representing the x or y value times 100000.  For example, a
	 value of 0.3127 would be stored as the integer 31270.

	 cHRM is allowed in all PNG files, although it is of little
	 value for grayscale images.

	 If the encoder does not know the chromaticity values, it should
	 not write a cHRM chunk; the absence of a cHRM chunk indicates
	 that the image's primary colors are device-dependent.

	 If the cHRM chunk appears, it must precede the first IDAT
	 chunk, and it must also precede the PLTE chunk if present.

	 See Recommendations for Encoders: Encoder color handling
	 (Section 9.3), and Recommendations for Decoders: Decoder color
	 handling (Section 10.6).









Boutell, et. al.	     Informational		       [Page 20]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      4.2.3. gAMA Image gamma

	 The gAMA chunk specifies the gamma of the camera (or simulated
	 camera) that produced the image, and thus the gamma of the
	 image with respect to the original scene.  More precisely, the
	 gAMA chunk encodes the file_gamma value, as defined in Gamma
	 Tutorial (Chapter 13).

	 The gAMA chunk contains:

	    Image gamma: 4 bytes

	 The value is encoded as a 4-byte unsigned integer, representing
	 gamma times 100000.  For example, a gamma of 0.45 would be
	 stored as the integer 45000.

	 If the encoder does not know the image's gamma value, it should
	 not write a gAMA chunk; the absence of a gAMA chunk indicates
	 that the gamma is unknown.

	 If the gAMA chunk appears, it must precede the first IDAT
	 chunk, and it must also precede the PLTE chunk if present.

	 See Gamma correction (Section 2.7), Recommendations for
	 Encoders: Encoder gamma handling (Section 9.2), and
	 Recommendations for Decoders: Decoder gamma handling (Section
	 10.5).

      4.2.4. hIST Image histogram

	 The hIST chunk gives the approximate usage frequency of each
	 color in the color palette.  A histogram chunk can appear only
	 when a palette chunk appears.	If a viewer is unable to provide
	 all the colors listed in the palette, the histogram may help it
	 decide how to choose a subset of the colors for display.

	 The hIST chunk contains a series of 2-byte (16 bit) unsigned
	 integers.  There must be exactly one entry for each entry in
	 the PLTE chunk.  Each entry is proportional to the fraction of
	 pixels in the image that have that palette index; the exact
	 scale factor is chosen by the encoder.

	 Histogram entries are approximate, with the exception that a
	 zero entry specifies that the corresponding palette entry is
	 not used at all in the image.	It is required that a histogram
	 entry be nonzero if there are any pixels of that color.





Boutell, et. al.	     Informational		       [Page 21]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	 When the palette is a suggested quantization of a truecolor
	 image, the histogram is necessarily approximate, since a
	 decoder may map pixels to palette entries differently than the
	 encoder did.  In this situation, zero entries should not
	 appear.

	 The hIST chunk, if it appears, must follow the PLTE chunk, and
	 must precede the first IDAT chunk.

	 See Rationale: Palette histograms (Section 12.14), and
	 Recommendations for Decoders: Suggested-palette and histogram
	 usage (Section 10.10).

      4.2.5. pHYs Physical pixel dimensions

	 The pHYs chunk specifies the intended pixel size or aspect
	 ratio for display of the image.  It contains:

	    Pixels per unit, X axis: 4 bytes (unsigned integer)
	    Pixels per unit, Y axis: 4 bytes (unsigned integer)
	    Unit specifier:	     1 byte

	 The following values are legal for the unit specifier:

	    0: unit is unknown
	    1: unit is the meter

	 When the unit specifier is 0, the pHYs chunk defines pixel
	 aspect ratio only; the actual size of the pixels remains
	 unspecified.

	 Conversion note: one inch is equal to exactly 0.0254 meters.

	 If this ancillary chunk is not present, pixels are assumed to
	 be square, and the physical size of each pixel is unknown.

	 If present, this chunk must precede the first IDAT chunk.

	 See Recommendations for Decoders: Pixel dimensions (Section
	 10.2).

      4.2.6. sBIT Significant bits

	 To simplify decoders, PNG specifies that only certain sample
	 depths can be used, and further specifies that sample values
	 should be scaled to the full range of possible values at the
	 sample depth.	However, the sBIT chunk is provided in order to
	 store the original number of significant bits.  This allows



Boutell, et. al.	     Informational		       [Page 22]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	 decoders to recover the original data losslessly even if the
	 data had a sample depth not directly supported by PNG.  We
	 recommend that an encoder emit an sBIT chunk if it has
	 converted the data from a lower sample depth.

	 For color type 0 (grayscale), the sBIT chunk contains a single
	 byte, indicating the number of bits that were significant in
	 the source data.

	 For color type 2 (truecolor), the sBIT chunk contains three
	 bytes, indicating the number of bits that were significant in
	 the source data for the red, green, and blue channels,
	 respectively.

	 For color type 3 (indexed color), the sBIT chunk contains three
	 bytes, indicating the number of bits that were significant in
	 the source data for the red, green, and blue components of the
	 palette entries, respectively.

	 For color type 4 (grayscale with alpha channel), the sBIT chunk
	 contains two bytes, indicating the number of bits that were
	 significant in the source grayscale data and the source alpha
	 data, respectively.

	 For color type 6 (truecolor with alpha channel), the sBIT chunk
	 contains four bytes, indicating the number of bits that were
	 significant in the source data for the red, green, blue and
	 alpha channels, respectively.

	 Each depth specified in sBIT must be greater than zero and less
	 than or equal to the sample depth (which is 8 for indexed-color
	 images, and the bit depth given in IHDR for other color types).

	 A decoder need not pay attention to sBIT: the stored image is a
	 valid PNG file of the sample depth indicated by IHDR.	However,
	 if the decoder wishes to recover the original data at its
	 original precision, this can be done by right-shifting the
	 stored samples (the stored palette entries, for an indexed-
	 color image).	The encoder must scale the data in such a way
	 that the high-order bits match the original data.

	 If the sBIT chunk appears, it must precede the first IDAT
	 chunk, and it must also precede the PLTE chunk if present.

	 See Recommendations for Encoders: Sample depth scaling (Section
	 9.1) and Recommendations for Decoders: Sample depth rescaling
	 (Section 10.4).




Boutell, et. al.	     Informational		       [Page 23]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      4.2.7. tEXt Textual data

	 Textual information that the encoder wishes to record with the
	 image can be stored in tEXt chunks.  Each tEXt chunk contains a
	 keyword and a text string, in the format:

	    Keyword:	    1-79 bytes (character string)
	    Null separator: 1 byte
	    Text:	    n bytes (character string)

	 The keyword and text string are separated by a zero byte (null
	 character).  Neither the keyword nor the text string can
	 contain a null character.  Note that the text string is not
	 null-terminated (the length of the chunk is sufficient
	 information to locate the ending).  The keyword must be at
	 least one character and less than 80 characters long.	The text
	 string can be of any length from zero bytes up to the maximum
	 permissible chunk size less the length of the keyword and
	 separator.

	 Any number of tEXt chunks can appear, and more than one with
	 the same keyword is permissible.

	 The keyword indicates the type of information represented by
	 the text string.  The following keywords are predefined and
	 should be used where appropriate:

	    Title	     Short (one line) title or caption for image
	    Author	     Name of image's creator
	    Description      Description of image (possibly long)
	    Copyright	     Copyright notice
	    Creation Time    Time of original image creation
	    Software	     Software used to create the image
	    Disclaimer	     Legal disclaimer
	    Warning	     Warning of nature of content
	    Source	     Device used to create the image
	    Comment	     Miscellaneous comment; conversion from
			     GIF comment

	 For the Creation Time keyword, the date format defined in
	 section 5.2.14 of RFC 1123 is suggested, but not required
	 [RFC-1123].  Decoders should allow for free-format text
	 associated with this or any other keyword.

	 Other keywords may be invented for other purposes.  Keywords of
	 general interest can be registered with the maintainers of the
	 PNG specification.  However, it is also permitted to use
	 private unregistered keywords.  (Private keywords should be



Boutell, et. al.	     Informational		       [Page 24]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	 reasonably self-explanatory, in order to minimize the chance
	 that the same keyword will be used for incompatible purposes by
	 different people.)

	 Both keyword and text are interpreted according to the ISO
	 8859-1 (Latin-1) character set [ISO-8859].  The text string can
	 contain any Latin-1 character.  Newlines in the text string
	 should be represented by a single linefeed character (decimal
	 10); use of other control characters in the text is
	 discouraged.

	 Keywords must contain only printable Latin-1 characters and
	 spaces; that is, only character codes 32-126 and 161-255
	 decimal are allowed.  To reduce the chances for human
	 misreading of a keyword, leading and trailing spaces are
	 forbidden, as are consecutive spaces.	Note also that the non-
	 breaking space (code 160) is not permitted in keywords, since
	 it is visually indistinguishable from an ordinary space.

	 Keywords must be spelled exactly as registered, so that
	 decoders can use simple literal comparisons when looking for
	 particular keywords.  In particular, keywords are considered
	 case-sensitive.

	 See Recommendations for Encoders: Text chunk processing
	 (Section 9.7) and Recommendations for Decoders: Text chunk
	 processing (Section 10.11).

      4.2.8. tIME Image last-modification time

	 The tIME chunk gives the time of the last image modification
	 (not the time of initial image creation).  It contains:

	    Year:   2 bytes (complete; for example, 1995, not 95)
	    Month:  1 byte (1-12)
	    Day:    1 byte (1-31)
	    Hour:   1 byte (0-23)
	    Minute: 1 byte (0-59)
	    Second: 1 byte (0-60)    (yes, 60, for leap seconds; not 61,
				      a common error)

	 Universal Time (UTC, also called GMT) should be specified
	 rather than local time.








Boutell, et. al.	     Informational		       [Page 25]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	 The tIME chunk is intended for use as an automatically-applied
	 time stamp that is updated whenever the image data is changed.
	 It is recommended that tIME not be changed by PNG editors that
	 do not change the image data.	See also the Creation Time tEXt
	 keyword, which can be used for a user-supplied time.

      4.2.9. tRNS Transparency

	 The tRNS chunk specifies that the image uses simple
	 transparency: either alpha values associated with palette
	 entries (for indexed-color images) or a single transparent
	 color (for grayscale and truecolor images).  Although simple
	 transparency is not as elegant as the full alpha channel, it
	 requires less storage space and is sufficient for many common
	 cases.

	 For color type 3 (indexed color), the tRNS chunk contains a
	 series of one-byte alpha values, corresponding to entries in
	 the PLTE chunk:

	    Alpha for palette index 0:	1 byte
	    Alpha for palette index 1:	1 byte
	    ... etc ...

	 Each entry indicates that pixels of the corresponding palette
	 index must be treated as having the specified alpha value.
	 Alpha values have the same interpretation as in an 8-bit full
	 alpha channel: 0 is fully transparent, 255 is fully opaque,
	 regardless of image bit depth. The tRNS chunk must not contain
	 more alpha values than there are palette entries, but tRNS can
	 contain fewer values than there are palette entries.  In this
	 case, the alpha value for all remaining palette entries is
	 assumed to be 255.  In the common case in which only palette
	 index 0 need be made transparent, only a one-byte tRNS chunk is
	 needed.

	 For color type 0 (grayscale), the tRNS chunk contains a single
	 gray level value, stored in the format:

	    Gray:  2 bytes, range 0 .. (2^bitdepth)-1

	 (For consistency, 2 bytes are used regardless of the image bit
	 depth.) Pixels of the specified gray level are to be treated as
	 transparent (equivalent to alpha value 0); all other pixels are
	 to be treated as fully opaque (alpha value (2^bitdepth)-1).






Boutell, et. al.	     Informational		       [Page 26]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	 For color type 2 (truecolor), the tRNS chunk contains a single
	 RGB color value, stored in the format:

	    Red:   2 bytes, range 0 .. (2^bitdepth)-1
	    Green: 2 bytes, range 0 .. (2^bitdepth)-1
	    Blue:  2 bytes, range 0 .. (2^bitdepth)-1

	 (For consistency, 2 bytes per sample are used regardless of the
	 image bit depth.) Pixels of the specified color value are to be
	 treated as transparent (equivalent to alpha value 0); all other
	 pixels are to be treated as fully opaque (alpha value
	 (2^bitdepth)-1).

	 tRNS is prohibited for color types 4 and 6, since a full alpha
	 channel is already present in those cases.

	 Note: when dealing with 16-bit grayscale or truecolor data, it
	 is important to compare both bytes of the sample values to
	 determine whether a pixel is transparent.  Although decoders
	 may drop the low-order byte of the samples for display, this
	 must not occur until after the data has been tested for
	 transparency.	For example, if the grayscale level 0x0001 is
	 specified to be transparent, it would be incorrect to compare
	 only the high-order byte and decide that 0x0002 is also
	 transparent.

	 When present, the tRNS chunk must precede the first IDAT chunk,
	 and must follow the PLTE chunk, if any.

      4.2.10. zTXt Compressed textual data

	 The zTXt chunk contains textual data, just as tEXt does;
	 however, zTXt takes advantage of compression.	zTXt and tEXt
	 chunks are semantically equivalent, but zTXt is recommended for
	 storing large blocks of text.

	 A zTXt chunk contains:

	    Keyword:		1-79 bytes (character string)
	    Null separator:	1 byte
	    Compression method: 1 byte
	    Compressed text:	n bytes

	 The keyword and null separator are exactly the same as in the
	 tEXt chunk.  Note that the keyword is not compressed.	The
	 compression method byte identifies the compression method used
	 in this zTXt chunk.  The only value presently defined for it is
	 0 (deflate/inflate compression). The compression method byte is



Boutell, et. al.	     Informational		       [Page 27]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	 followed by a compressed datastream that makes up the remainder
	 of the chunk.	For compression method 0, this datastream
	 adheres to the zlib datastream format (see Deflate/Inflate
	 Compression, Chapter 5).  Decompression of this datastream
	 yields Latin-1 text that is identical to the text that would be
	 stored in an equivalent tEXt chunk.

	 Any number of zTXt and tEXt chunks can appear in the same file.
	 See the preceding definition of the tEXt chunk for the
	 predefined keywords and the recommended format of the text.

	 See Recommendations for Encoders: Text chunk processing
	 (Section 9.7), and Recommendations for Decoders: Text chunk
	 processing (Section 10.11).

   4.3. Summary of standard chunks

      This table summarizes some properties of the standard chunk types.

	 Critical chunks (must appear in this order, except PLTE
			  is optional):

		 Name  Multiple  Ordering constraints
			 OK?

		 IHDR	 No	 Must be first
		 PLTE	 No	 Before IDAT
		 IDAT	 Yes	 Multiple IDATs must be consecutive
		 IEND	 No	 Must be last

	 Ancillary chunks (need not appear in this order):

		 Name  Multiple  Ordering constraints
			 OK?

		 cHRM	 No	 Before PLTE and IDAT
		 gAMA	 No	 Before PLTE and IDAT
		 sBIT	 No	 Before PLTE and IDAT
		 bKGD	 No	 After PLTE; before IDAT
		 hIST	 No	 After PLTE; before IDAT
		 tRNS	 No	 After PLTE; before IDAT
		 pHYs	 No	 Before IDAT
		 tIME	 No	 None
		 tEXt	 Yes	 None
		 zTXt	 Yes	 None






Boutell, et. al.	     Informational		       [Page 28]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Standard keywords for tEXt and zTXt chunks:

	 Title		  Short (one line) title or caption for image
	 Author 	  Name of image's creator
	 Description	  Description of image (possibly long)
	 Copyright	  Copyright notice
	 Creation Time	  Time of original image creation
	 Software	  Software used to create the image
	 Disclaimer	  Legal disclaimer
	 Warning	  Warning of nature of content
	 Source 	  Device used to create the image
	 Comment	  Miscellaneous comment; conversion from
			  GIF comment

   4.4. Additional chunk types

      Additional public PNG chunk types are defined in the document "PNG
      Special-Purpose Public Chunks" [PNG-EXTENSIONS].	Chunks described
      there are expected to be less widely supported than those defined
      in this specification.  However, application authors are
      encouraged to use those chunk types whenever appropriate for their
      applications.  Additional chunk types can be proposed for
      inclusion in that list by contacting the PNG specification
      maintainers at png-info@uunet.uu.net or at png-group@w3.org.

      New public chunks will only be registered if they are of use to
      others and do not violate the design philosophy of PNG. Chunk
      registration is not automatic, although it is the intent of the
      authors that it be straightforward when a new chunk of potentially
      wide application is needed.  Note that the creation of new
      critical chunk types is discouraged unless absolutely necessary.

      Applications can also use private chunk types to carry data that
      is not of interest to other applications.  See Recommendations for
      Encoders: Use of private chunks (Section 9.8).

      Decoders must be prepared to encounter unrecognized public or
      private chunk type codes.  Unrecognized chunk types must be
      handled as described in Chunk naming conventions (Section 3.3).

5. Deflate/Inflate Compression

   PNG compression method 0 (the only compression method presently
   defined for PNG) specifies deflate/inflate compression with a 32K
   sliding window.  Deflate compression is an LZ77 derivative used in
   zip, gzip, pkzip and related programs.  Extensive research has been
   done supporting its patent-free status.  Portable C implementations
   are freely available.



Boutell, et. al.	     Informational		       [Page 29]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   Deflate-compressed datastreams within PNG are stored in the "zlib"
   format, which has the structure:

      Compression method/flags code: 1 byte
      Additional flags/check bits:   1 byte
      Compressed data blocks:	     n bytes
      Check value:		     4 bytes

   Further details on this format are given in the zlib specification
   [RFC-1950].

   For PNG compression method 0, the zlib compression method/flags code
   must specify method code 8 ("deflate" compression) and an LZ77 window
   size of not more than 32K.  Note that the zlib compression method
   number is not the same as the PNG compression method number.  The
   additional flags must not specify a preset dictionary.

   The compressed data within the zlib datastream is stored as a series
   of blocks, each of which can represent raw (uncompressed) data,
   LZ77-compressed data encoded with fixed Huffman codes, or LZ77-
   compressed data encoded with custom Huffman codes.  A marker bit in
   the final block identifies it as the last block, allowing the decoder
   to recognize the end of the compressed datastream.  Further details
   on the compression algorithm and the encoding are given in the
   deflate specification [RFC-1951].

   The check value stored at the end of the zlib datastream is
   calculated on the uncompressed data represented by the datastream.
   Note that the algorithm used is not the same as the CRC calculation
   used for PNG chunk check values.  The zlib check value is useful
   mainly as a cross-check that the deflate and inflate algorithms are
   implemented correctly.  Verifying the chunk CRCs provides adequate
   confidence that the PNG file has been transmitted undamaged.

   In a PNG file, the concatenation of the contents of all the IDAT
   chunks makes up a zlib datastream as specified above.  This
   datastream decompresses to filtered image data as described elsewhere
   in this document.

   It is important to emphasize that the boundaries between IDAT chunks
   are arbitrary and can fall anywhere in the zlib datastream.	There is
   not necessarily any correlation between IDAT chunk boundaries and
   deflate block boundaries or any other feature of the zlib data.  For
   example, it is entirely possible for the terminating zlib check value
   to be split across IDAT chunks.






Boutell, et. al.	     Informational		       [Page 30]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   In the same vein, there is no required correlation between the
   structure of the image data (i.e., scanline boundaries) and deflate
   block boundaries or IDAT chunk boundaries.  The complete image data
   is represented by a single zlib datastream that is stored in some
   number of IDAT chunks; a decoder that assumes any more than this is
   incorrect.  (Of course, some encoder implementations may emit files
   in which some of these structures are indeed related.  But decoders
   cannot rely on this.)

   PNG also uses zlib datastreams in zTXt chunks.  In a zTXt chunk, the
   remainder of the chunk following the compression method byte is a
   zlib datastream as specified above.	This datastream decompresses to
   the user-readable text described by the chunk's keyword.  Unlike the
   image data, such datastreams are not split across chunks; each zTXt
   chunk contains an independent zlib datastream.

   Additional documentation and portable C code for deflate and inflate
   are available from the Info-ZIP archives at
   <URL:ftp://ftp.uu.net/pub/archiving/zip/>.

6. Filter Algorithms

   This chapter describes the filter algorithms that can be applied
   before compression.	The purpose of these filters is to prepare the
   image data for optimum compression.

   6.1. Filter types

      PNG filter method 0 defines five basic filter types:

	 Type	 Name

	 0	 None
	 1	 Sub
	 2	 Up
	 3	 Average
	 4	 Paeth

      (Note that filter method 0 in IHDR specifies exactly this set of
      five filter types.  If the set of filter types is ever extended, a
      different filter method number will be assigned to the extended
      set, so that decoders need not decompress the data to discover
      that it contains unsupported filter types.)

      The encoder can choose which of these filter algorithms to apply
      on a scanline-by-scanline basis.	In the image data sent to the
      compression step, each scanline is preceded by a filter type byte
      that specifies the filter algorithm used for that scanline.



Boutell, et. al.	     Informational		       [Page 31]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Filtering algorithms are applied to bytes, not to pixels,
      regardless of the bit depth or color type of the image.  The
      filtering algorithms work on the byte sequence formed by a
      scanline that has been represented as described in Image layout
      (Section 2.3).  If the image includes an alpha channel, the alpha
      data is filtered in the same way as the image data.

      When the image is interlaced, each pass of the interlace pattern
      is treated as an independent image for filtering purposes.  The
      filters work on the byte sequences formed by the pixels actually
      transmitted during a pass, and the "previous scanline" is the one
      previously transmitted in the same pass, not the one adjacent in
      the complete image.  Note that the subimage transmitted in any one
      pass is always rectangular, but is of smaller width and/or height
      than the complete image.	Filtering is not applied when this
      subimage is empty.

      For all filters, the bytes "to the left of" the first pixel in a
      scanline must be treated as being zero.  For filters that refer to
      the prior scanline, the entire prior scanline must be treated as
      being zeroes for the first scanline of an image (or of a pass of
      an interlaced image).

      To reverse the effect of a filter, the decoder must use the
      decoded values of the prior pixel on the same line, the pixel
      immediately above the current pixel on the prior line, and the
      pixel just to the left of the pixel above.  This implies that at
      least one scanline's worth of image data will have to be stored by
      the decoder at all times.  Even though some filter types do not
      refer to the prior scanline, the decoder will always need to store
      each scanline as it is decoded, since the next scanline might use
      a filter that refers to it.

      PNG imposes no restriction on which filter types can be applied to
      an image.  However, the filters are not equally effective on all
      types of data.  See Recommendations for Encoders: Filter selection
      (Section 9.6).

      See also Rationale: Filtering (Section 12.9).

   6.2. Filter type 0: None

      With the None filter, the scanline is transmitted unmodified; it
      is only necessary to insert a filter type byte before the data.







Boutell, et. al.	     Informational		       [Page 32]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   6.3. Filter type 1: Sub

      The Sub filter transmits the difference between each byte and the
      value of the corresponding byte of the prior pixel.

      To compute the Sub filter, apply the following formula to each
      byte of the scanline:

	 Sub(x) = Raw(x) - Raw(x-bpp)

      where x ranges from zero to the number of bytes representing the
      scanline minus one, Raw(x) refers to the raw data byte at that
      byte position in the scanline, and bpp is defined as the number of
      bytes per complete pixel, rounding up to one. For example, for
      color type 2 with a bit depth of 16, bpp is equal to 6 (three
      samples, two bytes per sample); for color type 0 with a bit depth
      of 2, bpp is equal to 1 (rounding up); for color type 4 with a bit
      depth of 16, bpp is equal to 4 (two-byte grayscale sample, plus
      two-byte alpha sample).

      Note this computation is done for each byte, regardless of bit
      depth.  In a 16-bit image, each MSB is predicted from the
      preceding MSB and each LSB from the preceding LSB, because of the
      way that bpp is defined.

      Unsigned arithmetic modulo 256 is used, so that both the inputs
      and outputs fit into bytes.  The sequence of Sub values is
      transmitted as the filtered scanline.

      For all x < 0, assume Raw(x) = 0.

      To reverse the effect of the Sub filter after decompression,
      output the following value:

	 Sub(x) + Raw(x-bpp)

      (computed mod 256), where Raw refers to the bytes already decoded.

   6.4. Filter type 2: Up

      The Up filter is just like the Sub filter except that the pixel
      immediately above the current pixel, rather than just to its left,
      is used as the predictor.

      To compute the Up filter, apply the following formula to each byte
      of the scanline:

	 Up(x) = Raw(x) - Prior(x)



Boutell, et. al.	     Informational		       [Page 33]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      where x ranges from zero to the number of bytes representing the
      scanline minus one, Raw(x) refers to the raw data byte at that
      byte position in the scanline, and Prior(x) refers to the
      unfiltered bytes of the prior scanline.

      Note this is done for each byte, regardless of bit depth.
      Unsigned arithmetic modulo 256 is used, so that both the inputs
      and outputs fit into bytes.  The sequence of Up values is
      transmitted as the filtered scanline.

      On the first scanline of an image (or of a pass of an interlaced
      image), assume Prior(x) = 0 for all x.

      To reverse the effect of the Up filter after decompression, output
      the following value:

	 Up(x) + Prior(x)

      (computed mod 256), where Prior refers to the decoded bytes of the
      prior scanline.

   6.5. Filter type 3: Average

      The Average filter uses the average of the two neighboring pixels
      (left and above) to predict the value of a pixel.

      To compute the Average filter, apply the following formula to each
      byte of the scanline:

	 Average(x) = Raw(x) - floor((Raw(x-bpp)+Prior(x))/2)

      where x ranges from zero to the number of bytes representing the
      scanline minus one, Raw(x) refers to the raw data byte at that
      byte position in the scanline, Prior(x) refers to the unfiltered
      bytes of the prior scanline, and bpp is defined as for the Sub
      filter.

      Note this is done for each byte, regardless of bit depth.  The
      sequence of Average values is transmitted as the filtered
      scanline.

      The subtraction of the predicted value from the raw byte must be
      done modulo 256, so that both the inputs and outputs fit into
      bytes.  However, the sum Raw(x-bpp)+Prior(x) must be formed
      without overflow (using at least nine-bit arithmetic).  floor()
      indicates that the result of the division is rounded to the next
      lower integer if fractional; in other words, it is an integer
      division or right shift operation.



Boutell, et. al.	     Informational		       [Page 34]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      For all x < 0, assume Raw(x) = 0.  On the first scanline of an
      image (or of a pass of an interlaced image), assume Prior(x) = 0
      for all x.

      To reverse the effect of the Average filter after decompression,
      output the following value:

	 Average(x) + floor((Raw(x-bpp)+Prior(x))/2)

      where the result is computed mod 256, but the prediction is
      calculated in the same way as for encoding.  Raw refers to the
      bytes already decoded, and Prior refers to the decoded bytes of
      the prior scanline.

   6.6. Filter type 4: Paeth

      The Paeth filter computes a simple linear function of the three
      neighboring pixels (left, above, upper left), then chooses as
      predictor the neighboring pixel closest to the computed value.
      This technique is due to Alan W. Paeth [PAETH].

      To compute the Paeth filter, apply the following formula to each
      byte of the scanline:

	 Paeth(x) = Raw(x) - PaethPredictor(Raw(x-bpp), Prior(x),
					    Prior(x-bpp))

      where x ranges from zero to the number of bytes representing the
      scanline minus one, Raw(x) refers to the raw data byte at that
      byte position in the scanline, Prior(x) refers to the unfiltered
      bytes of the prior scanline, and bpp is defined as for the Sub
      filter.

      Note this is done for each byte, regardless of bit depth.
      Unsigned arithmetic modulo 256 is used, so that both the inputs
      and outputs fit into bytes.  The sequence of Paeth values is
      transmitted as the filtered scanline.














Boutell, et. al.	     Informational		       [Page 35]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      The PaethPredictor function is defined by the following
      pseudocode:

	 function PaethPredictor (a, b, c)
	 begin
	      ; a = left, b = above, c = upper left
	      p := a + b - c	    ; initial estimate
	      pa := abs(p - a)	    ; distances to a, b, c
	      pb := abs(p - b)
	      pc := abs(p - c)
	      ; return nearest of a,b,c,
	      ; breaking ties in order a,b,c.
	      if pa <= pb AND pa <= pc then return a
	      else if pb <= pc then return b
	      else return c
	 end

      The calculations within the PaethPredictor function must be
      performed exactly, without overflow.  Arithmetic modulo 256 is to
      be used only for the final step of subtracting the function result
      from the target byte value.

      Note that the order in which ties are broken is critical and must
      not be altered.  The tie break order is: pixel to the left, pixel
      above, pixel to the upper left.  (This order differs from that
      given in Paeth's article.)

      For all x < 0, assume Raw(x) = 0 and Prior(x) = 0.  On the first
      scanline of an image (or of a pass of an interlaced image), assume
      Prior(x) = 0 for all x.

      To reverse the effect of the Paeth filter after decompression,
      output the following value:

	 Paeth(x) + PaethPredictor(Raw(x-bpp), Prior(x), Prior(x-bpp))

      (computed mod 256), where Raw and Prior refer to bytes already
      decoded.	Exactly the same PaethPredictor function is used by both
      encoder and decoder.

7. Chunk Ordering Rules

   To allow new chunk types to be added to PNG, it is necessary to
   establish rules about the ordering requirements for all chunk types.
   Otherwise a PNG editing program cannot know what to do when it
   encounters an unknown chunk.





Boutell, et. al.	     Informational		       [Page 36]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   We define a "PNG editor" as a program that modifies a PNG file and
   wishes to preserve as much as possible of the ancillary information
   in the file.  Two examples of PNG editors are a program that adds or
   modifies text chunks, and a program that adds a suggested palette to
   a truecolor PNG file.  Ordinary image editors are not PNG editors in
   this sense, because they usually discard all unrecognized information
   while reading in an image.  (Note: we strongly encourage programs
   handling PNG files to preserve ancillary information whenever
   possible.)

   As an example of possible problems, consider a hypothetical new
   ancillary chunk type that is safe-to-copy and is required to appear
   after PLTE if PLTE is present.  If our program to add a suggested
   PLTE does not recognize this new chunk, it may insert PLTE in the
   wrong place, namely after the new chunk.  We could prevent such
   problems by requiring PNG editors to discard all unknown chunks, but
   that is a very unattractive solution.  Instead, PNG requires
   ancillary chunks not to have ordering restrictions like this.

   To prevent this type of problem while allowing for future extension,
   we put some constraints on both the behavior of PNG editors and the
   allowed ordering requirements for chunks.

   7.1. Behavior of PNG editors

      The rules for PNG editors are:

	  * When copying an unknown unsafe-to-copy ancillary chunk, a
	    PNG editor must not move the chunk relative to any critical
	    chunk.  It can relocate the chunk freely relative to other
	    ancillary chunks that occur between the same pair of
	    critical chunks.  (This is well defined since the editor
	    must not add, delete, modify, or reorder critical chunks if
	    it is preserving unknown unsafe-to-copy chunks.)
	  * When copying an unknown safe-to-copy ancillary chunk, a PNG
	    editor must not move the chunk from before IDAT to after
	    IDAT or vice versa.  (This is well defined because IDAT is
	    always present.)  Any other reordering is permitted.
	  * When copying a known ancillary chunk type, an editor need
	    only honor the specific chunk ordering rules that exist for
	    that chunk type.  However, it can always choose to apply the
	    above general rules instead.
	  * PNG editors must give up on encountering an unknown critical
	    chunk type, because there is no way to be certain that a
	    valid file will result from modifying a file containing such
	    a chunk.  (Note that simply discarding the chunk is not good
	    enough, because it might have unknown implications for the
	    interpretation of other chunks.)



Boutell, et. al.	     Informational		       [Page 37]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      These rules are expressed in terms of copying chunks from an input
      file to an output file, but they apply in the obvious way if a PNG
      file is modified in place.

      See also Chunk naming conventions (Section 3.3).

   7.2. Ordering of ancillary chunks

      The ordering rules for an ancillary chunk type cannot be any
      stricter than this:

	  * Unsafe-to-copy chunks can have ordering requirements
	    relative to critical chunks.
	  * Safe-to-copy chunks can have ordering requirements relative
	    to IDAT.

      The actual ordering rules for any particular ancillary chunk type
      may be weaker.  See for example the ordering rules for the
      standard ancillary chunk types (Summary of standard chunks,
      Section 4.3).

      Decoders must not assume more about the positioning of any
      ancillary chunk than is specified by the chunk ordering rules.  In
      particular, it is never valid to assume that a specific ancillary
      chunk type occurs with any particular positioning relative to
      other ancillary chunks.  (For example, it is unsafe to assume that
      your private ancillary chunk occurs immediately before IEND.  Even
      if your application always writes it there, a PNG editor might
      have inserted some other ancillary chunk after it.  But you can
      safely assume that your chunk will remain somewhere between IDAT
      and IEND.)

   7.3. Ordering of critical chunks

      Critical chunks can have arbitrary ordering requirements, because
      PNG editors are required to give up if they encounter unknown
      critical chunks.	For example, IHDR has the special ordering rule
      that it must always appear first.  A PNG editor, or indeed any
      PNG-writing program, must know and follow the ordering rules for
      any critical chunk type that it can emit.











Boutell, et. al.	     Informational		       [Page 38]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


8. Miscellaneous Topics

   8.1. File name extension

      On systems where file names customarily include an extension
      signifying file type, the extension ".png" is recommended for PNG
      files.  Lower case ".png" is preferred if file names are case-
      sensitive.

   8.2. Internet media type

      The Internet Assigned Numbers Authority (IANA) has registered
      "image/png" as the Internet Media Type for PNG [RFC-2045, RFC-
      2048].  For robustness, decoders may choose to also support the
      interim media type "image/x-png" which was in use before
      registration was complete.

   8.3. Macintosh file layout

      In the Apple Macintosh system, the following conventions are
      recommended:

	  * The four-byte file type code for PNG files is "PNGf".  (This
	    code has been registered with Apple for PNG files.) The
	    creator code will vary depending on the creating
	    application.
	  * The contents of the data fork must be a PNG file exactly as
	    described in the rest of this specification.
	  * The contents of the resource fork are unspecified.	It may
	    be empty or may contain application-dependent resources.
	  * When transferring a Macintosh PNG file to a non-Macintosh
	    system, only the data fork should be transferred.

   8.4. Multiple-image extension

      PNG itself is strictly a single-image format.  However, it may be
      necessary to store multiple images within one file; for example,
      this is needed to convert some GIF files.  In the future, a
      multiple-image format based on PNG may be defined.  Such a format
      will be considered a separate file format and will have a
      different signature.  PNG-supporting applications may or may not
      choose to support the multiple-image format.

      See Rationale: Why not these features? (Section 12.3).







Boutell, et. al.	     Informational		       [Page 39]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   8.5. Security considerations

      A PNG file or datastream is composed of a collection of explicitly
      typed "chunks".  Chunks whose contents are defined by the
      specification could actually contain anything, including malicious
      code.  But there is no known risk that such malicious code could
      be executed on the recipient's computer as a result of decoding
      the PNG image.

      The possible security risks associated with future chunk types
      cannot be specified at this time.  Security issues will be
      considered when evaluating chunks proposed for registration as
      public chunks.  There is no additional security risk associated
      with unknown or unimplemented chunk types, because such chunks
      will be ignored, or at most be copied into another PNG file.

      The tEXt and zTXt chunks contain data that is meant to be
      displayed as plain text.	It is possible that if the decoder
      displays such text without filtering out control characters,
      especially the ESC (escape) character, certain systems or
      terminals could behave in undesirable and insecure ways.	We
      recommend that decoders filter out control characters to avoid
      this risk; see Recommendations for Decoders: Text chunk processing
      (Section 10.11).

      Because every chunk's length is available at its beginning, and
      because every chunk has a CRC trailer, there is a very robust
      defense against corrupted data and against fraudulent chunks that
      attempt to overflow the decoder's buffers.  Also, the PNG
      signature bytes provide early detection of common file
      transmission errors.

      A decoder that fails to check CRCs could be subject to data
      corruption.  The only likely consequence of such corruption is
      incorrectly displayed pixels within the image.  Worse things might
      happen if the CRC of the IHDR chunk is not checked and the width
      or height fields are corrupted.  See Recommendations for Decoders:
      Error checking (Section 10.1).

      A poorly written decoder might be subject to buffer overflow,
      because chunks can be extremely large, up to (2^31)-1 bytes long.
      But properly written decoders will handle large chunks without
      difficulty.








Boutell, et. al.	     Informational		       [Page 40]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


9. Recommendations for Encoders

   This chapter gives some recommendations for encoder behavior.  The
   only absolute requirement on a PNG encoder is that it produce files
   that conform to the format specified in the preceding chapters.
   However, best results will usually be achieved by following these
   recommendations.

   9.1. Sample depth scaling

      When encoding input samples that have a sample depth that cannot
      be directly represented in PNG, the encoder must scale the samples
      up to a sample depth that is allowed by PNG.  The most accurate
      scaling method is the linear equation

	 output = ROUND(input * MAXOUTSAMPLE / MAXINSAMPLE)

      where the input samples range from 0 to MAXINSAMPLE and the
      outputs range from 0 to MAXOUTSAMPLE (which is (2^sampledepth)-1).

      A close approximation to the linear scaling method can be achieved
      by "left bit replication", which is shifting the valid bits to
      begin in the most significant bit and repeating the most
      significant bits into the open bits.  This method is often faster
      to compute than linear scaling.  As an example, assume that 5-bit
      samples are being scaled up to 8 bits.  If the source sample value
      is 27 (in the range from 0-31), then the original bits are:

	 4 3 2 1 0
	 ---------
	 1 1 0 1 1

      Left bit replication gives a value of 222:

	 7 6 5 4 3  2 1 0
	 ----------------
	 1 1 0 1 1  1 1 0
	 |=======|  |===|
	     |	    Leftmost Bits Repeated to Fill Open Bits
	     |
	 Original Bits

      which matches the value computed by the linear equation.	Left bit
      replication usually gives the same value as linear scaling, and is
      never off by more than one.






Boutell, et. al.	     Informational		       [Page 41]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      A distinctly less accurate approximation is obtained by simply
      left-shifting the input value and filling the low order bits with
      zeroes.  This scheme cannot reproduce white exactly, since it does
      not generate an all-ones maximum value; the net effect is to
      darken the image slightly.  This method is not recommended in
      general, but it does have the effect of improving compression,
      particularly when dealing with greater-than-eight-bit sample
      depths.  Since the relative error introduced by zero-fill scaling
      is small at high sample depths, some encoders may choose to use
      it.  Zero-fill must not be used for alpha channel data, however,
      since many decoders will special-case alpha values of all zeroes
      and all ones.  It is important to represent both those values
      exactly in the scaled data.

      When the encoder writes an sBIT chunk, it is required to do the
      scaling in such a way that the high-order bits of the stored
      samples match the original data.	That is, if the sBIT chunk
      specifies a sample depth of S, the high-order S bits of the stored
      data must agree with the original S-bit data values.  This allows
      decoders to recover the original data by shifting right.	The
      added low-order bits are not constrained.  Note that all the above
      scaling methods meet this restriction.

      When scaling up source data, it is recommended that the low-order
      bits be filled consistently for all samples; that is, the same
      source value should generate the same sample value at any pixel
      position.  This improves compression by reducing the number of
      distinct sample values.  However, this is not a requirement, and
      some encoders may choose not to follow it.  For example, an
      encoder might instead dither the low-order bits, improving
      displayed image quality at the price of increasing file size.

      In some applications the original source data may have a range
      that is not a power of 2.  The linear scaling equation still works
      for this case, although the shifting methods do not.  It is
      recommended that an sBIT chunk not be written for such images,
      since sBIT suggests that the original data range was exactly
      0..2^S-1.

   9.2. Encoder gamma handling

      See Gamma Tutorial (Chapter 13) if you aren't already familiar
      with gamma issues.

      Proper handling of gamma encoding and the gAMA chunk in an encoder
      depends on the prior history of the sample values and on whether
      these values have already been quantized to integers.




Boutell, et. al.	     Informational		       [Page 42]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      If the encoder has access to sample intensity values in floating-
      point or high-precision integer form (perhaps from a computer
      image renderer), then it is recommended that the encoder perform
      its own gamma encoding before quantizing the data to integer
      values for storage in the file.  Applying gamma encoding at this
      stage results in images with fewer banding artifacts at a given
      sample depth, or allows smaller samples while retaining the same
      visual quality.

      A linear intensity level, expressed as a floating-point value in
      the range 0 to 1, can be converted to a gamma-encoded sample value
      by

	 sample = ROUND((intensity ^ encoder_gamma) * MAXSAMPLE)

      The file_gamma value to be written in the PNG gAMA chunk is the
      same as encoder_gamma in this equation, since we are assuming the
      initial intensity value is linear (in effect, camera_gamma is
      1.0).

      If the image is being written to a file only, the encoder_gamma
      value can be selected somewhat arbitrarily.  Values of 0.45 or 0.5
      are generally good choices because they are common in video
      systems, and so most PNG decoders should do a good job displaying
      such images.

      Some image renderers may simultaneously write the image to a PNG
      file and display it on-screen.  The displayed pixels should be
      gamma corrected for the display system and viewing conditions in
      use, so that the user sees a proper representation of the intended
      scene.  An appropriate gamma correction value is

	 screen_gc = viewing_gamma / display_gamma

      If the renderer wants to write the same gamma-corrected sample
      values to the PNG file, avoiding a separate gamma-encoding step
      for file output, then this screen_gc value should be written in
      the gAMA chunk.  This will allow a PNG decoder to reproduce what
      the file's originator saw on screen during rendering (provided the
      decoder properly supports arbitrary values in a gAMA chunk).

      However, it is equally reasonable for a renderer to apply gamma
      correction for screen display using a gamma appropriate to the
      viewing conditions, and to separately gamma-encode the sample
      values for file storage using a standard value of gamma such as
      0.5.  In fact, this is preferable, since some PNG decoders may not
      accurately display images with unusual gAMA values.




Boutell, et. al.	     Informational		       [Page 43]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Computer graphics renderers often do not perform gamma encoding,
      instead making sample values directly proportional to scene light
      intensity.  If the PNG encoder receives sample values that have
      already been quantized into linear-light integer values, there is
      no point in doing gamma encoding on them; that would just result
      in further loss of information.  The encoder should just write the
      sample values to the PNG file.  This "linear" sample encoding is
      equivalent to gamma encoding with a gamma of 1.0, so graphics
      programs that produce linear samples should always emit a gAMA
      chunk specifying a gamma of 1.0.

      When the sample values come directly from a piece of hardware, the
      correct gAMA value is determined by the gamma characteristic of
      the hardware.  In the case of video digitizers ("frame grabbers"),
      gAMA should be 0.45 or 0.5 for NTSC (possibly less for PAL or
      SECAM) since video camera transfer functions are standardized.
      Image scanners are less predictable.  Their output samples may be
      linear (gamma 1.0) since CCD sensors themselves are linear, or the
      scanner hardware may have already applied gamma correction
      designed to compensate for dot gain in subsequent printing (gamma
      of about 0.57), or the scanner may have corrected the samples for
      display on a CRT (gamma of 0.4-0.5).  You will need to refer to
      the scanner's manual, or even scan a calibrated gray wedge, to
      determine what a particular scanner does.

      File format converters generally should not attempt to convert
      supplied images to a different gamma.  Store the data in the PNG
      file without conversion, and record the source gamma if it is
      known.  Gamma alteration at file conversion time causes re-
      quantization of the set of intensity levels that are represented,
      introducing further roundoff error with little benefit.  It's
      almost always better to just copy the sample values intact from
      the input to the output file.

      In some cases, the supplied image may be in an image format (e.g.,
      TIFF) that can describe the gamma characteristic of the image.  In
      such cases, a file format converter is strongly encouraged to
      write a PNG gAMA chunk that corresponds to the known gamma of the
      source image.  Note that some file formats specify the gamma of
      the display system, not the camera.  If the input file's gamma
      value is greater than 1.0, it is almost certainly a display system
      gamma, and you should use its reciprocal for the PNG gAMA.









Boutell, et. al.	     Informational		       [Page 44]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      If the encoder or file format converter does not know how an image
      was originally created, but does know that the image has been
      displayed satisfactorily on a display with gamma display_gamma
      under lighting conditions where a particular viewing_gamma is
      appropriate, then the image can be marked as having the
      file_gamma:

	 file_gamma = viewing_gamma / display_gamma

      This will allow viewers of the PNG file to see the same image that
      the person running the file format converter saw.  Although this
      may not be precisely the correct value of the image gamma, it's
      better to write a gAMA chunk with an approximately right value
      than to omit the chunk and force PNG decoders to guess at an
      appropriate gamma.

      On the other hand, if the image file is being converted as part of
      a "bulk" conversion, with no one looking at each image, then it is
      better to omit the gAMA chunk entirely.  If the image gamma has to
      be guessed at, leave it to the decoder to do the guessing.

      Gamma does not apply to alpha samples; alpha is always represented
      linearly.

      See also Recommendations for Decoders: Decoder gamma handling
      (Section 10.5).

   9.3. Encoder color handling

      See Color Tutorial (Chapter 14) if you aren't already familiar
      with color issues.

      If it is possible for the encoder to determine the chromaticities
      of the source display primaries, or to make a strong guess based
      on the origin of the image or the hardware running it, then the
      encoder is strongly encouraged to output the cHRM chunk.	If it
      does so, the gAMA chunk should also be written; decoders can do
      little with cHRM if gAMA is missing.













Boutell, et. al.	     Informational		       [Page 45]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Video created with recent video equipment probably uses the CCIR
      709 primaries and D65 white point [ITU-BT709], which are:

		  R	      G 	  B	    White
	 x	0.640	    0.300	0.150	    0.3127
	 y	0.330	    0.600	0.060	    0.3290

      An older but still very popular video standard is SMPTE-C [SMPTE-
      170M]:

		  R	      G 	  B	    White
	 x	0.630	    0.310	0.155	    0.3127
	 y	0.340	    0.595	0.070	    0.3290

      The original NTSC color primaries have not been used in decades.
      Although you may still find the NTSC numbers listed in standards
      documents, you won't find any images that actually use them.

      Scanners that produce PNG files as output should insert the filter
      chromaticities into a cHRM chunk and the camera_gamma into a gAMA
      chunk.

      In the case of hand-drawn or digitally edited images, you have to
      determine what monitor they were viewed on when being produced.
      Many image editing programs allow you to specify what type of
      monitor you are using.  This is often because they are working in
      some device-independent space internally.  Such programs have
      enough information to write valid cHRM and gAMA chunks, and should
      do so automatically.

      If the encoder is compiled as a portion of a computer image
      renderer that performs full-spectral rendering, the monitor values
      that were used to convert from the internal device-independent
      color space to RGB should be written into the cHRM chunk. Any
      colors that are outside the gamut of the chosen RGB device should
      be clipped or otherwise constrained to be within the gamut; PNG
      does not store out of gamut colors.

      If the computer image renderer performs calculations directly in
      device-dependent RGB space, a cHRM chunk should not be written
      unless the scene description and rendering parameters have been
      adjusted to look good on a particular monitor.  In that case, the
      data for that monitor (if known) should be used to construct a
      cHRM chunk.







Boutell, et. al.	     Informational		       [Page 46]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      There are often cases where an image's exact origins are unknown,
      particularly if it began life in some other format.  A few image
      formats store calibration information, which can be used to fill
      in the cHRM chunk.  For example, all PhotoCD images use the CCIR
      709 primaries and D65 whitepoint, so these values can be written
      into the cHRM chunk when converting a PhotoCD file.  PhotoCD also
      uses the SMPTE-170M transfer function, which is closely
      approximated by a gAMA of 0.5.  (PhotoCD can store colors outside
      the RGB gamut, so the image data will require gamut mapping before
      writing to PNG format.)  TIFF 6.0 files can optionally store
      calibration information, which if present should be used to
      construct the cHRM chunk.  GIF and most other formats do not store
      any calibration information.

      It is not recommended that file format converters attempt to
      convert supplied images to a different RGB color space.  Store the
      data in the PNG file without conversion, and record the source
      primary chromaticities if they are known.  Color space
      transformation at file conversion time is a bad idea because of
      gamut mismatches and rounding errors.  As with gamma conversions,
      it's better to store the data losslessly and incur at most one
      conversion when the image is finally displayed.

      See also Recommendations for Decoders: Decoder color handling
      (Section 10.6).

   9.4. Alpha channel creation

      The alpha channel can be regarded either as a mask that
      temporarily hides transparent parts of the image, or as a means
      for constructing a non-rectangular image.  In the first case, the
      color values of fully transparent pixels should be preserved for
      future use.  In the second case, the transparent pixels carry no
      useful data and are simply there to fill out the rectangular image
      area required by PNG.  In this case, fully transparent pixels
      should all be assigned the same color value for best compression.

      Image authors should keep in mind the possibility that a decoder
      will ignore transparency control.  Hence, the colors assigned to
      transparent pixels should be reasonable background colors whenever
      feasible.

      For applications that do not require a full alpha channel, or
      cannot afford the price in compression efficiency, the tRNS
      transparency chunk is also available.






Boutell, et. al.	     Informational		       [Page 47]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      If the image has a known background color, this color should be
      written in the bKGD chunk.  Even decoders that ignore transparency
      may use the bKGD color to fill unused screen area.

      If the original image has premultiplied (also called "associated")
      alpha data, convert it to PNG's non-premultiplied format by
      dividing each sample value by the corresponding alpha value, then
      multiplying by the maximum value for the image bit depth, and
      rounding to the nearest integer.	In valid premultiplied data, the
      sample values never exceed their corresponding alpha values, so
      the result of the division should always be in the range 0 to 1.
      If the alpha value is zero, output black (zeroes).

   9.5. Suggested palettes

      A PLTE chunk can appear in truecolor PNG files.  In such files,
      the chunk is not an essential part of the image data, but simply
      represents a suggested palette that viewers may use to present the
      image on indexed-color display hardware.	A suggested palette is
      of no interest to viewers running on truecolor hardware.

      If an encoder chooses to provide a suggested palette, it is
      recommended that a hIST chunk also be written to indicate the
      relative importance of the palette entries.  The histogram values
      are most easily computed as "nearest neighbor" counts, that is,
      the approximate usage of each palette entry if no dithering is
      applied.	(These counts will often be available for free as a
      consequence of developing the suggested palette.)

      For images of color type 2 (truecolor without alpha channel), it
      is recommended that the palette and histogram be computed with
      reference to the RGB data only, ignoring any transparent-color
      specification.  If the file uses transparency (has a tRNS chunk),
      viewers can easily adapt the resulting palette for use with their
      intended background color.  They need only replace the palette
      entry closest to the tRNS color with their background color (which
      may or may not match the file's bKGD color, if any).

      For images of color type 6 (truecolor with alpha channel), it is
      recommended that a bKGD chunk appear and that the palette and
      histogram be computed with reference to the image as it would
      appear after compositing against the specified background color.
      This definition is necessary to ensure that useful palette entries
      are generated for pixels having fractional alpha values.	The
      resulting palette will probably only be useful to viewers that
      present the image against the same background color.  It is
      recommended that PNG editors delete or recompute the palette if
      they alter or remove the bKGD chunk in an image of color type 6.



Boutell, et. al.	     Informational		       [Page 48]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      If PLTE appears without bKGD in an image of color type 6, the
      circumstances under which the palette was computed are
      unspecified.

   9.6. Filter selection

      For images of color type 3 (indexed color), filter type 0 (None)
      is usually the most effective.  Note that color images with 256 or
      fewer colors should almost always be stored in indexed color
      format; truecolor format is likely to be much larger.

      Filter type 0 is also recommended for images of bit depths less
      than 8.  For low-bit-depth grayscale images, it may be a net win
      to expand the image to 8-bit representation and apply filtering,
      but this is rare.

      For truecolor and grayscale images, any of the five filters may
      prove the most effective.  If an encoder uses a fixed filter, the
      Paeth filter is most likely to be the best.

      For best compression of truecolor and grayscale images, we
      recommend an adaptive filtering approach in which a filter is
      chosen for each scanline.  The following simple heuristic has
      performed well in early tests: compute the output scanline using
      all five filters, and select the filter that gives the smallest
      sum of absolute values of outputs.  (Consider the output bytes as
      signed differences for this test.)  This method usually
      outperforms any single fixed filter choice.  However, it is likely
      that much better heuristics will be found as more experience is
      gained with PNG.

      Filtering according to these recommendations is effective on
      interlaced as well as noninterlaced images.

   9.7. Text chunk processing

      A nonempty keyword must be provided for each text chunk.	The
      generic keyword "Comment" can be used if no better description of
      the text is available.  If a user-supplied keyword is used, be
      sure to check that it meets the restrictions on keywords.

      PNG text strings are expected to use the Latin-1 character set.
      Encoders should avoid storing characters that are not defined in
      Latin-1, and should provide character code remapping if the local
      system's character set is not Latin-1.

      Encoders should discourage the creation of single lines of text
      longer than 79 characters, in order to facilitate easy reading.



Boutell, et. al.	     Informational		       [Page 49]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      It is recommended that text items less than 1K (1024 bytes) in
      size should be output using uncompressed tEXt chunks. In
      particular, it is recommended that the basic title and author
      keywords should always be output using uncompressed tEXt chunks.
      Lengthy disclaimers, on the other hand, are ideal candidates for
      zTXt.

      Placing large tEXt and zTXt chunks after the image data (after
      IDAT) can speed up image display in some situations, since the
      decoder won't have to read over the text to get to the image data.
      But it is recommended that small text chunks, such as the image
      title, appear before IDAT.

   9.8. Use of private chunks

      Applications can use PNG private chunks to carry information that
      need not be understood by other applications.  Such chunks must be
      given names with lowercase second letters, to ensure that they can
      never conflict with any future public chunk definition.  Note,
      however, that there is no guarantee that some other application
      will not use the same private chunk name.  If you use a private
      chunk type, it is prudent to store additional identifying
      information at the beginning of the chunk data.

      Use an ancillary chunk type (lowercase first letter), not a
      critical chunk type, for all private chunks that store information
      that is not absolutely essential to view the image.  Creation of
      private critical chunks is discouraged because they render PNG
      files unportable.  Such chunks should not be used in publicly
      available software or files.  If private critical chunks are
      essential for your application, it is recommended that one appear
      near the start of the file, so that a standard decoder need not
      read very far before discovering that it cannot handle the file.

      If you want others outside your organization to understand a chunk
      type that you invent, contact the maintainers of the PNG
      specification to submit a proposed chunk name and definition for
      addition to the list of special-purpose public chunks (see
      Additional chunk types, Section 4.4).  Note that a proposed public
      chunk name (with uppercase second letter) must not be used in
      publicly available software or files until registration has been
      approved.

      If an ancillary chunk contains textual information that might be
      of interest to a human user, you should not create a special chunk
      type for it.  Instead use a tEXt chunk and define a suitable
      keyword.	That way, the information will be available to users not
      using your software.



Boutell, et. al.	     Informational		       [Page 50]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Keywords in tEXt chunks should be reasonably self-explanatory,
      since the idea is to let other users figure out what the chunk
      contains.  If of general usefulness, new keywords can be
      registered with the maintainers of the PNG specification.  But it
      is permissible to use keywords without registering them first.

   9.9. Private type and method codes

      This specification defines the meaning of only some of the
      possible values of some fields.  For example, only compression
      method 0 and filter types 0 through 4 are defined.  Numbers
      greater than 127 must be used when inventing experimental or
      private definitions of values for any of these fields.  Numbers
      below 128 are reserved for possible future public extensions of
      this specification.  Note that use of private type codes may
      render a file unreadable by standard decoders.  Such codes are
      strongly discouraged except for experimental purposes, and should
      not appear in publicly available software or files.

10. Recommendations for Decoders

   This chapter gives some recommendations for decoder behavior.  The
   only absolute requirement on a PNG decoder is that it successfully
   read any file conforming to the format specified in the preceding
   chapters.  However, best results will usually be achieved by
   following these recommendations.

   10.1. Error checking

      To ensure early detection of common file-transfer problems,
      decoders should verify that all eight bytes of the PNG file
      signature are correct.  (See Rationale: PNG file signature,
      Section 12.11.) A decoder can have additional confidence in the
      file's integrity if the next eight bytes are an IHDR chunk header
      with the correct chunk length.

      Unknown chunk types must be handled as described in Chunk naming
      conventions (Section 3.3).  An unknown chunk type is not to be
      treated as an error unless it is a critical chunk.

      It is strongly recommended that decoders should verify the CRC on
      each chunk.

      In some situations it is desirable to check chunk headers (length
      and type code) before reading the chunk data and CRC.  The chunk
      type can be checked for plausibility by seeing whether all four
      bytes are ASCII letters (codes 65-90 and 97-122); note that this
      need only be done for unrecognized type codes.  If the total file



Boutell, et. al.	     Informational		       [Page 51]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      size is known (from file system information, HTTP protocol, etc),
      the chunk length can be checked for plausibility as well.

      If CRCs are not checked, dropped/added data bytes or an erroneous
      chunk length can cause the decoder to get out of step and
      misinterpret subsequent data as a chunk header.  Verifying that
      the chunk type contains letters is an inexpensive way of providing
      early error detection in this situation.

      For known-length chunks such as IHDR, decoders should treat an
      unexpected chunk length as an error.  Future extensions to this
      specification will not add new fields to existing chunks; instead,
      new chunk types will be added to carry new information.

      Unexpected values in fields of known chunks (for example, an
      unexpected compression method in the IHDR chunk) must be checked
      for and treated as errors.  However, it is recommended that
      unexpected field values be treated as fatal errors only in
      critical chunks.	An unexpected value in an ancillary chunk can be
      handled by ignoring the whole chunk as though it were an unknown
      chunk type.  (This recommendation assumes that the chunk's CRC has
      been verified.  In decoders that do not check CRCs, it is safer to
      treat any unexpected value as indicating a corrupted file.)

   10.2. Pixel dimensions

      Non-square pixels can be represented (see the pHYs chunk), but
      viewers are not required to account for them; a viewer can present
      any PNG file as though its pixels are square.

      Conversely, viewers running on display hardware with non-square
      pixels are strongly encouraged to rescale images for proper
      display.

   10.3. Truecolor image handling

      To achieve PNG's goal of universal interchangeability, decoders
      are required to accept all types of PNG image: indexed-color,
      truecolor, and grayscale.  Viewers running on indexed-color
      display hardware need to be able to reduce truecolor images to
      indexed format for viewing.  This process is usually called "color
      quantization".









Boutell, et. al.	     Informational		       [Page 52]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      A simple, fast way of doing this is to reduce the image to a fixed
      palette.	Palettes with uniform color spacing ("color cubes") are
      usually used to minimize the per-pixel computation.  For
      photograph-like images, dithering is recommended to avoid ugly
      contours in what should be smooth gradients; however, dithering
      introduces graininess that can be objectionable.

      The quality of rendering can be improved substantially by using a
      palette chosen specifically for the image, since a color cube
      usually has numerous entries that are unused in any particular
      image.  This approach requires more work, first in choosing the
      palette, and second in mapping individual pixels to the closest
      available color.	PNG allows the encoder to supply a suggested
      palette in a PLTE chunk, but not all encoders will do so, and the
      suggested palette may be unsuitable in any case (it may have too
      many or too few colors).	High-quality viewers will therefore need
      to have a palette selection routine at hand.  A large lookup table
      is usually the most feasible way of mapping individual pixels to
      palette entries with adequate speed.

      Numerous implementations of color quantization are available.  The
      PNG reference implementation, libpng, includes code for the
      purpose.

   10.4. Sample depth rescaling

      Decoders may wish to scale PNG data to a lesser sample depth (data
      precision) for display.  For example, 16-bit data will need to be
      reduced to 8-bit depth for use on most present-day display
      hardware.  Reduction of 8-bit data to 5-bit depth is also common.

      The most accurate scaling is achieved by the linear equation

	 output = ROUND(input * MAXOUTSAMPLE / MAXINSAMPLE)

      where

	 MAXINSAMPLE = (2^sampledepth)-1
	 MAXOUTSAMPLE = (2^desired_sampledepth)-1

      A slightly less accurate conversion is achieved by simply shifting
      right by sampledepth-desired_sampledepth places.	For example, to
      reduce 16-bit samples to 8-bit, one need only discard the low-
      order byte.  In many situations the shift method is sufficiently
      accurate for display purposes, and it is certainly much faster.
      (But if gamma correction is being done, sample rescaling can be
      merged into the gamma correction lookup table, as is illustrated
      in Decoder gamma handling, Section 10.5.)



Boutell, et. al.	     Informational		       [Page 53]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      When an sBIT chunk is present, the original pre-PNG data can be
      recovered by shifting right to the sample depth specified by sBIT.
      Note that linear scaling will not necessarily reproduce the
      original data, because the encoder is not required to have used
      linear scaling to scale the data up.  However, the encoder is
      required to have used a method that preserves the high-order bits,
      so shifting always works.  This is the only case in which shifting
      might be said to be more accurate than linear scaling.

      When comparing pixel values to tRNS chunk values to detect
      transparent pixels, it is necessary to do the comparison exactly.
      Therefore, transparent pixel detection must be done before
      reducing sample precision.

   10.5. Decoder gamma handling

      See Gamma Tutorial (Chapter 13) if you aren't already familiar
      with gamma issues.

      To produce correct tone reproduction, a good image display program
      should take into account the gammas of the image file and the
      display device, as well as the viewing_gamma appropriate to the
      lighting conditions near the display.  This can be done by
      calculating

	 gbright = insample / MAXINSAMPLE
	 bright = gbright ^ (1.0 / file_gamma)
	 vbright = bright ^ viewing_gamma
	 gcvideo = vbright ^ (1.0 / display_gamma)
	 fbval = ROUND(gcvideo * MAXFBVAL)

      where MAXINSAMPLE is the maximum sample value in the file (255 for
      8-bit, 65535 for 16-bit, etc), MAXFBVAL is the maximum value of a
      frame buffer sample (255 for 8-bit, 31 for 5-bit, etc), insample
      is the value of the sample in the PNG file, and fbval is the value
      to write into the frame buffer. The first line converts from
      integer samples into a normalized 0 to 1 floating point value, the
      second undoes the gamma encoding of the image file to produce a
      linear intensity value, the third adjusts for the viewing
      conditions, the fourth corrects for the display system's gamma
      value, and the fifth converts to an integer frame buffer sample.
      In practice, the second through fourth lines can be merged into

	 gcvideo = gbright^(viewing_gamma / (file_gamma*display_gamma))

      so as to perform only one power calculation. For color images, the
      entire calculation is performed separately for R, G, and B values.




Boutell, et. al.	     Informational		       [Page 54]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      It is not necessary to perform transcendental math for every
      pixel.  Instead, compute a lookup table that gives the correct
      output value for every possible sample value. This requires only
      256 calculations per image (for 8-bit accuracy), not one or three
      calculations per pixel.  For an indexed-color image, a one-time
      correction of the palette is sufficient, unless the image uses
      transparency and is being displayed against a nonuniform
      background.

      In some cases even the cost of computing a gamma lookup table may
      be a concern.  In these cases, viewers are encouraged to have
      precomputed gamma correction tables for file_gamma values of 1.0
      and 0.5 with some reasonable choice of viewing_gamma and
      display_gamma, and to use the table closest to the gamma indicated
      in the file. This will produce acceptable results for the majority
      of real files.

      When the incoming image has unknown gamma (no gAMA chunk), choose
      a likely default file_gamma value, but allow the user to select a
      new one if the result proves too dark or too light.

      In practice, it is often difficult to determine what value of
      display_gamma should be used. In systems with no built-in gamma
      correction, the display_gamma is determined entirely by the CRT.
      Assuming a CRT_gamma of 2.5 is recommended, unless you have
      detailed calibration measurements of this particular CRT
      available.

      However, many modern frame buffers have lookup tables that are
      used to perform gamma correction, and on these systems the
      display_gamma value should be the gamma of the lookup table and
      CRT combined. You may not be able to find out what the lookup
      table contains from within an image viewer application, so you may
      have to ask the user what the system's gamma value is.
      Unfortunately, different manufacturers use different ways of
      specifying what should go into the lookup table, so interpretation
      of the system gamma value is system-dependent.  Gamma Tutorial
      (Chapter 13) gives some examples.

      The response of real displays is actually more complex than can be
      described by a single number (display_gamma). If actual
      measurements of the monitor's light output as a function of
      voltage input are available, the fourth and fifth lines of the
      computation above can be replaced by a lookup in these
      measurements, to find the actual frame buffer value that most
      nearly gives the desired brightness.





Boutell, et. al.	     Informational		       [Page 55]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      The value of viewing_gamma depends on lighting conditions; see
      Gamma Tutorial (Chapter 13) for more detail.  Ideally, a viewer
      would allow the user to specify viewing_gamma, either directly
      numerically, or via selecting from "bright surround", "dim
      surround", and "dark surround" conditions.  Viewers that don't
      want to do this should just assume a value for viewing_gamma of
      1.0, since most computer displays live in brightly-lit rooms.

      When viewing images that are digitized from video, or that are
      destined to become video frames, the user might want to set the
      viewing_gamma to about 1.25 regardless of the actual level of room
      lighting.  This value of viewing_gamma is "built into" NTSC video
      practice, and displaying an image with that viewing_gamma allows
      the user to see what a TV set would show under the current room
      lighting conditions.  (This is not the same thing as trying to
      obtain the most accurate rendition of the content of the scene,
      which would require adjusting viewing_gamma to correspond to the
      room lighting level.)  This is another reason viewers might want
      to allow users to adjust viewing_gamma directly.

   10.6. Decoder color handling

      See Color Tutorial (Chapter 14) if you aren't already familiar
      with color issues.

      In many cases, decoders will treat image data in PNG files as
      device-dependent RGB data and display it without modification
      (except for appropriate gamma correction). This provides the
      fastest display of PNG images.  But unless the viewer uses exactly
      the same display hardware as the original image author used, the
      colors will not be exactly the same as the original author saw,
      particularly for darker or near-neutral colors.  The cHRM chunk
      provides information that allows closer color matching than that
      provided by gamma correction alone.

      Decoders can use the cHRM data to transform the image data from
      RGB to XYZ and thence into a perceptually linear color space such
      as CIE LAB.  They can then partition the colors to generate an
      optimal palette, because the geometric distance between two colors
      in CIE LAB is strongly related to how different those colors
      appear (unlike, for example, RGB or XYZ spaces).	The resulting
      palette of colors, once transformed back into RGB color space,
      could be used for display or written into a PLTE chunk.

      Decoders that are part of image processing applications might also
      transform image data into CIE LAB space for analysis.





Boutell, et. al.	     Informational		       [Page 56]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      In applications where color fidelity is critical, such as product
      design, scientific visualization, medicine, architecture, or
      advertising, decoders can transform the image data from source_RGB
      to the display_RGB space of the monitor used to view the image.
      This involves calculating the matrix to go from source_RGB to XYZ
      and the matrix to go from XYZ to display_RGB, then combining them
      to produce the overall transformation.  The decoder is responsible
      for implementing gamut mapping.

      Decoders running on platforms that have a Color Management System
      (CMS) can pass the image data, gAMA and cHRM values to the CMS for
      display or further processing.

      Decoders that provide color printing facilities can use the
      facilities in Level 2 PostScript to specify image data in
      calibrated RGB space or in a device-independent color space such
      as XYZ.  This will provide better color fidelity than a simple RGB
      to CMYK conversion.  The PostScript Language Reference manual
      gives examples of this process [POSTSCRIPT].  Such decoders are
      responsible for implementing gamut mapping between source_RGB
      (specified in the cHRM chunk) and the target printer. The
      PostScript interpreter is then responsible for producing the
      required colors.

      Decoders can use the cHRM data to calculate an accurate grayscale
      representation of a color image.	Conversion from RGB to gray is
      simply a case of calculating the Y (luminance) component of XYZ,
      which is a weighted sum of the R G and B values.	The weights
      depend on the monitor type, i.e., the values in the cHRM chunk.
      Decoders may wish to do this for PNG files with no cHRM chunk.  In
      that case, a reasonable default would be the CCIR 709 primaries
      [ITU-BT709].  Do not use the original NTSC primaries, unless you
      really do have an image color-balanced for such a monitor.  Few
      monitors ever used the NTSC primaries, so such images are probably
      nonexistent these days.

   10.7. Background color

      The background color given by bKGD will typically be used to fill
      unused screen space around the image, as well as any transparent
      pixels within the image.	(Thus, bKGD is valid and useful even
      when the image does not use transparency.)  If no bKGD chunk is
      present, the viewer will need to make its own decision about a
      suitable background color.







Boutell, et. al.	     Informational		       [Page 57]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Viewers that have a specific background against which to present
      the image (such as Web browsers) should ignore the bKGD chunk, in
      effect overriding bKGD with their preferred background color or
      background image.

      The background color given by bKGD is not to be considered
      transparent, even if it happens to match the color given by tRNS
      (or, in the case of an indexed-color image, refers to a palette
      index that is marked as transparent by tRNS).  Otherwise one would
      have to imagine something "behind the background" to composite
      against.	The background color is either used as background or
      ignored; it is not an intermediate layer between the PNG image and
      some other background.

      Indeed, it will be common that bKGD and tRNS specify the same
      color, since then a decoder that does not implement transparency
      processing will give the intended display, at least when no
      partially-transparent pixels are present.

   10.8. Alpha channel processing

      In the most general case, the alpha channel can be used to
      composite a foreground image against a background image; the PNG
      file defines the foreground image and the transparency mask, but
      not the background image.  Decoders are not required to support
      this most general case.  It is expected that most will be able to
      support compositing against a single background color, however.

      The equation for computing a composited sample value is

	 output = alpha * foreground + (1-alpha) * background

      where alpha and the input and output sample values are expressed
      as fractions in the range 0 to 1.  This computation should be
      performed with linear (non-gamma-encoded) sample values.	For
      color images, the computation is done separately for R, G, and B
      samples.

      The following code illustrates the general case of compositing a
      foreground image over a background image.  It assumes that you
      have the original pixel data available for the background image,
      and that output is to a frame buffer for display.  Other variants
      are possible; see the comments below the code.  The code allows
      the sample depths and gamma values of foreground image, background
      image, and frame buffer/CRT all to be different.	Don't assume
      they are the same without checking.





Boutell, et. al.	     Informational		       [Page 58]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      This code is standard C, with line numbers added for reference in
      the comments below.

	 01  int foreground[4];  /* image pixel: R, G, B, A */
	 02  int background[3];  /* background pixel: R, G, B */
	 03  int fbpix[3];	 /* frame buffer pixel */
	 04  int fg_maxsample;	 /* foreground max sample */
	 05  int bg_maxsample;	 /* background max sample */
	 06  int fb_maxsample;	 /* frame buffer max sample */
	 07  int ialpha;
	 08  float alpha, compalpha;
	 09  float gamfg, linfg, gambg, linbg, comppix, gcvideo;

	     /* Get max sample values in data and frame buffer */
	 10  fg_maxsample = (1 << fg_sample_depth) - 1;
	 11  bg_maxsample = (1 << bg_sample_depth) - 1;
	 12  fb_maxsample = (1 << frame_buffer_sample_depth) - 1;
	     /*
	      * Get integer version of alpha.
	      * Check for opaque and transparent special cases;
	      * no compositing needed if so.
	      *
	      * We show the whole gamma decode/correct process in
	      * floating point, but it would more likely be done
	      * with lookup tables.
	      */
	 13  ialpha = foreground[3];

	 14  if (ialpha == 0) {
		 /*
		  * Foreground image is transparent here.
		  * If the background image is already in the frame
		  * buffer, there is nothing to do.
		  */
	 15	 ;
	 16  } else if (ialpha == fg_maxsample) {
		 /*
		  * Copy foreground pixel to frame buffer.
		  */
	 17	 for (i = 0; i < 3; i++) {
	 18	     gamfg = (float) foreground[i] / fg_maxsample;
	 19	     linfg = pow(gamfg, 1.0/fg_gamma);
	 20	     comppix = linfg;
	 21	     gcvideo = pow(comppix,viewing_gamma/display_gamma);
	 22	     fbpix[i] = (int) (gcvideo * fb_maxsample + 0.5);
	 23	 }





Boutell, et. al.	     Informational		       [Page 59]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	 24  } else {
		 /*
		  * Compositing is necessary.
		  * Get floating-point alpha and its complement.
		  * Note: alpha is always linear; gamma does not
		  * affect it.
		  */
	 25	 alpha = (float) ialpha / fg_maxsample;
	 26	 compalpha = 1.0 - alpha;
	 27	 for (i = 0; i < 3; i++) {
		     /*
		      * Convert foreground and background to floating
		      * point, then linearize (undo gamma encoding).
		      */
	 28	     gamfg = (float) foreground[i] / fg_maxsample;
	 29	     linfg = pow(gamfg, 1.0/fg_gamma);
	 30	     gambg = (float) background[i] / bg_maxsample;
	 31	     linbg = pow(gambg, 1.0/bg_gamma);
		     /*
		      * Composite.
		      */
	 32	     comppix = linfg * alpha + linbg * compalpha;
		     /*
		      * Gamma correct for display.
		      * Convert to integer frame buffer pixel.
		      */
	 33	     gcvideo = pow(comppix,viewing_gamma/display_gamma);
	 34	     fbpix[i] = (int) (gcvideo * fb_maxsample + 0.5);
	 35	 }
	 36  }

      Variations:

	  * If output is to another PNG image file instead of a frame
	    buffer, lines 21, 22, 33, and 34 should be changed to be
	    something like

	       /*
		* Gamma encode for storage in output file.
		* Convert to integer sample value.
		*/
	       gamout = pow(comppix, outfile_gamma);
	       outpix[i] = (int) (gamout * out_maxsample + 0.5);

	    Also, it becomes necessary to process background pixels when
	    alpha is zero, rather than just skipping pixels.  Thus, line
	    15 will need to be replaced by copies of lines 17-23, but
	    processing background instead of foreground pixel values.



Boutell, et. al.	     Informational		       [Page 60]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	  * If the sample depths of the output file, foreground file,
	    and background file are all the same, and the three gamma
	    values also match, then the no-compositing code in lines
	    14-23 reduces to nothing more than copying pixel values from
	    the input file to the output file if alpha is one, or
	    copying pixel values from background to output file if alpha
	    is zero.  Since alpha is typically either zero or one for
	    the vast majority of pixels in an image, this is a great
	    savings.  No gamma computations are needed for most pixels.
	  * When the sample depths and gamma values all match, it may
	    appear attractive to skip the gamma decoding and encoding
	    (lines 28-31, 33-34) and just perform line 32 using gamma-
	    encoded sample values. Although this doesn't hurt image
	    quality too badly, the time savings are small if alpha
	    values of zero and one are special-cased as recommended
	    here.
	  * If the original pixel values of the background image are no
	    longer available, only processed frame buffer pixels left by
	    display of the background image, then lines 30 and 31 need
	    to extract intensity from the frame buffer pixel values
	    using code like

	       /*
		* Decode frame buffer value back into linear space.
		*/
	       gcvideo = (float) fbpix[i] / fb_maxsample;
	       linbg = pow(gcvideo, display_gamma / viewing_gamma);

	    However, some roundoff error can result, so it is better to
	    have the original background pixels available if at all
	    possible.
	  * Note that lines 18-22 are performing exactly the same gamma
	    computation that is done when no alpha channel is present.
	    So, if you handle the no-alpha case with a lookup table, you
	    can use the same lookup table here.  Lines 28-31 and 33-34
	    can also be done with (different) lookup tables.
	  * Of course, everything here can be done in integer
	    arithmetic.  Just be careful to maintain sufficient
	    precision all the way through.

      Note: in floating point, no overflow or underflow checks are
      needed, because the input sample values are guaranteed to be
      between 0 and 1, and compositing always yields a result that is in
      between the input values (inclusive).  With integer arithmetic,
      some roundoff-error analysis might be needed to guarantee no
      overflow or underflow.





Boutell, et. al.	     Informational		       [Page 61]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      When displaying a PNG image with full alpha channel, it is
      important to be able to composite the image against some
      background, even if it's only black.  Ignoring the alpha channel
      will cause PNG images that have been converted from an
      associated-alpha representation to look wrong.  (Of course, if the
      alpha channel is a separate transparency mask, then ignoring alpha
      is a useful option: it allows the hidden parts of the image to be
      recovered.)

      Even if the decoder author does not wish to implement true
      compositing logic, it is simple to deal with images that contain
      only zero and one alpha values.  (This is implicitly true for
      grayscale and truecolor PNG files that use a tRNS chunk; for
      indexed-color PNG files, it is easy to check whether tRNS contains
      any values other than 0 and 255.)  In this simple case,
      transparent pixels are replaced by the background color, while
      others are unchanged.  If a decoder contains only this much
      transparency capability, it should deal with a full alpha channel
      by treating all nonzero alpha values as fully opaque; that is, do
      not replace partially transparent pixels by the background.  This
      approach will not yield very good results for images converted
      from associated-alpha formats, but it's better than doing nothing.

   10.9. Progressive display

      When receiving images over slow transmission links, decoders can
      improve perceived performance by displaying interlaced images
      progressively.  This means that as each pass is received, an
      approximation to the complete image is displayed based on the data
      received so far.	One simple yet pleasing effect can be obtained
      by expanding each received pixel to fill a rectangle covering the
      yet-to-be-transmitted pixel positions below and to the right of
      the received pixel.  This process can be described by the
      following pseudocode:

	 Starting_Row [1..7] =	{ 0, 0, 4, 0, 2, 0, 1 }
	 Starting_Col [1..7] =	{ 0, 4, 0, 2, 0, 1, 0 }
	 Row_Increment [1..7] = { 8, 8, 8, 4, 4, 2, 2 }
	 Col_Increment [1..7] = { 8, 8, 4, 4, 2, 2, 1 }
	 Block_Height [1..7] =	{ 8, 8, 4, 4, 2, 2, 1 }
	 Block_Width [1..7] =	{ 8, 4, 4, 2, 2, 1, 1 }

	 pass := 1
	 while pass <= 7
	 begin
	     row := Starting_Row[pass]

	     while row < height



Boutell, et. al.	     Informational		       [Page 62]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	     begin
		 col := Starting_Col[pass]

		 while col < width
		 begin
		     visit (row, col,
			    min (Block_Height[pass], height - row),
			    min (Block_Width[pass], width - col))
		     col := col + Col_Increment[pass]
		 end
		 row := row + Row_Increment[pass]
	     end

	     pass := pass + 1
	 end

      Here, the function "visit(row,column,height,width)" obtains the
      next transmitted pixel and paints a rectangle of the specified
      height and width, whose upper-left corner is at the specified row
      and column, using the color indicated by the pixel.  Note that row
      and column are measured from 0,0 at the upper left corner.

      If the decoder is merging the received image with a background
      image, it may be more convenient just to paint the received pixel
      positions; that is, the "visit()" function sets only the pixel at
      the specified row and column, not the whole rectangle.  This
      produces a "fade-in" effect as the new image gradually replaces
      the old.	An advantage of this approach is that proper alpha or
      transparency processing can be done as each pixel is replaced.
      Painting a rectangle as described above will overwrite
      background-image pixels that may be needed later, if the pixels
      eventually received for those positions turn out to be wholly or
      partially transparent.  Of course, this is only a problem if the
      background image is not stored anywhere offscreen.

   10.10. Suggested-palette and histogram usage

      In truecolor PNG files, the encoder may have provided a suggested
      PLTE chunk for use by viewers running on indexed-color hardware.

      If the image has a tRNS chunk, the viewer will need to adapt the
      suggested palette for use with its desired background color.  To
      do this, replace the palette entry closest to the tRNS color with
      the desired background color; or just add a palette entry for the
      background color, if the viewer can handle more colors than there
      are PLTE entries.





Boutell, et. al.	     Informational		       [Page 63]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      For images of color type 6 (truecolor with alpha channel), any
      suggested palette should have been designed for display of the
      image against a uniform background of the color specified by bKGD.
      Viewers should probably ignore the palette if they intend to use a
      different background, or if the bKGD chunk is missing.  Viewers
      can use a suggested palette for display against a different
      background than it was intended for, but the results may not be
      very good.

      If the viewer presents a transparent truecolor image against a
      background that is more complex than a single color, it is
      unlikely that the suggested palette will be optimal for the
      composite image.	In this case it is best to perform a truecolor
      compositing step on the truecolor PNG image and background image,
      then color-quantize the resulting image.

      The histogram chunk is useful when the viewer cannot provide as
      many colors as are used in the image's palette.  If the viewer is
      only short a few colors, it is usually adequate to drop the
      least-used colors from the palette.  To reduce the number of
      colors substantially, it's best to choose entirely new
      representative colors, rather than trying to use a subset of the
      existing palette.  This amounts to performing a new color
      quantization step; however, the existing palette and histogram can
      be used as the input data, thus avoiding a scan of the image data.

      If no palette or histogram chunk is provided, a decoder can
      develop its own, at the cost of an extra pass over the image data.
      Alternatively, a default palette (probably a color cube) can be
      used.

      See also Recommendations for Encoders: Suggested palettes (Section
      9.5).

   10.11. Text chunk processing

      If practical, decoders should have a way to display to the user
      all tEXt and zTXt chunks found in the file.  Even if the decoder
      does not recognize a particular text keyword, the user might be
      able to understand it.

      PNG text is not supposed to contain any characters outside the ISO
      8859-1 "Latin-1" character set (that is, no codes 0-31 or 127-
      159), except for the newline character (decimal 10).  But decoders
      might encounter such characters anyway.  Some of these characters
      can be safely displayed (e.g., TAB, FF, and CR, decimal 9, 12, and
      13, respectively), but others, especially the ESC character
      (decimal 27), could pose a security hazard because unexpected



Boutell, et. al.	     Informational		       [Page 64]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      actions may be taken by display hardware or software.  To prevent
      such hazards, decoders should not attempt to directly display any
      non-Latin-1 characters (except for newline and perhaps TAB, FF,
      CR) encountered in a tEXt or zTXt chunk.	Instead, ignore them or
      display them in a visible notation such as "\nnn".  See Security
      considerations (Section 8.5).

      Even though encoders are supposed to represent newlines as LF, it
      is recommended that decoders not rely on this; it's best to
      recognize all the common newline combinations (CR, LF, and CR-LF)
      and display each as a single newline.  TAB can be expanded to the
      proper number of spaces needed to arrive at a column multiple of
      8.

      Decoders running on systems with non-Latin-1 character set
      encoding should provide character code remapping so that Latin-1
      characters are displayed correctly.  Some systems may not provide
      all the characters defined in Latin-1.  Mapping unavailable
      characters to a visible notation such as "\nnn" is a good
      fallback.  In particular, character codes 127-255 should be
      displayed only if they are printable characters on the decoding
      system.  Some systems may interpret such codes as control
      characters; for security, decoders running on such systems should
      not display such characters literally.

      Decoders should be prepared to display text chunks that contain
      any number of printing characters between newline characters, even
      though encoders are encouraged to avoid creating lines in excess
      of 79 characters.

11. Glossary

   a^b
      Exponentiation; a raised to the power b.	C programmers should be
      careful not to misread this notation as exclusive-or.  Note that
      in gamma-related calculations, zero raised to any power is valid
      and must give a zero result.

   Alpha
      A value representing a pixel's degree of transparency.  The more
      transparent a pixel, the less it hides the background against
      which the image is presented.  In PNG, alpha is really the degree
      of opacity: zero alpha represents a completely transparent pixel,
      maximum alpha represents a completely opaque pixel.  But most
      people refer to alpha as providing transparency information, not
      opacity information, and we continue that custom here.





Boutell, et. al.	     Informational		       [Page 65]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   Ancillary chunk
      A chunk that provides additional information.  A decoder can still
      produce a meaningful image, though not necessarily the best
      possible image, without processing the chunk.

   Bit depth
      The number of bits per palette index (in indexed-color PNGs) or
      per sample (in other color types).  This is the same value that
      appears in IHDR.

   Byte
      Eight bits; also called an octet.

   Channel
      The set of all samples of the same kind within an image; for
      example, all the blue samples in a truecolor image.  (The term
      "component" is also used, but not in this specification.)  A
      sample is the intersection of a channel and a pixel.

   Chromaticity
      A pair of values x,y that precisely specify the hue, though not
      the absolute brightness, of a perceived color.

   Chunk
      A section of a PNG file.	Each chunk has a type indicated by its
      chunk type name.	Most types of chunks also include some data.
      The format and meaning of the data within the chunk are determined
      by the type name.

   Composite
      As a verb, to form an image by merging a foreground image and a
      background image, using transparency information to determine
      where the background should be visible.  The foreground image is
      said to be "composited against" the background.

   CRC
      Cyclic Redundancy Check.	A CRC is a type of check value designed
      to catch most transmission errors.  A decoder calculates the CRC
      for the received data and compares it to the CRC that the encoder
      calculated, which is appended to the data.  A mismatch indicates
      that the data was corrupted in transit.

   Critical chunk
      A chunk that must be understood and processed by the decoder in
      order to produce a meaningful image from a PNG file.

   CRT
      Cathode Ray Tube: a common type of computer display hardware.



Boutell, et. al.	     Informational		       [Page 66]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   Datastream
      A sequence of bytes.  This term is used rather than "file" to
      describe a byte sequence that is only a portion of a file.  We
      also use it to emphasize that a PNG image might be generated and
      consumed "on the fly", never appearing in a stored file at all.

   Deflate
      The name of the compression algorithm used in standard PNG files,
      as well as in zip, gzip, pkzip, and other compression programs.
      Deflate is a member of the LZ77 family of compression methods.

   Filter
      A transformation applied to image data in hopes of improving its
      compressibility.	PNG uses only lossless (reversible) filter
      algorithms.

   Frame buffer
      The final digital storage area for the image shown by a computer
      display.	Software causes an image to appear onscreen by loading
      it into the frame buffer.

   Gamma
      The brightness of mid-level tones in an image.  More precisely, a
      parameter that describes the shape of the transfer function for
      one or more stages in an imaging pipeline.  The transfer function
      is given by the expression

	 output = input ^ gamma

      where both input and output are scaled to the range 0 to 1.

   Grayscale
      An image representation in which each pixel is represented by a
      single sample value representing overall luminance (on a scale
      from black to white).  PNG also permits an alpha sample to be
      stored for each pixel of a grayscale image.

   Indexed color
      An image representation in which each pixel is represented by a
      single sample that is an index into a palette or lookup table.
      The selected palette entry defines the actual color of the pixel.

   Lossless compression
      Any method of data compression that guarantees the original data
      can be reconstructed exactly, bit-for-bit.






Boutell, et. al.	     Informational		       [Page 67]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   Lossy compression
      Any method of data compression that reconstructs the original data
      approximately, rather than exactly.

   LSB
      Least Significant Byte of a multi-byte value.

   Luminance
      Perceived brightness, or grayscale level, of a color.  Luminance
      and chromaticity together fully define a perceived color.

   LUT
      Look Up Table.  In general, a table used to transform data.  In
      frame buffer hardware, a LUT can be used to map indexed-color
      pixels into a selected set of truecolor values, or to perform
      gamma correction.  In software, a LUT can be used as a fast way of
      implementing any one-variable mathematical function.

   MSB
      Most Significant Byte of a multi-byte value.

   Palette
      The set of colors available in an indexed-color image.  In PNG, a
      palette is an array of colors defined by red, green, and blue
      samples.	(Alpha values can also be defined for palette entries,
      via the tRNS chunk.)

   Pixel
      The information stored for a single grid point in the image.  The
      complete image is a rectangular array of pixels.

   PNG editor
      A program that modifies a PNG file and preserves ancillary
      information, including chunks that it does not recognize.  Such a
      program must obey the rules given in Chunk Ordering Rules (Chapter
      7).

   Sample
      A single number in the image data; for example, the red value of a
      pixel.  A pixel is composed of one or more samples.  When
      discussing physical data layout (in particular, in Image layout,
      Section 2.3), we use "sample" to mean a number stored in the image
      array.  It would be more precise but much less readable to say
      "sample or palette index" in that context.  Elsewhere in the
      specification, "sample" means a color value or alpha value.  In
      the indexed-color case, these are palette entries not palette
      indexes.




Boutell, et. al.	     Informational		       [Page 68]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   Sample depth
      The precision, in bits, of color values and alpha values.  In
      indexed-color PNGs the sample depth is always 8 by definition of
      the PLTE chunk.  In other color types it is the same as the bit
      depth.

   Scanline
      One horizontal row of pixels within an image.

   Truecolor
      An image representation in which pixel colors are defined by
      storing three samples for each pixel, representing red, green, and
      blue intensities respectively.  PNG also permits an alpha sample
      to be stored for each pixel of a truecolor image.

   White point
      The chromaticity of a computer display's nominal white value.

   zlib
      A particular format for data that has been compressed using
      deflate-style compression.  Also the name of a library
      implementing this method.  PNG implementations need not use the
      zlib library, but they must conform to its format for compressed
      data.

12. Appendix: Rationale

   (This appendix is not part of the formal PNG specification.)

   This appendix gives the reasoning behind some of the design decisions
   in PNG.  Many of these decisions were the subject of considerable
   debate.  The authors freely admit that another group might have made
   different decisions; however, we believe that our choices are
   defensible and consistent.

   12.1. Why a new file format?

      Does the world really need yet another graphics format?  We
      believe so.  GIF is no longer freely usable, but no other commonly
      used format can directly replace it, as is discussed in more
      detail below.  We might have used an adaptation of an existing
      format, for example GIF with an unpatented compression scheme.
      But this would require new code anyway; it would not be all that
      much easier to implement than a whole new file format.  (PNG is
      designed to be simple to implement, with the exception of the
      compression engine, which would be needed in any case.)  We feel
      that this is an excellent opportunity to design a new format that
      fixes some of the known limitations of GIF.



Boutell, et. al.	     Informational		       [Page 69]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   12.2. Why these features?

      The features chosen for PNG are intended to address the needs of
      applications that previously used the special strengths of GIF.
      In particular, GIF is well adapted for online communications
      because of its streamability and progressive display capability.
      PNG shares those attributes.

      We have also addressed some of the widely known shortcomings of
      GIF.  In particular, PNG supports truecolor images.  We know of no
      widely used image format that losslessly compresses truecolor
      images as effectively as PNG does.  We hope that PNG will make use
      of truecolor images more practical and widespread.

      Some form of transparency control is desirable for applications in
      which images are displayed against a background or together with
      other images.  GIF provided a simple transparent-color
      specification for this purpose.  PNG supports a full alpha channel
      as well as transparent-color specifications.  This allows both
      highly flexible transparency and compression efficiency.

      Robustness against transmission errors has been an important
      consideration.  For example, images transferred across Internet
      are often mistakenly processed as text, leading to file
      corruption.  PNG is designed so that such errors can be detected
      quickly and reliably.

      PNG has been expressly designed not to be completely dependent on
      a single compression technique. Although deflate/inflate
      compression is mentioned in this document, PNG would still exist
      without it.

   12.3. Why not these features?

      Some features have been deliberately omitted from PNG.  These
      choices were made to simplify implementation of PNG, promote
      portability and interchangeability, and make the format as simple
      and foolproof as possible for users.  In particular:













Boutell, et. al.	     Informational		       [Page 70]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	  * There is no uncompressed variant of PNG.  It is possible to
	    store uncompressed data by using only uncompressed deflate
	    blocks (a feature normally used to guarantee that deflate
	    does not make incompressible data much larger).  However,
	    PNG software must support full deflate/inflate; any software
	    that does not is not compliant with the PNG standard. The
	    two most important features of PNG---portability and
	    compression---are absolute requirements for online
	    applications, and users demand them. Failure to support full
	    deflate/inflate compromises both of these objectives.
	  * There is no lossy compression in PNG.  Existing formats such
	    as JFIF already handle lossy compression well.  Furthermore,
	    available lossy compression methods (e.g., JPEG) are far
	    from foolproof --- a poor choice of quality level can ruin
	    an image.  To avoid user confusion and unintentional loss of
	    information, we feel it is best to keep lossy and lossless
	    formats strictly separate.	Also, lossy compression is
	    complex to implement.  Adding JPEG support to a PNG decoder
	    might increase its size by an order of magnitude.  This
	    would certainly cause some decoders to omit support for the
	    feature, which would destroy our goal of interchangeability.
	  * There is no support for CMYK or other unusual color spaces.
	    Again, this is in the name of promoting portability.  CMYK,
	    in particular, is far too device-dependent to be useful as a
	    portable image representation.
	  * There is no standard chunk for thumbnail views of images.
	    In discussions with software vendors who use thumbnails in
	    their products, it has become clear that most would not use
	    a "standard" thumbnail chunk.  For one thing, every vendor
	    has a different idea of what the dimensions and
	    characteristics of a thumbnail ought to be.  Also, some
	    vendors keep thumbnails in separate files to accommodate
	    varied image formats; they are not going to stop doing that
	    simply because of a thumbnail chunk in one new format.
	    Proprietary chunks containing vendor-specific thumbnails
	    appear to be more practical than a common thumbnail format.

      It is worth noting that private extensions to PNG could easily add
      these features.  We will not, however, include them as part of the
      basic PNG standard.











Boutell, et. al.	     Informational		       [Page 71]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      PNG also does not support multiple images in one file.  This
      restriction is a reflection of the reality that many applications
      do not need and will not support multiple images per file.  In any
      case, single images are a fundamentally different sort of object
      from sequences of images.  Rather than make false promises of
      interchangeability, we have drawn a clear distinction between
      single-image and multi-image formats.  PNG is a single-image
      format.  (But see Multiple-image extension, Section 8.4.)

   12.4. Why not use format X?

      Numerous existing formats were considered before deciding to
      develop PNG.  None could meet the requirements we felt were
      important for PNG.

      GIF is no longer suitable as a universal standard because of legal
      entanglements.  Although just replacing GIF's compression method
      would avoid that problem, GIF does not support truecolor images,
      alpha channels, or gamma correction.  The spec has more subtle
      problems too.  Only a small subset of the GIF89 spec is actually
      portable across a variety of implementations, but there is no
      codification of the most portable part of the spec.

      TIFF is far too complex to meet our goals of simplicity and
      interchangeability.  Defining a TIFF subset would meet that
      objection, but would frustrate users making the reasonable
      assumption that a file saved as TIFF from their existing software
      would load into a program supporting our flavor of TIFF.
      Furthermore, TIFF is not designed for stream processing, has no
      provision for progressive display, and does not currently provide
      any good, legally unencumbered, lossless compression method.

      IFF has also been suggested, but is not suitable in detail:
      available image representations are too machine-specific or not
      adequately compressed.  The overall chunk structure of IFF is a
      useful concept that PNG has liberally borrowed from, but we did
      not attempt to be bit-for-bit compatible with IFF chunk structure.
      Again this is due to detailed issues, notably the fact that IFF
      FORMs are not designed to be serially writable.

      Lossless JPEG is not suitable because it does not provide for the
      storage of indexed-color images.	Furthermore, its lossless
      truecolor compression is often inferior to that of PNG.








Boutell, et. al.	     Informational		       [Page 72]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   12.5. Byte order

      It has been asked why PNG uses network byte order.  We have
      selected one byte ordering and used it consistently. Which order
      in particular is of little relevance, but network byte order has
      the advantage that routines to convert to and from it are already
      available on any platform that supports TCP/IP networking,
      including all PC platforms.  The functions are trivial and will be
      included in the reference implementation.

   12.6. Interlacing

      PNG's two-dimensional interlacing scheme is more complex to
      implement than GIF's line-wise interlacing.  It also costs a
      little more in file size.  However, it yields an initial image
      eight times faster than GIF (the first pass transmits only 1/64th
      of the pixels, compared to 1/8th for GIF).  Although this initial
      image is coarse, it is useful in many situations.  For example, if
      the image is a World Wide Web imagemap that the user has seen
      before, PNG's first pass is often enough to determine where to
      click.  The PNG scheme also looks better than GIF's, because
      horizontal and vertical resolution never differ by more than a
      factor of two; this avoids the odd "stretched" look seen when
      interlaced GIFs are filled in by replicating scanlines.
      Preliminary results show that small text in an interlaced PNG
      image is typically readable about twice as fast as in an
      equivalent GIF, i.e., after PNG's fifth pass or 25% of the image
      data, instead of after GIF's third pass or 50%.  This is again due
      to PNG's more balanced increase in resolution.

   12.7. Why gamma?

      It might seem natural to standardize on storing sample values that
      are linearly proportional to light intensity (that is, have gamma
      of 1.0).	But in fact, it is common for images to have a gamma of
      less than 1.  There are three good reasons for this:

	  * For reasons detailed in Gamma Tutorial (Chapter 13), all
	    video cameras apply a "gamma correction" function to the
	    intensity information.  This causes the video signal to have
	    a gamma of about 0.5 relative to the light intensity in the
	    original scene.  Thus, images obtained by frame-grabbing
	    video already have a gamma of about 0.5.
	  * The human eye has a nonlinear response to intensity, so
	    linear encoding of samples either wastes sample codes in
	    bright areas of the image, or provides too few sample codes
	    to avoid banding artifacts in dark areas of the image, or
	    both.  At least 12 bits per sample are needed to avoid



Boutell, et. al.	     Informational		       [Page 73]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


	    visible artifacts in linear encoding with a 100:1 image
	    intensity range.  An image gamma in the range 0.3 to 0.5
	    allocates sample values in a way that roughly corresponds to
	    the eye's response, so that 8 bits/sample are enough to
	    avoid artifacts caused by insufficient sample precision in
	    almost all images.	This makes "gamma encoding" a much
	    better way of storing digital images than the simpler linear
	    encoding.
	  * Many images are created on PCs or workstations with no gamma
	    correction hardware and no software willing to provide gamma
	    correction either.	In these cases, the images have had
	    their lighting and color chosen to look best on this
	    platform --- they can be thought of as having "manual" gamma
	    correction built in.  To see what the image author intended,
	    it is necessary to treat such images as having a file_gamma
	    value in the range 0.4-0.6, depending on the room lighting
	    level that the author was working in.

      In practice, image gamma values around 1.0 and around 0.5 are both
      widely found.  Older image standards such as GIF often do not
      account for this fact.  The JFIF standard specifies that images in
      that format should use linear samples, but many JFIF images found
      on the Internet actually have a gamma somewhere near 0.4 or 0.5.
      The variety of images found and the variety of systems that people
      display them on have led to widespread problems with images
      appearing "too dark" or "too light".

      PNG expects viewers to compensate for image gamma at the time that
      the image is displayed. Another possible approach is to expect
      encoders to convert all images to a uniform gamma at encoding
      time. While that method would speed viewers slightly, it has
      fundamental flaws:

	  * Gamma correction is inherently lossy due to quantization and
	    roundoff error.  Requiring conversion at encoding time thus
	    causes irreversible loss. Since PNG is intended to be a
	    lossless storage format, this is undesirable; we should
	    store unmodified source data.
	  * The encoder might not know the source gamma value. If the
	    decoder does gamma correction at viewing time, it can adjust
	    the gamma (change the displayed brightness) in response to
	    feedback from a human user. The encoder has no such
	    recourse.
	  * Whatever "standard" gamma we settled on would be wrong for
	    some displays. Hence viewers would still need gamma
	    correction capability.





Boutell, et. al.	     Informational		       [Page 74]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Since there will always be images with no gamma or an incorrect
      recorded gamma, good viewers will need to incorporate gamma
      adjustment code anyway. Gamma correction at viewing time is thus
      the right way to go.

      See Gamma Tutorial (Chapter 13) for more information.

   12.8. Non-premultiplied alpha

      PNG uses "unassociated" or "non-premultiplied" alpha so that
      images with separate transparency masks can be stored losslessly.
      Another common technique, "premultiplied alpha", stores pixel
      values premultiplied by the alpha fraction; in effect, the image
      is already composited against a black background.  Any image data
      hidden by the transparency mask is irretrievably lost by that
      method, since multiplying by a zero alpha value always produces
      zero.

      Some image rendering techniques generate images with premultiplied
      alpha (the alpha value actually represents how much of the pixel
      is covered by the image).  This representation can be converted to
      PNG by dividing the sample values by alpha, except where alpha is
      zero.  The result will look good if displayed by a viewer that
      handles alpha properly, but will not look very good if the viewer
      ignores the alpha channel.

      Although each form of alpha storage has its advantages, we did not
      want to require all PNG viewers to handle both forms.  We
      standardized on non-premultiplied alpha as being the lossless and
      more general case.

   12.9. Filtering

      PNG includes filtering capability because filtering can
      significantly reduce the compressed size of truecolor and
      grayscale images.  Filtering is also sometimes of value on
      indexed-color images, although this is less common.

      The filter algorithms are defined to operate on bytes, rather than
      pixels; this gains simplicity and speed with very little cost in
      compression performance.	Tests have shown that filtering is
      usually ineffective for images with fewer than 8 bits per sample,
      so providing pixelwise filtering for such images would be
      pointless.  For 16 bit/sample data, bytewise filtering is nearly
      as effective as pixelwise filtering, because MSBs are predicted
      from adjacent MSBs, and LSBs are predicted from adjacent LSBs.





Boutell, et. al.	     Informational		       [Page 75]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      The encoder is allowed to change filters for each new scanline.
      This creates no additional complexity for decoders, since a
      decoder is required to contain defiltering logic for every filter
      type anyway.  The only cost is an extra byte per scanline in the
      pre-compression datastream.  Our tests showed that when the same
      filter is selected for all scanlines, this extra byte compresses
      away to almost nothing, so there is little storage cost compared
      to a fixed filter specified for the whole image.	And the
      potential benefits of adaptive filtering are too great to ignore.
      Even with the simplistic filter-choice heuristics so far
      discovered, adaptive filtering usually outperforms fixed filters.
      In particular, an adaptive filter can change behavior for
      successive passes of an interlaced image; a fixed filter cannot.

   12.10. Text strings

      Most graphics file formats include the ability to store some
      textual information along with the image.  But many applications
      need more than that: they want to be able to store several
      identifiable pieces of text.  For example, a database using PNG
      files to store medical X-rays would likely want to include
      patient's name, doctor's name, etc.  A simple way to do this in
      PNG would be to invent new private chunks holding text.  The
      disadvantage of such an approach is that other applications would
      have no idea what was in those chunks, and would simply ignore
      them.  Instead, we recommend that textual information be stored in
      standard tEXt chunks with suitable keywords.  Use of tEXt tells
      any PNG viewer that the chunk contains text that might be of
      interest to a human user.  Thus, a person looking at the file with
      another viewer will still be able to see the text, and even
      understand what it is if the keywords are reasonably self-
      explanatory.  (To this end, we recommend spelled-out keywords, not
      abbreviations that will be hard for a person to understand.
      Saving a few bytes on a keyword is false economy.)

      The ISO 8859-1 (Latin-1) character set was chosen as a compromise
      between functionality and portability.  Some platforms cannot
      display anything more than 7-bit ASCII characters, while others
      can handle characters beyond the Latin-1 set.  We felt that
      Latin-1 represents a widely useful and reasonably portable
      character set.  Latin-1 is a direct subset of character sets
      commonly used on popular platforms such as Microsoft Windows and X
      Windows.	It can also be handled on Macintosh systems with a
      simple remapping of characters.

      There is presently no provision for text employing character sets
      other than Latin-1. We recognize that the need for other character
      sets will increase.  However, PNG already requires that



Boutell, et. al.	     Informational		       [Page 76]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      programmers implement a number of new and unfamiliar features, and
      text representation is not PNG's primary purpose. Since PNG
      provides for the creation and public registration of new ancillary
      chunks of general interest, we expect that text chunks for other
      character sets, such as Unicode, eventually will be registered and
      increase gradually in popularity.

   12.11. PNG file signature

      The first eight bytes of a PNG file always contain the following
      values:

	 (decimal)		137  80  78  71  13  10  26  10
	 (hexadecimal)		 89  50  4e  47  0d  0a  1a  0a
	 (ASCII C notation)    \211   P   N   G  \r  \n \032 \n

      This signature both identifies the file as a PNG file and provides
      for immediate detection of common file-transfer problems.  The
      first two bytes distinguish PNG files on systems that expect the
      first two bytes to identify the file type uniquely.  The first
      byte is chosen as a non-ASCII value to reduce the probability that
      a text file may be misrecognized as a PNG file; also, it catches
      bad file transfers that clear bit 7.  Bytes two through four name
      the format.  The CR-LF sequence catches bad file transfers that
      alter newline sequences.	The control-Z character stops file
      display under MS-DOS.  The final line feed checks for the inverse
      of the CR-LF translation problem.

      A decoder may further verify that the next eight bytes contain an
      IHDR chunk header with the correct chunk length; this will catch
      bad transfers that drop or alter null (zero) bytes.

      Note that there is no version number in the signature, nor indeed
      anywhere in the file.  This is intentional: the chunk mechanism
      provides a better, more flexible way to handle format extensions,
      as explained in Chunk naming conventions (Section 12.13).

   12.12. Chunk layout

      The chunk design allows decoders to skip unrecognized or
      uninteresting chunks: it is simply necessary to skip the
      appropriate number of bytes, as determined from the length field.

      Limiting chunk length to (2^31)-1 bytes avoids possible problems
      for implementations that cannot conveniently handle 4-byte
      unsigned values.	In practice, chunks will usually be much shorter
      than that anyway.




Boutell, et. al.	     Informational		       [Page 77]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      A separate CRC is provided for each chunk in order to detect
      badly-transferred images as quickly as possible.	In particular,
      critical data such as the image dimensions can be validated before
      being used.

      The chunk length is excluded from the CRC so that the CRC can be
      calculated as the data is generated; this avoids a second pass
      over the data in cases where the chunk length is not known in
      advance.	Excluding the length from the CRC does not create any
      extra risk of failing to discover file corruption, since if the
      length is wrong, the CRC check will fail: the CRC will be computed
      on the wrong set of bytes and then be tested against the wrong
      value from the file.

   12.13. Chunk naming conventions

      The chunk naming conventions allow safe, flexible extension of the
      PNG format.  This mechanism is much better than a format version
      number, because it works on a feature-by-feature basis rather than
      being an overall indicator.  Decoders can process newer files if
      and only if the files use no unknown critical features (as
      indicated by finding unknown critical chunks).  Unknown ancillary
      chunks can be safely ignored.  We decided against having an
      overall format version number because experience has shown that
      format version numbers hurt portability as much as they help.
      Version numbers tend to be set unnecessarily high, leading to
      older decoders rejecting files that they could have processed
      (this was a serious problem for several years after the GIF89 spec
      came out, for example).  Furthermore, private extensions can be
      made either critical or ancillary, and standard decoders should
      react appropriately; overall version numbers are no help for
      private extensions.

      A hypothetical chunk for vector graphics would be a critical
      chunk, since if ignored, important parts of the intended image
      would be missing.  A chunk carrying the Mandelbrot set coordinates
      for a fractal image would be ancillary, since other applications
      could display the image without understanding what the image
      represents.  In general, a chunk type should be made critical only
      if it is impossible to display a reasonable representation of the
      intended image without interpreting that chunk.










Boutell, et. al.	     Informational		       [Page 78]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      The public/private property bit ensures that any newly defined
      public chunk type name cannot conflict with proprietary chunks
      that could be in use somewhere.  However, this does not protect
      users of private chunk names from the possibility that someone
      else may use the same chunk name for a different purpose.  It is a
      good idea to put additional identifying information at the start
      of the data for any private chunk type.

      When a PNG file is modified, certain ancillary chunks may need to
      be changed to reflect changes in other chunks. For example, a
      histogram chunk needs to be changed if the image data changes.  If
      the file editor does not recognize histogram chunks, copying them
      blindly to a new output file is incorrect; such chunks should be
      dropped.	The safe/unsafe property bit allows ancillary chunks to
      be marked appropriately.

      Not all possible modification scenarios are covered by the
      safe/unsafe semantics.  In particular, chunks that are dependent
      on the total file contents are not supported.  (An example of such
      a chunk is an index of IDAT chunk locations within the file:
      adding a comment chunk would inadvertently break the index.)
      Definition of such chunks is discouraged.  If absolutely necessary
      for a particular application, such chunks can be made critical
      chunks, with consequent loss of portability to other applications.
      In general, ancillary chunks can depend on critical chunks but not
      on other ancillary chunks.  It is expected that mutually dependent
      information should be put into a single chunk.

      In some situations it may be unavoidable to make one ancillary
      chunk dependent on another.  Although the chunk property bits are
      insufficient to represent this case, a simple solution is
      available: in the dependent chunk, record the CRC of the chunk
      depended on.  It can then be determined whether that chunk has
      been changed by some other program.

      The same technique can be useful for other purposes.  For example,
      if a program relies on the palette being in a particular order, it
      can store a private chunk containing the CRC of the PLTE chunk.
      If this value matches when the file is again read in, then it
      provides high confidence that the palette has not been tampered
      with.  Note that it is not necessary to mark the private chunk
      unsafe-to-copy when this technique is used; thus, such a private
      chunk can survive other editing of the file.








Boutell, et. al.	     Informational		       [Page 79]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   12.14. Palette histograms

      A viewer may not be able to provide as many colors as are listed
      in the image's palette.  (For example, some colors could be
      reserved by a window system.)  To produce the best results in this
      situation, it is helpful to have information about the frequency
      with which each palette index actually appears, in order to choose
      the best palette for dithering or to drop the least-used colors.
      Since images are often created once and viewed many times, it
      makes sense to calculate this information in the encoder, although
      it is not mandatory for the encoder to provide it.

      Other image formats have usually addressed this problem by
      specifying that the palette entries should appear in order of
      frequency of use.  That is an inferior solution, because it
      doesn't give the viewer nearly as much information: the viewer
      can't determine how much damage will be done by dropping the last
      few colors.  Nor does a sorted palette give enough information to
      choose a target palette for dithering, in the case that the viewer
      needs to reduce the number of colors substantially.  A palette
      histogram provides the information needed to choose such a target
      palette without making a pass over the image data.





























Boutell, et. al.	     Informational		       [Page 80]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


13. Appendix: Gamma Tutorial

   (This appendix is not part of the formal PNG specification.)

   It would be convenient for graphics programmers if all of the
   components of an imaging system were linear.  The voltage coming from
   an electronic camera would be directly proportional to the intensity
   (power) of light in the scene, the light emitted by a CRT would be
   directly proportional to its input voltage, and so on.  However,
   real-world devices do not behave in this way.  All CRT displays,
   almost all photographic film, and many electronic cameras have
   nonlinear signal-to-light-intensity or intensity-to-signal
   characteristics.

   Fortunately, all of these nonlinear devices have a transfer function
   that is approximated fairly well by a single type of mathematical
   function: a power function.	This power function has the general
   equation

      output = input ^ gamma

   where ^ denotes exponentiation, and "gamma" (often printed using the
   Greek letter gamma, thus the name) is simply the exponent of the
   power function.

   By convention, "input" and "output" are both scaled to the range
   0..1, with 0 representing black and 1 representing maximum white (or
   red, etc).  Normalized in this way, the power function is completely
   described by a single number, the exponent "gamma".

   So, given a particular device, we can measure its output as a
   function of its input, fit a power function to this measured transfer
   function, extract the exponent, and call it gamma.  We often say
   "this device has a gamma of 2.5" as a shorthand for "this device has
   a power-law response with an exponent of 2.5".  We can also talk
   about the gamma of a mathematical transform, or of a lookup table in
   a frame buffer, so long as the input and output of the thing are
   related by the power-law expression above.

   How do gammas combine?

      Real imaging systems will have several components, and more than
      one of these can be nonlinear.  If all of the components have
      transfer characteristics that are power functions, then the
      transfer function of the entire system is also a power function.
      The exponent (gamma) of the whole system's transfer function is
      just the product of all of the individual exponents (gammas) of
      the separate stages in the system.



Boutell, et. al.	     Informational		       [Page 81]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Also, stages that are linear pose no problem, since a power
      function with an exponent of 1.0 is really a linear function.  So
      a linear transfer function is just a special case of a power
      function, with a gamma of 1.0.

      Thus, as long as our imaging system contains only stages with
      linear and power-law transfer functions, we can meaningfully talk
      about the gamma of the entire system.  This is indeed the case
      with most real imaging systems.

   What should overall gamma be?

      If the overall gamma of an imaging system is 1.0, its output is
      linearly proportional to its input.  This means that the ratio
      between the intensities of any two areas in the reproduced image
      will be the same as it was in the original scene.  It might seem
      that this should always be the goal of an imaging system: to
      accurately reproduce the tones of the original scene.  Alas, that
      is not the case.

      When the reproduced image is to be viewed in "bright surround"
      conditions, where other white objects nearby in the room have
      about the same brightness as white in the image, then an overall
      gamma of 1.0 does indeed give real-looking reproduction of a
      natural scene.  Photographic prints viewed under room light and
      computer displays in bright room light are typical "bright
      surround" viewing conditions.

      However, sometimes images are intended to be viewed in "dark
      surround" conditions, where the room is substantially black except
      for the image.  This is typical of the way movies and slides
      (transparencies) are viewed by projection.  Under these
      circumstances, an accurate reproduction of the original scene
      results in an image that human viewers judge as "flat" and lacking
      in contrast.  It turns out that the projected image needs to have
      a gamma of about 1.5 relative to the original scene for viewers to
      judge it "natural".  Thus, slide film is designed to have a gamma
      of about 1.5, not 1.0.

      There is also an intermediate condition called "dim surround",
      where the rest of the room is still visible to the viewer, but is
      noticeably darker than the reproduced image itself.  This is
      typical of television viewing, at least in the evening, as well as
      subdued-light computer work areas.  In dim surround conditions,
      the reproduced image needs to have a gamma of about 1.25 relative
      to the original scene in order to look natural.





Boutell, et. al.	     Informational		       [Page 82]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      The requirement for boosted contrast (gamma) in dark surround
      conditions is due to the way the human visual system works, and
      applies equally well to computer monitors.  Thus, a PNG viewer
      trying to achieve the maximum realism for the images it displays
      really needs to know what the room lighting conditions are, and
      adjust the gamma of the displayed image accordingly.

      If asking the user about room lighting conditions is inappropriate
      or too difficult, just assume that the overall gamma
      (viewing_gamma as defined below) should be 1.0 or 1.25.  That's
      all that most systems that implement gamma correction do.

   What is a CRT's gamma?

      All CRT displays have a power-law transfer characteristic with a
      gamma of about 2.5.  This is due to the physical processes
      involved in controlling the electron beam in the electron gun, and
      has nothing to do with the phosphor.

      An exception to this rule is fancy "calibrated" CRTs that have
      internal electronics to alter their transfer function.  If you
      have one of these, you probably should believe what the
      manufacturer tells you its gamma is.  But in all other cases,
      assuming 2.5 is likely to be pretty accurate.

      There are various images around that purport to measure gamma,
      usually by comparing the intensity of an area containing
      alternating white and black with a series of areas of continuous
      gray of different intensity.  These are usually not reliable.
      Test images that use a "checkerboard" pattern of black and white
      are the worst, because a single white pixel will be reproduced
      considerably darker than a large area of white.  An image that
      uses alternating black and white horizontal lines (such as the
      "gamma.png" test image at
      ftp://ftp.uu.net/graphics/png/images/suite/gamma.png) is much
      better, but even it may be inaccurate at high "picture" settings
      on some CRTs.

      If you have a good photometer, you can measure the actual light
      output of a CRT as a function of input voltage and fit a power
      function to the measurements.  However, note that this procedure
      is very sensitive to the CRT's black level adjustment, somewhat
      sensitive to its picture adjustment, and also affected by ambient
      light.  Furthermore, CRTs spread some light from bright areas of
      an image into nearby darker areas; a single bright spot against a
      black background may be seen to have a "halo".  Your measuring
      technique will need to minimize the effects of this.




Boutell, et. al.	     Informational		       [Page 83]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Because of the difficulty of measuring gamma, using either test
      images or measuring equipment, you're usually better off just
      assuming gamma is 2.5 rather than trying to measure it.

   What is gamma correction?

      A CRT has a gamma of 2.5, and we can't change that.  To get an
      overall gamma of 1.0 (or somewhere near that) for an imaging
      system, we need to have at least one other component of the "image
      pipeline" that is nonlinear.  If, in fact, there is only one
      nonlinear stage in addition to the CRT, then it's traditional to
      say that the CRT has a certain gamma, and that the other nonlinear
      stage provides "gamma correction" to compensate for the CRT.
      However, exactly where the "correction" is done depends on
      circumstance.

      In all broadcast video systems, gamma correction is done in the
      camera.  This choice was made in the days when television
      electronics were all analog, and a good gamma-correction circuit
      was expensive to build.  The original NTSC video standard required
      cameras to have a transfer function with a gamma of 1/2.2, or
      about 0.45.  Recently, a more complex two-part transfer function
      has been adopted [SMPTE-170M], but its behavior can be well
      approximated by a power function with a gamma of 0.5.  When the
      resulting image is displayed on a CRT with a gamma of 2.5, the
      image on screen ends up with a gamma of about 1.25 relative to the
      original scene, which is appropriate for "dim surround" viewing.

      These days, video signals are often digitized and stored in
      computer frame buffers.  This works fine, but remember that gamma
      correction is "built into" the video signal, and so the digitized
      video has a gamma of about 0.5 relative to the original scene.

      Computer rendering programs often produce linear samples.  To
      display these correctly, intensity on the CRT needs to be directly
      proportional to the sample values in the frame buffer.  This can
      be done with a special hardware lookup table between the frame
      buffer and the CRT hardware.  The lookup table (often called LUT)
      is loaded with a mapping that implements a power function with a
      gamma of 0.4, thus providing "gamma correction" for the CRT gamma.

      Thus, gamma correction sometimes happens before the frame buffer,
      sometimes after.	As long as images created in a particular
      environment are always displayed in that environment, everything
      is fine.	But when people try to exchange images, differences in
      gamma correction conventions often result in images that seem far
      too bright and washed out, or far too dark and contrasty.




Boutell, et. al.	     Informational		       [Page 84]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   Gamma-encoded samples are good

      So, is it better to do gamma correction before or after the frame
      buffer?

      In an ideal world, sample values would be stored in floating
      point, there would be lots of precision, and it wouldn't really
      matter much.  But in reality, we're always trying to store images
      in as few bits as we can.

      If we decide to use samples that are linearly proportional to
      intensity, and do the gamma correction in the frame buffer LUT, it
      turns out that we need to use at least 12 bits for each of red,
      green, and blue to have enough precision in intensity.  With any
      less than that, we will sometimes see "contour bands" or "Mach
      bands" in the darker areas of the image, where two adjacent sample
      values are still far enough apart in intensity for the difference
      to be visible.

      However, through an interesting coincidence, the human eye's
      subjective perception of brightness is related to the physical
      stimulation of light intensity in a manner that is very much like
      the power function used for gamma correction.  If we apply gamma
      correction to measured (or calculated) light intensity before
      quantizing to an integer for storage in a frame buffer, we can get
      away with using many fewer bits to store the image.  In fact, 8
      bits per color is almost always sufficient to avoid contouring
      artifacts.  This is because, since gamma correction is so closely
      related to human perception, we are assigning our 256 available
      sample codes to intensity values in a manner that approximates how
      visible those intensity changes are to the eye.  Compared to a
      linear-sample image, we allocate fewer sample values to brighter
      parts of the tonal range and more sample values to the darker
      portions of the tonal range.

      Thus, for the same apparent image quality, images using gamma-
      encoded sample values need only about two-thirds as many bits of
      storage as images using linear samples.













Boutell, et. al.	     Informational		       [Page 85]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   General gamma handling

      When more than two nonlinear transfer functions are involved in
      the image pipeline, the term "gamma correction" becomes too vague.
      If we consider a pipeline that involves capturing (or calculating)
      an image, storing it in an image file, reading the file, and
      displaying the image on some sort of display screen, there are at
      least 5 places in the pipeline that could have nonlinear transfer
      functions.  Let's give each a specific name for their
      characteristic gamma:

      camera_gamma
	 the characteristic of the image sensor

      encoding_gamma
	 the gamma of any transformation performed by the software
	 writing the image file

      decoding_gamma
	 the gamma of any transformation performed by the software
	 reading the image file

      LUT_gamma
	 the gamma of the frame buffer LUT, if present

      CRT_gamma
	 the gamma of the CRT, generally 2.5

      In addition, let's add a few other names:

      file_gamma
	 the gamma of the image in the file, relative to the original
	 scene.  This is

	    file_gamma = camera_gamma * encoding_gamma

      display_gamma
	 the gamma of the "display system" downstream of the frame
	 buffer.  This is

	    display_gamma = LUT_gamma * CRT_gamma

      viewing_gamma
	 the overall gamma that we want to obtain to produce pleasing
	 images --- generally 1.0 to 1.5.






Boutell, et. al.	     Informational		       [Page 86]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      The file_gamma value, as defined above, is what goes in the gAMA
      chunk in a PNG file.  If file_gamma is not 1.0, we know that gamma
      correction has been done on the sample values in the file, and we
      could call them "gamma corrected" samples.  However, since there
      can be so many different values of gamma in the image display
      chain, and some of them are not known at the time the image is
      written, the samples are not really being "corrected" for a
      specific display condition.  We are really using a power function
      in the process of encoding an intensity range into a small integer
      field, and so it is more correct to say "gamma encoded" samples
      instead of "gamma corrected" samples.

      When displaying an image file, the image decoding program is
      responsible for making the overall gamma of the system equal to
      the desired viewing_gamma, by selecting the decoding_gamma
      appropriately.  When displaying a PNG file, the gAMA chunk
      provides the file_gamma value.  The display_gamma may be known for
      this machine, or it might be obtained from the system software, or
      the user might have to be asked what it is.  The correct
      viewing_gamma depends on lighting conditions, and that will
      generally have to come from the user.

      Ultimately, you should have

	 file_gamma * decoding_gamma * display_gamma = viewing_gamma

   Some specific examples

      In digital video systems, camera_gamma is about 0.5 by declaration
      of the various video standards documents.  CRT_gamma is 2.5 as
      usual, while encoding_gamma, decoding_gamma, and LUT_gamma are all
      1.0.  As a result, viewing_gamma ends up being about 1.25.

      On frame buffers that have hardware gamma correction tables, and
      that are calibrated to display linear samples correctly,
      display_gamma is 1.0.

      Many workstations and X terminals and PC displays lack gamma
      correction lookup tables.  Here, LUT_gamma is always 1.0, so
      display_gamma is 2.5.











Boutell, et. al.	     Informational		       [Page 87]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      On the Macintosh, there is a LUT.  By default, it is loaded with a
      table whose gamma is about 0.72, giving a display_gamma (LUT and
      CRT combined) of about 1.8.  Some Macs have a "Gamma" control
      panel that allows gamma to be changed to 1.0, 1.2, 1.4, 1.8, or
      2.2.  These settings load alternate LUTs that are designed to give
      a display_gamma that is equal to the label on the selected button.
      Thus, the "Gamma" control panel setting can be used directly as
      display_gamma in decoder calculations.

      On recent SGI systems, there is a hardware gamma-correction table
      whose contents are controlled by the (privileged) "gamma" program.
      The gamma of the table is actually the reciprocal of the number
      that "gamma" prints, and it does not include the CRT gamma. To
      obtain the display_gamma, you need to find the SGI system gamma
      (either by looking in a file, or asking the user) and then
      calculating

	 display_gamma = 2.5 / SGI_system_gamma

      You will find SGI systems with the system gamma set to 1.0 and 2.2
      (or higher), but the default when machines are shipped is 1.7.

   A note about video gamma

      The original NTSC video standards specified a simple power-law
      camera transfer function with a gamma of 1/2.2 or 0.45.  This is
      not possible to implement exactly in analog hardware because the
      function has infinite slope at x=0, so all cameras deviated to
      some degree from this ideal.  More recently, a new camera transfer
      function that is physically realizable has been accepted as a
      standard [SMPTE-170M].  It is

	 Vout = 4.5 * Vin		     if Vin < 0.018
	 Vout = 1.099 * (Vin^0.45) - 0.099   if Vin >= 0.018

      where Vin and Vout are measured on a scale of 0 to 1.  Although
      the exponent remains 0.45, the multiplication and subtraction
      change the shape of the transfer function, so it is no longer a
      pure power function.  If you want to perform extremely precise
      calculations on video signals, you should use the expression above
      (or its inverse, as required).

      However, PNG does not provide a way to specify that an image uses
      this exact transfer function; the gAMA chunk always assumes a pure
      power-law function. If we plot the two-part transfer function
      above along with the family of pure power functions, we find that
      a power function with a gamma of about 0.5 to 0.52 (not 0.45) most
      closely approximates the transfer function.  Thus, when writing a



Boutell, et. al.	     Informational		       [Page 88]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      PNG file with data obtained from digitizing the output of a modern
      video camera, the gAMA chunk should contain 0.5 or 0.52, not 0.45.
      The remaining difference between the true transfer function and
      the power function is insignificant for almost all purposes.  (In
      fact, the alignment errors in most cameras are likely to be larger
      than the difference between these functions.)  The designers of
      PNG deemed the simplicity and flexibility of a power-law
      definition of gAMA to be more important than being able to
      describe the SMPTE-170M transfer curve exactly.

      The PAL and SECAM video standards specify a power-law camera
      transfer function with a gamma of 1/2.8 or 0.36 --- not the 1/2.2
      of NTSC.	However, this is too low in practice, so real cameras
      are likely to have their gamma set close to NTSC practice.  Just
      guessing 0.45 or 0.5 is likely to give you viewable results, but
      if you want precise values you'll probably have to measure the
      particular camera.

   Further reading

      If you have access to the World Wide Web, read Charles Poynton's
      excellent "Gamma FAQ" [GAMMA-FAQ] for more information about
      gamma.

14. Appendix: Color Tutorial

   (This appendix is not part of the formal PNG specification.)

   About chromaticity

      The cHRM chunk is used, together with the gAMA chunk, to convey
      precise color information so that a PNG image can be displayed or
      printed with better color fidelity than is possible without this
      information.  The preceding chapters state how this information is
      encoded in a PNG image.  This tutorial briefly outlines the
      underlying color theory for those who might not be familiar with
      it.

      Note that displaying an image with incorrect gamma will produce
      much larger color errors than failing to use the chromaticity
      data.  First be sure the monitor set-up and gamma correction are
      right, then worry about chromaticity.

   The problem

      The color of an object depends not only on the precise spectrum of
      light emitted or reflected from it, but also on the observer ---
      their species, what else they can see at the same time, even what



Boutell, et. al.	     Informational		       [Page 89]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      they have recently looked at!  Furthermore, two very different
      spectra can produce exactly the same color sensation.  Color is
      not an objective property of real-world objects; it is a
      subjective, biological sensation.  However, by making some
      simplifying assumptions (such as: we are talking about human
      vision) it is possible to produce a mathematical model of color
      and thereby obtain good color accuracy.

   Device-dependent color

      Display the same RGB data on three different monitors, side by
      side, and you will get a noticeably different color balance on
      each display.  This is because each monitor emits a slightly
      different shade and intensity of red, green, and blue light.  RGB
      is an example of a device-dependent color model --- the color you
      get depends on the device.  This also means that a particular
      color --- represented as say RGB 87, 146, 116 on one monitor ---
      might have to be specified as RGB 98, 123, 104 on another to
      produce the same color.

   Device-independent color

      A full physical description of a color would require specifying
      the exact spectral power distribution of the light source.
      Fortunately, the human eye and brain are not so sensitive as to
      require exact reproduction of a spectrum.  Mathematical, device-
      independent color models exist that describe fairly well how a
      particular color will be seen by humans.	The most important
      device-independent color model, to which all others can be
      related, was developed by the International Lighting Committee
      (CIE, in French) and is called XYZ.

      In XYZ, X is the sum of a weighted power distribution over the
      whole visible spectrum.  So are Y and Z, each with different
      weights.	Thus any arbitrary spectral power distribution is
      condensed down to just three floating point numbers.  The weights
      were derived from color matching experiments done on human
      subjects in the 1920s.  CIE XYZ has been an International Standard
      since 1931, and it has a number of useful properties:

	  * two colors with the same XYZ values will look the same to
	    humans
	  * two colors with different XYZ values will not look the same
	  * the Y value represents all the brightness information
	    (luminance)
	  * the XYZ color of any object can be objectively measured





Boutell, et. al.	     Informational		       [Page 90]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Color models based on XYZ have been used for many years by people
      who need accurate control of color --- lighting engineers for film
      and TV, paint and dyestuffs manufacturers, and so on.  They are
      thus proven in industrial use.  Accurate, device-independent color
      started to spread from high-end, specialized areas into the
      mainstream during the late 1980s and early 1990s, and PNG takes
      notice of that trend.

   Calibrated, device-dependent color

      Traditionally, image file formats have used uncalibrated, device-
      dependent color.	If the precise details of the original display
      device are known, it becomes possible to convert the device-
      dependent colors of a particular image to device-independent ones.
      Making simplifying assumptions, such as working with CRTs (which
      are much easier than printers), all we need to know are the XYZ
      values of each primary color and the CRT_gamma.

      So why does PNG not store images in XYZ instead of RGB?  Well, two
      reasons.	First, storing images in XYZ would require more bits of
      precision, which would make the files bigger.  Second, all
      programs would have to convert the image data before viewing it.
      Whether calibrated or not, all variants of RGB are close enough
      that undemanding viewers can get by with simply displaying the
      data without color correction.  By storing calibrated RGB, PNG
      retains compatibility with existing programs that expect RGB data,
      yet provides enough information for conversion to XYZ in
      applications that need precise colors.  Thus, we get the best of
      both worlds.

   What are chromaticity and luminance?

      Chromaticity is an objective measurement of the color of an
      object, leaving aside the brightness information.  Chromaticity
      uses two parameters x and y, which are readily calculated from
      XYZ:

	 x = X / (X + Y + Z)
	 y = Y / (X + Y + Z)

      XYZ colors having the same chromaticity values will appear to have
      the same hue but can vary in absolute brightness.  Notice that x,y
      are dimensionless ratios, so they have the same values no matter
      what units we've used for X,Y,Z.







Boutell, et. al.	     Informational		       [Page 91]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      The Y value of an XYZ color is directly proportional to its
      absolute brightness and is called the luminance of the color.  We
      can describe a color either by XYZ coordinates or by chromaticity
      x,y plus luminance Y.  The XYZ form has the advantage that it is
      linearly related to (linear, gamma=1.0) RGB color spaces.

   How are computer monitor colors described?

      The "white point" of a monitor is the chromaticity x,y of the
      monitor's nominal white, that is, the color produced when
      R=G=B=maximum.

      It's customary to specify monitor colors by giving the
      chromaticities of the individual phosphors R, G, and B, plus the
      white point.  The white point allows one to infer the relative
      brightnesses of the three phosphors, which isn't determined by
      their chromaticities alone.

      Note that the absolute brightness of the monitor is not specified.
      For computer graphics work, we generally don't care very much
      about absolute brightness levels.  Instead of dealing with
      absolute XYZ values (in which X,Y,Z are expressed in physical
      units of radiated power, such as candelas per square meter), it is
      convenient to work in "relative XYZ" units, where the monitor's
      nominal white is taken to have a luminance (Y) of 1.0.  Given this
      assumption, it's simple to compute XYZ coordinates for the
      monitor's white, red, green, and blue from their chromaticity
      values.

      Why does cHRM use x,y rather than XYZ?  Simply because that is how
      manufacturers print the information in their spec sheets!
      Usually, the first thing a program will do is convert the cHRM
      chromaticities into relative XYZ space.

   What can I do with it?

      If a PNG file has the gAMA and cHRM chunks, the source_RGB values
      can be converted to XYZ.	This lets you:

	  * do accurate grayscale conversion (just use the Y component)
	  * convert to RGB for your own monitor (to see the original
	    colors)
	  * print the image in Level 2 PostScript with better color
	    fidelity than a simple RGB to CMYK conversion could provide
	  * calculate an optimal color palette
	  * pass the image data to a color management system
	  * etc.




Boutell, et. al.	     Informational		       [Page 92]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   How do I convert from source_RGB to XYZ?

      Make a few simplifying assumptions first, like the monitor really
      is jet black with no input and the guns don't interfere with one
      another.	Then, given that you know the CIE XYZ values for each of
      red, green, and blue for a particular monitor, you put them into a
      matrix m:

		 Xr Xg Xb
	    m =  Yr Yg Yb
		 Zr Zg Zb

      Here we assume we are working with linear RGB floating point data
      in the range 0..1.  If the gamma is not 1.0, make it so on the
      floating point data.  Then convert source_RGB to XYZ by matrix
      multiplication:

	    X	  R
	    Y = m G
	    Z	  B

      In other words, X = Xr*R + Xg*G + Xb*B, and similarly for Y and Z.
      You can go the other way too:

	    R	   X
	    G = im Y
	    B	   Z

      where im is the inverse of the matrix m.

   What is a gamut?

      The gamut of a device is the subset of visible colors which that
      device can display.  (It has nothing to do with gamma.)  The gamut
      of an RGB device can be visualized as a polyhedron in XYZ space;
      the vertices correspond to the device's black, blue, red, green,
      magenta, cyan, yellow and white.

      Different devices have different gamuts, in other words one device
      will be able to display certain colors (usually highly saturated
      ones) that another device cannot.  The gamut of a particular RGB
      device can be determined from its R, G, and B chromaticities and
      white point (the same values given in the cHRM chunk).  The gamut
      of a color printer is more complex and can only be determined by
      measurement.  However, printer gamuts are typically smaller than
      monitor gamuts, meaning that there can be many colors in a
      displayable image that cannot physically be printed.




Boutell, et. al.	     Informational		       [Page 93]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      Converting image data from one device to another generally results
      in gamut mismatches --- colors that cannot be represented exactly
      on the destination device.  The process of making the colors fit,
      which can range from a simple clip to elaborate nonlinear scaling
      transformations, is termed gamut mapping.  The aim is to produce a
      reasonable visual representation of the original image.

   Further reading

      References [COLOR-1] through [COLOR-5] provide more detail about
      color theory.

15. Appendix: Sample CRC Code

   The following sample code represents a practical implementation of
   the CRC (Cyclic Redundancy Check) employed in PNG chunks.  (See also
   ISO 3309 [ISO-3309] or ITU-T V.42 [ITU-V42] for a formal
   specification.)

   The sample code is in the ANSI C programming language.  Non C users
   may find it easier to read with these hints:

   &
      Bitwise AND operator.

   ^
      Bitwise exclusive-OR operator.  (Caution: elsewhere in this
      document, ^ represents exponentiation.)

   >>
      Bitwise right shift operator.  When applied to an unsigned
      quantity, as here, right shift inserts zeroes at the left.

   !
      Logical NOT operator.

   ++
      "n++" increments the variable n.

   0xNNN
      0x introduces a hexadecimal (base 16) constant.  Suffix L
      indicates a long value (at least 32 bits).

      /* Table of CRCs of all 8-bit messages. */
      unsigned long crc_table[256];

      /* Flag: has the table been computed? Initially false. */
      int crc_table_computed = 0;



Boutell, et. al.	     Informational		       [Page 94]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      /* Make the table for a fast CRC. */
      void make_crc_table(void)
      {
	unsigned long c;
	int n, k;
	for (n = 0; n < 256; n++) {
	  c = (unsigned long) n;
	  for (k = 0; k < 8; k++) {
	    if (c & 1)
	      c = 0xedb88320L ^ (c >> 1);
	    else
	      c = c >> 1;
	  }
	  crc_table[n] = c;
	}
	crc_table_computed = 1;
      }

      /* Update a running CRC with the bytes buf[0..len-1]--the CRC
	 should be initialized to all 1's, and the transmitted value
	 is the 1's complement of the final running CRC (see the
	 crc() routine below)). */

      unsigned long update_crc(unsigned long crc, unsigned char *buf,
			       int len)
      {
	unsigned long c = crc;
	int n;

	if (!crc_table_computed)
	  make_crc_table();
	for (n = 0; n < len; n++) {
	  c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
	}
	return c;
      }

      /* Return the CRC of the bytes buf[0..len-1]. */
      unsigned long crc(unsigned char *buf, int len)
      {
	return update_crc(0xffffffffL, buf, len) ^ 0xffffffffL;
      }









Boutell, et. al.	     Informational		       [Page 95]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


16. Appendix: Online Resources

   (This appendix is not part of the formal PNG specification.)

   This appendix gives the locations of some Internet resources for PNG
   software developers.  By the nature of the Internet, the list is
   incomplete and subject to change.

   Archive sites

      The latest released versions of this document and related
      information can always be found at the PNG FTP archive site,
      ftp://ftp.uu.net/graphics/png/.  The PNG specification is
      available in several formats, including HTML, plain text, and
      PostScript.

   Reference implementation and test images

      A reference implementation in portable C is available from the PNG
      FTP archive site, ftp://ftp.uu.net/graphics/png/src/.  The
      reference implementation is freely usable in all applications,
      including commercial applications.

      Test images are available from
      ftp://ftp.uu.net/graphics/png/images/.

   Electronic mail

      The maintainers of the PNG specification can be contacted by e-
      mail at png-info@uunet.uu.net or at png-group@w3.org.

   PNG home page

      There is a World Wide Web home page for PNG at
      http://quest.jpl.nasa.gov/PNG/.  This page is a central location
      for current information about PNG and PNG-related tools.

17. Appendix: Revision History

   (This appendix is not part of the formal PNG specification.)

   The PNG format has been frozen since the Ninth Draft of March 7,
   1995, and all future changes are intended to be backwards compatible.
   The revisions since the Ninth Draft are simply clarifications,
   improvements in presentation, and additions of supporting material.

   On 1 October 1996, the PNG specification was approved as a W3C (World
   Wide Web Consortium) Recommendation.



Boutell, et. al.	     Informational		       [Page 96]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   Changes since the Tenth Draft of 5 May, 1995

	  * Clarified meaning of a suggested-palette PLTE chunk in a
	    truecolor image that uses transparency
	  * Clarified exact semantics of sBIT and allowed sample depth
	    scaling procedures
	  * Clarified status of spaces in tEXt chunk keywords
	  * Distinguished private and public extension values in type
	    and method fields
	  * Added a "Creation Time" tEXt keyword
	  * Macintosh representation of PNG specified
	  * Added discussion of security issues
	  * Added more extensive discussion of gamma and chromaticity
	    handling, including tutorial appendixes
	  * Clarified terminology, notably sample depth vs. bit depth
	  * Added a glossary
	  * Editing and reformatting

18. References

   [COLOR-1]
      Hall, Roy, Illumination and Color in Computer Generated Imagery.
      Springer-Verlag, New York, 1989.	ISBN 0-387-96774-5.

   [COLOR-2]
      Kasson, J., and W. Plouffe, "An Analysis of Selected Computer
      Interchange Color Spaces", ACM Transactions on Graphics, vol 11 no
      4 (1992), pp 373-405.

   [COLOR-3]
      Lilley, C., F. Lin, W.T. Hewitt, and T.L.J. Howard, Colour in
      Computer Graphics. CVCP, Sheffield, 1993.  ISBN 1-85889-022-5.
      Also available from
      <URL:http://info.mcc.ac.uk/CGU/ITTI/Col/colour_announce.html>

   [COLOR-4]
      Stone, M.C., W.B. Cowan, and J.C. Beatty, "Color gamut mapping and
      the printing of digital images", ACM Transactions on Graphics, vol
      7 no 3 (1988), pp 249-292.

   [COLOR-5]
      Travis, David, Effective Color Displays --- Theory and Practice.
      Academic Press, London, 1991.  ISBN 0-12-697690-2.

   [GAMMA-FAQ]
      Poynton, C., "Gamma FAQ".
      <URL:http://www.inforamp.net/%7Epoynton/Poynton-colour.html>




Boutell, et. al.	     Informational		       [Page 97]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   [ISO-3309]
      International Organization for Standardization, "Information
      Processing Systems --- Data Communication High-Level Data Link
      Control Procedure --- Frame Structure", IS 3309, October 1984, 3rd
      Edition.

   [ISO-8859]
      International Organization for Standardization, "Information
      Processing --- 8-bit Single-Byte Coded Graphic Character Sets ---
      Part 1: Latin Alphabet No. 1", IS 8859-1, 1987.
      Also see sample files at
      ftp://ftp.uu.net/graphics/png/documents/iso_8859-1.*

   [ITU-BT709]
      International Telecommunications Union, "Basic Parameter Values
      for the HDTV Standard for the Studio and for International
      Programme Exchange", ITU-R Recommendation BT.709 (formerly CCIR
      Rec. 709), 1990.

   [ITU-V42]
      International Telecommunications Union, "Error-correcting
      Procedures for DCEs Using Asynchronous-to-Synchronous Conversion",
      ITU-T Recommendation V.42, 1994, Rev. 1.

   [PAETH]
      Paeth, A.W., "Image File Compression Made Easy", in Graphics Gems
      II, James Arvo, editor.  Academic Press, San Diego, 1991.  ISBN
      0-12-064480-0.

   [POSTSCRIPT]
      Adobe Systems Incorporated, PostScript Language Reference Manual,
      2nd edition. Addison-Wesley, Reading, 1990.  ISBN 0-201-18127-4.

   [PNG-EXTENSIONS]
      PNG Group, "PNG Special-Purpose Public Chunks".  Available in
      several formats from
      ftp://ftp.uu.net/graphics/png/documents/pngextensions.*

   [RFC-1123]
      Braden, R., Editor, "Requirements for Internet Hosts ---
      Application and Support", STD 3, RFC 1123, USC/Information
      Sciences Institute, October 1989.
      <URL:ftp://ds.internic.net/rfc/rfc1123.txt>








Boutell, et. al.	     Informational		       [Page 98]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   [RFC-2045]
      Freed, N., and N. Borenstein, "Multipurpose Internet Mail
      Extensions (MIME) Part One: Format of Internet Message Bodies",
      RFC 2045, Innosoft, First Virtual, November 1996.
      <URL:ftp://ds.internic.net/rfc/rfc2045.txt>

   [RFC-2048]
      Freed, N., Klensin, J., and J. Postel, "Multipurpose Internet Mail
      Extensions (MIME) Part Four: Registration Procedures", RFC 2048,
      Innosoft, MCI, USC/Information Sciences Institute, November 1996.
      <URL:ftp://ds.internic.net/rfc/rfc2048.txt>

   [RFC-1950]
      Deutsch, P. and J-L. Gailly, "ZLIB Compressed Data Format
      Specification version 3.3", RFC 1950, Aladdin Enterprises, May
      1996.
      <URL:ftp://ds.internic.net/rfc/rfc1950.txt>

   [RFC-1951]
      Deutsch, P., "DEFLATE Compressed Data Format Specification version
      1.3", RFC 1951, Aladdin Enterprises, May 1996.
      <URL:ftp://ds.internic.net/rfc/rfc1951.txt>

   [SMPTE-170M]
      Society of Motion Picture and Television Engineers, "Television
      --- Composite Analog Video Signal --- NTSC for Studio
      Applications", SMPTE-170M, 1994.
























Boutell, et. al.	     Informational		       [Page 99]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


19. Credits

   Editor

      Thomas Boutell, boutell@boutell.com

   Contributing Editor

      Tom Lane, tgl@sss.pgh.pa.us

   Authors

      Authors' names are presented in alphabetical order.

	  * Mark Adler, madler@alumni.caltech.edu
	  * Thomas Boutell, boutell@boutell.com
	  * Christian Brunschen, cb@df.lth.se
	  * Adam M. Costello, amc@cs.berkeley.edu
	  * Lee Daniel Crocker, lee@piclab.com
	  * Andreas Dilger, adilger@enel.ucalgary.ca
	  * Oliver Fromme, fromme@rz.tu-clausthal.de
	  * Jean-loup Gailly, gzip@prep.ai.mit.edu
	  * Chris Herborth, chrish@qnx.com
	  * Alex Jakulin, Aleks.Jakulin@snet.fri.uni-lj.si
	  * Neal Kettler, kettler@cs.colostate.edu
	  * Tom Lane, tgl@sss.pgh.pa.us
	  * Alexander Lehmann, alex@hal.rhein-main.de
	  * Chris Lilley, chris@w3.org
	  * Dave Martindale, davem@cs.ubc.ca
	  * Owen Mortensen, 104707.650@compuserve.com
	  * Keith S. Pickens, ksp@swri.edu
	  * Robert P. Poole, lionboy@primenet.com
	  * Glenn Randers-Pehrson, glennrp@arl.mil or
	    randeg@alumni.rpi.edu
	  * Greg Roelofs, newt@pobox.com
	  * Willem van Schaik, willem@gintic.gov.sg
	  * Guy Schalnat
	  * Paul Schmidt, pschmidt@photodex.com
	  * Tim Wegner, 71320.675@compuserve.com
	  * Jeremy Wohl, jeremyw@anders.com

      The authors wish to acknowledge the contributions of the Portable
      Network Graphics mailing list, the readers of comp.graphics, and
      the members of the World Wide Web Consortium (W3C).







Boutell, et. al.	     Informational		      [Page 100]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


      The Adam7 interlacing scheme is not patented and it is not the
      intention of the originator of that scheme to patent it. The
      scheme may be freely used by all PNG implementations. The name
      "Adam7" may be freely used to describe interlace method 1 of the
      PNG specification.

   Trademarks

      GIF is a service mark of CompuServe Incorporated.  IBM PC is a
      trademark of International Business Machines Corporation.
      Macintosh is a trademark of Apple Computer, Inc.	Microsoft and
      MS-DOS are trademarks of Microsoft Corporation.  PhotoCD is a
      trademark of Eastman Kodak Company.  PostScript and TIFF are
      trademarks of Adobe Systems Incorporated.  SGI is a trademark of
      Silicon Graphics, Inc.  X Window System is a trademark of the
      Massachusetts Institute of Technology.

COPYRIGHT NOTICE

   Copyright (c) 1996 by: Massachusetts Institute of Technology (MIT)

   This W3C specification is being provided by the copyright holders
   under the following license. By obtaining, using and/or copying this
   specification, you agree that you have read, understood, and will
   comply with the following terms and conditions:

   Permission to use, copy, and distribute this specification for any
   purpose and without fee or royalty is hereby granted, provided that
   the full text of this NOTICE appears on ALL copies of the
   specification or portions thereof, including modifications, that you
   make.

   THIS SPECIFICATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO
   REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF
   EXAMPLE, BUT NOT LIMITATION, COPYRIGHT HOLDERS MAKE NO
   REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY
   PARTICULAR PURPOSE OR THAT THE USE OF THE SPECIFICATION WILL NOT
   INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER
   RIGHTS.  COPYRIGHT HOLDERS WILL BEAR NO LIABILITY FOR ANY USE OF THIS
   SPECIFICATION.











Boutell, et. al.	     Informational		      [Page 101]

RFC 2083	    PNG: Portable Network Graphics	      March 1997


   The name and trademarks of copyright holders may NOT be used in
   advertising or publicity pertaining to the specification without
   specific, written prior permission.	Title to copyright in this
   specification and any associated documentation will at all times
   remain with copyright holders.

Security Considerations

   Security issues are discussed in Security considerations (Section
   8.5).

Author's Address

   Thomas Boutell
   PO Box 20837
   Seattle, WA	98102

   Phone: (206) 329-4969
   EMail: boutell@boutell.com
































Boutell, et. al.	     Informational		      [Page 102]


Added freshlib/_doc/RectanglesListProcessing.ods.

cannot compute difference between binary files

Added freshlib/_doc/compiler.wiki.





































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<nowiki>
<a name="data"><h1>FreshLib directory: compiler</h1></a>
<p>This directory contains only one macro library: "executable.inc"</p>
<p>This library defines the macros that are going to be used for creating the main structure of the program. These macros are OS dependent as long as the type of the executable file is OS dependent: PE for Win32 and ELF for Linux.</p>
<p>Every one of the macros from this library should be used only once in the program.</p>

<h3>FreshLib Executable macros</h3>
<p>This macro library contains:</p>
<a name="_BinaryType"><h4>_BinaryType</h4></a>
<pre class="fasm-code">macro _BinaryType type</pre>
<p>This macro sets the type of the executable. The argument <span class="variable">type</span> can accept one of the following values: <span class="constant">GUI</span>, <span class="constant">console</span> or <span class="constant">DLL</span>.</p>
<p>This macro defines also the entry label of the program. This label is fixed to <span class="constant">start:</span></p>
<p>For example, following code will tell the compiler to compile the program as a GUI application:</p>
<pre class="fasm-code">
include 'compiler/executable.inc'
_BinaryType GUI
</pre>

<a name="_CodeSection"><h4>_CodeSection</h4></a>
<pre class="fasm-code">macro _CodeSection</pre>
<p>This macro defines the section where the code of the program to be  placed.</p>
<p>Actually this section is the main section of the project. Here should be included all used libraries and other project files.</p>

<a name="_DataSection"><h4>_DataSection</h4></a>
<pre class="fasm-code">macro _DataSection</pre>

<p>This macro defines the section where the data of the program to be  placed. The common way to use this section is to use inside the macro <span class="procedure">IncludeAllGlobals</span> that will allow you to use data defining macros from every place inside the source and leave the compiler to order this data properly for you.</p>
<p>For details on using global data definition macros see: <a href="macros.html#_globals">_globals.inc</a></p>

<a name="_ImportSection"><h4>_ImportSection</h4></a>
<pre class="fasm-code">macro _ImportSection</pre>
<p>This macro defines the section where to be inserted the list with functions dynamically imported from external libraries.</p>
<p>Usually you only have to include here the library "allimports.asm"  and the compiler will import for you only those functions that are used in the project.</p>
</nowiki>

Added freshlib/_doc/data.wiki.





























































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
<nowiki>
<table class="index" align="right">
	<tr><td class="index"><p></p>
		<b><a href="freshlib_reference.wiki">FreshLib</a>:Data:</b><br />
		<a href="#Arrays">Arrays</a><br />
		<a href="#Strings">Strings</a><br />
	</p></td></tr>
</table>
<a name="data"><h1>FreshLib directory: data</h1></a>
<p>This directory contains data handling routines and useful data structures. Actually it contains two abstract data structures: Arrays and Strings.</p>
<p class="note">Current implementation is fully portable: it does not contain any OS dependent code.</p>
<a name="Arrays"><h2>FreshLib Arrays</h2></a>
<p>The FreshLib <b>Arrays</b> data structure handles dynamic arrays that contain elements of arbitrary size.</p>
<h3>Structure</h3>
<p>The following structure represents the header of the array. The actual array will have arbitrary size, depending on the element count and size.</p>
<pre class="fasm-code">
struct TArray
  .count     dd ?
  .capacity  dd ?
  .itemsize  dd ?
  .lparam    dd ?
  label .array dword
ends
</pre>

<p>The first element of the array begins on offset <span class="variable">TArray.array</span> from the begining of the memory block.</p>
<p>The field <span class="variable">TArray.count</span> contains the current element count of the array.</p>
<p>The field <span class="variable">TArray.capacity</span> contains the current capacity of the array. It is because the library usually allocates more memory than is needed for the array element count. This approach reduces memory allocations and reallocations and thus increases the speed of inserting and deleting elements in the array. How many memory will be allocated depends on the user setting of the variable <span class="variable">ResizeIt</span> (defined in <a  href="system.html#memory">memory.asm</a>). This variable contains a pointer to the procedure that simply increases the value of <span class="register">ECX</span> to the next suitable value.</p>
<p>The field <span class="variable">TArray.itemsize</span> contains the size in bytes of one array element. Changing of this value is not recommended.</p>
<p>The field <span class="variable">TArray.lparam</span> is for user defined parameter, associated with the array.</p>

<h3>Procedures</h3>

<a name="CreateArray"><h4>CreateArray</h4></a>
<pre class="fasm-code">
proc CreateArray, .itemSize
</pre>
<p>This procedure creates new array with item size <span class="variable">[.ItemSize]</span></p>
<p>The procedure returns <span class="flag">CF=0</span> if the array is properly created and pointer to the array is placed in <span class="register">EAX</span>.</p>
<p>In case the memory cannot be allocated, the procedure returns <span class="flag">CF=1</span>.</p>
<p>The array must be freed after use. There is no special procedure for array free. Use <span class="procedure">FreeMem</span> procedure to free array memory after use.</p>

<a name="AddArrayItems"><h4>AddArrayItems</h4></a>
<pre class="fasm-code">
proc AddArrayItems, .ptrArray, .count
</pre>
<p>This procedure adds new array items at the end of the array pointed by <span class="variable">[.ptrArray]</span></p>
<p>The procedure returns two values:</p>
<p><span class="register">EAX</span> contains pointer to the first of the new appended elements.</p>
<p><span class="register">EDX</span> contains pointer to the array (in the process of appending of the new element, it is possible the whole array to be moved to the new address in memory, so the programmer should store the value of <span class="register">EDX</span> for the future reference to the array.</p>
<p>In case, the new memory can not be allocated, the procedure returns <span class="flag">CF=1</span> and <span class="register">EDX</span> contains the proper pointer to the original array.</p>

<a name="InsertArrayItems"><h4>InsertArrayItems</h4></a>
<pre class="fasm-code">
proc InsertArrayItems, .ptrArray, .iElement, .count
</pre>
<p>This procedure inserts [.count] new elements at the <span class="variable">[.iElement]</span> position of the array pointed by <span class="variable">[.ptrArray]</span></p>
<p>If <span class="variable">[.iElement]</span> is larger or equal to <span class="variable">[TArray.count]</span> the elements are appended at the end of the array. (Just like AddArrayItems)  Otherwise, all elements are moved  to make room for the new elements.</p>
<p>The procedure returns exactly the same results as <span class="procedure">AddArrayItems</span> procedure  <span class="register">EDX</span>  points to the array and <span class="register">EAX</span>  points to the first of the new inserted elements.</p>
<p><span class="flag">CF</span> is error flag.</p>

<a name="DeleteArrayItems"><h4>DeleteArrayItems</h4></a>
<pre class="fasm-code">
proc DeleteArrayItems, .ptrArray, .iElement, .count
</pre>
<p>This procedure deletes [.count] items with begin index <span class="variable">[.iElement]</span> the <span class="variable">[.ptrArray]</span> dynamic array.  If the capacity of the array is bigger than the recommended for the new count, then the array is resized. The recommended size is calculated using ResizeIt procedure from memory library.</p>
<p>Returns <span class="register">EDX</span> - pointer to the TArray. In the most cases this pointer will not be changed, but this also depends on the current OS memory allocation API, so it is safer to store the pointer for future use, instead of one passed to the procedure.</p>
<p>This procedure can not fail, because deleting element is always possible. In some rare cases it can fail to reallocate smaller memory block, but this is not a problem for the array consistency.</p>

<a name="VacuumArray"><h4>VacuumArray</h4></a>
<pre class="fasm-code">
proc VacuumArray, .ptrArray
</pre>
<p>This procedure removes the reserved memory from the array in order to make it as small as possible. This operation should be executed only if there will be no more inserts in the array. The memory economized this way depends on reallocation strategy and can be from 25 to 100% in some cases.</p>

<a name="ListIndexOf"><h4>ListIndexOf</h4></a>
<pre class="fasm-code">
proc ListIndexOf, .ptrList, .Item
</pre>
<p>The list is a special case of array with item size equal to 4 bytes (dword). This procedure searches the list <span class="variable">[.ptrList]</span> for item equal to <span class="variable">[.Item]</span> and returns the index of the element in <span class="register">EAX</span>. In case of error  <span class="flag">CF=1</span>.</p>

<a name="ListFree"><h4>ListFree</h4></a>
<pre class="fasm-code">
proc ListFree, .ptrList, .FreeProc
</pre>
<p>Frees all elements of the list <span class="variable">[.ptrList]</span>, calling <span class="variable">[.FreeProc]</span> for every element of the list.</p>
<p>FreeProc callback procedure have one argument of type dword that is the value of the current list element. The definition of the callback procedure is similar to following:</p>
<pre class="fasm-code">
proc FreeMyListItem, .ptrItem
begin
	;do something with the item being freed
	return
endp
</pre>

<a name="Strings"><h2>FreshLib Strings</h2></a>
<p>Using strings in assembler was often problematic for programmers - static strings can't be resized, so they had to reserve as many bytes as they thought user could need, and it still could be not enough. Thus we created StrLib - a library that operates on dynamic strings, that are automatically resized when needed. Also, StrLib contains many functions that perform string comparison, inserting one string into another, and more. And most of this functions can operate on static strings too. StrLib uses "memory.asm" library for memory allocations and does not contains any OS dependent code.</p>
<p class="note">FreshLib Strings uses FreshLib Arrays to handle the list with pointers to allocated string memory.</p>

<h3>StrLib string format</h3>
<p>The strings used in StrLib are implemented using a specific structure, compatible but not equal to AsciiZ, used by Windows API. The string structure is defined in the following way:</p>
<pre class="fasm-code">
struc string {
  .capacity dd ?
  .len      dd ?
  label .data byte
}

virtual at -(sizeof.string)
  string string
  sizeof.string = $-string
end virtual
</pre>

<p>The string data is placed on offset 0 to the pointer of the string. Its label is "string.data". The string data always is terminated by at least one zero byte and the length of the memory buffer is always dword aligned. 
It is safe to process the string data by dword instructions.</p>
<p>On offset [string-4] is located a dword field, that contains the length of the string data, not including the terminating zero bytes.</p>
<p>On offset [string-8] is located a dword with the capacity of the memory allocated for the string.</p>
<p>These fields are accessible by its symbolic names: string.len and string.capacity; This fields are for internal use only  it is not safe for the user to change the values of these fields.</p>
<p>Using special field that to keep the length of the string makes some of the string operations extremely fast, because searching for the terminating zero is very slow operation. </p>
<p>All procedures in StrLib compute the proper value for <span class="variable">[.len]</span> field and never search for the terminating zeros, except for the AsciiZ strings that are external towards StrLib  those returned from the OS API functions or by string constants in memory.</p>

<h3>StrLib string handles</h3>
<p>The string in StrLib is identified not with its pointer, but by a handle. While the pointer can be changed when the string memory is reallocated, the handle is always a constant for the whole life cycle of the string.</p>
<p>There is a procedure that extracts the current pointer of the string by its handle.</p>
<p>	Because handle values never collides with memory addresses, almost all StrLib procedures can work with handles and with memory pointers at the same time.</p>
<p>For the strings passed to the procedures with memory pointer, StrLib assumes they are static strings from memory, or returned from the OS. </p>
<p>Because of this assumption, StrLib process these strings safely and slowly  scans the string to determine the length, assumes it is byte aligned etc. In other words it process it as a standard AsciiZ string.</p>

<h3>StrLib procedures</h3>
<a name="StrNew"><h4>StrNew</h4></a>
<pre class="fasm-code">proc StrNew</pre>
<p>Creates new string and returns handle in <span class="register">EAX</span>.</p> 

<a name="StrPtr"><h4>StrPtr</h4></a>
<pre class="fasm-code">proc StrPtr, .hString</pre>
<p>Returns the current pointer to the string with handle <span class="variable">[.hString]</span>.</p>
<p>If <span class="variable">[.hString]</span> looks like a valid handle, but it is not found in the strings table, the procedure returns <span class="flag">CF=1</span>.</p>

<a name="StrDel"><h4>StrDel</h4></a>
<pre class="fasm-code">proc StrDel, .hString</pre>
<p>Deletes the string with handle <span class="variable">[.hString]</span> and frees all allocated memory. If <span class="variable">[.hString]</span> is a pointer, it tries to search the strings table for the given handle and deletes it.</p>
<p>If a string is not found, the procedure does not return an error.</p>

<a name="StrDup"><h4>StrDup</h4></a>
<pre class="fasm-code">proc StrDup, .hSource</pre>
<p>Creates a duplicate of the string <span class="variable">.hSource</span>. Returns a handle to the new created string in <span class="register">EAX</span>.</p>

<a name="StrLen"><h4>StrLen</h4></a>
<pre class="fasm-code">proc StrLen, .hString</pre>
<p>Returns the length of the string <span class="variable">[.hString]</span>. If the handle is valid, it returns the value of the field <span class="variable">[string.len]</span>. If <span class="variable">[.hString]</span> is a pointer, it computes the length by scanning the string up to the zero terminator.</p>

<a name="StrFixLen"><h4>StrFixLen</h4></a>
<pre class="fasm-code">proc StrFixLen, .hString</pre>
<p>This procedure scans the length of zero terminated string and "fixes" <span class="variable">[string.len]</span> field. StrFixLen should be call when the content of the string is created by an external call, for example a Win32 API function.</p>

<a name="StrSetCapacity"><h4>StrSetCapacity</h4></a>
<pre class="fasm-code">proc StrSetCapacity, .hString, .capacity</pre>
<p>If the capacity of <span class="variable">[.hString]</span> is larger than the requested capacity it does nothing.</p>
<p>If the capacity of <span class="variable">[.hString]</span> is smaller than the requested capacity, it sets the capacity of the string to the requested value.</p>
<p>Returns a pointer to the string after reallocation in <span class="register">EAX</span>.</p>
<p><span class="variable">.hString</span> is a handle to the string that have to be resized. Pointers are not acceptable here.</p>
<p><span class="variable">.capacity</span> contains requested capacity for the string.</p>
<p>If returns <span class="flag">CF=1</span> the reallocation failed. <span class="register">EAX</span> still contains the pointer to the string, but the string was not resized.</p>

<a name="StrCopy"><h4>StrCopy</h4></a>
<pre class="fasm-code">proc StrCopy, .dest, .source</pre>
<p>Copies the content of <span class="variable">[.source]</span> string to <span class="variable">[.destination]</span> string.</p>

<a name="StrCompCase"><h4>StrCompCase</h4></a>
<pre class="fasm-code">proc StrCompCase, .str1, .str2</pre>
<p>Compares the content of two strings <span class="variable">[.str1]</span> and <span class="variable">[.str2]</span> case sensitive.</p>
<p>Returns:</p> 
<p><span class="flag">CF=1</span> if the strings are EQUAL.</p>  
<p><span class="flag">CF=0</span> if the strings are NOT equal.</p> 

<a name="StrCompNoCase"><h4>StrCompNoCase</h4></a>
<pre class="fasm-code">proc StrCompNoCase, .str1, .str2</pre>
<p>Compares the content of two strings <span class="variable">[.str1]</span> and <span class="variable">[.str2]</span> case NOT sensitive.</p>
<p>Returns:</p>
<p><span class="flag">CF=1</span> if the strings are EQUAL</p>
<p><span class="flag">CF=0</span> if the strings are NOT equal.</p>

<a name="SetString"><h4>SetString</h4></a>
<pre class="fasm-code">proc SetString, .ptrHString, .ptrSource</pre>
<p>Creates string and assigns it to variable. If the variable already contains string handle, the old string will be  reused. Copies the content of <span class="variable">[.ptrSource]</span> to the string variable.</p>
<p>Arguments:</p>
<p><span class="variable">.ptrHString</span>  pointer to the variable that contains string handle.</p>
<p><span class="variable">.ptrSource</span>  pointer to the source for string.</p>

<a name="StrCat"><h4>StrCat</h4></a>
<pre class="fasm-code">proc StrCat, .dest, .source</pre>
<p>Concatenates two strings. The operation is: destination = destination + source.</p>
<p>The destination string <span class="variable">[.dest]</span> can be only handle. <span class="variable">[.source]</span> can be handle or pointer.</p>

<a name="StrCharPos"><h4>StrCharPos</h4></a>
<pre class="fasm-code">proc StrCharPos, .hString, .char</pre>
<p>StrCharPos returns a pointer to the first occurrence of a given char in specified string.</p>
<p>Arguments:</p>
<p><span class="variable">.hString</span> -  string to search</p>
<p><span class="variable">.char</span> - char to look for</p>
<p>Returns:</p>
<p>A pointer to the char in source, or <span class="constant">NULL</span> if char doesn't occur in the given string.</p>

<a name="StrPos"><h4>StrPos</h4></a>
<pre class="fasm-code">proc StrPos, .hString, .hPattern</pre>
<p>StrPos returns a pointer to the first occurrence of a <span class="variable">.hPattern</span> string in <span class="variable">.hString</span>.
<p>Arguments:</p>
<p>hPattern - 'pattern' string</p>
<p>hString -  string to search</p>
<p>Returns:</p>
<p>Pointer to the pattern string in source, or <span class="constant">NULL</span> if pattern string doesn't occur in the string to search.</p>

<a name="StrCopyPart"><h4>StrCopyPart</h4></a>
<pre class="fasm-code">proc StrCopyPart, .dest, .source, .pos, .len</pre>
<p>Copies part of the source string to the destination string.</p>
<p>Arguments:</p>
<p><span class="variable">.dest</span>  handle to destination string.</p>
<p><span class="variable">.source</span>  handle or pointer to the source string.</p>
<p><span class="variable">.pos</span>  Source part start position.</p>
<p><span class="variable">.len</span>  length of the copied part.</p>
<p>Returns nothing.</p>

<a name="StrExtract"><h4>StrExtract</h4></a>
<pre class="fasm-code">proc StrExtract, .string, .pos, .len</pre>
<p>The same as StrCopyPart, but creates and returns new string with extracted part of the source <span class="variable">[.string]</span></p>
<p>Returns the new created string in <span class="register">EAX</span>.</p>

<a name="StrSplit"><h4>StrSplit</h4></a>
<pre class="fasm-code">proc StrSplit, .hString, .pos</pre>
<p>Splits the string on two strings, at position <span class="variable">[.pos]</span></p>
<p>Arguments:
<p><span class="variable">.hString</span>  handle of the string to be split.</p>
<p><span class="variable">.pos</span>      -  position where to split the string.</p>
<p>Returns:
<p><span class="register">EAX</span> - handle to the new created string with second part of the string. The original string does not reallocate memory and it's capacity and the pointer will remains the same.</p>

<a name="StrInsert"><h4>StrInsert</h4></a>
<pre class="fasm-code">proc StrInsert, .dest, .source, .pos</pre>
<p>Inserts the string <span class="variable">[.source]</span> into the string <span class="variable">[.dest]</span> at position [.pos]</span></p>

<a name="StrLCase"><h4>StrLCase</h4></a>
<pre class="fasm-code">proc StrLCase, .hString</pre>
<p>Converts <span class="variable">[.hString]</span> to lower case.</p>


<a name="StrUCase"><h4>StrUCase</h4></a>
<pre class="fasm-code">proc StrUCase, .hString</pre>
<p>Converts <span class="variable">[.hString]</span> to upper case.</p>

<a name="NumToStr"><h4>NumToStr</h4></a>
<pre class="fasm-code">proc NumToStr, .num, .flags</pre>
<p>Converts the given number to a string representing it.</p>
<p><span class="variable">[.flags]</span> controls how the number to be converted.</p> 
<p>The procedure returns a handle to the string in <span class="register">EAX</span> and direct pointer to the string in <span class="register">EAX</span>.</p>
<p>The <span class="variable">[.flags]</span> is a dword with following format:</p>
<p>The LSB contains the number of digits, the number must have, if ntsFixedWidth flag is specified.</p>
<p>Second byte of <span class="variable">[.flags]</span> contains the radix that to be used for conversion.</p>
<p>The third and the fourth bytes are reserved for bit flags.</p>
<p>Following constants are predefined in StrLib in order to set the value for <span class="variable">[.flags]</span>:</p>
<table style="margin-left: 40px;">
<tr><td><span class="constant">ntsSigned</span></td><td>converts number in signed format.</td><td align="right">$00000</td></tr>
<tr><td><span class="constant">ntsUnsigned</span></td><td>converts number in unsigned format.</td><td align="right">$10000</td></tr>
<tr><td><span class="constant">ntsFixedWidth</span></td><td>the count of the digits is fixed.</td><td align="right">$20000</td></tr>
<tr><td><span class="constant">ntsBin</span></td><td>for binary number</td><td align="right">$0200</td></tr>
<tr><td><span class="constant">ntsQuad</span></td><td>for quad number</td><td align="right">$0400</td></tr>
<tr><td><span class="constant">ntsOct</span></td><td>for octal number</td><td align="right">$0800</td></tr>
<tr><td><span class="constant">ntsDec</span></td><td>for decimal number</td><td align="right">$0a00</td></tr>
<tr><td><span class="constant">ntsHex</span></td><td>for hexadecimal number</td><td align="right">$1000</td></tr>
</table>
<p>Example:</p>
<pre class="fasm-code">stdcall NumToStr,<span class="register">EAX</span>,	ntsDec or ntsFixedWidth or 8</pre>
<p>This example will convert the number in <span class="register">EAX</span> to a signed decimal number with exactly 8 digits. If <span class="register">EAX</span> contains <span class="constant">$00000080</span>, the result string will be <span class="constant">'00000128'</span>.</p>

<a name="StrCharCat"><h4>StrCharCat</h4></a>
<pre class="fasm-code">proc StrCharCat, .hString, .char</pre>
<p>This procedure appends up to 4 characters at the end of the string <span class="variable">[.hString]</span>. The characters are contained in the dword argument <span class="variable">[.char]</span></p>

<a name="StrCharInsert"><h4>StrCharInsert</h4></a>
<pre class="fasm-code">proc StrCharInsert, .hString, .char, .pos</pre>
<p>Inserts up to 4 characters <span class="variable">[.char]</span> at position <span class="variable">[.pos]</span> in the string <span class="variable">[.hString]</span></p>

<a name="StrHash"><h4>StrHash</h4></a>
<pre class="fasm-code">proc StrHash, .hString</pre>
<p>Computes 32 bit hash value from the string <span class="variable">[.hString]</span>. This procedure implements the hash algorithm FNV-1b. Returns the result in <span class="register">EAX</span>.</p>
</nowiki>

Added freshlib/_doc/equates.wiki.











>
>
>
>
>
1
2
3
4
5
<nowiki>
<a name="data"><h1>FreshLib directory: equates</h1></a>
<p>This directory contains the equates library "allequates.inc". This library defines all constants and structures needed for OS dependent parts of FreshLib.</p> 
<p>The user should never use these constants and structures in the portable program.</p>
</nowiki>

Added freshlib/_doc/freshlib.css.





















































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
body {
	margin: 0px auto 0px auto;
	padding: 2px;
	text-align: justify;
}

p {
	padding-left: 20px;
}

td {
	padding: 2px 8px 2px 8px;
}

span.register {
	margin: 0px;
	padding: 2px;
}

span.variable {
	margin: 0px;
	padding: 2px;
}

span.flag {
	margin: 0px;
	padding: 2px 2px 2px 2px;
}

span.constant {
	margin: 0px;
	padding: 2px 2px 2px 2px;
}

span.procedure {
	margin: 0px;
	padding: 2px 2px 2px 2px;
	font-weight: bold;
}

p.note {
	margin: 0px;
	padding: 2px 2px 2px 26px;
}

p.todo {
	margin: 0px;
	padding: 2px 2px 2px 26px;
}

pre.fasm-code {
	margin: 4px 4px 4px 20px;
	padding: 2px 6px 2px 6px;
}

@media screen {
	body {
		background-color: #ffffe8;
		max-width: 1024px;
		font: "fresh";
		font-family: FreeSans, Verdana, sans-serif;
		font-size: 10pt;
	}

	/* The project logo in the upper left-hand corner of each page */
	div.logo {
		display: table-cell;
		text-align: center;
		vertical-align: bottom;
		font-weight: bold;
		color: #000000;
		min-width: 100px;
	}

	/* The page title centered at the top of each page */
	div.title {
		display: table-cell;
		font-size: 20px;
		font-weight: bold;
		text-align: left;
		padding: 0 0 0 1em;
		color: black;
		vertical-align: middle;
		width: 100% ;
	}

	/* The main menu bar that appears at the top of the page beneath
	** the header */
	div.mainmenu {
		padding: 5px 10px 5px 10px;
		font-size: 12px;
		font-weight: bold;
		text-align: center;
		letter-spacing: 1px;
		background-color: #ff7000;
		border: 1px solid red;
		color: white;
	}

	/* The submenu bar that *sometimes* appears below the main menu */
	div.submenu {
		padding: 2px 10px 2px 10px;
		margin: 3px 0px 3px 0px;
		font-size: 12px;
		text-align: center;
		background-color: #ffff70;
		color: #000080;
		border: 1px solid red;
	}
	div.mainmenu a, div.mainmenu a:visited {
		padding: 3px 10px 3px 10px;
		color: white;
		text-decoration: none;
	}

	div.submenu a, div.submenu a:visited {
		padding: 1px 10px 1px 10px;
		color: black;
		text-decoration: none;
	}


	div.mainmenu a:hover {
		color: #558195;
		background-color: white;
	}


	div.submenu a:hover {
		color: black;
		background-color: #40ffa0;
	}

	/* All page content from the bottom of the menu or submenu down to
	** the footer */
	div.content {
		padding: 8px 8px 8px 8px;
		font-size: 12px;
		max-width: 800px;
		margin: 4px auto 4px auto;
		background-color: white;
		border: 1px #a0a0a0 solid;
	}

	/* The footer at the very bottom of the page */
	div.footer {
		font-size: 12px;
		margin-top: 2px;
		padding: 5px 10px 5px 10px;
		text-align: right;
		background-color: #ff7000;
		border: 1px solid red;
		color: white;
	}

	td {
		font: "fresh";
		font-family: "helvetica";
		font-size: 10pt;
	}

	span.register {
		background-color: #FFCCFF;
	}

	span.variable {
		background-color: #CCFFFF;
	}

	span.flag {
		background-color: #FFFFCC;
	}

	span.constant {
		background-color: #CCFFCC;
	}

	span.procedure {
		font-weight: bold;
	}

	p.note {
		background-color: #FFFFCC;
		border: 1px solid #FFCCCC;
	}

	p.todo {
		background-color: #FFCCCC;
		border: 1px solid #FF9999;
	}

	pre.fasm-code {
		max-width: 700px;
		background-color: #F3F3F3;
		border: 1px dashed #C0C0C0;
		font-size: 9pt;
	}

}

@media print {
	body {
		background-color: none;
		font-family: FreeSans, Verdana, sans-serif;
	}
	div.mainmenu {
		visibility: hidden;
	}
		
	div.submenu {
		visibility: hidden;
	}

	a {
		text-decoration: none;
	}

}

Added freshlib/_doc/freshlib_reference.wiki.



























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<nowiki>
<table class="index" align="right">
	<tr><td class="index"><p></p>
		<b><a href="/home">Home</a>:FreshLib:</b><br />
		<a href="compiler.wiki">compiler</a><br />
		<a href="data.wiki">data</a><br />
		<a href="equates.wiki">equates</a><br />
		<a href="graphics.wiki">graphics</a><br />
		<a href="GUI.wiki">GUI</a><br />
		<a href="imports.wiki">imports</a><br />
		<a href="macros.wiki">macros</a><br />
		<a href="simpledebug.wiki">simpledebug</a><br />
		<a href="system.wiki">system</a><br />
	</p></td></tr>
</table>
<h3>Overview</h3>

<p>FreshLib is an assembly library aimed to ease the development of rapid assembly language applications, freely portable between different platforms, such as Win32 or Linux.</p>
<p>The  library is coded in flat assembler syntax <a href="http://www.flatassembler.net">(fasm)</a> and is intended to be easily used within <a href="http://fresh.flatassembler.net">Fresh IDE</a> although it could be used for plain fasm development.</p>

<p>The library consists of two layers: one that is OS dependent and a second one that is OS independent. The OS dependent layer is very small, in order to help porting it for different OS. This layer only makes interface to the core OS functions, such as memory allocations, file access, drawing functions, simple window management etc.</p>

<p>The OS independent layer is responsible for the main application functionality allowing creation of different kind of windows and controls, user interaction with the program and interaction between particular windows and other GUI elements.</p>
<p>FreshLib is mainly intended for developing GUI applications, as they are the most challenging to be ported across different platforms. FreshLib is also created with visual programming in mind, so it contains a flexible, event driven and OS independent template engine allowing visual creation of application user interfaces.</p>
<p>FreshLib is in early development stage and probably will be changed many times in order to reach their objectives: to be small, fast and easy to use.</p>

<p>The main intention is to keep the bloat off the library, but containing all necessary accessories for comfortable programming of a very wide range of applications.</p>

<p>The architecture of FreshLib is open and it can be freely expanded with other libraries without increasing the size of applications. In other words, only those parts of the library that are effectively used will be compiled on the final executable.</p>

<h3>About this manual</h3>

<p class="todo">This manual is a "work in progress". Any part of it can be changed at any time.</p>
<p>Of course, some of the libraries described in this document are more stable and finished like the macro, system and data libraries. Therefore, the chapters about these libraries are less likely to be changed. Other libraries (like graphics and GUI), will be heavily modified  so the manual will be changed accordingly.</p>

<h3>Structure of the library</h3>
<p>FreshLib contains many code and macros libraries, structured hierarchically and depending on each other. Here is the directory tree of the library:</p>
<ul>
<li><a href="compiler.wiki">compiler</a></li>
<li><a href="data.wiki">data</a></li>
<li><a href="equates.wiki">equates</a></li>
<li><a href="graphics.wiki">graphics</a></li>
<li><a href="GUI.wiki">GUI</a></li>

<li><a href="imports.wiki">imports</a></li>
<li><a href="macros.wiki">macros</a></li>
<li><a href="simpledebug.wiki">simpledebug</a></li>
<li><a href="system.wiki">system</a></li>
</ul>
<p>The library is structured to support different platforms transparently. The platform dependient code is contained in a subdirectory of each library component. For example, "system" subdirectory contains libraries for accessing system resources  such as memory, files, etc. Inside "system" there several subdirectories that contain OS dependent code  these directories are named after the platform they serve.</p>
<p class="note">Currently, only Win32 and Linux platforms are supported.</p>
<h3>Getting started</h3>
<p>FreshLib main scope is to provide a fast and easy framework to start programming multiplatform assembly applications. Now, <a href="starting.wiki">what is needed to start writing applications?</a></p>
<h3>Tutorials</h3>
<ul>
	<li><a href="starting.wiki#simplest">Simplest Application</a></li>
	<li><a href="starting.wiki#files">Creating Files</a></li>
	<li><a href="starting.wiki#console">Basic Console</a></li>
	<li><a href="starting.wiki#GUI">Basic GUI</a></li>
</ul>
</nowiki>

Added freshlib/_doc/imports.wiki.













>
>
>
>
>
>
1
2
3
4
5
6
<nowiki>
<a name="data"><h1>FreshLib directory: imports</h1></a>
<p>Another directory that contains only OS dependent definitions is "imports" with a library file to be included in the project: "allimports.asm"</p> 
<p>This file have to be included in the _IncludeSection of the application. Then it will generate the proper import section, depending on the target platform and functions used by the OS dependent parts of FreshLib.</p>
<p>The user should never call directly imported functions from inside the portable application.</p>
</nowiki>

Added freshlib/_doc/index.wiki.





























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<nowiki>
<table class="index" align="right">
<tr><td class="index">
<p><b>Index</b><br />
<a href="http://fresh.flatassembler.net">Fresh home</a><br />
<a href="/doc/FreshLibDev/freshlib/_doc/freshlib_reference.wiki">FreshLib reference</a><br />
<a href="/doc/trunk/doc/fresh_user_guide.html">Fresh tips&amp;tricks</a><br />
</p></td></tr>
</table>

<p>Fresh is a visual assembly language IDE with built-in FASM assembler.
</p>

<p>The main goal of Fresh is to make programming in assembly as fast and
efficient as in other visual languages, without sacrificing the small
application size and the raw power of assembly language.
</p>

<p>Because Fresh is the logical continuation of the FASM project in the
area of visual programming, it is perfectly compatible with FASM and you
can use all your knowledge about FASM to program in Fresh.
</p>

<p>Of course, you can use Fresh not only for Windows programming, but also
to create programs for any OS that FASM supports - DOS, Linux, FreeBSD,
BeOS, MenuetOS - the same way as you do this in FASM.
</p>

<p>This site is <a href="http://www.fossil-scm.org">fossil</a> repository of Fresh sources.
You can clone the repository with following fossil command:
<pre><b>fossil clone http://chiselapp.com/user/johnfound/repository/FreshIDE/ Fresh.fossil</b></pre>
</p>

<p>In order to use more functionality in this site, please <a href="/login">login</a> as "anonimous" user.
Particularly you will be able to follow the links in the source tree, to download code and to fill bug reports and feature requests.
</p>

<p>If you want to contribute to the project, please contact me (johnfound) on <a href="http://board.flatassembler.net">FASM message board</a>
</p>

<p>In order to download compiled FreshIDE, visit <a href="http://fresh.flatassembler.net">Fresh IDE home page.</a>
</p>

<p>You can report bugs, or make some feature requests here, in the <a href="/reportlist">Tickets system</a>
</p>
</nowiki>

Added freshlib/_doc/macros.wiki.



















































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
<nowiki>
<table class="index" align="right">
	<tr><td class="index"><p></p>
		<b><a href="freshlib_reference.wiki">FreshLib</a>:Macros:</b><br />
		<a href="#_stdcall">_stdcall.inc</a><br />
		<a href="#_globals">_globals.inc</a><br />
		<a href="#_struct">_struct.inc</a><br />
		<a href="#_display">_display.inc</a><br />
	</p></td></tr>
</table>
<a name="macros"><h1>FreshLib directory: macros</h1></a>
<p>This directory contains several libraries that provides common convenience functions to be used with big assembly projects. All libraries can be included in the project at once from the file "allmacros.inc".</p>
<p>There is no overhead at including all those libraries because there is no code to be generated, just macros. There is a little delay in compile time but thanks to fasm's speed, it is barely noticeable.</p>
<p>Lets examine each one of these libraries.</p>
<a name="_stdcall"><h2>FreshLib _stdcall.inc</h2>
<p>In general this library provides ways of definition and invoking of the procedures with argument passing through the stack. It supports STDCALL and CCALL calling conventions.</p>
<pre class="fasm-code">
macro proc name, [arg]
macro begin
macro endp
macro return
macro cret
macro locals
macro endl
</pre>
<p>These macros define a procedure, creates a stack frame for the local variables and defines symbolic names for the arguments. The macro "proc" defines the global label "name" as a name for the procedure. All arguments and local variables are defined as a local labels with regard to the name of the procedure. That is why all arguments and local variables must have names beginning with dot.</p>
<p>Between the line with "proc" and "begin", any number of local variables can be defined. The macro "begin" marks the begining of the procedural code.</p>
<p>The macro "endp" marks the end of the procedural code.</p>
<p>The return from procedure instruction is provided by macros "return" or "cret" depending on the calling convention we want to use: "return" clears the arguments from the stack and "cret" do not.</p>
<p>Inside the procedure, a secondary stack frame can be allocated with the pair "locals" and "endl".  All data definitions, enclosed between these macros will define a secondary stack frame that is a continuation of the stack frame defined between "proc" and "begin".</p>

<p>Any number of "locals" and "endl" pairs can be used, but all of these secondary stack frames will overlap between each other. This feature is specially intended to provide savings of stack space and at the same time, to provide talking variable names for the different parts of more complex procedures.</p>
<p>For example (in Win32) if we have complex window procedure that have to process multiple messages: One of the message handlers may need one variable <span class="variable">.rect</span>. Another message handler may need two variables called <span class="variable">.point1</span> and <span class="variable">.point2</span>. But the procedure as a whole is never going to need all those variables at the same time, because it process only one message at a time. On the other hand it may need the variable <span class="variable">.ctrldata</span> for every message processed. The optimal solution is to define the variables in the following way:</p>
<pre class="fasm-code">
proc CtrlWinProc,.hwnd,.wmsg,.wparam,.lparam
.ctrldata dd ?
begin
    invoke GetWindowLong, [.hwnd], GWL_USERDATA
    mov    [.ctrldata], eax

    cmp    [.wmsg], WM_MESSAGE1
    je     .message1
    cmp    [.wmsg], WM_MESSAGE2
    je     .message2
    return

.message1:
locals
  .rect RECT
endl
    return

.message2:
locals
  .point1 POINT
  .point2 POINT
endl
    return
endp
</pre>
<p>In the above example, <span class="variable">.ctrldata</span> is defined on <span class="register">[EBP-4]</span>; <span class="variable">.rect</span> is defined on <span class="register">[EBP-20]</span>; <span class="register">.point1</span> is also defined on <span class="register">[EBP-20]</span>  and <span class="variable">.point2</span> is defined on <span class="register">[EBP-12]</span>.<p>
<table class="stack" style="margin-left: 40px; border: 1px solid black;">
	<tr><td>[EBP-04]</td><td colspan=2>.ctrldata</span></td></tr>
	<tr><td>[EBP-08]</td><td>.rect.bottom</td><td>.point2.y</td></tr>
	<tr><td>[EBP-12]</td><td>.rect.right</td><td>.point2.x</td></tr>
	<tr><td>[EBP-16]</td><td>.rect.top</td><td>.point1.y</td></tr>
	<tr><td>[EBP-20]</td><td>.rect.left</td><td>.point1.x</td></tr>
</table>
<p>As you can see, <span class="variable">.rect</span> occupies the same memory as <span class="variable">.point1</span> and <span class="variable">.point2</span>, but <span class="variable">.ctrldata</span> is never overlapped and exists independently.<p>
<p>As a general rule, you have to use the definitions between "proc" and "begin" for local variables that are used in every call of the procedure and separate locals/endl definitions for variables needed for the particular branches inside the procedure.<p>
<p>This approach will always provide the optimal size for the locals stack frame.</p>

<pre class="fasm-code">
macro initialize
macro finalize
</pre>
<p>The macros "initialize" and "finalize" defines one special type of procedures that during compilation are registered in a two separate lists - one for "initialize" and one for "finalize" procedures.</p>
<p>After that using the macros "InitializeAll" and "FinalizeAll", all these procedures can be call at once. "initialize" procedures are call in the order of their definition and "finalize" procedures in reverse order.</p>
<p>These macros provides standard and consistent way to process the initialization and the finalization of the libraries and modules of the application.</p>
<p>Procedures defined with "initialize" and "finalize" must have no any arguments.</p>
<p>FreshLib uses this mechanism and the user is free to use it also.
<pre class="fasm-code">
macro stdcall proc, [arg]
macro ccall proc, [arg]
macro invoke proc, [arg]
macro cinvoke proc, [arg]
</pre>
<p>This macros call the procedures with STDCALL and CCALL calling convention.</p>
<p>"stdcall" macro pushes the arguments to the stack in reverse order and then call the procedure with label "proc". As long as the macro "stdcall" does not provide any stack cleanup (this duty is assigned to the procedure) the arguments can be pushed in free manner using, for example, separate push instructions for part of the arguments and arguments in the stdcall line for the remaining arguments. This can be very convenient in some cases. For example see the following source:</p>
<pre class="fasm-code">
    stdcall CreateSomeObject   
    push	    eax   			
    stdcall DoSomething
    stdcall DeleteSomeObject
</pre>
<p>Here, the procedure DoSomething  changes the value of eax, so the handle is saved in the stack. The procedure DeleteSomeObject needs one argument - a handle of the object. But as long as the proper value is already in the stack, it is mindless to pop the value and then to push it again. So the source calls DeleteSomeObject without any arguments. The procedure knows the proper number of arguments (one in this example) and clean the stack properly.</p>
<p>The standard (and wrong) approach is to pop the argument from the stack and then to pass it to the procedure explicitly is the stdcall statement:</p>
<pre class="fasm-code">
    stdcall	CreateSomeObject
    push	     eax   ; save the handle.
    stdcall  DoSomething
    pop      eax             ; ??? Why ???
    stdcall  DeleteSomeObject, eax
</pre>
<p>This source will generate the meaningless instructions sequence:</p>
<pre class="fasm-code">
    pop      eax       
    push     eax       	
</pre>
<p>"invoke" macro is the same as "stdcall" with the only difference - it calls the procedure indirectly (call [proc] instead of call proc).</p>
<p>This mechanism is used to call the functions imported from external dynamic linked libraries.</p>
<p>"ccall" macro calls a procedure with CCALL convention. This means that the procedure returns with simple "retn", without cleaning the parameters from the stack. Then "ccall" macro provides instructions that remove the arguments from the stack.</p>
<p>Because ccall have to know the exact count of passed arguments, all arguments have to be passed explicitly as a values in the ccall statement.</p>
<p>Tricks as described above will not work properly and leads to stack not properly cleaned after the call.</p>
<p>"cinvoke" is the same as ccall, but using indirect call. The reason is the same as with "invoke" macro. </p>
<p class="note">About the calling conventions: While  all Win32 dynamic linked libraries uses STDCALL convention, most (if not all) of Linux libraries uses CCALL convention.<br />
All code libraries of Fresh use STDCALL calling convention and it is platform independient.</p>

<a name="_globals"><h2>FreshLib _globals.inc</h2>
<p>This library defines several macros intended to deal with data definitions.</p>
<p>Usually all data definitions have to be placed in special section of the executable file. This is not very convenient, because the code that process this data and the data definitions must reside in separate places of the source code, and in most cases even in different files.</p>
<p>The idea of globals.inc macro library is to allow the data definition to be described anywhere in the source code, but these definitions to be defined at once, at the place the programmer wants - usually in the data section of the program.</p>
<pre class="fasm-code">
macro uglobal
macro iglobal
macro endg
macro IncludeAllGlobals
</pre>
<p>"uglobal" begins block for undefined data definition. The block ends with "endg" macro. Between "uglobal" and "endg" macro any count of data definitions can be inserted.</p>
<p>Note that because uglobal block defines undefined data, it is only the labels and the size of data that have meaning inside this block. Any data defined with data definition directive will not be included in the binary file.</p>
<p>The undefined data will be defined later at the place where "IncludeAllGlobals" macro resides.</p>
<p>The undefined data is always placed at the end of all data definitions, so it will never increase the size of the executable file.</p>

<p>"iglobal" macro, again combined with "endg" defines initialized data. The data defined in the block will be created at "IncludeAllGlobals" statement.</p>
<p>This block increases the size of the executable file, because it contains sensible data, that have to be included in the file.</p>
<p>Actually, neither uglobal, nor iglobal blocks defines any data immediately.</p>
<p>Instead, the data definitions are stored in a list.  The real definition occurs later, when IncludeAllGlobals macro is invoked.</p>
<p>For this reason, IncludeAllGlobals must be placed  in the source  after all used global data blocks.</p>

<pre class="fasm-code">struc text [val]</pre>

<p>The macro "text" is actually a structure. It needs to be preceded by some label name.</p>
<p>This macro defines a zero terminated string constant, and also a local label for this string in the "sizeof" global label.</p>
<p>The "text" macro, similar to iglobal and uglobal simply stores string data for defer definition.</p>
<p>This definition, as for all global data macros, occur in IncludeAllGlobals invocation.</p>
<p>Why to define separate macro for the strings and not to use the normal iglobal block? The thing is that the macro "text" was planned to check the strings and to not define any string more than once. In the case of repetitive strings, this macro should return the pointer to the already defined string constant.</p>
<p>In that case, it would be very convenient and harmless to use string constants in the function calling macros - stdcall, ccall etc.</p>
<p class="todo">Unfortunately, regardless of the power of fasm macro language, this functionality cannot be implemented. Or, more precisely, it can be implemented, but the implementation is too slow for any real project use.<br />
This ineffective implementation is still leaved inside the file _globals.inc - commented block that defines macro with name "InitStringList". If someone have ideas about fixing this problem, please send it to me!</p>

<a name="_struct"><h2>FreshLib _struct.inc</h2>
<p>This library contains only one simple macro:</p>
<a name=""><h4></h4></a>
<pre class="fasm-code">
macro struct name
ends
</pre>
<p>This macro is aimed to provide easy creation of data structures. The "struc" directive in FASM is known to not create actual labels, but only the template for the label definitions. So, we need to create an instance of the data structure in order to have addresses and offsets of its fields.</p>
<p>But very often we don't have static data structure of the given type, but data structure, pointed by some of the registers. In this case in order to use offsets to the fields of the data structure, we need to define at least one virtual  instance of the structure at address 0. Then we can use the values of the fields as an offsets in the instructions - for example: mov eax, [esi+RECT.right].</p>
<p>So, this is exactly what "struct" macro does. Besides it defines the "struc" structure with the given fields, it creates a single virtual instance of this structure, in order to be used later for register addressing. In all remaining functionality it behaves exactly as the struc directive.</p>
<p>The syntax of struct macro is the following:</p>
<pre class="fasm-code">
struct StructureName
  .field1 dd ?
  .field2 RECT
  .fieldN:
ends
</pre>
<p>The definition begins with "struct" followed by the structure name. The definition ends with "ends" directive. Between both, any local label definition becomes a member of the structure.</p>

<a name="_display"><h2>FreshLib _display.inc</h2>
<p>This library contains macros that enhance the functionality of standard FASM "display" directive.</p>
<a name=""><h4></h4></a>
<pre class="fasm-code">macro disp [arg]</pre>
<p>The macro "disp" displays the strings given in the arguments, just as "display" FASM directive does</p>
<pre class="fasm-code">disp &lt;number, radix&gt;</pre>
<p>The macro here is used to display numbers in any radix.</p>

<pre class="fasm-code">macro DispSize Text, Sz</pre>
<p>"DispSize" macro is very specialized macro, that displays the text and number in the following form:</p>

<pre class="fasm-code">Size of [Text] is: Sz bytes</pre>

<p>The size number is automatically scaled to bytes or kbytes, depending on the value of Sz.</p>
<p>This macro allows easy display and control of the sizes of particular areas of the program - data structures, subroutines etc.</p>

<a name="Fresh display"><h4>How Fresh implements "display" directive</h4></a>
<p>There are some specifics in Fresh, concerning message displaying. The "display" directive in Fresh works in a different way than original FASM directive. It outputs text in Fresh message window. Each message can have one of six icons, or it can have no icon at all. And because message window is implemented as a TreeView control, you can organize your messages into groups (directories). Implementation is a bit "tricky" - when you display a character whose code is less than 16, it is interpreted in a special way. Characters from 1 to 6 set an icon of current message. It sounds complicated, but it is quite simple. Try:</p>
<pre class="fasm-code">
    display 2, "some message"
</pre>
<p>It will display "some message" with an error icon. Another codes are used for controlling directory structure. Try to type following lines and see what would happen:</p> 
<pre class="fasm-code">
    display 3, "message at root", 0x09
    display 3, "child message1", 0x0a
    display 3, "child message2", 0x0d
    display 3, "again at root", 0x0a
</pre>
<p>Of course you don't have to put each message in separate display directive, you can, with the same result write:</p>
<pre class="fasm-code">
display 3, "at root",$09,3,"child1",$0a,3,"child2", $0d,3,"again at root",$0a 
</pre>
<p>Here is the complete list of all special characters and their meanings:</p>
<table style="margin-left: 40px;">
	<tr><td><span class="constant">$01</span></td><td>set current icon to "warning"</td></tr>
	<tr><td><span class="constant">$02</span></td><td>set current icon to "error"</td></tr>
	<tr><td><span class="constant">$03</span></td><td>set current icon to "info"</td></tr>
	<tr><td><span class="constant">$04</span></td><td>set current icon to "find"</td></tr>
	<tr><td><span class="constant">$05</span></td><td>set current icon to "none"</td></tr>
	<tr><td><span class="constant">$06</span></td><td>set current icon to "debug"</td></tr>
	<tr><td><span class="constant">$08</span></td><td>end current row and set one level back.</td></tr>
	<tr><td><span class="constant">$09</span></td><td>end current row and set it as new directory.</td></tr>
	<tr><td><span class="constant">$0a</span></td><td>end current row and keep current level</td></tr>
	<tr><td><span class="constant">$0d</span></td><td>end current row and set current level to root level</td></tr>
</table>
</nowiki>

Added freshlib/_doc/porting.wiki.











































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<h3>Porting FreshLib to other platforms.</h3>

<h4>Minimal system requirements</h4>

  *  Some kind of heap management. Currently FreshLib uses heap functions in Win32 and libc functions
in Linux.

Although, if it is impossible for the OS to provide dynamic memory allocation, it can be implemented
using some other heap manager - for example vid's one from FASMLIB. In this case, the OS should provide only
one big memory block.

However, this solution can greatly complicate the porting process.

  *  Some kind of process management. Threads.

  *  Timer - FreshLib needs one timer that to be able to interrupt the main program loop.

  *  Graphics - FreshLib needs basic graphics functions in order to work. Lines, Rectangles and text drawing
should be enough.

  *  Graphics Text rendering - FreshLib needs UTF-8 support at least on level of conversion of UTF-8 to
the OS internal format (as is with Win32). As long as ASCII (0..$7f) is valid UTF-8 code, if the OS uses
only plain ASCII it is possible for text rendering to provide only ASCII text drawing.

In Win32 FreshLib uses Windows unicode support with conversion. In Linux it uses XFT library, that supports
direct use of UTF-8 strings.

  *  Console text output - FreshLib needs output to the console window - (native or emulated) for debuging
purposes.

  *  Windows - FreshLib uses only one base type of window, able to accept the system events and to be displayed
on the screen. This window should be able to appear on the screen and to be able to have children of the same type.

In Win32 FreshLib uses its own window class "FreshWin". In Linux (XLib) uses usual XLib window.



Added freshlib/_doc/real_objects.md.











































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
# Object oriented programming with FreshLib

## Objects definition

The objects are defined using macro pair "object" and "endobj".

The syntax of these macros is following:

        object OBJ_NAME [, PARENT_NAME]
          ; here object members are to be defined.
        endobj

The object can contain three types of members:

* Fields. They are simply some local labels with data definition, very similar to
the structure fields. The fields are defined the same way as the structure fields:

        object TAnimal
          .length dd ?
          .height dd ?
          .weight dd ?
        endobj

The fields are aimed to provide storage of private for the object data. Of course, it is
assembly language and the fields are not hidden from the user, but a good practice is to
not use them as an interface. (There are other members that are to be used as an interface).

* Methods. The methods are procedures that provide an object engine - the code that to
be executed on the object data. They are defined following way:


        object TAnimal
          .length dd ?
          .height dd ?
          .weight dd ?

          method .Jump, .height
        endobj


Here we defined a method TAnimal.Jump that will make our animal to jump. :)
The methods can have any number of arguments. Besides the user defined arguments,
the method always contain one implicitly defined argument, named .self, containing
a pointer to the object itself.

The user should not define this argument, neither set it during the method invocation.
The object engine itself handle it. Of course the user can use this argument
on the method implementation code.

Once defined, the method needs to be implemented.
The method implementation is similar to the procedures, but uses a macro "method" instead of
"proc". Also, no arguments need to be defined in the method implementation, because they are
already known from the object type definition:

        method TAnimal.Jump
        begin
                push    eax ecx

                mov     eax, [.self]
                mov     ecx, [eax+TAnimal.height]
                add     ecx, [.height]

                pop     ecx eax
                return
        endp

Sometimes so called "abstract" methods need to be defined. These are methods, that has no
implementation. They are used in order to provide a method that to be implemented only in
the objects that have a common parent class.

The abstract methods are defined the same way as the normal, but by the macro "abstract"
instead of "method". And of course they does not need implementation.


* Parameters. The parameters are, similar to the fields, data members. But unlike the fields,
they can contain a code, that to generate the data value. The definition of the parameter is
by the macro "param":

        param .ParamName, GET_METHOD, SET_METHOD

The GET_METHOD and SET_METHOD define how the value of the parameter is to be get or set by
the user. These arguments can have one of the following values:

* Name of a field - it means that the value of the parameter is to be get and/or set directly
from the object field member.

* Name of a method - instead of read or write the value of the parameter from the memory, some
object method is called.

The GET method should have none arguments (but there is always implicitly defined .self argument).
It should return the computed value in EAX register.

The SET method should have one argument for the value that have to be set in the parameter.
(and .self)

* NONE keyword - it means the parameter does not support reading or writing. This way, the
user can define read-only or write-only parameters. (And also, parameters that can't be neither
read nor write).


        object TAnimal
          .length   dd ?
          .height   dd ?
          .weight   dd ?
          .speed    dd ?

          param    .Energy, .ComputeEnergy, NONE

          method   .GetEnergy
          abstract .Jump, .height
        endobj


        method TAnimal.GetEnergy
        begin
                push    ecx
                mov     ecx, [.self]
                mov     eax, [ecx+TAnimal.speed]
                imul    eax, eax
                imul    eax, [ecx+TAnimal.weight]
                sar     eax, 1                        ; E = m.v^2/2
                pop     ecx
                return
        endp


## Object inheritance

All objects can be inherited by other method definition. The child object contains all members of
the parent object and allows adding new members as well.

The methods of the child object can be inherited in the child object. This happens when the user
defines a method with the same name as already existing method:


        object TCat, TAnimal
          method .Jump, .height
        endobj


        method TCat.Jump
        begin
        ; code that makes the cat jump not as other animals.

                return
        endp

## Object use

Once defined, the object can be created and destroyed, a values can be set or get and
methods call. This functionality is provided by several macros. Notice that they are
made to have syntax very similar to CPU instructions and this way to not affect the "look&feel"
of the assembly language program.

### Creating object instance.

Once defined, the user can create any number of object instances using the macro "create":

        create TARGET, OBJECT_TYPE

This macro creates an object of type OBJECT_TYPE and put it into TARGET. TARGET can be
register or memory location

        create eax, TCat        ; put in EAX a pointer to the object instance.

        create [MyCat], TCat    ; put the pointer in [MyCat]

The macro create allocates memory for the instance, sets the proper pointer to the methods
table and (if defined) executes the method .Create of the object.

Create does not change any registers, unles one is set as TARGET.

### Destroying objects

If the object instance is no longer needed, it have to be destroyed by using "destroy" macro.

        destroy OBJECT

For example:

        destroy [MyCat]

If the object is descendent of TObject, the method .Destroy is to be called. TObject is some
special name that is aimed to be the root type for all objects in FreshLib. Hardcoding this
name is because "destroy" method can't know the type of the destroyed object and this way
can't check existing of the method .Destroy;

### Object method execution

The method of a object can be executed by using "exec" macro:

        exec OBJECT, TYPE:METHOD, [ARGUMENTS]

For example:

        exec [MyCat], TCat:Jump, 100

There is another macro "pexec" that acts exactly as "exec", but calls not the object
method, but the same method from the parent object type (of course if defined).

        pexec [MyCat], TCat:Jump, 100  ; it will call TAnimal.Jump, instead of
                                       ; the re-defined TCat.Jump


### Object parameter get and set:

The parameter getting or setting values is by the macros "get" and "set":

        get TARGET, OBJECT, TYPE:PARAMETER

        set OBJECT, TYPE:PARAMETER, NEW_VALUE

The TARGET and NEW_VALUE can be register or memory variable (as in mov instruction):

        get ecx, [MyCat], TAnimal:Energy

This line will compute the current energy (see the definition of .Energy above)
of [MyCat] and will return it in ECX register.

Notice, that the code, generated by this macro is optimal. For example if the parameter
is associated with a field and the object is passed by register, the whole line will generate
single "mov" instruction.

"get" and "set" macros will preserve all registers, except TARGET of course.


### Check object type

The user can check whether the object belongs to some type by using "istype" macro:

        istype OBJECT, TYPE

This macro returns ZF flag set if the object belongs to the type or ZF cleared if not.
It will not change any registers.

For example, see following code:

        ; object types definitions

        object TAnimal
        endobj

        object TCat, TAnimal
        endobj

        object TDog, TAnimal
        endobj

        ; instance creation

        create eax, TCat

        istype eax, TCat
        je     .yes_cat         ; ZF=1  It is a TCat

        int3

.yes_cat:
        istype eax, TAnimal
        je     .yes_animal      ; ZF=1  Also, it is TAnimal

        int3

.yes_animal:
        istype eax, TDog
        je     .yes_dog         ; ZF=0  but is it NOT TDog.

        int3                    ; will stop here

.yes_dog:


## Objects polymorphism.

Polymorphism is one of the main properties of the OOP. It is the ability of the object to
execute different code on the same method call, depending on its type.

In the context of our library, as long as the types inherit all the methods of its parents and
can redefine it, it means, that in the above example, TCat and TDog both have method .Jump,
inherited from TAnimal. (In this mean, they are both of type TAnimal), but the implementation of
TCat.Jump and TDog.Jump differs.

This way, we can use only one code to process both types.


        create  eax, TCat
        create  ebx, TDog

        exec    eax, TAnimal:Jump, 100
        exec    ebx, TAnimal:Jump, 100

You can see, that the same code will call in the first case TCat.Jump and in the second case
TDog.Jump;

Added freshlib/_doc/simpledebug.wiki.













>
>
>
>
>
>
1
2
3
4
5
6
<nowiki>

<a name="data"><h1>FreshLib directory: simpledebug</h1></a>
<p>This directory contains debugging utilities.</p>
</nowiki>

Added freshlib/_doc/starting.wiki.

































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<nowiki>
<a name="setup"><h2>Setting Up</h2></a>

<p>The first thing to do is to download <a href="http://www.flatassembler.net">fasm</a> in your platform of choice.
 Fasm does not require installation nor do you need special administrative privileges or a root account in order to start using it.</p>
<p>The second thing is to get a copy of <a href="http://chiselapp.com/user/johnfound/repository/FreshIDE/zip/FreshLib.zip?uuid=FreshLib">FreshLib</a>. FreshLib is just fasm source code, simply save it in a directory of choice.</p>
<p>FreshLib needs an environment variable called <span class="variable">TargetOS</span> 
in order to know the target platform of the generated application.
 Currently, the allowed values are: <span class="constant">Win32</span> and <span class="constant">Linux</span>.</p>
<p>A second environment variable is suggested called <span class="variable">lib</span> having the full path to FreshLib. The library does not need this, but it will make your own sources more portable.</p> 
<p>From Linux:</p>
<pre class="fasm-code">
export TargetOS=Linux
export lib=/home/test/freshlib
</pre>
<p>From Windows:</p>
<pre class="fasm-code">
set TargetOS=Win32
set lib=c:\projects\freshlib
</pre>

<p>That's all. Now it is time to produce the first FreshLib application using just Fasm.</p>

<a name="simplest"><h3>Hello World</h3></a>

<pre class="fasm-code">
include '%lib%/compiler/executable.inc'
include '%lib%/macros/allmacros.inc'
include '%lib%/equates/allequates.inc'

_BinaryType console

include '%lib%/system/process.asm'
include '%lib%/simpledebug/debug.asm'

_CodeSection

start:

        InitializeAll

        DebugMsg 'Hello world!'

        FinalizeAll
        call    Terminate

_ImportSection

include '%lib%/imports/allimports.asm'

_DataSection

IncludeAllGlobals
</pre>

<p>The most important thing to note is that regardless the platform you have chosen, the code is exactly the same.
In other words, if you change the value of your environment variable <span class="variable">TargetOS</span>,
the same code will produce a different executable file targeting that platform.
This is the main characteristic of the FreshLib and this is the first design criteria that you will
want to follow to have a truly platform independent application.</p>

<p class="note">This is a highly portable development environment, perhaps the most portable
among non interpreted languages. The entire development process could run from removable media
and the same set of source code files could be used from Win32 and Linux to produce binaries for either of them.</p>

<a name="files"><h3>Creating Files</h3></a>

<pre class="fasm-code">
include '%lib%/compiler/executable.inc'
include '%lib%/macros/allmacros.inc'
include '%lib%/equates/allequates.inc'

_BinaryType console

include '%lib%/simpledebug/debug.asm'
include '%lib%/system/files.asm'
include '%lib%/system/process.asm'

_CodeSection

start:

        InitializeAll

        DebugMsg 'FreshLib Tutorials - Module: Files'

iglobal
        filename        db './tut01.txt',0
        sizeof.filename = $-filename
endg

uglobal
        hFile   dd ?
endg

        stdcall FileCreate, filename
        jc      .error
        mov     [hFile], eax
        DebugMsg "A new file was created:"
        stdcall OutputNumber, [hFile], 16, 2
        DebugMsg " is the handle of the file"

        stdcall FileWrite, [hFile], filename, sizeof.filename
        jc      .error
        stdcall OutputNumber, eax, 10, 2
        DebugMsg " bytes were written into the file"

        stdcall FileClose, [hFile]
        jc      .error
        DebugMsg "The file was properly closed"

        stdcall FileDelete, filename
        jc      .error
        DebugMsg "The file was finally deleted"
        jmp     .exit

.error:
        DebugMsg "Sorry, an error occurred"

.exit:
        FinalizeAll
        stdcall Terminate, 0

_ImportSection

include '%lib%/imports/allimports.asm'

_DataSection

IncludeAllGlobals
</pre>

<a name="console"><h3>Simple Console</h3></a>

<pre class="fasm-code">
</pre>

<a name="GUI"><h3>Basic GUI</h3></a>

<pre class="fasm-code">
</pre>

</nowiki>

Added freshlib/_doc/system.wiki.



















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<nowiki>
<a name="data"><h1>FreshLib directory: system</h1></a>
<p>This directory contains two libraries: "memory.asm" and "files.asm". They constitute the interface to the overlaying system for the rest of the FreshLib modules.</p>
<a name="memory"><h2>FreshLib Memory</h2></a>
<p>This library contains simple but pretty complete functions for dynamic memory allocation, reallocation and release.</p>
<p>The Win32 implementation of the library uses the process heap, returned by GetProcessHeap to manage the memory allocations. Linux implementation uses libc functions: "malloc", "free" and "realloc".</p>

<a name="GetMem"><h4>GetMem</h4></a>
<pre class="fasm-code">
proc GetMem, .size
</pre>
<p>This procedure allocates dynamic memory block with size in bytes in the argument <span class="variable">[.size]</span></p>
<p>If there is no error the procedure returns <span class="flag">CF=0</span> and pointer to the requested memory in <span class="register">EAX</span>. If the memory cannot be allocated, the procedure returns <span class="flag">CF=1</span></p>

<a name="FreeMem"><h4>FreeMem</h4></a>
<pre class="fasm-code">
proc FreeMem, .ptr
</pre>
<p>This procedure frees the memory block pointed by <span class="variable">[.ptr]</span> argument.</p>

<a name="ResizeMem"><h4>ResizeMem</h4></a>
<pre class="fasm-code">
proc ResizeMem, .ptr, .newsize
</pre>
<p>This procedure tries to resize the memory block pointed by <span class="variable">[.ptr]</span> to the new size, given by <span class="variable">[.newsize]</span> argument.</p>


<a name="files"><h2>FreshLib Files</h2></a>
<p>This library provides simple file access procedures.</p>

<a name="FileOpen"><h4>FileOpen</h4></a>
<pre class="fasm-code">
proc FileOpen, .filename
</pre>
<p>This procedure opens the file with a filename in the string pointed by <span class="variable">[.filename]</span> argument.</p>
<p>On success (<span class="flag">CF=0</span>) <span class="procedure">FileOpen</span> returns a handle of the open file. On error (<span class="flag">CF=1</span>) returns error code.</p>

<a name="FileCreate"><h4>FileCreate</h4></a>
<pre class="fasm-code">
proc FileCreate, .filename
</pre>
<p>This procedure creates new empty file with a filename in the string pointed by <span class="variable">[.filename]</span> argument.</p>
<p>On success (<span class="flag">CF=0</span>) FileCreate returns a handle of the open file. On error (<span class="flag">CF=1</span>) returns error code in <span class="register">EAX</span>.</p>

<a name="FileClose"><h4>FileClose</h4></a>
<pre class="fasm-code">
proc FileClose, .handle
</pre>
<p>This procedure closes the open file with a handle in <span class="variable">[.handle]</span>  argument.</p>
<p>On success (<span class="flag">CF=0</span>) does not return any value and preserves <span class="register">EAX</span>.</p>
<p>On error (<span class="flag">CF=1</span>) returns error code in <span class="register">EAX</span>.</p>

<a name="FileRead"><h4>FileRead</h4></a>
<pre class="fasm-code">
proc FileRead, .handle, .buffer, .count
</pre>
<p>This procedure reads <span class="variable">[.count]</span> bytes  from the file <span class="variable">[.handle]</span> in the buffer pointed by <span class="variable">[.buffer]</span> arguments.</p>
<p>On success (<span class="flag">CF=0</span>) returns the count of actually read bytes in <span class="register">EAX</span>.</p>
<p>On error (<span class="flag">CF=1</span>) returns error code in <span class="register">EAX</span>.</p>

<a name="FileWrite"><h4>FileWrite</h4></a>
<pre class="fasm-code">
proc FileWrite, .handle, .buffer, .count
</pre>
<p>This procedure writes <span class="variable">[.count]</span> bytes  from the buffer pointed by <span class="variable">[.buffer]</span> argument to the file [.handle] that have to be open for write.</p>
<p>On success (<span class="flag">CF=0</span>) returns the count of actually read bytes in <span class="register">EAX</span>.</p>
<p>On error (<span class="flag">CF=1</span>) returns error code in <span class="register">EAX</span>.</p>

<a name="FileSeek"><h4>FileSeek</h4></a>
<pre class="fasm-code">
proc FileSeek, .handle, .dist, .direction
</pre>
<p>This procedure moves the file pointer to the some position. The handle of the file is in <span class="variable">[.handle]</span>, the target position is in <span class="variable">[.dist]</span> and the direction of the move is in <span class="variable">[.direction]</span> arguments.</p>
<p><span class="variable">[.direction]</span> accept one of the following values: <span class="constant">fsFromBegin</span>, <span class="constant">fsFromEnd</span> and <span class="constant">fsFromCurrent</span>.</p>
<p>The exact values of these constants may vary between different OSes, so the programmer have to use the symbolic names, predefined in "files.asm" library.</p>
<p>On success (<span class="flag">CF=0</span>) returns the new position of the file in <span class="register">EAX</span>.</p>
<p>On error (<span class="flag">CF=1</span>) returns error code in <span class="register">EAX</span>.</p>

<a name="FileDelete"><h4>FileDelete</h4></a>
<pre class="fasm-code">
proc FileDelete, .filename
</pre>
<p>This procedure deletes a file with name in pointed by <span class="variable">[.filename]</span> argument.</p>
<p>On success (<span class="flag">CF=0</span>) no value.</p>
<p>On error (<span class="flag">CF=1</span>) returns error code in <span class="register">EAX</span>.</p>

<a name="GetErrorString"><h4>GetErrorString</h4></a>
<pre class="fasm-code">
proc GetErrorString, .code
</pre>
<p>This procedure returns in <span class="register">EAX</span> a pointer to a human readable error string for the error code passed in <span class="variable">[.code]</span>. The string is dynamically allocated by the OS and should be released after use with the procedure <span class="procedure">FreeErrorString</span>.</p>

<a name="FreeErrorString"><h4>FreeErrorString</h4></a>
<pre class="fasm-code">
proc FreeErrorString, .ptrString
</pre>
<p>This procedure frees the memory allocated for error string from the procedure <span class="procedure">GetErrorString</span>.</p>

<a name="LoadBinaryFile"><h4>LoadBinaryFile</h4></a>
<pre class="fasm-code">
proc LoadBinaryFile, .ptrFileName
</pre>
<p>This procedure allocates needed memory and loads the whole file with filename pointed by <span class="variable">[.ptrFileName]</span> to the allocated buffer.</p>
<p>The memory is allocated with the library <a href="system.html#memory">memory.asm</a>, so the user have to free the memory after use with the procedure <span class="procedure">FreeMem</span>. 
<p>On success (<span class="flag">CF=0</span>) the procedure returns a pointer to the allocated memory in <span class="register">EAX</span> and the count of bytes read in <span class="register">ECX</span>.</p>
<p>On error (<span class="flag">CF=1</span>) the procedure returns nothing.</p>

<a name="SaveBinaryFile"><h4>SaveBinaryFile</h4></a>
<pre class="fasm-code">
proc SaveBinaryFile, .ptrFileName, .aptr, .size
</pre>
<p>This procedure creates new file with the name pointed by <span class="variable">[.ptrFileName]</span> and saves <span class="variable">[.size]</span> bytes from the buffer pointed by  <span class="variable">[.aptr]</span>.</p>
<p>The procedure returns error flag in <span class="flag">CF</span>.</p>

<a name="FileExists"><h4>FileExists</h4></a>
<pre class="fasm-code">
proc FileExists, .ptrFileName
</pre>
<p>This procedure checks whether the file with name pointed by <span class="variable">[.ptrFileName]</span> exists on disk.</p>
<p>The procedure returns <span class="flag">CF=0</span> if the file exists, otherwise it returns<span class="flag">CF=1</span>.</p>
</nowiki>

Added freshlib/_doc/utf8/CaseFolding.txt.





















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
# CaseFolding-6.2.0.txt
# Date: 2012-08-14, 17:54:49 GMT [MD]
#
# Unicode Character Database
# Copyright (c) 1991-2012 Unicode, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
# For documentation, see http://www.unicode.org/reports/tr44/
#
# Case Folding Properties
#
# This file is a supplement to the UnicodeData file.
# It provides a case folding mapping generated from the Unicode Character Database.
# If all characters are mapped according to the full mapping below, then
# case differences (according to UnicodeData.txt and SpecialCasing.txt)
# are eliminated.
#
# The data supports both implementations that require simple case foldings
# (where string lengths don't change), and implementations that allow full case folding
# (where string lengths may grow). Note that where they can be supported, the
# full case foldings are superior: for example, they allow "MASSE" and "Maße" to match.
#
# All code points not listed in this file map to themselves.
#
# NOTE: case folding does not preserve normalization formats!
#
# For information on case folding, including how to have case folding 
# preserve normalization formats, see Section 3.13 Default Case Algorithms in
# The Unicode Standard, Version 5.0.
#
# ================================================================================
# Format
# ================================================================================
# The entries in this file are in the following machine-readable format:
#
# <code>; <status>; <mapping>; # <name>
#
# The status field is:
# C: common case folding, common mappings shared by both simple and full mappings.
# F: full case folding, mappings that cause strings to grow in length. Multiple characters are separated by spaces.
# S: simple case folding, mappings to single characters where different from F.
# T: special case for uppercase I and dotted uppercase I
#    - For non-Turkic languages, this mapping is normally not used.
#    - For Turkic languages (tr, az), this mapping can be used instead of the normal mapping for these characters.
#      Note that the Turkic mappings do not maintain canonical equivalence without additional processing.
#      See the discussions of case mapping in the Unicode Standard for more information.
#
# Usage:
#  A. To do a simple case folding, use the mappings with status C + S.
#  B. To do a full case folding, use the mappings with status C + F.
#
#    The mappings with status T can be used or omitted depending on the desired case-folding
#    behavior. (The default option is to exclude them.)
#
# =================================================================

# Property: Case_Folding

#  All code points not explicitly listed for Case_Folding
#  have the value C for the status field, and the code point itself for the mapping field.

# @missing: 0000..10FFFF; C; <code point>

# =================================================================
0041; C; 0061; # LATIN CAPITAL LETTER A
0042; C; 0062; # LATIN CAPITAL LETTER B
0043; C; 0063; # LATIN CAPITAL LETTER C
0044; C; 0064; # LATIN CAPITAL LETTER D
0045; C; 0065; # LATIN CAPITAL LETTER E
0046; C; 0066; # LATIN CAPITAL LETTER F
0047; C; 0067; # LATIN CAPITAL LETTER G
0048; C; 0068; # LATIN CAPITAL LETTER H
0049; C; 0069; # LATIN CAPITAL LETTER I
0049; T; 0131; # LATIN CAPITAL LETTER I
004A; C; 006A; # LATIN CAPITAL LETTER J
004B; C; 006B; # LATIN CAPITAL LETTER K
004C; C; 006C; # LATIN CAPITAL LETTER L
004D; C; 006D; # LATIN CAPITAL LETTER M
004E; C; 006E; # LATIN CAPITAL LETTER N
004F; C; 006F; # LATIN CAPITAL LETTER O
0050; C; 0070; # LATIN CAPITAL LETTER P
0051; C; 0071; # LATIN CAPITAL LETTER Q
0052; C; 0072; # LATIN CAPITAL LETTER R
0053; C; 0073; # LATIN CAPITAL LETTER S
0054; C; 0074; # LATIN CAPITAL LETTER T
0055; C; 0075; # LATIN CAPITAL LETTER U
0056; C; 0076; # LATIN CAPITAL LETTER V
0057; C; 0077; # LATIN CAPITAL LETTER W
0058; C; 0078; # LATIN CAPITAL LETTER X
0059; C; 0079; # LATIN CAPITAL LETTER Y
005A; C; 007A; # LATIN CAPITAL LETTER Z
00B5; C; 03BC; # MICRO SIGN
00C0; C; 00E0; # LATIN CAPITAL LETTER A WITH GRAVE
00C1; C; 00E1; # LATIN CAPITAL LETTER A WITH ACUTE
00C2; C; 00E2; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
00C3; C; 00E3; # LATIN CAPITAL LETTER A WITH TILDE
00C4; C; 00E4; # LATIN CAPITAL LETTER A WITH DIAERESIS
00C5; C; 00E5; # LATIN CAPITAL LETTER A WITH RING ABOVE
00C6; C; 00E6; # LATIN CAPITAL LETTER AE
00C7; C; 00E7; # LATIN CAPITAL LETTER C WITH CEDILLA
00C8; C; 00E8; # LATIN CAPITAL LETTER E WITH GRAVE
00C9; C; 00E9; # LATIN CAPITAL LETTER E WITH ACUTE
00CA; C; 00EA; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
00CB; C; 00EB; # LATIN CAPITAL LETTER E WITH DIAERESIS
00CC; C; 00EC; # LATIN CAPITAL LETTER I WITH GRAVE
00CD; C; 00ED; # LATIN CAPITAL LETTER I WITH ACUTE
00CE; C; 00EE; # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
00CF; C; 00EF; # LATIN CAPITAL LETTER I WITH DIAERESIS
00D0; C; 00F0; # LATIN CAPITAL LETTER ETH
00D1; C; 00F1; # LATIN CAPITAL LETTER N WITH TILDE
00D2; C; 00F2; # LATIN CAPITAL LETTER O WITH GRAVE
00D3; C; 00F3; # LATIN CAPITAL LETTER O WITH ACUTE
00D4; C; 00F4; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
00D5; C; 00F5; # LATIN CAPITAL LETTER O WITH TILDE
00D6; C; 00F6; # LATIN CAPITAL LETTER O WITH DIAERESIS
00D8; C; 00F8; # LATIN CAPITAL LETTER O WITH STROKE
00D9; C; 00F9; # LATIN CAPITAL LETTER U WITH GRAVE
00DA; C; 00FA; # LATIN CAPITAL LETTER U WITH ACUTE
00DB; C; 00FB; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
00DC; C; 00FC; # LATIN CAPITAL LETTER U WITH DIAERESIS
00DD; C; 00FD; # LATIN CAPITAL LETTER Y WITH ACUTE
00DE; C; 00FE; # LATIN CAPITAL LETTER THORN
00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S
0100; C; 0101; # LATIN CAPITAL LETTER A WITH MACRON
0102; C; 0103; # LATIN CAPITAL LETTER A WITH BREVE
0104; C; 0105; # LATIN CAPITAL LETTER A WITH OGONEK
0106; C; 0107; # LATIN CAPITAL LETTER C WITH ACUTE
0108; C; 0109; # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
010A; C; 010B; # LATIN CAPITAL LETTER C WITH DOT ABOVE
010C; C; 010D; # LATIN CAPITAL LETTER C WITH CARON
010E; C; 010F; # LATIN CAPITAL LETTER D WITH CARON
0110; C; 0111; # LATIN CAPITAL LETTER D WITH STROKE
0112; C; 0113; # LATIN CAPITAL LETTER E WITH MACRON
0114; C; 0115; # LATIN CAPITAL LETTER E WITH BREVE
0116; C; 0117; # LATIN CAPITAL LETTER E WITH DOT ABOVE
0118; C; 0119; # LATIN CAPITAL LETTER E WITH OGONEK
011A; C; 011B; # LATIN CAPITAL LETTER E WITH CARON
011C; C; 011D; # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
011E; C; 011F; # LATIN CAPITAL LETTER G WITH BREVE
0120; C; 0121; # LATIN CAPITAL LETTER G WITH DOT ABOVE
0122; C; 0123; # LATIN CAPITAL LETTER G WITH CEDILLA
0124; C; 0125; # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
0126; C; 0127; # LATIN CAPITAL LETTER H WITH STROKE
0128; C; 0129; # LATIN CAPITAL LETTER I WITH TILDE
012A; C; 012B; # LATIN CAPITAL LETTER I WITH MACRON
012C; C; 012D; # LATIN CAPITAL LETTER I WITH BREVE
012E; C; 012F; # LATIN CAPITAL LETTER I WITH OGONEK
0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE
0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE
0132; C; 0133; # LATIN CAPITAL LIGATURE IJ
0134; C; 0135; # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
0136; C; 0137; # LATIN CAPITAL LETTER K WITH CEDILLA
0139; C; 013A; # LATIN CAPITAL LETTER L WITH ACUTE
013B; C; 013C; # LATIN CAPITAL LETTER L WITH CEDILLA
013D; C; 013E; # LATIN CAPITAL LETTER L WITH CARON
013F; C; 0140; # LATIN CAPITAL LETTER L WITH MIDDLE DOT
0141; C; 0142; # LATIN CAPITAL LETTER L WITH STROKE
0143; C; 0144; # LATIN CAPITAL LETTER N WITH ACUTE
0145; C; 0146; # LATIN CAPITAL LETTER N WITH CEDILLA
0147; C; 0148; # LATIN CAPITAL LETTER N WITH CARON
0149; F; 02BC 006E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
014A; C; 014B; # LATIN CAPITAL LETTER ENG
014C; C; 014D; # LATIN CAPITAL LETTER O WITH MACRON
014E; C; 014F; # LATIN CAPITAL LETTER O WITH BREVE
0150; C; 0151; # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
0152; C; 0153; # LATIN CAPITAL LIGATURE OE
0154; C; 0155; # LATIN CAPITAL LETTER R WITH ACUTE
0156; C; 0157; # LATIN CAPITAL LETTER R WITH CEDILLA
0158; C; 0159; # LATIN CAPITAL LETTER R WITH CARON
015A; C; 015B; # LATIN CAPITAL LETTER S WITH ACUTE
015C; C; 015D; # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
015E; C; 015F; # LATIN CAPITAL LETTER S WITH CEDILLA
0160; C; 0161; # LATIN CAPITAL LETTER S WITH CARON
0162; C; 0163; # LATIN CAPITAL LETTER T WITH CEDILLA
0164; C; 0165; # LATIN CAPITAL LETTER T WITH CARON
0166; C; 0167; # LATIN CAPITAL LETTER T WITH STROKE
0168; C; 0169; # LATIN CAPITAL LETTER U WITH TILDE
016A; C; 016B; # LATIN CAPITAL LETTER U WITH MACRON
016C; C; 016D; # LATIN CAPITAL LETTER U WITH BREVE
016E; C; 016F; # LATIN CAPITAL LETTER U WITH RING ABOVE
0170; C; 0171; # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
0172; C; 0173; # LATIN CAPITAL LETTER U WITH OGONEK
0174; C; 0175; # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
0176; C; 0177; # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
0178; C; 00FF; # LATIN CAPITAL LETTER Y WITH DIAERESIS
0179; C; 017A; # LATIN CAPITAL LETTER Z WITH ACUTE
017B; C; 017C; # LATIN CAPITAL LETTER Z WITH DOT ABOVE
017D; C; 017E; # LATIN CAPITAL LETTER Z WITH CARON
017F; C; 0073; # LATIN SMALL LETTER LONG S
0181; C; 0253; # LATIN CAPITAL LETTER B WITH HOOK
0182; C; 0183; # LATIN CAPITAL LETTER B WITH TOPBAR
0184; C; 0185; # LATIN CAPITAL LETTER TONE SIX
0186; C; 0254; # LATIN CAPITAL LETTER OPEN O
0187; C; 0188; # LATIN CAPITAL LETTER C WITH HOOK
0189; C; 0256; # LATIN CAPITAL LETTER AFRICAN D
018A; C; 0257; # LATIN CAPITAL LETTER D WITH HOOK
018B; C; 018C; # LATIN CAPITAL LETTER D WITH TOPBAR
018E; C; 01DD; # LATIN CAPITAL LETTER REVERSED E
018F; C; 0259; # LATIN CAPITAL LETTER SCHWA
0190; C; 025B; # LATIN CAPITAL LETTER OPEN E
0191; C; 0192; # LATIN CAPITAL LETTER F WITH HOOK
0193; C; 0260; # LATIN CAPITAL LETTER G WITH HOOK
0194; C; 0263; # LATIN CAPITAL LETTER GAMMA
0196; C; 0269; # LATIN CAPITAL LETTER IOTA
0197; C; 0268; # LATIN CAPITAL LETTER I WITH STROKE
0198; C; 0199; # LATIN CAPITAL LETTER K WITH HOOK
019C; C; 026F; # LATIN CAPITAL LETTER TURNED M
019D; C; 0272; # LATIN CAPITAL LETTER N WITH LEFT HOOK
019F; C; 0275; # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
01A0; C; 01A1; # LATIN CAPITAL LETTER O WITH HORN
01A2; C; 01A3; # LATIN CAPITAL LETTER OI
01A4; C; 01A5; # LATIN CAPITAL LETTER P WITH HOOK
01A6; C; 0280; # LATIN LETTER YR
01A7; C; 01A8; # LATIN CAPITAL LETTER TONE TWO
01A9; C; 0283; # LATIN CAPITAL LETTER ESH
01AC; C; 01AD; # LATIN CAPITAL LETTER T WITH HOOK
01AE; C; 0288; # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
01AF; C; 01B0; # LATIN CAPITAL LETTER U WITH HORN
01B1; C; 028A; # LATIN CAPITAL LETTER UPSILON
01B2; C; 028B; # LATIN CAPITAL LETTER V WITH HOOK
01B3; C; 01B4; # LATIN CAPITAL LETTER Y WITH HOOK
01B5; C; 01B6; # LATIN CAPITAL LETTER Z WITH STROKE
01B7; C; 0292; # LATIN CAPITAL LETTER EZH
01B8; C; 01B9; # LATIN CAPITAL LETTER EZH REVERSED
01BC; C; 01BD; # LATIN CAPITAL LETTER TONE FIVE
01C4; C; 01C6; # LATIN CAPITAL LETTER DZ WITH CARON
01C5; C; 01C6; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
01C7; C; 01C9; # LATIN CAPITAL LETTER LJ
01C8; C; 01C9; # LATIN CAPITAL LETTER L WITH SMALL LETTER J
01CA; C; 01CC; # LATIN CAPITAL LETTER NJ
01CB; C; 01CC; # LATIN CAPITAL LETTER N WITH SMALL LETTER J
01CD; C; 01CE; # LATIN CAPITAL LETTER A WITH CARON
01CF; C; 01D0; # LATIN CAPITAL LETTER I WITH CARON
01D1; C; 01D2; # LATIN CAPITAL LETTER O WITH CARON
01D3; C; 01D4; # LATIN CAPITAL LETTER U WITH CARON
01D5; C; 01D6; # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
01D7; C; 01D8; # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
01D9; C; 01DA; # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
01DB; C; 01DC; # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
01DE; C; 01DF; # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
01E0; C; 01E1; # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
01E2; C; 01E3; # LATIN CAPITAL LETTER AE WITH MACRON
01E4; C; 01E5; # LATIN CAPITAL LETTER G WITH STROKE
01E6; C; 01E7; # LATIN CAPITAL LETTER G WITH CARON
01E8; C; 01E9; # LATIN CAPITAL LETTER K WITH CARON
01EA; C; 01EB; # LATIN CAPITAL LETTER O WITH OGONEK
01EC; C; 01ED; # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
01EE; C; 01EF; # LATIN CAPITAL LETTER EZH WITH CARON
01F0; F; 006A 030C; # LATIN SMALL LETTER J WITH CARON
01F1; C; 01F3; # LATIN CAPITAL LETTER DZ
01F2; C; 01F3; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z
01F4; C; 01F5; # LATIN CAPITAL LETTER G WITH ACUTE
01F6; C; 0195; # LATIN CAPITAL LETTER HWAIR
01F7; C; 01BF; # LATIN CAPITAL LETTER WYNN
01F8; C; 01F9; # LATIN CAPITAL LETTER N WITH GRAVE
01FA; C; 01FB; # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
01FC; C; 01FD; # LATIN CAPITAL LETTER AE WITH ACUTE
01FE; C; 01FF; # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
0200; C; 0201; # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
0202; C; 0203; # LATIN CAPITAL LETTER A WITH INVERTED BREVE
0204; C; 0205; # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
0206; C; 0207; # LATIN CAPITAL LETTER E WITH INVERTED BREVE
0208; C; 0209; # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
020A; C; 020B; # LATIN CAPITAL LETTER I WITH INVERTED BREVE
020C; C; 020D; # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
020E; C; 020F; # LATIN CAPITAL LETTER O WITH INVERTED BREVE
0210; C; 0211; # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
0212; C; 0213; # LATIN CAPITAL LETTER R WITH INVERTED BREVE
0214; C; 0215; # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
0216; C; 0217; # LATIN CAPITAL LETTER U WITH INVERTED BREVE
0218; C; 0219; # LATIN CAPITAL LETTER S WITH COMMA BELOW
021A; C; 021B; # LATIN CAPITAL LETTER T WITH COMMA BELOW
021C; C; 021D; # LATIN CAPITAL LETTER YOGH
021E; C; 021F; # LATIN CAPITAL LETTER H WITH CARON
0220; C; 019E; # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
0222; C; 0223; # LATIN CAPITAL LETTER OU
0224; C; 0225; # LATIN CAPITAL LETTER Z WITH HOOK
0226; C; 0227; # LATIN CAPITAL LETTER A WITH DOT ABOVE
0228; C; 0229; # LATIN CAPITAL LETTER E WITH CEDILLA
022A; C; 022B; # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
022C; C; 022D; # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
022E; C; 022F; # LATIN CAPITAL LETTER O WITH DOT ABOVE
0230; C; 0231; # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
0232; C; 0233; # LATIN CAPITAL LETTER Y WITH MACRON
023A; C; 2C65; # LATIN CAPITAL LETTER A WITH STROKE
023B; C; 023C; # LATIN CAPITAL LETTER C WITH STROKE
023D; C; 019A; # LATIN CAPITAL LETTER L WITH BAR
023E; C; 2C66; # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
0241; C; 0242; # LATIN CAPITAL LETTER GLOTTAL STOP
0243; C; 0180; # LATIN CAPITAL LETTER B WITH STROKE
0244; C; 0289; # LATIN CAPITAL LETTER U BAR
0245; C; 028C; # LATIN CAPITAL LETTER TURNED V
0246; C; 0247; # LATIN CAPITAL LETTER E WITH STROKE
0248; C; 0249; # LATIN CAPITAL LETTER J WITH STROKE
024A; C; 024B; # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
024C; C; 024D; # LATIN CAPITAL LETTER R WITH STROKE
024E; C; 024F; # LATIN CAPITAL LETTER Y WITH STROKE
0345; C; 03B9; # COMBINING GREEK YPOGEGRAMMENI
0370; C; 0371; # GREEK CAPITAL LETTER HETA
0372; C; 0373; # GREEK CAPITAL LETTER ARCHAIC SAMPI
0376; C; 0377; # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
0386; C; 03AC; # GREEK CAPITAL LETTER ALPHA WITH TONOS
0388; C; 03AD; # GREEK CAPITAL LETTER EPSILON WITH TONOS
0389; C; 03AE; # GREEK CAPITAL LETTER ETA WITH TONOS
038A; C; 03AF; # GREEK CAPITAL LETTER IOTA WITH TONOS
038C; C; 03CC; # GREEK CAPITAL LETTER OMICRON WITH TONOS
038E; C; 03CD; # GREEK CAPITAL LETTER UPSILON WITH TONOS
038F; C; 03CE; # GREEK CAPITAL LETTER OMEGA WITH TONOS
0390; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
0391; C; 03B1; # GREEK CAPITAL LETTER ALPHA
0392; C; 03B2; # GREEK CAPITAL LETTER BETA
0393; C; 03B3; # GREEK CAPITAL LETTER GAMMA
0394; C; 03B4; # GREEK CAPITAL LETTER DELTA
0395; C; 03B5; # GREEK CAPITAL LETTER EPSILON
0396; C; 03B6; # GREEK CAPITAL LETTER ZETA
0397; C; 03B7; # GREEK CAPITAL LETTER ETA
0398; C; 03B8; # GREEK CAPITAL LETTER THETA
0399; C; 03B9; # GREEK CAPITAL LETTER IOTA
039A; C; 03BA; # GREEK CAPITAL LETTER KAPPA
039B; C; 03BB; # GREEK CAPITAL LETTER LAMDA
039C; C; 03BC; # GREEK CAPITAL LETTER MU
039D; C; 03BD; # GREEK CAPITAL LETTER NU
039E; C; 03BE; # GREEK CAPITAL LETTER XI
039F; C; 03BF; # GREEK CAPITAL LETTER OMICRON
03A0; C; 03C0; # GREEK CAPITAL LETTER PI
03A1; C; 03C1; # GREEK CAPITAL LETTER RHO
03A3; C; 03C3; # GREEK CAPITAL LETTER SIGMA
03A4; C; 03C4; # GREEK CAPITAL LETTER TAU
03A5; C; 03C5; # GREEK CAPITAL LETTER UPSILON
03A6; C; 03C6; # GREEK CAPITAL LETTER PHI
03A7; C; 03C7; # GREEK CAPITAL LETTER CHI
03A8; C; 03C8; # GREEK CAPITAL LETTER PSI
03A9; C; 03C9; # GREEK CAPITAL LETTER OMEGA
03AA; C; 03CA; # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
03AB; C; 03CB; # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
03B0; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
03C2; C; 03C3; # GREEK SMALL LETTER FINAL SIGMA
03CF; C; 03D7; # GREEK CAPITAL KAI SYMBOL
03D0; C; 03B2; # GREEK BETA SYMBOL
03D1; C; 03B8; # GREEK THETA SYMBOL
03D5; C; 03C6; # GREEK PHI SYMBOL
03D6; C; 03C0; # GREEK PI SYMBOL
03D8; C; 03D9; # GREEK LETTER ARCHAIC KOPPA
03DA; C; 03DB; # GREEK LETTER STIGMA
03DC; C; 03DD; # GREEK LETTER DIGAMMA
03DE; C; 03DF; # GREEK LETTER KOPPA
03E0; C; 03E1; # GREEK LETTER SAMPI
03E2; C; 03E3; # COPTIC CAPITAL LETTER SHEI
03E4; C; 03E5; # COPTIC CAPITAL LETTER FEI
03E6; C; 03E7; # COPTIC CAPITAL LETTER KHEI
03E8; C; 03E9; # COPTIC CAPITAL LETTER HORI
03EA; C; 03EB; # COPTIC CAPITAL LETTER GANGIA
03EC; C; 03ED; # COPTIC CAPITAL LETTER SHIMA
03EE; C; 03EF; # COPTIC CAPITAL LETTER DEI
03F0; C; 03BA; # GREEK KAPPA SYMBOL
03F1; C; 03C1; # GREEK RHO SYMBOL
03F4; C; 03B8; # GREEK CAPITAL THETA SYMBOL
03F5; C; 03B5; # GREEK LUNATE EPSILON SYMBOL
03F7; C; 03F8; # GREEK CAPITAL LETTER SHO
03F9; C; 03F2; # GREEK CAPITAL LUNATE SIGMA SYMBOL
03FA; C; 03FB; # GREEK CAPITAL LETTER SAN
03FD; C; 037B; # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
03FE; C; 037C; # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
03FF; C; 037D; # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
0400; C; 0450; # CYRILLIC CAPITAL LETTER IE WITH GRAVE
0401; C; 0451; # CYRILLIC CAPITAL LETTER IO
0402; C; 0452; # CYRILLIC CAPITAL LETTER DJE
0403; C; 0453; # CYRILLIC CAPITAL LETTER GJE
0404; C; 0454; # CYRILLIC CAPITAL LETTER UKRAINIAN IE
0405; C; 0455; # CYRILLIC CAPITAL LETTER DZE
0406; C; 0456; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
0407; C; 0457; # CYRILLIC CAPITAL LETTER YI
0408; C; 0458; # CYRILLIC CAPITAL LETTER JE
0409; C; 0459; # CYRILLIC CAPITAL LETTER LJE
040A; C; 045A; # CYRILLIC CAPITAL LETTER NJE
040B; C; 045B; # CYRILLIC CAPITAL LETTER TSHE
040C; C; 045C; # CYRILLIC CAPITAL LETTER KJE
040D; C; 045D; # CYRILLIC CAPITAL LETTER I WITH GRAVE
040E; C; 045E; # CYRILLIC CAPITAL LETTER SHORT U
040F; C; 045F; # CYRILLIC CAPITAL LETTER DZHE
0410; C; 0430; # CYRILLIC CAPITAL LETTER A
0411; C; 0431; # CYRILLIC CAPITAL LETTER BE
0412; C; 0432; # CYRILLIC CAPITAL LETTER VE
0413; C; 0433; # CYRILLIC CAPITAL LETTER GHE
0414; C; 0434; # CYRILLIC CAPITAL LETTER DE
0415; C; 0435; # CYRILLIC CAPITAL LETTER IE
0416; C; 0436; # CYRILLIC CAPITAL LETTER ZHE
0417; C; 0437; # CYRILLIC CAPITAL LETTER ZE
0418; C; 0438; # CYRILLIC CAPITAL LETTER I
0419; C; 0439; # CYRILLIC CAPITAL LETTER SHORT I
041A; C; 043A; # CYRILLIC CAPITAL LETTER KA
041B; C; 043B; # CYRILLIC CAPITAL LETTER EL
041C; C; 043C; # CYRILLIC CAPITAL LETTER EM
041D; C; 043D; # CYRILLIC CAPITAL LETTER EN
041E; C; 043E; # CYRILLIC CAPITAL LETTER O
041F; C; 043F; # CYRILLIC CAPITAL LETTER PE
0420; C; 0440; # CYRILLIC CAPITAL LETTER ER
0421; C; 0441; # CYRILLIC CAPITAL LETTER ES
0422; C; 0442; # CYRILLIC CAPITAL LETTER TE
0423; C; 0443; # CYRILLIC CAPITAL LETTER U
0424; C; 0444; # CYRILLIC CAPITAL LETTER EF
0425; C; 0445; # CYRILLIC CAPITAL LETTER HA
0426; C; 0446; # CYRILLIC CAPITAL LETTER TSE
0427; C; 0447; # CYRILLIC CAPITAL LETTER CHE
0428; C; 0448; # CYRILLIC CAPITAL LETTER SHA
0429; C; 0449; # CYRILLIC CAPITAL LETTER SHCHA
042A; C; 044A; # CYRILLIC CAPITAL LETTER HARD SIGN
042B; C; 044B; # CYRILLIC CAPITAL LETTER YERU
042C; C; 044C; # CYRILLIC CAPITAL LETTER SOFT SIGN
042D; C; 044D; # CYRILLIC CAPITAL LETTER E
042E; C; 044E; # CYRILLIC CAPITAL LETTER YU
042F; C; 044F; # CYRILLIC CAPITAL LETTER YA
0460; C; 0461; # CYRILLIC CAPITAL LETTER OMEGA
0462; C; 0463; # CYRILLIC CAPITAL LETTER YAT
0464; C; 0465; # CYRILLIC CAPITAL LETTER IOTIFIED E
0466; C; 0467; # CYRILLIC CAPITAL LETTER LITTLE YUS
0468; C; 0469; # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
046A; C; 046B; # CYRILLIC CAPITAL LETTER BIG YUS
046C; C; 046D; # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
046E; C; 046F; # CYRILLIC CAPITAL LETTER KSI
0470; C; 0471; # CYRILLIC CAPITAL LETTER PSI
0472; C; 0473; # CYRILLIC CAPITAL LETTER FITA
0474; C; 0475; # CYRILLIC CAPITAL LETTER IZHITSA
0476; C; 0477; # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
0478; C; 0479; # CYRILLIC CAPITAL LETTER UK
047A; C; 047B; # CYRILLIC CAPITAL LETTER ROUND OMEGA
047C; C; 047D; # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
047E; C; 047F; # CYRILLIC CAPITAL LETTER OT
0480; C; 0481; # CYRILLIC CAPITAL LETTER KOPPA
048A; C; 048B; # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
048C; C; 048D; # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
048E; C; 048F; # CYRILLIC CAPITAL LETTER ER WITH TICK
0490; C; 0491; # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
0492; C; 0493; # CYRILLIC CAPITAL LETTER GHE WITH STROKE
0494; C; 0495; # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
0496; C; 0497; # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
0498; C; 0499; # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
049A; C; 049B; # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
049C; C; 049D; # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
049E; C; 049F; # CYRILLIC CAPITAL LETTER KA WITH STROKE
04A0; C; 04A1; # CYRILLIC CAPITAL LETTER BASHKIR KA
04A2; C; 04A3; # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
04A4; C; 04A5; # CYRILLIC CAPITAL LIGATURE EN GHE
04A6; C; 04A7; # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
04A8; C; 04A9; # CYRILLIC CAPITAL LETTER ABKHASIAN HA
04AA; C; 04AB; # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
04AC; C; 04AD; # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
04AE; C; 04AF; # CYRILLIC CAPITAL LETTER STRAIGHT U
04B0; C; 04B1; # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
04B2; C; 04B3; # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
04B4; C; 04B5; # CYRILLIC CAPITAL LIGATURE TE TSE
04B6; C; 04B7; # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
04B8; C; 04B9; # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
04BA; C; 04BB; # CYRILLIC CAPITAL LETTER SHHA
04BC; C; 04BD; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
04BE; C; 04BF; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
04C0; C; 04CF; # CYRILLIC LETTER PALOCHKA
04C1; C; 04C2; # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
04C3; C; 04C4; # CYRILLIC CAPITAL LETTER KA WITH HOOK
04C5; C; 04C6; # CYRILLIC CAPITAL LETTER EL WITH TAIL
04C7; C; 04C8; # CYRILLIC CAPITAL LETTER EN WITH HOOK
04C9; C; 04CA; # CYRILLIC CAPITAL LETTER EN WITH TAIL
04CB; C; 04CC; # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
04CD; C; 04CE; # CYRILLIC CAPITAL LETTER EM WITH TAIL
04D0; C; 04D1; # CYRILLIC CAPITAL LETTER A WITH BREVE
04D2; C; 04D3; # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
04D4; C; 04D5; # CYRILLIC CAPITAL LIGATURE A IE
04D6; C; 04D7; # CYRILLIC CAPITAL LETTER IE WITH BREVE
04D8; C; 04D9; # CYRILLIC CAPITAL LETTER SCHWA
04DA; C; 04DB; # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
04DC; C; 04DD; # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
04DE; C; 04DF; # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
04E0; C; 04E1; # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
04E2; C; 04E3; # CYRILLIC CAPITAL LETTER I WITH MACRON
04E4; C; 04E5; # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
04E6; C; 04E7; # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
04E8; C; 04E9; # CYRILLIC CAPITAL LETTER BARRED O
04EA; C; 04EB; # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
04EC; C; 04ED; # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
04EE; C; 04EF; # CYRILLIC CAPITAL LETTER U WITH MACRON
04F0; C; 04F1; # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
04F2; C; 04F3; # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
04F4; C; 04F5; # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
04F6; C; 04F7; # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
04F8; C; 04F9; # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
04FA; C; 04FB; # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
04FC; C; 04FD; # CYRILLIC CAPITAL LETTER HA WITH HOOK
04FE; C; 04FF; # CYRILLIC CAPITAL LETTER HA WITH STROKE
0500; C; 0501; # CYRILLIC CAPITAL LETTER KOMI DE
0502; C; 0503; # CYRILLIC CAPITAL LETTER KOMI DJE
0504; C; 0505; # CYRILLIC CAPITAL LETTER KOMI ZJE
0506; C; 0507; # CYRILLIC CAPITAL LETTER KOMI DZJE
0508; C; 0509; # CYRILLIC CAPITAL LETTER KOMI LJE
050A; C; 050B; # CYRILLIC CAPITAL LETTER KOMI NJE
050C; C; 050D; # CYRILLIC CAPITAL LETTER KOMI SJE
050E; C; 050F; # CYRILLIC CAPITAL LETTER KOMI TJE
0510; C; 0511; # CYRILLIC CAPITAL LETTER REVERSED ZE
0512; C; 0513; # CYRILLIC CAPITAL LETTER EL WITH HOOK
0514; C; 0515; # CYRILLIC CAPITAL LETTER LHA
0516; C; 0517; # CYRILLIC CAPITAL LETTER RHA
0518; C; 0519; # CYRILLIC CAPITAL LETTER YAE
051A; C; 051B; # CYRILLIC CAPITAL LETTER QA
051C; C; 051D; # CYRILLIC CAPITAL LETTER WE
051E; C; 051F; # CYRILLIC CAPITAL LETTER ALEUT KA
0520; C; 0521; # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
0522; C; 0523; # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
0524; C; 0525; # CYRILLIC CAPITAL LETTER PE WITH DESCENDER
0526; C; 0527; # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER
0531; C; 0561; # ARMENIAN CAPITAL LETTER AYB
0532; C; 0562; # ARMENIAN CAPITAL LETTER BEN
0533; C; 0563; # ARMENIAN CAPITAL LETTER GIM
0534; C; 0564; # ARMENIAN CAPITAL LETTER DA
0535; C; 0565; # ARMENIAN CAPITAL LETTER ECH
0536; C; 0566; # ARMENIAN CAPITAL LETTER ZA
0537; C; 0567; # ARMENIAN CAPITAL LETTER EH
0538; C; 0568; # ARMENIAN CAPITAL LETTER ET
0539; C; 0569; # ARMENIAN CAPITAL LETTER TO
053A; C; 056A; # ARMENIAN CAPITAL LETTER ZHE
053B; C; 056B; # ARMENIAN CAPITAL LETTER INI
053C; C; 056C; # ARMENIAN CAPITAL LETTER LIWN
053D; C; 056D; # ARMENIAN CAPITAL LETTER XEH
053E; C; 056E; # ARMENIAN CAPITAL LETTER CA
053F; C; 056F; # ARMENIAN CAPITAL LETTER KEN
0540; C; 0570; # ARMENIAN CAPITAL LETTER HO
0541; C; 0571; # ARMENIAN CAPITAL LETTER JA
0542; C; 0572; # ARMENIAN CAPITAL LETTER GHAD
0543; C; 0573; # ARMENIAN CAPITAL LETTER CHEH
0544; C; 0574; # ARMENIAN CAPITAL LETTER MEN
0545; C; 0575; # ARMENIAN CAPITAL LETTER YI
0546; C; 0576; # ARMENIAN CAPITAL LETTER NOW
0547; C; 0577; # ARMENIAN CAPITAL LETTER SHA
0548; C; 0578; # ARMENIAN CAPITAL LETTER VO
0549; C; 0579; # ARMENIAN CAPITAL LETTER CHA
054A; C; 057A; # ARMENIAN CAPITAL LETTER PEH
054B; C; 057B; # ARMENIAN CAPITAL LETTER JHEH
054C; C; 057C; # ARMENIAN CAPITAL LETTER RA
054D; C; 057D; # ARMENIAN CAPITAL LETTER SEH
054E; C; 057E; # ARMENIAN CAPITAL LETTER VEW
054F; C; 057F; # ARMENIAN CAPITAL LETTER TIWN
0550; C; 0580; # ARMENIAN CAPITAL LETTER REH
0551; C; 0581; # ARMENIAN CAPITAL LETTER CO
0552; C; 0582; # ARMENIAN CAPITAL LETTER YIWN
0553; C; 0583; # ARMENIAN CAPITAL LETTER PIWR
0554; C; 0584; # ARMENIAN CAPITAL LETTER KEH
0555; C; 0585; # ARMENIAN CAPITAL LETTER OH
0556; C; 0586; # ARMENIAN CAPITAL LETTER FEH
0587; F; 0565 0582; # ARMENIAN SMALL LIGATURE ECH YIWN
10A0; C; 2D00; # GEORGIAN CAPITAL LETTER AN
10A1; C; 2D01; # GEORGIAN CAPITAL LETTER BAN
10A2; C; 2D02; # GEORGIAN CAPITAL LETTER GAN
10A3; C; 2D03; # GEORGIAN CAPITAL LETTER DON
10A4; C; 2D04; # GEORGIAN CAPITAL LETTER EN
10A5; C; 2D05; # GEORGIAN CAPITAL LETTER VIN
10A6; C; 2D06; # GEORGIAN CAPITAL LETTER ZEN
10A7; C; 2D07; # GEORGIAN CAPITAL LETTER TAN
10A8; C; 2D08; # GEORGIAN CAPITAL LETTER IN
10A9; C; 2D09; # GEORGIAN CAPITAL LETTER KAN
10AA; C; 2D0A; # GEORGIAN CAPITAL LETTER LAS
10AB; C; 2D0B; # GEORGIAN CAPITAL LETTER MAN
10AC; C; 2D0C; # GEORGIAN CAPITAL LETTER NAR
10AD; C; 2D0D; # GEORGIAN CAPITAL LETTER ON
10AE; C; 2D0E; # GEORGIAN CAPITAL LETTER PAR
10AF; C; 2D0F; # GEORGIAN CAPITAL LETTER ZHAR
10B0; C; 2D10; # GEORGIAN CAPITAL LETTER RAE
10B1; C; 2D11; # GEORGIAN CAPITAL LETTER SAN
10B2; C; 2D12; # GEORGIAN CAPITAL LETTER TAR
10B3; C; 2D13; # GEORGIAN CAPITAL LETTER UN
10B4; C; 2D14; # GEORGIAN CAPITAL LETTER PHAR
10B5; C; 2D15; # GEORGIAN CAPITAL LETTER KHAR
10B6; C; 2D16; # GEORGIAN CAPITAL LETTER GHAN
10B7; C; 2D17; # GEORGIAN CAPITAL LETTER QAR
10B8; C; 2D18; # GEORGIAN CAPITAL LETTER SHIN
10B9; C; 2D19; # GEORGIAN CAPITAL LETTER CHIN
10BA; C; 2D1A; # GEORGIAN CAPITAL LETTER CAN
10BB; C; 2D1B; # GEORGIAN CAPITAL LETTER JIL
10BC; C; 2D1C; # GEORGIAN CAPITAL LETTER CIL
10BD; C; 2D1D; # GEORGIAN CAPITAL LETTER CHAR
10BE; C; 2D1E; # GEORGIAN CAPITAL LETTER XAN
10BF; C; 2D1F; # GEORGIAN CAPITAL LETTER JHAN
10C0; C; 2D20; # GEORGIAN CAPITAL LETTER HAE
10C1; C; 2D21; # GEORGIAN CAPITAL LETTER HE
10C2; C; 2D22; # GEORGIAN CAPITAL LETTER HIE
10C3; C; 2D23; # GEORGIAN CAPITAL LETTER WE
10C4; C; 2D24; # GEORGIAN CAPITAL LETTER HAR
10C5; C; 2D25; # GEORGIAN CAPITAL LETTER HOE
10C7; C; 2D27; # GEORGIAN CAPITAL LETTER YN
10CD; C; 2D2D; # GEORGIAN CAPITAL LETTER AEN
1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW
1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE
1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW
1E06; C; 1E07; # LATIN CAPITAL LETTER B WITH LINE BELOW
1E08; C; 1E09; # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
1E0A; C; 1E0B; # LATIN CAPITAL LETTER D WITH DOT ABOVE
1E0C; C; 1E0D; # LATIN CAPITAL LETTER D WITH DOT BELOW
1E0E; C; 1E0F; # LATIN CAPITAL LETTER D WITH LINE BELOW
1E10; C; 1E11; # LATIN CAPITAL LETTER D WITH CEDILLA
1E12; C; 1E13; # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
1E14; C; 1E15; # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
1E16; C; 1E17; # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
1E18; C; 1E19; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
1E1A; C; 1E1B; # LATIN CAPITAL LETTER E WITH TILDE BELOW
1E1C; C; 1E1D; # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
1E1E; C; 1E1F; # LATIN CAPITAL LETTER F WITH DOT ABOVE
1E20; C; 1E21; # LATIN CAPITAL LETTER G WITH MACRON
1E22; C; 1E23; # LATIN CAPITAL LETTER H WITH DOT ABOVE
1E24; C; 1E25; # LATIN CAPITAL LETTER H WITH DOT BELOW
1E26; C; 1E27; # LATIN CAPITAL LETTER H WITH DIAERESIS
1E28; C; 1E29; # LATIN CAPITAL LETTER H WITH CEDILLA
1E2A; C; 1E2B; # LATIN CAPITAL LETTER H WITH BREVE BELOW
1E2C; C; 1E2D; # LATIN CAPITAL LETTER I WITH TILDE BELOW
1E2E; C; 1E2F; # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
1E30; C; 1E31; # LATIN CAPITAL LETTER K WITH ACUTE
1E32; C; 1E33; # LATIN CAPITAL LETTER K WITH DOT BELOW
1E34; C; 1E35; # LATIN CAPITAL LETTER K WITH LINE BELOW
1E36; C; 1E37; # LATIN CAPITAL LETTER L WITH DOT BELOW
1E38; C; 1E39; # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
1E3A; C; 1E3B; # LATIN CAPITAL LETTER L WITH LINE BELOW
1E3C; C; 1E3D; # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
1E3E; C; 1E3F; # LATIN CAPITAL LETTER M WITH ACUTE
1E40; C; 1E41; # LATIN CAPITAL LETTER M WITH DOT ABOVE
1E42; C; 1E43; # LATIN CAPITAL LETTER M WITH DOT BELOW
1E44; C; 1E45; # LATIN CAPITAL LETTER N WITH DOT ABOVE
1E46; C; 1E47; # LATIN CAPITAL LETTER N WITH DOT BELOW
1E48; C; 1E49; # LATIN CAPITAL LETTER N WITH LINE BELOW
1E4A; C; 1E4B; # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
1E4C; C; 1E4D; # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
1E4E; C; 1E4F; # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
1E50; C; 1E51; # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
1E52; C; 1E53; # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
1E54; C; 1E55; # LATIN CAPITAL LETTER P WITH ACUTE
1E56; C; 1E57; # LATIN CAPITAL LETTER P WITH DOT ABOVE
1E58; C; 1E59; # LATIN CAPITAL LETTER R WITH DOT ABOVE
1E5A; C; 1E5B; # LATIN CAPITAL LETTER R WITH DOT BELOW
1E5C; C; 1E5D; # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
1E5E; C; 1E5F; # LATIN CAPITAL LETTER R WITH LINE BELOW
1E60; C; 1E61; # LATIN CAPITAL LETTER S WITH DOT ABOVE
1E62; C; 1E63; # LATIN CAPITAL LETTER S WITH DOT BELOW
1E64; C; 1E65; # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
1E66; C; 1E67; # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
1E68; C; 1E69; # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
1E6A; C; 1E6B; # LATIN CAPITAL LETTER T WITH DOT ABOVE
1E6C; C; 1E6D; # LATIN CAPITAL LETTER T WITH DOT BELOW
1E6E; C; 1E6F; # LATIN CAPITAL LETTER T WITH LINE BELOW
1E70; C; 1E71; # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
1E72; C; 1E73; # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
1E74; C; 1E75; # LATIN CAPITAL LETTER U WITH TILDE BELOW
1E76; C; 1E77; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
1E78; C; 1E79; # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
1E7A; C; 1E7B; # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
1E7C; C; 1E7D; # LATIN CAPITAL LETTER V WITH TILDE
1E7E; C; 1E7F; # LATIN CAPITAL LETTER V WITH DOT BELOW
1E80; C; 1E81; # LATIN CAPITAL LETTER W WITH GRAVE
1E82; C; 1E83; # LATIN CAPITAL LETTER W WITH ACUTE
1E84; C; 1E85; # LATIN CAPITAL LETTER W WITH DIAERESIS
1E86; C; 1E87; # LATIN CAPITAL LETTER W WITH DOT ABOVE
1E88; C; 1E89; # LATIN CAPITAL LETTER W WITH DOT BELOW
1E8A; C; 1E8B; # LATIN CAPITAL LETTER X WITH DOT ABOVE
1E8C; C; 1E8D; # LATIN CAPITAL LETTER X WITH DIAERESIS
1E8E; C; 1E8F; # LATIN CAPITAL LETTER Y WITH DOT ABOVE
1E90; C; 1E91; # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
1E92; C; 1E93; # LATIN CAPITAL LETTER Z WITH DOT BELOW
1E94; C; 1E95; # LATIN CAPITAL LETTER Z WITH LINE BELOW
1E96; F; 0068 0331; # LATIN SMALL LETTER H WITH LINE BELOW
1E97; F; 0074 0308; # LATIN SMALL LETTER T WITH DIAERESIS
1E98; F; 0077 030A; # LATIN SMALL LETTER W WITH RING ABOVE
1E99; F; 0079 030A; # LATIN SMALL LETTER Y WITH RING ABOVE
1E9A; F; 0061 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING
1E9B; C; 1E61; # LATIN SMALL LETTER LONG S WITH DOT ABOVE
1E9E; F; 0073 0073; # LATIN CAPITAL LETTER SHARP S
1E9E; S; 00DF; # LATIN CAPITAL LETTER SHARP S
1EA0; C; 1EA1; # LATIN CAPITAL LETTER A WITH DOT BELOW
1EA2; C; 1EA3; # LATIN CAPITAL LETTER A WITH HOOK ABOVE
1EA4; C; 1EA5; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
1EA6; C; 1EA7; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
1EA8; C; 1EA9; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
1EAA; C; 1EAB; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
1EAC; C; 1EAD; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
1EAE; C; 1EAF; # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
1EB0; C; 1EB1; # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
1EB2; C; 1EB3; # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
1EB4; C; 1EB5; # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
1EB6; C; 1EB7; # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
1EB8; C; 1EB9; # LATIN CAPITAL LETTER E WITH DOT BELOW
1EBA; C; 1EBB; # LATIN CAPITAL LETTER E WITH HOOK ABOVE
1EBC; C; 1EBD; # LATIN CAPITAL LETTER E WITH TILDE
1EBE; C; 1EBF; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
1EC0; C; 1EC1; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
1EC2; C; 1EC3; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
1EC4; C; 1EC5; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
1EC6; C; 1EC7; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
1EC8; C; 1EC9; # LATIN CAPITAL LETTER I WITH HOOK ABOVE
1ECA; C; 1ECB; # LATIN CAPITAL LETTER I WITH DOT BELOW
1ECC; C; 1ECD; # LATIN CAPITAL LETTER O WITH DOT BELOW
1ECE; C; 1ECF; # LATIN CAPITAL LETTER O WITH HOOK ABOVE
1ED0; C; 1ED1; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
1ED2; C; 1ED3; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
1ED4; C; 1ED5; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
1ED6; C; 1ED7; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
1ED8; C; 1ED9; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
1EDA; C; 1EDB; # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
1EDC; C; 1EDD; # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
1EDE; C; 1EDF; # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
1EE0; C; 1EE1; # LATIN CAPITAL LETTER O WITH HORN AND TILDE
1EE2; C; 1EE3; # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
1EE4; C; 1EE5; # LATIN CAPITAL LETTER U WITH DOT BELOW
1EE6; C; 1EE7; # LATIN CAPITAL LETTER U WITH HOOK ABOVE
1EE8; C; 1EE9; # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
1EEA; C; 1EEB; # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
1EEC; C; 1EED; # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
1EEE; C; 1EEF; # LATIN CAPITAL LETTER U WITH HORN AND TILDE
1EF0; C; 1EF1; # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
1EF2; C; 1EF3; # LATIN CAPITAL LETTER Y WITH GRAVE
1EF4; C; 1EF5; # LATIN CAPITAL LETTER Y WITH DOT BELOW
1EF6; C; 1EF7; # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
1EF8; C; 1EF9; # LATIN CAPITAL LETTER Y WITH TILDE
1EFA; C; 1EFB; # LATIN CAPITAL LETTER MIDDLE-WELSH LL
1EFC; C; 1EFD; # LATIN CAPITAL LETTER MIDDLE-WELSH V
1EFE; C; 1EFF; # LATIN CAPITAL LETTER Y WITH LOOP
1F08; C; 1F00; # GREEK CAPITAL LETTER ALPHA WITH PSILI
1F09; C; 1F01; # GREEK CAPITAL LETTER ALPHA WITH DASIA
1F0A; C; 1F02; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
1F0B; C; 1F03; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
1F0C; C; 1F04; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
1F0D; C; 1F05; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
1F0E; C; 1F06; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
1F0F; C; 1F07; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
1F18; C; 1F10; # GREEK CAPITAL LETTER EPSILON WITH PSILI
1F19; C; 1F11; # GREEK CAPITAL LETTER EPSILON WITH DASIA
1F1A; C; 1F12; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
1F1B; C; 1F13; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
1F1C; C; 1F14; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
1F1D; C; 1F15; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
1F28; C; 1F20; # GREEK CAPITAL LETTER ETA WITH PSILI
1F29; C; 1F21; # GREEK CAPITAL LETTER ETA WITH DASIA
1F2A; C; 1F22; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
1F2B; C; 1F23; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
1F2C; C; 1F24; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
1F2D; C; 1F25; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
1F2E; C; 1F26; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
1F2F; C; 1F27; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
1F38; C; 1F30; # GREEK CAPITAL LETTER IOTA WITH PSILI
1F39; C; 1F31; # GREEK CAPITAL LETTER IOTA WITH DASIA
1F3A; C; 1F32; # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
1F3B; C; 1F33; # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
1F3C; C; 1F34; # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
1F3D; C; 1F35; # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
1F3E; C; 1F36; # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
1F3F; C; 1F37; # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
1F48; C; 1F40; # GREEK CAPITAL LETTER OMICRON WITH PSILI
1F49; C; 1F41; # GREEK CAPITAL LETTER OMICRON WITH DASIA
1F4A; C; 1F42; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
1F4B; C; 1F43; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
1F4C; C; 1F44; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
1F4D; C; 1F45; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
1F50; F; 03C5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI
1F52; F; 03C5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
1F54; F; 03C5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
1F56; F; 03C5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
1F59; C; 1F51; # GREEK CAPITAL LETTER UPSILON WITH DASIA
1F5B; C; 1F53; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
1F5D; C; 1F55; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
1F5F; C; 1F57; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
1F68; C; 1F60; # GREEK CAPITAL LETTER OMEGA WITH PSILI
1F69; C; 1F61; # GREEK CAPITAL LETTER OMEGA WITH DASIA
1F6A; C; 1F62; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
1F6B; C; 1F63; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
1F6C; C; 1F64; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
1F6D; C; 1F65; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
1F6E; C; 1F66; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
1F6F; C; 1F67; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
1F80; F; 1F00 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
1F81; F; 1F01 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
1F82; F; 1F02 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
1F83; F; 1F03 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
1F84; F; 1F04 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
1F85; F; 1F05 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
1F86; F; 1F06 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
1F87; F; 1F07 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
1F88; F; 1F00 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
1F88; S; 1F80; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
1F89; F; 1F01 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
1F89; S; 1F81; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
1F8A; F; 1F02 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
1F8A; S; 1F82; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
1F8B; F; 1F03 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
1F8B; S; 1F83; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
1F8C; F; 1F04 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
1F8C; S; 1F84; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
1F8D; F; 1F05 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
1F8D; S; 1F85; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
1F8E; F; 1F06 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
1F8E; S; 1F86; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
1F8F; F; 1F07 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
1F8F; S; 1F87; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
1F90; F; 1F20 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
1F91; F; 1F21 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
1F92; F; 1F22 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
1F93; F; 1F23 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
1F94; F; 1F24 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
1F95; F; 1F25 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
1F96; F; 1F26 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
1F97; F; 1F27 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
1F98; F; 1F20 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
1F98; S; 1F90; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
1F99; F; 1F21 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
1F99; S; 1F91; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
1F9A; F; 1F22 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
1F9A; S; 1F92; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
1F9B; F; 1F23 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
1F9B; S; 1F93; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
1F9C; F; 1F24 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
1F9C; S; 1F94; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
1F9D; F; 1F25 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
1F9D; S; 1F95; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
1F9E; F; 1F26 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
1F9E; S; 1F96; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
1F9F; F; 1F27 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
1F9F; S; 1F97; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
1FA0; F; 1F60 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
1FA1; F; 1F61 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
1FA2; F; 1F62 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
1FA3; F; 1F63 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
1FA4; F; 1F64 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
1FA5; F; 1F65 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
1FA6; F; 1F66 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
1FA7; F; 1F67 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
1FA8; F; 1F60 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
1FA8; S; 1FA0; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
1FA9; F; 1F61 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
1FA9; S; 1FA1; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
1FAA; F; 1F62 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
1FAA; S; 1FA2; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
1FAB; F; 1F63 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
1FAB; S; 1FA3; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
1FAC; F; 1F64 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
1FAC; S; 1FA4; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
1FAD; F; 1F65 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
1FAD; S; 1FA5; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
1FAE; F; 1F66 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
1FAE; S; 1FA6; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
1FAF; F; 1F67 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
1FAF; S; 1FA7; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
1FB2; F; 1F70 03B9; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
1FB3; F; 03B1 03B9; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
1FB4; F; 03AC 03B9; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
1FB6; F; 03B1 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
1FB7; F; 03B1 0342 03B9; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
1FB8; C; 1FB0; # GREEK CAPITAL LETTER ALPHA WITH VRACHY
1FB9; C; 1FB1; # GREEK CAPITAL LETTER ALPHA WITH MACRON
1FBA; C; 1F70; # GREEK CAPITAL LETTER ALPHA WITH VARIA
1FBB; C; 1F71; # GREEK CAPITAL LETTER ALPHA WITH OXIA
1FBC; F; 03B1 03B9; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
1FBC; S; 1FB3; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
1FBE; C; 03B9; # GREEK PROSGEGRAMMENI
1FC2; F; 1F74 03B9; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
1FC3; F; 03B7 03B9; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
1FC4; F; 03AE 03B9; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
1FC6; F; 03B7 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI
1FC7; F; 03B7 0342 03B9; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
1FC8; C; 1F72; # GREEK CAPITAL LETTER EPSILON WITH VARIA
1FC9; C; 1F73; # GREEK CAPITAL LETTER EPSILON WITH OXIA
1FCA; C; 1F74; # GREEK CAPITAL LETTER ETA WITH VARIA
1FCB; C; 1F75; # GREEK CAPITAL LETTER ETA WITH OXIA
1FCC; F; 03B7 03B9; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
1FCC; S; 1FC3; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
1FD2; F; 03B9 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
1FD3; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
1FD6; F; 03B9 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI
1FD7; F; 03B9 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
1FD8; C; 1FD0; # GREEK CAPITAL LETTER IOTA WITH VRACHY
1FD9; C; 1FD1; # GREEK CAPITAL LETTER IOTA WITH MACRON
1FDA; C; 1F76; # GREEK CAPITAL LETTER IOTA WITH VARIA
1FDB; C; 1F77; # GREEK CAPITAL LETTER IOTA WITH OXIA
1FE2; F; 03C5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
1FE3; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
1FE4; F; 03C1 0313; # GREEK SMALL LETTER RHO WITH PSILI
1FE6; F; 03C5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
1FE7; F; 03C5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
1FE8; C; 1FE0; # GREEK CAPITAL LETTER UPSILON WITH VRACHY
1FE9; C; 1FE1; # GREEK CAPITAL LETTER UPSILON WITH MACRON
1FEA; C; 1F7A; # GREEK CAPITAL LETTER UPSILON WITH VARIA
1FEB; C; 1F7B; # GREEK CAPITAL LETTER UPSILON WITH OXIA
1FEC; C; 1FE5; # GREEK CAPITAL LETTER RHO WITH DASIA
1FF2; F; 1F7C 03B9; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
1FF3; F; 03C9 03B9; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
1FF4; F; 03CE 03B9; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
1FF6; F; 03C9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
1FF7; F; 03C9 0342 03B9; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
1FF8; C; 1F78; # GREEK CAPITAL LETTER OMICRON WITH VARIA
1FF9; C; 1F79; # GREEK CAPITAL LETTER OMICRON WITH OXIA
1FFA; C; 1F7C; # GREEK CAPITAL LETTER OMEGA WITH VARIA
1FFB; C; 1F7D; # GREEK CAPITAL LETTER OMEGA WITH OXIA
1FFC; F; 03C9 03B9; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
1FFC; S; 1FF3; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
2126; C; 03C9; # OHM SIGN
212A; C; 006B; # KELVIN SIGN
212B; C; 00E5; # ANGSTROM SIGN
2132; C; 214E; # TURNED CAPITAL F
2160; C; 2170; # ROMAN NUMERAL ONE
2161; C; 2171; # ROMAN NUMERAL TWO
2162; C; 2172; # ROMAN NUMERAL THREE
2163; C; 2173; # ROMAN NUMERAL FOUR
2164; C; 2174; # ROMAN NUMERAL FIVE
2165; C; 2175; # ROMAN NUMERAL SIX
2166; C; 2176; # ROMAN NUMERAL SEVEN
2167; C; 2177; # ROMAN NUMERAL EIGHT
2168; C; 2178; # ROMAN NUMERAL NINE
2169; C; 2179; # ROMAN NUMERAL TEN
216A; C; 217A; # ROMAN NUMERAL ELEVEN
216B; C; 217B; # ROMAN NUMERAL TWELVE
216C; C; 217C; # ROMAN NUMERAL FIFTY
216D; C; 217D; # ROMAN NUMERAL ONE HUNDRED
216E; C; 217E; # ROMAN NUMERAL FIVE HUNDRED
216F; C; 217F; # ROMAN NUMERAL ONE THOUSAND
2183; C; 2184; # ROMAN NUMERAL REVERSED ONE HUNDRED
24B6; C; 24D0; # CIRCLED LATIN CAPITAL LETTER A
24B7; C; 24D1; # CIRCLED LATIN CAPITAL LETTER B
24B8; C; 24D2; # CIRCLED LATIN CAPITAL LETTER C
24B9; C; 24D3; # CIRCLED LATIN CAPITAL LETTER D
24BA; C; 24D4; # CIRCLED LATIN CAPITAL LETTER E
24BB; C; 24D5; # CIRCLED LATIN CAPITAL LETTER F
24BC; C; 24D6; # CIRCLED LATIN CAPITAL LETTER G
24BD; C; 24D7; # CIRCLED LATIN CAPITAL LETTER H
24BE; C; 24D8; # CIRCLED LATIN CAPITAL LETTER I
24BF; C; 24D9; # CIRCLED LATIN CAPITAL LETTER J
24C0; C; 24DA; # CIRCLED LATIN CAPITAL LETTER K
24C1; C; 24DB; # CIRCLED LATIN CAPITAL LETTER L
24C2; C; 24DC; # CIRCLED LATIN CAPITAL LETTER M
24C3; C; 24DD; # CIRCLED LATIN CAPITAL LETTER N
24C4; C; 24DE; # CIRCLED LATIN CAPITAL LETTER O
24C5; C; 24DF; # CIRCLED LATIN CAPITAL LETTER P
24C6; C; 24E0; # CIRCLED LATIN CAPITAL LETTER Q
24C7; C; 24E1; # CIRCLED LATIN CAPITAL LETTER R
24C8; C; 24E2; # CIRCLED LATIN CAPITAL LETTER S
24C9; C; 24E3; # CIRCLED LATIN CAPITAL LETTER T
24CA; C; 24E4; # CIRCLED LATIN CAPITAL LETTER U
24CB; C; 24E5; # CIRCLED LATIN CAPITAL LETTER V
24CC; C; 24E6; # CIRCLED LATIN CAPITAL LETTER W
24CD; C; 24E7; # CIRCLED LATIN CAPITAL LETTER X
24CE; C; 24E8; # CIRCLED LATIN CAPITAL LETTER Y
24CF; C; 24E9; # CIRCLED LATIN CAPITAL LETTER Z
2C00; C; 2C30; # GLAGOLITIC CAPITAL LETTER AZU
2C01; C; 2C31; # GLAGOLITIC CAPITAL LETTER BUKY
2C02; C; 2C32; # GLAGOLITIC CAPITAL LETTER VEDE
2C03; C; 2C33; # GLAGOLITIC CAPITAL LETTER GLAGOLI
2C04; C; 2C34; # GLAGOLITIC CAPITAL LETTER DOBRO
2C05; C; 2C35; # GLAGOLITIC CAPITAL LETTER YESTU
2C06; C; 2C36; # GLAGOLITIC CAPITAL LETTER ZHIVETE
2C07; C; 2C37; # GLAGOLITIC CAPITAL LETTER DZELO
2C08; C; 2C38; # GLAGOLITIC CAPITAL LETTER ZEMLJA
2C09; C; 2C39; # GLAGOLITIC CAPITAL LETTER IZHE
2C0A; C; 2C3A; # GLAGOLITIC CAPITAL LETTER INITIAL IZHE
2C0B; C; 2C3B; # GLAGOLITIC CAPITAL LETTER I
2C0C; C; 2C3C; # GLAGOLITIC CAPITAL LETTER DJERVI
2C0D; C; 2C3D; # GLAGOLITIC CAPITAL LETTER KAKO
2C0E; C; 2C3E; # GLAGOLITIC CAPITAL LETTER LJUDIJE
2C0F; C; 2C3F; # GLAGOLITIC CAPITAL LETTER MYSLITE
2C10; C; 2C40; # GLAGOLITIC CAPITAL LETTER NASHI
2C11; C; 2C41; # GLAGOLITIC CAPITAL LETTER ONU
2C12; C; 2C42; # GLAGOLITIC CAPITAL LETTER POKOJI
2C13; C; 2C43; # GLAGOLITIC CAPITAL LETTER RITSI
2C14; C; 2C44; # GLAGOLITIC CAPITAL LETTER SLOVO
2C15; C; 2C45; # GLAGOLITIC CAPITAL LETTER TVRIDO
2C16; C; 2C46; # GLAGOLITIC CAPITAL LETTER UKU
2C17; C; 2C47; # GLAGOLITIC CAPITAL LETTER FRITU
2C18; C; 2C48; # GLAGOLITIC CAPITAL LETTER HERU
2C19; C; 2C49; # GLAGOLITIC CAPITAL LETTER OTU
2C1A; C; 2C4A; # GLAGOLITIC CAPITAL LETTER PE
2C1B; C; 2C4B; # GLAGOLITIC CAPITAL LETTER SHTA
2C1C; C; 2C4C; # GLAGOLITIC CAPITAL LETTER TSI
2C1D; C; 2C4D; # GLAGOLITIC CAPITAL LETTER CHRIVI
2C1E; C; 2C4E; # GLAGOLITIC CAPITAL LETTER SHA
2C1F; C; 2C4F; # GLAGOLITIC CAPITAL LETTER YERU
2C20; C; 2C50; # GLAGOLITIC CAPITAL LETTER YERI
2C21; C; 2C51; # GLAGOLITIC CAPITAL LETTER YATI
2C22; C; 2C52; # GLAGOLITIC CAPITAL LETTER SPIDERY HA
2C23; C; 2C53; # GLAGOLITIC CAPITAL LETTER YU
2C24; C; 2C54; # GLAGOLITIC CAPITAL LETTER SMALL YUS
2C25; C; 2C55; # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
2C26; C; 2C56; # GLAGOLITIC CAPITAL LETTER YO
2C27; C; 2C57; # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
2C28; C; 2C58; # GLAGOLITIC CAPITAL LETTER BIG YUS
2C29; C; 2C59; # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
2C2A; C; 2C5A; # GLAGOLITIC CAPITAL LETTER FITA
2C2B; C; 2C5B; # GLAGOLITIC CAPITAL LETTER IZHITSA
2C2C; C; 2C5C; # GLAGOLITIC CAPITAL LETTER SHTAPIC
2C2D; C; 2C5D; # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
2C2E; C; 2C5E; # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
2C60; C; 2C61; # LATIN CAPITAL LETTER L WITH DOUBLE BAR
2C62; C; 026B; # LATIN CAPITAL LETTER L WITH MIDDLE TILDE
2C63; C; 1D7D; # LATIN CAPITAL LETTER P WITH STROKE
2C64; C; 027D; # LATIN CAPITAL LETTER R WITH TAIL
2C67; C; 2C68; # LATIN CAPITAL LETTER H WITH DESCENDER
2C69; C; 2C6A; # LATIN CAPITAL LETTER K WITH DESCENDER
2C6B; C; 2C6C; # LATIN CAPITAL LETTER Z WITH DESCENDER
2C6D; C; 0251; # LATIN CAPITAL LETTER ALPHA
2C6E; C; 0271; # LATIN CAPITAL LETTER M WITH HOOK
2C6F; C; 0250; # LATIN CAPITAL LETTER TURNED A
2C70; C; 0252; # LATIN CAPITAL LETTER TURNED ALPHA
2C72; C; 2C73; # LATIN CAPITAL LETTER W WITH HOOK
2C75; C; 2C76; # LATIN CAPITAL LETTER HALF H
2C7E; C; 023F; # LATIN CAPITAL LETTER S WITH SWASH TAIL
2C7F; C; 0240; # LATIN CAPITAL LETTER Z WITH SWASH TAIL
2C80; C; 2C81; # COPTIC CAPITAL LETTER ALFA
2C82; C; 2C83; # COPTIC CAPITAL LETTER VIDA
2C84; C; 2C85; # COPTIC CAPITAL LETTER GAMMA
2C86; C; 2C87; # COPTIC CAPITAL LETTER DALDA
2C88; C; 2C89; # COPTIC CAPITAL LETTER EIE
2C8A; C; 2C8B; # COPTIC CAPITAL LETTER SOU
2C8C; C; 2C8D; # COPTIC CAPITAL LETTER ZATA
2C8E; C; 2C8F; # COPTIC CAPITAL LETTER HATE
2C90; C; 2C91; # COPTIC CAPITAL LETTER THETHE
2C92; C; 2C93; # COPTIC CAPITAL LETTER IAUDA
2C94; C; 2C95; # COPTIC CAPITAL LETTER KAPA
2C96; C; 2C97; # COPTIC CAPITAL LETTER LAULA
2C98; C; 2C99; # COPTIC CAPITAL LETTER MI
2C9A; C; 2C9B; # COPTIC CAPITAL LETTER NI
2C9C; C; 2C9D; # COPTIC CAPITAL LETTER KSI
2C9E; C; 2C9F; # COPTIC CAPITAL LETTER O
2CA0; C; 2CA1; # COPTIC CAPITAL LETTER PI
2CA2; C; 2CA3; # COPTIC CAPITAL LETTER RO
2CA4; C; 2CA5; # COPTIC CAPITAL LETTER SIMA
2CA6; C; 2CA7; # COPTIC CAPITAL LETTER TAU
2CA8; C; 2CA9; # COPTIC CAPITAL LETTER UA
2CAA; C; 2CAB; # COPTIC CAPITAL LETTER FI
2CAC; C; 2CAD; # COPTIC CAPITAL LETTER KHI
2CAE; C; 2CAF; # COPTIC CAPITAL LETTER PSI
2CB0; C; 2CB1; # COPTIC CAPITAL LETTER OOU
2CB2; C; 2CB3; # COPTIC CAPITAL LETTER DIALECT-P ALEF
2CB4; C; 2CB5; # COPTIC CAPITAL LETTER OLD COPTIC AIN
2CB6; C; 2CB7; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
2CB8; C; 2CB9; # COPTIC CAPITAL LETTER DIALECT-P KAPA
2CBA; C; 2CBB; # COPTIC CAPITAL LETTER DIALECT-P NI
2CBC; C; 2CBD; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
2CBE; C; 2CBF; # COPTIC CAPITAL LETTER OLD COPTIC OOU
2CC0; C; 2CC1; # COPTIC CAPITAL LETTER SAMPI
2CC2; C; 2CC3; # COPTIC CAPITAL LETTER CROSSED SHEI
2CC4; C; 2CC5; # COPTIC CAPITAL LETTER OLD COPTIC SHEI
2CC6; C; 2CC7; # COPTIC CAPITAL LETTER OLD COPTIC ESH
2CC8; C; 2CC9; # COPTIC CAPITAL LETTER AKHMIMIC KHEI
2CCA; C; 2CCB; # COPTIC CAPITAL LETTER DIALECT-P HORI
2CCC; C; 2CCD; # COPTIC CAPITAL LETTER OLD COPTIC HORI
2CCE; C; 2CCF; # COPTIC CAPITAL LETTER OLD COPTIC HA
2CD0; C; 2CD1; # COPTIC CAPITAL LETTER L-SHAPED HA
2CD2; C; 2CD3; # COPTIC CAPITAL LETTER OLD COPTIC HEI
2CD4; C; 2CD5; # COPTIC CAPITAL LETTER OLD COPTIC HAT
2CD6; C; 2CD7; # COPTIC CAPITAL LETTER OLD COPTIC GANGIA
2CD8; C; 2CD9; # COPTIC CAPITAL LETTER OLD COPTIC DJA
2CDA; C; 2CDB; # COPTIC CAPITAL LETTER OLD COPTIC SHIMA
2CDC; C; 2CDD; # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
2CDE; C; 2CDF; # COPTIC CAPITAL LETTER OLD NUBIAN NGI
2CE0; C; 2CE1; # COPTIC CAPITAL LETTER OLD NUBIAN NYI
2CE2; C; 2CE3; # COPTIC CAPITAL LETTER OLD NUBIAN WAU
2CEB; C; 2CEC; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
2CED; C; 2CEE; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
2CF2; C; 2CF3; # COPTIC CAPITAL LETTER BOHAIRIC KHEI
A640; C; A641; # CYRILLIC CAPITAL LETTER ZEMLYA
A642; C; A643; # CYRILLIC CAPITAL LETTER DZELO
A644; C; A645; # CYRILLIC CAPITAL LETTER REVERSED DZE
A646; C; A647; # CYRILLIC CAPITAL LETTER IOTA
A648; C; A649; # CYRILLIC CAPITAL LETTER DJERV
A64A; C; A64B; # CYRILLIC CAPITAL LETTER MONOGRAPH UK
A64C; C; A64D; # CYRILLIC CAPITAL LETTER BROAD OMEGA
A64E; C; A64F; # CYRILLIC CAPITAL LETTER NEUTRAL YER
A650; C; A651; # CYRILLIC CAPITAL LETTER YERU WITH BACK YER
A652; C; A653; # CYRILLIC CAPITAL LETTER IOTIFIED YAT
A654; C; A655; # CYRILLIC CAPITAL LETTER REVERSED YU
A656; C; A657; # CYRILLIC CAPITAL LETTER IOTIFIED A
A658; C; A659; # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
A65A; C; A65B; # CYRILLIC CAPITAL LETTER BLENDED YUS
A65C; C; A65D; # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
A65E; C; A65F; # CYRILLIC CAPITAL LETTER YN
A660; C; A661; # CYRILLIC CAPITAL LETTER REVERSED TSE
A662; C; A663; # CYRILLIC CAPITAL LETTER SOFT DE
A664; C; A665; # CYRILLIC CAPITAL LETTER SOFT EL
A666; C; A667; # CYRILLIC CAPITAL LETTER SOFT EM
A668; C; A669; # CYRILLIC CAPITAL LETTER MONOCULAR O
A66A; C; A66B; # CYRILLIC CAPITAL LETTER BINOCULAR O
A66C; C; A66D; # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
A680; C; A681; # CYRILLIC CAPITAL LETTER DWE
A682; C; A683; # CYRILLIC CAPITAL LETTER DZWE
A684; C; A685; # CYRILLIC CAPITAL LETTER ZHWE
A686; C; A687; # CYRILLIC CAPITAL LETTER CCHE
A688; C; A689; # CYRILLIC CAPITAL LETTER DZZE
A68A; C; A68B; # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
A68C; C; A68D; # CYRILLIC CAPITAL LETTER TWE
A68E; C; A68F; # CYRILLIC CAPITAL LETTER TSWE
A690; C; A691; # CYRILLIC CAPITAL LETTER TSSE
A692; C; A693; # CYRILLIC CAPITAL LETTER TCHE
A694; C; A695; # CYRILLIC CAPITAL LETTER HWE
A696; C; A697; # CYRILLIC CAPITAL LETTER SHWE
A722; C; A723; # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
A724; C; A725; # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
A726; C; A727; # LATIN CAPITAL LETTER HENG
A728; C; A729; # LATIN CAPITAL LETTER TZ
A72A; C; A72B; # LATIN CAPITAL LETTER TRESILLO
A72C; C; A72D; # LATIN CAPITAL LETTER CUATRILLO
A72E; C; A72F; # LATIN CAPITAL LETTER CUATRILLO WITH COMMA
A732; C; A733; # LATIN CAPITAL LETTER AA
A734; C; A735; # LATIN CAPITAL LETTER AO
A736; C; A737; # LATIN CAPITAL LETTER AU
A738; C; A739; # LATIN CAPITAL LETTER AV
A73A; C; A73B; # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
A73C; C; A73D; # LATIN CAPITAL LETTER AY
A73E; C; A73F; # LATIN CAPITAL LETTER REVERSED C WITH DOT
A740; C; A741; # LATIN CAPITAL LETTER K WITH STROKE
A742; C; A743; # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
A744; C; A745; # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
A746; C; A747; # LATIN CAPITAL LETTER BROKEN L
A748; C; A749; # LATIN CAPITAL LETTER L WITH HIGH STROKE
A74A; C; A74B; # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
A74C; C; A74D; # LATIN CAPITAL LETTER O WITH LOOP
A74E; C; A74F; # LATIN CAPITAL LETTER OO
A750; C; A751; # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
A752; C; A753; # LATIN CAPITAL LETTER P WITH FLOURISH
A754; C; A755; # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
A756; C; A757; # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
A758; C; A759; # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
A75A; C; A75B; # LATIN CAPITAL LETTER R ROTUNDA
A75C; C; A75D; # LATIN CAPITAL LETTER RUM ROTUNDA
A75E; C; A75F; # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
A760; C; A761; # LATIN CAPITAL LETTER VY
A762; C; A763; # LATIN CAPITAL LETTER VISIGOTHIC Z
A764; C; A765; # LATIN CAPITAL LETTER THORN WITH STROKE
A766; C; A767; # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
A768; C; A769; # LATIN CAPITAL LETTER VEND
A76A; C; A76B; # LATIN CAPITAL LETTER ET
A76C; C; A76D; # LATIN CAPITAL LETTER IS
A76E; C; A76F; # LATIN CAPITAL LETTER CON
A779; C; A77A; # LATIN CAPITAL LETTER INSULAR D
A77B; C; A77C; # LATIN CAPITAL LETTER INSULAR F
A77D; C; 1D79; # LATIN CAPITAL LETTER INSULAR G
A77E; C; A77F; # LATIN CAPITAL LETTER TURNED INSULAR G
A780; C; A781; # LATIN CAPITAL LETTER TURNED L
A782; C; A783; # LATIN CAPITAL LETTER INSULAR R
A784; C; A785; # LATIN CAPITAL LETTER INSULAR S
A786; C; A787; # LATIN CAPITAL LETTER INSULAR T
A78B; C; A78C; # LATIN CAPITAL LETTER SALTILLO
A78D; C; 0265; # LATIN CAPITAL LETTER TURNED H
A790; C; A791; # LATIN CAPITAL LETTER N WITH DESCENDER
A792; C; A793; # LATIN CAPITAL LETTER C WITH BAR
A7A0; C; A7A1; # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE
A7A2; C; A7A3; # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE
A7A4; C; A7A5; # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE
A7A6; C; A7A7; # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE
A7A8; C; A7A9; # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE
A7AA; C; 0266; # LATIN CAPITAL LETTER H WITH HOOK
FB00; F; 0066 0066; # LATIN SMALL LIGATURE FF
FB01; F; 0066 0069; # LATIN SMALL LIGATURE FI
FB02; F; 0066 006C; # LATIN SMALL LIGATURE FL
FB03; F; 0066 0066 0069; # LATIN SMALL LIGATURE FFI
FB04; F; 0066 0066 006C; # LATIN SMALL LIGATURE FFL
FB05; F; 0073 0074; # LATIN SMALL LIGATURE LONG S T
FB06; F; 0073 0074; # LATIN SMALL LIGATURE ST
FB13; F; 0574 0576; # ARMENIAN SMALL LIGATURE MEN NOW
FB14; F; 0574 0565; # ARMENIAN SMALL LIGATURE MEN ECH
FB15; F; 0574 056B; # ARMENIAN SMALL LIGATURE MEN INI
FB16; F; 057E 0576; # ARMENIAN SMALL LIGATURE VEW NOW
FB17; F; 0574 056D; # ARMENIAN SMALL LIGATURE MEN XEH
FF21; C; FF41; # FULLWIDTH LATIN CAPITAL LETTER A
FF22; C; FF42; # FULLWIDTH LATIN CAPITAL LETTER B
FF23; C; FF43; # FULLWIDTH LATIN CAPITAL LETTER C
FF24; C; FF44; # FULLWIDTH LATIN CAPITAL LETTER D
FF25; C; FF45; # FULLWIDTH LATIN CAPITAL LETTER E
FF26; C; FF46; # FULLWIDTH LATIN CAPITAL LETTER F
FF27; C; FF47; # FULLWIDTH LATIN CAPITAL LETTER G
FF28; C; FF48; # FULLWIDTH LATIN CAPITAL LETTER H
FF29; C; FF49; # FULLWIDTH LATIN CAPITAL LETTER I
FF2A; C; FF4A; # FULLWIDTH LATIN CAPITAL LETTER J
FF2B; C; FF4B; # FULLWIDTH LATIN CAPITAL LETTER K
FF2C; C; FF4C; # FULLWIDTH LATIN CAPITAL LETTER L
FF2D; C; FF4D; # FULLWIDTH LATIN CAPITAL LETTER M
FF2E; C; FF4E; # FULLWIDTH LATIN CAPITAL LETTER N
FF2F; C; FF4F; # FULLWIDTH LATIN CAPITAL LETTER O
FF30; C; FF50; # FULLWIDTH LATIN CAPITAL LETTER P
FF31; C; FF51; # FULLWIDTH LATIN CAPITAL LETTER Q
FF32; C; FF52; # FULLWIDTH LATIN CAPITAL LETTER R
FF33; C; FF53; # FULLWIDTH LATIN CAPITAL LETTER S
FF34; C; FF54; # FULLWIDTH LATIN CAPITAL LETTER T
FF35; C; FF55; # FULLWIDTH LATIN CAPITAL LETTER U
FF36; C; FF56; # FULLWIDTH LATIN CAPITAL LETTER V
FF37; C; FF57; # FULLWIDTH LATIN CAPITAL LETTER W
FF38; C; FF58; # FULLWIDTH LATIN CAPITAL LETTER X
FF39; C; FF59; # FULLWIDTH LATIN CAPITAL LETTER Y
FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z
10400; C; 10428; # DESERET CAPITAL LETTER LONG I
10401; C; 10429; # DESERET CAPITAL LETTER LONG E
10402; C; 1042A; # DESERET CAPITAL LETTER LONG A
10403; C; 1042B; # DESERET CAPITAL LETTER LONG AH
10404; C; 1042C; # DESERET CAPITAL LETTER LONG O
10405; C; 1042D; # DESERET CAPITAL LETTER LONG OO
10406; C; 1042E; # DESERET CAPITAL LETTER SHORT I
10407; C; 1042F; # DESERET CAPITAL LETTER SHORT E
10408; C; 10430; # DESERET CAPITAL LETTER SHORT A
10409; C; 10431; # DESERET CAPITAL LETTER SHORT AH
1040A; C; 10432; # DESERET CAPITAL LETTER SHORT O
1040B; C; 10433; # DESERET CAPITAL LETTER SHORT OO
1040C; C; 10434; # DESERET CAPITAL LETTER AY
1040D; C; 10435; # DESERET CAPITAL LETTER OW
1040E; C; 10436; # DESERET CAPITAL LETTER WU
1040F; C; 10437; # DESERET CAPITAL LETTER YEE
10410; C; 10438; # DESERET CAPITAL LETTER H
10411; C; 10439; # DESERET CAPITAL LETTER PEE
10412; C; 1043A; # DESERET CAPITAL LETTER BEE
10413; C; 1043B; # DESERET CAPITAL LETTER TEE
10414; C; 1043C; # DESERET CAPITAL LETTER DEE
10415; C; 1043D; # DESERET CAPITAL LETTER CHEE
10416; C; 1043E; # DESERET CAPITAL LETTER JEE
10417; C; 1043F; # DESERET CAPITAL LETTER KAY
10418; C; 10440; # DESERET CAPITAL LETTER GAY
10419; C; 10441; # DESERET CAPITAL LETTER EF
1041A; C; 10442; # DESERET CAPITAL LETTER VEE
1041B; C; 10443; # DESERET CAPITAL LETTER ETH
1041C; C; 10444; # DESERET CAPITAL LETTER THEE
1041D; C; 10445; # DESERET CAPITAL LETTER ES
1041E; C; 10446; # DESERET CAPITAL LETTER ZEE
1041F; C; 10447; # DESERET CAPITAL LETTER ESH
10420; C; 10448; # DESERET CAPITAL LETTER ZHEE
10421; C; 10449; # DESERET CAPITAL LETTER ER
10422; C; 1044A; # DESERET CAPITAL LETTER EL
10423; C; 1044B; # DESERET CAPITAL LETTER EM
10424; C; 1044C; # DESERET CAPITAL LETTER EN
10425; C; 1044D; # DESERET CAPITAL LETTER ENG
10426; C; 1044E; # DESERET CAPITAL LETTER OI
10427; C; 1044F; # DESERET CAPITAL LETTER EW
#
# EOF

Added freshlib/_doc/utf8/DerivedCoreProperties.txt.

more than 10,000 changes

Added freshlib/_doc/utf8/SpecialCasing.txt.









































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
# SpecialCasing-6.2.0.txt
# Date: 2012-05-23, 20:35:15 GMT [MD]
#
# Unicode Character Database
# Copyright (c) 1991-2012 Unicode, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
# For documentation, see http://www.unicode.org/reports/tr44/
#
# Special Casing Properties
#
# This file is a supplement to the UnicodeData file.
# It contains additional information about the casing of Unicode characters.
# (For compatibility, the UnicodeData.txt file only contains case mappings for
# characters where they are 1-1, and independent of context and language.
# For more information, see the discussion of Case Mappings in the Unicode Standard.
#
# All code points not listed in this file that do not have a simple case mappings
# in UnicodeData.txt map to themselves.
# ================================================================================
# Format
# ================================================================================
# The entries in this file are in the following machine-readable format:
#
# <code>; <lower> ; <title> ; <upper> ; (<condition_list> ;)? # <comment>
#
# <code>, <lower>, <title>, and <upper> provide character values in hex. If there is more
# than one character, they are separated by spaces. Other than as used to separate 
# elements, spaces are to be ignored.
#
# The <condition_list> is optional. Where present, it consists of one or more language IDs
# or contexts, separated by spaces. In these conditions:
# - A condition list overrides the normal behavior if all of the listed conditions are true.
# - The context is always the context of the characters in the original string,
#   NOT in the resulting string.
# - Case distinctions in the condition list are not significant.
# - Conditions preceded by "Not_" represent the negation of the condition.
# The condition list is not represented in the UCD as a formal property.
#
# A language ID is defined by BCP 47, with '-' and '_' treated equivalently.
#
# A context for a character C is defined by Section 3.13 Default Case 
# Operations, of The Unicode Standard, Version 5.0.
# (This is identical to the context defined by Unicode 4.1.0,
#  as specified in http://www.unicode.org/versions/Unicode4.1.0/)
#
# Parsers of this file must be prepared to deal with future additions to this format:
#  * Additional contexts
#  * Additional fields
# ================================================================================

# @missing: 0000..10FFFF; <slc>; <stc>; <suc>;

# ================================================================================
# Unconditional mappings
# ================================================================================

# The German es-zed is special--the normal mapping is to SS.
# Note: the titlecase should never occur in practice. It is equal to titlecase(uppercase(<es-zed>))

00DF; 00DF; 0053 0073; 0053 0053; # LATIN SMALL LETTER SHARP S

# Preserve canonical equivalence for I with dot. Turkic is handled below.

0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE

# Ligatures

FB00; FB00; 0046 0066; 0046 0046; # LATIN SMALL LIGATURE FF
FB01; FB01; 0046 0069; 0046 0049; # LATIN SMALL LIGATURE FI
FB02; FB02; 0046 006C; 0046 004C; # LATIN SMALL LIGATURE FL
FB03; FB03; 0046 0066 0069; 0046 0046 0049; # LATIN SMALL LIGATURE FFI
FB04; FB04; 0046 0066 006C; 0046 0046 004C; # LATIN SMALL LIGATURE FFL
FB05; FB05; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE LONG S T
FB06; FB06; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE ST

0587; 0587; 0535 0582; 0535 0552; # ARMENIAN SMALL LIGATURE ECH YIWN
FB13; FB13; 0544 0576; 0544 0546; # ARMENIAN SMALL LIGATURE MEN NOW
FB14; FB14; 0544 0565; 0544 0535; # ARMENIAN SMALL LIGATURE MEN ECH
FB15; FB15; 0544 056B; 0544 053B; # ARMENIAN SMALL LIGATURE MEN INI
FB16; FB16; 054E 0576; 054E 0546; # ARMENIAN SMALL LIGATURE VEW NOW
FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH

# No corresponding uppercase precomposed character

0149; 0149; 02BC 004E; 02BC 004E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
0390; 0390; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
03B0; 03B0; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
01F0; 01F0; 004A 030C; 004A 030C; # LATIN SMALL LETTER J WITH CARON
1E96; 1E96; 0048 0331; 0048 0331; # LATIN SMALL LETTER H WITH LINE BELOW
1E97; 1E97; 0054 0308; 0054 0308; # LATIN SMALL LETTER T WITH DIAERESIS
1E98; 1E98; 0057 030A; 0057 030A; # LATIN SMALL LETTER W WITH RING ABOVE
1E99; 1E99; 0059 030A; 0059 030A; # LATIN SMALL LETTER Y WITH RING ABOVE
1E9A; 1E9A; 0041 02BE; 0041 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING
1F50; 1F50; 03A5 0313; 03A5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI
1F52; 1F52; 03A5 0313 0300; 03A5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
1F54; 1F54; 03A5 0313 0301; 03A5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
1F56; 1F56; 03A5 0313 0342; 03A5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
1FB6; 1FB6; 0391 0342; 0391 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
1FC6; 1FC6; 0397 0342; 0397 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI
1FD2; 1FD2; 0399 0308 0300; 0399 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
1FD3; 1FD3; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
1FD6; 1FD6; 0399 0342; 0399 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI
1FD7; 1FD7; 0399 0308 0342; 0399 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
1FE2; 1FE2; 03A5 0308 0300; 03A5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
1FE3; 1FE3; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
1FE4; 1FE4; 03A1 0313; 03A1 0313; # GREEK SMALL LETTER RHO WITH PSILI
1FE6; 1FE6; 03A5 0342; 03A5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
1FE7; 1FE7; 03A5 0308 0342; 03A5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
1FF6; 1FF6; 03A9 0342; 03A9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI

# IMPORTANT-when iota-subscript (0345) is uppercased or titlecased,
#  the result will be incorrect unless the iota-subscript is moved to the end
#  of any sequence of combining marks. Otherwise, the accents will go on the capital iota.
#  This process can be achieved by first transforming the text to NFC before casing.
#  E.g. <alpha><iota_subscript><acute> is uppercased to <ALPHA><acute><IOTA>

# The following cases are already in the UnicodeData file, so are only commented here.

# 0345; 0345; 0345; 0399; # COMBINING GREEK YPOGEGRAMMENI

# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript)
# have special uppercases.
# Note: characters with PROSGEGRAMMENI are actually titlecase, not uppercase!

1F80; 1F80; 1F88; 1F08 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
1F81; 1F81; 1F89; 1F09 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
1F82; 1F82; 1F8A; 1F0A 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
1F83; 1F83; 1F8B; 1F0B 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
1F84; 1F84; 1F8C; 1F0C 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
1F85; 1F85; 1F8D; 1F0D 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
1F86; 1F86; 1F8E; 1F0E 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
1F87; 1F87; 1F8F; 1F0F 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
1F88; 1F80; 1F88; 1F08 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
1F89; 1F81; 1F89; 1F09 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
1F8A; 1F82; 1F8A; 1F0A 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
1F8B; 1F83; 1F8B; 1F0B 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
1F8C; 1F84; 1F8C; 1F0C 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
1F8D; 1F85; 1F8D; 1F0D 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
1F8E; 1F86; 1F8E; 1F0E 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
1F8F; 1F87; 1F8F; 1F0F 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
1F90; 1F90; 1F98; 1F28 0399; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
1F91; 1F91; 1F99; 1F29 0399; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
1F92; 1F92; 1F9A; 1F2A 0399; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
1F93; 1F93; 1F9B; 1F2B 0399; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
1F94; 1F94; 1F9C; 1F2C 0399; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
1F95; 1F95; 1F9D; 1F2D 0399; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
1F96; 1F96; 1F9E; 1F2E 0399; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
1F97; 1F97; 1F9F; 1F2F 0399; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
1F98; 1F90; 1F98; 1F28 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
1F99; 1F91; 1F99; 1F29 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
1F9A; 1F92; 1F9A; 1F2A 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
1F9B; 1F93; 1F9B; 1F2B 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
1F9C; 1F94; 1F9C; 1F2C 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
1F9D; 1F95; 1F9D; 1F2D 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
1F9E; 1F96; 1F9E; 1F2E 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
1F9F; 1F97; 1F9F; 1F2F 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
1FA0; 1FA0; 1FA8; 1F68 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
1FA1; 1FA1; 1FA9; 1F69 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
1FA2; 1FA2; 1FAA; 1F6A 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
1FA3; 1FA3; 1FAB; 1F6B 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
1FA4; 1FA4; 1FAC; 1F6C 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
1FA5; 1FA5; 1FAD; 1F6D 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
1FA6; 1FA6; 1FAE; 1F6E 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
1FA7; 1FA7; 1FAF; 1F6F 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
1FA8; 1FA0; 1FA8; 1F68 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
1FA9; 1FA1; 1FA9; 1F69 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
1FAA; 1FA2; 1FAA; 1F6A 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
1FAB; 1FA3; 1FAB; 1F6B 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
1FAC; 1FA4; 1FAC; 1F6C 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
1FAD; 1FA5; 1FAD; 1F6D 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
1FAE; 1FA6; 1FAE; 1F6E 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
1FAF; 1FA7; 1FAF; 1F6F 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
1FB3; 1FB3; 1FBC; 0391 0399; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
1FBC; 1FB3; 1FBC; 0391 0399; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
1FC3; 1FC3; 1FCC; 0397 0399; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
1FCC; 1FC3; 1FCC; 0397 0399; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI

# Some characters with YPOGEGRAMMENI also have no corresponding titlecases

1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
1FC2; 1FC2; 1FCA 0345; 1FCA 0399; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
1FC4; 1FC4; 0389 0345; 0389 0399; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
1FF2; 1FF2; 1FFA 0345; 1FFA 0399; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
1FF4; 1FF4; 038F 0345; 038F 0399; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI

1FB7; 1FB7; 0391 0342 0345; 0391 0342 0399; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
1FC7; 1FC7; 0397 0342 0345; 0397 0342 0399; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI

# ================================================================================
# Conditional Mappings
# The remainder of this file provides conditional casing data used to produce 
# full case mappings.
# ================================================================================
# Language-Insensitive Mappings
# These are characters whose full case mappings do not depend on language, but do
# depend on context (which characters come before or after). For more information
# see the header of this file and the Unicode Standard.
# ================================================================================

# Special case for final form of sigma

03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA

# Note: the following cases for non-final are already in the UnicodeData file.

# 03A3; 03C3; 03A3; 03A3; # GREEK CAPITAL LETTER SIGMA
# 03C3; 03C3; 03A3; 03A3; # GREEK SMALL LETTER SIGMA
# 03C2; 03C2; 03A3; 03A3; # GREEK SMALL LETTER FINAL SIGMA

# Note: the following cases are not included, since they would case-fold in lowercasing

# 03C3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK SMALL LETTER SIGMA
# 03C2; 03C3; 03A3; 03A3; Not_Final_Sigma; # GREEK SMALL LETTER FINAL SIGMA

# ================================================================================
# Language-Sensitive Mappings
# These are characters whose full case mappings depend on language and perhaps also
# context (which characters come before or after). For more information
# see the header of this file and the Unicode Standard.
# ================================================================================

# Lithuanian

# Lithuanian retains the dot in a lowercase i when followed by accents.

# Remove DOT ABOVE after "i" with upper or titlecase

0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE

# Introduce an explicit dot above when lowercasing capital I's and J's
# whenever there are more accents above.
# (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek)

0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I
004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J
012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK
00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE
00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE
0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE

# ================================================================================

# Turkish and Azeri

# I and i-dotless; I-dot and i are case pairs in Turkish and Azeri
# The following rules handle those cases.

0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE
0130; 0069; 0130; 0130; az; # LATIN CAPITAL LETTER I WITH DOT ABOVE

# When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i.
# This matches the behavior of the canonically equivalent I-dot_above

0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE
0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE

# When lowercasing, unless an I is before a dot_above, it turns into a dotless i.

0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I
0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I

# When uppercasing, i turns into a dotted capital I

0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I
0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I

# Note: the following case is already in the UnicodeData file.

# 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I

# EOF

Added freshlib/_doc/utf8/UnicodeData.txt.

more than 10,000 changes

Deleted freshlib/_pending/lzss/readme.txt.

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
LZSS compression library for Flat Assembler
by Mateusz Tymek

1. Introduction
LZSS is a library that provides you with simple routines for data compression. The 
algorithm is based on oryginal idea of Lempel and Ziv, with the modyfications suggeted by 
Storer and Szymanski (that's why its name is LZSS). You can search the Web for "LZSS 
compression" if you need any further information. This implementation uses binary search
trees to speed up compression. It is based on the code of the Allegro Library 
(http://alleg.sourceforge.net), and it have similar (a bit better actually) compression 
ratio. All source code is included. The library is written in FASM, and it uses Fresh
macro library. 
It is distributed under the terms of Fresh Artistic License 
(see http://www.decard.net/license.php).

2. Using LZSS library
To use LZSS library, first you have to include its files in your source. You have to 
include "lzss.inc" file somewhere in the beginning (it contains some definitions, not
the code), and then "lzss.asm" (anywhere in the code section). See "lzsspack.asm" file.
Now you can use the library functions. They can compress/decompress the data, and save
or load it from file.
In next part those functions are covered with more details.

2.1. LZSS Function Reference

proc lzssFreeData, lzss_data
Frees memory occupied by given lzss data. As lzss_data parameter you should use value
returned by lzssPackData.

proc lzssLoadFile, file_name, ptr_size
Loads packed file of given name, decompresses it and returns pointer to unpacked data.
Usually you will want to obtain size of the data after decompression, in such case you 
have to pass a pointer to dword variable as "ptr_size" parameter. If you pass NULL, 
its also OK but then you won't know unpacked data size.

proc lzssPackData, data_to_pack,data_size
Compresses given data of given size. Returns pointer to LZSSData in eax.


proc lzssSaveFile, file_name, buffer, size
Compresses given data of given size and stores it in specified file. If given file
already exists, it will be overwritten. Function returns zero on fail, and non-zero value
on success.

proc lzssUnpackData, lzss_data
Decompresses packed data. lzss_data should be the value returned by lzssPackData.


3. lzsspack.exe
lzsspack is a simple utility that preforms file compression. It is a command line utility. 
To pack some file just type: 
    >lzsspack source_file output_file
source is your file with data to be packed, and output is a name of file to be generated.
To unpack, type: 
    >lzsspack -u packed_file output_file
and it will decompress given file.

lzsspack's source code is included in the package.

4. Changelog

26.10.2004 - fixed serious bug that was causing data loss.
27.10.2004 - optimizations to bitstream library.
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























































































































Deleted freshlib/_pending/lzss/source/bits.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
; creates bits stream and returns pointer
proc BitsCreateNew, .buf_size
        begin
        push    ebx edi
        invoke  GetProcessHeap
        mov     edi,eax
        invoke  HeapAlloc,eax,HEAP_ZERO_MEMORY,sizeof.BitStream
        or      eax,eax
        jz      .finish
        mov     ebx,eax
        invoke  HeapAlloc,edi,HEAP_ZERO_MEMORY,[.buf_size]
        or      eax,eax
        jz      .finish
        mov     [ebx+BitStream.buf],eax
        mov     [ebx+BitStream.ptr],eax
        mov     [ebx+BitStream.bit_ptr],0
        mov     eax,ebx
        pop     edi ebx
     .finish:
        return
endp

; create bitstream over existing buffer
proc BitsCreateFrom, .bitbuf
        begin
        push    ebx edi
        invoke  GetProcessHeap
        mov     edi,eax
        invoke  HeapAlloc,eax,HEAP_ZERO_MEMORY,sizeof.BitStream
        or      eax,eax
        jz      .finish
        mov     ebx,eax
        mov     eax,[.bitbuf]
        mov     [ebx+BitStream.buf],eax
        mov     [ebx+BitStream.ptr],eax
        mov     [ebx+BitStream.bit_ptr],0
        mov     eax,ebx
        pop     edi ebx
     .finish:
        return
endp

; destroys given bitstream, but not the buffer (!)
proc BitsDestroy, .stream
       begin
       push     eax
       invoke   GetProcessHeap
       invoke   HeapFree,eax,0,[.stream]
       pop      eax
       return
endp

; destroys given bitstream with buffer
proc BitsDestroyBuf, .stream
       begin
       push     eax ebx
       invoke   GetProcessHeap
       mov      ebx,eax
       mov      eax,[.stream]
       mov      eax,[eax+BitStream.buf]
       invoke   HeapFree,ebx,0,eax
       invoke   HeapFree,ebx,0,[.stream]
       pop      ebx eax
       return
endp


; sets given stream to position 0
proc BitsReset, .stream
        begin
        push    eax ebx
        mov     ebx,[.stream]
        mov     [ebx+BitStream.bit_ptr],0
        mov     eax,[ebx+BitStream.buf]
        mov     [ebx+BitStream.ptr],eax
        pop     ebx eax
        return
endp

; puts given number of bits into stream
proc BitsPut, .stream,.bits,.bit_count
        begin
        push    eax ebx ecx edx esi edi
        ; generate mask in edi:esi
        xor     eax,eax
        dec     eax
        mov     esi,eax
        mov     edi,eax
        mov     ebx,[.stream]
        mov     ecx,[.bit_count]
        shl     esi,cl
        mov     ecx,[ebx+BitStream.bit_ptr]
        shld    edi,esi,cl
        shld    esi,eax,cl
        ; load new bits into edx:ecx; at this point ecx==[ebx+BitStream.bit_ptr]
        xor     edx,edx
        mov     eax,[.bits]
        shld    edx,eax,cl
        shl     eax,cl
        mov     ecx,eax
        ; finally, store new bits using
        mov     ebx,[ebx+BitStream.ptr]
        and     [ebx],esi
        or      [ebx],ecx
        add     ebx,4
        and     [ebx],edi
        or      [ebx],edx
        ; and fix the pointers
        mov     ebx,[.stream]
        mov     eax,[.bit_count]
        add     [ebx+BitStream.bit_ptr],eax
        cmp     [ebx+BitStream.bit_ptr],32
        jb      .finish
        sub     [ebx+BitStream.bit_ptr],32
        add     [ebx+BitStream.ptr],4
      .finish:
        pop     edi esi edx ecx ebx eax
        return
endp

; reads given number of bits form the stream
proc BitsGet, .stream,.bit_count
        begin
        push    ebx ecx edx esi
        ; generate mask (in esi)
        xor     esi,esi
        dec     esi
        mov     ecx,[.bit_count]
        shl     esi,cl
        not     esi
        mov     ebx,[.stream]
        mov     eax,[ebx+BitStream.ptr]
        mov     edx,[eax+4]
        mov     eax,[eax]
        mov     ecx,[ebx+BitStream.bit_ptr]
        shrd    eax,edx,cl
        and     eax,esi
        ; fix the pointers
        mov     ebx,[.stream]
        mov     edx,[.bit_count]
        add     [ebx+BitStream.bit_ptr],edx
        cmp     [ebx+BitStream.bit_ptr],32
        jb      .finish
        sub     [ebx+BitStream.bit_ptr],32
        add     [ebx+BitStream.ptr],4
     .finish:
        pop     esi edx ecx ebx
        return
endp

; returns size (in bytes) of given stream
proc BitsGetSize, .stream
        begin
        push    ebx edx
        mov     ebx,[.stream]
        xor     edx,edx                         ; get number of bytes in additional bits
        mov     eax,[ebx+BitStream.bit_ptr]
        or      eax,eax
        jz      .no_extra_bits
        shr     eax,3
        inc     eax
        mov     edx,eax
     .no_extra_bits:
        mov     eax,[ebx+BitStream.ptr]
        sub     eax,[ebx+BitStream.buf]
        add     eax,edx
        pop     edx ebx
        return
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































































































































































































































































































Deleted freshlib/_pending/lzss/source/bits.inc.

1
2
3
4
5
struct BitStream
  .buf dd ?
  .ptr dd ?
  .bit_ptr dd ?
ends
<
<
<
<
<










Deleted freshlib/_pending/lzss/source/cmdln.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
; ------------------------------
; Base64 encoding program v1.0
; by Mateusz Tymek (c) 2004
;
; ------------------------------
; cmdln.asm
;   command line parsing
; ------------------------------


iglobal
; command line variables
cmdln:
  .argc   dd ?
  .argv   rd 0x10    ; 16 parameters limit
  .params rb 0x100

  .input_fname  dd ?
  .output_fname dd ?
  .switches     rd 8
  .out_buf      rb 0x50
endg


; strlen - returns length of given string
; from Fresh Standard Library
proc strlen, .str
        begin
        push    ebx
        mov     eax,[.str]
        mov     ebx,eax
  .scan:
        cmp     byte[eax],0
        lea     eax,[eax+1]
        jne     .scan
        sub     eax,ebx
        dec     eax         ; return value in eax
        pop     ebx
        return
endp

; strlen - returns length of given string
; from Fresh Standard Library
proc strcpy, .dest, .source
        begin
        push    esi edi eax ecx
        mov     edi,[.dest]
        mov     esi,[.source]
        stdcall strlen, esi
        mov     ecx,eax
        cld
        rep     movsb               ; copy strings
.finish:
        pop     ecx eax edi esi
        return
endp


; splits command line into single parameters
; (argv table)
proc parse_command_line, .cmdline
        begin
        push    eax ebx esi edi
        mov     [cmdln.argc],0
        mov     ebx,cmdln.argv
        mov     edi,cmdln.params
        mov     esi,[.cmdline]
     .load:
        mov     al,[esi]
        inc     esi
     .scan:
        cmp     al,0x20
        je      .load
        or      al,al
        jz      .finish
        inc     [cmdln.argc]
        mov     [ebx],edi
        add     ebx,4
        cmp     al,'"'
        je      .copy_quoted
     .copy_param:
        mov     [edi],al
        inc     edi
        mov     al,[esi]
        inc     esi
        cmp     al,0x20
        je      .param_copied
        or      al,al
        jz      .param_copied
        jmp     .copy_param
     .param_copied:
        mov     byte[edi],0
        inc     edi
        jmp     .scan
     .copy_quoted:
        mov     al,[esi]
        inc     esi
        cmp     al,'"'
        je      .end_quoted
        or      al,al
        jz      .param_copied
        mov     [edi],al
        inc     edi
        jmp     .copy_quoted
     .end_quoted:
        mov     al,[esi]
        inc     esi
        jmp     .param_copied
     .finish:
        pop     edi esi ebx eax
        return
endp


proc arrange_cmdline, .cmdline,.def_output_ext
        begin
        stdcall parse_command_line, [.cmdline]
        mov     esi,cmdln.switches
        xor     edx,edx
        xor     ecx,ecx

     .scan_param:
        inc     ecx
        cmp     ecx,[cmdln.argc]
        jae     .params_scanned
        mov     eax,[cmdln.argv+ecx*4]
        cmp     byte[eax],'-'
        je      .switch
        or      edx,edx
        jnz     .output_name
        mov     [cmdln.input_fname],eax
        inc     edx
        jmp     .scan_param
     .output_name:
        mov     [cmdln.output_fname],eax
        inc     edx
        jmp     .scan_param
     .switch:
        mov     [esi],eax
        add     esi,4
        jmp     .scan_param

     .params_scanned:
        cmp     [cmdln.argc],1
        je      .got_output_fname
        mov     dword[esi],0

        cmp     edx,2
        jae     .got_output_fname
        stdcall strcpy, cmdln.out_buf,[cmdln.input_fname]
        stdcall replace_ext, cmdln.out_buf,[.def_output_ext]
        mov     [cmdln.output_fname],cmdln.out_buf
     .got_output_fname:
        return
endp


; replaces extension of given filename to specified one.
; if ext is NULL, then the extension is removed
proc replace_ext, .filename,.ext
        begin
        mov     edi,[.filename]
        stdcall strlen, [.filename]
        add     edi,eax
        mov     ebx,edi
        dec     edi
    .scan:
        mov     al,[edi]
        cmp     al,'.'
        je      .got_extension
        cmp     al,'\'
        je      .append
        cmp     al,'/'
        je      .append
        cmp     al,':'
        je      .append
        or      al,al
        jz      .append
        dec     edi
        jmp     .scan

    .append:
        mov     edi,ebx
        mov     byte[edi],'.'
        inc     edi
        jmp     .get_new_ext

    .got_extension:
        inc     edi
    .get_new_ext:
        mov     esi,[.ext]
        or      esi,esi
        jz      .remove_ext
    .copy_ext:
        mov     al,[esi]
        mov     [edi],al
        inc     esi
        inc     edi
        or      al,al
        jnz     .copy_ext
    .finish:
        return
    .remove_ext:
        dec     edi
        xor     al,al
        mov     [edi],al
        jmp     .finish
endp


; replaces filename in given path
; if fname is NULL, then the file name is removed
proc replace_fname, .path,.fname
        begin
        mov     edi,[.path]
        stdcall strlen, [.path]
        or      eax,eax
        jz      .prepare_copy
        add     edi,eax
        mov     ebx,edi
        dec     edi
    .scan:
        mov     al,[edi]
        cmp     al,'\'
        je      .got_fname
        cmp     al,'/'
        je      .got_fname
        cmp     al,':'
        je      .got_fname
        or      al,al
        jz      .got_fname
        dec     edi
        jmp     .scan

    .got_fname:
        inc     edi
    .prepare_copy:
        mov     esi,[.fname]
    .copy_fname:
        mov     al,[esi]
        mov     [edi],al
        inc     esi
        inc     edi
        or      al,al
        jnz     .copy_fname
    .finish:
        return
endp


proc get_switch_w
        begin
        push    ebx edx
        mov     ebx,cmdln.switches
     .check:
        cmp     dword[ebx],0
        je      .false
        mov     edx,[ebx]

        cmp     word[edx],ax
        je      .true
        add     ebx,4
        jmp     .check
     .false:
        xor     eax,eax
        pop     edx ebx
        return
     .true:
        xor     eax,eax
        inc     eax
        pop     edx ebx
        return
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


































































































































































































































































































































































































































































































































































Deleted freshlib/_pending/lzss/source/lzss.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
;  lzss compression library
;  copyright (c) 2004 Mateusz Tymek
;
;  17.03.2004
;  last updated 27.10.2004
;  version 1.01


uglobal

lzss:
  .rnode rd LZSS_DICTIONARY_SIZE + 1 + 0x100
  .lnode rd LZSS_DICTIONARY_SIZE + 1
  .parent rd LZSS_DICTIONARY_SIZE + 1
  sizeof.trees = $-lzss.rnode

  .dictionary rb LZSS_DICTIONARY_SIZE + LZSS_MAX_COUNT
  sizeof.dictionary = $-lzss.dictionary

  .best_match_len dd ?
  .best_match_pos dd ?
endg

iglobal
  lzss.packer_func dd 0
endg

; creates new empty LZSSData structure
proc lzssNewData
        begin
        invoke  GetProcessHeap
        invoke  HeapAlloc, eax,HEAP_ZERO_MEMORY,sizeof.LZSSData         ; alloc mem for LZSSData struc
        return
endp


; destroys givem LZSSData structure
proc lzssFreeData, .lzss_data
        begin
        push    eax ebx
        invoke  GetProcessHeap
        mov     ebx,eax
        mov     eax,[.lzss_data]
        invoke  HeapFree, ebx,0,[eax+LZSSData.data]
        invoke  HeapFree, ebx,0,[.lzss_data]
        pop     ebx eax
        return
endp

;-----------------------------------------------------------------------------------------------


proc lzss_new_tree
        begin
        push    eax ecx esi edi
        mov     eax,LZSS_NO_TREE
        mov     ecx,LZSS_DICTIONARY_SIZE + 1
        mov     esi,lzss.lnode
        mov     edi,lzss.parent
     .clear:
        mov     [esi],eax
        mov     [edi],eax
        add     edi,4
        add     esi,4
        dec     ecx
        jnz     .clear
        mov     edi,lzss.rnode
        mov     ecx,LZSS_DICTIONARY_SIZE + 0x101
     .clear_btrees:
        mov     [edi],eax
        add     edi,4
        dec     ecx
        jnz     .clear_btrees
        pop     edi esi ecx eax
        return
endp


proc lzss_insert_node, .buffer_pos    ; inserts string at text_buf+[buf_pos] into the tree
        begin
        push    eax ebx ecx edx esi edi
        xor     eax,eax
        mov     [lzss.best_match_len],eax
        mov     [lzss.best_match_pos],eax

        mov     eax,[.buffer_pos]
        mov     edx,eax
        add     eax,lzss.dictionary
        movzx   eax,byte[eax]
        lea     ebx,[LZSS_DICTIONARY_SIZE+1+eax]
        mov     edx,1           ; edx will hold comparision result
        mov     eax,LZSS_NO_TREE
        mov     [lzss.rnode+edx*4],eax
        mov     [lzss.lnode+edx*4],eax

  .search_tree:
        or      edx,edx
        js      .left_node
     .right_node:
        cmp     [lzss.rnode+ebx*4],LZSS_NO_TREE
        je      .put_right

        mov     ebx,[lzss.rnode+ebx*4]
        jmp     .node_ok
     .put_right:
        mov     eax,[.buffer_pos]
        mov     [lzss.rnode+ebx*4],eax
        mov     [lzss.parent+eax*4],ebx
        jmp     .finish
     .left_node:
        cmp     [lzss.lnode+ebx*4],LZSS_NO_TREE
        je      .put_left

        mov     ebx,[lzss.lnode+ebx*4]
        jmp     .node_ok
     .put_left:
        mov     eax,[.buffer_pos]
        mov     [lzss.lnode+ebx*4],eax
        mov     [lzss.parent+eax*4],ebx
        jmp     .finish
     .node_ok:
        push    esi edi
        lea     edi,[lzss.dictionary+ebx]
        mov     esi,[.buffer_pos]
        lea     esi,[lzss.dictionary+esi]
        mov     ecx,LZSS_MAX_COUNT-1
        inc     esi     ;  we know that first character
        inc     edi     ;  already matches
        xor     edx,edx
        xor     eax,eax
     .compare:
        mov     dl,[esi]
        mov     al,byte[edi]
        sub     edx,eax
        or      edx,edx
        jnz     .compared
        inc     edi
        inc     esi
        dec     ecx
        jnz     .compare
     .compared:
        pop     esi edi

        mov     eax,LZSS_MAX_COUNT-1
        dec     ecx
        sub     eax,ecx
        cmp     eax,[lzss.best_match_len]
        jbe     .search_tree
        mov     [lzss.best_match_len],eax
        mov     [lzss.best_match_pos],ebx

        cmp     eax,LZSS_MAX_COUNT
        jae     .got_max_count

        jmp     .search_tree

     .got_max_count:
        mov     eax,[.buffer_pos]
        mov     edx,[lzss.parent+ebx*4]
        mov     [lzss.parent+eax*4],edx

        mov     edx,[lzss.lnode+ebx*4]
        mov     [lzss.lnode+eax*4],edx
        mov     [lzss.parent+edx*4],eax

        mov     edx,[lzss.rnode+ebx*4]
        mov     [lzss.rnode+eax*4],edx
        mov     [lzss.parent+edx*4],eax

        mov     edx,[lzss.parent+ebx*4]
        cmp     [lzss.rnode+edx*4],ebx
        je      .right
     .left:
        mov     [lzss.lnode+edx*4],eax
        jmp     .ok
     .right:
        mov     [lzss.rnode+edx*4],eax
     .ok:
        mov     eax,LZSS_NO_TREE
        mov     [lzss.parent+ebx*4],eax
        mov     [lzss.lnode+ebx*4],eax
        mov     [lzss.rnode+ebx*4],eax

     .finish:
        pop     edi esi edx ecx ebx eax
        return
endp


; removes tree node at [buffer_pos]
proc lzss_delete_node, .buffer_pos
        begin
        push    eax ebx ecx edx
        mov     eax,[.buffer_pos]
        cmp     dword[lzss.parent+eax*4],LZSS_NO_TREE   ; empty?
        je      .finish

        cmp     dword[lzss.rnode+eax*4],LZSS_NO_TREE
        je      .empty_right
        cmp     dword[lzss.lnode+eax*4],LZSS_NO_TREE
        je      .empty_left


        ; if we are here then none of children is empty

        mov     ebx,[lzss.lnode+eax*4]
        cmp     [lzss.rnode+ebx*4],LZSS_NO_TREE
        je      .got_free_rnode
      .find_free_rnode:
        mov     ebx,[lzss.rnode+ebx*4]
        cmp     [lzss.rnode+ebx*4],LZSS_NO_TREE
        jne     .find_free_rnode

        mov     edx,[lzss.parent+ebx*4]
        mov     ecx,[lzss.lnode+ebx*4]
        mov     [lzss.rnode+edx*4],ecx
        mov     [lzss.parent+ecx*4],edx

        mov     edx,[lzss.lnode+eax*4]
        mov     [lzss.lnode+ebx*4],edx
        mov     [lzss.parent+edx*4],ebx

  .got_free_rnode:

        mov     edx,[lzss.rnode+eax*4]
        mov     [lzss.rnode+ebx*4],edx
        mov     [lzss.parent+edx*4],ebx

        jmp     .remove

  .empty_left:
        mov     ebx,[lzss.rnode+eax*4]
        jmp     .remove
  .empty_right:
        mov     ebx,[lzss.lnode+eax*4]

  .remove:

        mov     edx,[lzss.parent+eax*4]         ; now edx holds parent of node being removed
        mov     [lzss.parent+ebx*4],edx

        ; now fix the valid child
        cmp     [lzss.rnode+edx*4],eax
        je      .fix_right_child
  .fix_left_child:
        mov     [lzss.lnode+edx*4],ebx
        jmp     .clear
  .fix_right_child:
        mov     [lzss.rnode+edx*4],ebx

  .clear:       ; clear the node that is being removed
        mov     [lzss.parent+eax*4],LZSS_NO_TREE
        mov     [lzss.rnode+eax*4],LZSS_NO_TREE
        mov     [lzss.lnode+eax*4],LZSS_NO_TREE

  .finish:

        pop     edx ecx ebx eax
        return
endp


proc lzssPackData, .buffer,.buffer_size
.lzss_data dd ?
.bitstream dd ?
        begin
        push    ebx ecx edx esi edi
        ; fill the dictionary with zeroes
        mov     edi,lzss.dictionary
        mov     ecx,(LZSS_DICTIONARY_SIZE + LZSS_MAX_COUNT)/2
        xor     eax,eax
      .clear_dictionary:
        mov     [edi],ax
        add     edi,2
        dec     ecx
        jnz     .clear_dictionary

        stdcall lzssNewData
        or      eax,eax
        jz      .finish
        mov     [.lzss_data],eax
        mov     edi,eax
        invoke  GetProcessHeap
        mov     ebx,eax
        mov     eax,[.buffer_size]       ; calculate maximum memory that can be needed by
        shr     eax,3                   ; compressed data. It is data_size + data_size/8 ...
        inc     eax                     ; and one more byte just to be sure :)
        add     eax,[.buffer_size]       ;
        invoke  HeapAlloc, ebx,HEAP_ZERO_MEMORY,eax
        or      eax,eax
        jz      .finish
        mov     [edi+LZSSData.data],eax
        mov     ecx,[.buffer_size]
        mov     [edi+LZSSData.unpacked_size],ecx
        mov     eax,[.buffer]            ; esi will point to input buffer
        add     eax,ecx         ; add eax,[buffer_size]
        stdcall BitsCreateFrom, [edi+LZSSData.data]
        mov     [.bitstream],eax

        ; edi will point to the end of the dictionary...
        mov     edi,LZSS_DICTIONARY_SIZE-LZSS_MAX_COUNT
        ; ... and esi will mark the start
        xor     esi,esi
        stdcall lzss_new_tree


        xor     edx,edx
     .read_first_bytes:
        mov     eax,[.buffer]
        mov     al,[eax]
        inc     [.buffer]
        mov     [lzss.dictionary+edi+edx],al
        inc     edx
        cmp     edx,LZSS_MAX_COUNT
        jae     .got_first_bytes
        dec     [.buffer_size]
        jz      .got_first_bytes
        jmp     .read_first_bytes
     .got_first_bytes:

        or      edx,edx
        jz      .packed

        mov     ecx,LZSS_MAX_COUNT-1
        mov     eax,edi
        dec     eax
     .prepare_tree:
        stdcall lzss_insert_node,eax
        dec     eax
        dec     ecx
        jnz     .prepare_tree
        stdcall lzss_insert_node,edi         ; insert the string just read; best_match_len and best_match_pos are set

     .packer_loop:
        cmp     [lzss.best_match_len],edx    ; best_match_len may be too long near the end
        jbe      .lzss.best_match_len_ok
        mov     [lzss.best_match_len],edx
     .lzss.best_match_len_ok:

        cmp     [lzss.best_match_len],LZSS_THRESHOLD   ; send unpacked byte or ofs-length pair?
        ja      .send_packed
        stdcall BitsPut, [.bitstream],0,1       ; send "unpacked data" flag
        mov     al,[lzss.dictionary+edi]
        stdcall BitsPut, [.bitstream],eax,8     ; send byte directly
        mov     [lzss.best_match_len],1              ; mark that we have processed just one byte

        jmp     .item_packed
     .send_packed:
        stdcall BitsPut, [.bitstream],1,1       ; "packed data" flag
        stdcall BitsPut, [.bitstream],[lzss.best_match_pos],LZSS_OFFSET_BITS
        mov     eax,[lzss.best_match_len]
        sub     eax,LZSS_THRESHOLD+1
        stdcall BitsPut, [.bitstream],eax,LZSS_COUNT_BITS


     .item_packed:
        xor     ecx,ecx
        mov     ebx,[lzss.best_match_len]    ; ebx will hold value of "last match length"
        cmp     [.buffer_size],0
        je      .new_bytes_ok
     .get_new_bytes:
        cmp     ecx,ebx                 ; compare ecx to [last_match_len]
        jae     .new_bytes_ok
        dec     [.buffer_size]
        jz      .new_bytes_ok
        stdcall lzss_delete_node,esi
        mov     eax,[.buffer]
        inc     [.buffer]
        mov     al,[eax]
        mov     [lzss.dictionary+esi],al        ; put new byte in the dictionary
        cmp     esi,LZSS_MAX_COUNT
        jae     .no_extra
        mov     [lzss.dictionary+esi+LZSS_DICTIONARY_SIZE],al
     .no_extra:
        inc     esi
        inc     edi
        mov     eax,LZSS_DICTIONARY_SIZE
        dec     eax
        and     esi,eax
        and     edi,eax

        stdcall lzss_insert_node,edi         ; insert new string

        inc     ecx
        jmp     .get_new_bytes
     .new_bytes_ok:
        cmp     ecx,ebx
        jae     .packed
        inc     ecx
        stdcall lzss_delete_node,esi
        inc     esi
        inc     edi
        mov     eax,LZSS_DICTIONARY_SIZE
        dec     eax
        and     esi,eax
        and     edi,eax
        dec     edx
        jz      .new_bytes_ok

        stdcall lzss_insert_node,edi
        jmp     .new_bytes_ok
     .packed:

        or      edx,edx
        jnz     .packer_loop

        mov     ebx,[.lzss_data]
        stdcall BitsGetSize, [.bitstream]
        mov     [ebx+LZSSData.packed_size],eax
     .finish:

        mov     eax,[.lzss_data]
        pop     edi esi edx ecx ebx
        return
endp


;iglobal
;  szOutFile db "out.dat", 0
;  szOutFile2 db "out2.dat", 0
;endg
;

;-----------------------------------------------------------------------------------------------



; debug lines
;iglobal
;  szDictionary db "ofs: %d, len: %d", 13, 10, 0
;  szDirect     db "direct byte: %d ('%c')", 13, 10, 0
;  szEndMarker  db "eof", 13, 10, 0
;endg


; unpacks given LZSSData structure and returns pointer
; when you have finished with this data, you should
; free this memory using HeapFree()
proc lzssUnpackData, .lzss_data
.uncompressed dd ?
.size         dd ?
        begin
        push    ebx ecx edx esi edi

        ; fill the dictionary with zeroes
        mov     edi,lzss.dictionary
        mov     ecx,(LZSS_DICTIONARY_SIZE + LZSS_MAX_COUNT)/2
        xor     eax,eax
      .clear_dictionary:
        mov     [edi],ax
        add     edi,2
        dec     ecx
        jnz     .clear_dictionary

        mov     ebx,[.lzss_data]
        invoke  GetProcessHeap
        invoke  HeapAlloc, eax,HEAP_ZERO_MEMORY,[ebx+LZSSData.unpacked_size]
        mov     [.uncompressed],eax
        mov     edi,eax
        stdcall BitsCreateFrom, [ebx+LZSSData.data]
        mov     esi,eax
        mov     eax,[ebx+LZSSData.unpacked_size]
        mov     [.size],eax
        mov     edx,LZSS_DICTIONARY_SIZE - LZSS_MAX_COUNT

   .unpack:
        stdcall BitsGet,esi,1
        or      eax,eax
        jnz     .from_dictionary
        stdcall BitsGet,esi,8

     ; debug lines
;     pusha
;     cinvoke printf, szDirect, eax,eax
;     popa
        mov     [edi],al
        inc     edi

        mov     [lzss.dictionary+edx],al
        inc     edx
        mov     eax,LZSS_DICTIONARY_SIZE
        dec     eax
        and     edx,eax
        dec     [.size]
        jz      .finish
        jmp     .unpack


    .from_dictionary:
        stdcall BitsGet, esi,LZSS_OFFSET_BITS         ; load position
;     push    eax  ; debug line
        mov     ebx,eax    ; no, unpack portion
        stdcall BitsGet, esi,LZSS_COUNT_BITS          ; load counter
        mov     ecx,eax
        add     ecx,LZSS_THRESHOLD+1
        sub     [.size],ecx

; debug lines
;     pop     eax
;     pusha
;     cinvoke printf, szDictionary, eax,ecx
;     popa

     .copy:
        mov     al,[lzss.dictionary+ebx]
        mov     [edi],al
        mov     [lzss.dictionary+edx],al
        inc     ebx
        inc     edi
        inc     edx
        mov     eax,LZSS_DICTIONARY_SIZE
        dec     eax
        and     edx,eax
        and     ebx,eax

        dec     ecx
        jnz     .copy
        cmp     [.size],0

        je      .finish
        jmp     .unpack
     .finish:

;  debug lines
;     pusha
;     cinvoke printf, szEndMarker
;     popa

        stdcall BitsDestroy, esi


;        invoke  CreateFile, szOutFile2,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0
;        mov     ebx,eax
;        invoke  WriteFile,eax,lzss.dictionary,sizeof.dictionary,tmp,0
;        invoke  CloseHandle,ebx
;

        mov     eax,[.uncompressed]


        pop     edi esi edx ecx ebx
        return
endp



; file routines

; compress data and store it in given file; returns 0 on fail
proc lzssSaveFile, .file_name,.buffer,.size
.hdr LZSSFileHeader
.tmp dd ?
        begin
        push    ebx ecx edx esi
        mov     eax,[lzss.packer_func]
        or      eax,eax
        jnz     .packer_func_ok
        mov     [lzss.packer_func],lzssPackData
     .packer_func_ok:
        stdcall [lzss.packer_func], [.buffer],[.size]
        mov     esi,eax
        mov     [.hdr.id],"LZSS"
        mov     eax,[.size]
        mov     [.hdr.unpacked_size],eax
        invoke  CreateFile, [.file_name],GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0
        cmp     eax,INVALID_HANDLE_VALUE
        je      .error
        mov     ebx,eax
        lea     eax,[.hdr]
        lea     edx,[.tmp]
        invoke  WriteFile,ebx,eax,sizeof.LZSSFileHeader,edx,0
        mov     ecx,[esi+LZSSData.packed_size]
        mov     eax,[esi+LZSSData.data]
        invoke  WriteFile,ebx,eax,ecx,tmp,0
        invoke  CloseHandle,ebx
        stdcall lzssFreeData,esi
        xor     eax,eax
        dec     eax
     .finish:
        pop     esi edx ecx ebx
        return
     .error:
        xor     eax,eax
        jmp     .finish
endp


; loads packed data from given file, unpacks it and returns pointer
; (0 on fail); ptr_size should be a pointer to dword variable
; that will contain unpacked data size
proc lzssLoadFile, .file_name, .ptr_size
.input_buf  dd ?
.input_size dd ?
        begin
        push    ebx ecx edx esi edi
        invoke  CreateFile, [.file_name],GENERIC_READ,0,0,OPEN_EXISTING,0,0
        cmp     eax,INVALID_HANDLE_VALUE
        je      .error
        mov     ebx,eax
        invoke  SetFilePointer,ebx,0,0,FILE_END
        mov     [.input_size],eax
        mov     esi,eax
        invoke  GetProcessHeap
        invoke  HeapAlloc, eax,HEAP_ZERO_MEMORY,esi
        or      eax,eax
        jz      .finish
        mov     [.input_buf],eax
        invoke  SetFilePointer, ebx,0,0,FILE_BEGIN
        invoke  ReadFile, ebx,[.input_buf],esi,tmp,0
        invoke  CloseHandle,ebx
        stdcall lzssNewData
        or      eax,eax
        jz      .finish
        mov     esi,eax
        mov     eax,[.input_buf]
        add     eax,sizeof.LZSSFileHeader
        mov     [esi+LZSSData.data],eax
        mov     eax,[.input_buf]
        mov     eax,[eax+LZSSFileHeader.unpacked_size]
        mov     [esi+LZSSData.unpacked_size],eax
        stdcall lzssUnpackData, esi
        or      eax,eax
        jz      .finish
        mov     ebx, eax

        mov     eax,[.ptr_size]
        or      eax,eax
        jz      .no_size_ptr
        mov     edx,[esi+LZSSData.unpacked_size]
        mov     [eax],edx
     .no_size_ptr:
        stdcall lzssFreeData,esi
        mov     eax,ebx
     .finish:
        pop     edi esi edx ecx ebx
        return
     .error:
        xor     eax,eax
        jmp     .finish
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted freshlib/_pending/lzss/source/lzss.inc.

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
; packed data structure
struct LZSSData
  .packed_size     dd ?
  .unpacked_size   dd ?
  .data            dd ?
ends


; packed file header
struct LZSSFileHeader
  .id            dd ?
  .unpacked_size dd ?
ends


; lzss settings

LZSS_THRESHOLD       = 2

LZSS_COUNT_BITS      = 4
LZSS_OFFSET_BITS     = 12

LZSS_DICTIONARY_SIZE = (2 shl (LZSS_OFFSET_BITS-1))
LZSS_MAX_COUNT       = (2 shl (LZSS_COUNT_BITS-1)) + LZSS_THRESHOLD

LZSS_NO_TREE = LZSS_DICTIONARY_SIZE
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































Deleted freshlib/_pending/lzss/source/lzsspack.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
format PE console
entry start
include "%finc%/win32/win32a.inc"
include "%finc%/libs/strlib.inc"
include "bits.inc"
include "lzss.inc"
include "lzssstat.inc"

..ShowSkipped = 0

section '.code' code readable executable

include "%finc%/libs/strlib.asm"
include "bits.asm"
include "cmdln.asm"
include "lzss.asm"
include "lzssstat.asm"


  start:
        invoke  GetCommandLine
        stdcall arrange_cmdline, eax,szDefExt

        mov     ax,'-u'
        call    get_switch_w
        or      eax,eax
        jz      pack_file


     unpack_file:
        cmp     [cmdln.input_fname],0
        je      usage
        stdcall replace_ext, [cmdln.output_fname],szDefOutExt
        stdcall lzssLoadFile,[cmdln.input_fname],unp_size
        push    eax
        invoke  CreateFile, [cmdln.output_fname],GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0
        mov     ebx,eax
        pop     eax
        invoke  WriteFile,ebx,eax,[unp_size],tmp,0
        invoke  CloseHandle,ebx
        stdcall lzssFreeData, esi
        jmp     finish

     pack_file:
        cmp     [cmdln.input_fname],0
        je      usage
        invoke  CreateFile, [cmdln.input_fname],GENERIC_READ,0,0,OPEN_EXISTING,0,0
        cmp     eax,INVALID_HANDLE_VALUE
        je      finish
        mov     ebx,eax
        invoke  SetFilePointer, ebx,0,0,FILE_END
        mov     [input_size],eax
        mov     esi,eax
        invoke  GetProcessHeap
        invoke  HeapAlloc, eax,HEAP_ZERO_MEMORY,esi
        or      eax,eax
        jz      finish
        mov     [input_buf],eax
        invoke  SetFilePointer, ebx,0,0,FILE_BEGIN
        invoke  ReadFile, ebx,[input_buf],esi,tmp,0
        invoke  CloseHandle, ebx
        mov     [lzss.packer_func],lzssStatPack
        mov     ebx,[cmdln.argv]
        stdcall lzssSaveFile, [cmdln.output_fname],[input_buf],[input_size]
        cinvoke printf, szStatus, [lzss_stat.time],[lzss_stat.kbytes_per_sec],\
                                  [lzss_stat.size],[lzss_stat.packed_size],[lzss_stat.ratio],\
                                  [lzss_stat.total_items],[lzss_stat.direct_bytes],\
                                  [lzss_stat.dictionary_entries]
        jmp     finish

     usage:
        cinvoke printf, szUsage
     finish:
        invoke  ExitProcess, 0



iglobal
  szDefExt    db "lzss", 0
  szDefOutExt db "out", 0

  szUsage db "usage:", 13, 10, "  to compress: lzsspack input [output]", 13, 10
          db "  to decompress: lzsspack -u input output", 13, 10, 0

  szStatus db "status: ", 13, 10
           db "   total compression time: %d seconds", 13, 10
           db "            average speed: %d kbytes/sec", 13, 10
           db "       unpacked file size: %d bytes", 13, 10
           db "         packed data size: %d bytes", 13, 10
           db "        compression ratio: %d percent", 13, 10
           db 13, 10
           db "              total items: %d", 13, 10
           db "  direct (unpacked) bytes: %d", 13, 10
           db "       dictionary entries: %d", 13, 10, 0

endg


uglobal
  input_buf   dd ?
  input_size  dd ?
  output_name dd ?
  tmp         dd ?
  unp_size    dd ?
  argc        dd ?
  argv        dd ?
  env         dd ?
  hdr         LZSSFileHeader
  name_buf    rb 0x100
endg

;data fixups
;end data

section '.data' data readable writeable
IncludeAllGlobals


section '.idata' import data readable

library kernel32,"KERNEL32.DLL",\
        crtdll,"CRTDLL.DLL"

include "%finc%/win32/apia/kernel32.inc"

import crtdll,\
       __getmainargs,"__GetMainArgs",\
       printf,"printf",\
       flushall,"_flushall"
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


































































































































































































































































Deleted freshlib/_pending/lzss/source/lzsspack.fpr.

cannot compute difference between binary files

Deleted freshlib/_pending/lzss/source/lzssstat.asm.

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
proc lzssStatPack, .buffer, .buffer_size
        begin
        ; pack the data and count the time of the process
        invoke  GetTickCount
        mov     edi,eax
        stdcall lzssPackData, [.buffer],[.buffer_size]
        mov     ebx,eax
        invoke  GetTickCount
        sub     eax,edi
        xor     edx,edx

        mov     esi,1000
        div     esi
        mov     [lzss_stat.time],eax
        mov     esi,eax
        mov     eax,[.buffer_size]
        xor     edx,edx
        or      esi,esi
        jz      @f
        div     esi
    @@:
        shr     eax,10          ; divide eax by 1024
        mov     [lzss_stat.kbytes_per_sec],eax

        xor     eax,eax
        mov     [lzss_stat.total_items],eax
        mov     [lzss_stat.direct_bytes],eax
        mov     [lzss_stat.dictionary_entries],eax

        ; calculate ratio
        mov     edi,[.buffer_size]
        mov     [lzss_stat.size],edi
        mov     eax,[ebx+LZSSData.packed_size]
        mov     [lzss_stat.packed_size],eax
        mov     esi,100
        mul     esi
        div     edi
        mov     [lzss_stat.ratio],eax
        mov     edi,[ebx+LZSSData.unpacked_size]
        ; now scan compressed data
        stdcall BitsCreateFrom, [ebx+LZSSData.data]
        mov     esi,eax
   .unpack:
        inc     [lzss_stat.total_items]
        stdcall BitsGet,esi,1
        or      eax,eax
        jnz     .from_dictionary
        inc     [lzss_stat.direct_bytes]
        stdcall BitsGet,esi,8
        dec     edi
        jz      .finish
        jmp     .unpack
    .from_dictionary:
        stdcall BitsGet, esi,LZSS_OFFSET_BITS         ; load position
        inc     [lzss_stat.dictionary_entries]
        stdcall BitsGet, esi,LZSS_COUNT_BITS          ; load counter
        sub     edi,eax
        sub     edi,LZSS_THRESHOLD+1
        jz      .finish
        js      .finish
        jmp     .unpack
     .finish:
        stdcall BitsDestroy, esi

        mov     eax,ebx
        return
endp

uglobal
  lzss_stat:
    .time               dd ?
    .kbytes_per_sec     dd ?
    .size               dd ?
    .packed_size        dd ?
    .ratio              dd ?

    .total_items        dd ?
    .direct_bytes       dd ?
    .dictionary_entries dd ?
endg
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
































































































































































Deleted freshlib/_pending/lzss/source/lzssstat.inc.

Deleted freshlib/_test_images/test.gif.

cannot compute difference between binary files

Changes to freshlib/_trash/Common/header.inc.

1
2
3
4
5
6
7



8
9

10
11
12
13
14
15

16
17
18
19
; ____________________________________________________________________
;|                                                                    |
;| This file is part of the project:                                  |
;|                                                                    |
;| ..::FreshLib::.. - portable, assembler library and GUI toolkit.    |
;| __________________________________________________________________ |
;|                                                                    |



;|                          This file                                 |
;|                          ~~~~~~~~~                                 |

;|   Author:                                                          |
;|                                                                    |
;|   Title:                                                           |
;|                                                                    |
;|   OS:                                                              |
;|                                                                    |

;|   Notes and changes:                                               |
;|                                                                    |
;|                                                                    |
;|____________________________________________________________________|
|
|
<
<
|
|
<
>
>
>
|
<
>
|
<
<
<
<
<
>
|
<
<
|
1
2


3
4

5
6
7
8

9
10





11
12


13
; _______________________________________________________________________________________
;|                                                                                       |


;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|

;
;  Description:
;
;  Target OS:

;
;  Dependencies:





;
;  Notes:


;_________________________________________________________________________________________

Added freshlib/_trash/SurplusSources/ForthScript/ForthLib.asm.













































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: ForthScript standard word library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

macro ForthBlock blockname {
  forth@block equ blockname
  forth@block@size equ blockname#.size

  label blockname byte

  macro forthword name \{
    \local nnnn

    macro endfw \\{
    \\local ..footer
      endp
      label ..footer byte
      db   name
      db   16-($-..footer) dup 0
      dd   nnnn - blockname
      \\purge endfw
    \\}
    \proc nnnn
  \}
}

macro EndForthBlock {
  forth@block@size = $ - forth@block
  restore forth@block, forth@block@size
  purge forthword
}



ForthBlock ForthStandardLib

; "->" word.
forthword '->'
begin
        or      [ebx+TForthContext.Status], forthAssignMode
        clc
        retn
endfw


forthword '+'
begin
        mov     eax, [ebx+TForthContext.pAStack]
        mov     ecx, [eax+TArray.count]
        cmp     ecx, 2
        jb      .error

        dec     ecx
        imul    ecx, [eax+TArray.itemsize]
        lea     ecx, [eax+TArray.array+ecx]

        mov     edx, [ecx+TFStackCell.value]
        sub     ecx, [eax+TArray.itemsize]
        add     [ecx+TFStackCell.value], edx
        mov     [ecx+TFStackCell.type], ftypeNumber

        mov     ecx, [eax+TArray.count]
        dec     ecx
        stdcall DeleteArrayItem, [ebx+TForthContext.pAStack], ecx
        mov     [ebx+TForthContext.pAStack], edx
        clc
        return

.error:
        stc
        return
endfw


forthword '-'
begin
        mov     eax, [ebx+TForthContext.pAStack]
        mov     ecx, [eax+TArray.count]
        cmp     ecx, 2
        jb      .error

        dec     ecx
        imul    ecx, [eax+TArray.itemsize]
        lea     ecx, [eax+TArray.array+ecx]

        mov     edx, [ecx+TFStackCell.value]
        sub     ecx, [eax+TArray.itemsize]
        sub     [ecx+TFStackCell.value], edx
        mov     [ecx+TFStackCell.type], ftypeNumber

        mov     ecx, [eax+TArray.count]
        dec     ecx
        stdcall DeleteArrayItem, [ebx+TForthContext.pAStack], ecx
        mov     [ebx+TForthContext.pAStack], edx
        clc
        return

.error:
        stc
        return
endfw



forthword '*'
begin
        mov     eax, [ebx+TForthContext.pAStack]
        mov     ecx, [eax+TArray.count]
        cmp     ecx, 2
        jb      .error

        dec     ecx
        imul    ecx, [eax+TArray.itemsize]
        lea     ecx, [eax+TArray.array+ecx]

        mov     edx, [ecx+TFStackCell.value]
        sub     ecx, [eax+TArray.itemsize]
        imul    edx, [ecx+TFStackCell.value]
        mov     [ecx+TFStackCell.value], edx
        mov     [ecx+TFStackCell.type], ftypeNumber

        mov     ecx, [eax+TArray.count]
        dec     ecx
        stdcall DeleteArrayItem, [ebx+TForthContext.pAStack], ecx
        mov     [ebx+TForthContext.pAStack], edx
        clc
        return

.error:
        stc
        return
endfw



forthword '/'
begin
        mov     eax, [ebx+TForthContext.pAStack]
        mov     ecx, [eax+TArray.count]
        cmp     ecx, 2
        jb      .error

        dec     ecx
        imul    ecx, [eax+TArray.itemsize]
        lea     ecx, [eax+TArray.array+ecx]

        mov     edx, [ecx+TFStackCell.value]
        sub     ecx, [eax+TArray.itemsize]

        push    eax
        mov     eax, edx
        cdq
        idiv    [ecx+TFStackCell.value]
        mov     [ecx+TFStackCell.value], eax
        mov     [ecx+TFStackCell.type], ftypeNumber
        pop     eax

        mov     ecx, [eax+TArray.count]
        dec     ecx
        stdcall DeleteArrayItem, [ebx+TForthContext.pAStack], ecx
        mov     [ebx+TForthContext.pAStack], edx
        clc
        return

.error:
        stc
        return
endfw


forthword '%'
begin
        mov     eax, [ebx+TForthContext.pAStack]
        mov     ecx, [eax+TArray.count]
        cmp     ecx, 2
        jb      .error

        dec     ecx
        shl     ecx, 3
        lea     ecx, [eax+TArray.array+ecx]

        mov     edx, [ecx+TFStackCell.value]
        sub     ecx, [eax+TArray.itemsize]

        push    eax
        mov     eax, edx
        cdq
        idiv    [ecx+TFStackCell.value]
        mov     [ecx+TFStackCell.value], eax
        mov     [ecx+TFStackCell.type], ftypeNumber
        pop     eax

        mov     ecx, [eax+TArray.count]
        dec     ecx
        stdcall DeleteArrayItem, [ebx+TForthContext.pAStack], ecx
        mov     [ebx+TForthContext.pAStack], edx
        clc
        return

.error:
        stc
        return
endfw




forthword 'swap'
begin
        mov     eax, [ebx+TForthContext.pAStack]
        mov     ecx, [eax+TArray.count]
        cmp     ecx, 2
        jb      .finish         ; jb == jc

        shl     ecx, 3
        add     ecx, [ebx+TForthContext.pAStack]
;        lea     ecx, [ecx+TArray.array-2*sizeof.TFStackCell] TArray.array = 2*sizeof.TFStackCell

        mov     eax, [ecx+TFStackCell.value]
        mov     edx, dword [ecx+TFStackCell.type]
        xchg    eax, [ecx+sizeof.TFStackCell+TFStackCell.value]
        xchg    edx, dword [ecx+sizeof.TFStackCell+TFStackCell.type]
        mov     [ecx+TFStackCell.value], ecx
        mov     dword [ecx+TFStackCell.type], edx

        clc
.finish:
        return
endfw



forthword 'dup'
begin
        mov     eax, [ebx+TForthContext.pAStack]
        mov     ecx, [eax+TArray.count]
        cmp     ecx, 1
        jb      .finish         ; jb == jc

        shl     ecx, 3
        add     ecx, [ebx+TForthContext.pAStack]
        lea     ecx, [ecx+TArray.array-sizeof.TFStackCell]

        stdcall AddArrayItem, [ebx+TForthContext.pAStack]
        mov     [ebx+TForthContext.pAStack], edx
        jc      .finish

        pushd   [ecx+TFStackCell.value] dword [ecx+TFStackCell.type]
        popd    dword [eax+TFStackCell.type] [eax+TFStackCell.value]

        clc
.finish:
        return
endfw



forthword 'label'
begin


endfw




forthword 'jump'
begin


endfw




forthword '?branch'
begin


endfw



; : if +1 ?branch ;
forthword 'if'
begin


endfw



; : else label not +1 ?branch ;
forthword 'else'
begin


endfw


; : then label ;
forthword 'then'
begin


endfw





; : do label ;
forthword 'do'
begin


endfw


; : loop -1 ?branch ;
forthword 'loop'




forthword '.'
begin
        mov     eax, [ebx+TForthContext.pAStack]
        mov     ecx, [eax+TArray.count]
        jecxz   .exit

        dec     ecx
        mov     edx, ecx

        imul    ecx, [eax+TArray.itemsize]
        lea     ecx, [eax+TArray.array+ecx]

        cmp     [ecx+TFStackCell.type], ftypeNumber
        jne     .printstring

        stdcall NumToStr, [ecx+TFStackCell.value], ntsSigned or ntsDec
        mov     [ecx+TFStackCell.value], eax
        mov     [ecx+TFStackCell.type], ftypeStringFree

.printstring:
        stdcall StrPtr, [ecx+TFStackCell.value]
        stdcall Output, eax

        cmp     [ecx+TFStackCell.type], ftypeStringFree
        jne     .popit

        stdcall StrDel, [ecx+TFStackCell.value]

.popit:
        stdcall DeleteArrayItem, [ebx+TForthContext.pAStack], edx
        mov     [ebx+TForthContext.pAStack], edx

.exit:
        clc
        return

endfw



forthword 'crlf'
begin
        stdcall Output, sCRLF
        clc
        return
endfw



EndForthBlock



sCRLF db 13, 10, 0, 0

Added freshlib/_trash/SurplusSources/ForthScript/ForthScript.asm.



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: ForthScript engine.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________
module "Forth script compiler"

include 'ForthLib.asm'

; NOTE: E8    is the opcode for relative call
;       B8    is the opcode for mov eax, dword const
;       BA    is the opcode for mov edx, dword const
;       FF D0 is the opcode for call eax
;       C3    is the opcode for retn
;       e9    is the opcode for jmp long offset



ftypeNumber  = 0
ftypeString  = 1
ftypeStringFree = 2      ; this string should be destroyed after use.

struct TFStackCell
  .value dd ?           ; number or handle of the string.
  .type  db ?           ; number/string
  align 4
ends


struct TFLoopStackCell
ends



struct TFWordFooter
  .name    rb 16        ; max 12 bytes name paded with 0
  .entry   dd ?         ; offset to the code of the word  [.entry]-4 points to the footer of the previous word.
ends


; values for the Status flags.

forthCompileMode =  1   ; if set the script is compiled instead of interpreted
forthNextNewName =  2   ; if set the next extracted word should be interpreted as a new name.
forthAssignMode  =  4   ; if set the next variable word must pop value from the stack, instead of push.



struct TForthContext
  .pAStack     dd  ?     ; pointer to the aritmetic stack TArray.
  .pLStack     dd  ?     ; pointer to the loop stack TArray.
  .pWords      dd  ?     ; pointer to the words memory.
  .iWords      dd  ?     ; offset to the first free byte in the words memory.
  .iLastWord   dd  ?     ; offset to the end of the last word defined.
  .sizeWords   dd  ?     ; size of the words memory.

  .Status      dd ?

  .pUserWords  dd  ?     ; pointer to the user words memory.
  .iUserWords  dd  ?     ; offset of the end of the user word memory.
  .pUser       dd  ?     ; pointer to the user provided object for example TFreshEdit or other.
ends


ForthInitWordsMemory = 1024


proc ForthCreateContext
begin
        push    edi

        stdcall GetMem, sizeof.TForthContext
        mov     edi, eax

        stdcall CreateArray, sizeof.TFStackCell
        mov     [edi+TForthContext.pAStack], eax

        stdcall CreateArray, sizeof.TFLoopStackCell
        mov     [edi+TForthContext.pLStack], eax

        mov     [edi+TForthContext.sizeWords], ForthInitWordsMemory
        stdcall GetMem, [edi+TForthContext.sizeWords]
        mov     [edi+TForthContext.pWords], eax

        mov     eax, edi
        pop     edi
        return
endp


proc ForthFreeContext, .forth_context
begin


        return
endp



ferrSyntaxError = 1
ferrUnknownWord = 2
ferrOutOfMemory = 3
ferrInvalidNumber = 4
ferrInvalidString = 5
ferrMissingBracket = 6

ferrMaxError = 6

dmsgEndWithoutBegin db  'Syntax error', 0
dmsgUnknownWord     db  'Unknown word', 0
dmsgOutOfMemory     db  'Out of memory', 0
dmsgInvalidNumber   db  'Invalid number', 0
dmsgInvalidString   db  'Invalid string', 0
dmsgMissingBracket  db  'Missing ")"', 0
dmsgUnknownError    db  'Unknown error. Probably bug.', 0



ForthErrorMessages  dd  0
                    dd dmsgEndWithoutBegin
                    dd dmsgUnknownWord
                    dd dmsgOutOfMemory
                    dd dmsgInvalidNumber
                    dd dmsgInvalidString
                    dd dmsgMissingBracket
; this should be last.
                    dd dmsgUnknownError


proc GetForthErrorMsg, .errcode
begin
        mov     eax, [.errcode]
        cmp     eax, ferrMaxError
        jbe     @f
        mov     eax, ferrMaxError+1
@@:
        mov     eax, [ForthErrorMessages+4*eax]
        return
endp



proc ForthExecScript, .pcontext, .psource
.word     rb 16
.newword  rb 16
.entry    dd ?  ; the entry point of the currently compiled word.
.ofs_error dd ?
.sign      dd ?
begin
        push    ebx ecx esi edi

        mov     ebx, [.pcontext]
        mov     esi, [.psource]

.script_loop:

        xor     eax, eax
        mov     dword [.word], eax
        mov     dword [.word+4], eax
        mov     dword [.word+8], eax
        mov     dword [.word+12], eax
        xor     ecx, ecx

        dec     esi

.start_scan:

        inc     esi
        mov     al, [esi]

; offset for the error message, if any
        mov     edx, esi
        sub     edx, [.psource]
        mov     [.ofs_error], edx

        test    al, al
        jz      .end_of_script

        cmp     al, '+'
        je      .maybe_number
        cmp     al, '-'
        je      .maybe_number

        cmp     al, '0'
        jb      .nan
        cmp     al, '9'
        jbe     .extract_number

.nan:
        cmp     al, '"'
        je      .extract_string
        cmp     al, "'"
        je      .extract_string

        cmp     al, ' '
        jbe     .start_scan

        cmp     al, ':'
        jne     @f

        test    [ebx+TForthContext.Status], forthCompileMode
        jnz     .syntax_error

        or      [ebx+TForthContext.Status], forthCompileMode or forthNextNewName
        mov     eax, [ebx+TForthContext.iWords]
        mov     [.entry], eax
        jmp     .start_scan

@@:
        cmp     al, ';'
        jne     @f

        test    [ebx+TForthContext.Status], forthCompileMode
        jz      .syntax_error

; finalize the compilation of a word.

        mov     eax, sizeof.TFWordFooter+1
        call    .allocate_bytes
        jc      .err_out_of_memory

        sub     eax, sizeof.TFWordFooter
        mov     byte [eax+edx-1], $c3   ; retn

        pushd   dword [.newword] dword [.newword+4] dword [.newword+8] dword [.newword+12]
        popd    [eax+edx+12] [eax+edx+8] [eax+edx+4] [eax+edx]

        push    [.entry]
        pop     [eax+edx+TFWordFooter.entry]

        push    [ebx+TForthContext.iWords]
        pop     [ebx+TForthContext.iLastWord]

        and    [ebx+TForthContext.Status], not forthCompileMode

        jmp     .start_scan

@@:
        cmp     al, '('
        jne     @f

; comment ()
.comment_loop:
        inc     esi
        mov     al, [esi]
        test    al, al
        jz      .err_missing_bracket

        cmp     al, ')'
        jne     .comment_loop
        inc     esi
        jmp     .script_loop

@@:
        cmp     al, '\'
        jne     .extract_word

; one line comment
.comment_loop2:
        inc     esi
        mov     al, [esi]
        cmp     al, ' '
        jae     .comment_loop2
        jmp     .script_loop

.extract_word:
        mov     [.word+ecx], al
        inc     ecx
        and     ecx, $0f
        inc     esi
        mov     al, [esi]
        cmp     al, ' '
        ja      .extract_word

;.word_ok:
        test    [ebx+TForthContext.Status], forthNextNewName
        jz      .process_word

; copy the word as a new word name to be placed at the end of the word definition.
        mov     eax, dword [.word]
        mov     ecx, dword [.word+4]
        mov     dword [.newword], eax
        mov     dword [.newword+4], ecx

        mov     eax, dword [.word+8]
        mov     ecx, dword [.word+12]
        mov     dword [.newword+8], eax
        mov     dword [.newword+12], ecx

        and     [ebx+TForthContext.Status], not forthNextNewName
        jmp     .script_loop


.process_word:
        call    .search_word    ; eax offset relative to [TForthContext.pWords]
        jc      .err_unknown_word

        test    [ebx+TForthContext.Status], forthCompileMode
        jnz     .compile_the_word

        push    esi

        mov     esi, [ebx+TForthContext.pUser]
        add     eax, [ebx+TForthContext.pWords]
        call    eax

        pop     esi
        jmp     .script_loop

.compile_the_word:
        mov     ecx, eax        ; offset of the word entry

        cmp     eax, [ebx+TForthContext.iWords]
        jb      .internal_call

;.external_call:
        add     ecx, [ebx+TForthContext.pWords]         ; absolute address

        mov     eax, 7
        call    .allocate_bytes
        jc      .err_out_of_memory

        mov     byte [edx+eax-7], $b8   ; mov eax, const
        mov     [edx+eax-6], ecx
        mov     word [edx+eax-2], $d0ff

        jmp     .script_loop


.internal_call:
        mov     eax, 5
        call    .allocate_bytes ; return new offset in eax and pointer to the memory block in edx
        jc      .err_out_of_memory

; relative call to the word entry point.
        sub     ecx, eax
        mov     byte [edx+eax-5], $e8    ; call instruction opcode.
        mov     [edx+eax-4], ecx

        jmp     .script_loop


.maybe_number:
        cmp     byte [esi+1], '0'
        jb      .extract_word
        cmp     byte [esi+1], '9'
        ja      .extract_word

.extract_number:
        xor     edx, edx
        movzx   eax, al

        mov     byte [.sign], al
        cmp     al, '-'
        je      .next
        cmp     al, '+'
        je      .next

.num_loop:
        cmp     al, ' '
        jbe     .number_ok

        cmp     al, '0'
        jb      .err_invalid_number
        cmp     al, '9'
        ja      .err_invalid_number

        sub     al, '0'
        imul    edx, 10
        add     edx, eax

.next:
        inc     esi
        mov     al, [esi]
        jmp     .num_loop

.number_ok:
        cmp     byte [.sign], '-'
        jne     @f
        neg     edx
@@:
        test    [ebx+TForthContext.Status], forthCompileMode
        jnz     .compile_number

        call    forth_push_number
        jmp     .script_loop


.compile_number: ; $b8 forth_push_number $ba number $ff $d0
        mov     ecx, edx

        mov     eax, 12
        call    .allocate_bytes
        jc      .err_out_of_memory

        mov     byte  [edx+eax-12], $b8   ; mov eax, const
        mov     dword [edx+eax-11], forth_push_number
        mov     byte  [edx+eax-7], $ba    ; mov edx, const
        mov     dword [edx+eax-6], ecx
        mov     word  [edx+eax-2], $d0ff

        jmp     .script_loop


.extract_string:
        mov     ah, al          ; end character.
        xor     ecx, ecx        ; length of the string
        lea     edi, [esi+1]

.str_loop:
        inc     esi
        mov     al, [esi]
        test    al, al
        jz      .err_invalid_string

        cmp     al, ah
        je      .string_ok

        inc     ecx
        jmp     .str_loop

.string_ok:
        mov     ecx, esi
        sub     ecx, edi

        inc     esi

        test    [ebx+TForthContext.Status], forthCompileMode
        jnz     .compile_string

        stdcall StrNew
        mov     edx, eax

        stdcall StrCopyPart, edx, edi, 0, ecx

        push    edx
        stdcall AddArrayItem, [ebx+TForthContext.pAStack]
        mov     [ebx+TForthContext.pAStack], edx
        mov     [eax+TFStackCell.type], ftypeStringFree
        pop     [eax+TFStackCell.value]

        jmp     .script_loop

.compile_string:
        push    esi
        mov     esi, edi
        mov     edi, [ebx+TForthContext.iWords]

        lea     eax, [ecx+1+17]
        stdcall .allocate_bytes
        jc      .err_out_of_memory

        lea     eax, [edi+17]
        add     edi, [ebx+TForthContext.pWords]

        mov     byte [edi], $ba                ; mov edx, offset of string
        mov     dword [edi+1], eax             ; offset of string
        mov     byte [edi+5], $b8              ; mov eax, forth_push_string
        mov     dword [edi+6], forth_push_string
        mov     word [edi+10], $d0ff           ; call eax
        lea     eax, [ecx+1]
        mov     byte [edi+12], $e9             ; jmp  end
        mov     dword [edi+13], eax            ;

        add     edi, 17

        rep movsb
        mov     al, 0
        stosb

        pop     esi
        jmp     .script_loop


.end_of_script:
        mov     ecx, [ebx+TForthContext.pAStack]
        mov     eax, [ecx+TArray.count]
        test    eax, eax
        jz      @f

        lea     eax, [ecx+TArray.array+8*eax-8]
        mov     eax, [eax+TFStackCell.value]
        dec     [ecx+TArray.count]

@@:
        clc
        jmp     .finish

; error handlers
.err_missing_bracket:
        mov     eax, ferrMissingBracket
        jmp     .error

.err_invalid_string:
        mov     eax, ferrInvalidString
        jmp     .error

.err_invalid_number:
        mov     eax, ferrInvalidNumber
        jmp     .error

.err_out_of_memory:
        mov     eax, ferrOutOfMemory
        jmp     .error

.err_unknown_word:
        mov     eax, ferrUnknownWord
        jmp     .error

.syntax_error:
        mov     eax, ferrSyntaxError

.error:
        mov     edx, [.ofs_error]
        stc

.finish:
        pop     edi esi ecx ebx
        return


; internal subroutines


; returns:
; CF=0 - word found.
; eax - offset of word entry point in pWords memory.
;
; CF=1 - word not found.
.search_word:
        push    edx esi

; search in the compiled words
        mov     edx, [ebx+TForthContext.pWords]
        mov     esi, [ebx+TForthContext.iLastWord]
        call    .search_list
        jnc     .word_found

; if not found, search in the user provided words, if any.
        mov     edx, [ebx+TForthContext.pUserWords]
        test    edx, edx
        jz      .check_std

        mov     esi, [ebx+TForthContext.iUserWords]
        call    .search_list
        jnc     .word_found

.check_std:
        mov     edx, ForthStandardLib
        mov     esi, ForthStandardLib.size
        call    .search_list
        jnc     .word_found

        stc
        pop     esi edx
        retn

.word_found:
        clc
        pop     esi edx
        retn



; arguments:
;   esi - offset of the end of the word area.
;   edx - pointer to the begin of the word area.
; returns:
;   CF=0; eax=offset of the word entry in the word area.
;   CF=1 - not found
.search_list:
        add     esi, edx

.search_loop:
        sub     esi, sizeof.TFWordFooter
        cmp     esi, edx
        jb      .notfound

        mov     eax, dword [esi+TFWordFooter.name]
        cmp     eax, dword [.word]
        jne     .prev_word

        mov     eax, dword [esi+TFWordFooter.name+4]
        cmp     eax, dword [.word+4]
        jne     .prev_word

        mov     eax, dword [esi+TFWordFooter.name+8]
        cmp     eax, dword [.word+8]
        jne     .prev_word

        mov     eax, dword [esi+TFWordFooter.name+12]
        cmp     eax, dword [.word+12]
        je      .found

.prev_word:
        mov     esi, [esi+TFWordFooter.entry]
        add     esi, edx
        jmp     .search_loop

.found:
        mov     eax, [esi+TFWordFooter.entry]
        add     eax, edx
        sub     eax, [ebx+TForthContext.pWords]         ; relatively to TForthContext.pWords
        clc
        retn

.notfound:
        stc
        retn


; argument: eax - count of bytes to allocate.
; returns:
;   eax - offset in pWords of the new end ( iWords )
;   edx - pointer of pWords memory.

.allocate_bytes:
        push    ecx

        mov     edx, [ebx+TForthContext.iWords]
        add     edx, eax
        cmp     edx, [ebx+TForthContext.sizeWords]
        jb      .sizeok

        mov     ecx, [ebx+TForthContext.sizeWords]
        call    [ResizeIt]
        mov     [ebx+TForthContext.sizeWords], ecx

        stdcall ResizeMem, [ebx+TForthContext.pWords], ecx
        jc      .end_alloc
        mov     [ebx+TForthContext.pWords], eax

.sizeok:
        mov     [ebx+TForthContext.iWords], edx
        mov     eax, edx
        mov     edx, [ebx+TForthContext.pWords]
        clc

.end_alloc:
        pop     ecx
        retn

endp

; arguments:
;    ebx - TForthContext
;    edx - number to be pushed
; returns
;
forth_push_number:
        push    edx
        stdcall AddArrayItem, [ebx+TForthContext.pAStack]
        mov     [ebx+TForthContext.pAStack], edx
        mov     [eax+TFStackCell.type], ftypeNumber
        pop     [eax+TFStackCell.value]
        retn


; arguments:
;    ebx - TForthContext
; returns
;    eax - value from the top of the stack
proc forth_pop_number
begin
        mov     edx, [ebx+TForthContext.pAStack]
        mov     eax, [edx+TArray.count]
        dec     eax
        js      .empty_stack

        push    eax

        imul    eax, [edx+TArray.itemsize]
        mov     eax, [edx+TArray.array+edx+TFStackCell.value]

        stdcall DeleteArrayItem, edx ; from the stack
        clc
        return

.empty_stack:
        xor     eax, eax
        stc
        return
endp



; arguments:
;    ebx - TForthContext
;    edx - offset to the string related to pWords memory.
; returns
;
proc forth_push_string
begin
        add     edx, [ebx+TForthContext.pWords]
        push    edx
        stdcall AddArrayItem, [ebx+TForthContext.pAStack]
        mov     [ebx+TForthContext.pAStack], edx
        mov     [eax+TFStackCell.type], ftypeString
        pop     [eax+TFStackCell.value]
        return
endp






endmodule





Added freshlib/_trash/SurplusSources/FreshEdit/forth_link.asm.



























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
iglobal
FreshEditKeyScript file 'keyboard.forth'
                   dd   0
endg



ForthBlock __FreshEditForthWords


forthword 'Left'
begin
        call    TFreshEdit.__FitCaretInWindow
        jz      @f

        stc
        return

@@:
        push    ecx

        mov     ecx, [esi+TFreshEdit._xCaret]
        jecxz   .exit

        dec     ecx
        mov     [esi+TFreshEdit._xCaret], ecx

        mov     ecx, [esi+TFreshEdit._LeftColumn]
        cmp     [esi+TFreshEdit._xCaret], ecx
        ja      .exit

        mov     ecx, [esi+TFreshEdit._cols]
        shr     ecx, 2
        test    ecx, ecx
        jnz     @f
        inc     ecx
@@:
        sub     [esi+TFreshEdit._LeftColumn], ecx
        jns     @f

        mov     [esi+TFreshEdit._LeftColumn], 0
@@:

.exit:
        clc
        pop     ecx
        return
endfw



forthword 'Right'
begin
        call    TFreshEdit.__FitCaretInWindow
        jz      @f

        stc
        return

@@:
        push    ecx edx

        mov     ecx, [esi+TFreshEdit._xCaret]
        inc     ecx
        mov     [esi+TFreshEdit._xCaret], ecx

        mov     edx, [esi+TFreshEdit._cols]
        add     edx, [esi+TFreshEdit._LeftColumn]
        cmp     ecx, edx
        jae     .scroll_left

.finish:
        clc
        pop     edx ecx
        return

.scroll_left:
        mov     ecx, [esi+TFreshEdit._cols]
        shr     ecx, 2
        test    ecx, ecx
        jnz     @f
        inc     ecx
@@:
        add     [esi+TFreshEdit._LeftColumn], ecx
        jmp     .finish
endfw



forthword 'Up'
begin
        call    TFreshEdit.__FitCaretInWindow
        jz      @f

        stc
        return

@@:
        push    ecx

        cmp     [esi+TFreshEdit._yCaret], 0
        je      .exit

        dec     [esi+TFreshEdit._yCaret]

        mov     ecx, [esi+TFreshEdit._TopLine]
        cmp     [esi+TFreshEdit._yCaret], ecx
        jl      .scrollup

.exit:
        clc
        pop     ecx
        return

.scrollup:
        mov     ecx, [esi+TFreshEdit._TopLine]
        jecxz   .exit
        dec     [esi+TFreshEdit._TopLine]
        jmp     .exit
endfw



TFreshEdit.__CommandScrollLockUp:
forthword 'ScrLockUp'
begin
        call    TFreshEdit.__FitCaretInWindow
        jz      @f

        stc
        return

@@:
        push    ecx

        cmp     [esi+TFreshEdit._yCaret], 0
        je      .exit

        dec     [esi+TFreshEdit._yCaret]

        mov     ecx, [esi+TFreshEdit._TopLine]
        jecxz   .exit

        dec     [esi+TFreshEdit._TopLine]

.exit:
        clc
        pop     ecx
        return
endfw



forthword 'ScrollUp'
begin
        push    ecx
        cmp     [esi+TFreshEdit._TopLine], 0
        je      .finish
        dec     [esi+TFreshEdit._TopLine]
.finish:
        clc
        pop     ecx
        return
endfw




TFreshEdit.__CommandDown:
forthword 'Down'
begin
        call    TFreshEdit.__FitCaretInWindow
        jz      @f

        stc
        return

@@:
        push    ecx edx

        mov     edx, [esi+TFreshEdit._pIndex]

        mov     ecx, [esi+TFreshEdit._yCaret]
        inc     ecx
        cmp     ecx, [edx+TArray.count]
        jae     .exit

        mov     [esi+TFreshEdit._yCaret], ecx

        mov     ecx, [esi+TFreshEdit._TopLine]
        add     ecx, [esi+TFreshEdit._rows]
        cmp     [esi+TFreshEdit._yCaret], ecx
        jae     .scrolldn

.exit:
        clc
        pop     edx ecx
        return

.scrolldn:
        mov     ecx, [esi+TFreshEdit._TopLine]
        inc     ecx
        cmp     ecx, [edx+TArray.count]
        jae     .exit

        mov     [esi+TFreshEdit._TopLine], ecx
        jmp     .exit
endfw




TFreshEdit.__CommandScrollLockDown:
forthword 'ScrLockDown'
begin
        call    TFreshEdit.__FitCaretInWindow
        jz      @f

        stc
        return

@@:
        push    ecx edx

        mov     edx, [esi+TFreshEdit._pIndex]

        mov     ecx, [esi+TFreshEdit._yCaret]
        inc     ecx
        cmp     ecx, [edx+TArray.count]
        jae     .exit

        mov     [esi+TFreshEdit._yCaret], ecx

        mov     ecx, [esi+TFreshEdit._TopLine]
        inc     ecx
        add     ecx, [esi+TFreshEdit._rows]
        cmp     ecx, [edx+TArray.count]
        ja      .exit

        inc     [esi+TFreshEdit._TopLine]

.exit:
        clc
        pop     edx ecx
        return

endfw



forthword 'ScrollDown'
begin
        push    ecx edx
        mov     edx, [esi+TFreshEdit._pIndex]

        mov     ecx, [esi+TFreshEdit._TopLine]
        inc     ecx
        add     ecx, [esi+TFreshEdit._rows]
        cmp     ecx, [edx+TArray.count]
        ja      .finish

        inc     [esi+TFreshEdit._TopLine]

.finish:
        clc
        pop     edx ecx
        return

endfw





forthword 'PgDown'
begin
        push    ecx
        mov     ecx, [esi+TFreshEdit._rows]

@@:
        call    TFreshEdit.__CommandScrollLockDown
        jc      .finish
        loop    @b

.finish:
        pop     ecx
        return
endfw



forthword 'PgUp'
begin
        push    ecx
        mov     ecx, [esi+TFreshEdit._rows]
@@:
        call    TFreshEdit.__CommandScrollLockUp
        jc      .finish
        loop    @b

.finish:
        pop     ecx
        return
endfw




forthword 'LineBegin'
begin
        call    TFreshEdit.__FitCaretInWindow
        jz      @f

        stc
        return

@@:
        cmp     [esi+TFreshEdit._xCaret], 0
        je      .end

        mov     [esi+TFreshEdit._xCaret], 0

        cmp     [esi+TFreshEdit._LeftColumn], 0
        je      .end

        mov     [esi+TFreshEdit._LeftColumn], 0

.end:
        clc
        return
endfw





forthword 'LineEnd'
begin
        call    TFreshEdit.__FitCaretInWindow
        jz      @f

        stc
        return

@@:
        push    ebx ecx

        mov     ecx, [esi+TFreshEdit._yCaret]
        mov     ebx, [esi+TFreshEdit._pIndex]

        cmp     ecx, [ebx+TArray.count]
        jae     .end

        mov     ecx, [ebx+TArray.array+4*ecx]

        shl     ecx, TEditorLine.shift
        add     ecx, [esi+TFreshEdit._pLines]
        add     ecx, TArray.array

        stdcall StrLenUtf8, [ecx+TEditorLine.Data], -1

        cmp     [esi+TFreshEdit._xCaret], eax
        je      .end

        mov     [esi+TFreshEdit._xCaret], eax

        mov     ecx, [esi+TFreshEdit._cols]
        lea     ecx, [ecx*3]
        shr     ecx, 2

        cmp     eax, [esi+TFreshEdit._LeftColumn]
        jg      .leftok

        sub     eax, ecx
        jns     @f
        xor     eax, eax
@@:
        mov     [esi+TFreshEdit._LeftColumn], eax
        jmp     .end

.leftok:
        add     ecx, [esi+TFreshEdit._LeftColumn]
        sub     ecx, [esi+TFreshEdit._xCaret]
        jge     .end

        sub     [esi+TFreshEdit._LeftColumn], ecx

.end:
        clc
        pop     ecx ebx
        return
endfw



TFreshEdit.__CommandBeginOfScreen:
forthword 'ScreenBegin'
begin
        call    TFreshEdit.__FitCaretInWindow
        jz      @f

        stc
        return

@@:
        mov     eax, [esi+TFreshEdit._TopLine]
        cmp     eax, [esi+TFreshEdit._yCaret]
        je      .end

        mov     [esi+TFreshEdit._yCaret], eax
.end:
        return
endfw


forthword 'ScreenEnd'
begin
        call    TFreshEdit.__FitCaretInWindow
        jz      @f

        stc
        return

@@:
        call    TFreshEdit.__CommandBeginOfScreen

        mov     ecx, [esi+TFreshEdit._rows]
        jecxz   .end
        dec     ecx
        jecxz   .end

@@:
        call    TFreshEdit.__CommandDown
        jc      .end
        loop    @b

.end:
        return
endfw


forthword 'FileBegin'
begin

        return
endfw


forthword 'FileEnd'
begin

        return
endfw


forthword 'WordPrev'
begin

        return
endfw


forthword 'WordNext'
begin

        return
endfw



forthword 'GetSelMode'
begin

        return
endfw



forthword 'SetSelMode'
begin

        return
endfw



forthword 'GetInsMode'
begin

        return
endfw


forthword 'SetInsMode'
begin

        return
endfw


forthword 'GetRowCount'
begin

        return
endfw



forthword 'ToggleSelMode'
begin
        mov     eax, [esi+TFreshEdit._SelMode]
        inc     eax
        cmp     eax, 2
        jbe     @f
        xor     eax, eax
@@:
        mov     [esi+TFreshEdit._SelMode], eax
        return
endfw



EndForthBlock

;_________________________________________________________________________________________

Added freshlib/_trash/SurplusSources/FreshEdit/keyboard.forth.

































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
( This file contains ForthScript definitions for navigation and control keys in FreshEdit.
  The name of the words is actually the name of the pressed key, as returned by CreateKeyName procedure
  defined in the library SysEvents.asm
  The words can return a value through the stack top value. It is
  1 - means the
)

: keyUp Up 0 ;
: keyShift+Up Up 1 ;

: keyDown Down 0 ;
: keyShift+Down Down 1 ;

: keyLeft Left 0 ;
: keyShift+Left Left 1 ;

: keyRight Right 0 ;
: keyShift+Right Right 1 ;

: keyPgUp PgUp 0 ;
: keyShift+PgUp PgUp 1 ;

: keyPgDn PgDown 0 ;
: keyShift+PgDn PgDown 1 ;

: keyHome LineBegin 0 ;
: keyShift+Home LineBegin 1 ;

: keyEnd LineEnd 0 ;
: keyShift+End LineEnd 1 ;

: keyCtrl+Alt+Ins ToggleSelMode 1 ;

Added freshlib/_trash/SurplusSources/command_tables.asm.

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
; This file is not needed anymore, but it contains very tiny implementation of Forth-like script engine.
; maybe it worths to keep it some time......

__ScriptEngine:

struct TCommandItem
  .name dd ?
  .proc dd ?
ends

macro CommandList lbl, [name, proc] {
common
  label lbl dword
forward
  local len
  dd name, proc
common
  dd 0
}


CommandList  ScriptCommands,                     \
  'l' ,   TFreshEdit.__CommandLeft,              \       ; left
  'r' ,   TFreshEdit.__CommandRight,             \       ; right
  'u' ,   TFreshEdit.__CommandUp,                \       ; up
  'd' ,   TFreshEdit.__CommandDown,              \       ; down
  'ul',   TFreshEdit.__CommandScrollLockUp,      \       ; up scroll lock
  'dl',   TFreshEdit.__CommandScrollLockDown,    \       ; down scroll lock
  'su',   TFreshEdit.__CommandScrollUp,          \       ; scroll up
  'sd',   TFreshEdit.__CommandScrollDown,        \       ; scroll down
  'pu',   TFreshEdit.__CommandPgUp,              \       ; page up
  'pd',   TFreshEdit.__CommandPgDown,            \       ; page down
  'lb',   TFreshEdit.__CommandHome,              \       ; line begin
  'le',   TFreshEdit.__CommandEnd,               \       ; line end
  'sb',   TFreshEdit.__CommandBeginOfScreen,     \       ; begin of screen
  'se',   TFreshEdit.__CommandEndOfScreen,       \       ;
  'fb',   TFreshEdit.__CommandFileBegin,         \       ; file begin
  'fe',   TFreshEdit.__CommandFileEnd,           \       ; file end
  'wp',   TFreshEdit.__CommandWordPrev,          \       ; word previous
  'wn',   TFreshEdit.__CommandWordNext,          \       ; word next
  'gsm',  TFreshEdit.__CommandGetSelectionMode,  \       ; get selection mode (0..2)
  'ssm',  TFreshEdit.__CommandSetSelectionMode,  \       ; set selection mode (0..2)
  'gim',  TFreshEdit.__CommandGetInsertMode,     \       ; get insert mode.
  'sim',  TFreshEdit.__CommandSetInsertMode,     \       ; set insert mode.
  'grc',  TFreshEdit.__CommandGetRowCount,       \       ; get row count.
\
\ ; Aritmerics
\
  '+',    __ScriptPlus,                          \
  '-',    __ScriptMinus,                         \
  '*',    __ScriptMul,                           \
  '/',    __ScriptDiv,                           \
  '%',    __ScriptMod,                           \
  'neg',  __ScriptNeg,                           \
\
\ ; Output
\
  '.',    __ScriptOutNumber,                     \
  '?',    __ScriptOutString,                     \
\
\ ; Stack operations and variables
\
  'swap', __ScriptSwap,                          \
  'pop',  __ScriptPop,                           \
  '->',   ExecScript.__assign,                   \
\
\ ; word logic
\
  'and',  __ScriptAnd,                           \
  'or',   __ScriptOr,                            \
  'xor',  __ScriptXor,                           \
  'not',  __ScriptNot,                           \
\
\ ; Loop
\
  'rep',  __ScriptRepeat,                        \
  'loop', __ScriptLoop,                          \
\
\ ; conditional
\
  'if',   ExecScript.__if,                       \
  'else', ExecScript.__else,                     \
  'then', ExecScript.__then




macro KeyScripts [scancode, modkeys, script] {
forward
local ptrscr
  dd scancode, modkeys
  if script eqtype 'A'
    dd ptrscr
  else
    dd script
  end if
common
  dd 0
forward
  if script eqtype 'A'
    ptrscr db script, 0
    align 4
  end if
}

struc script text {
  db text, 0
  align 4
}


KeyScripts                                     \
  keyUp,         0,        scrUp,      \
  keyUpNumpad,   0,        scrUp,      \
  keyDown,       0,        scrDown,    \
  keyDownNumpad, 0,        scrDown,    \
  keyLeft,       0,        scrLeft,    \
  keyLeftNumpad, 0,        scrLeft,    \
  keyRight,      0,        scrRight,   \
  keyRightNumpad,0,        scrRight,   \
  keyPgUp,       0,        scrPgUp,    \
  keyPgUpNumpad, 0,        scrPgUp,    \
  keyPgDown,     0,        scrPgDn,    \
  keyPgDnNumpad, 0,        scrPgDn,    \
  keyHome,       0,        scrHome,    \
  keyHomeNumpad, 0,        scrHome,    \
  keyEnd,        0,        scrEnd,     \
  keyEndNumpad,  0,        scrEnd,     \
  keyPgDown,     maskCtrl, scrEndOfFile,        \
  keyPgDnNumpad, maskCtrl, scrEndOfFile,        \
  keyPgUp,       maskCtrl, scrBegOfFile,        \
  keyPgUpNumpad, maskCtrl, scrBegOfFile,        \
  keyHome,       maskCtrl, scrBegOfScreen,      \
  keyHomeNumpad, maskCtrl, scrBegOfScreen,      \
  keyEnd,        maskCtrl, scrEndOfScreen,      \
  keyEndNumpad,  maskCtrl, scrEndOfScreen,      \
  keyInsert,     0,        scrToggleInsMode,    \
  keyInsNumpad,  0,        scrToggleInsMode,    \
  keyInsert,     maskAlt,  scrToggleSelectionMode


scrUp                   script 'u'
scrDown                 script 'd'
scrLeft                 script 'l'
scrRight                script 'r'
scrPgUp                 script 'pu'
scrPgDn                 script 'pd'
scrHome                 script 'lb'
scrEnd                  script 'le'
scrEndOfFile            script 'fe'
scrBegOfFile            script 'fb'
scrBegOfScreen          script 'sb'
scrEndOfScreen          script 'se'
scrToggleInsMode        script 'gim 1 xor sim'
scrToggleSelectionMode  script 'gsm 1 + 3 % ssm'




proc ExecScript, .editor, .pScript

.stack     rd 16

.pvar      dd ?
.fassign   dd ?

.changes dd ?

.errInvalidCommand = -1
.errInvalidNumber  = -2
.errStackOverflow  = -3
.errMissingQuote   = -4
.errInvalidVar     = -5
.errIfThenElse     = -6


begin
        push    ebx ecx edx esi edi

        stdcall GetMem, 65536
        mov     [.pvar], eax

        mov     ecx, 16
        lea     edi, [.stack]
        xor     eax, eax
        rep stosd

        mov     [.changes], eax
        mov     [.fassign], eax
        mov     edi, 15          ; intex to the stack bottom
        mov     esi, [.pScript]

.scriptloop:
        xor     ebx, ebx
        xor     ecx, ecx
        xor     eax, eax

.wordloop:
        movzx   eax, byte [esi]

        cmp     al, ' '
        jbe     .endofword

        cmp     al, '@'
        je      .variable

        cmp     al, "'"
        je      .string

        cmp     al, '"'
        je      .string

        cmp     al, '0'
        jb      .word
        cmp     al, '9'
        jbe     .digit

.word:
        inc     esi
        shl     eax, cl
        or      ebx, eax        ; command
        add     cl, 8
        cmp     cl, 32
        jbe     .wordloop
        jmp     .invalid_command


.variable:
        test    ecx, ecx
        jnz     .invalid_command

        mov     eax, $811C9DC5                  ; 2166136261              ; FNV offset basis

.hashloop:
        inc     esi

        movzx   edx, byte [esi]

        cmp     edx, ' '
        jbe     .endofvar

        xor     eax, edx
        imul    eax, $01000193                  ;   16777619              ; FNV prime
        jmp     .hashloop

.endofvar:
        mov     ebx, eax
        and     eax, $ffff
        shr     ebx, 16
        xor     ebx, eax
        and     ebx, $fffc
        add     ebx, [.pvar]

        cmp     [.fassign], 0
        je      .pushvar
; pop var
        mov     [.fassign], 0
        cmp     edi, 15
        jae     .stack_overflow

        inc     edi
        mov     eax, [.stack+4*edi]
        mov     [ebx], eax
        jmp     .nextchar

.pushvar:
        test    edi, edi
        js      .stack_overflow

        mov     eax, [ebx]
        mov     [.stack+4*edi], eax
        dec     edi
        jmp     .nextchar

.string:
        test    ecx, ecx
        jnz     .invalid_command

        inc     esi
        mov     ebx, esi

        xor     ecx, ecx

.lenloop:
        cmp     byte [esi], 0
        je      .missing_quote

        cmp     byte [esi], al
        je      .endofstring

        inc     esi
        inc     ecx
        jmp     .lenloop

.endofstring:
        test    edi, edi
        js      .stack_overflow

        stdcall StrNew
        mov     [.stack+4*edi], eax
        stdcall StrCopyPart, eax, ebx, 0, ecx
        stdcall StrPtr, eax

        dec     edi
        inc     esi
        jmp     .scriptloop

.digit:
        test    ecx, ecx
        jnz     .invalid_command

.numberloop:
        mov     al, [esi]
        cmp     al, ' '
        jbe     .endofnumber
        inc     esi

        cmp     al, '0'
        jb      .invalid_number
        cmp     al, '9'
        ja      .invalid_number

        and     eax, $0f
        imul    ebx, 10
        add     ebx, eax
        jmp     .numberloop

.endofnumber:
        test    edi, edi
        js      .stack_overflow

        mov     [.stack+4*edi], ebx
        dec     edi

        test    eax, eax
        jz      .endofscript

        inc     esi
        jmp     .scriptloop


.endofword:
        jecxz   .nextchar
        mov     eax, ScriptCommands - sizeof.TCommandItem

.search_command:
        add     eax, sizeof.TCommandItem

        cmp     dword [eax], 0
        je      .invalid_command

        cmp     [eax], ebx
        jne     .search_command

;.found:
        push    esi
        lea     ebx, [.stack]
        mov     esi, [.editor]
        call    [eax+TCommandItem.proc]
        pop     esi

        jc      .stack_overflow
        or      [.changes], eax

        cmp     edi, 15
        ja      .stack_overflow

.nextchar:
        inc     esi
        cmp     byte [esi-1], 0
        jne     .scriptloop

.endofscript:
        clc
        mov     eax, [.changes]

.finish:
        stdcall FreeMem, [.pvar]
        pop     edi esi edx ecx ebx
        return

; Context dependent control commands

; "->" (assign) command
.__assign:
        mov     [.fassign], 1
        xor     eax, eax
        clc
        retn

.__if:
        cmp     edi, 15
        jae     .ifok

        inc     edi
        cmp     [.stack+4*edi], 0
        jne     .ifok

; search for else of then
        mov     eax, [esp+4]    ; stored pointer to the script text
        xor     ecx, ecx

.ifloop:
        inc     eax
        mov     edx, [eax]
        cmp     edx, 'else'
        je      .else
        cmp     edx, 'then'
        je      .then
        test    edx, $ff000000
        jz      .iferror

        and     edx, $ffff
        cmp     edx, 'if'
        jne     .ifloop

        inc     ecx
        jmp     .ifloop

.else:
        jecxz   .elsehere
        dec     ecx
        jmp     .ifloop

.elsehere:
        add     eax, 4
        cmp     byte [eax], ' '
        ja      .iferror

        mov     [esp+4], eax
        jmp     .ifok

.then:
        jecxz   .thenhere
        dec     ecx
        jmp     .ifloop

.thenhere:
        add     eax, 4
        cmp     byte [eax], ' '
        ja      .iferror
        mov     [esp+4], eax

.ifok:
        xor     eax, eax
        clc
        retn

.iferror:
        stc
        mov     eax, .errIfThenElse
        retn


.__else:
; search for "then"
        mov     eax, [esp+4]    ; stored pointer to the script text
        xor     ecx, ecx

.elseloop:
        inc     eax
        mov     edx, [eax]
        cmp     edx, 'else'
        je      .else2
        cmp     edx, 'then'
        je      .then2
        test    edx, $ff000000
        jz      .iferror

        and     edx, $ffff
        cmp     edx, 'if'
        jne     .elseloop

        inc     ecx
        jmp     .elseloop

.else2:
        jecxz   .iferror
        dec     ecx
        jmp     .elseloop

.then2:
        jecxz   .thenhere2
        dec     ecx
        jmp     .elseloop

.thenhere2:
        add     eax, 4
        cmp     byte [eax], ' '
        ja      .iferror
        mov     [esp+4], eax
        jmp     .ifok

.__then:
        xor     eax, eax
        clc
        retn


; errors

.invalid_command:
        stc
        mov     eax, .errInvalidCommand
        jmp     .finish

.invalid_number:
        stc
        mov     eax, .errInvalidNumber
        jmp     .finish

.stack_overflow:
        stc
        mov     eax, .errStackOverflow
        jmp     .finish

.missing_quote:
        stc
        mov     eax, .errMissingQuote
        jmp     .finish

endp


call    ExecScript



proc __ScriptPlus
begin
        cmp     edi, 14
        jae     .end

        mov     eax, [ebx+4*edi+4]
        inc     edi
        add     [ebx+4*edi+4], eax

.end:
        xor     eax, eax
        return
endp



proc __ScriptMinus
begin
        cmp     edi, 14
        jae     .end

        mov     eax, [ebx+4*edi+4]
        inc     edi
        sub     [ebx+4*edi+4], eax

.end:
        xor     eax, eax
        clc
        return
endp



proc __ScriptMul
begin
        cmp     edi, 14
        jae     .end

        mov     eax, [ebx+4*edi+4]
        inc     edi
        imul    eax, [ebx+4*edi+4]
        mov     [ebx+4*edi+4], eax
.end:
        xor     eax, eax
        clc
        return
endp



proc __ScriptDiv
begin
        cmp     edi, 14
        jae     .end

        cmp     dword [ebx+4*edi+4], 0
        je      .err

        inc     edi
        mov     eax, [ebx+4*edi+4]
        cdq
        div     dword [ebx+4*edi]
        mov     [ebx+4*edi+4], eax

.end:
        xor     eax, eax
        clc
        return

.err:
        stc
        return
endp




proc __ScriptMod
begin
        cmp     edi, 14
        jae     .end

        cmp     dword [ebx+4*edi+4], 0
        je      .err

        inc     edi
        mov     eax, [ebx+4*edi+4]
        cdq
        div     dword [ebx+4*edi]
        mov     [ebx+4*edi+4], edx

.end:
        xor     eax, eax
        clc
        return

.err:
        stc
        return
endp



proc __ScriptOutNumber
begin
        cmp     edi, 15
        jae     .end

        inc     edi
        mov     eax, [ebx+4*edi]

        stdcall NumToStr, eax, ntsSigned or ntsDec
        push    eax

        stdcall StrPtr, eax
        stdcall Output, eax
        stdcall StrDel ; from the stack.

.end:
        xor     eax, eax
        clc
        return
endp


proc __ScriptOutString
begin
        cmp     edi, 15
        jae     .end

        inc     edi
        cmp     dword [ebx+4*edi], 0
        je      .crlf

        stdcall StrPtr, [ebx+4*edi]
        stdcall Output, eax
        stdcall StrDel, [ebx+4*edi]

.end:
        xor     eax, eax
        clc
        return

.crlf:
        stdcall Output, .scrlf
        jmp     .end

.scrlf db 13, 10, 0

endp



proc __ScriptSwap
begin
        cmp     edi, 14
        jae     .end

        pushd   [ebx+4*edi+4]
        pushd   [ebx+4*edi+8]
        popd    [ebx+4*edi+4]
        popd    [ebx+4*edi+8]

.end:
        xor     eax, eax
        clc
        return
endp


proc __ScriptPop
begin
        cmp     edi, 15
        jae     .end

        inc     edi
.end:
        xor     eax, eax
        clc
        return
endp



proc __ScriptAnd
begin
        cmp     edi, 14
        jae     .end

        mov     eax, [ebx+4*edi+4]
        inc     edi
        and     [ebx+4*edi+4], eax

.end:
        xor     eax, eax
        clc
        return
endp


proc __ScriptOr
begin
        cmp     edi, 14
        jae     .end

        mov     eax, [ebx+4*edi+4]
        inc     edi
        or      [ebx+4*edi+4], eax

.end:
        xor     eax, eax
        clc
        return
endp


proc __ScriptXor
begin
        cmp     edi, 14
        jae     .end

        mov     eax, [ebx+4*edi+4]
        inc     edi
        xor     [ebx+4*edi+4], eax

.end:
        xor     eax, eax
        clc
        return
endp




proc __ScriptNot
begin
        cmp     edi, 15
        jae     .end

        not     dword [ebx+4*edi+4]

.end:
        xor     eax, eax
        clc
        return
endp



proc __ScriptNeg
begin
        cmp     edi, 15
        jae     .end

        neg     dword [ebx+4*edi+4]

.end:
        xor     eax, eax
        clc
        return
endp



proc __ScriptRepeat
begin
        cmp     edi, 14
        jae     .end


.end:
        xor     eax, eax
        clc
        return
endp


proc __ScriptLoop
begin
        cmp     edi, 14
        jae     .end

.end:
        xor     eax, eax
        clc
        return
endp







DispSize 'Script engine', $ - __ScriptEngine

Deleted freshlib/compiler/Linux/executable.inc.

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
TargetOS equ Linux

macro _BinaryType type {
  if type eq GUI
    format ELF executable 3
    entry start
  end if

  if type eq console
    format ELF executable 3
    entry start
  end if

  if type eq DLL
    format ELF executable  ; is it correct???
  end if
}

macro _CodeSection {
segment readable executable
}

macro _DataSection {
segment readable writeable
}

macro _ImportSection {
segment interpreter readable
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































Deleted freshlib/compiler/Win32/executable.inc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TargetOS equ Win32

macro _BinaryType type {
    format PE type 4.0
    entry start
}

macro _CodeSection {
  section '.code' code readable writeable executable
}


macro _DataSection {
  section '.data' data readable writeable
}

macro _ImportSection {
  section '.idata' import readable
}

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































Deleted freshlib/compiler/executable.inc.

1
include '%TargetOS%/executable.inc'
<


Added freshlib/data/Dummy/utf8.asm.

Added freshlib/data/KolibriOS/random.asm.

















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS dependent part of different random number generators.
;
;  Target OS: Linux
;
;  Dependencies: memory.asm
;
;  Notes:
;
;_________________________________________________________________________________________




body GetRandomBytes
begin
        return
endp


Added freshlib/data/KolibriOS/utf8.asm.















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
proc WideCharToUtf8, .ptrWideChar
begin
        push    edx esi edi

        mov     esi, [.ptrWideChar]
        stdcall StrNew
        mov     edi, eax

.loop:
        stdcall DecodeUtf16, [esi]
        test    eax, eax
        jz      .end_string

        stdcall EncodeUtf8, eax

        stdcall StrCharCat, edi, eax
        jmp     .loop

.end_string:
        mov     eax, edi
        pop     edi esi edx
        return
endp

Added freshlib/data/Linux/random.asm.













































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS dependent part of different random number generators.
;
;  Target OS: Linux
;
;  Dependencies: memory.asm
;
;  Notes:
;
;_________________________________________________________________________________________




body GetRandomBytes
begin
        pushad

        stdcall GetMem, [.count]
        mov     esi, eax
        mov     edi, eax


        mov     eax, sys_open
        mov     ebx, cRandomFile
        mov     ecx, O_RDONLY
        int     $80
        test    eax, eax
        js      .error

        mov     ebx, eax

.loop:
        mov     eax, sys_read
        mov     ecx, esi
        mov     edx, [.count]
        int     $80
        test    eax, eax
        js      .error2

        add     esi, eax
        sub     [.count], eax
        jnz     .loop

        mov     eax, sys_close
        int     $80

        clc
        mov     [esp+4*regEAX], edi
        clc
        popad
        return

.error2:
        mov     eax, sys_close
        int     $80

.error:
        stdcall FreeMem, edi
        stc
        popad
        return
endp


cRandomFile  text "/dev/urandom"        ; we will use /dev/urandom, because don't want to block.

Added freshlib/data/Linux/utf8.asm.

Deleted freshlib/data/ToBeRemoved/StrLibOS.asm.

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
;*******************************************************************************
; Get the text of the [Control] using WM_GETTEXT and put it to the string with
; handle (only) in [string].
;
; if [string] = NULL creates new string and returns the handle.
; if [string] <> NULL just copyes the text.
;*******************************************************************************
proc GetControlText, .Control, .string
.len dd ?
begin
        push    ebx ecx edx

        mov     eax, [.string]
        test    eax,eax
        jnz     @f
        stdcall StrNew
@@:
        mov     ebx, eax

        invoke  SendMessage, [.Control], WM_GETTEXTLENGTH, 0, 0
        mov     [.len], eax
        stdcall StrSetCapacity, ebx, eax
        jc      .error

        push    eax
        add     [.len], 1
        invoke  SendMessage, [.Control], WM_GETTEXT, [.len], eax
        pop     ecx
        mov     [ecx+string.len], eax
        mov     eax, ebx
        clc

.error:
        pop     edx ecx ebx
        return
endp





;*******************************************************************************
; Sets the text in control using WM_SETTEXT from string with handle or pointer
; in [string].
;*******************************************************************************
proc SetControlText, .Control, .string
begin
        push    eax ecx edx
        stdcall StrPtr, [.string]
        invoke  SendMessage, [.Control], WM_SETTEXT, 0, eax
        pop     edx ecx eax
        return
endp
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































Added freshlib/data/Win32/random.asm.





































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS dependent part of different random number generators.
;
;  Target OS: Win32
;
;  Dependencies: memory.asm
;
;  Notes:
;
;_________________________________________________________________________________________

uses advapi32


; Provider Types
PROV_RSA_FULL             = 1
PROV_RSA_SIG              = 2
PROV_DSS                  = 3
PROV_FORTEZZA             = 4
PROV_MS_EXCHANGE          = 5
PROV_SSL                  = 6
PROV_RSA_SCHANNEL         = 12
PROV_DSS_DH               = 13
PROV_EC_ECDSA_SIG         = 14
PROV_EC_ECNRA_SIG         = 15
PROV_EC_ECDSA_FULL        = 16
PROV_EC_ECNRA_FULL        = 17
PROV_DH_SCHANNEL          = 18
PROV_SPYRUS_LYNKS         = 20
PROV_RNG                  = 21
PROV_INTEL_SEC            = 22
PROV_REPLACE_OWF          = 23
PROV_RSA_AES              = 24


; CryptAcquireContext

CRYPT_VERIFYCONTEXT       = 0xF0000000
CRYPT_NEWKEYSET           = 0x00000008
CRYPT_DELETEKEYSET        = 0x00000010
CRYPT_MACHINE_KEYSET      = 0x00000020
CRYPT_SILENT              = 0x00000040




body GetRandomBytes
.prov dd ?
begin
        pushad

        stdcall GetMem, [.count]
        mov     esi, eax

        lea     eax, [.prov]
        invoke  CryptAcquireContextW, eax, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT or CRYPT_SILENT
        test    eax, eax
        jz      .error

        invoke  CryptGenRandom, [.prov], [.count], esi
        test    eax, eax
        jz      .error2

        invoke  CryptReleaseContext, [.prov], 0

        clc
        mov     [esp+4*regEAX], esi
        popad
        return

.error2:
        invoke  CryptReleaseContext, [.prov], 0

.error:
        stc
        popad
        return
endp

Added freshlib/data/Win32/utf8.asm.

















































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Library for converting UTF8 to and from WideChar
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


;-----------------------------------------------------------
; Returns:
;    eax - pointer to the widechar string.
;    ecx - length of the widechar string in characters.
;-----------------------------------------------------------
proc utf8ToWideChar, .hString
begin
        push    edx edi

        stdcall StrPtr, [.hString]
        invoke  MultiByteToWideChar, CP_UTF8, 0, eax, -1, 0, 0

        lea     edx, [2*eax+8]
        stdcall GetMem, edx
        mov     edi, eax

        stdcall StrPtr, [.hString]

        sar     edx, 1
        invoke  MultiByteToWideChar, CP_UTF8, 0, eax, -1, edi, edx
        mov     ecx, eax
        mov     eax, edi

        pop     edi edx
        return
endp




proc WideCharToUtf8, .ptrWideChar
begin
        push    ebx ecx edx edi
        invoke  WideCharToMultiByte, CP_UTF8, 0, [.ptrWideChar], -1, 0, 0, 0, 0
        test    eax, eax
        jz      .error

        lea     ebx, [eax+8]
        stdcall GetMem, ebx
        mov     edi, eax

        invoke  WideCharToMultiByte, CP_UTF8, 0, [.ptrWideChar], -1, edi, ebx, 0, 0
        test    eax, eax
        jz      .error

        stdcall StrDup, edi
        stdcall FreeMem, edi

        clc
.finish:
        pop     edi edx ecx ebx
        return

.error:
        stc
        jmp     .finish
endp

Added freshlib/data/_encodings/8859-1.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-10.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-11.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-13.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-14.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-15.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-16.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-2.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-3.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-4.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-5.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-6.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-7.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-8.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/8859-9.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP037.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP1006.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP1026.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP1250.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP1251.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP1252.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP1253.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP1254.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP1255.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP1256.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP1257.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP1258.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP424.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP437.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP500.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP737.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP775.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP850.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP852.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP855.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP856.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP857.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP860.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP861.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP862.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP863.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP864.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP865.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP866.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP869.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP874.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP875.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/CP932.tbl.



>
1
ýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿ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ÿ{ÿ|ÿ}ÿ~ÿÿ€ÿÿ‚ÿƒÿ„ÿ…ÿ†ÿ‡ÿˆÿ‰ÿŠÿ‹ÿŒÿÿŽÿÿÿ‘ÿ’ÿ“ÿ”ÿ•ÿ–ÿ—ÿ˜ÿ™ÿšÿ›ÿœÿÿžÿŸÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáà Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€

Added freshlib/data/_encodings/CP936.tbl.



>
1
¬ ýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿ€ÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚

Added freshlib/data/_encodings/CP949.tbl.



>
1
ýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€

Added freshlib/data/_encodings/KOI8-R.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/KOI8-U.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/KPS9566.tbl.



>
1
ýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€

Added freshlib/data/_encodings/NEXTSTEP.tbl.

cannot compute difference between binary files

Added freshlib/data/_encodings/_sources/8859-1.TXT.









































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# 8859-1.TXT
# Date: 2015-12-02 20:19:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO/IEC 8859-1:1998 to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             1999 July 27 (header updated: 2015 December 02)
#	Authors:          Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-1:1998 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-1 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-1 order.
#
#	Version history
#   1.0 version: updates 0.1 version by adding mappings for all
#       control characters.
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x00A1	#	INVERTED EXCLAMATION MARK
0xA2	0x00A2	#	CENT SIGN
0xA3	0x00A3	#	POUND SIGN
0xA4	0x00A4	#	CURRENCY SIGN
0xA5	0x00A5	#	YEN SIGN
0xA6	0x00A6	#	BROKEN BAR
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x00A8	#	DIAERESIS
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x00AA	#	FEMININE ORDINAL INDICATOR
0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#	NOT SIGN
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x00AE	#	REGISTERED SIGN
0xAF	0x00AF	#	MACRON
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x00B1	#	PLUS-MINUS SIGN
0xB2	0x00B2	#	SUPERSCRIPT TWO
0xB3	0x00B3	#	SUPERSCRIPT THREE
0xB4	0x00B4	#	ACUTE ACCENT
0xB5	0x00B5	#	MICRO SIGN
0xB6	0x00B6	#	PILCROW SIGN
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x00B8	#	CEDILLA
0xB9	0x00B9	#	SUPERSCRIPT ONE
0xBA	0x00BA	#	MASCULINE ORDINAL INDICATOR
0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#	VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
0xBE	0x00BE	#	VULGAR FRACTION THREE QUARTERS
0xBF	0x00BF	#	INVERTED QUESTION MARK
0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x00D0	#	LATIN CAPITAL LETTER ETH (Icelandic)
0xD1	0x00D1	#	LATIN CAPITAL LETTER N WITH TILDE
0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#	MULTIPLICATION SIGN
0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
0xDE	0x00DE	#	LATIN CAPITAL LETTER THORN (Icelandic)
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S (German)
0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#	LATIN SMALL LETTER AE
0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x00F0	#	LATIN SMALL LETTER ETH (Icelandic)
0xF1	0x00F1	#	LATIN SMALL LETTER N WITH TILDE
0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#	DIVISION SIGN
0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
0xFE	0x00FE	#	LATIN SMALL LETTER THORN (Icelandic)
0xFF	0x00FF	#	LATIN SMALL LETTER Y WITH DIAERESIS

Added freshlib/data/_encodings/_sources/8859-10.TXT.









































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# 8859-10.TXT
# Date: 2015-12-02 21:53:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO/IEC 8859-10:1998 to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             1999 October 11 (header updated: 2015 December 02)
#	Authors:          Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-10:1998 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-10 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-10 order.
#
#	Version history
#	1.0 version new.
#   1.1 corrected mistake in mapping of 0xA4
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
0xA2	0x0112	#	LATIN CAPITAL LETTER E WITH MACRON
0xA3	0x0122	#	LATIN CAPITAL LETTER G WITH CEDILLA
0xA4	0x012A	#	LATIN CAPITAL LETTER I WITH MACRON
0xA5	0x0128	#	LATIN CAPITAL LETTER I WITH TILDE
0xA6	0x0136	#	LATIN CAPITAL LETTER K WITH CEDILLA
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x013B	#	LATIN CAPITAL LETTER L WITH CEDILLA
0xA9	0x0110	#	LATIN CAPITAL LETTER D WITH STROKE
0xAA	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
0xAB	0x0166	#	LATIN CAPITAL LETTER T WITH STROKE
0xAC	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x016A	#	LATIN CAPITAL LETTER U WITH MACRON
0xAF	0x014A	#	LATIN CAPITAL LETTER ENG
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x0105	#	LATIN SMALL LETTER A WITH OGONEK
0xB2	0x0113	#	LATIN SMALL LETTER E WITH MACRON
0xB3	0x0123	#	LATIN SMALL LETTER G WITH CEDILLA
0xB4	0x012B	#	LATIN SMALL LETTER I WITH MACRON
0xB5	0x0129	#	LATIN SMALL LETTER I WITH TILDE
0xB6	0x0137	#	LATIN SMALL LETTER K WITH CEDILLA
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x013C	#	LATIN SMALL LETTER L WITH CEDILLA
0xB9	0x0111	#	LATIN SMALL LETTER D WITH STROKE
0xBA	0x0161	#	LATIN SMALL LETTER S WITH CARON
0xBB	0x0167	#	LATIN SMALL LETTER T WITH STROKE
0xBC	0x017E	#	LATIN SMALL LETTER Z WITH CARON
0xBD	0x2015	#	HORIZONTAL BAR
0xBE	0x016B	#	LATIN SMALL LETTER U WITH MACRON
0xBF	0x014B	#	LATIN SMALL LETTER ENG
0xC0	0x0100	#	LATIN CAPITAL LETTER A WITH MACRON
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
0xC7	0x012E	#	LATIN CAPITAL LETTER I WITH OGONEK
0xC8	0x010C	#	LATIN CAPITAL LETTER C WITH CARON
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x0118	#	LATIN CAPITAL LETTER E WITH OGONEK
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x0116	#	LATIN CAPITAL LETTER E WITH DOT ABOVE
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x00D0	#	LATIN CAPITAL LETTER ETH (Icelandic)
0xD1	0x0145	#	LATIN CAPITAL LETTER N WITH CEDILLA
0xD2	0x014C	#	LATIN CAPITAL LETTER O WITH MACRON
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x0168	#	LATIN CAPITAL LETTER U WITH TILDE
0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
0xD9	0x0172	#	LATIN CAPITAL LETTER U WITH OGONEK
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
0xDE	0x00DE	#	LATIN CAPITAL LETTER THORN (Icelandic)
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S (German)
0xE0	0x0101	#	LATIN SMALL LETTER A WITH MACRON
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#	LATIN SMALL LETTER AE
0xE7	0x012F	#	LATIN SMALL LETTER I WITH OGONEK
0xE8	0x010D	#	LATIN SMALL LETTER C WITH CARON
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x0119	#	LATIN SMALL LETTER E WITH OGONEK
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x0117	#	LATIN SMALL LETTER E WITH DOT ABOVE
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x00F0	#	LATIN SMALL LETTER ETH (Icelandic)
0xF1	0x0146	#	LATIN SMALL LETTER N WITH CEDILLA
0xF2	0x014D	#	LATIN SMALL LETTER O WITH MACRON
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x0169	#	LATIN SMALL LETTER U WITH TILDE
0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
0xF9	0x0173	#	LATIN SMALL LETTER U WITH OGONEK
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
0xFE	0x00FE	#	LATIN SMALL LETTER THORN (Icelandic)
0xFF	0x0138	#	LATIN SMALL LETTER KRA

Added freshlib/data/_encodings/_sources/8859-11.TXT.





























































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
# 8859-11.TXT
# Date: 2015-12-02 21:55:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO/IEC 8859-11:2001 to Unicode
#	Unicode version:  3.2
#	Table version:    2.0
#	Table format:     Format A
#	Date:             2002 October 7 (header updated: 2015 December 02)
#	Authors:          Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-11:2001 characters map into Unicode.
#
#	ISO/IEC 8859-11:2001 is equivalent to TIS 620-2533 (1990) with
#	the addition of 0xA0 NO-BREAK SPACE.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-11 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-11 order.
#
#	Version history:
#		2002 October 7  Created
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0E01	#	THAI CHARACTER KO KAI
0xA2	0x0E02	#	THAI CHARACTER KHO KHAI
0xA3	0x0E03	#	THAI CHARACTER KHO KHUAT
0xA4	0x0E04	#	THAI CHARACTER KHO KHWAI
0xA5	0x0E05	#	THAI CHARACTER KHO KHON
0xA6	0x0E06	#	THAI CHARACTER KHO RAKHANG
0xA7	0x0E07	#	THAI CHARACTER NGO NGU
0xA8	0x0E08	#	THAI CHARACTER CHO CHAN
0xA9	0x0E09	#	THAI CHARACTER CHO CHING
0xAA	0x0E0A	#	THAI CHARACTER CHO CHANG
0xAB	0x0E0B	#	THAI CHARACTER SO SO
0xAC	0x0E0C	#	THAI CHARACTER CHO CHOE
0xAD	0x0E0D	#	THAI CHARACTER YO YING
0xAE	0x0E0E	#	THAI CHARACTER DO CHADA
0xAF	0x0E0F	#	THAI CHARACTER TO PATAK
0xB0	0x0E10	#	THAI CHARACTER THO THAN
0xB1	0x0E11	#	THAI CHARACTER THO NANGMONTHO
0xB2	0x0E12	#	THAI CHARACTER THO PHUTHAO
0xB3	0x0E13	#	THAI CHARACTER NO NEN
0xB4	0x0E14	#	THAI CHARACTER DO DEK
0xB5	0x0E15	#	THAI CHARACTER TO TAO
0xB6	0x0E16	#	THAI CHARACTER THO THUNG
0xB7	0x0E17	#	THAI CHARACTER THO THAHAN
0xB8	0x0E18	#	THAI CHARACTER THO THONG
0xB9	0x0E19	#	THAI CHARACTER NO NU
0xBA	0x0E1A	#	THAI CHARACTER BO BAIMAI
0xBB	0x0E1B	#	THAI CHARACTER PO PLA
0xBC	0x0E1C	#	THAI CHARACTER PHO PHUNG
0xBD	0x0E1D	#	THAI CHARACTER FO FA
0xBE	0x0E1E	#	THAI CHARACTER PHO PHAN
0xBF	0x0E1F	#	THAI CHARACTER FO FAN
0xC0	0x0E20	#	THAI CHARACTER PHO SAMPHAO
0xC1	0x0E21	#	THAI CHARACTER MO MA
0xC2	0x0E22	#	THAI CHARACTER YO YAK
0xC3	0x0E23	#	THAI CHARACTER RO RUA
0xC4	0x0E24	#	THAI CHARACTER RU
0xC5	0x0E25	#	THAI CHARACTER LO LING
0xC6	0x0E26	#	THAI CHARACTER LU
0xC7	0x0E27	#	THAI CHARACTER WO WAEN
0xC8	0x0E28	#	THAI CHARACTER SO SALA
0xC9	0x0E29	#	THAI CHARACTER SO RUSI
0xCA	0x0E2A	#	THAI CHARACTER SO SUA
0xCB	0x0E2B	#	THAI CHARACTER HO HIP
0xCC	0x0E2C	#	THAI CHARACTER LO CHULA
0xCD	0x0E2D	#	THAI CHARACTER O ANG
0xCE	0x0E2E	#	THAI CHARACTER HO NOKHUK
0xCF	0x0E2F	#	THAI CHARACTER PAIYANNOI
0xD0	0x0E30	#	THAI CHARACTER SARA A
0xD1	0x0E31	#	THAI CHARACTER MAI HAN-AKAT
0xD2	0x0E32	#	THAI CHARACTER SARA AA
0xD3	0x0E33	#	THAI CHARACTER SARA AM
0xD4	0x0E34	#	THAI CHARACTER SARA I
0xD5	0x0E35	#	THAI CHARACTER SARA II
0xD6	0x0E36	#	THAI CHARACTER SARA UE
0xD7	0x0E37	#	THAI CHARACTER SARA UEE
0xD8	0x0E38	#	THAI CHARACTER SARA U
0xD9	0x0E39	#	THAI CHARACTER SARA UU
0xDA	0x0E3A	#	THAI CHARACTER PHINTHU
0xDF	0x0E3F	#	THAI CURRENCY SYMBOL BAHT
0xE0	0x0E40	#	THAI CHARACTER SARA E
0xE1	0x0E41	#	THAI CHARACTER SARA AE
0xE2	0x0E42	#	THAI CHARACTER SARA O
0xE3	0x0E43	#	THAI CHARACTER SARA AI MAIMUAN
0xE4	0x0E44	#	THAI CHARACTER SARA AI MAIMALAI
0xE5	0x0E45	#	THAI CHARACTER LAKKHANGYAO
0xE6	0x0E46	#	THAI CHARACTER MAIYAMOK
0xE7	0x0E47	#	THAI CHARACTER MAITAIKHU
0xE8	0x0E48	#	THAI CHARACTER MAI EK
0xE9	0x0E49	#	THAI CHARACTER MAI THO
0xEA	0x0E4A	#	THAI CHARACTER MAI TRI
0xEB	0x0E4B	#	THAI CHARACTER MAI CHATTAWA
0xEC	0x0E4C	#	THAI CHARACTER THANTHAKHAT
0xED	0x0E4D	#	THAI CHARACTER NIKHAHIT
0xEE	0x0E4E	#	THAI CHARACTER YAMAKKAN
0xEF	0x0E4F	#	THAI CHARACTER FONGMAN
0xF0	0x0E50	#	THAI DIGIT ZERO
0xF1	0x0E51	#	THAI DIGIT ONE
0xF2	0x0E52	#	THAI DIGIT TWO
0xF3	0x0E53	#	THAI DIGIT THREE
0xF4	0x0E54	#	THAI DIGIT FOUR
0xF5	0x0E55	#	THAI DIGIT FIVE
0xF6	0x0E56	#	THAI DIGIT SIX
0xF7	0x0E57	#	THAI DIGIT SEVEN
0xF8	0x0E58	#	THAI DIGIT EIGHT
0xF9	0x0E59	#	THAI DIGIT NINE
0xFA	0x0E5A	#	THAI CHARACTER ANGKHANKHU
0xFB	0x0E5B	#	THAI CHARACTER KHOMUT

Added freshlib/data/_encodings/_sources/8859-13.TXT.







































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# 8859-13.TXT
# Date: 2015-12-02 22:03:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO/IEC 8859-13:1998  to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             1999 July 27 (header updated: 2015 December 02)
#	Authors:          Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-13:1998 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-13 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-13 order.
#
#	Version history
#   1.0 version: created
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x201D	#	RIGHT DOUBLE QUOTATION MARK
0xA2	0x00A2	#	CENT SIGN
0xA3	0x00A3	#	POUND SIGN
0xA4	0x00A4	#	CURRENCY SIGN
0xA5	0x201E	#	DOUBLE LOW-9 QUOTATION MARK
0xA6	0x00A6	#	BROKEN BAR
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x0156	#	LATIN CAPITAL LETTER R WITH CEDILLA
0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#	NOT SIGN
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x00AE	#	REGISTERED SIGN
0xAF	0x00C6	#	LATIN CAPITAL LETTER AE
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x00B1	#	PLUS-MINUS SIGN
0xB2	0x00B2	#	SUPERSCRIPT TWO
0xB3	0x00B3	#	SUPERSCRIPT THREE
0xB4	0x201C	#	LEFT DOUBLE QUOTATION MARK
0xB5	0x00B5	#	MICRO SIGN
0xB6	0x00B6	#	PILCROW SIGN
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
0xB9	0x00B9	#	SUPERSCRIPT ONE
0xBA	0x0157	#	LATIN SMALL LETTER R WITH CEDILLA
0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#	VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
0xBE	0x00BE	#	VULGAR FRACTION THREE QUARTERS
0xBF	0x00E6	#	LATIN SMALL LETTER AE
0xC0	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
0xC1	0x012E	#	LATIN CAPITAL LETTER I WITH OGONEK
0xC2	0x0100	#	LATIN CAPITAL LETTER A WITH MACRON
0xC3	0x0106	#	LATIN CAPITAL LETTER C WITH ACUTE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x0118	#	LATIN CAPITAL LETTER E WITH OGONEK
0xC7	0x0112	#	LATIN CAPITAL LETTER E WITH MACRON
0xC8	0x010C	#	LATIN CAPITAL LETTER C WITH CARON
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x0179	#	LATIN CAPITAL LETTER Z WITH ACUTE
0xCB	0x0116	#	LATIN CAPITAL LETTER E WITH DOT ABOVE
0xCC	0x0122	#	LATIN CAPITAL LETTER G WITH CEDILLA
0xCD	0x0136	#	LATIN CAPITAL LETTER K WITH CEDILLA
0xCE	0x012A	#	LATIN CAPITAL LETTER I WITH MACRON
0xCF	0x013B	#	LATIN CAPITAL LETTER L WITH CEDILLA
0xD0	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
0xD1	0x0143	#	LATIN CAPITAL LETTER N WITH ACUTE
0xD2	0x0145	#	LATIN CAPITAL LETTER N WITH CEDILLA
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x014C	#	LATIN CAPITAL LETTER O WITH MACRON
0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#	MULTIPLICATION SIGN
0xD8	0x0172	#	LATIN CAPITAL LETTER U WITH OGONEK
0xD9	0x0141	#	LATIN CAPITAL LETTER L WITH STROKE
0xDA	0x015A	#	LATIN CAPITAL LETTER S WITH ACUTE
0xDB	0x016A	#	LATIN CAPITAL LETTER U WITH MACRON
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x017B	#	LATIN CAPITAL LETTER Z WITH DOT ABOVE
0xDE	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S (German)
0xE0	0x0105	#	LATIN SMALL LETTER A WITH OGONEK
0xE1	0x012F	#	LATIN SMALL LETTER I WITH OGONEK
0xE2	0x0101	#	LATIN SMALL LETTER A WITH MACRON
0xE3	0x0107	#	LATIN SMALL LETTER C WITH ACUTE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x0119	#	LATIN SMALL LETTER E WITH OGONEK
0xE7	0x0113	#	LATIN SMALL LETTER E WITH MACRON
0xE8	0x010D	#	LATIN SMALL LETTER C WITH CARON
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x017A	#	LATIN SMALL LETTER Z WITH ACUTE
0xEB	0x0117	#	LATIN SMALL LETTER E WITH DOT ABOVE
0xEC	0x0123	#	LATIN SMALL LETTER G WITH CEDILLA
0xED	0x0137	#	LATIN SMALL LETTER K WITH CEDILLA
0xEE	0x012B	#	LATIN SMALL LETTER I WITH MACRON
0xEF	0x013C	#	LATIN SMALL LETTER L WITH CEDILLA
0xF0	0x0161	#	LATIN SMALL LETTER S WITH CARON
0xF1	0x0144	#	LATIN SMALL LETTER N WITH ACUTE
0xF2	0x0146	#	LATIN SMALL LETTER N WITH CEDILLA
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x014D	#	LATIN SMALL LETTER O WITH MACRON
0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#	DIVISION SIGN
0xF8	0x0173	#	LATIN SMALL LETTER U WITH OGONEK
0xF9	0x0142	#	LATIN SMALL LETTER L WITH STROKE
0xFA	0x015B	#	LATIN SMALL LETTER S WITH ACUTE
0xFB	0x016B	#	LATIN SMALL LETTER U WITH MACRON
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x017C	#	LATIN SMALL LETTER Z WITH DOT ABOVE
0xFE	0x017E	#	LATIN SMALL LETTER Z WITH CARON
0xFF	0x2019	#	RIGHT SINGLE QUOTATION MARK

Added freshlib/data/_encodings/_sources/8859-14.TXT.











































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
# 8859-14.TXT
# Date: 2015-12-02 22:05:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO/IEC 8859-14:1998 to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             1999 July 27 (header updated: 2015 December 02)
#	Authors:          Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
#			  Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-14:1998 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-14 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-14 order.
#
#	Version history
#   1.0 version: created
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x1E02	#	LATIN CAPITAL LETTER B WITH DOT ABOVE
0xA2	0x1E03	#	LATIN SMALL LETTER B WITH DOT ABOVE
0xA3	0x00A3	#	POUND SIGN
0xA4	0x010A	#	LATIN CAPITAL LETTER C WITH DOT ABOVE
0xA5	0x010B	#	LATIN SMALL LETTER C WITH DOT ABOVE
0xA6	0x1E0A	#	LATIN CAPITAL LETTER D WITH DOT ABOVE
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x1E80	#	LATIN CAPITAL LETTER W WITH GRAVE
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x1E82	#	LATIN CAPITAL LETTER W WITH ACUTE
0xAB	0x1E0B	#	LATIN SMALL LETTER D WITH DOT ABOVE
0xAC	0x1EF2	#	LATIN CAPITAL LETTER Y WITH GRAVE
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x00AE	#	REGISTERED SIGN
0xAF	0x0178	#	LATIN CAPITAL LETTER Y WITH DIAERESIS
0xB0	0x1E1E	#	LATIN CAPITAL LETTER F WITH DOT ABOVE
0xB1	0x1E1F	#	LATIN SMALL LETTER F WITH DOT ABOVE
0xB2	0x0120	#	LATIN CAPITAL LETTER G WITH DOT ABOVE
0xB3	0x0121	#	LATIN SMALL LETTER G WITH DOT ABOVE
0xB4	0x1E40	#	LATIN CAPITAL LETTER M WITH DOT ABOVE
0xB5	0x1E41	#	LATIN SMALL LETTER M WITH DOT ABOVE
0xB6	0x00B6	#	PILCROW SIGN
0xB7	0x1E56	#	LATIN CAPITAL LETTER P WITH DOT ABOVE
0xB8	0x1E81	#	LATIN SMALL LETTER W WITH GRAVE
0xB9	0x1E57	#	LATIN SMALL LETTER P WITH DOT ABOVE
0xBA	0x1E83	#	LATIN SMALL LETTER W WITH ACUTE
0xBB	0x1E60	#	LATIN CAPITAL LETTER S WITH DOT ABOVE
0xBC	0x1EF3	#	LATIN SMALL LETTER Y WITH GRAVE
0xBD	0x1E84	#	LATIN CAPITAL LETTER W WITH DIAERESIS
0xBE	0x1E85	#	LATIN SMALL LETTER W WITH DIAERESIS
0xBF	0x1E61	#	LATIN SMALL LETTER S WITH DOT ABOVE
0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x0174	#	LATIN CAPITAL LETTER W WITH CIRCUMFLEX
0xD1	0x00D1	#	LATIN CAPITAL LETTER N WITH TILDE
0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x1E6A	#	LATIN CAPITAL LETTER T WITH DOT ABOVE
0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
0xDE	0x0176	#	LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#	LATIN SMALL LETTER AE
0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x0175	#	LATIN SMALL LETTER W WITH CIRCUMFLEX
0xF1	0x00F1	#	LATIN SMALL LETTER N WITH TILDE
0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x1E6B	#	LATIN SMALL LETTER T WITH DOT ABOVE
0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
0xFE	0x0177	#	LATIN SMALL LETTER Y WITH CIRCUMFLEX
0xFF	0x00FF	#	LATIN SMALL LETTER Y WITH DIAERESIS

Added freshlib/data/_encodings/_sources/8859-15.TXT.















































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
# 8859-15.TXT
# Date: 2015-12-02 22:06:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO/IEC 8859-15:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             1999 July 27 (header updated: 2015 December 02)
#	Authors:          Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
#			  Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-15:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-15 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-15 order.
#
#	Version history
#
#	Version history
#   1.0 version: created
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x00A1	#	INVERTED EXCLAMATION MARK
0xA2	0x00A2	#	CENT SIGN
0xA3	0x00A3	#	POUND SIGN
0xA4	0x20AC	#	EURO SIGN
0xA5	0x00A5	#	YEN SIGN
0xA6	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x0161	#	LATIN SMALL LETTER S WITH CARON
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x00AA	#	FEMININE ORDINAL INDICATOR
0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#	NOT SIGN
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x00AE	#	REGISTERED SIGN
0xAF	0x00AF	#	MACRON
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x00B1	#	PLUS-MINUS SIGN
0xB2	0x00B2	#	SUPERSCRIPT TWO
0xB3	0x00B3	#	SUPERSCRIPT THREE
0xB4	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
0xB5	0x00B5	#	MICRO SIGN
0xB6	0x00B6	#	PILCROW SIGN
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x017E	#	LATIN SMALL LETTER Z WITH CARON
0xB9	0x00B9	#	SUPERSCRIPT ONE
0xBA	0x00BA	#	MASCULINE ORDINAL INDICATOR
0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x0152	#	LATIN CAPITAL LIGATURE OE
0xBD	0x0153	#	LATIN SMALL LIGATURE OE
0xBE	0x0178	#	LATIN CAPITAL LETTER Y WITH DIAERESIS
0xBF	0x00BF	#	INVERTED QUESTION MARK
0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x00D0	#	LATIN CAPITAL LETTER ETH
0xD1	0x00D1	#	LATIN CAPITAL LETTER N WITH TILDE
0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#	MULTIPLICATION SIGN
0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
0xDE	0x00DE	#	LATIN CAPITAL LETTER THORN
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#	LATIN SMALL LETTER AE
0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x00F0	#	LATIN SMALL LETTER ETH
0xF1	0x00F1	#	LATIN SMALL LETTER N WITH TILDE
0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#	DIVISION SIGN
0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
0xFE	0x00FE	#	LATIN SMALL LETTER THORN
0xFF	0x00FF	#	LATIN SMALL LETTER Y WITH DIAERESIS

Added freshlib/data/_encodings/_sources/8859-16.TXT.











































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
# 8859-16.TXT
# Date: 2015-12-02 22:08:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO/IEC 8859-16:2001 to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             2001 July 26 (header updated: 2015 December 02)
#	Authors:          Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
#
#	Copyright (c) 1999-2001 Unicode, Inc.  All Rights reserved.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-16:2001 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-16 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-16 order.
#
#	Version history
#   1.0 version: created
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
0xA2	0x0105	#	LATIN SMALL LETTER A WITH OGONEK
0xA3	0x0141	#	LATIN CAPITAL LETTER L WITH STROKE
0xA4	0x20AC	#	EURO SIGN
0xA5	0x201E	#	DOUBLE LOW-9 QUOTATION MARK
0xA6	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x0161	#	LATIN SMALL LETTER S WITH CARON
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x0218	#	LATIN CAPITAL LETTER S WITH COMMA BELOW
0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x0179	#	LATIN CAPITAL LETTER Z WITH ACUTE
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x017A	#	LATIN SMALL LETTER Z WITH ACUTE
0xAF	0x017B	#	LATIN CAPITAL LETTER Z WITH DOT ABOVE
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x00B1	#	PLUS-MINUS SIGN
0xB2	0x010C	#	LATIN CAPITAL LETTER C WITH CARON
0xB3	0x0142	#	LATIN SMALL LETTER L WITH STROKE
0xB4	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
0xB5	0x201D	#	RIGHT DOUBLE QUOTATION MARK
0xB6	0x00B6	#	PILCROW SIGN
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x017E	#	LATIN SMALL LETTER Z WITH CARON
0xB9	0x010D	#	LATIN SMALL LETTER C WITH CARON
0xBA	0x0219	#	LATIN SMALL LETTER S WITH COMMA BELOW
0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x0152	#	LATIN CAPITAL LIGATURE OE
0xBD	0x0153	#	LATIN SMALL LIGATURE OE
0xBE	0x0178	#	LATIN CAPITAL LETTER Y WITH DIAERESIS
0xBF	0x017C	#	LATIN SMALL LETTER Z WITH DOT ABOVE
0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x0102	#	LATIN CAPITAL LETTER A WITH BREVE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x0106	#	LATIN CAPITAL LETTER C WITH ACUTE
0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x0110	#	LATIN CAPITAL LETTER D WITH STROKE
0xD1	0x0143	#	LATIN CAPITAL LETTER N WITH ACUTE
0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x0150	#	LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x015A	#	LATIN CAPITAL LETTER S WITH ACUTE
0xD8	0x0170	#	LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x0118	#	LATIN CAPITAL LETTER E WITH OGONEK
0xDE	0x021A	#	LATIN CAPITAL LETTER T WITH COMMA BELOW
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x0103	#	LATIN SMALL LETTER A WITH BREVE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x0107	#	LATIN SMALL LETTER C WITH ACUTE
0xE6	0x00E6	#	LATIN SMALL LETTER AE
0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x0111	#	LATIN SMALL LETTER D WITH STROKE
0xF1	0x0144	#	LATIN SMALL LETTER N WITH ACUTE
0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x0151	#	LATIN SMALL LETTER O WITH DOUBLE ACUTE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x015B	#	LATIN SMALL LETTER S WITH ACUTE
0xF8	0x0171	#	LATIN SMALL LETTER U WITH DOUBLE ACUTE
0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x0119	#	LATIN SMALL LETTER E WITH OGONEK
0xFE	0x021B	#	LATIN SMALL LETTER T WITH COMMA BELOW
0xFF	0x00FF	#	LATIN SMALL LETTER Y WITH DIAERESIS

Added freshlib/data/_encodings/_sources/8859-2.TXT.









































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# 8859-2.TXT
# Date: 2015-12-02 21:34:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO 8859-2:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             1999 July 27 (header updated: 2015 December 02)
#	Authors:          Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-2:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-2 order.
#
#	Version history
#   1.0 version: updates 0.1 version by adding mappings for all
#       control characters.
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
0xA2	0x02D8	#	BREVE
0xA3	0x0141	#	LATIN CAPITAL LETTER L WITH STROKE
0xA4	0x00A4	#	CURRENCY SIGN
0xA5	0x013D	#	LATIN CAPITAL LETTER L WITH CARON
0xA6	0x015A	#	LATIN CAPITAL LETTER S WITH ACUTE
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x00A8	#	DIAERESIS
0xA9	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
0xAA	0x015E	#	LATIN CAPITAL LETTER S WITH CEDILLA
0xAB	0x0164	#	LATIN CAPITAL LETTER T WITH CARON
0xAC	0x0179	#	LATIN CAPITAL LETTER Z WITH ACUTE
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
0xAF	0x017B	#	LATIN CAPITAL LETTER Z WITH DOT ABOVE
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x0105	#	LATIN SMALL LETTER A WITH OGONEK
0xB2	0x02DB	#	OGONEK
0xB3	0x0142	#	LATIN SMALL LETTER L WITH STROKE
0xB4	0x00B4	#	ACUTE ACCENT
0xB5	0x013E	#	LATIN SMALL LETTER L WITH CARON
0xB6	0x015B	#	LATIN SMALL LETTER S WITH ACUTE
0xB7	0x02C7	#	CARON
0xB8	0x00B8	#	CEDILLA
0xB9	0x0161	#	LATIN SMALL LETTER S WITH CARON
0xBA	0x015F	#	LATIN SMALL LETTER S WITH CEDILLA
0xBB	0x0165	#	LATIN SMALL LETTER T WITH CARON
0xBC	0x017A	#	LATIN SMALL LETTER Z WITH ACUTE
0xBD	0x02DD	#	DOUBLE ACUTE ACCENT
0xBE	0x017E	#	LATIN SMALL LETTER Z WITH CARON
0xBF	0x017C	#	LATIN SMALL LETTER Z WITH DOT ABOVE
0xC0	0x0154	#	LATIN CAPITAL LETTER R WITH ACUTE
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x0102	#	LATIN CAPITAL LETTER A WITH BREVE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x0139	#	LATIN CAPITAL LETTER L WITH ACUTE
0xC6	0x0106	#	LATIN CAPITAL LETTER C WITH ACUTE
0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x010C	#	LATIN CAPITAL LETTER C WITH CARON
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x0118	#	LATIN CAPITAL LETTER E WITH OGONEK
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x011A	#	LATIN CAPITAL LETTER E WITH CARON
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x010E	#	LATIN CAPITAL LETTER D WITH CARON
0xD0	0x0110	#	LATIN CAPITAL LETTER D WITH STROKE
0xD1	0x0143	#	LATIN CAPITAL LETTER N WITH ACUTE
0xD2	0x0147	#	LATIN CAPITAL LETTER N WITH CARON
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x0150	#	LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#	MULTIPLICATION SIGN
0xD8	0x0158	#	LATIN CAPITAL LETTER R WITH CARON
0xD9	0x016E	#	LATIN CAPITAL LETTER U WITH RING ABOVE
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x0170	#	LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
0xDE	0x0162	#	LATIN CAPITAL LETTER T WITH CEDILLA
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
0xE0	0x0155	#	LATIN SMALL LETTER R WITH ACUTE
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x0103	#	LATIN SMALL LETTER A WITH BREVE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x013A	#	LATIN SMALL LETTER L WITH ACUTE
0xE6	0x0107	#	LATIN SMALL LETTER C WITH ACUTE
0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x010D	#	LATIN SMALL LETTER C WITH CARON
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x0119	#	LATIN SMALL LETTER E WITH OGONEK
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x011B	#	LATIN SMALL LETTER E WITH CARON
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x010F	#	LATIN SMALL LETTER D WITH CARON
0xF0	0x0111	#	LATIN SMALL LETTER D WITH STROKE
0xF1	0x0144	#	LATIN SMALL LETTER N WITH ACUTE
0xF2	0x0148	#	LATIN SMALL LETTER N WITH CARON
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x0151	#	LATIN SMALL LETTER O WITH DOUBLE ACUTE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#	DIVISION SIGN
0xF8	0x0159	#	LATIN SMALL LETTER R WITH CARON
0xF9	0x016F	#	LATIN SMALL LETTER U WITH RING ABOVE
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x0171	#	LATIN SMALL LETTER U WITH DOUBLE ACUTE
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
0xFE	0x0163	#	LATIN SMALL LETTER T WITH CEDILLA
0xFF	0x02D9	#	DOT ABOVE

Added freshlib/data/_encodings/_sources/8859-3.TXT.



























































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
# 8859-3.TXT
# Date: 2015-12-02 21:39:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO/IEC 8859-3:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             1999 July 27 (header updated: 2015 December 02)
#	Authors:          Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-3:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-3 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-3 order.
#
#	Version history
#   1.0 version: updates 0.1 version by adding mappings for all
#       control characters.
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0126	#	LATIN CAPITAL LETTER H WITH STROKE
0xA2	0x02D8	#	BREVE
0xA3	0x00A3	#	POUND SIGN
0xA4	0x00A4	#	CURRENCY SIGN
0xA6	0x0124	#	LATIN CAPITAL LETTER H WITH CIRCUMFLEX
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x00A8	#	DIAERESIS
0xA9	0x0130	#	LATIN CAPITAL LETTER I WITH DOT ABOVE
0xAA	0x015E	#	LATIN CAPITAL LETTER S WITH CEDILLA
0xAB	0x011E	#	LATIN CAPITAL LETTER G WITH BREVE
0xAC	0x0134	#	LATIN CAPITAL LETTER J WITH CIRCUMFLEX
0xAD	0x00AD	#	SOFT HYPHEN
0xAF	0x017B	#	LATIN CAPITAL LETTER Z WITH DOT ABOVE
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x0127	#	LATIN SMALL LETTER H WITH STROKE
0xB2	0x00B2	#	SUPERSCRIPT TWO
0xB3	0x00B3	#	SUPERSCRIPT THREE
0xB4	0x00B4	#	ACUTE ACCENT
0xB5	0x00B5	#	MICRO SIGN
0xB6	0x0125	#	LATIN SMALL LETTER H WITH CIRCUMFLEX
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x00B8	#	CEDILLA
0xB9	0x0131	#	LATIN SMALL LETTER DOTLESS I
0xBA	0x015F	#	LATIN SMALL LETTER S WITH CEDILLA
0xBB	0x011F	#	LATIN SMALL LETTER G WITH BREVE
0xBC	0x0135	#	LATIN SMALL LETTER J WITH CIRCUMFLEX
0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
0xBF	0x017C	#	LATIN SMALL LETTER Z WITH DOT ABOVE
0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x010A	#	LATIN CAPITAL LETTER C WITH DOT ABOVE
0xC6	0x0108	#	LATIN CAPITAL LETTER C WITH CIRCUMFLEX
0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
0xD1	0x00D1	#	LATIN CAPITAL LETTER N WITH TILDE
0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x0120	#	LATIN CAPITAL LETTER G WITH DOT ABOVE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#	MULTIPLICATION SIGN
0xD8	0x011C	#	LATIN CAPITAL LETTER G WITH CIRCUMFLEX
0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x016C	#	LATIN CAPITAL LETTER U WITH BREVE
0xDE	0x015C	#	LATIN CAPITAL LETTER S WITH CIRCUMFLEX
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x010B	#	LATIN SMALL LETTER C WITH DOT ABOVE
0xE6	0x0109	#	LATIN SMALL LETTER C WITH CIRCUMFLEX
0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
0xF1	0x00F1	#	LATIN SMALL LETTER N WITH TILDE
0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x0121	#	LATIN SMALL LETTER G WITH DOT ABOVE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#	DIVISION SIGN
0xF8	0x011D	#	LATIN SMALL LETTER G WITH CIRCUMFLEX
0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x016D	#	LATIN SMALL LETTER U WITH BREVE
0xFE	0x015D	#	LATIN SMALL LETTER S WITH CIRCUMFLEX
0xFF	0x02D9	#	DOT ABOVE

Added freshlib/data/_encodings/_sources/8859-4.TXT.









































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# 8859-4.TXT
# Date: 2015-12-02 21:41:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO/IEC 8859-4:1998 to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             1999 July 27 (header updated: 2015 December 02)
#	Authors:          Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-4:1998 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-4 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-4 order.
#
#	Version history
#   1.0 version: updates 0.1 version by adding mappings for all
#       control characters.
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
0xA2	0x0138	#	LATIN SMALL LETTER KRA
0xA3	0x0156	#	LATIN CAPITAL LETTER R WITH CEDILLA
0xA4	0x00A4	#	CURRENCY SIGN
0xA5	0x0128	#	LATIN CAPITAL LETTER I WITH TILDE
0xA6	0x013B	#	LATIN CAPITAL LETTER L WITH CEDILLA
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x00A8	#	DIAERESIS
0xA9	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
0xAA	0x0112	#	LATIN CAPITAL LETTER E WITH MACRON
0xAB	0x0122	#	LATIN CAPITAL LETTER G WITH CEDILLA
0xAC	0x0166	#	LATIN CAPITAL LETTER T WITH STROKE
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
0xAF	0x00AF	#	MACRON
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x0105	#	LATIN SMALL LETTER A WITH OGONEK
0xB2	0x02DB	#	OGONEK
0xB3	0x0157	#	LATIN SMALL LETTER R WITH CEDILLA
0xB4	0x00B4	#	ACUTE ACCENT
0xB5	0x0129	#	LATIN SMALL LETTER I WITH TILDE
0xB6	0x013C	#	LATIN SMALL LETTER L WITH CEDILLA
0xB7	0x02C7	#	CARON
0xB8	0x00B8	#	CEDILLA
0xB9	0x0161	#	LATIN SMALL LETTER S WITH CARON
0xBA	0x0113	#	LATIN SMALL LETTER E WITH MACRON
0xBB	0x0123	#	LATIN SMALL LETTER G WITH CEDILLA
0xBC	0x0167	#	LATIN SMALL LETTER T WITH STROKE
0xBD	0x014A	#	LATIN CAPITAL LETTER ENG
0xBE	0x017E	#	LATIN SMALL LETTER Z WITH CARON
0xBF	0x014B	#	LATIN SMALL LETTER ENG
0xC0	0x0100	#	LATIN CAPITAL LETTER A WITH MACRON
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
0xC7	0x012E	#	LATIN CAPITAL LETTER I WITH OGONEK
0xC8	0x010C	#	LATIN CAPITAL LETTER C WITH CARON
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x0118	#	LATIN CAPITAL LETTER E WITH OGONEK
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x0116	#	LATIN CAPITAL LETTER E WITH DOT ABOVE
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x012A	#	LATIN CAPITAL LETTER I WITH MACRON
0xD0	0x0110	#	LATIN CAPITAL LETTER D WITH STROKE
0xD1	0x0145	#	LATIN CAPITAL LETTER N WITH CEDILLA
0xD2	0x014C	#	LATIN CAPITAL LETTER O WITH MACRON
0xD3	0x0136	#	LATIN CAPITAL LETTER K WITH CEDILLA
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#	MULTIPLICATION SIGN
0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
0xD9	0x0172	#	LATIN CAPITAL LETTER U WITH OGONEK
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x0168	#	LATIN CAPITAL LETTER U WITH TILDE
0xDE	0x016A	#	LATIN CAPITAL LETTER U WITH MACRON
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
0xE0	0x0101	#	LATIN SMALL LETTER A WITH MACRON
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#	LATIN SMALL LETTER AE
0xE7	0x012F	#	LATIN SMALL LETTER I WITH OGONEK
0xE8	0x010D	#	LATIN SMALL LETTER C WITH CARON
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x0119	#	LATIN SMALL LETTER E WITH OGONEK
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x0117	#	LATIN SMALL LETTER E WITH DOT ABOVE
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x012B	#	LATIN SMALL LETTER I WITH MACRON
0xF0	0x0111	#	LATIN SMALL LETTER D WITH STROKE
0xF1	0x0146	#	LATIN SMALL LETTER N WITH CEDILLA
0xF2	0x014D	#	LATIN SMALL LETTER O WITH MACRON
0xF3	0x0137	#	LATIN SMALL LETTER K WITH CEDILLA
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#	DIVISION SIGN
0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
0xF9	0x0173	#	LATIN SMALL LETTER U WITH OGONEK
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x0169	#	LATIN SMALL LETTER U WITH TILDE
0xFE	0x016B	#	LATIN SMALL LETTER U WITH MACRON
0xFF	0x02D9	#	DOT ABOVE

Added freshlib/data/_encodings/_sources/8859-5.TXT.









































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# 8859-5.TXT
# Date: 2015-12-02 21:43:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO 8859-5:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             1999 July 27 (header updated: 2015 December 02)
#	Authors:          Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-5:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-5 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-5 order.
#
#	Version history
#   1.0 version: updates 0.1 version by adding mappings for all
#       control characters.
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0401	#	CYRILLIC CAPITAL LETTER IO
0xA2	0x0402	#	CYRILLIC CAPITAL LETTER DJE
0xA3	0x0403	#	CYRILLIC CAPITAL LETTER GJE
0xA4	0x0404	#	CYRILLIC CAPITAL LETTER UKRAINIAN IE
0xA5	0x0405	#	CYRILLIC CAPITAL LETTER DZE
0xA6	0x0406	#	CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
0xA7	0x0407	#	CYRILLIC CAPITAL LETTER YI
0xA8	0x0408	#	CYRILLIC CAPITAL LETTER JE
0xA9	0x0409	#	CYRILLIC CAPITAL LETTER LJE
0xAA	0x040A	#	CYRILLIC CAPITAL LETTER NJE
0xAB	0x040B	#	CYRILLIC CAPITAL LETTER TSHE
0xAC	0x040C	#	CYRILLIC CAPITAL LETTER KJE
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x040E	#	CYRILLIC CAPITAL LETTER SHORT U
0xAF	0x040F	#	CYRILLIC CAPITAL LETTER DZHE
0xB0	0x0410	#	CYRILLIC CAPITAL LETTER A
0xB1	0x0411	#	CYRILLIC CAPITAL LETTER BE
0xB2	0x0412	#	CYRILLIC CAPITAL LETTER VE
0xB3	0x0413	#	CYRILLIC CAPITAL LETTER GHE
0xB4	0x0414	#	CYRILLIC CAPITAL LETTER DE
0xB5	0x0415	#	CYRILLIC CAPITAL LETTER IE
0xB6	0x0416	#	CYRILLIC CAPITAL LETTER ZHE
0xB7	0x0417	#	CYRILLIC CAPITAL LETTER ZE
0xB8	0x0418	#	CYRILLIC CAPITAL LETTER I
0xB9	0x0419	#	CYRILLIC CAPITAL LETTER SHORT I
0xBA	0x041A	#	CYRILLIC CAPITAL LETTER KA
0xBB	0x041B	#	CYRILLIC CAPITAL LETTER EL
0xBC	0x041C	#	CYRILLIC CAPITAL LETTER EM
0xBD	0x041D	#	CYRILLIC CAPITAL LETTER EN
0xBE	0x041E	#	CYRILLIC CAPITAL LETTER O
0xBF	0x041F	#	CYRILLIC CAPITAL LETTER PE
0xC0	0x0420	#	CYRILLIC CAPITAL LETTER ER
0xC1	0x0421	#	CYRILLIC CAPITAL LETTER ES
0xC2	0x0422	#	CYRILLIC CAPITAL LETTER TE
0xC3	0x0423	#	CYRILLIC CAPITAL LETTER U
0xC4	0x0424	#	CYRILLIC CAPITAL LETTER EF
0xC5	0x0425	#	CYRILLIC CAPITAL LETTER HA
0xC6	0x0426	#	CYRILLIC CAPITAL LETTER TSE
0xC7	0x0427	#	CYRILLIC CAPITAL LETTER CHE
0xC8	0x0428	#	CYRILLIC CAPITAL LETTER SHA
0xC9	0x0429	#	CYRILLIC CAPITAL LETTER SHCHA
0xCA	0x042A	#	CYRILLIC CAPITAL LETTER HARD SIGN
0xCB	0x042B	#	CYRILLIC CAPITAL LETTER YERU
0xCC	0x042C	#	CYRILLIC CAPITAL LETTER SOFT SIGN
0xCD	0x042D	#	CYRILLIC CAPITAL LETTER E
0xCE	0x042E	#	CYRILLIC CAPITAL LETTER YU
0xCF	0x042F	#	CYRILLIC CAPITAL LETTER YA
0xD0	0x0430	#	CYRILLIC SMALL LETTER A
0xD1	0x0431	#	CYRILLIC SMALL LETTER BE
0xD2	0x0432	#	CYRILLIC SMALL LETTER VE
0xD3	0x0433	#	CYRILLIC SMALL LETTER GHE
0xD4	0x0434	#	CYRILLIC SMALL LETTER DE
0xD5	0x0435	#	CYRILLIC SMALL LETTER IE
0xD6	0x0436	#	CYRILLIC SMALL LETTER ZHE
0xD7	0x0437	#	CYRILLIC SMALL LETTER ZE
0xD8	0x0438	#	CYRILLIC SMALL LETTER I
0xD9	0x0439	#	CYRILLIC SMALL LETTER SHORT I
0xDA	0x043A	#	CYRILLIC SMALL LETTER KA
0xDB	0x043B	#	CYRILLIC SMALL LETTER EL
0xDC	0x043C	#	CYRILLIC SMALL LETTER EM
0xDD	0x043D	#	CYRILLIC SMALL LETTER EN
0xDE	0x043E	#	CYRILLIC SMALL LETTER O
0xDF	0x043F	#	CYRILLIC SMALL LETTER PE
0xE0	0x0440	#	CYRILLIC SMALL LETTER ER
0xE1	0x0441	#	CYRILLIC SMALL LETTER ES
0xE2	0x0442	#	CYRILLIC SMALL LETTER TE
0xE3	0x0443	#	CYRILLIC SMALL LETTER U
0xE4	0x0444	#	CYRILLIC SMALL LETTER EF
0xE5	0x0445	#	CYRILLIC SMALL LETTER HA
0xE6	0x0446	#	CYRILLIC SMALL LETTER TSE
0xE7	0x0447	#	CYRILLIC SMALL LETTER CHE
0xE8	0x0448	#	CYRILLIC SMALL LETTER SHA
0xE9	0x0449	#	CYRILLIC SMALL LETTER SHCHA
0xEA	0x044A	#	CYRILLIC SMALL LETTER HARD SIGN
0xEB	0x044B	#	CYRILLIC SMALL LETTER YERU
0xEC	0x044C	#	CYRILLIC SMALL LETTER SOFT SIGN
0xED	0x044D	#	CYRILLIC SMALL LETTER E
0xEE	0x044E	#	CYRILLIC SMALL LETTER YU
0xEF	0x044F	#	CYRILLIC SMALL LETTER YA
0xF0	0x2116	#	NUMERO SIGN
0xF1	0x0451	#	CYRILLIC SMALL LETTER IO
0xF2	0x0452	#	CYRILLIC SMALL LETTER DJE
0xF3	0x0453	#	CYRILLIC SMALL LETTER GJE
0xF4	0x0454	#	CYRILLIC SMALL LETTER UKRAINIAN IE
0xF5	0x0455	#	CYRILLIC SMALL LETTER DZE
0xF6	0x0456	#	CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
0xF7	0x0457	#	CYRILLIC SMALL LETTER YI
0xF8	0x0458	#	CYRILLIC SMALL LETTER JE
0xF9	0x0459	#	CYRILLIC SMALL LETTER LJE
0xFA	0x045A	#	CYRILLIC SMALL LETTER NJE
0xFB	0x045B	#	CYRILLIC SMALL LETTER TSHE
0xFC	0x045C	#	CYRILLIC SMALL LETTER KJE
0xFD	0x00A7	#	SECTION SIGN
0xFE	0x045E	#	CYRILLIC SMALL LETTER SHORT U
0xFF	0x045F	#	CYRILLIC SMALL LETTER DZHE

Added freshlib/data/_encodings/_sources/8859-6.TXT.



















































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
# 8859-6.TXT
# Date: 2015-12-02 21:44:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO 8859-6:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             1999 July 27 (header updated: 2015 December 02)
#	Authors:          Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-6:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-6 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-6 order.
#
#	Version history
#   1.0 version: updates 0.1 version by adding mappings for all
#       control characters.
#       0x30..0x39 remapped to the ASCII digits (U+0030..U+0039) instead
#       of the Arabic digits (U+0660..U+0669).
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA4	0x00A4	#	CURRENCY SIGN
0xAC	0x060C	#	ARABIC COMMA
0xAD	0x00AD	#	SOFT HYPHEN
0xBB	0x061B	#	ARABIC SEMICOLON
0xBF	0x061F	#	ARABIC QUESTION MARK
0xC1	0x0621	#	ARABIC LETTER HAMZA
0xC2	0x0622	#	ARABIC LETTER ALEF WITH MADDA ABOVE
0xC3	0x0623	#	ARABIC LETTER ALEF WITH HAMZA ABOVE
0xC4	0x0624	#	ARABIC LETTER WAW WITH HAMZA ABOVE
0xC5	0x0625	#	ARABIC LETTER ALEF WITH HAMZA BELOW
0xC6	0x0626	#	ARABIC LETTER YEH WITH HAMZA ABOVE
0xC7	0x0627	#	ARABIC LETTER ALEF
0xC8	0x0628	#	ARABIC LETTER BEH
0xC9	0x0629	#	ARABIC LETTER TEH MARBUTA
0xCA	0x062A	#	ARABIC LETTER TEH
0xCB	0x062B	#	ARABIC LETTER THEH
0xCC	0x062C	#	ARABIC LETTER JEEM
0xCD	0x062D	#	ARABIC LETTER HAH
0xCE	0x062E	#	ARABIC LETTER KHAH
0xCF	0x062F	#	ARABIC LETTER DAL
0xD0	0x0630	#	ARABIC LETTER THAL
0xD1	0x0631	#	ARABIC LETTER REH
0xD2	0x0632	#	ARABIC LETTER ZAIN
0xD3	0x0633	#	ARABIC LETTER SEEN
0xD4	0x0634	#	ARABIC LETTER SHEEN
0xD5	0x0635	#	ARABIC LETTER SAD
0xD6	0x0636	#	ARABIC LETTER DAD
0xD7	0x0637	#	ARABIC LETTER TAH
0xD8	0x0638	#	ARABIC LETTER ZAH
0xD9	0x0639	#	ARABIC LETTER AIN
0xDA	0x063A	#	ARABIC LETTER GHAIN
0xE0	0x0640	#	ARABIC TATWEEL
0xE1	0x0641	#	ARABIC LETTER FEH
0xE2	0x0642	#	ARABIC LETTER QAF
0xE3	0x0643	#	ARABIC LETTER KAF
0xE4	0x0644	#	ARABIC LETTER LAM
0xE5	0x0645	#	ARABIC LETTER MEEM
0xE6	0x0646	#	ARABIC LETTER NOON
0xE7	0x0647	#	ARABIC LETTER HEH
0xE8	0x0648	#	ARABIC LETTER WAW
0xE9	0x0649	#	ARABIC LETTER ALEF MAKSURA
0xEA	0x064A	#	ARABIC LETTER YEH
0xEB	0x064B	#	ARABIC FATHATAN
0xEC	0x064C	#	ARABIC DAMMATAN
0xED	0x064D	#	ARABIC KASRATAN
0xEE	0x064E	#	ARABIC FATHA
0xEF	0x064F	#	ARABIC DAMMA
0xF0	0x0650	#	ARABIC KASRA
0xF1	0x0651	#	ARABIC SHADDA
0xF2	0x0652	#	ARABIC SUKUN

Added freshlib/data/_encodings/_sources/8859-7.TXT.























































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
# 8859-7.TXT
# Date: 2015-12-02 21:47:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO 8859-7:2003 to Unicode
#	Unicode version:  4.0
#	Table version:    3.0
#	Table format:     Format A
#	Date:             2003-Nov-12 (header updated: 2015 December 02)
#	Authors:          Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO 8859-7:2003 characters map into Unicode.
#
#	ISO 8859-7:1987 is equivalent to ISO-IR-126, ELOT 928,
#	and ECMA 118. ISO 8859-7:2003 adds two currency signs 
#	and one other character not in the earlier standard.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO 8859-7 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO 8859-7 order.
#
#	Version history
#	1.0 version updates 0.1 version by adding mappings for all
#	control characters.
#	Remap 0xA1 to U+2018 (instead of 0x02BD) to match text of 8859-7
#	Remap 0xA2 to U+2019 (instead of 0x02BC) to match text of 8859-7
#
#	2.0 version updates 1.0 version by adding mappings for the
#	three newly added characters 0xA4, 0xA5, 0xAA.
#
#   3.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x2018	#	LEFT SINGLE QUOTATION MARK
0xA2	0x2019	#	RIGHT SINGLE QUOTATION MARK
0xA3	0x00A3	#	POUND SIGN
0xA4	0x20AC	#	EURO SIGN
0xA5	0x20AF	#	DRACHMA SIGN
0xA6	0x00A6	#	BROKEN BAR
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x00A8	#	DIAERESIS
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x037A	#	GREEK YPOGEGRAMMENI
0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#	NOT SIGN
0xAD	0x00AD	#	SOFT HYPHEN
0xAF	0x2015	#	HORIZONTAL BAR
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x00B1	#	PLUS-MINUS SIGN
0xB2	0x00B2	#	SUPERSCRIPT TWO
0xB3	0x00B3	#	SUPERSCRIPT THREE
0xB4	0x0384	#	GREEK TONOS
0xB5	0x0385	#	GREEK DIALYTIKA TONOS
0xB6	0x0386	#	GREEK CAPITAL LETTER ALPHA WITH TONOS
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x0388	#	GREEK CAPITAL LETTER EPSILON WITH TONOS
0xB9	0x0389	#	GREEK CAPITAL LETTER ETA WITH TONOS
0xBA	0x038A	#	GREEK CAPITAL LETTER IOTA WITH TONOS
0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x038C	#	GREEK CAPITAL LETTER OMICRON WITH TONOS
0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
0xBE	0x038E	#	GREEK CAPITAL LETTER UPSILON WITH TONOS
0xBF	0x038F	#	GREEK CAPITAL LETTER OMEGA WITH TONOS
0xC0	0x0390	#	GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
0xC1	0x0391	#	GREEK CAPITAL LETTER ALPHA
0xC2	0x0392	#	GREEK CAPITAL LETTER BETA
0xC3	0x0393	#	GREEK CAPITAL LETTER GAMMA
0xC4	0x0394	#	GREEK CAPITAL LETTER DELTA
0xC5	0x0395	#	GREEK CAPITAL LETTER EPSILON
0xC6	0x0396	#	GREEK CAPITAL LETTER ZETA
0xC7	0x0397	#	GREEK CAPITAL LETTER ETA
0xC8	0x0398	#	GREEK CAPITAL LETTER THETA
0xC9	0x0399	#	GREEK CAPITAL LETTER IOTA
0xCA	0x039A	#	GREEK CAPITAL LETTER KAPPA
0xCB	0x039B	#	GREEK CAPITAL LETTER LAMDA
0xCC	0x039C	#	GREEK CAPITAL LETTER MU
0xCD	0x039D	#	GREEK CAPITAL LETTER NU
0xCE	0x039E	#	GREEK CAPITAL LETTER XI
0xCF	0x039F	#	GREEK CAPITAL LETTER OMICRON
0xD0	0x03A0	#	GREEK CAPITAL LETTER PI
0xD1	0x03A1	#	GREEK CAPITAL LETTER RHO
0xD3	0x03A3	#	GREEK CAPITAL LETTER SIGMA
0xD4	0x03A4	#	GREEK CAPITAL LETTER TAU
0xD5	0x03A5	#	GREEK CAPITAL LETTER UPSILON
0xD6	0x03A6	#	GREEK CAPITAL LETTER PHI
0xD7	0x03A7	#	GREEK CAPITAL LETTER CHI
0xD8	0x03A8	#	GREEK CAPITAL LETTER PSI
0xD9	0x03A9	#	GREEK CAPITAL LETTER OMEGA
0xDA	0x03AA	#	GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
0xDB	0x03AB	#	GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
0xDC	0x03AC	#	GREEK SMALL LETTER ALPHA WITH TONOS
0xDD	0x03AD	#	GREEK SMALL LETTER EPSILON WITH TONOS
0xDE	0x03AE	#	GREEK SMALL LETTER ETA WITH TONOS
0xDF	0x03AF	#	GREEK SMALL LETTER IOTA WITH TONOS
0xE0	0x03B0	#	GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
0xE1	0x03B1	#	GREEK SMALL LETTER ALPHA
0xE2	0x03B2	#	GREEK SMALL LETTER BETA
0xE3	0x03B3	#	GREEK SMALL LETTER GAMMA
0xE4	0x03B4	#	GREEK SMALL LETTER DELTA
0xE5	0x03B5	#	GREEK SMALL LETTER EPSILON
0xE6	0x03B6	#	GREEK SMALL LETTER ZETA
0xE7	0x03B7	#	GREEK SMALL LETTER ETA
0xE8	0x03B8	#	GREEK SMALL LETTER THETA
0xE9	0x03B9	#	GREEK SMALL LETTER IOTA
0xEA	0x03BA	#	GREEK SMALL LETTER KAPPA
0xEB	0x03BB	#	GREEK SMALL LETTER LAMDA
0xEC	0x03BC	#	GREEK SMALL LETTER MU
0xED	0x03BD	#	GREEK SMALL LETTER NU
0xEE	0x03BE	#	GREEK SMALL LETTER XI
0xEF	0x03BF	#	GREEK SMALL LETTER OMICRON
0xF0	0x03C0	#	GREEK SMALL LETTER PI
0xF1	0x03C1	#	GREEK SMALL LETTER RHO
0xF2	0x03C2	#	GREEK SMALL LETTER FINAL SIGMA
0xF3	0x03C3	#	GREEK SMALL LETTER SIGMA
0xF4	0x03C4	#	GREEK SMALL LETTER TAU
0xF5	0x03C5	#	GREEK SMALL LETTER UPSILON
0xF6	0x03C6	#	GREEK SMALL LETTER PHI
0xF7	0x03C7	#	GREEK SMALL LETTER CHI
0xF8	0x03C8	#	GREEK SMALL LETTER PSI
0xF9	0x03C9	#	GREEK SMALL LETTER OMEGA
0xFA	0x03CA	#	GREEK SMALL LETTER IOTA WITH DIALYTIKA
0xFB	0x03CB	#	GREEK SMALL LETTER UPSILON WITH DIALYTIKA
0xFC	0x03CC	#	GREEK SMALL LETTER OMICRON WITH TONOS
0xFD	0x03CD	#	GREEK SMALL LETTER UPSILON WITH TONOS
0xFE	0x03CE	#	GREEK SMALL LETTER OMEGA WITH TONOS

Added freshlib/data/_encodings/_sources/8859-8.TXT.







































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
# 8859-8.TXT
# Date: 2015-12-02 21:50:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO/IEC 8859-8:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             2000-Jan-03 (header updated: 2015 December 02)
#	Authors:          Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-8:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-8 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-8 order.
#
#	Version history
#	1.0 version updates 0.1 version by adding mappings for all
#	control characters.
#   1.1 version updates to the published 8859-8:1999, correcting
#          the mapping of 0xAF and adding mappings for LRM and RLM.
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA2	0x00A2	#	CENT SIGN
0xA3	0x00A3	#	POUND SIGN
0xA4	0x00A4	#	CURRENCY SIGN
0xA5	0x00A5	#	YEN SIGN
0xA6	0x00A6	#	BROKEN BAR
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x00A8	#	DIAERESIS
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x00D7	#	MULTIPLICATION SIGN
0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#	NOT SIGN
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x00AE	#	REGISTERED SIGN
0xAF	0x00AF	#	MACRON
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x00B1	#	PLUS-MINUS SIGN
0xB2	0x00B2	#	SUPERSCRIPT TWO
0xB3	0x00B3	#	SUPERSCRIPT THREE
0xB4	0x00B4	#	ACUTE ACCENT
0xB5	0x00B5	#	MICRO SIGN
0xB6	0x00B6	#	PILCROW SIGN
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x00B8	#	CEDILLA
0xB9	0x00B9	#	SUPERSCRIPT ONE
0xBA	0x00F7	#	DIVISION SIGN
0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#	VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
0xBE	0x00BE	#	VULGAR FRACTION THREE QUARTERS
0xDF	0x2017	#	DOUBLE LOW LINE
0xE0	0x05D0	#	HEBREW LETTER ALEF
0xE1	0x05D1	#	HEBREW LETTER BET
0xE2	0x05D2	#	HEBREW LETTER GIMEL
0xE3	0x05D3	#	HEBREW LETTER DALET
0xE4	0x05D4	#	HEBREW LETTER HE
0xE5	0x05D5	#	HEBREW LETTER VAV
0xE6	0x05D6	#	HEBREW LETTER ZAYIN
0xE7	0x05D7	#	HEBREW LETTER HET
0xE8	0x05D8	#	HEBREW LETTER TET
0xE9	0x05D9	#	HEBREW LETTER YOD
0xEA	0x05DA	#	HEBREW LETTER FINAL KAF
0xEB	0x05DB	#	HEBREW LETTER KAF
0xEC	0x05DC	#	HEBREW LETTER LAMED
0xED	0x05DD	#	HEBREW LETTER FINAL MEM
0xEE	0x05DE	#	HEBREW LETTER MEM
0xEF	0x05DF	#	HEBREW LETTER FINAL NUN
0xF0	0x05E0	#	HEBREW LETTER NUN
0xF1	0x05E1	#	HEBREW LETTER SAMEKH
0xF2	0x05E2	#	HEBREW LETTER AYIN
0xF3	0x05E3	#	HEBREW LETTER FINAL PE
0xF4	0x05E4	#	HEBREW LETTER PE
0xF5	0x05E5	#	HEBREW LETTER FINAL TSADI
0xF6	0x05E6	#	HEBREW LETTER TSADI
0xF7	0x05E7	#	HEBREW LETTER QOF
0xF8	0x05E8	#	HEBREW LETTER RESH
0xF9	0x05E9	#	HEBREW LETTER SHIN
0xFA	0x05EA	#	HEBREW LETTER TAV
0xFD	0x200E	#	LEFT-TO-RIGHT MARK
0xFE	0x200F	#	RIGHT-TO-LEFT MARK

Added freshlib/data/_encodings/_sources/8859-9.TXT.

















































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
# 8859-9.TXT
# Date: 2015-12-02 21:51:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             ISO/IEC 8859-9:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             1999 July 27 (header updated: 2015 December 02)
#	Authors:          Ken Whistler <ken@unicode.org>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-9:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-9 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-9 order.
#
#	ISO/IEC 8859-9 is also equivalent to ISO-IR-148.
#
#	Version history
#   1.0 version: updates 0.1 version by adding mappings for all
#       control characters.
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x00A1	#	INVERTED EXCLAMATION MARK
0xA2	0x00A2	#	CENT SIGN
0xA3	0x00A3	#	POUND SIGN
0xA4	0x00A4	#	CURRENCY SIGN
0xA5	0x00A5	#	YEN SIGN
0xA6	0x00A6	#	BROKEN BAR
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x00A8	#	DIAERESIS
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x00AA	#	FEMININE ORDINAL INDICATOR
0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#	NOT SIGN
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x00AE	#	REGISTERED SIGN
0xAF	0x00AF	#	MACRON
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x00B1	#	PLUS-MINUS SIGN
0xB2	0x00B2	#	SUPERSCRIPT TWO
0xB3	0x00B3	#	SUPERSCRIPT THREE
0xB4	0x00B4	#	ACUTE ACCENT
0xB5	0x00B5	#	MICRO SIGN
0xB6	0x00B6	#	PILCROW SIGN
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x00B8	#	CEDILLA
0xB9	0x00B9	#	SUPERSCRIPT ONE
0xBA	0x00BA	#	MASCULINE ORDINAL INDICATOR
0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#	VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
0xBE	0x00BE	#	VULGAR FRACTION THREE QUARTERS
0xBF	0x00BF	#	INVERTED QUESTION MARK
0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x011E	#	LATIN CAPITAL LETTER G WITH BREVE
0xD1	0x00D1	#	LATIN CAPITAL LETTER N WITH TILDE
0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#	MULTIPLICATION SIGN
0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x0130	#	LATIN CAPITAL LETTER I WITH DOT ABOVE
0xDE	0x015E	#	LATIN CAPITAL LETTER S WITH CEDILLA
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#	LATIN SMALL LETTER AE
0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x011F	#	LATIN SMALL LETTER G WITH BREVE
0xF1	0x00F1	#	LATIN SMALL LETTER N WITH TILDE
0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#	DIVISION SIGN
0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x0131	#	LATIN SMALL LETTER DOTLESS I
0xFE	0x015F	#	LATIN SMALL LETTER S WITH CEDILLA
0xFF	0x00FF	#	LATIN SMALL LETTER Y WITH DIAERESIS


Added freshlib/data/_encodings/_sources/CP037.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp037_IBMUSCanada to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#    
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp037_IBMUSCanada code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp037_IBMUSCanada order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x009C	#CONTROL
0x05	0x0009	#HORIZONTAL TABULATION
0x06	0x0086	#CONTROL
0x07	0x007F	#DELETE
0x08	0x0097	#CONTROL
0x09	0x008D	#CONTROL
0x0A	0x008E	#CONTROL
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x009D	#CONTROL
0x15	0x0085	#CONTROL
0x16	0x0008	#BACKSPACE
0x17	0x0087	#CONTROL
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x0092	#CONTROL
0x1B	0x008F	#CONTROL
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0080	#CONTROL
0x21	0x0081	#CONTROL
0x22	0x0082	#CONTROL
0x23	0x0083	#CONTROL
0x24	0x0084	#CONTROL
0x25	0x000A	#LINE FEED
0x26	0x0017	#END OF TRANSMISSION BLOCK
0x27	0x001B	#ESCAPE
0x28	0x0088	#CONTROL
0x29	0x0089	#CONTROL
0x2A	0x008A	#CONTROL
0x2B	0x008B	#CONTROL
0x2C	0x008C	#CONTROL
0x2D	0x0005	#ENQUIRY
0x2E	0x0006	#ACKNOWLEDGE
0x2F	0x0007	#BELL
0x30	0x0090	#CONTROL
0x31	0x0091	#CONTROL
0x32	0x0016	#SYNCHRONOUS IDLE
0x33	0x0093	#CONTROL
0x34	0x0094	#CONTROL
0x35	0x0095	#CONTROL
0x36	0x0096	#CONTROL
0x37	0x0004	#END OF TRANSMISSION
0x38	0x0098	#CONTROL
0x39	0x0099	#CONTROL
0x3A	0x009A	#CONTROL
0x3B	0x009B	#CONTROL
0x3C	0x0014	#DEVICE CONTROL FOUR
0x3D	0x0015	#NEGATIVE ACKNOWLEDGE
0x3E	0x009E	#CONTROL
0x3F	0x001A	#SUBSTITUTE
0x40	0x0020	#SPACE
0x41	0x00A0	#NO-BREAK SPACE
0x42	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0x43	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
0x44	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
0x45	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
0x46	0x00E3	#LATIN SMALL LETTER A WITH TILDE
0x47	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
0x48	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
0x49	0x00F1	#LATIN SMALL LETTER N WITH TILDE
0x4A	0x00A2	#CENT SIGN
0x4B	0x002E	#FULL STOP
0x4C	0x003C	#LESS-THAN SIGN
0x4D	0x0028	#LEFT PARENTHESIS
0x4E	0x002B	#PLUS SIGN
0x4F	0x007C	#VERTICAL LINE
0x50	0x0026	#AMPERSAND
0x51	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0x52	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0x53	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
0x54	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
0x55	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
0x56	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0x57	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
0x58	0x00EC	#LATIN SMALL LETTER I WITH GRAVE
0x59	0x00DF	#LATIN SMALL LETTER SHARP S (GERMAN)
0x5A	0x0021	#EXCLAMATION MARK
0x5B	0x0024	#DOLLAR SIGN
0x5C	0x002A	#ASTERISK
0x5D	0x0029	#RIGHT PARENTHESIS
0x5E	0x003B	#SEMICOLON
0x5F	0x00AC	#NOT SIGN
0x60	0x002D	#HYPHEN-MINUS
0x61	0x002F	#SOLIDUS
0x62	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0x63	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0x64	0x00C0	#LATIN CAPITAL LETTER A WITH GRAVE
0x65	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
0x66	0x00C3	#LATIN CAPITAL LETTER A WITH TILDE
0x67	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0x68	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
0x69	0x00D1	#LATIN CAPITAL LETTER N WITH TILDE
0x6A	0x00A6	#BROKEN BAR
0x6B	0x002C	#COMMA
0x6C	0x0025	#PERCENT SIGN
0x6D	0x005F	#LOW LINE
0x6E	0x003E	#GREATER-THAN SIGN
0x6F	0x003F	#QUESTION MARK
0x70	0x00F8	#LATIN SMALL LETTER O WITH STROKE
0x71	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
0x72	0x00CA	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0x73	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
0x74	0x00C8	#LATIN CAPITAL LETTER E WITH GRAVE
0x75	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
0x76	0x00CE	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0x77	0x00CF	#LATIN CAPITAL LETTER I WITH DIAERESIS
0x78	0x00CC	#LATIN CAPITAL LETTER I WITH GRAVE
0x79	0x0060	#GRAVE ACCENT
0x7A	0x003A	#COLON
0x7B	0x0023	#NUMBER SIGN
0x7C	0x0040	#COMMERCIAL AT
0x7D	0x0027	#APOSTROPHE
0x7E	0x003D	#EQUALS SIGN
0x7F	0x0022	#QUOTATION MARK
0x80	0x00D8	#LATIN CAPITAL LETTER O WITH STROKE
0x81	0x0061	#LATIN SMALL LETTER A
0x82	0x0062	#LATIN SMALL LETTER B
0x83	0x0063	#LATIN SMALL LETTER C
0x84	0x0064	#LATIN SMALL LETTER D
0x85	0x0065	#LATIN SMALL LETTER E
0x86	0x0066	#LATIN SMALL LETTER F
0x87	0x0067	#LATIN SMALL LETTER G
0x88	0x0068	#LATIN SMALL LETTER H
0x89	0x0069	#LATIN SMALL LETTER I
0x8A	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0x8B	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0x8C	0x00F0	#LATIN SMALL LETTER ETH (ICELANDIC)
0x8D	0x00FD	#LATIN SMALL LETTER Y WITH ACUTE
0x8E	0x00FE	#LATIN SMALL LETTER THORN (ICELANDIC)
0x8F	0x00B1	#PLUS-MINUS SIGN
0x90	0x00B0	#DEGREE SIGN
0x91	0x006A	#LATIN SMALL LETTER J
0x92	0x006B	#LATIN SMALL LETTER K
0x93	0x006C	#LATIN SMALL LETTER L
0x94	0x006D	#LATIN SMALL LETTER M
0x95	0x006E	#LATIN SMALL LETTER N
0x96	0x006F	#LATIN SMALL LETTER O
0x97	0x0070	#LATIN SMALL LETTER P
0x98	0x0071	#LATIN SMALL LETTER Q
0x99	0x0072	#LATIN SMALL LETTER R
0x9A	0x00AA	#FEMININE ORDINAL INDICATOR
0x9B	0x00BA	#MASCULINE ORDINAL INDICATOR
0x9C	0x00E6	#LATIN SMALL LIGATURE AE
0x9D	0x00B8	#CEDILLA
0x9E	0x00C6	#LATIN CAPITAL LIGATURE AE
0x9F	0x00A4	#CURRENCY SIGN
0xA0	0x00B5	#MICRO SIGN
0xA1	0x007E	#TILDE
0xA2	0x0073	#LATIN SMALL LETTER S
0xA3	0x0074	#LATIN SMALL LETTER T
0xA4	0x0075	#LATIN SMALL LETTER U
0xA5	0x0076	#LATIN SMALL LETTER V
0xA6	0x0077	#LATIN SMALL LETTER W
0xA7	0x0078	#LATIN SMALL LETTER X
0xA8	0x0079	#LATIN SMALL LETTER Y
0xA9	0x007A	#LATIN SMALL LETTER Z
0xAA	0x00A1	#INVERTED EXCLAMATION MARK
0xAB	0x00BF	#INVERTED QUESTION MARK
0xAC	0x00D0	#LATIN CAPITAL LETTER ETH (ICELANDIC)
0xAD	0x00DD	#LATIN CAPITAL LETTER Y WITH ACUTE
0xAE	0x00DE	#LATIN CAPITAL LETTER THORN (ICELANDIC)
0xAF	0x00AE	#REGISTERED SIGN
0xB0	0x005E	#CIRCUMFLEX ACCENT
0xB1	0x00A3	#POUND SIGN
0xB2	0x00A5	#YEN SIGN
0xB3	0x00B7	#MIDDLE DOT
0xB4	0x00A9	#COPYRIGHT SIGN
0xB5	0x00A7	#SECTION SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00BC	#VULGAR FRACTION ONE QUARTER
0xB8	0x00BD	#VULGAR FRACTION ONE HALF
0xB9	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBA	0x005B	#LEFT SQUARE BRACKET
0xBB	0x005D	#RIGHT SQUARE BRACKET
0xBC	0x00AF	#MACRON
0xBD	0x00A8	#DIAERESIS
0xBE	0x00B4	#ACUTE ACCENT
0xBF	0x00D7	#MULTIPLICATION SIGN
0xC0	0x007B	#LEFT CURLY BRACKET
0xC1	0x0041	#LATIN CAPITAL LETTER A
0xC2	0x0042	#LATIN CAPITAL LETTER B
0xC3	0x0043	#LATIN CAPITAL LETTER C
0xC4	0x0044	#LATIN CAPITAL LETTER D
0xC5	0x0045	#LATIN CAPITAL LETTER E
0xC6	0x0046	#LATIN CAPITAL LETTER F
0xC7	0x0047	#LATIN CAPITAL LETTER G
0xC8	0x0048	#LATIN CAPITAL LETTER H
0xC9	0x0049	#LATIN CAPITAL LETTER I
0xCA	0x00AD	#SOFT HYPHEN
0xCB	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0xCC	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
0xCD	0x00F2	#LATIN SMALL LETTER O WITH GRAVE
0xCE	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
0xCF	0x00F5	#LATIN SMALL LETTER O WITH TILDE
0xD0	0x007D	#RIGHT CURLY BRACKET
0xD1	0x004A	#LATIN CAPITAL LETTER J
0xD2	0x004B	#LATIN CAPITAL LETTER K
0xD3	0x004C	#LATIN CAPITAL LETTER L
0xD4	0x004D	#LATIN CAPITAL LETTER M
0xD5	0x004E	#LATIN CAPITAL LETTER N
0xD6	0x004F	#LATIN CAPITAL LETTER O
0xD7	0x0050	#LATIN CAPITAL LETTER P
0xD8	0x0051	#LATIN CAPITAL LETTER Q
0xD9	0x0052	#LATIN CAPITAL LETTER R
0xDA	0x00B9	#SUPERSCRIPT ONE
0xDB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0xDC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xDD	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
0xDE	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
0xDF	0x00FF	#LATIN SMALL LETTER Y WITH DIAERESIS
0xE0	0x005C	#REVERSE SOLIDUS
0xE1	0x00F7	#DIVISION SIGN
0xE2	0x0053	#LATIN CAPITAL LETTER S
0xE3	0x0054	#LATIN CAPITAL LETTER T
0xE4	0x0055	#LATIN CAPITAL LETTER U
0xE5	0x0056	#LATIN CAPITAL LETTER V
0xE6	0x0057	#LATIN CAPITAL LETTER W
0xE7	0x0058	#LATIN CAPITAL LETTER X
0xE8	0x0059	#LATIN CAPITAL LETTER Y
0xE9	0x005A	#LATIN CAPITAL LETTER Z
0xEA	0x00B2	#SUPERSCRIPT TWO
0xEB	0x00D4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xEC	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0xED	0x00D2	#LATIN CAPITAL LETTER O WITH GRAVE
0xEE	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
0xEF	0x00D5	#LATIN CAPITAL LETTER O WITH TILDE
0xF0	0x0030	#DIGIT ZERO
0xF1	0x0031	#DIGIT ONE
0xF2	0x0032	#DIGIT TWO
0xF3	0x0033	#DIGIT THREE
0xF4	0x0034	#DIGIT FOUR
0xF5	0x0035	#DIGIT FIVE
0xF6	0x0036	#DIGIT SIX
0xF7	0x0037	#DIGIT SEVEN
0xF8	0x0038	#DIGIT EIGHT
0xF9	0x0039	#DIGIT NINE
0xFA	0x00B3	#SUPERSCRIPT THREE
0xFB	0x00DB	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xFC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
0xFD	0x00D9	#LATIN CAPITAL LETTER U WITH GRAVE
0xFE	0x00DA	#LATIN CAPITAL LETTER U WITH ACUTE
0xFF	0x009F	#CONTROL



Added freshlib/data/_encodings/_sources/CP1006.TXT.





























































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
#
#	Name:             IBM CP1006  to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             1999 July 27
#	Authors:          Ken Whistler <kenw@sybase.com>
#
#	Copyright (c) 1998 - 1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       IBM CP1006 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the CP1006 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in IBM CP1006 order.
#
#	Version history
#	1.0 version new. 
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x06F0	#	EXTENDED ARABIC-INDIC DIGIT ZERO
0xA2	0x06F1	#	EXTENDED ARABIC-INDIC DIGIT ONE
0xA3	0x06F2	#	EXTENDED ARABIC-INDIC DIGIT TWO
0xA4	0x06F3	#	EXTENDED ARABIC-INDIC DIGIT THREE
0xA5	0x06F4	#	EXTENDED ARABIC-INDIC DIGIT FOUR
0xA6	0x06F5	#	EXTENDED ARABIC-INDIC DIGIT FIVE
0xA7	0x06F6	#	EXTENDED ARABIC-INDIC DIGIT SIX
0xA8	0x06F7	#	EXTENDED ARABIC-INDIC DIGIT SEVEN
0xA9	0x06F8	#	EXTENDED ARABIC-INDIC DIGIT EIGHT
0xAA	0x06F9	#	EXTENDED ARABIC-INDIC DIGIT NINE
0xAB	0x060C	#	ARABIC COMMA
0xAC	0x061B	#	ARABIC SEMICOLON
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x061F	#	ARABIC QUESTION MARK
0xAF	0xFE81	#	ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
0xB0	0xFE8D	#	ARABIC LETTER ALEF ISOLATED FORM
0xB1	0xFE8E	#	ARABIC LETTER ALEF FINAL FORM
0xB2	0xFE8E	#	ARABIC LETTER ALEF FINAL FORM
0xB3	0xFE8F	#	ARABIC LETTER BEH ISOLATED FORM
0xB4	0xFE91	#	ARABIC LETTER BEH INITIAL FORM
0xB5	0xFB56	#	ARABIC LETTER PEH ISOLATED FORM
0xB6	0xFB58	#	ARABIC LETTER PEH INITIAL FORM
0xB7	0xFE93	#	ARABIC LETTER TEH MARBUTA ISOLATED FORM
0xB8	0xFE95	#	ARABIC LETTER TEH ISOLATED FORM
0xB9	0xFE97	#	ARABIC LETTER TEH INITIAL FORM
0xBA	0xFB66	#	ARABIC LETTER TTEH ISOLATED FORM
0xBB	0xFB68	#	ARABIC LETTER TTEH INITIAL FORM
0xBC	0xFE99	#	ARABIC LETTER THEH ISOLATED FORM
0xBD	0xFE9B	#	ARABIC LETTER THEH INITIAL FORM
0xBE	0xFE9D	#	ARABIC LETTER JEEM ISOLATED FORM
0xBF	0xFE9F	#	ARABIC LETTER JEEM INITIAL FORM
0xC0	0xFB7A	#	ARABIC LETTER TCHEH ISOLATED FORM
0xC1	0xFB7C	#	ARABIC LETTER TCHEH INITIAL FORM
0xC2	0xFEA1	#	ARABIC LETTER HAH ISOLATED FORM
0xC3	0xFEA3	#	ARABIC LETTER HAH INITIAL FORM
0xC4	0xFEA5	#	ARABIC LETTER KHAH ISOLATED FORM
0xC5	0xFEA7	#	ARABIC LETTER KHAH INITIAL FORM
0xC6	0xFEA9	#	ARABIC LETTER DAL ISOLATED FORM
0xC7	0xFB84	#	ARABIC LETTER DAHAL ISOLATED FORMN
0xC8	0xFEAB	#	ARABIC LETTER THAL ISOLATED FORM
0xC9	0xFEAD	#	ARABIC LETTER REH ISOLATED FORM
0xCA	0xFB8C	#	ARABIC LETTER RREH ISOLATED FORM
0xCB	0xFEAF	#	ARABIC LETTER ZAIN ISOLATED FORM
0xCC	0xFB8A	#	ARABIC LETTER JEH ISOLATED FORM
0xCD	0xFEB1	#	ARABIC LETTER SEEN ISOLATED FORM
0xCE	0xFEB3	#	ARABIC LETTER SEEN INITIAL FORM
0xCF	0xFEB5	#	ARABIC LETTER SHEEN ISOLATED FORM
0xD0	0xFEB7	#	ARABIC LETTER SHEEN INITIAL FORM
0xD1	0xFEB9	#	ARABIC LETTER SAD ISOLATED FORM
0xD2	0xFEBB	#	ARABIC LETTER SAD INITIAL FORM
0xD3	0xFEBD	#	ARABIC LETTER DAD ISOLATED FORM
0xD4	0xFEBF	#	ARABIC LETTER DAD INITIAL FORM
0xD5	0xFEC1	#	ARABIC LETTER TAH ISOLATED FORM
0xD6	0xFEC5	#	ARABIC LETTER ZAH ISOLATED FORM
0xD7	0xFEC9	#	ARABIC LETTER AIN ISOLATED FORM
0xD8	0xFECA	#	ARABIC LETTER AIN FINAL FORM
0xD9	0xFECB	#	ARABIC LETTER AIN INITIAL FORM
0xDA	0xFECC	#	ARABIC LETTER AIN MEDIAL FORM
0xDB	0xFECD	#	ARABIC LETTER GHAIN ISOLATED FORM
0xDC	0xFECE	#	ARABIC LETTER GHAIN FINAL FORM
0xDD	0xFECF	#	ARABIC LETTER GHAIN INITIAL FORM
0xDE	0xFED0	#	ARABIC LETTER GHAIN MEDIAL FORM
0xDF	0xFED1	#	ARABIC LETTER FEH ISOLATED FORM
0xE0	0xFED3	#	ARABIC LETTER FEH INITIAL FORM
0xE1	0xFED5	#	ARABIC LETTER QAF ISOLATED FORM
0xE2	0xFED7	#	ARABIC LETTER QAF INITIAL FORM
0xE3	0xFED9	#	ARABIC LETTER KAF ISOLATED FORM
0xE4	0xFEDB	#	ARABIC LETTER KAF INITIAL FORM
0xE5	0xFB92	#	ARABIC LETTER GAF ISOLATED FORM
0xE6	0xFB94	#	ARABIC LETTER GAF INITIAL FORM
0xE7	0xFEDD	#	ARABIC LETTER LAM ISOLATED FORM
0xE8	0xFEDF	#	ARABIC LETTER LAM INITIAL FORM
0xE9	0xFEE0	#	ARABIC LETTER LAM MEDIAL FORM
0xEA	0xFEE1	#	ARABIC LETTER MEEM ISOLATED FORM
0xEB	0xFEE3	#	ARABIC LETTER MEEM INITIAL FORM
0xEC	0xFB9E	#	ARABIC LETTER NOON GHUNNA ISOLATED FORM
0xED	0xFEE5	#	ARABIC LETTER NOON ISOLATED FORM
0xEE	0xFEE7	#	ARABIC LETTER NOON INITIAL FORM
0xEF	0xFE85	#	ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
0xF0	0xFEED	#	ARABIC LETTER WAW ISOLATED FORM
0xF1	0xFBA6	#	ARABIC LETTER HEH GOAL ISOLATED FORM
0xF2	0xFBA8	#	ARABIC LETTER HEH GOAL INITIAL FORM
0xF3	0xFBA9	#	ARABIC LETTER HEH GOAL MEDIAL FORM
0xF4	0xFBAA	#	ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
0xF5	0xFE80	#	ARABIC LETTER HAMZA ISOLATED FORM
0xF6	0xFE89	#	ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
0xF7	0xFE8A	#	ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
0xF8	0xFE8B	#	ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
0xF9	0xFEF1	#	ARABIC LETTER YEH ISOLATED FORM
0xFA	0xFEF2	#	ARABIC LETTER YEH FINAL FORM
0xFB	0xFEF3	#	ARABIC LETTER YEH INITIAL FORM
0xFC	0xFBB0	#	ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
0xFD	0xFBAE	#	ARABIC LETTER YEH BARREE ISOLATED FORM
0xFE	0xFE7C	#	ARABIC SHADDA ISOLATED FORM
0xFF	0xFE7D	#	ARABIC SHADDA MEDIAL FORM

Added freshlib/data/_encodings/_sources/CP1026.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp1026_IBMLatin5Turkish to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#         
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1026_IBMLatin5Turkish code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1026_IBMLatin5Turkish order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x009C	#CONTROL
0x05	0x0009	#HORIZONTAL TABULATION
0x06	0x0086	#CONTROL
0x07	0x007F	#DELETE
0x08	0x0097	#CONTROL
0x09	0x008D	#CONTROL
0x0A	0x008E	#CONTROL
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x009D	#CONTROL
0x15	0x0085	#CONTROL
0x16	0x0008	#BACKSPACE
0x17	0x0087	#CONTROL
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x0092	#CONTROL
0x1B	0x008F	#CONTROL
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0080	#CONTROL
0x21	0x0081	#CONTROL
0x22	0x0082	#CONTROL
0x23	0x0083	#CONTROL
0x24	0x0084	#CONTROL
0x25	0x000A	#LINE FEED
0x26	0x0017	#END OF TRANSMISSION BLOCK
0x27	0x001B	#ESCAPE
0x28	0x0088	#CONTROL
0x29	0x0089	#CONTROL
0x2A	0x008A	#CONTROL
0x2B	0x008B	#CONTROL
0x2C	0x008C	#CONTROL
0x2D	0x0005	#ENQUIRY
0x2E	0x0006	#ACKNOWLEDGE
0x2F	0x0007	#BELL
0x30	0x0090	#CONTROL
0x31	0x0091	#CONTROL
0x32	0x0016	#SYNCHRONOUS IDLE
0x33	0x0093	#CONTROL
0x34	0x0094	#CONTROL
0x35	0x0095	#CONTROL
0x36	0x0096	#CONTROL
0x37	0x0004	#END OF TRANSMISSION
0x38	0x0098	#CONTROL
0x39	0x0099	#CONTROL
0x3A	0x009A	#CONTROL
0x3B	0x009B	#CONTROL
0x3C	0x0014	#DEVICE CONTROL FOUR
0x3D	0x0015	#NEGATIVE ACKNOWLEDGE
0x3E	0x009E	#CONTROL
0x3F	0x001A	#SUBSTITUTE
0x40	0x0020	#SPACE
0x41	0x00A0	#NO-BREAK SPACE
0x42	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0x43	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
0x44	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
0x45	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
0x46	0x00E3	#LATIN SMALL LETTER A WITH TILDE
0x47	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
0x48	0x007B	#LEFT CURLY BRACKET
0x49	0x00F1	#LATIN SMALL LETTER N WITH TILDE
0x4A	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
0x4B	0x002E	#FULL STOP
0x4C	0x003C	#LESS-THAN SIGN
0x4D	0x0028	#LEFT PARENTHESIS
0x4E	0x002B	#PLUS SIGN
0x4F	0x0021	#EXCLAMATION MARK
0x50	0x0026	#AMPERSAND
0x51	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0x52	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0x53	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
0x54	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
0x55	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
0x56	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0x57	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
0x58	0x00EC	#LATIN SMALL LETTER I WITH GRAVE
0x59	0x00DF	#LATIN SMALL LETTER SHARP S (GERMAN)
0x5A	0x011E	#LATIN CAPITAL LETTER G WITH BREVE
0x5B	0x0130	#LATIN CAPITAL LETTER I WITH DOT ABOVE
0x5C	0x002A	#ASTERISK
0x5D	0x0029	#RIGHT PARENTHESIS
0x5E	0x003B	#SEMICOLON
0x5F	0x005E	#CIRCUMFLEX ACCENT
0x60	0x002D	#HYPHEN-MINUS
0x61	0x002F	#SOLIDUS
0x62	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0x63	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0x64	0x00C0	#LATIN CAPITAL LETTER A WITH GRAVE
0x65	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
0x66	0x00C3	#LATIN CAPITAL LETTER A WITH TILDE
0x67	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0x68	0x005B	#LEFT SQUARE BRACKET
0x69	0x00D1	#LATIN CAPITAL LETTER N WITH TILDE
0x6A	0x015F	#LATIN SMALL LETTER S WITH CEDILLA
0x6B	0x002C	#COMMA
0x6C	0x0025	#PERCENT SIGN
0x6D	0x005F	#LOW LINE
0x6E	0x003E	#GREATER-THAN SIGN
0x6F	0x003F	#QUESTION MARK
0x70	0x00F8	#LATIN SMALL LETTER O WITH STROKE
0x71	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
0x72	0x00CA	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0x73	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
0x74	0x00C8	#LATIN CAPITAL LETTER E WITH GRAVE
0x75	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
0x76	0x00CE	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0x77	0x00CF	#LATIN CAPITAL LETTER I WITH DIAERESIS
0x78	0x00CC	#LATIN CAPITAL LETTER I WITH GRAVE
0x79	0x0131	#LATIN SMALL LETTER DOTLESS I
0x7A	0x003A	#COLON
0x7B	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0x7C	0x015E	#LATIN CAPITAL LETTER S WITH CEDILLA
0x7D	0x0027	#APOSTROPHE
0x7E	0x003D	#EQUALS SIGN
0x7F	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
0x80	0x00D8	#LATIN CAPITAL LETTER O WITH STROKE
0x81	0x0061	#LATIN SMALL LETTER A
0x82	0x0062	#LATIN SMALL LETTER B
0x83	0x0063	#LATIN SMALL LETTER C
0x84	0x0064	#LATIN SMALL LETTER D
0x85	0x0065	#LATIN SMALL LETTER E
0x86	0x0066	#LATIN SMALL LETTER F
0x87	0x0067	#LATIN SMALL LETTER G
0x88	0x0068	#LATIN SMALL LETTER H
0x89	0x0069	#LATIN SMALL LETTER I
0x8A	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0x8B	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0x8C	0x007D	#RIGHT CURLY BRACKET
0x8D	0x0060	#GRAVE ACCENT
0x8E	0x00A6	#BROKEN BAR
0x8F	0x00B1	#PLUS-MINUS SIGN
0x90	0x00B0	#DEGREE SIGN
0x91	0x006A	#LATIN SMALL LETTER J
0x92	0x006B	#LATIN SMALL LETTER K
0x93	0x006C	#LATIN SMALL LETTER L
0x94	0x006D	#LATIN SMALL LETTER M
0x95	0x006E	#LATIN SMALL LETTER N
0x96	0x006F	#LATIN SMALL LETTER O
0x97	0x0070	#LATIN SMALL LETTER P
0x98	0x0071	#LATIN SMALL LETTER Q
0x99	0x0072	#LATIN SMALL LETTER R
0x9A	0x00AA	#FEMININE ORDINAL INDICATOR
0x9B	0x00BA	#MASCULINE ORDINAL INDICATOR
0x9C	0x00E6	#LATIN SMALL LIGATURE AE
0x9D	0x00B8	#CEDILLA
0x9E	0x00C6	#LATIN CAPITAL LIGATURE AE
0x9F	0x00A4	#CURRENCY SIGN
0xA0	0x00B5	#MICRO SIGN
0xA1	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
0xA2	0x0073	#LATIN SMALL LETTER S
0xA3	0x0074	#LATIN SMALL LETTER T
0xA4	0x0075	#LATIN SMALL LETTER U
0xA5	0x0076	#LATIN SMALL LETTER V
0xA6	0x0077	#LATIN SMALL LETTER W
0xA7	0x0078	#LATIN SMALL LETTER X
0xA8	0x0079	#LATIN SMALL LETTER Y
0xA9	0x007A	#LATIN SMALL LETTER Z
0xAA	0x00A1	#INVERTED EXCLAMATION MARK
0xAB	0x00BF	#INVERTED QUESTION MARK
0xAC	0x005D	#RIGHT SQUARE BRACKET
0xAD	0x0024	#DOLLAR SIGN
0xAE	0x0040	#COMMERCIAL AT
0xAF	0x00AE	#REGISTERED SIGN
0xB0	0x00A2	#CENT SIGN
0xB1	0x00A3	#POUND SIGN
0xB2	0x00A5	#YEN SIGN
0xB3	0x00B7	#MIDDLE DOT
0xB4	0x00A9	#COPYRIGHT SIGN
0xB5	0x00A7	#SECTION SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00BC	#VULGAR FRACTION ONE QUARTER
0xB8	0x00BD	#VULGAR FRACTION ONE HALF
0xB9	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBA	0x00AC	#NOT SIGN
0xBB	0x007C	#VERTICAL LINE
0xBC	0x00AF	#MACRON
0xBD	0x00A8	#DIAERESIS
0xBE	0x00B4	#ACUTE ACCENT
0xBF	0x00D7	#MULTIPLICATION SIGN
0xC0	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
0xC1	0x0041	#LATIN CAPITAL LETTER A
0xC2	0x0042	#LATIN CAPITAL LETTER B
0xC3	0x0043	#LATIN CAPITAL LETTER C
0xC4	0x0044	#LATIN CAPITAL LETTER D
0xC5	0x0045	#LATIN CAPITAL LETTER E
0xC6	0x0046	#LATIN CAPITAL LETTER F
0xC7	0x0047	#LATIN CAPITAL LETTER G
0xC8	0x0048	#LATIN CAPITAL LETTER H
0xC9	0x0049	#LATIN CAPITAL LETTER I
0xCA	0x00AD	#SOFT HYPHEN
0xCB	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0xCC	0x007E	#TILDE
0xCD	0x00F2	#LATIN SMALL LETTER O WITH GRAVE
0xCE	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
0xCF	0x00F5	#LATIN SMALL LETTER O WITH TILDE
0xD0	0x011F	#LATIN SMALL LETTER G WITH BREVE
0xD1	0x004A	#LATIN CAPITAL LETTER J
0xD2	0x004B	#LATIN CAPITAL LETTER K
0xD3	0x004C	#LATIN CAPITAL LETTER L
0xD4	0x004D	#LATIN CAPITAL LETTER M
0xD5	0x004E	#LATIN CAPITAL LETTER N
0xD6	0x004F	#LATIN CAPITAL LETTER O
0xD7	0x0050	#LATIN CAPITAL LETTER P
0xD8	0x0051	#LATIN CAPITAL LETTER Q
0xD9	0x0052	#LATIN CAPITAL LETTER R
0xDA	0x00B9	#SUPERSCRIPT ONE
0xDB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0xDC	0x005C	#REVERSE SOLIDUS
0xDD	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
0xDE	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
0xDF	0x00FF	#LATIN SMALL LETTER Y WITH DIAERESIS
0xE0	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xE1	0x00F7	#DIVISION SIGN
0xE2	0x0053	#LATIN CAPITAL LETTER S
0xE3	0x0054	#LATIN CAPITAL LETTER T
0xE4	0x0055	#LATIN CAPITAL LETTER U
0xE5	0x0056	#LATIN CAPITAL LETTER V
0xE6	0x0057	#LATIN CAPITAL LETTER W
0xE7	0x0058	#LATIN CAPITAL LETTER X
0xE8	0x0059	#LATIN CAPITAL LETTER Y
0xE9	0x005A	#LATIN CAPITAL LETTER Z
0xEA	0x00B2	#SUPERSCRIPT TWO
0xEB	0x00D4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xEC	0x0023	#NUMBER SIGN
0xED	0x00D2	#LATIN CAPITAL LETTER O WITH GRAVE
0xEE	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
0xEF	0x00D5	#LATIN CAPITAL LETTER O WITH TILDE
0xF0	0x0030	#DIGIT ZERO
0xF1	0x0031	#DIGIT ONE
0xF2	0x0032	#DIGIT TWO
0xF3	0x0033	#DIGIT THREE
0xF4	0x0034	#DIGIT FOUR
0xF5	0x0035	#DIGIT FIVE
0xF6	0x0036	#DIGIT SIX
0xF7	0x0037	#DIGIT SEVEN
0xF8	0x0038	#DIGIT EIGHT
0xF9	0x0039	#DIGIT NINE
0xFA	0x00B3	#SUPERSCRIPT THREE
0xFB	0x00DB	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xFC	0x0022	#QUOTATION MARK
0xFD	0x00D9	#LATIN CAPITAL LETTER U WITH GRAVE
0xFE	0x00DA	#LATIN CAPITAL LETTER U WITH ACUTE
0xFF	0x009F	#CONTROL



Added freshlib/data/_encodings/_sources/CP1250.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp1250 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/15/98
#
#    Contact:       Shawn.Steele@microsoft.com
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1250 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1250 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	      	#UNDEFINED
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	      	#UNDEFINED
0x89	0x2030	#PER MILLE SIGN
0x8A	0x0160	#LATIN CAPITAL LETTER S WITH CARON
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	0x015A	#LATIN CAPITAL LETTER S WITH ACUTE
0x8D	0x0164	#LATIN CAPITAL LETTER T WITH CARON
0x8E	0x017D	#LATIN CAPITAL LETTER Z WITH CARON
0x8F	0x0179	#LATIN CAPITAL LETTER Z WITH ACUTE
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	      	#UNDEFINED
0x99	0x2122	#TRADE MARK SIGN
0x9A	0x0161	#LATIN SMALL LETTER S WITH CARON
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	0x015B	#LATIN SMALL LETTER S WITH ACUTE
0x9D	0x0165	#LATIN SMALL LETTER T WITH CARON
0x9E	0x017E	#LATIN SMALL LETTER Z WITH CARON
0x9F	0x017A	#LATIN SMALL LETTER Z WITH ACUTE
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x02C7	#CARON
0xA2	0x02D8	#BREVE
0xA3	0x0141	#LATIN CAPITAL LETTER L WITH STROKE
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x0104	#LATIN CAPITAL LETTER A WITH OGONEK
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00A8	#DIAERESIS
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA	0x015E	#LATIN CAPITAL LETTER S WITH CEDILLA
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x017B	#LATIN CAPITAL LETTER Z WITH DOT ABOVE
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x02DB	#OGONEK
0xB3	0x0142	#LATIN SMALL LETTER L WITH STROKE
0xB4	0x00B4	#ACUTE ACCENT
0xB5	0x00B5	#MICRO SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00B7	#MIDDLE DOT
0xB8	0x00B8	#CEDILLA
0xB9	0x0105	#LATIN SMALL LETTER A WITH OGONEK
0xBA	0x015F	#LATIN SMALL LETTER S WITH CEDILLA
0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x013D	#LATIN CAPITAL LETTER L WITH CARON
0xBD	0x02DD	#DOUBLE ACUTE ACCENT
0xBE	0x013E	#LATIN SMALL LETTER L WITH CARON
0xBF	0x017C	#LATIN SMALL LETTER Z WITH DOT ABOVE
0xC0	0x0154	#LATIN CAPITAL LETTER R WITH ACUTE
0xC1	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x0102	#LATIN CAPITAL LETTER A WITH BREVE
0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x0139	#LATIN CAPITAL LETTER L WITH ACUTE
0xC6	0x0106	#LATIN CAPITAL LETTER C WITH ACUTE
0xC7	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x010C	#LATIN CAPITAL LETTER C WITH CARON
0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x0118	#LATIN CAPITAL LETTER E WITH OGONEK
0xCB	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x011A	#LATIN CAPITAL LETTER E WITH CARON
0xCD	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x010E	#LATIN CAPITAL LETTER D WITH CARON
0xD0	0x0110	#LATIN CAPITAL LETTER D WITH STROKE
0xD1	0x0143	#LATIN CAPITAL LETTER N WITH ACUTE
0xD2	0x0147	#LATIN CAPITAL LETTER N WITH CARON
0xD3	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x0150	#LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
0xD6	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#MULTIPLICATION SIGN
0xD8	0x0158	#LATIN CAPITAL LETTER R WITH CARON
0xD9	0x016E	#LATIN CAPITAL LETTER U WITH RING ABOVE
0xDA	0x00DA	#LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x0170	#LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
0xDC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x00DD	#LATIN CAPITAL LETTER Y WITH ACUTE
0xDE	0x0162	#LATIN CAPITAL LETTER T WITH CEDILLA
0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
0xE0	0x0155	#LATIN SMALL LETTER R WITH ACUTE
0xE1	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x0103	#LATIN SMALL LETTER A WITH BREVE
0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x013A	#LATIN SMALL LETTER L WITH ACUTE
0xE6	0x0107	#LATIN SMALL LETTER C WITH ACUTE
0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x010D	#LATIN SMALL LETTER C WITH CARON
0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0xEA	0x0119	#LATIN SMALL LETTER E WITH OGONEK
0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x011B	#LATIN SMALL LETTER E WITH CARON
0xED	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x010F	#LATIN SMALL LETTER D WITH CARON
0xF0	0x0111	#LATIN SMALL LETTER D WITH STROKE
0xF1	0x0144	#LATIN SMALL LETTER N WITH ACUTE
0xF2	0x0148	#LATIN SMALL LETTER N WITH CARON
0xF3	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x0151	#LATIN SMALL LETTER O WITH DOUBLE ACUTE
0xF6	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#DIVISION SIGN
0xF8	0x0159	#LATIN SMALL LETTER R WITH CARON
0xF9	0x016F	#LATIN SMALL LETTER U WITH RING ABOVE
0xFA	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
0xFB	0x0171	#LATIN SMALL LETTER U WITH DOUBLE ACUTE
0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x00FD	#LATIN SMALL LETTER Y WITH ACUTE
0xFE	0x0163	#LATIN SMALL LETTER T WITH CEDILLA
0xFF	0x02D9	#DOT ABOVE

Added freshlib/data/_encodings/_sources/CP1251.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp1251 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/15/98
#
#    Contact:       Shawn.Steele@microsoft.com
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1251 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1251 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	0x0402	#CYRILLIC CAPITAL LETTER DJE
0x81	0x0403	#CYRILLIC CAPITAL LETTER GJE
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0453	#CYRILLIC SMALL LETTER GJE
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	0x20AC	#EURO SIGN
0x89	0x2030	#PER MILLE SIGN
0x8A	0x0409	#CYRILLIC CAPITAL LETTER LJE
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	0x040A	#CYRILLIC CAPITAL LETTER NJE
0x8D	0x040C	#CYRILLIC CAPITAL LETTER KJE
0x8E	0x040B	#CYRILLIC CAPITAL LETTER TSHE
0x8F	0x040F	#CYRILLIC CAPITAL LETTER DZHE
0x90	0x0452	#CYRILLIC SMALL LETTER DJE
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	      	#UNDEFINED
0x99	0x2122	#TRADE MARK SIGN
0x9A	0x0459	#CYRILLIC SMALL LETTER LJE
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	0x045A	#CYRILLIC SMALL LETTER NJE
0x9D	0x045C	#CYRILLIC SMALL LETTER KJE
0x9E	0x045B	#CYRILLIC SMALL LETTER TSHE
0x9F	0x045F	#CYRILLIC SMALL LETTER DZHE
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x040E	#CYRILLIC CAPITAL LETTER SHORT U
0xA2	0x045E	#CYRILLIC SMALL LETTER SHORT U
0xA3	0x0408	#CYRILLIC CAPITAL LETTER JE
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x0490	#CYRILLIC CAPITAL LETTER GHE WITH UPTURN
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x0401	#CYRILLIC CAPITAL LETTER IO
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA	0x0404	#CYRILLIC CAPITAL LETTER UKRAINIAN IE
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x0407	#CYRILLIC CAPITAL LETTER YI
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x0406	#CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
0xB3	0x0456	#CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
0xB4	0x0491	#CYRILLIC SMALL LETTER GHE WITH UPTURN
0xB5	0x00B5	#MICRO SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00B7	#MIDDLE DOT
0xB8	0x0451	#CYRILLIC SMALL LETTER IO
0xB9	0x2116	#NUMERO SIGN
0xBA	0x0454	#CYRILLIC SMALL LETTER UKRAINIAN IE
0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x0458	#CYRILLIC SMALL LETTER JE
0xBD	0x0405	#CYRILLIC CAPITAL LETTER DZE
0xBE	0x0455	#CYRILLIC SMALL LETTER DZE
0xBF	0x0457	#CYRILLIC SMALL LETTER YI
0xC0	0x0410	#CYRILLIC CAPITAL LETTER A
0xC1	0x0411	#CYRILLIC CAPITAL LETTER BE
0xC2	0x0412	#CYRILLIC CAPITAL LETTER VE
0xC3	0x0413	#CYRILLIC CAPITAL LETTER GHE
0xC4	0x0414	#CYRILLIC CAPITAL LETTER DE
0xC5	0x0415	#CYRILLIC CAPITAL LETTER IE
0xC6	0x0416	#CYRILLIC CAPITAL LETTER ZHE
0xC7	0x0417	#CYRILLIC CAPITAL LETTER ZE
0xC8	0x0418	#CYRILLIC CAPITAL LETTER I
0xC9	0x0419	#CYRILLIC CAPITAL LETTER SHORT I
0xCA	0x041A	#CYRILLIC CAPITAL LETTER KA
0xCB	0x041B	#CYRILLIC CAPITAL LETTER EL
0xCC	0x041C	#CYRILLIC CAPITAL LETTER EM
0xCD	0x041D	#CYRILLIC CAPITAL LETTER EN
0xCE	0x041E	#CYRILLIC CAPITAL LETTER O
0xCF	0x041F	#CYRILLIC CAPITAL LETTER PE
0xD0	0x0420	#CYRILLIC CAPITAL LETTER ER
0xD1	0x0421	#CYRILLIC CAPITAL LETTER ES
0xD2	0x0422	#CYRILLIC CAPITAL LETTER TE
0xD3	0x0423	#CYRILLIC CAPITAL LETTER U
0xD4	0x0424	#CYRILLIC CAPITAL LETTER EF
0xD5	0x0425	#CYRILLIC CAPITAL LETTER HA
0xD6	0x0426	#CYRILLIC CAPITAL LETTER TSE
0xD7	0x0427	#CYRILLIC CAPITAL LETTER CHE
0xD8	0x0428	#CYRILLIC CAPITAL LETTER SHA
0xD9	0x0429	#CYRILLIC CAPITAL LETTER SHCHA
0xDA	0x042A	#CYRILLIC CAPITAL LETTER HARD SIGN
0xDB	0x042B	#CYRILLIC CAPITAL LETTER YERU
0xDC	0x042C	#CYRILLIC CAPITAL LETTER SOFT SIGN
0xDD	0x042D	#CYRILLIC CAPITAL LETTER E
0xDE	0x042E	#CYRILLIC CAPITAL LETTER YU
0xDF	0x042F	#CYRILLIC CAPITAL LETTER YA
0xE0	0x0430	#CYRILLIC SMALL LETTER A
0xE1	0x0431	#CYRILLIC SMALL LETTER BE
0xE2	0x0432	#CYRILLIC SMALL LETTER VE
0xE3	0x0433	#CYRILLIC SMALL LETTER GHE
0xE4	0x0434	#CYRILLIC SMALL LETTER DE
0xE5	0x0435	#CYRILLIC SMALL LETTER IE
0xE6	0x0436	#CYRILLIC SMALL LETTER ZHE
0xE7	0x0437	#CYRILLIC SMALL LETTER ZE
0xE8	0x0438	#CYRILLIC SMALL LETTER I
0xE9	0x0439	#CYRILLIC SMALL LETTER SHORT I
0xEA	0x043A	#CYRILLIC SMALL LETTER KA
0xEB	0x043B	#CYRILLIC SMALL LETTER EL
0xEC	0x043C	#CYRILLIC SMALL LETTER EM
0xED	0x043D	#CYRILLIC SMALL LETTER EN
0xEE	0x043E	#CYRILLIC SMALL LETTER O
0xEF	0x043F	#CYRILLIC SMALL LETTER PE
0xF0	0x0440	#CYRILLIC SMALL LETTER ER
0xF1	0x0441	#CYRILLIC SMALL LETTER ES
0xF2	0x0442	#CYRILLIC SMALL LETTER TE
0xF3	0x0443	#CYRILLIC SMALL LETTER U
0xF4	0x0444	#CYRILLIC SMALL LETTER EF
0xF5	0x0445	#CYRILLIC SMALL LETTER HA
0xF6	0x0446	#CYRILLIC SMALL LETTER TSE
0xF7	0x0447	#CYRILLIC SMALL LETTER CHE
0xF8	0x0448	#CYRILLIC SMALL LETTER SHA
0xF9	0x0449	#CYRILLIC SMALL LETTER SHCHA
0xFA	0x044A	#CYRILLIC SMALL LETTER HARD SIGN
0xFB	0x044B	#CYRILLIC SMALL LETTER YERU
0xFC	0x044C	#CYRILLIC SMALL LETTER SOFT SIGN
0xFD	0x044D	#CYRILLIC SMALL LETTER E
0xFE	0x044E	#CYRILLIC SMALL LETTER YU
0xFF	0x044F	#CYRILLIC SMALL LETTER YA

Added freshlib/data/_encodings/_sources/CP1252.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp1252 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/15/98
#
#    Contact:       Shawn.Steele@microsoft.com
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1252 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1252 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
0x89	0x2030	#PER MILLE SIGN
0x8A	0x0160	#LATIN CAPITAL LETTER S WITH CARON
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	0x0152	#LATIN CAPITAL LIGATURE OE
0x8D	      	#UNDEFINED
0x8E	0x017D	#LATIN CAPITAL LETTER Z WITH CARON
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	0x02DC	#SMALL TILDE
0x99	0x2122	#TRADE MARK SIGN
0x9A	0x0161	#LATIN SMALL LETTER S WITH CARON
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	0x0153	#LATIN SMALL LIGATURE OE
0x9D	      	#UNDEFINED
0x9E	0x017E	#LATIN SMALL LETTER Z WITH CARON
0x9F	0x0178	#LATIN CAPITAL LETTER Y WITH DIAERESIS
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x00A1	#INVERTED EXCLAMATION MARK
0xA2	0x00A2	#CENT SIGN
0xA3	0x00A3	#POUND SIGN
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x00A5	#YEN SIGN
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00A8	#DIAERESIS
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA	0x00AA	#FEMININE ORDINAL INDICATOR
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x00AF	#MACRON
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x00B2	#SUPERSCRIPT TWO
0xB3	0x00B3	#SUPERSCRIPT THREE
0xB4	0x00B4	#ACUTE ACCENT
0xB5	0x00B5	#MICRO SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00B7	#MIDDLE DOT
0xB8	0x00B8	#CEDILLA
0xB9	0x00B9	#SUPERSCRIPT ONE
0xBA	0x00BA	#MASCULINE ORDINAL INDICATOR
0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#VULGAR FRACTION ONE HALF
0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBF	0x00BF	#INVERTED QUESTION MARK
0xC0	0x00C0	#LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#LATIN CAPITAL LETTER AE
0xC7	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x00D0	#LATIN CAPITAL LETTER ETH
0xD1	0x00D1	#LATIN CAPITAL LETTER N WITH TILDE
0xD2	0x00D2	#LATIN CAPITAL LETTER O WITH GRAVE
0xD3	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x00D5	#LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#MULTIPLICATION SIGN
0xD8	0x00D8	#LATIN CAPITAL LETTER O WITH STROKE
0xD9	0x00D9	#LATIN CAPITAL LETTER U WITH GRAVE
0xDA	0x00DA	#LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x00DD	#LATIN CAPITAL LETTER Y WITH ACUTE
0xDE	0x00DE	#LATIN CAPITAL LETTER THORN
0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#LATIN SMALL LETTER AE
0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x00F0	#LATIN SMALL LETTER ETH
0xF1	0x00F1	#LATIN SMALL LETTER N WITH TILDE
0xF2	0x00F2	#LATIN SMALL LETTER O WITH GRAVE
0xF3	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x00F5	#LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#DIVISION SIGN
0xF8	0x00F8	#LATIN SMALL LETTER O WITH STROKE
0xF9	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x00FD	#LATIN SMALL LETTER Y WITH ACUTE
0xFE	0x00FE	#LATIN SMALL LETTER THORN
0xFF	0x00FF	#LATIN SMALL LETTER Y WITH DIAERESIS

Added freshlib/data/_encodings/_sources/CP1253.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp1253 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/15/98
#
#    Contact:       Shawn.Steele@microsoft.com
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1253 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1253 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	      	#UNDEFINED
0x89	0x2030	#PER MILLE SIGN
0x8A	      	#UNDEFINED
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	      	#UNDEFINED
0x8D	      	#UNDEFINED
0x8E	      	#UNDEFINED
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	      	#UNDEFINED
0x99	0x2122	#TRADE MARK SIGN
0x9A	      	#UNDEFINED
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	      	#UNDEFINED
0x9D	      	#UNDEFINED
0x9E	      	#UNDEFINED
0x9F	      	#UNDEFINED
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x0385	#GREEK DIALYTIKA TONOS
0xA2	0x0386	#GREEK CAPITAL LETTER ALPHA WITH TONOS
0xA3	0x00A3	#POUND SIGN
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x00A5	#YEN SIGN
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00A8	#DIAERESIS
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA	      	#UNDEFINED
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x2015	#HORIZONTAL BAR
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x00B2	#SUPERSCRIPT TWO
0xB3	0x00B3	#SUPERSCRIPT THREE
0xB4	0x0384	#GREEK TONOS
0xB5	0x00B5	#MICRO SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00B7	#MIDDLE DOT
0xB8	0x0388	#GREEK CAPITAL LETTER EPSILON WITH TONOS
0xB9	0x0389	#GREEK CAPITAL LETTER ETA WITH TONOS
0xBA	0x038A	#GREEK CAPITAL LETTER IOTA WITH TONOS
0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x038C	#GREEK CAPITAL LETTER OMICRON WITH TONOS
0xBD	0x00BD	#VULGAR FRACTION ONE HALF
0xBE	0x038E	#GREEK CAPITAL LETTER UPSILON WITH TONOS
0xBF	0x038F	#GREEK CAPITAL LETTER OMEGA WITH TONOS
0xC0	0x0390	#GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
0xC1	0x0391	#GREEK CAPITAL LETTER ALPHA
0xC2	0x0392	#GREEK CAPITAL LETTER BETA
0xC3	0x0393	#GREEK CAPITAL LETTER GAMMA
0xC4	0x0394	#GREEK CAPITAL LETTER DELTA
0xC5	0x0395	#GREEK CAPITAL LETTER EPSILON
0xC6	0x0396	#GREEK CAPITAL LETTER ZETA
0xC7	0x0397	#GREEK CAPITAL LETTER ETA
0xC8	0x0398	#GREEK CAPITAL LETTER THETA
0xC9	0x0399	#GREEK CAPITAL LETTER IOTA
0xCA	0x039A	#GREEK CAPITAL LETTER KAPPA
0xCB	0x039B	#GREEK CAPITAL LETTER LAMDA
0xCC	0x039C	#GREEK CAPITAL LETTER MU
0xCD	0x039D	#GREEK CAPITAL LETTER NU
0xCE	0x039E	#GREEK CAPITAL LETTER XI
0xCF	0x039F	#GREEK CAPITAL LETTER OMICRON
0xD0	0x03A0	#GREEK CAPITAL LETTER PI
0xD1	0x03A1	#GREEK CAPITAL LETTER RHO
0xD2	      	#UNDEFINED
0xD3	0x03A3	#GREEK CAPITAL LETTER SIGMA
0xD4	0x03A4	#GREEK CAPITAL LETTER TAU
0xD5	0x03A5	#GREEK CAPITAL LETTER UPSILON
0xD6	0x03A6	#GREEK CAPITAL LETTER PHI
0xD7	0x03A7	#GREEK CAPITAL LETTER CHI
0xD8	0x03A8	#GREEK CAPITAL LETTER PSI
0xD9	0x03A9	#GREEK CAPITAL LETTER OMEGA
0xDA	0x03AA	#GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
0xDB	0x03AB	#GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
0xDC	0x03AC	#GREEK SMALL LETTER ALPHA WITH TONOS
0xDD	0x03AD	#GREEK SMALL LETTER EPSILON WITH TONOS
0xDE	0x03AE	#GREEK SMALL LETTER ETA WITH TONOS
0xDF	0x03AF	#GREEK SMALL LETTER IOTA WITH TONOS
0xE0	0x03B0	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
0xE1	0x03B1	#GREEK SMALL LETTER ALPHA
0xE2	0x03B2	#GREEK SMALL LETTER BETA
0xE3	0x03B3	#GREEK SMALL LETTER GAMMA
0xE4	0x03B4	#GREEK SMALL LETTER DELTA
0xE5	0x03B5	#GREEK SMALL LETTER EPSILON
0xE6	0x03B6	#GREEK SMALL LETTER ZETA
0xE7	0x03B7	#GREEK SMALL LETTER ETA
0xE8	0x03B8	#GREEK SMALL LETTER THETA
0xE9	0x03B9	#GREEK SMALL LETTER IOTA
0xEA	0x03BA	#GREEK SMALL LETTER KAPPA
0xEB	0x03BB	#GREEK SMALL LETTER LAMDA
0xEC	0x03BC	#GREEK SMALL LETTER MU
0xED	0x03BD	#GREEK SMALL LETTER NU
0xEE	0x03BE	#GREEK SMALL LETTER XI
0xEF	0x03BF	#GREEK SMALL LETTER OMICRON
0xF0	0x03C0	#GREEK SMALL LETTER PI
0xF1	0x03C1	#GREEK SMALL LETTER RHO
0xF2	0x03C2	#GREEK SMALL LETTER FINAL SIGMA
0xF3	0x03C3	#GREEK SMALL LETTER SIGMA
0xF4	0x03C4	#GREEK SMALL LETTER TAU
0xF5	0x03C5	#GREEK SMALL LETTER UPSILON
0xF6	0x03C6	#GREEK SMALL LETTER PHI
0xF7	0x03C7	#GREEK SMALL LETTER CHI
0xF8	0x03C8	#GREEK SMALL LETTER PSI
0xF9	0x03C9	#GREEK SMALL LETTER OMEGA
0xFA	0x03CA	#GREEK SMALL LETTER IOTA WITH DIALYTIKA
0xFB	0x03CB	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA
0xFC	0x03CC	#GREEK SMALL LETTER OMICRON WITH TONOS
0xFD	0x03CD	#GREEK SMALL LETTER UPSILON WITH TONOS
0xFE	0x03CE	#GREEK SMALL LETTER OMEGA WITH TONOS
0xFF	      	#UNDEFINED

Added freshlib/data/_encodings/_sources/CP1254.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp1254 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/15/98
#
#    Contact:       Shawn.Steele@microsoft.com
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1254 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1254 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
0x89	0x2030	#PER MILLE SIGN
0x8A	0x0160	#LATIN CAPITAL LETTER S WITH CARON
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	0x0152	#LATIN CAPITAL LIGATURE OE
0x8D	      	#UNDEFINED
0x8E	      	#UNDEFINED
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	0x02DC	#SMALL TILDE
0x99	0x2122	#TRADE MARK SIGN
0x9A	0x0161	#LATIN SMALL LETTER S WITH CARON
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	0x0153	#LATIN SMALL LIGATURE OE
0x9D	      	#UNDEFINED
0x9E	      	#UNDEFINED
0x9F	0x0178	#LATIN CAPITAL LETTER Y WITH DIAERESIS
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x00A1	#INVERTED EXCLAMATION MARK
0xA2	0x00A2	#CENT SIGN
0xA3	0x00A3	#POUND SIGN
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x00A5	#YEN SIGN
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00A8	#DIAERESIS
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA	0x00AA	#FEMININE ORDINAL INDICATOR
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x00AF	#MACRON
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x00B2	#SUPERSCRIPT TWO
0xB3	0x00B3	#SUPERSCRIPT THREE
0xB4	0x00B4	#ACUTE ACCENT
0xB5	0x00B5	#MICRO SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00B7	#MIDDLE DOT
0xB8	0x00B8	#CEDILLA
0xB9	0x00B9	#SUPERSCRIPT ONE
0xBA	0x00BA	#MASCULINE ORDINAL INDICATOR
0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#VULGAR FRACTION ONE HALF
0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBF	0x00BF	#INVERTED QUESTION MARK
0xC0	0x00C0	#LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#LATIN CAPITAL LETTER AE
0xC7	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x011E	#LATIN CAPITAL LETTER G WITH BREVE
0xD1	0x00D1	#LATIN CAPITAL LETTER N WITH TILDE
0xD2	0x00D2	#LATIN CAPITAL LETTER O WITH GRAVE
0xD3	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x00D5	#LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#MULTIPLICATION SIGN
0xD8	0x00D8	#LATIN CAPITAL LETTER O WITH STROKE
0xD9	0x00D9	#LATIN CAPITAL LETTER U WITH GRAVE
0xDA	0x00DA	#LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x0130	#LATIN CAPITAL LETTER I WITH DOT ABOVE
0xDE	0x015E	#LATIN CAPITAL LETTER S WITH CEDILLA
0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#LATIN SMALL LETTER AE
0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x011F	#LATIN SMALL LETTER G WITH BREVE
0xF1	0x00F1	#LATIN SMALL LETTER N WITH TILDE
0xF2	0x00F2	#LATIN SMALL LETTER O WITH GRAVE
0xF3	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x00F5	#LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#DIVISION SIGN
0xF8	0x00F8	#LATIN SMALL LETTER O WITH STROKE
0xF9	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x0131	#LATIN SMALL LETTER DOTLESS I
0xFE	0x015F	#LATIN SMALL LETTER S WITH CEDILLA
0xFF	0x00FF	#LATIN SMALL LETTER Y WITH DIAERESIS

Added freshlib/data/_encodings/_sources/CP1255.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp1255 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.01
#    Table format:  Format A
#    Date:          1/7/2000
#
#    Contact:       Shawn.Steele@microsoft.com
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1255 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1255 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
0x89	0x2030	#PER MILLE SIGN
0x8A	      	#UNDEFINED
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	      	#UNDEFINED
0x8D	      	#UNDEFINED
0x8E	      	#UNDEFINED
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	0x02DC	#SMALL TILDE
0x99	0x2122	#TRADE MARK SIGN
0x9A	      	#UNDEFINED
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	      	#UNDEFINED
0x9D	      	#UNDEFINED
0x9E	      	#UNDEFINED
0x9F	      	#UNDEFINED
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x00A1	#INVERTED EXCLAMATION MARK
0xA2	0x00A2	#CENT SIGN
0xA3	0x00A3	#POUND SIGN
0xA4	0x20AA	#NEW SHEQEL SIGN
0xA5	0x00A5	#YEN SIGN
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00A8	#DIAERESIS
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA	0x00D7	#MULTIPLICATION SIGN
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x00AF	#MACRON
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x00B2	#SUPERSCRIPT TWO
0xB3	0x00B3	#SUPERSCRIPT THREE
0xB4	0x00B4	#ACUTE ACCENT
0xB5	0x00B5	#MICRO SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00B7	#MIDDLE DOT
0xB8	0x00B8	#CEDILLA
0xB9	0x00B9	#SUPERSCRIPT ONE
0xBA	0x00F7	#DIVISION SIGN
0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#VULGAR FRACTION ONE HALF
0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBF	0x00BF	#INVERTED QUESTION MARK
0xC0	0x05B0	#HEBREW POINT SHEVA
0xC1	0x05B1	#HEBREW POINT HATAF SEGOL
0xC2	0x05B2	#HEBREW POINT HATAF PATAH
0xC3	0x05B3	#HEBREW POINT HATAF QAMATS
0xC4	0x05B4	#HEBREW POINT HIRIQ
0xC5	0x05B5	#HEBREW POINT TSERE
0xC6	0x05B6	#HEBREW POINT SEGOL
0xC7	0x05B7	#HEBREW POINT PATAH
0xC8	0x05B8	#HEBREW POINT QAMATS
0xC9	0x05B9	#HEBREW POINT HOLAM
0xCA		#UNDEFINED
0xCB	0x05BB	#HEBREW POINT QUBUTS
0xCC	0x05BC	#HEBREW POINT DAGESH OR MAPIQ
0xCD	0x05BD	#HEBREW POINT METEG
0xCE	0x05BE	#HEBREW PUNCTUATION MAQAF
0xCF	0x05BF	#HEBREW POINT RAFE
0xD0	0x05C0	#HEBREW PUNCTUATION PASEQ
0xD1	0x05C1	#HEBREW POINT SHIN DOT
0xD2	0x05C2	#HEBREW POINT SIN DOT
0xD3	0x05C3	#HEBREW PUNCTUATION SOF PASUQ
0xD4	0x05F0	#HEBREW LIGATURE YIDDISH DOUBLE VAV
0xD5	0x05F1	#HEBREW LIGATURE YIDDISH VAV YOD
0xD6	0x05F2	#HEBREW LIGATURE YIDDISH DOUBLE YOD
0xD7	0x05F3	#HEBREW PUNCTUATION GERESH
0xD8	0x05F4	#HEBREW PUNCTUATION GERSHAYIM
0xD9	      	#UNDEFINED
0xDA	      	#UNDEFINED
0xDB	      	#UNDEFINED
0xDC	      	#UNDEFINED
0xDD	      	#UNDEFINED
0xDE	      	#UNDEFINED
0xDF	      	#UNDEFINED
0xE0	0x05D0	#HEBREW LETTER ALEF
0xE1	0x05D1	#HEBREW LETTER BET
0xE2	0x05D2	#HEBREW LETTER GIMEL
0xE3	0x05D3	#HEBREW LETTER DALET
0xE4	0x05D4	#HEBREW LETTER HE
0xE5	0x05D5	#HEBREW LETTER VAV
0xE6	0x05D6	#HEBREW LETTER ZAYIN
0xE7	0x05D7	#HEBREW LETTER HET
0xE8	0x05D8	#HEBREW LETTER TET
0xE9	0x05D9	#HEBREW LETTER YOD
0xEA	0x05DA	#HEBREW LETTER FINAL KAF
0xEB	0x05DB	#HEBREW LETTER KAF
0xEC	0x05DC	#HEBREW LETTER LAMED
0xED	0x05DD	#HEBREW LETTER FINAL MEM
0xEE	0x05DE	#HEBREW LETTER MEM
0xEF	0x05DF	#HEBREW LETTER FINAL NUN
0xF0	0x05E0	#HEBREW LETTER NUN
0xF1	0x05E1	#HEBREW LETTER SAMEKH
0xF2	0x05E2	#HEBREW LETTER AYIN
0xF3	0x05E3	#HEBREW LETTER FINAL PE
0xF4	0x05E4	#HEBREW LETTER PE
0xF5	0x05E5	#HEBREW LETTER FINAL TSADI
0xF6	0x05E6	#HEBREW LETTER TSADI
0xF7	0x05E7	#HEBREW LETTER QOF
0xF8	0x05E8	#HEBREW LETTER RESH
0xF9	0x05E9	#HEBREW LETTER SHIN
0xFA	0x05EA	#HEBREW LETTER TAV
0xFB	      	#UNDEFINED
0xFC	      	#UNDEFINED
0xFD	0x200E	#LEFT-TO-RIGHT MARK
0xFE	0x200F	#RIGHT-TO-LEFT MARK
0xFF	      	#UNDEFINED

Added freshlib/data/_encodings/_sources/CP1256.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp1256 to Unicode table
#    Unicode version: 2.1
#    Table version: 2.01
#    Table format:  Format A
#    Date:          01/5/99
#
#    Contact:       Shawn.Steele@microsoft.com
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1256 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1256 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	0x20AC	#EURO SIGN
0x81	0x067E	#ARABIC LETTER PEH
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
0x89	0x2030	#PER MILLE SIGN
0x8A	0x0679	#ARABIC LETTER TTEH
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	0x0152	#LATIN CAPITAL LIGATURE OE
0x8D	0x0686	#ARABIC LETTER TCHEH
0x8E	0x0698	#ARABIC LETTER JEH
0x8F	0x0688	#ARABIC LETTER DDAL
0x90	0x06AF	#ARABIC LETTER GAF
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	0x06A9	#ARABIC LETTER KEHEH
0x99	0x2122	#TRADE MARK SIGN
0x9A	0x0691	#ARABIC LETTER RREH
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	0x0153	#LATIN SMALL LIGATURE OE
0x9D	0x200C	#ZERO WIDTH NON-JOINER
0x9E	0x200D	#ZERO WIDTH JOINER
0x9F	0x06BA	#ARABIC LETTER NOON GHUNNA
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x060C	#ARABIC COMMA
0xA2	0x00A2	#CENT SIGN
0xA3	0x00A3	#POUND SIGN
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x00A5	#YEN SIGN
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00A8	#DIAERESIS
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA	0x06BE	#ARABIC LETTER HEH DOACHASHMEE
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x00AF	#MACRON
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x00B2	#SUPERSCRIPT TWO
0xB3	0x00B3	#SUPERSCRIPT THREE
0xB4	0x00B4	#ACUTE ACCENT
0xB5	0x00B5	#MICRO SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00B7	#MIDDLE DOT
0xB8	0x00B8	#CEDILLA
0xB9	0x00B9	#SUPERSCRIPT ONE
0xBA	0x061B	#ARABIC SEMICOLON
0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#VULGAR FRACTION ONE HALF
0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBF	0x061F	#ARABIC QUESTION MARK
0xC0	0x06C1	#ARABIC LETTER HEH GOAL
0xC1	0x0621	#ARABIC LETTER HAMZA
0xC2	0x0622	#ARABIC LETTER ALEF WITH MADDA ABOVE
0xC3	0x0623	#ARABIC LETTER ALEF WITH HAMZA ABOVE
0xC4	0x0624	#ARABIC LETTER WAW WITH HAMZA ABOVE
0xC5	0x0625	#ARABIC LETTER ALEF WITH HAMZA BELOW
0xC6	0x0626	#ARABIC LETTER YEH WITH HAMZA ABOVE
0xC7	0x0627	#ARABIC LETTER ALEF
0xC8	0x0628	#ARABIC LETTER BEH
0xC9	0x0629	#ARABIC LETTER TEH MARBUTA
0xCA	0x062A	#ARABIC LETTER TEH
0xCB	0x062B	#ARABIC LETTER THEH
0xCC	0x062C	#ARABIC LETTER JEEM
0xCD	0x062D	#ARABIC LETTER HAH
0xCE	0x062E	#ARABIC LETTER KHAH
0xCF	0x062F	#ARABIC LETTER DAL
0xD0	0x0630	#ARABIC LETTER THAL
0xD1	0x0631	#ARABIC LETTER REH
0xD2	0x0632	#ARABIC LETTER ZAIN
0xD3	0x0633	#ARABIC LETTER SEEN
0xD4	0x0634	#ARABIC LETTER SHEEN
0xD5	0x0635	#ARABIC LETTER SAD
0xD6	0x0636	#ARABIC LETTER DAD
0xD7	0x00D7	#MULTIPLICATION SIGN
0xD8	0x0637	#ARABIC LETTER TAH
0xD9	0x0638	#ARABIC LETTER ZAH
0xDA	0x0639	#ARABIC LETTER AIN
0xDB	0x063A	#ARABIC LETTER GHAIN
0xDC	0x0640	#ARABIC TATWEEL
0xDD	0x0641	#ARABIC LETTER FEH
0xDE	0x0642	#ARABIC LETTER QAF
0xDF	0x0643	#ARABIC LETTER KAF
0xE0	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
0xE1	0x0644	#ARABIC LETTER LAM
0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x0645	#ARABIC LETTER MEEM
0xE4	0x0646	#ARABIC LETTER NOON
0xE5	0x0647	#ARABIC LETTER HEH
0xE6	0x0648	#ARABIC LETTER WAW
0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x0649	#ARABIC LETTER ALEF MAKSURA
0xED	0x064A	#ARABIC LETTER YEH
0xEE	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x064B	#ARABIC FATHATAN
0xF1	0x064C	#ARABIC DAMMATAN
0xF2	0x064D	#ARABIC KASRATAN
0xF3	0x064E	#ARABIC FATHA
0xF4	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x064F	#ARABIC DAMMA
0xF6	0x0650	#ARABIC KASRA
0xF7	0x00F7	#DIVISION SIGN
0xF8	0x0651	#ARABIC SHADDA
0xF9	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
0xFA	0x0652	#ARABIC SUKUN
0xFB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x200E	#LEFT-TO-RIGHT MARK
0xFE	0x200F	#RIGHT-TO-LEFT MARK
0xFF	0x06D2	#ARABIC LETTER YEH BARREE

Added freshlib/data/_encodings/_sources/CP1257.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp1257 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/15/98
#
#    Contact:       Shawn.Steele@microsoft.com
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1257 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1257 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	      	#UNDEFINED
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	      	#UNDEFINED
0x89	0x2030	#PER MILLE SIGN
0x8A	      	#UNDEFINED
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	      	#UNDEFINED
0x8D	0x00A8	#DIAERESIS
0x8E	0x02C7	#CARON
0x8F	0x00B8	#CEDILLA
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	      	#UNDEFINED
0x99	0x2122	#TRADE MARK SIGN
0x9A	      	#UNDEFINED
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	      	#UNDEFINED
0x9D	0x00AF	#MACRON
0x9E	0x02DB	#OGONEK
0x9F	      	#UNDEFINED
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	      	#UNDEFINED
0xA2	0x00A2	#CENT SIGN
0xA3	0x00A3	#POUND SIGN
0xA4	0x00A4	#CURRENCY SIGN
0xA5	      	#UNDEFINED
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00D8	#LATIN CAPITAL LETTER O WITH STROKE
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA	0x0156	#LATIN CAPITAL LETTER R WITH CEDILLA
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x00C6	#LATIN CAPITAL LETTER AE
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x00B2	#SUPERSCRIPT TWO
0xB3	0x00B3	#SUPERSCRIPT THREE
0xB4	0x00B4	#ACUTE ACCENT
0xB5	0x00B5	#MICRO SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00B7	#MIDDLE DOT
0xB8	0x00F8	#LATIN SMALL LETTER O WITH STROKE
0xB9	0x00B9	#SUPERSCRIPT ONE
0xBA	0x0157	#LATIN SMALL LETTER R WITH CEDILLA
0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#VULGAR FRACTION ONE HALF
0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBF	0x00E6	#LATIN SMALL LETTER AE
0xC0	0x0104	#LATIN CAPITAL LETTER A WITH OGONEK
0xC1	0x012E	#LATIN CAPITAL LETTER I WITH OGONEK
0xC2	0x0100	#LATIN CAPITAL LETTER A WITH MACRON
0xC3	0x0106	#LATIN CAPITAL LETTER C WITH ACUTE
0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x0118	#LATIN CAPITAL LETTER E WITH OGONEK
0xC7	0x0112	#LATIN CAPITAL LETTER E WITH MACRON
0xC8	0x010C	#LATIN CAPITAL LETTER C WITH CARON
0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x0179	#LATIN CAPITAL LETTER Z WITH ACUTE
0xCB	0x0116	#LATIN CAPITAL LETTER E WITH DOT ABOVE
0xCC	0x0122	#LATIN CAPITAL LETTER G WITH CEDILLA
0xCD	0x0136	#LATIN CAPITAL LETTER K WITH CEDILLA
0xCE	0x012A	#LATIN CAPITAL LETTER I WITH MACRON
0xCF	0x013B	#LATIN CAPITAL LETTER L WITH CEDILLA
0xD0	0x0160	#LATIN CAPITAL LETTER S WITH CARON
0xD1	0x0143	#LATIN CAPITAL LETTER N WITH ACUTE
0xD2	0x0145	#LATIN CAPITAL LETTER N WITH CEDILLA
0xD3	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x014C	#LATIN CAPITAL LETTER O WITH MACRON
0xD5	0x00D5	#LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#MULTIPLICATION SIGN
0xD8	0x0172	#LATIN CAPITAL LETTER U WITH OGONEK
0xD9	0x0141	#LATIN CAPITAL LETTER L WITH STROKE
0xDA	0x015A	#LATIN CAPITAL LETTER S WITH ACUTE
0xDB	0x016A	#LATIN CAPITAL LETTER U WITH MACRON
0xDC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x017B	#LATIN CAPITAL LETTER Z WITH DOT ABOVE
0xDE	0x017D	#LATIN CAPITAL LETTER Z WITH CARON
0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
0xE0	0x0105	#LATIN SMALL LETTER A WITH OGONEK
0xE1	0x012F	#LATIN SMALL LETTER I WITH OGONEK
0xE2	0x0101	#LATIN SMALL LETTER A WITH MACRON
0xE3	0x0107	#LATIN SMALL LETTER C WITH ACUTE
0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x0119	#LATIN SMALL LETTER E WITH OGONEK
0xE7	0x0113	#LATIN SMALL LETTER E WITH MACRON
0xE8	0x010D	#LATIN SMALL LETTER C WITH CARON
0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0xEA	0x017A	#LATIN SMALL LETTER Z WITH ACUTE
0xEB	0x0117	#LATIN SMALL LETTER E WITH DOT ABOVE
0xEC	0x0123	#LATIN SMALL LETTER G WITH CEDILLA
0xED	0x0137	#LATIN SMALL LETTER K WITH CEDILLA
0xEE	0x012B	#LATIN SMALL LETTER I WITH MACRON
0xEF	0x013C	#LATIN SMALL LETTER L WITH CEDILLA
0xF0	0x0161	#LATIN SMALL LETTER S WITH CARON
0xF1	0x0144	#LATIN SMALL LETTER N WITH ACUTE
0xF2	0x0146	#LATIN SMALL LETTER N WITH CEDILLA
0xF3	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
0xF4	0x014D	#LATIN SMALL LETTER O WITH MACRON
0xF5	0x00F5	#LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#DIVISION SIGN
0xF8	0x0173	#LATIN SMALL LETTER U WITH OGONEK
0xF9	0x0142	#LATIN SMALL LETTER L WITH STROKE
0xFA	0x015B	#LATIN SMALL LETTER S WITH ACUTE
0xFB	0x016B	#LATIN SMALL LETTER U WITH MACRON
0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x017C	#LATIN SMALL LETTER Z WITH DOT ABOVE
0xFE	0x017E	#LATIN SMALL LETTER Z WITH CARON
0xFF	0x02D9	#DOT ABOVE

Added freshlib/data/_encodings/_sources/CP1258.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp1258 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/15/98
#
#    Contact:       Shawn.Steele@microsoft.com
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1258 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1258 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
0x89	0x2030	#PER MILLE SIGN
0x8A	      	#UNDEFINED
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	0x0152	#LATIN CAPITAL LIGATURE OE
0x8D	      	#UNDEFINED
0x8E	      	#UNDEFINED
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	0x02DC	#SMALL TILDE
0x99	0x2122	#TRADE MARK SIGN
0x9A	      	#UNDEFINED
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	0x0153	#LATIN SMALL LIGATURE OE
0x9D	      	#UNDEFINED
0x9E	      	#UNDEFINED
0x9F	0x0178	#LATIN CAPITAL LETTER Y WITH DIAERESIS
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x00A1	#INVERTED EXCLAMATION MARK
0xA2	0x00A2	#CENT SIGN
0xA3	0x00A3	#POUND SIGN
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x00A5	#YEN SIGN
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00A8	#DIAERESIS
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA	0x00AA	#FEMININE ORDINAL INDICATOR
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x00AF	#MACRON
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x00B2	#SUPERSCRIPT TWO
0xB3	0x00B3	#SUPERSCRIPT THREE
0xB4	0x00B4	#ACUTE ACCENT
0xB5	0x00B5	#MICRO SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00B7	#MIDDLE DOT
0xB8	0x00B8	#CEDILLA
0xB9	0x00B9	#SUPERSCRIPT ONE
0xBA	0x00BA	#MASCULINE ORDINAL INDICATOR
0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#VULGAR FRACTION ONE HALF
0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBF	0x00BF	#INVERTED QUESTION MARK
0xC0	0x00C0	#LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x0102	#LATIN CAPITAL LETTER A WITH BREVE
0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#LATIN CAPITAL LETTER AE
0xC7	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x0300	#COMBINING GRAVE ACCENT
0xCD	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x0110	#LATIN CAPITAL LETTER D WITH STROKE
0xD1	0x00D1	#LATIN CAPITAL LETTER N WITH TILDE
0xD2	0x0309	#COMBINING HOOK ABOVE
0xD3	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x01A0	#LATIN CAPITAL LETTER O WITH HORN
0xD6	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#MULTIPLICATION SIGN
0xD8	0x00D8	#LATIN CAPITAL LETTER O WITH STROKE
0xD9	0x00D9	#LATIN CAPITAL LETTER U WITH GRAVE
0xDA	0x00DA	#LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x01AF	#LATIN CAPITAL LETTER U WITH HORN
0xDE	0x0303	#COMBINING TILDE
0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x0103	#LATIN SMALL LETTER A WITH BREVE
0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#LATIN SMALL LETTER AE
0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x0301	#COMBINING ACUTE ACCENT
0xED	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x0111	#LATIN SMALL LETTER D WITH STROKE
0xF1	0x00F1	#LATIN SMALL LETTER N WITH TILDE
0xF2	0x0323	#COMBINING DOT BELOW
0xF3	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x01A1	#LATIN SMALL LETTER O WITH HORN
0xF6	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#DIVISION SIGN
0xF8	0x00F8	#LATIN SMALL LETTER O WITH STROKE
0xF9	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x01B0	#LATIN SMALL LETTER U WITH HORN
0xFE	0x20AB	#DONG SIGN
0xFF	0x00FF	#LATIN SMALL LETTER Y WITH DIAERESIS

Added freshlib/data/_encodings/_sources/CP424.TXT.

































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
#
#    Name:     IBM EBCDIC CP424 (Hebrew) to Unicode table
#    Unicode version: 3.0
#    Table version: 1.0
#    Table format:  Format A
#    Date:          1999 July 27
#    Authors:       Ken Whistler <kenw@sybase.com>
#
#	Copyright (c) 1998 - 1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       CP424 characters map into Unicode.
#
#    Format: Three tab-separated columns
#        Column #1 is the CP424 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#		(or for EBCDIC controls, the EBCDIC name in C1 space)
#
#    The entries are in CP424 order
#
#	Version history
#	1.0 version new.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x009C	#SELECT
0x05	0x0009	#HORIZONTAL TABULATION
0x06	0x0086	#REQUIRED NEW LINE
0x07	0x007F	#DELETE
0x08	0x0097	#GRAPHIC ESCAPE
0x09	0x008D	#SUPERSCRIPT
0x0A	0x008E	#REPEAT
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x009D	#RESTORE/ENABLE PRESENTATION
0x15	0x0085	#NEW LINE
0x16	0x0008	#BACKSPACE
0x17	0x0087	#PROGRAM OPERATOR COMMUNICATION
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x0092	#UNIT BACK SPACE
0x1B	0x008F	#CUSTOMER USE ONE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0080	#DIGIT SELECT
0x21	0x0081	#START OF SIGNIFICANCE
0x22	0x0082	#FIELD SEPARATOR
0x23	0x0083	#WORD UNDERSCORE
0x24	0x0084	#BYPASS OR INHIBIT PRESENTATION
0x25	0x000A	#LINE FEED
0x26	0x0017	#END OF TRANSMISSION BLOCK
0x27	0x001B	#ESCAPE
0x28	0x0088	#SET ATTRIBUTE
0x29	0x0089	#START FIELD EXTENDED
0x2A	0x008A	#SET MODE OR SWITCH
0x2B	0x008B	#CONTROL SEQUENCE PREFIX
0x2C	0x008C	#MODIFY FIELD ATTRIBUTE
0x2D	0x0005	#ENQUIRY
0x2E	0x0006	#ACKNOWLEDGE
0x2F	0x0007	#BELL
0x30	0x0090	#<reserved>
0x31	0x0091	#<reserved>
0x32	0x0016	#SYNCHRONOUS IDLE
0x33	0x0093	#INDEX RETURN
0x34	0x0094	#PRESENTATION POSITION
0x35	0x0095	#TRANSPARENT
0x36	0x0096	#NUMERIC BACKSPACE
0x37	0x0004	#END OF TRANSMISSION
0x38	0x0098	#SUBSCRIPT
0x39	0x0099	#INDENT TABULATION
0x3A	0x009A	#REVERSE FORM FEED
0x3B	0x009B	#CUSTOMER USE THREE
0x3C	0x0014	#DEVICE CONTROL FOUR
0x3D	0x0015	#NEGATIVE ACKNOWLEDGE
0x3E	0x009E	#<reserved>
0x3F	0x001A	#SUBSTITUTE

0x40	0x0020	#SPACE
0x41	0x05D0	#HEBREW LETTER ALEF
0x42	0x05D1	#HEBREW LETTER BET
0x43	0x05D2	#HEBREW LETTER GIMEL
0x44	0x05D3	#HEBREW LETTER DALET
0x45	0x05D4	#HEBREW LETTER HE
0x46	0x05D5	#HEBREW LETTER VAV
0x47	0x05D6	#HEBREW LETTER ZAYIN
0x48	0x05D7	#HEBREW LETTER HET
0x49	0x05D8	#HEBREW LETTER TET
0x4A	0x00A2	#CENT SIGN
0x4B	0x002E	#FULL STOP
0x4C	0x003C	#LESS-THAN SIGN
0x4D	0x0028	#LEFT PARENTHESIS
0x4E	0x002B	#PLUS SIGN
0x4F	0x007C	#VERTICAL LINE
0x50	0x0026	#AMPERSAND
0x51	0x05D9	#HEBREW LETTER YOD
0x52	0x05DA	#HEBREW LETTER FINAL KAF
0x53	0x05DB	#HEBREW LETTER KAF
0x54	0x05DC	#HEBREW LETTER LAMED
0x55	0x05DD	#HEBREW LETTER FINAL MEM
0x56	0x05DE	#HEBREW LETTER MEM
0x57	0x05DF	#HEBREW LETTER FINAL NUN
0x58	0x05E0	#HEBREW LETTER NUN
0x59	0x05E1	#HEBREW LETTER SAMEKH
0x5A	0x0021	#EXCLAMATION MARK
0x5B	0x0024	#DOLLAR SIGN
0x5C	0x002A	#ASTERISK
0x5D	0x0029	#RIGHT PARENTHESIS
0x5E	0x003B	#SEMICOLON
0x5F	0x00AC	#NOT SIGN
0x60	0x002D	#HYPHEN-MINUS
0x61	0x002F	#SOLIDUS
0x62	0x05E2	#HEBREW LETTER AYIN
0x63	0x05E3	#HEBREW LETTER FINAL PE
0x64	0x05E4	#HEBREW LETTER PE
0x65	0x05E5	#HEBREW LETTER FINAL TSADI
0x66	0x05E6	#HEBREW LETTER TSADI
0x67	0x05E7	#HEBREW LETTER QOF
0x68	0x05E8	#HEBREW LETTER RESH
0x69	0x05E9	#HEBREW LETTER SHIN
0x6A	0x00A6	#BROKEN BAR
0x6B	0x002C	#COMMA
0x6C	0x0025	#PERCENT SIGN
0x6D	0x005F	#LOW LINE
0x6E	0x003E	#GREATER-THAN SIGN
0x6F	0x003F	#QUESTION MARK
0x70		#UNDEFINED
0x71	0x05EA	#HEBREW LETTER TAV
0x72		#UNDEFINED
0x73		#UNDEFINED
0x74	0x00A0	#NO-BREAK SPACE
0x75		#UNDEFINED
0x76		#UNDEFINED
0x77		#UNDEFINED
0x78	0x2017	#DOUBLE LOW LINE
0x79	0x0060	#GRAVE ACCENT
0x7A	0x003A	#COLON
0x7B	0x0023	#NUMBER SIGN
0x7C	0x0040	#COMMERCIAL AT
0x7D	0x0027	#APOSTROPHE
0x7E	0x003D	#EQUALS SIGN
0x7F	0x0022	#QUOTATION MARK
0x80		#UNDEFINED
0x81	0x0061	#LATIN SMALL LETTER A
0x82	0x0062	#LATIN SMALL LETTER B
0x83	0x0063	#LATIN SMALL LETTER C
0x84	0x0064	#LATIN SMALL LETTER D
0x85	0x0065	#LATIN SMALL LETTER E
0x86	0x0066	#LATIN SMALL LETTER F
0x87	0x0067	#LATIN SMALL LETTER G
0x88	0x0068	#LATIN SMALL LETTER H
0x89	0x0069	#LATIN SMALL LETTER I
0x8A	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0x8B	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0x8C		#UNDEFINED
0x8D		#UNDEFINED
0x8E		#UNDEFINED
0x8F	0x00B1	#PLUS-MINUS SIGN
0x90	0x00B0	#DEGREE SIGN
0x91	0x006A	#LATIN SMALL LETTER J
0x92	0x006B	#LATIN SMALL LETTER K
0x93	0x006C	#LATIN SMALL LETTER L
0x94	0x006D	#LATIN SMALL LETTER M
0x95	0x006E	#LATIN SMALL LETTER N
0x96	0x006F	#LATIN SMALL LETTER O
0x97	0x0070	#LATIN SMALL LETTER P
0x98	0x0071	#LATIN SMALL LETTER Q
0x99	0x0072	#LATIN SMALL LETTER R
0x9A		#UNDEFINED
0x9B		#UNDEFINED
0x9C		#UNDEFINED
0x9D	0x00B8	#CEDILLA
0x9E		#UNDEFINED
0x9F	0x00A4	#CURRENCY SIGN
0xA0	0x00B5	#MICRO SIGN
0xA1	0x007E	#TILDE
0xA2	0x0073	#LATIN SMALL LETTER S
0xA3	0x0074	#LATIN SMALL LETTER T
0xA4	0x0075	#LATIN SMALL LETTER U
0xA5	0x0076	#LATIN SMALL LETTER V
0xA6	0x0077	#LATIN SMALL LETTER W
0xA7	0x0078	#LATIN SMALL LETTER X
0xA8	0x0079	#LATIN SMALL LETTER Y
0xA9	0x007A	#LATIN SMALL LETTER Z
0xAA		#UNDEFINED
0xAB		#UNDEFINED
0xAC		#UNDEFINED
0xAD		#UNDEFINED
0xAE		#UNDEFINED
0xAF	0x00AE	#REGISTERED SIGN
0xB0	0x005E	#CIRCUMFLEX ACCENT
0xB1	0x00A3	#POUND SIGN
0xB2	0x00A5	#YEN SIGN
0xB3	0x00B7	#MIDDLE DOT
0xB4	0x00A9	#COPYRIGHT SIGN
0xB5	0x00A7	#SECTION SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00BC	#VULGAR FRACTION ONE QUARTER
0xB8	0x00BD	#VULGAR FRACTION ONE HALF
0xB9	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBA	0x005B	#LEFT SQUARE BRACKET
0xBB	0x005D	#RIGHT SQUARE BRACKET
0xBC	0x00AF	#MACRON
0xBD	0x00A8	#DIAERESIS
0xBE	0x00B4	#ACUTE ACCENT
0xBF	0x00D7	#MULTIPLICATION SIGN
0xC0	0x007B	#LEFT CURLY BRACKET
0xC1	0x0041	#LATIN CAPITAL LETTER A
0xC2	0x0042	#LATIN CAPITAL LETTER B
0xC3	0x0043	#LATIN CAPITAL LETTER C
0xC4	0x0044	#LATIN CAPITAL LETTER D
0xC5	0x0045	#LATIN CAPITAL LETTER E
0xC6	0x0046	#LATIN CAPITAL LETTER F
0xC7	0x0047	#LATIN CAPITAL LETTER G
0xC8	0x0048	#LATIN CAPITAL LETTER H
0xC9	0x0049	#LATIN CAPITAL LETTER I
0xCA	0x00AD	#SOFT HYPHEN
0xCB		#UNDEFINED
0xCC		#UNDEFINED
0xCD		#UNDEFINED
0xCE		#UNDEFINED
0xCF		#UNDEFINED
0xD0	0x007D	#RIGHT CURLY BRACKET
0xD1	0x004A	#LATIN CAPITAL LETTER J
0xD2	0x004B	#LATIN CAPITAL LETTER K
0xD3	0x004C	#LATIN CAPITAL LETTER L
0xD4	0x004D	#LATIN CAPITAL LETTER M
0xD5	0x004E	#LATIN CAPITAL LETTER N
0xD6	0x004F	#LATIN CAPITAL LETTER O
0xD7	0x0050	#LATIN CAPITAL LETTER P
0xD8	0x0051	#LATIN CAPITAL LETTER Q
0xD9	0x0052	#LATIN CAPITAL LETTER R
0xDA	0x00B9	#SUPERSCRIPT ONE
0xDB		#UNDEFINED
0xDC		#UNDEFINED
0xDD		#UNDEFINED
0xDE		#UNDEFINED
0xDF		#UNDEFINED
0xE0	0x005C	#REVERSE SOLIDUS
0xE1	0x00F7	#DIVISION SIGN
0xE2	0x0053	#LATIN CAPITAL LETTER S
0xE3	0x0054	#LATIN CAPITAL LETTER T
0xE4	0x0055	#LATIN CAPITAL LETTER U
0xE5	0x0056	#LATIN CAPITAL LETTER V
0xE6	0x0057	#LATIN CAPITAL LETTER W
0xE7	0x0058	#LATIN CAPITAL LETTER X
0xE8	0x0059	#LATIN CAPITAL LETTER Y
0xE9	0x005A	#LATIN CAPITAL LETTER Z
0xEA	0x00B2	#SUPERSCRIPT TWO
0xEB		#UNDEFINED
0xEC		#UNDEFINED
0xED		#UNDEFINED
0xEE		#UNDEFINED
0xEF		#UNDEFINED
0xF0	0x0030	#DIGIT ZERO
0xF1	0x0031	#DIGIT ONE
0xF2	0x0032	#DIGIT TWO
0xF3	0x0033	#DIGIT THREE
0xF4	0x0034	#DIGIT FOUR
0xF5	0x0035	#DIGIT FIVE
0xF6	0x0036	#DIGIT SIX
0xF7	0x0037	#DIGIT SEVEN
0xF8	0x0038	#DIGIT EIGHT
0xF9	0x0039	#DIGIT NINE
0xFA	0x00B3	#SUPERSCRIPT THREE
0xFB		#UNDEFINED
0xFC		#UNDEFINED
0xFD		#UNDEFINED
0xFE		#UNDEFINED
0xFF	0x009F	#EIGHT ONES

Added freshlib/data/_encodings/_sources/CP437.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp437_DOSLatinUS to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp437_DOSLatinUS code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp437_DOSLatinUS order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
0x86	0x00e5	#LATIN SMALL LETTER A WITH RING ABOVE
0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
0x8b	0x00ef	#LATIN SMALL LETTER I WITH DIAERESIS
0x8c	0x00ee	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0x8d	0x00ec	#LATIN SMALL LETTER I WITH GRAVE
0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0x8f	0x00c5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
0x91	0x00e6	#LATIN SMALL LIGATURE AE
0x92	0x00c6	#LATIN CAPITAL LIGATURE AE
0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
0x95	0x00f2	#LATIN SMALL LETTER O WITH GRAVE
0x96	0x00fb	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0x97	0x00f9	#LATIN SMALL LETTER U WITH GRAVE
0x98	0x00ff	#LATIN SMALL LETTER Y WITH DIAERESIS
0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
0x9b	0x00a2	#CENT SIGN
0x9c	0x00a3	#POUND SIGN
0x9d	0x00a5	#YEN SIGN
0x9e	0x20a7	#PESETA SIGN
0x9f	0x0192	#LATIN SMALL LETTER F WITH HOOK
0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
0xa4	0x00f1	#LATIN SMALL LETTER N WITH TILDE
0xa5	0x00d1	#LATIN CAPITAL LETTER N WITH TILDE
0xa6	0x00aa	#FEMININE ORDINAL INDICATOR
0xa7	0x00ba	#MASCULINE ORDINAL INDICATOR
0xa8	0x00bf	#INVERTED QUESTION MARK
0xa9	0x2310	#REVERSED NOT SIGN
0xaa	0x00ac	#NOT SIGN
0xab	0x00bd	#VULGAR FRACTION ONE HALF
0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
0xad	0x00a1	#INVERTED EXCLAMATION MARK
0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x258c	#LEFT HALF BLOCK
0xde	0x2590	#RIGHT HALF BLOCK
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x03b1	#GREEK SMALL LETTER ALPHA
0xe1	0x00df	#LATIN SMALL LETTER SHARP S
0xe2	0x0393	#GREEK CAPITAL LETTER GAMMA
0xe3	0x03c0	#GREEK SMALL LETTER PI
0xe4	0x03a3	#GREEK CAPITAL LETTER SIGMA
0xe5	0x03c3	#GREEK SMALL LETTER SIGMA
0xe6	0x00b5	#MICRO SIGN
0xe7	0x03c4	#GREEK SMALL LETTER TAU
0xe8	0x03a6	#GREEK CAPITAL LETTER PHI
0xe9	0x0398	#GREEK CAPITAL LETTER THETA
0xea	0x03a9	#GREEK CAPITAL LETTER OMEGA
0xeb	0x03b4	#GREEK SMALL LETTER DELTA
0xec	0x221e	#INFINITY
0xed	0x03c6	#GREEK SMALL LETTER PHI
0xee	0x03b5	#GREEK SMALL LETTER EPSILON
0xef	0x2229	#INTERSECTION
0xf0	0x2261	#IDENTICAL TO
0xf1	0x00b1	#PLUS-MINUS SIGN
0xf2	0x2265	#GREATER-THAN OR EQUAL TO
0xf3	0x2264	#LESS-THAN OR EQUAL TO
0xf4	0x2320	#TOP HALF INTEGRAL
0xf5	0x2321	#BOTTOM HALF INTEGRAL
0xf6	0x00f7	#DIVISION SIGN
0xf7	0x2248	#ALMOST EQUAL TO
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x2219	#BULLET OPERATOR
0xfa	0x00b7	#MIDDLE DOT
0xfb	0x221a	#SQUARE ROOT
0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
0xfd	0x00b2	#SUPERSCRIPT TWO
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE


Added freshlib/data/_encodings/_sources/CP500.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp500_IBMInternational to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp500_IBMInternational code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp500_IBMInternational order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x009C	#CONTROL
0x05	0x0009	#HORIZONTAL TABULATION
0x06	0x0086	#CONTROL
0x07	0x007F	#DELETE
0x08	0x0097	#CONTROL
0x09	0x008D	#CONTROL
0x0A	0x008E	#CONTROL
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x009D	#CONTROL
0x15	0x0085	#CONTROL
0x16	0x0008	#BACKSPACE
0x17	0x0087	#CONTROL
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x0092	#CONTROL
0x1B	0x008F	#CONTROL
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0080	#CONTROL
0x21	0x0081	#CONTROL
0x22	0x0082	#CONTROL
0x23	0x0083	#CONTROL
0x24	0x0084	#CONTROL
0x25	0x000A	#LINE FEED
0x26	0x0017	#END OF TRANSMISSION BLOCK
0x27	0x001B	#ESCAPE
0x28	0x0088	#CONTROL
0x29	0x0089	#CONTROL
0x2A	0x008A	#CONTROL
0x2B	0x008B	#CONTROL
0x2C	0x008C	#CONTROL
0x2D	0x0005	#ENQUIRY
0x2E	0x0006	#ACKNOWLEDGE
0x2F	0x0007	#BELL
0x30	0x0090	#CONTROL
0x31	0x0091	#CONTROL
0x32	0x0016	#SYNCHRONOUS IDLE
0x33	0x0093	#CONTROL
0x34	0x0094	#CONTROL
0x35	0x0095	#CONTROL
0x36	0x0096	#CONTROL
0x37	0x0004	#END OF TRANSMISSION
0x38	0x0098	#CONTROL
0x39	0x0099	#CONTROL
0x3A	0x009A	#CONTROL
0x3B	0x009B	#CONTROL
0x3C	0x0014	#DEVICE CONTROL FOUR
0x3D	0x0015	#NEGATIVE ACKNOWLEDGE
0x3E	0x009E	#CONTROL
0x3F	0x001A	#SUBSTITUTE
0x40	0x0020	#SPACE
0x41	0x00A0	#NO-BREAK SPACE
0x42	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0x43	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
0x44	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
0x45	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
0x46	0x00E3	#LATIN SMALL LETTER A WITH TILDE
0x47	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
0x48	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
0x49	0x00F1	#LATIN SMALL LETTER N WITH TILDE
0x4A	0x005B	#LEFT SQUARE BRACKET
0x4B	0x002E	#FULL STOP
0x4C	0x003C	#LESS-THAN SIGN
0x4D	0x0028	#LEFT PARENTHESIS
0x4E	0x002B	#PLUS SIGN
0x4F	0x0021	#EXCLAMATION MARK
0x50	0x0026	#AMPERSAND
0x51	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0x52	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0x53	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
0x54	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
0x55	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
0x56	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0x57	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
0x58	0x00EC	#LATIN SMALL LETTER I WITH GRAVE
0x59	0x00DF	#LATIN SMALL LETTER SHARP S (GERMAN)
0x5A	0x005D	#RIGHT SQUARE BRACKET
0x5B	0x0024	#DOLLAR SIGN
0x5C	0x002A	#ASTERISK
0x5D	0x0029	#RIGHT PARENTHESIS
0x5E	0x003B	#SEMICOLON
0x5F	0x005E	#CIRCUMFLEX ACCENT
0x60	0x002D	#HYPHEN-MINUS
0x61	0x002F	#SOLIDUS
0x62	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0x63	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0x64	0x00C0	#LATIN CAPITAL LETTER A WITH GRAVE
0x65	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
0x66	0x00C3	#LATIN CAPITAL LETTER A WITH TILDE
0x67	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0x68	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
0x69	0x00D1	#LATIN CAPITAL LETTER N WITH TILDE
0x6A	0x00A6	#BROKEN BAR
0x6B	0x002C	#COMMA
0x6C	0x0025	#PERCENT SIGN
0x6D	0x005F	#LOW LINE
0x6E	0x003E	#GREATER-THAN SIGN
0x6F	0x003F	#QUESTION MARK
0x70	0x00F8	#LATIN SMALL LETTER O WITH STROKE
0x71	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
0x72	0x00CA	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0x73	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
0x74	0x00C8	#LATIN CAPITAL LETTER E WITH GRAVE
0x75	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
0x76	0x00CE	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0x77	0x00CF	#LATIN CAPITAL LETTER I WITH DIAERESIS
0x78	0x00CC	#LATIN CAPITAL LETTER I WITH GRAVE
0x79	0x0060	#GRAVE ACCENT
0x7A	0x003A	#COLON
0x7B	0x0023	#NUMBER SIGN
0x7C	0x0040	#COMMERCIAL AT
0x7D	0x0027	#APOSTROPHE
0x7E	0x003D	#EQUALS SIGN
0x7F	0x0022	#QUOTATION MARK
0x80	0x00D8	#LATIN CAPITAL LETTER O WITH STROKE
0x81	0x0061	#LATIN SMALL LETTER A
0x82	0x0062	#LATIN SMALL LETTER B
0x83	0x0063	#LATIN SMALL LETTER C
0x84	0x0064	#LATIN SMALL LETTER D
0x85	0x0065	#LATIN SMALL LETTER E
0x86	0x0066	#LATIN SMALL LETTER F
0x87	0x0067	#LATIN SMALL LETTER G
0x88	0x0068	#LATIN SMALL LETTER H
0x89	0x0069	#LATIN SMALL LETTER I
0x8A	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0x8B	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0x8C	0x00F0	#LATIN SMALL LETTER ETH (ICELANDIC)
0x8D	0x00FD	#LATIN SMALL LETTER Y WITH ACUTE
0x8E	0x00FE	#LATIN SMALL LETTER THORN (ICELANDIC)
0x8F	0x00B1	#PLUS-MINUS SIGN
0x90	0x00B0	#DEGREE SIGN
0x91	0x006A	#LATIN SMALL LETTER J
0x92	0x006B	#LATIN SMALL LETTER K
0x93	0x006C	#LATIN SMALL LETTER L
0x94	0x006D	#LATIN SMALL LETTER M
0x95	0x006E	#LATIN SMALL LETTER N
0x96	0x006F	#LATIN SMALL LETTER O
0x97	0x0070	#LATIN SMALL LETTER P
0x98	0x0071	#LATIN SMALL LETTER Q
0x99	0x0072	#LATIN SMALL LETTER R
0x9A	0x00AA	#FEMININE ORDINAL INDICATOR
0x9B	0x00BA	#MASCULINE ORDINAL INDICATOR
0x9C	0x00E6	#LATIN SMALL LIGATURE AE
0x9D	0x00B8	#CEDILLA
0x9E	0x00C6	#LATIN CAPITAL LIGATURE AE
0x9F	0x00A4	#CURRENCY SIGN
0xA0	0x00B5	#MICRO SIGN
0xA1	0x007E	#TILDE
0xA2	0x0073	#LATIN SMALL LETTER S
0xA3	0x0074	#LATIN SMALL LETTER T
0xA4	0x0075	#LATIN SMALL LETTER U
0xA5	0x0076	#LATIN SMALL LETTER V
0xA6	0x0077	#LATIN SMALL LETTER W
0xA7	0x0078	#LATIN SMALL LETTER X
0xA8	0x0079	#LATIN SMALL LETTER Y
0xA9	0x007A	#LATIN SMALL LETTER Z
0xAA	0x00A1	#INVERTED EXCLAMATION MARK
0xAB	0x00BF	#INVERTED QUESTION MARK
0xAC	0x00D0	#LATIN CAPITAL LETTER ETH (ICELANDIC)
0xAD	0x00DD	#LATIN CAPITAL LETTER Y WITH ACUTE
0xAE	0x00DE	#LATIN CAPITAL LETTER THORN (ICELANDIC)
0xAF	0x00AE	#REGISTERED SIGN
0xB0	0x00A2	#CENT SIGN
0xB1	0x00A3	#POUND SIGN
0xB2	0x00A5	#YEN SIGN
0xB3	0x00B7	#MIDDLE DOT
0xB4	0x00A9	#COPYRIGHT SIGN
0xB5	0x00A7	#SECTION SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00BC	#VULGAR FRACTION ONE QUARTER
0xB8	0x00BD	#VULGAR FRACTION ONE HALF
0xB9	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBA	0x00AC	#NOT SIGN
0xBB	0x007C	#VERTICAL LINE
0xBC	0x00AF	#MACRON
0xBD	0x00A8	#DIAERESIS
0xBE	0x00B4	#ACUTE ACCENT
0xBF	0x00D7	#MULTIPLICATION SIGN
0xC0	0x007B	#LEFT CURLY BRACKET
0xC1	0x0041	#LATIN CAPITAL LETTER A
0xC2	0x0042	#LATIN CAPITAL LETTER B
0xC3	0x0043	#LATIN CAPITAL LETTER C
0xC4	0x0044	#LATIN CAPITAL LETTER D
0xC5	0x0045	#LATIN CAPITAL LETTER E
0xC6	0x0046	#LATIN CAPITAL LETTER F
0xC7	0x0047	#LATIN CAPITAL LETTER G
0xC8	0x0048	#LATIN CAPITAL LETTER H
0xC9	0x0049	#LATIN CAPITAL LETTER I
0xCA	0x00AD	#SOFT HYPHEN
0xCB	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0xCC	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
0xCD	0x00F2	#LATIN SMALL LETTER O WITH GRAVE
0xCE	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
0xCF	0x00F5	#LATIN SMALL LETTER O WITH TILDE
0xD0	0x007D	#RIGHT CURLY BRACKET
0xD1	0x004A	#LATIN CAPITAL LETTER J
0xD2	0x004B	#LATIN CAPITAL LETTER K
0xD3	0x004C	#LATIN CAPITAL LETTER L
0xD4	0x004D	#LATIN CAPITAL LETTER M
0xD5	0x004E	#LATIN CAPITAL LETTER N
0xD6	0x004F	#LATIN CAPITAL LETTER O
0xD7	0x0050	#LATIN CAPITAL LETTER P
0xD8	0x0051	#LATIN CAPITAL LETTER Q
0xD9	0x0052	#LATIN CAPITAL LETTER R
0xDA	0x00B9	#SUPERSCRIPT ONE
0xDB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0xDC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xDD	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
0xDE	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
0xDF	0x00FF	#LATIN SMALL LETTER Y WITH DIAERESIS
0xE0	0x005C	#REVERSE SOLIDUS
0xE1	0x00F7	#DIVISION SIGN
0xE2	0x0053	#LATIN CAPITAL LETTER S
0xE3	0x0054	#LATIN CAPITAL LETTER T
0xE4	0x0055	#LATIN CAPITAL LETTER U
0xE5	0x0056	#LATIN CAPITAL LETTER V
0xE6	0x0057	#LATIN CAPITAL LETTER W
0xE7	0x0058	#LATIN CAPITAL LETTER X
0xE8	0x0059	#LATIN CAPITAL LETTER Y
0xE9	0x005A	#LATIN CAPITAL LETTER Z
0xEA	0x00B2	#SUPERSCRIPT TWO
0xEB	0x00D4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xEC	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0xED	0x00D2	#LATIN CAPITAL LETTER O WITH GRAVE
0xEE	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
0xEF	0x00D5	#LATIN CAPITAL LETTER O WITH TILDE
0xF0	0x0030	#DIGIT ZERO
0xF1	0x0031	#DIGIT ONE
0xF2	0x0032	#DIGIT TWO
0xF3	0x0033	#DIGIT THREE
0xF4	0x0034	#DIGIT FOUR
0xF5	0x0035	#DIGIT FIVE
0xF6	0x0036	#DIGIT SIX
0xF7	0x0037	#DIGIT SEVEN
0xF8	0x0038	#DIGIT EIGHT
0xF9	0x0039	#DIGIT NINE
0xFA	0x00B3	#SUPERSCRIPT THREE
0xFB	0x00DB	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xFC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
0xFD	0x00D9	#LATIN CAPITAL LETTER U WITH GRAVE
0xFE	0x00DA	#LATIN CAPITAL LETTER U WITH ACUTE
0xFF	0x009F	#CONTROL



Added freshlib/data/_encodings/_sources/CP737.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp737_DOSGreek to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp737_DOSGreek code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp737_DOSGreek order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x0391	#GREEK CAPITAL LETTER ALPHA
0x81	0x0392	#GREEK CAPITAL LETTER BETA
0x82	0x0393	#GREEK CAPITAL LETTER GAMMA
0x83	0x0394	#GREEK CAPITAL LETTER DELTA
0x84	0x0395	#GREEK CAPITAL LETTER EPSILON
0x85	0x0396	#GREEK CAPITAL LETTER ZETA
0x86	0x0397	#GREEK CAPITAL LETTER ETA
0x87	0x0398	#GREEK CAPITAL LETTER THETA
0x88	0x0399	#GREEK CAPITAL LETTER IOTA
0x89	0x039a	#GREEK CAPITAL LETTER KAPPA
0x8a	0x039b	#GREEK CAPITAL LETTER LAMDA
0x8b	0x039c	#GREEK CAPITAL LETTER MU
0x8c	0x039d	#GREEK CAPITAL LETTER NU
0x8d	0x039e	#GREEK CAPITAL LETTER XI
0x8e	0x039f	#GREEK CAPITAL LETTER OMICRON
0x8f	0x03a0	#GREEK CAPITAL LETTER PI
0x90	0x03a1	#GREEK CAPITAL LETTER RHO
0x91	0x03a3	#GREEK CAPITAL LETTER SIGMA
0x92	0x03a4	#GREEK CAPITAL LETTER TAU
0x93	0x03a5	#GREEK CAPITAL LETTER UPSILON
0x94	0x03a6	#GREEK CAPITAL LETTER PHI
0x95	0x03a7	#GREEK CAPITAL LETTER CHI
0x96	0x03a8	#GREEK CAPITAL LETTER PSI
0x97	0x03a9	#GREEK CAPITAL LETTER OMEGA
0x98	0x03b1	#GREEK SMALL LETTER ALPHA
0x99	0x03b2	#GREEK SMALL LETTER BETA
0x9a	0x03b3	#GREEK SMALL LETTER GAMMA
0x9b	0x03b4	#GREEK SMALL LETTER DELTA
0x9c	0x03b5	#GREEK SMALL LETTER EPSILON
0x9d	0x03b6	#GREEK SMALL LETTER ZETA
0x9e	0x03b7	#GREEK SMALL LETTER ETA
0x9f	0x03b8	#GREEK SMALL LETTER THETA
0xa0	0x03b9	#GREEK SMALL LETTER IOTA
0xa1	0x03ba	#GREEK SMALL LETTER KAPPA
0xa2	0x03bb	#GREEK SMALL LETTER LAMDA
0xa3	0x03bc	#GREEK SMALL LETTER MU
0xa4	0x03bd	#GREEK SMALL LETTER NU
0xa5	0x03be	#GREEK SMALL LETTER XI
0xa6	0x03bf	#GREEK SMALL LETTER OMICRON
0xa7	0x03c0	#GREEK SMALL LETTER PI
0xa8	0x03c1	#GREEK SMALL LETTER RHO
0xa9	0x03c3	#GREEK SMALL LETTER SIGMA
0xaa	0x03c2	#GREEK SMALL LETTER FINAL SIGMA
0xab	0x03c4	#GREEK SMALL LETTER TAU
0xac	0x03c5	#GREEK SMALL LETTER UPSILON
0xad	0x03c6	#GREEK SMALL LETTER PHI
0xae	0x03c7	#GREEK SMALL LETTER CHI
0xaf	0x03c8	#GREEK SMALL LETTER PSI
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x258c	#LEFT HALF BLOCK
0xde	0x2590	#RIGHT HALF BLOCK
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x03c9	#GREEK SMALL LETTER OMEGA
0xe1	0x03ac	#GREEK SMALL LETTER ALPHA WITH TONOS
0xe2	0x03ad	#GREEK SMALL LETTER EPSILON WITH TONOS
0xe3	0x03ae	#GREEK SMALL LETTER ETA WITH TONOS
0xe4	0x03ca	#GREEK SMALL LETTER IOTA WITH DIALYTIKA
0xe5	0x03af	#GREEK SMALL LETTER IOTA WITH TONOS
0xe6	0x03cc	#GREEK SMALL LETTER OMICRON WITH TONOS
0xe7	0x03cd	#GREEK SMALL LETTER UPSILON WITH TONOS
0xe8	0x03cb	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA
0xe9	0x03ce	#GREEK SMALL LETTER OMEGA WITH TONOS
0xea	0x0386	#GREEK CAPITAL LETTER ALPHA WITH TONOS
0xeb	0x0388	#GREEK CAPITAL LETTER EPSILON WITH TONOS
0xec	0x0389	#GREEK CAPITAL LETTER ETA WITH TONOS
0xed	0x038a	#GREEK CAPITAL LETTER IOTA WITH TONOS
0xee	0x038c	#GREEK CAPITAL LETTER OMICRON WITH TONOS
0xef	0x038e	#GREEK CAPITAL LETTER UPSILON WITH TONOS
0xf0	0x038f	#GREEK CAPITAL LETTER OMEGA WITH TONOS
0xf1	0x00b1	#PLUS-MINUS SIGN
0xf2	0x2265	#GREATER-THAN OR EQUAL TO
0xf3	0x2264	#LESS-THAN OR EQUAL TO
0xf4	0x03aa	#GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
0xf5	0x03ab	#GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
0xf6	0x00f7	#DIVISION SIGN
0xf7	0x2248	#ALMOST EQUAL TO
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x2219	#BULLET OPERATOR
0xfa	0x00b7	#MIDDLE DOT
0xfb	0x221a	#SQUARE ROOT
0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
0xfd	0x00b2	#SUPERSCRIPT TWO
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE


Added freshlib/data/_encodings/_sources/CP775.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp775_DOSBaltRim to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp775_DOSBaltRim code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp775_DOSBaltRim order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x0106	#LATIN CAPITAL LETTER C WITH ACUTE
0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
0x83	0x0101	#LATIN SMALL LETTER A WITH MACRON
0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
0x85	0x0123	#LATIN SMALL LETTER G WITH CEDILLA
0x86	0x00e5	#LATIN SMALL LETTER A WITH RING ABOVE
0x87	0x0107	#LATIN SMALL LETTER C WITH ACUTE
0x88	0x0142	#LATIN SMALL LETTER L WITH STROKE
0x89	0x0113	#LATIN SMALL LETTER E WITH MACRON
0x8a	0x0156	#LATIN CAPITAL LETTER R WITH CEDILLA
0x8b	0x0157	#LATIN SMALL LETTER R WITH CEDILLA
0x8c	0x012b	#LATIN SMALL LETTER I WITH MACRON
0x8d	0x0179	#LATIN CAPITAL LETTER Z WITH ACUTE
0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0x8f	0x00c5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
0x91	0x00e6	#LATIN SMALL LIGATURE AE
0x92	0x00c6	#LATIN CAPITAL LIGATURE AE
0x93	0x014d	#LATIN SMALL LETTER O WITH MACRON
0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
0x95	0x0122	#LATIN CAPITAL LETTER G WITH CEDILLA
0x96	0x00a2	#CENT SIGN
0x97	0x015a	#LATIN CAPITAL LETTER S WITH ACUTE
0x98	0x015b	#LATIN SMALL LETTER S WITH ACUTE
0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
0x9b	0x00f8	#LATIN SMALL LETTER O WITH STROKE
0x9c	0x00a3	#POUND SIGN
0x9d	0x00d8	#LATIN CAPITAL LETTER O WITH STROKE
0x9e	0x00d7	#MULTIPLICATION SIGN
0x9f	0x00a4	#CURRENCY SIGN
0xa0	0x0100	#LATIN CAPITAL LETTER A WITH MACRON
0xa1	0x012a	#LATIN CAPITAL LETTER I WITH MACRON
0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
0xa3	0x017b	#LATIN CAPITAL LETTER Z WITH DOT ABOVE
0xa4	0x017c	#LATIN SMALL LETTER Z WITH DOT ABOVE
0xa5	0x017a	#LATIN SMALL LETTER Z WITH ACUTE
0xa6	0x201d	#RIGHT DOUBLE QUOTATION MARK
0xa7	0x00a6	#BROKEN BAR
0xa8	0x00a9	#COPYRIGHT SIGN
0xa9	0x00ae	#REGISTERED SIGN
0xaa	0x00ac	#NOT SIGN
0xab	0x00bd	#VULGAR FRACTION ONE HALF
0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
0xad	0x0141	#LATIN CAPITAL LETTER L WITH STROKE
0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x0104	#LATIN CAPITAL LETTER A WITH OGONEK
0xb6	0x010c	#LATIN CAPITAL LETTER C WITH CARON
0xb7	0x0118	#LATIN CAPITAL LETTER E WITH OGONEK
0xb8	0x0116	#LATIN CAPITAL LETTER E WITH DOT ABOVE
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x012e	#LATIN CAPITAL LETTER I WITH OGONEK
0xbe	0x0160	#LATIN CAPITAL LETTER S WITH CARON
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x0172	#LATIN CAPITAL LETTER U WITH OGONEK
0xc7	0x016a	#LATIN CAPITAL LETTER U WITH MACRON
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x017d	#LATIN CAPITAL LETTER Z WITH CARON
0xd0	0x0105	#LATIN SMALL LETTER A WITH OGONEK
0xd1	0x010d	#LATIN SMALL LETTER C WITH CARON
0xd2	0x0119	#LATIN SMALL LETTER E WITH OGONEK
0xd3	0x0117	#LATIN SMALL LETTER E WITH DOT ABOVE
0xd4	0x012f	#LATIN SMALL LETTER I WITH OGONEK
0xd5	0x0161	#LATIN SMALL LETTER S WITH CARON
0xd6	0x0173	#LATIN SMALL LETTER U WITH OGONEK
0xd7	0x016b	#LATIN SMALL LETTER U WITH MACRON
0xd8	0x017e	#LATIN SMALL LETTER Z WITH CARON
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x258c	#LEFT HALF BLOCK
0xde	0x2590	#RIGHT HALF BLOCK
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x00d3	#LATIN CAPITAL LETTER O WITH ACUTE
0xe1	0x00df	#LATIN SMALL LETTER SHARP S (GERMAN)
0xe2	0x014c	#LATIN CAPITAL LETTER O WITH MACRON
0xe3	0x0143	#LATIN CAPITAL LETTER N WITH ACUTE
0xe4	0x00f5	#LATIN SMALL LETTER O WITH TILDE
0xe5	0x00d5	#LATIN CAPITAL LETTER O WITH TILDE
0xe6	0x00b5	#MICRO SIGN
0xe7	0x0144	#LATIN SMALL LETTER N WITH ACUTE
0xe8	0x0136	#LATIN CAPITAL LETTER K WITH CEDILLA
0xe9	0x0137	#LATIN SMALL LETTER K WITH CEDILLA
0xea	0x013b	#LATIN CAPITAL LETTER L WITH CEDILLA
0xeb	0x013c	#LATIN SMALL LETTER L WITH CEDILLA
0xec	0x0146	#LATIN SMALL LETTER N WITH CEDILLA
0xed	0x0112	#LATIN CAPITAL LETTER E WITH MACRON
0xee	0x0145	#LATIN CAPITAL LETTER N WITH CEDILLA
0xef	0x2019	#RIGHT SINGLE QUOTATION MARK
0xf0	0x00ad	#SOFT HYPHEN
0xf1	0x00b1	#PLUS-MINUS SIGN
0xf2	0x201c	#LEFT DOUBLE QUOTATION MARK
0xf3	0x00be	#VULGAR FRACTION THREE QUARTERS
0xf4	0x00b6	#PILCROW SIGN
0xf5	0x00a7	#SECTION SIGN
0xf6	0x00f7	#DIVISION SIGN
0xf7	0x201e	#DOUBLE LOW-9 QUOTATION MARK
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x2219	#BULLET OPERATOR
0xfa	0x00b7	#MIDDLE DOT
0xfb	0x00b9	#SUPERSCRIPT ONE
0xfc	0x00b3	#SUPERSCRIPT THREE
0xfd	0x00b2	#SUPERSCRIPT TWO
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE



Added freshlib/data/_encodings/_sources/CP850.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp850_DOSLatin1 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp850_DOSLatin1 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp850_DOSLatin1 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
0x86	0x00e5	#LATIN SMALL LETTER A WITH RING ABOVE
0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
0x8b	0x00ef	#LATIN SMALL LETTER I WITH DIAERESIS
0x8c	0x00ee	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0x8d	0x00ec	#LATIN SMALL LETTER I WITH GRAVE
0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0x8f	0x00c5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
0x91	0x00e6	#LATIN SMALL LIGATURE AE
0x92	0x00c6	#LATIN CAPITAL LIGATURE AE
0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
0x95	0x00f2	#LATIN SMALL LETTER O WITH GRAVE
0x96	0x00fb	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0x97	0x00f9	#LATIN SMALL LETTER U WITH GRAVE
0x98	0x00ff	#LATIN SMALL LETTER Y WITH DIAERESIS
0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
0x9b	0x00f8	#LATIN SMALL LETTER O WITH STROKE
0x9c	0x00a3	#POUND SIGN
0x9d	0x00d8	#LATIN CAPITAL LETTER O WITH STROKE
0x9e	0x00d7	#MULTIPLICATION SIGN
0x9f	0x0192	#LATIN SMALL LETTER F WITH HOOK
0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
0xa4	0x00f1	#LATIN SMALL LETTER N WITH TILDE
0xa5	0x00d1	#LATIN CAPITAL LETTER N WITH TILDE
0xa6	0x00aa	#FEMININE ORDINAL INDICATOR
0xa7	0x00ba	#MASCULINE ORDINAL INDICATOR
0xa8	0x00bf	#INVERTED QUESTION MARK
0xa9	0x00ae	#REGISTERED SIGN
0xaa	0x00ac	#NOT SIGN
0xab	0x00bd	#VULGAR FRACTION ONE HALF
0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
0xad	0x00a1	#INVERTED EXCLAMATION MARK
0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x00c1	#LATIN CAPITAL LETTER A WITH ACUTE
0xb6	0x00c2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xb7	0x00c0	#LATIN CAPITAL LETTER A WITH GRAVE
0xb8	0x00a9	#COPYRIGHT SIGN
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x00a2	#CENT SIGN
0xbe	0x00a5	#YEN SIGN
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x00e3	#LATIN SMALL LETTER A WITH TILDE
0xc7	0x00c3	#LATIN CAPITAL LETTER A WITH TILDE
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x00a4	#CURRENCY SIGN
0xd0	0x00f0	#LATIN SMALL LETTER ETH
0xd1	0x00d0	#LATIN CAPITAL LETTER ETH
0xd2	0x00ca	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xd3	0x00cb	#LATIN CAPITAL LETTER E WITH DIAERESIS
0xd4	0x00c8	#LATIN CAPITAL LETTER E WITH GRAVE
0xd5	0x0131	#LATIN SMALL LETTER DOTLESS I
0xd6	0x00cd	#LATIN CAPITAL LETTER I WITH ACUTE
0xd7	0x00ce	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xd8	0x00cf	#LATIN CAPITAL LETTER I WITH DIAERESIS
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x00a6	#BROKEN BAR
0xde	0x00cc	#LATIN CAPITAL LETTER I WITH GRAVE
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x00d3	#LATIN CAPITAL LETTER O WITH ACUTE
0xe1	0x00df	#LATIN SMALL LETTER SHARP S
0xe2	0x00d4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xe3	0x00d2	#LATIN CAPITAL LETTER O WITH GRAVE
0xe4	0x00f5	#LATIN SMALL LETTER O WITH TILDE
0xe5	0x00d5	#LATIN CAPITAL LETTER O WITH TILDE
0xe6	0x00b5	#MICRO SIGN
0xe7	0x00fe	#LATIN SMALL LETTER THORN
0xe8	0x00de	#LATIN CAPITAL LETTER THORN
0xe9	0x00da	#LATIN CAPITAL LETTER U WITH ACUTE
0xea	0x00db	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xeb	0x00d9	#LATIN CAPITAL LETTER U WITH GRAVE
0xec	0x00fd	#LATIN SMALL LETTER Y WITH ACUTE
0xed	0x00dd	#LATIN CAPITAL LETTER Y WITH ACUTE
0xee	0x00af	#MACRON
0xef	0x00b4	#ACUTE ACCENT
0xf0	0x00ad	#SOFT HYPHEN
0xf1	0x00b1	#PLUS-MINUS SIGN
0xf2	0x2017	#DOUBLE LOW LINE
0xf3	0x00be	#VULGAR FRACTION THREE QUARTERS
0xf4	0x00b6	#PILCROW SIGN
0xf5	0x00a7	#SECTION SIGN
0xf6	0x00f7	#DIVISION SIGN
0xf7	0x00b8	#CEDILLA
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x00a8	#DIAERESIS
0xfa	0x00b7	#MIDDLE DOT
0xfb	0x00b9	#SUPERSCRIPT ONE
0xfc	0x00b3	#SUPERSCRIPT THREE
0xfd	0x00b2	#SUPERSCRIPT TWO
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE


Added freshlib/data/_encodings/_sources/CP852.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp852_DOSLatin2 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp852_DOSLatin2 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp852_DOSLatin2 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
0x85	0x016f	#LATIN SMALL LETTER U WITH RING ABOVE
0x86	0x0107	#LATIN SMALL LETTER C WITH ACUTE
0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
0x88	0x0142	#LATIN SMALL LETTER L WITH STROKE
0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
0x8a	0x0150	#LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
0x8b	0x0151	#LATIN SMALL LETTER O WITH DOUBLE ACUTE
0x8c	0x00ee	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0x8d	0x0179	#LATIN CAPITAL LETTER Z WITH ACUTE
0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0x8f	0x0106	#LATIN CAPITAL LETTER C WITH ACUTE
0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
0x91	0x0139	#LATIN CAPITAL LETTER L WITH ACUTE
0x92	0x013a	#LATIN SMALL LETTER L WITH ACUTE
0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
0x95	0x013d	#LATIN CAPITAL LETTER L WITH CARON
0x96	0x013e	#LATIN SMALL LETTER L WITH CARON
0x97	0x015a	#LATIN CAPITAL LETTER S WITH ACUTE
0x98	0x015b	#LATIN SMALL LETTER S WITH ACUTE
0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
0x9b	0x0164	#LATIN CAPITAL LETTER T WITH CARON
0x9c	0x0165	#LATIN SMALL LETTER T WITH CARON
0x9d	0x0141	#LATIN CAPITAL LETTER L WITH STROKE
0x9e	0x00d7	#MULTIPLICATION SIGN
0x9f	0x010d	#LATIN SMALL LETTER C WITH CARON
0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
0xa4	0x0104	#LATIN CAPITAL LETTER A WITH OGONEK
0xa5	0x0105	#LATIN SMALL LETTER A WITH OGONEK
0xa6	0x017d	#LATIN CAPITAL LETTER Z WITH CARON
0xa7	0x017e	#LATIN SMALL LETTER Z WITH CARON
0xa8	0x0118	#LATIN CAPITAL LETTER E WITH OGONEK
0xa9	0x0119	#LATIN SMALL LETTER E WITH OGONEK
0xaa	0x00ac	#NOT SIGN
0xab	0x017a	#LATIN SMALL LETTER Z WITH ACUTE
0xac	0x010c	#LATIN CAPITAL LETTER C WITH CARON
0xad	0x015f	#LATIN SMALL LETTER S WITH CEDILLA
0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x00c1	#LATIN CAPITAL LETTER A WITH ACUTE
0xb6	0x00c2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xb7	0x011a	#LATIN CAPITAL LETTER E WITH CARON
0xb8	0x015e	#LATIN CAPITAL LETTER S WITH CEDILLA
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x017b	#LATIN CAPITAL LETTER Z WITH DOT ABOVE
0xbe	0x017c	#LATIN SMALL LETTER Z WITH DOT ABOVE
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x0102	#LATIN CAPITAL LETTER A WITH BREVE
0xc7	0x0103	#LATIN SMALL LETTER A WITH BREVE
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x00a4	#CURRENCY SIGN
0xd0	0x0111	#LATIN SMALL LETTER D WITH STROKE
0xd1	0x0110	#LATIN CAPITAL LETTER D WITH STROKE
0xd2	0x010e	#LATIN CAPITAL LETTER D WITH CARON
0xd3	0x00cb	#LATIN CAPITAL LETTER E WITH DIAERESIS
0xd4	0x010f	#LATIN SMALL LETTER D WITH CARON
0xd5	0x0147	#LATIN CAPITAL LETTER N WITH CARON
0xd6	0x00cd	#LATIN CAPITAL LETTER I WITH ACUTE
0xd7	0x00ce	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xd8	0x011b	#LATIN SMALL LETTER E WITH CARON
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x0162	#LATIN CAPITAL LETTER T WITH CEDILLA
0xde	0x016e	#LATIN CAPITAL LETTER U WITH RING ABOVE
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x00d3	#LATIN CAPITAL LETTER O WITH ACUTE
0xe1	0x00df	#LATIN SMALL LETTER SHARP S
0xe2	0x00d4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xe3	0x0143	#LATIN CAPITAL LETTER N WITH ACUTE
0xe4	0x0144	#LATIN SMALL LETTER N WITH ACUTE
0xe5	0x0148	#LATIN SMALL LETTER N WITH CARON
0xe6	0x0160	#LATIN CAPITAL LETTER S WITH CARON
0xe7	0x0161	#LATIN SMALL LETTER S WITH CARON
0xe8	0x0154	#LATIN CAPITAL LETTER R WITH ACUTE
0xe9	0x00da	#LATIN CAPITAL LETTER U WITH ACUTE
0xea	0x0155	#LATIN SMALL LETTER R WITH ACUTE
0xeb	0x0170	#LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
0xec	0x00fd	#LATIN SMALL LETTER Y WITH ACUTE
0xed	0x00dd	#LATIN CAPITAL LETTER Y WITH ACUTE
0xee	0x0163	#LATIN SMALL LETTER T WITH CEDILLA
0xef	0x00b4	#ACUTE ACCENT
0xf0	0x00ad	#SOFT HYPHEN
0xf1	0x02dd	#DOUBLE ACUTE ACCENT
0xf2	0x02db	#OGONEK
0xf3	0x02c7	#CARON
0xf4	0x02d8	#BREVE
0xf5	0x00a7	#SECTION SIGN
0xf6	0x00f7	#DIVISION SIGN
0xf7	0x00b8	#CEDILLA
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x00a8	#DIAERESIS
0xfa	0x02d9	#DOT ABOVE
0xfb	0x0171	#LATIN SMALL LETTER U WITH DOUBLE ACUTE
0xfc	0x0158	#LATIN CAPITAL LETTER R WITH CARON
0xfd	0x0159	#LATIN SMALL LETTER R WITH CARON
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE


Added freshlib/data/_encodings/_sources/CP855.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp855_DOSCyrillic to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp855_DOSCyrillic code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp855_DOSCyrillic order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x0452	#CYRILLIC SMALL LETTER DJE
0x81	0x0402	#CYRILLIC CAPITAL LETTER DJE
0x82	0x0453	#CYRILLIC SMALL LETTER GJE
0x83	0x0403	#CYRILLIC CAPITAL LETTER GJE
0x84	0x0451	#CYRILLIC SMALL LETTER IO
0x85	0x0401	#CYRILLIC CAPITAL LETTER IO
0x86	0x0454	#CYRILLIC SMALL LETTER UKRAINIAN IE
0x87	0x0404	#CYRILLIC CAPITAL LETTER UKRAINIAN IE
0x88	0x0455	#CYRILLIC SMALL LETTER DZE
0x89	0x0405	#CYRILLIC CAPITAL LETTER DZE
0x8a	0x0456	#CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
0x8b	0x0406	#CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
0x8c	0x0457	#CYRILLIC SMALL LETTER YI
0x8d	0x0407	#CYRILLIC CAPITAL LETTER YI
0x8e	0x0458	#CYRILLIC SMALL LETTER JE
0x8f	0x0408	#CYRILLIC CAPITAL LETTER JE
0x90	0x0459	#CYRILLIC SMALL LETTER LJE
0x91	0x0409	#CYRILLIC CAPITAL LETTER LJE
0x92	0x045a	#CYRILLIC SMALL LETTER NJE
0x93	0x040a	#CYRILLIC CAPITAL LETTER NJE
0x94	0x045b	#CYRILLIC SMALL LETTER TSHE
0x95	0x040b	#CYRILLIC CAPITAL LETTER TSHE
0x96	0x045c	#CYRILLIC SMALL LETTER KJE
0x97	0x040c	#CYRILLIC CAPITAL LETTER KJE
0x98	0x045e	#CYRILLIC SMALL LETTER SHORT U
0x99	0x040e	#CYRILLIC CAPITAL LETTER SHORT U
0x9a	0x045f	#CYRILLIC SMALL LETTER DZHE
0x9b	0x040f	#CYRILLIC CAPITAL LETTER DZHE
0x9c	0x044e	#CYRILLIC SMALL LETTER YU
0x9d	0x042e	#CYRILLIC CAPITAL LETTER YU
0x9e	0x044a	#CYRILLIC SMALL LETTER HARD SIGN
0x9f	0x042a	#CYRILLIC CAPITAL LETTER HARD SIGN
0xa0	0x0430	#CYRILLIC SMALL LETTER A
0xa1	0x0410	#CYRILLIC CAPITAL LETTER A
0xa2	0x0431	#CYRILLIC SMALL LETTER BE
0xa3	0x0411	#CYRILLIC CAPITAL LETTER BE
0xa4	0x0446	#CYRILLIC SMALL LETTER TSE
0xa5	0x0426	#CYRILLIC CAPITAL LETTER TSE
0xa6	0x0434	#CYRILLIC SMALL LETTER DE
0xa7	0x0414	#CYRILLIC CAPITAL LETTER DE
0xa8	0x0435	#CYRILLIC SMALL LETTER IE
0xa9	0x0415	#CYRILLIC CAPITAL LETTER IE
0xaa	0x0444	#CYRILLIC SMALL LETTER EF
0xab	0x0424	#CYRILLIC CAPITAL LETTER EF
0xac	0x0433	#CYRILLIC SMALL LETTER GHE
0xad	0x0413	#CYRILLIC CAPITAL LETTER GHE
0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x0445	#CYRILLIC SMALL LETTER HA
0xb6	0x0425	#CYRILLIC CAPITAL LETTER HA
0xb7	0x0438	#CYRILLIC SMALL LETTER I
0xb8	0x0418	#CYRILLIC CAPITAL LETTER I
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x0439	#CYRILLIC SMALL LETTER SHORT I
0xbe	0x0419	#CYRILLIC CAPITAL LETTER SHORT I
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x043a	#CYRILLIC SMALL LETTER KA
0xc7	0x041a	#CYRILLIC CAPITAL LETTER KA
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x00a4	#CURRENCY SIGN
0xd0	0x043b	#CYRILLIC SMALL LETTER EL
0xd1	0x041b	#CYRILLIC CAPITAL LETTER EL
0xd2	0x043c	#CYRILLIC SMALL LETTER EM
0xd3	0x041c	#CYRILLIC CAPITAL LETTER EM
0xd4	0x043d	#CYRILLIC SMALL LETTER EN
0xd5	0x041d	#CYRILLIC CAPITAL LETTER EN
0xd6	0x043e	#CYRILLIC SMALL LETTER O
0xd7	0x041e	#CYRILLIC CAPITAL LETTER O
0xd8	0x043f	#CYRILLIC SMALL LETTER PE
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x041f	#CYRILLIC CAPITAL LETTER PE
0xde	0x044f	#CYRILLIC SMALL LETTER YA
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x042f	#CYRILLIC CAPITAL LETTER YA
0xe1	0x0440	#CYRILLIC SMALL LETTER ER
0xe2	0x0420	#CYRILLIC CAPITAL LETTER ER
0xe3	0x0441	#CYRILLIC SMALL LETTER ES
0xe4	0x0421	#CYRILLIC CAPITAL LETTER ES
0xe5	0x0442	#CYRILLIC SMALL LETTER TE
0xe6	0x0422	#CYRILLIC CAPITAL LETTER TE
0xe7	0x0443	#CYRILLIC SMALL LETTER U
0xe8	0x0423	#CYRILLIC CAPITAL LETTER U
0xe9	0x0436	#CYRILLIC SMALL LETTER ZHE
0xea	0x0416	#CYRILLIC CAPITAL LETTER ZHE
0xeb	0x0432	#CYRILLIC SMALL LETTER VE
0xec	0x0412	#CYRILLIC CAPITAL LETTER VE
0xed	0x044c	#CYRILLIC SMALL LETTER SOFT SIGN
0xee	0x042c	#CYRILLIC CAPITAL LETTER SOFT SIGN
0xef	0x2116	#NUMERO SIGN
0xf0	0x00ad	#SOFT HYPHEN
0xf1	0x044b	#CYRILLIC SMALL LETTER YERU
0xf2	0x042b	#CYRILLIC CAPITAL LETTER YERU
0xf3	0x0437	#CYRILLIC SMALL LETTER ZE
0xf4	0x0417	#CYRILLIC CAPITAL LETTER ZE
0xf5	0x0448	#CYRILLIC SMALL LETTER SHA
0xf6	0x0428	#CYRILLIC CAPITAL LETTER SHA
0xf7	0x044d	#CYRILLIC SMALL LETTER E
0xf8	0x042d	#CYRILLIC CAPITAL LETTER E
0xf9	0x0449	#CYRILLIC SMALL LETTER SHCHA
0xfa	0x0429	#CYRILLIC CAPITAL LETTER SHCHA
0xfb	0x0447	#CYRILLIC SMALL LETTER CHE
0xfc	0x0427	#CYRILLIC CAPITAL LETTER CHE
0xfd	0x00a7	#SECTION SIGN
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE



Added freshlib/data/_encodings/_sources/CP856.TXT.































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
#
#    Name:     cp856_Hebrew_PC to Unicode table
#    Unicode version: 3.0
#    Table version: 1.0
#    Table format:  Format A
#    Date:          1999 July 27
#    Authors:       Ken Whistler (kenw@sybase.com)
#
#	Copyright (c) 1998 - 1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       CP424 characters map into Unicode.
#
#    Format: Three tab-separated columns
#        Column #1 is the cp856_Hebrew_PC code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp856_Hebrew_PC order
#
#	Version history
#	1.0 version new.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	0x05D0	#HEBREW LETTER ALEF
0x81	0x05D1	#HEBREW LETTER BET
0x82	0x05D2	#HEBREW LETTER GIMEL
0x83	0x05D3	#HEBREW LETTER DALET
0x84	0x05D4	#HEBREW LETTER HE
0x85	0x05D5	#HEBREW LETTER VAV
0x86	0x05D6	#HEBREW LETTER ZAYIN
0x87	0x05D7	#HEBREW LETTER HET
0x88	0x05D8	#HEBREW LETTER TET
0x89	0x05D9	#HEBREW LETTER YOD
0x8A	0x05DA	#HEBREW LETTER FINAL KAF
0x8B	0x05DB	#HEBREW LETTER KAF
0x8C	0x05DC	#HEBREW LETTER LAMED
0x8D	0x05DD	#HEBREW LETTER FINAL MEM
0x8E	0x05DE	#HEBREW LETTER MEM
0x8F	0x05DF	#HEBREW LETTER FINAL NUN
0x90	0x05E0	#HEBREW LETTER NUN
0x91	0x05E1	#HEBREW LETTER SAMEKH
0x92	0x05E2	#HEBREW LETTER AYIN
0x93	0x05E3	#HEBREW LETTER FINAL PE
0x94	0x05E4	#HEBREW LETTER PE
0x95	0x05E5	#HEBREW LETTER FINAL TSADI
0x96	0x05E6	#HEBREW LETTER TSADI
0x97	0x05E7	#HEBREW LETTER QOF
0x98	0x05E8	#HEBREW LETTER RESH
0x99	0x05E9	#HEBREW LETTER SHIN
0x9A	0x05EA	#HEBREW LETTER TAV
0x9B		#UNDEFINED
0x9C	0x00A3	#POUND SIGN
0x9D		#UNDEFINED
0x9E	0x00D7	#MULTIPLICATION SIGN
0x9F		#UNDEFINED
0xA0		#UNDEFINED
0xA1		#UNDEFINED
0xA2		#UNDEFINED
0xA3		#UNDEFINED
0xA4		#UNDEFINED
0xA5		#UNDEFINED
0xA6		#UNDEFINED
0xA7		#UNDEFINED
0xA8		#UNDEFINED
0xA9	0x00AE	#REGISTERED SIGN
0xAA	0x00AC	#NOT SIGN
0xAB	0x00BD	#VULGAR FRACTION ONE HALF
0xAC	0x00BC	#VULGAR FRACTION ONE QUARTER
0xAD		#UNDEFINED
0xAE	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAF	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xB0	0x2591	#LIGHT SHADE
0xB1	0x2592	#MEDIUM SHADE
0xB2	0x2593	#DARK SHADE
0xB3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xB4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xB5		#UNDEFINED
0xB6		#UNDEFINED
0xB7		#UNDEFINED
0xB8	0x00A9	#COPYRIGHT SIGN
0xB9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xBA	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xBB	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xBC	0x255D	#BOX DRAWINGS DOUBLE UP AND LEFT
0xBD	0x00A2	#CENT SIGN
0xBE	0x00A5	#YEN SIGN
0xBF	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xC0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xC1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xC2	0x252C	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xC3	0x251C	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xC4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xC5	0x253C	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xC6		#UNDEFINED
0xC7		#UNDEFINED
0xC8	0x255A	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xC9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xCA	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xCB	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xCC	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xCD	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xCE	0x256C	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xCF	0x00A4	#CURRENCY SIGN
0xD0		#UNDEFINED
0xD1		#UNDEFINED
0xD2		#UNDEFINED
0xD3		#UNDEFINEDS
0xD4		#UNDEFINED
0xD5		#UNDEFINED
0xD6		#UNDEFINEDE
0xD7		#UNDEFINED
0xD8		#UNDEFINED
0xD9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xDA	0x250C	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xDB	0x2588	#FULL BLOCK
0xDC	0x2584	#LOWER HALF BLOCK
0xDD	0x00A6	#BROKEN BAR
0xDE		#UNDEFINED
0xDF	0x2580	#UPPER HALF BLOCK
0xE0		#UNDEFINED
0xE1		#UNDEFINED
0xE2		#UNDEFINED
0xE3		#UNDEFINED
0xE4		#UNDEFINED
0xE5		#UNDEFINED
0xE6	0x00B5	#MICRO SIGN
0xE7		#UNDEFINED
0xE8		#UNDEFINED
0xE9		#UNDEFINED
0xEA		#UNDEFINED
0xEB		#UNDEFINED
0xEC		#UNDEFINED
0xED		#UNDEFINED
0xEE	0x00AF	#MACRON
0xEF	0x00B4	#ACUTE ACCENT
0xF0	0x00AD	#SOFT HYPHEN
0xF1	0x00B1	#PLUS-MINUS SIGN
0xF2	0x2017	#DOUBLE LOW LINE
0xF3	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xF4	0x00B6	#PILCROW SIGN
0xF5	0x00A7	#SECTION SIGN
0xF6	0x00F7	#DIVISION SIGN
0xF7	0x00B8	#CEDILLA
0xF8	0x00B0	#DEGREE SIGN
0xF9	0x00A8	#DIAERESIS
0xFA	0x00B7	#MIDDLE DOT
0xFB	0x00B9	#SUPERSCRIPT ONE
0xFC	0x00B3	#SUPERSCRIPT THREE
0xFD	0x00B2	#SUPERSCRIPT TWO
0xFE	0x25A0	#BLACK SQUARE
0xFF	0x00A0	#NO-BREAK SPACE

Added freshlib/data/_encodings/_sources/CP857.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp857_DOSTurkish to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp857_DOSTurkish code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp857_DOSTurkish order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
0x86	0x00e5	#LATIN SMALL LETTER A WITH RING ABOVE
0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
0x8b	0x00ef	#LATIN SMALL LETTER I WITH DIAERESIS
0x8c	0x00ee	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0x8d	0x0131	#LATIN SMALL LETTER DOTLESS I
0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0x8f	0x00c5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
0x91	0x00e6	#LATIN SMALL LIGATURE AE
0x92	0x00c6	#LATIN CAPITAL LIGATURE AE
0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
0x95	0x00f2	#LATIN SMALL LETTER O WITH GRAVE
0x96	0x00fb	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0x97	0x00f9	#LATIN SMALL LETTER U WITH GRAVE
0x98	0x0130	#LATIN CAPITAL LETTER I WITH DOT ABOVE
0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
0x9b	0x00f8	#LATIN SMALL LETTER O WITH STROKE
0x9c	0x00a3	#POUND SIGN
0x9d	0x00d8	#LATIN CAPITAL LETTER O WITH STROKE
0x9e	0x015e	#LATIN CAPITAL LETTER S WITH CEDILLA
0x9f	0x015f	#LATIN SMALL LETTER S WITH CEDILLA
0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
0xa4	0x00f1	#LATIN SMALL LETTER N WITH TILDE
0xa5	0x00d1	#LATIN CAPITAL LETTER N WITH TILDE
0xa6	0x011e	#LATIN CAPITAL LETTER G WITH BREVE
0xa7	0x011f	#LATIN SMALL LETTER G WITH BREVE
0xa8	0x00bf	#INVERTED QUESTION MARK
0xa9	0x00ae	#REGISTERED SIGN
0xaa	0x00ac	#NOT SIGN
0xab	0x00bd	#VULGAR FRACTION ONE HALF
0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
0xad	0x00a1	#INVERTED EXCLAMATION MARK
0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x00c1	#LATIN CAPITAL LETTER A WITH ACUTE
0xb6	0x00c2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xb7	0x00c0	#LATIN CAPITAL LETTER A WITH GRAVE
0xb8	0x00a9	#COPYRIGHT SIGN
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x00a2	#CENT SIGN
0xbe	0x00a5	#YEN SIGN
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x00e3	#LATIN SMALL LETTER A WITH TILDE
0xc7	0x00c3	#LATIN CAPITAL LETTER A WITH TILDE
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x00a4	#CURRENCY SIGN
0xd0	0x00ba	#MASCULINE ORDINAL INDICATOR
0xd1	0x00aa	#FEMININE ORDINAL INDICATOR
0xd2	0x00ca	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xd3	0x00cb	#LATIN CAPITAL LETTER E WITH DIAERESIS
0xd4	0x00c8	#LATIN CAPITAL LETTER E WITH GRAVE
0xd5		#UNDEFINED
0xd6	0x00cd	#LATIN CAPITAL LETTER I WITH ACUTE
0xd7	0x00ce	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xd8	0x00cf	#LATIN CAPITAL LETTER I WITH DIAERESIS
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x00a6	#BROKEN BAR
0xde	0x00cc	#LATIN CAPITAL LETTER I WITH GRAVE
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x00d3	#LATIN CAPITAL LETTER O WITH ACUTE
0xe1	0x00df	#LATIN SMALL LETTER SHARP S
0xe2	0x00d4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xe3	0x00d2	#LATIN CAPITAL LETTER O WITH GRAVE
0xe4	0x00f5	#LATIN SMALL LETTER O WITH TILDE
0xe5	0x00d5	#LATIN CAPITAL LETTER O WITH TILDE
0xe6	0x00b5	#MICRO SIGN
0xe7		#UNDEFINED
0xe8	0x00d7	#MULTIPLICATION SIGN
0xe9	0x00da	#LATIN CAPITAL LETTER U WITH ACUTE
0xea	0x00db	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xeb	0x00d9	#LATIN CAPITAL LETTER U WITH GRAVE
0xec	0x00ec	#LATIN SMALL LETTER I WITH GRAVE
0xed	0x00ff	#LATIN SMALL LETTER Y WITH DIAERESIS
0xee	0x00af	#MACRON
0xef	0x00b4	#ACUTE ACCENT
0xf0	0x00ad	#SOFT HYPHEN
0xf1	0x00b1	#PLUS-MINUS SIGN
0xf2		#UNDEFINED
0xf3	0x00be	#VULGAR FRACTION THREE QUARTERS
0xf4	0x00b6	#PILCROW SIGN
0xf5	0x00a7	#SECTION SIGN
0xf6	0x00f7	#DIVISION SIGN
0xf7	0x00b8	#CEDILLA
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x00a8	#DIAERESIS
0xfa	0x00b7	#MIDDLE DOT
0xfb	0x00b9	#SUPERSCRIPT ONE
0xfc	0x00b3	#SUPERSCRIPT THREE
0xfd	0x00b2	#SUPERSCRIPT TWO
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE



Added freshlib/data/_encodings/_sources/CP860.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp860_DOSPortuguese to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp860_DOSPortuguese code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp860_DOSPortuguese order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0x84	0x00e3	#LATIN SMALL LETTER A WITH TILDE
0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
0x86	0x00c1	#LATIN CAPITAL LETTER A WITH ACUTE
0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0x89	0x00ca	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
0x8b	0x00cd	#LATIN CAPITAL LETTER I WITH ACUTE
0x8c	0x00d4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0x8d	0x00ec	#LATIN SMALL LETTER I WITH GRAVE
0x8e	0x00c3	#LATIN CAPITAL LETTER A WITH TILDE
0x8f	0x00c2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
0x91	0x00c0	#LATIN CAPITAL LETTER A WITH GRAVE
0x92	0x00c8	#LATIN CAPITAL LETTER E WITH GRAVE
0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0x94	0x00f5	#LATIN SMALL LETTER O WITH TILDE
0x95	0x00f2	#LATIN SMALL LETTER O WITH GRAVE
0x96	0x00da	#LATIN CAPITAL LETTER U WITH ACUTE
0x97	0x00f9	#LATIN SMALL LETTER U WITH GRAVE
0x98	0x00cc	#LATIN CAPITAL LETTER I WITH GRAVE
0x99	0x00d5	#LATIN CAPITAL LETTER O WITH TILDE
0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
0x9b	0x00a2	#CENT SIGN
0x9c	0x00a3	#POUND SIGN
0x9d	0x00d9	#LATIN CAPITAL LETTER U WITH GRAVE
0x9e	0x20a7	#PESETA SIGN
0x9f	0x00d3	#LATIN CAPITAL LETTER O WITH ACUTE
0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
0xa4	0x00f1	#LATIN SMALL LETTER N WITH TILDE
0xa5	0x00d1	#LATIN CAPITAL LETTER N WITH TILDE
0xa6	0x00aa	#FEMININE ORDINAL INDICATOR
0xa7	0x00ba	#MASCULINE ORDINAL INDICATOR
0xa8	0x00bf	#INVERTED QUESTION MARK
0xa9	0x00d2	#LATIN CAPITAL LETTER O WITH GRAVE
0xaa	0x00ac	#NOT SIGN
0xab	0x00bd	#VULGAR FRACTION ONE HALF
0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
0xad	0x00a1	#INVERTED EXCLAMATION MARK
0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x258c	#LEFT HALF BLOCK
0xde	0x2590	#RIGHT HALF BLOCK
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x03b1	#GREEK SMALL LETTER ALPHA
0xe1	0x00df	#LATIN SMALL LETTER SHARP S
0xe2	0x0393	#GREEK CAPITAL LETTER GAMMA
0xe3	0x03c0	#GREEK SMALL LETTER PI
0xe4	0x03a3	#GREEK CAPITAL LETTER SIGMA
0xe5	0x03c3	#GREEK SMALL LETTER SIGMA
0xe6	0x00b5	#MICRO SIGN
0xe7	0x03c4	#GREEK SMALL LETTER TAU
0xe8	0x03a6	#GREEK CAPITAL LETTER PHI
0xe9	0x0398	#GREEK CAPITAL LETTER THETA
0xea	0x03a9	#GREEK CAPITAL LETTER OMEGA
0xeb	0x03b4	#GREEK SMALL LETTER DELTA
0xec	0x221e	#INFINITY
0xed	0x03c6	#GREEK SMALL LETTER PHI
0xee	0x03b5	#GREEK SMALL LETTER EPSILON
0xef	0x2229	#INTERSECTION
0xf0	0x2261	#IDENTICAL TO
0xf1	0x00b1	#PLUS-MINUS SIGN
0xf2	0x2265	#GREATER-THAN OR EQUAL TO
0xf3	0x2264	#LESS-THAN OR EQUAL TO
0xf4	0x2320	#TOP HALF INTEGRAL
0xf5	0x2321	#BOTTOM HALF INTEGRAL
0xf6	0x00f7	#DIVISION SIGN
0xf7	0x2248	#ALMOST EQUAL TO
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x2219	#BULLET OPERATOR
0xfa	0x00b7	#MIDDLE DOT
0xfb	0x221a	#SQUARE ROOT
0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
0xfd	0x00b2	#SUPERSCRIPT TWO
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE



Added freshlib/data/_encodings/_sources/CP861.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp861_DOSIcelandic to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp861_DOSIcelandic code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp861_DOSIcelandic order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
0x86	0x00e5	#LATIN SMALL LETTER A WITH RING ABOVE
0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
0x8b	0x00d0	#LATIN CAPITAL LETTER ETH
0x8c	0x00f0	#LATIN SMALL LETTER ETH
0x8d	0x00de	#LATIN CAPITAL LETTER THORN
0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0x8f	0x00c5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
0x91	0x00e6	#LATIN SMALL LIGATURE AE
0x92	0x00c6	#LATIN CAPITAL LIGATURE AE
0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
0x95	0x00fe	#LATIN SMALL LETTER THORN
0x96	0x00fb	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0x97	0x00dd	#LATIN CAPITAL LETTER Y WITH ACUTE
0x98	0x00fd	#LATIN SMALL LETTER Y WITH ACUTE
0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
0x9b	0x00f8	#LATIN SMALL LETTER O WITH STROKE
0x9c	0x00a3	#POUND SIGN
0x9d	0x00d8	#LATIN CAPITAL LETTER O WITH STROKE
0x9e	0x20a7	#PESETA SIGN
0x9f	0x0192	#LATIN SMALL LETTER F WITH HOOK
0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
0xa4	0x00c1	#LATIN CAPITAL LETTER A WITH ACUTE
0xa5	0x00cd	#LATIN CAPITAL LETTER I WITH ACUTE
0xa6	0x00d3	#LATIN CAPITAL LETTER O WITH ACUTE
0xa7	0x00da	#LATIN CAPITAL LETTER U WITH ACUTE
0xa8	0x00bf	#INVERTED QUESTION MARK
0xa9	0x2310	#REVERSED NOT SIGN
0xaa	0x00ac	#NOT SIGN
0xab	0x00bd	#VULGAR FRACTION ONE HALF
0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
0xad	0x00a1	#INVERTED EXCLAMATION MARK
0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x258c	#LEFT HALF BLOCK
0xde	0x2590	#RIGHT HALF BLOCK
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x03b1	#GREEK SMALL LETTER ALPHA
0xe1	0x00df	#LATIN SMALL LETTER SHARP S
0xe2	0x0393	#GREEK CAPITAL LETTER GAMMA
0xe3	0x03c0	#GREEK SMALL LETTER PI
0xe4	0x03a3	#GREEK CAPITAL LETTER SIGMA
0xe5	0x03c3	#GREEK SMALL LETTER SIGMA
0xe6	0x00b5	#MICRO SIGN
0xe7	0x03c4	#GREEK SMALL LETTER TAU
0xe8	0x03a6	#GREEK CAPITAL LETTER PHI
0xe9	0x0398	#GREEK CAPITAL LETTER THETA
0xea	0x03a9	#GREEK CAPITAL LETTER OMEGA
0xeb	0x03b4	#GREEK SMALL LETTER DELTA
0xec	0x221e	#INFINITY
0xed	0x03c6	#GREEK SMALL LETTER PHI
0xee	0x03b5	#GREEK SMALL LETTER EPSILON
0xef	0x2229	#INTERSECTION
0xf0	0x2261	#IDENTICAL TO
0xf1	0x00b1	#PLUS-MINUS SIGN
0xf2	0x2265	#GREATER-THAN OR EQUAL TO
0xf3	0x2264	#LESS-THAN OR EQUAL TO
0xf4	0x2320	#TOP HALF INTEGRAL
0xf5	0x2321	#BOTTOM HALF INTEGRAL
0xf6	0x00f7	#DIVISION SIGN
0xf7	0x2248	#ALMOST EQUAL TO
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x2219	#BULLET OPERATOR
0xfa	0x00b7	#MIDDLE DOT
0xfb	0x221a	#SQUARE ROOT
0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
0xfd	0x00b2	#SUPERSCRIPT TWO
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE



Added freshlib/data/_encodings/_sources/CP862.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp862_DOSHebrew to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp862_DOSHebrew code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp862_DOSHebrew order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x05d0	#HEBREW LETTER ALEF
0x81	0x05d1	#HEBREW LETTER BET
0x82	0x05d2	#HEBREW LETTER GIMEL
0x83	0x05d3	#HEBREW LETTER DALET
0x84	0x05d4	#HEBREW LETTER HE
0x85	0x05d5	#HEBREW LETTER VAV
0x86	0x05d6	#HEBREW LETTER ZAYIN
0x87	0x05d7	#HEBREW LETTER HET
0x88	0x05d8	#HEBREW LETTER TET
0x89	0x05d9	#HEBREW LETTER YOD
0x8a	0x05da	#HEBREW LETTER FINAL KAF
0x8b	0x05db	#HEBREW LETTER KAF
0x8c	0x05dc	#HEBREW LETTER LAMED
0x8d	0x05dd	#HEBREW LETTER FINAL MEM
0x8e	0x05de	#HEBREW LETTER MEM
0x8f	0x05df	#HEBREW LETTER FINAL NUN
0x90	0x05e0	#HEBREW LETTER NUN
0x91	0x05e1	#HEBREW LETTER SAMEKH
0x92	0x05e2	#HEBREW LETTER AYIN
0x93	0x05e3	#HEBREW LETTER FINAL PE
0x94	0x05e4	#HEBREW LETTER PE
0x95	0x05e5	#HEBREW LETTER FINAL TSADI
0x96	0x05e6	#HEBREW LETTER TSADI
0x97	0x05e7	#HEBREW LETTER QOF
0x98	0x05e8	#HEBREW LETTER RESH
0x99	0x05e9	#HEBREW LETTER SHIN
0x9a	0x05ea	#HEBREW LETTER TAV
0x9b	0x00a2	#CENT SIGN
0x9c	0x00a3	#POUND SIGN
0x9d	0x00a5	#YEN SIGN
0x9e	0x20a7	#PESETA SIGN
0x9f	0x0192	#LATIN SMALL LETTER F WITH HOOK
0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
0xa4	0x00f1	#LATIN SMALL LETTER N WITH TILDE
0xa5	0x00d1	#LATIN CAPITAL LETTER N WITH TILDE
0xa6	0x00aa	#FEMININE ORDINAL INDICATOR
0xa7	0x00ba	#MASCULINE ORDINAL INDICATOR
0xa8	0x00bf	#INVERTED QUESTION MARK
0xa9	0x2310	#REVERSED NOT SIGN
0xaa	0x00ac	#NOT SIGN
0xab	0x00bd	#VULGAR FRACTION ONE HALF
0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
0xad	0x00a1	#INVERTED EXCLAMATION MARK
0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x258c	#LEFT HALF BLOCK
0xde	0x2590	#RIGHT HALF BLOCK
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x03b1	#GREEK SMALL LETTER ALPHA
0xe1	0x00df	#LATIN SMALL LETTER SHARP S (GERMAN)
0xe2	0x0393	#GREEK CAPITAL LETTER GAMMA
0xe3	0x03c0	#GREEK SMALL LETTER PI
0xe4	0x03a3	#GREEK CAPITAL LETTER SIGMA
0xe5	0x03c3	#GREEK SMALL LETTER SIGMA
0xe6	0x00b5	#MICRO SIGN
0xe7	0x03c4	#GREEK SMALL LETTER TAU
0xe8	0x03a6	#GREEK CAPITAL LETTER PHI
0xe9	0x0398	#GREEK CAPITAL LETTER THETA
0xea	0x03a9	#GREEK CAPITAL LETTER OMEGA
0xeb	0x03b4	#GREEK SMALL LETTER DELTA
0xec	0x221e	#INFINITY
0xed	0x03c6	#GREEK SMALL LETTER PHI
0xee	0x03b5	#GREEK SMALL LETTER EPSILON
0xef	0x2229	#INTERSECTION
0xf0	0x2261	#IDENTICAL TO
0xf1	0x00b1	#PLUS-MINUS SIGN
0xf2	0x2265	#GREATER-THAN OR EQUAL TO
0xf3	0x2264	#LESS-THAN OR EQUAL TO
0xf4	0x2320	#TOP HALF INTEGRAL
0xf5	0x2321	#BOTTOM HALF INTEGRAL
0xf6	0x00f7	#DIVISION SIGN
0xf7	0x2248	#ALMOST EQUAL TO
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x2219	#BULLET OPERATOR
0xfa	0x00b7	#MIDDLE DOT
0xfb	0x221a	#SQUARE ROOT
0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
0xfd	0x00b2	#SUPERSCRIPT TWO
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE



Added freshlib/data/_encodings/_sources/CP863.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp863_DOSCanadaF to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp863_DOSCanadaF code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp863_DOSCanadaF order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0x84	0x00c2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
0x86	0x00b6	#PILCROW SIGN
0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
0x8b	0x00ef	#LATIN SMALL LETTER I WITH DIAERESIS
0x8c	0x00ee	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0x8d	0x2017	#DOUBLE LOW LINE
0x8e	0x00c0	#LATIN CAPITAL LETTER A WITH GRAVE
0x8f	0x00a7	#SECTION SIGN
0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
0x91	0x00c8	#LATIN CAPITAL LETTER E WITH GRAVE
0x92	0x00ca	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0x94	0x00cb	#LATIN CAPITAL LETTER E WITH DIAERESIS
0x95	0x00cf	#LATIN CAPITAL LETTER I WITH DIAERESIS
0x96	0x00fb	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0x97	0x00f9	#LATIN SMALL LETTER U WITH GRAVE
0x98	0x00a4	#CURRENCY SIGN
0x99	0x00d4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
0x9b	0x00a2	#CENT SIGN
0x9c	0x00a3	#POUND SIGN
0x9d	0x00d9	#LATIN CAPITAL LETTER U WITH GRAVE
0x9e	0x00db	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0x9f	0x0192	#LATIN SMALL LETTER F WITH HOOK
0xa0	0x00a6	#BROKEN BAR
0xa1	0x00b4	#ACUTE ACCENT
0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
0xa4	0x00a8	#DIAERESIS
0xa5	0x00b8	#CEDILLA
0xa6	0x00b3	#SUPERSCRIPT THREE
0xa7	0x00af	#MACRON
0xa8	0x00ce	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xa9	0x2310	#REVERSED NOT SIGN
0xaa	0x00ac	#NOT SIGN
0xab	0x00bd	#VULGAR FRACTION ONE HALF
0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
0xad	0x00be	#VULGAR FRACTION THREE QUARTERS
0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x258c	#LEFT HALF BLOCK
0xde	0x2590	#RIGHT HALF BLOCK
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x03b1	#GREEK SMALL LETTER ALPHA
0xe1	0x00df	#LATIN SMALL LETTER SHARP S
0xe2	0x0393	#GREEK CAPITAL LETTER GAMMA
0xe3	0x03c0	#GREEK SMALL LETTER PI
0xe4	0x03a3	#GREEK CAPITAL LETTER SIGMA
0xe5	0x03c3	#GREEK SMALL LETTER SIGMA
0xe6	0x00b5	#MICRO SIGN
0xe7	0x03c4	#GREEK SMALL LETTER TAU
0xe8	0x03a6	#GREEK CAPITAL LETTER PHI
0xe9	0x0398	#GREEK CAPITAL LETTER THETA
0xea	0x03a9	#GREEK CAPITAL LETTER OMEGA
0xeb	0x03b4	#GREEK SMALL LETTER DELTA
0xec	0x221e	#INFINITY
0xed	0x03c6	#GREEK SMALL LETTER PHI
0xee	0x03b5	#GREEK SMALL LETTER EPSILON
0xef	0x2229	#INTERSECTION
0xf0	0x2261	#IDENTICAL TO
0xf1	0x00b1	#PLUS-MINUS SIGN
0xf2	0x2265	#GREATER-THAN OR EQUAL TO
0xf3	0x2264	#LESS-THAN OR EQUAL TO
0xf4	0x2320	#TOP HALF INTEGRAL
0xf5	0x2321	#BOTTOM HALF INTEGRAL
0xf6	0x00f7	#DIVISION SIGN
0xf7	0x2248	#ALMOST EQUAL TO
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x2219	#BULLET OPERATOR
0xfa	0x00b7	#MIDDLE DOT
0xfb	0x221a	#SQUARE ROOT
0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
0xfd	0x00b2	#SUPERSCRIPT TWO
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE



Added freshlib/data/_encodings/_sources/CP864.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp864_DOSArabic to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp864_DOSArabic code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp864_DOSArabic order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x066a	#ARABIC PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x00b0	#DEGREE SIGN
0x81	0x00b7	#MIDDLE DOT
0x82	0x2219	#BULLET OPERATOR
0x83	0x221a	#SQUARE ROOT
0x84	0x2592	#MEDIUM SHADE
0x85	0x2500	#FORMS LIGHT HORIZONTAL
0x86	0x2502	#FORMS LIGHT VERTICAL
0x87	0x253c	#FORMS LIGHT VERTICAL AND HORIZONTAL
0x88	0x2524	#FORMS LIGHT VERTICAL AND LEFT
0x89	0x252c	#FORMS LIGHT DOWN AND HORIZONTAL
0x8a	0x251c	#FORMS LIGHT VERTICAL AND RIGHT
0x8b	0x2534	#FORMS LIGHT UP AND HORIZONTAL
0x8c	0x2510	#FORMS LIGHT DOWN AND LEFT
0x8d	0x250c	#FORMS LIGHT DOWN AND RIGHT
0x8e	0x2514	#FORMS LIGHT UP AND RIGHT
0x8f	0x2518	#FORMS LIGHT UP AND LEFT
0x90	0x03b2	#GREEK SMALL BETA
0x91	0x221e	#INFINITY
0x92	0x03c6	#GREEK SMALL PHI
0x93	0x00b1	#PLUS-OR-MINUS SIGN
0x94	0x00bd	#FRACTION 1/2
0x95	0x00bc	#FRACTION 1/4
0x96	0x2248	#ALMOST EQUAL TO
0x97	0x00ab	#LEFT POINTING GUILLEMET
0x98	0x00bb	#RIGHT POINTING GUILLEMET
0x99	0xfef7	#ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
0x9a	0xfef8	#ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
0x9b		#UNDEFINED
0x9c		#UNDEFINED
0x9d	0xfefb	#ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
0x9e	0xfefc	#ARABIC LIGATURE LAM WITH ALEF FINAL FORM
0x9f		#UNDEFINED
0xa0	0x00a0	#NON-BREAKING SPACE
0xa1	0x00ad	#SOFT HYPHEN
0xa2	0xfe82	#ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
0xa3	0x00a3	#POUND SIGN
0xa4	0x00a4	#CURRENCY SIGN
0xa5	0xfe84	#ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
0xa6		#UNDEFINED
0xa7		#UNDEFINED
0xa8	0xfe8e	#ARABIC LETTER ALEF FINAL FORM
0xa9	0xfe8f	#ARABIC LETTER BEH ISOLATED FORM
0xaa	0xfe95	#ARABIC LETTER TEH ISOLATED FORM
0xab	0xfe99	#ARABIC LETTER THEH ISOLATED FORM
0xac	0x060c	#ARABIC COMMA
0xad	0xfe9d	#ARABIC LETTER JEEM ISOLATED FORM
0xae	0xfea1	#ARABIC LETTER HAH ISOLATED FORM
0xaf	0xfea5	#ARABIC LETTER KHAH ISOLATED FORM
0xb0	0x0660	#ARABIC-INDIC DIGIT ZERO
0xb1	0x0661	#ARABIC-INDIC DIGIT ONE
0xb2	0x0662	#ARABIC-INDIC DIGIT TWO
0xb3	0x0663	#ARABIC-INDIC DIGIT THREE
0xb4	0x0664	#ARABIC-INDIC DIGIT FOUR
0xb5	0x0665	#ARABIC-INDIC DIGIT FIVE
0xb6	0x0666	#ARABIC-INDIC DIGIT SIX
0xb7	0x0667	#ARABIC-INDIC DIGIT SEVEN
0xb8	0x0668	#ARABIC-INDIC DIGIT EIGHT
0xb9	0x0669	#ARABIC-INDIC DIGIT NINE
0xba	0xfed1	#ARABIC LETTER FEH ISOLATED FORM
0xbb	0x061b	#ARABIC SEMICOLON
0xbc	0xfeb1	#ARABIC LETTER SEEN ISOLATED FORM
0xbd	0xfeb5	#ARABIC LETTER SHEEN ISOLATED FORM
0xbe	0xfeb9	#ARABIC LETTER SAD ISOLATED FORM
0xbf	0x061f	#ARABIC QUESTION MARK
0xc0	0x00a2	#CENT SIGN
0xc1	0xfe80	#ARABIC LETTER HAMZA ISOLATED FORM
0xc2	0xfe81	#ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
0xc3	0xfe83	#ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
0xc4	0xfe85	#ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
0xc5	0xfeca	#ARABIC LETTER AIN FINAL FORM
0xc6	0xfe8b	#ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
0xc7	0xfe8d	#ARABIC LETTER ALEF ISOLATED FORM
0xc8	0xfe91	#ARABIC LETTER BEH INITIAL FORM
0xc9	0xfe93	#ARABIC LETTER TEH MARBUTA ISOLATED FORM
0xca	0xfe97	#ARABIC LETTER TEH INITIAL FORM
0xcb	0xfe9b	#ARABIC LETTER THEH INITIAL FORM
0xcc	0xfe9f	#ARABIC LETTER JEEM INITIAL FORM
0xcd	0xfea3	#ARABIC LETTER HAH INITIAL FORM
0xce	0xfea7	#ARABIC LETTER KHAH INITIAL FORM
0xcf	0xfea9	#ARABIC LETTER DAL ISOLATED FORM
0xd0	0xfeab	#ARABIC LETTER THAL ISOLATED FORM
0xd1	0xfead	#ARABIC LETTER REH ISOLATED FORM
0xd2	0xfeaf	#ARABIC LETTER ZAIN ISOLATED FORM
0xd3	0xfeb3	#ARABIC LETTER SEEN INITIAL FORM
0xd4	0xfeb7	#ARABIC LETTER SHEEN INITIAL FORM
0xd5	0xfebb	#ARABIC LETTER SAD INITIAL FORM
0xd6	0xfebf	#ARABIC LETTER DAD INITIAL FORM
0xd7	0xfec1	#ARABIC LETTER TAH ISOLATED FORM
0xd8	0xfec5	#ARABIC LETTER ZAH ISOLATED FORM
0xd9	0xfecb	#ARABIC LETTER AIN INITIAL FORM
0xda	0xfecf	#ARABIC LETTER GHAIN INITIAL FORM
0xdb	0x00a6	#BROKEN VERTICAL BAR
0xdc	0x00ac	#NOT SIGN
0xdd	0x00f7	#DIVISION SIGN
0xde	0x00d7	#MULTIPLICATION SIGN
0xdf	0xfec9	#ARABIC LETTER AIN ISOLATED FORM
0xe0	0x0640	#ARABIC TATWEEL
0xe1	0xfed3	#ARABIC LETTER FEH INITIAL FORM
0xe2	0xfed7	#ARABIC LETTER QAF INITIAL FORM
0xe3	0xfedb	#ARABIC LETTER KAF INITIAL FORM
0xe4	0xfedf	#ARABIC LETTER LAM INITIAL FORM
0xe5	0xfee3	#ARABIC LETTER MEEM INITIAL FORM
0xe6	0xfee7	#ARABIC LETTER NOON INITIAL FORM
0xe7	0xfeeb	#ARABIC LETTER HEH INITIAL FORM
0xe8	0xfeed	#ARABIC LETTER WAW ISOLATED FORM
0xe9	0xfeef	#ARABIC LETTER ALEF MAKSURA ISOLATED FORM
0xea	0xfef3	#ARABIC LETTER YEH INITIAL FORM
0xeb	0xfebd	#ARABIC LETTER DAD ISOLATED FORM
0xec	0xfecc	#ARABIC LETTER AIN MEDIAL FORM
0xed	0xfece	#ARABIC LETTER GHAIN FINAL FORM
0xee	0xfecd	#ARABIC LETTER GHAIN ISOLATED FORM
0xef	0xfee1	#ARABIC LETTER MEEM ISOLATED FORM
0xf0	0xfe7d	#ARABIC SHADDA MEDIAL FORM
0xf1	0x0651	#ARABIC SHADDAH
0xf2	0xfee5	#ARABIC LETTER NOON ISOLATED FORM
0xf3	0xfee9	#ARABIC LETTER HEH ISOLATED FORM
0xf4	0xfeec	#ARABIC LETTER HEH MEDIAL FORM
0xf5	0xfef0	#ARABIC LETTER ALEF MAKSURA FINAL FORM
0xf6	0xfef2	#ARABIC LETTER YEH FINAL FORM
0xf7	0xfed0	#ARABIC LETTER GHAIN MEDIAL FORM
0xf8	0xfed5	#ARABIC LETTER QAF ISOLATED FORM
0xf9	0xfef5	#ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
0xfa	0xfef6	#ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
0xfb	0xfedd	#ARABIC LETTER LAM ISOLATED FORM
0xfc	0xfed9	#ARABIC LETTER KAF ISOLATED FORM
0xfd	0xfef1	#ARABIC LETTER YEH ISOLATED FORM
0xfe	0x25a0	#BLACK SQUARE
0xff		#UNDEFINED



Added freshlib/data/_encodings/_sources/CP865.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp865_DOSNordic to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp865_DOSNordic code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp865_DOSNordic order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
0x86	0x00e5	#LATIN SMALL LETTER A WITH RING ABOVE
0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
0x8b	0x00ef	#LATIN SMALL LETTER I WITH DIAERESIS
0x8c	0x00ee	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0x8d	0x00ec	#LATIN SMALL LETTER I WITH GRAVE
0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0x8f	0x00c5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
0x91	0x00e6	#LATIN SMALL LIGATURE AE
0x92	0x00c6	#LATIN CAPITAL LIGATURE AE
0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
0x95	0x00f2	#LATIN SMALL LETTER O WITH GRAVE
0x96	0x00fb	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0x97	0x00f9	#LATIN SMALL LETTER U WITH GRAVE
0x98	0x00ff	#LATIN SMALL LETTER Y WITH DIAERESIS
0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
0x9b	0x00f8	#LATIN SMALL LETTER O WITH STROKE
0x9c	0x00a3	#POUND SIGN
0x9d	0x00d8	#LATIN CAPITAL LETTER O WITH STROKE
0x9e	0x20a7	#PESETA SIGN
0x9f	0x0192	#LATIN SMALL LETTER F WITH HOOK
0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
0xa4	0x00f1	#LATIN SMALL LETTER N WITH TILDE
0xa5	0x00d1	#LATIN CAPITAL LETTER N WITH TILDE
0xa6	0x00aa	#FEMININE ORDINAL INDICATOR
0xa7	0x00ba	#MASCULINE ORDINAL INDICATOR
0xa8	0x00bf	#INVERTED QUESTION MARK
0xa9	0x2310	#REVERSED NOT SIGN
0xaa	0x00ac	#NOT SIGN
0xab	0x00bd	#VULGAR FRACTION ONE HALF
0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
0xad	0x00a1	#INVERTED EXCLAMATION MARK
0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xaf	0x00a4	#CURRENCY SIGN
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x258c	#LEFT HALF BLOCK
0xde	0x2590	#RIGHT HALF BLOCK
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x03b1	#GREEK SMALL LETTER ALPHA
0xe1	0x00df	#LATIN SMALL LETTER SHARP S
0xe2	0x0393	#GREEK CAPITAL LETTER GAMMA
0xe3	0x03c0	#GREEK SMALL LETTER PI
0xe4	0x03a3	#GREEK CAPITAL LETTER SIGMA
0xe5	0x03c3	#GREEK SMALL LETTER SIGMA
0xe6	0x00b5	#MICRO SIGN
0xe7	0x03c4	#GREEK SMALL LETTER TAU
0xe8	0x03a6	#GREEK CAPITAL LETTER PHI
0xe9	0x0398	#GREEK CAPITAL LETTER THETA
0xea	0x03a9	#GREEK CAPITAL LETTER OMEGA
0xeb	0x03b4	#GREEK SMALL LETTER DELTA
0xec	0x221e	#INFINITY
0xed	0x03c6	#GREEK SMALL LETTER PHI
0xee	0x03b5	#GREEK SMALL LETTER EPSILON
0xef	0x2229	#INTERSECTION
0xf0	0x2261	#IDENTICAL TO
0xf1	0x00b1	#PLUS-MINUS SIGN
0xf2	0x2265	#GREATER-THAN OR EQUAL TO
0xf3	0x2264	#LESS-THAN OR EQUAL TO
0xf4	0x2320	#TOP HALF INTEGRAL
0xf5	0x2321	#BOTTOM HALF INTEGRAL
0xf6	0x00f7	#DIVISION SIGN
0xf7	0x2248	#ALMOST EQUAL TO
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x2219	#BULLET OPERATOR
0xfa	0x00b7	#MIDDLE DOT
0xfb	0x221a	#SQUARE ROOT
0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
0xfd	0x00b2	#SUPERSCRIPT TWO
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE



Added freshlib/data/_encodings/_sources/CP866.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp866_DOSCyrillicRussian to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp866_DOSCyrillicRussian code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp866_DOSCyrillicRussian order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80	0x0410	#CYRILLIC CAPITAL LETTER A
0x81	0x0411	#CYRILLIC CAPITAL LETTER BE
0x82	0x0412	#CYRILLIC CAPITAL LETTER VE
0x83	0x0413	#CYRILLIC CAPITAL LETTER GHE
0x84	0x0414	#CYRILLIC CAPITAL LETTER DE
0x85	0x0415	#CYRILLIC CAPITAL LETTER IE
0x86	0x0416	#CYRILLIC CAPITAL LETTER ZHE
0x87	0x0417	#CYRILLIC CAPITAL LETTER ZE
0x88	0x0418	#CYRILLIC CAPITAL LETTER I
0x89	0x0419	#CYRILLIC CAPITAL LETTER SHORT I
0x8a	0x041a	#CYRILLIC CAPITAL LETTER KA
0x8b	0x041b	#CYRILLIC CAPITAL LETTER EL
0x8c	0x041c	#CYRILLIC CAPITAL LETTER EM
0x8d	0x041d	#CYRILLIC CAPITAL LETTER EN
0x8e	0x041e	#CYRILLIC CAPITAL LETTER O
0x8f	0x041f	#CYRILLIC CAPITAL LETTER PE
0x90	0x0420	#CYRILLIC CAPITAL LETTER ER
0x91	0x0421	#CYRILLIC CAPITAL LETTER ES
0x92	0x0422	#CYRILLIC CAPITAL LETTER TE
0x93	0x0423	#CYRILLIC CAPITAL LETTER U
0x94	0x0424	#CYRILLIC CAPITAL LETTER EF
0x95	0x0425	#CYRILLIC CAPITAL LETTER HA
0x96	0x0426	#CYRILLIC CAPITAL LETTER TSE
0x97	0x0427	#CYRILLIC CAPITAL LETTER CHE
0x98	0x0428	#CYRILLIC CAPITAL LETTER SHA
0x99	0x0429	#CYRILLIC CAPITAL LETTER SHCHA
0x9a	0x042a	#CYRILLIC CAPITAL LETTER HARD SIGN
0x9b	0x042b	#CYRILLIC CAPITAL LETTER YERU
0x9c	0x042c	#CYRILLIC CAPITAL LETTER SOFT SIGN
0x9d	0x042d	#CYRILLIC CAPITAL LETTER E
0x9e	0x042e	#CYRILLIC CAPITAL LETTER YU
0x9f	0x042f	#CYRILLIC CAPITAL LETTER YA
0xa0	0x0430	#CYRILLIC SMALL LETTER A
0xa1	0x0431	#CYRILLIC SMALL LETTER BE
0xa2	0x0432	#CYRILLIC SMALL LETTER VE
0xa3	0x0433	#CYRILLIC SMALL LETTER GHE
0xa4	0x0434	#CYRILLIC SMALL LETTER DE
0xa5	0x0435	#CYRILLIC SMALL LETTER IE
0xa6	0x0436	#CYRILLIC SMALL LETTER ZHE
0xa7	0x0437	#CYRILLIC SMALL LETTER ZE
0xa8	0x0438	#CYRILLIC SMALL LETTER I
0xa9	0x0439	#CYRILLIC SMALL LETTER SHORT I
0xaa	0x043a	#CYRILLIC SMALL LETTER KA
0xab	0x043b	#CYRILLIC SMALL LETTER EL
0xac	0x043c	#CYRILLIC SMALL LETTER EM
0xad	0x043d	#CYRILLIC SMALL LETTER EN
0xae	0x043e	#CYRILLIC SMALL LETTER O
0xaf	0x043f	#CYRILLIC SMALL LETTER PE
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x258c	#LEFT HALF BLOCK
0xde	0x2590	#RIGHT HALF BLOCK
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x0440	#CYRILLIC SMALL LETTER ER
0xe1	0x0441	#CYRILLIC SMALL LETTER ES
0xe2	0x0442	#CYRILLIC SMALL LETTER TE
0xe3	0x0443	#CYRILLIC SMALL LETTER U
0xe4	0x0444	#CYRILLIC SMALL LETTER EF
0xe5	0x0445	#CYRILLIC SMALL LETTER HA
0xe6	0x0446	#CYRILLIC SMALL LETTER TSE
0xe7	0x0447	#CYRILLIC SMALL LETTER CHE
0xe8	0x0448	#CYRILLIC SMALL LETTER SHA
0xe9	0x0449	#CYRILLIC SMALL LETTER SHCHA
0xea	0x044a	#CYRILLIC SMALL LETTER HARD SIGN
0xeb	0x044b	#CYRILLIC SMALL LETTER YERU
0xec	0x044c	#CYRILLIC SMALL LETTER SOFT SIGN
0xed	0x044d	#CYRILLIC SMALL LETTER E
0xee	0x044e	#CYRILLIC SMALL LETTER YU
0xef	0x044f	#CYRILLIC SMALL LETTER YA
0xf0	0x0401	#CYRILLIC CAPITAL LETTER IO
0xf1	0x0451	#CYRILLIC SMALL LETTER IO
0xf2	0x0404	#CYRILLIC CAPITAL LETTER UKRAINIAN IE
0xf3	0x0454	#CYRILLIC SMALL LETTER UKRAINIAN IE
0xf4	0x0407	#CYRILLIC CAPITAL LETTER YI
0xf5	0x0457	#CYRILLIC SMALL LETTER YI
0xf6	0x040e	#CYRILLIC CAPITAL LETTER SHORT U
0xf7	0x045e	#CYRILLIC SMALL LETTER SHORT U
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x2219	#BULLET OPERATOR
0xfa	0x00b7	#MIDDLE DOT
0xfb	0x221a	#SQUARE ROOT
0xfc	0x2116	#NUMERO SIGN
0xfd	0x00a4	#CURRENCY SIGN
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE



Added freshlib/data/_encodings/_sources/CP869.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp869_DOSGreek2 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp869_DOSGreek2 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp869_DOSGreek2 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80		#UNDEFINED
0x81		#UNDEFINED
0x82		#UNDEFINED
0x83		#UNDEFINED
0x84		#UNDEFINED
0x85		#UNDEFINED
0x86	0x0386	#GREEK CAPITAL LETTER ALPHA WITH TONOS
0x87		#UNDEFINED
0x88	0x00b7	#MIDDLE DOT
0x89	0x00ac	#NOT SIGN
0x8a	0x00a6	#BROKEN BAR
0x8b	0x2018	#LEFT SINGLE QUOTATION MARK
0x8c	0x2019	#RIGHT SINGLE QUOTATION MARK
0x8d	0x0388	#GREEK CAPITAL LETTER EPSILON WITH TONOS
0x8e	0x2015	#HORIZONTAL BAR
0x8f	0x0389	#GREEK CAPITAL LETTER ETA WITH TONOS
0x90	0x038a	#GREEK CAPITAL LETTER IOTA WITH TONOS
0x91	0x03aa	#GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
0x92	0x038c	#GREEK CAPITAL LETTER OMICRON WITH TONOS
0x93		#UNDEFINED
0x94		#UNDEFINED
0x95	0x038e	#GREEK CAPITAL LETTER UPSILON WITH TONOS
0x96	0x03ab	#GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
0x97	0x00a9	#COPYRIGHT SIGN
0x98	0x038f	#GREEK CAPITAL LETTER OMEGA WITH TONOS
0x99	0x00b2	#SUPERSCRIPT TWO
0x9a	0x00b3	#SUPERSCRIPT THREE
0x9b	0x03ac	#GREEK SMALL LETTER ALPHA WITH TONOS
0x9c	0x00a3	#POUND SIGN
0x9d	0x03ad	#GREEK SMALL LETTER EPSILON WITH TONOS
0x9e	0x03ae	#GREEK SMALL LETTER ETA WITH TONOS
0x9f	0x03af	#GREEK SMALL LETTER IOTA WITH TONOS
0xa0	0x03ca	#GREEK SMALL LETTER IOTA WITH DIALYTIKA
0xa1	0x0390	#GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
0xa2	0x03cc	#GREEK SMALL LETTER OMICRON WITH TONOS
0xa3	0x03cd	#GREEK SMALL LETTER UPSILON WITH TONOS
0xa4	0x0391	#GREEK CAPITAL LETTER ALPHA
0xa5	0x0392	#GREEK CAPITAL LETTER BETA
0xa6	0x0393	#GREEK CAPITAL LETTER GAMMA
0xa7	0x0394	#GREEK CAPITAL LETTER DELTA
0xa8	0x0395	#GREEK CAPITAL LETTER EPSILON
0xa9	0x0396	#GREEK CAPITAL LETTER ZETA
0xaa	0x0397	#GREEK CAPITAL LETTER ETA
0xab	0x00bd	#VULGAR FRACTION ONE HALF
0xac	0x0398	#GREEK CAPITAL LETTER THETA
0xad	0x0399	#GREEK CAPITAL LETTER IOTA
0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xb0	0x2591	#LIGHT SHADE
0xb1	0x2592	#MEDIUM SHADE
0xb2	0x2593	#DARK SHADE
0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0xb5	0x039a	#GREEK CAPITAL LETTER KAPPA
0xb6	0x039b	#GREEK CAPITAL LETTER LAMDA
0xb7	0x039c	#GREEK CAPITAL LETTER MU
0xb8	0x039d	#GREEK CAPITAL LETTER NU
0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
0xbd	0x039e	#GREEK CAPITAL LETTER XI
0xbe	0x039f	#GREEK CAPITAL LETTER OMICRON
0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0xc6	0x03a0	#GREEK CAPITAL LETTER PI
0xc7	0x03a1	#GREEK CAPITAL LETTER RHO
0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xcf	0x03a3	#GREEK CAPITAL LETTER SIGMA
0xd0	0x03a4	#GREEK CAPITAL LETTER TAU
0xd1	0x03a5	#GREEK CAPITAL LETTER UPSILON
0xd2	0x03a6	#GREEK CAPITAL LETTER PHI
0xd3	0x03a7	#GREEK CAPITAL LETTER CHI
0xd4	0x03a8	#GREEK CAPITAL LETTER PSI
0xd5	0x03a9	#GREEK CAPITAL LETTER OMEGA
0xd6	0x03b1	#GREEK SMALL LETTER ALPHA
0xd7	0x03b2	#GREEK SMALL LETTER BETA
0xd8	0x03b3	#GREEK SMALL LETTER GAMMA
0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0xdb	0x2588	#FULL BLOCK
0xdc	0x2584	#LOWER HALF BLOCK
0xdd	0x03b4	#GREEK SMALL LETTER DELTA
0xde	0x03b5	#GREEK SMALL LETTER EPSILON
0xdf	0x2580	#UPPER HALF BLOCK
0xe0	0x03b6	#GREEK SMALL LETTER ZETA
0xe1	0x03b7	#GREEK SMALL LETTER ETA
0xe2	0x03b8	#GREEK SMALL LETTER THETA
0xe3	0x03b9	#GREEK SMALL LETTER IOTA
0xe4	0x03ba	#GREEK SMALL LETTER KAPPA
0xe5	0x03bb	#GREEK SMALL LETTER LAMDA
0xe6	0x03bc	#GREEK SMALL LETTER MU
0xe7	0x03bd	#GREEK SMALL LETTER NU
0xe8	0x03be	#GREEK SMALL LETTER XI
0xe9	0x03bf	#GREEK SMALL LETTER OMICRON
0xea	0x03c0	#GREEK SMALL LETTER PI
0xeb	0x03c1	#GREEK SMALL LETTER RHO
0xec	0x03c3	#GREEK SMALL LETTER SIGMA
0xed	0x03c2	#GREEK SMALL LETTER FINAL SIGMA
0xee	0x03c4	#GREEK SMALL LETTER TAU
0xef	0x0384	#GREEK TONOS
0xf0	0x00ad	#SOFT HYPHEN
0xf1	0x00b1	#PLUS-MINUS SIGN
0xf2	0x03c5	#GREEK SMALL LETTER UPSILON
0xf3	0x03c6	#GREEK SMALL LETTER PHI
0xf4	0x03c7	#GREEK SMALL LETTER CHI
0xf5	0x00a7	#SECTION SIGN
0xf6	0x03c8	#GREEK SMALL LETTER PSI
0xf7	0x0385	#GREEK DIALYTIKA TONOS
0xf8	0x00b0	#DEGREE SIGN
0xf9	0x00a8	#DIAERESIS
0xfa	0x03c9	#GREEK SMALL LETTER OMEGA
0xfb	0x03cb	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA
0xfc	0x03b0	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
0xfd	0x03ce	#GREEK SMALL LETTER OMEGA WITH TONOS
0xfe	0x25a0	#BLACK SQUARE
0xff	0x00a0	#NO-BREAK SPACE



Added freshlib/data/_encodings/_sources/CP874.TXT.





































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#
#    Name:     cp874 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/15/98
#
#    Contact: Shawn.Steele@microsoft.com
#                   
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp874 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp874 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	      	#UNDEFINED
0x83	      	#UNDEFINED
0x84	      	#UNDEFINED
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	      	#UNDEFINED
0x87	      	#UNDEFINED
0x88	      	#UNDEFINED
0x89	      	#UNDEFINED
0x8A	      	#UNDEFINED
0x8B	      	#UNDEFINED
0x8C	      	#UNDEFINED
0x8D	      	#UNDEFINED
0x8E	      	#UNDEFINED
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	      	#UNDEFINED
0x99	      	#UNDEFINED
0x9A	      	#UNDEFINED
0x9B	      	#UNDEFINED
0x9C	      	#UNDEFINED
0x9D	      	#UNDEFINED
0x9E	      	#UNDEFINED
0x9F	      	#UNDEFINED
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x0E01	#THAI CHARACTER KO KAI
0xA2	0x0E02	#THAI CHARACTER KHO KHAI
0xA3	0x0E03	#THAI CHARACTER KHO KHUAT
0xA4	0x0E04	#THAI CHARACTER KHO KHWAI
0xA5	0x0E05	#THAI CHARACTER KHO KHON
0xA6	0x0E06	#THAI CHARACTER KHO RAKHANG
0xA7	0x0E07	#THAI CHARACTER NGO NGU
0xA8	0x0E08	#THAI CHARACTER CHO CHAN
0xA9	0x0E09	#THAI CHARACTER CHO CHING
0xAA	0x0E0A	#THAI CHARACTER CHO CHANG
0xAB	0x0E0B	#THAI CHARACTER SO SO
0xAC	0x0E0C	#THAI CHARACTER CHO CHOE
0xAD	0x0E0D	#THAI CHARACTER YO YING
0xAE	0x0E0E	#THAI CHARACTER DO CHADA
0xAF	0x0E0F	#THAI CHARACTER TO PATAK
0xB0	0x0E10	#THAI CHARACTER THO THAN
0xB1	0x0E11	#THAI CHARACTER THO NANGMONTHO
0xB2	0x0E12	#THAI CHARACTER THO PHUTHAO
0xB3	0x0E13	#THAI CHARACTER NO NEN
0xB4	0x0E14	#THAI CHARACTER DO DEK
0xB5	0x0E15	#THAI CHARACTER TO TAO
0xB6	0x0E16	#THAI CHARACTER THO THUNG
0xB7	0x0E17	#THAI CHARACTER THO THAHAN
0xB8	0x0E18	#THAI CHARACTER THO THONG
0xB9	0x0E19	#THAI CHARACTER NO NU
0xBA	0x0E1A	#THAI CHARACTER BO BAIMAI
0xBB	0x0E1B	#THAI CHARACTER PO PLA
0xBC	0x0E1C	#THAI CHARACTER PHO PHUNG
0xBD	0x0E1D	#THAI CHARACTER FO FA
0xBE	0x0E1E	#THAI CHARACTER PHO PHAN
0xBF	0x0E1F	#THAI CHARACTER FO FAN
0xC0	0x0E20	#THAI CHARACTER PHO SAMPHAO
0xC1	0x0E21	#THAI CHARACTER MO MA
0xC2	0x0E22	#THAI CHARACTER YO YAK
0xC3	0x0E23	#THAI CHARACTER RO RUA
0xC4	0x0E24	#THAI CHARACTER RU
0xC5	0x0E25	#THAI CHARACTER LO LING
0xC6	0x0E26	#THAI CHARACTER LU
0xC7	0x0E27	#THAI CHARACTER WO WAEN
0xC8	0x0E28	#THAI CHARACTER SO SALA
0xC9	0x0E29	#THAI CHARACTER SO RUSI
0xCA	0x0E2A	#THAI CHARACTER SO SUA
0xCB	0x0E2B	#THAI CHARACTER HO HIP
0xCC	0x0E2C	#THAI CHARACTER LO CHULA
0xCD	0x0E2D	#THAI CHARACTER O ANG
0xCE	0x0E2E	#THAI CHARACTER HO NOKHUK
0xCF	0x0E2F	#THAI CHARACTER PAIYANNOI
0xD0	0x0E30	#THAI CHARACTER SARA A
0xD1	0x0E31	#THAI CHARACTER MAI HAN-AKAT
0xD2	0x0E32	#THAI CHARACTER SARA AA
0xD3	0x0E33	#THAI CHARACTER SARA AM
0xD4	0x0E34	#THAI CHARACTER SARA I
0xD5	0x0E35	#THAI CHARACTER SARA II
0xD6	0x0E36	#THAI CHARACTER SARA UE
0xD7	0x0E37	#THAI CHARACTER SARA UEE
0xD8	0x0E38	#THAI CHARACTER SARA U
0xD9	0x0E39	#THAI CHARACTER SARA UU
0xDA	0x0E3A	#THAI CHARACTER PHINTHU
0xDB	      	#UNDEFINED
0xDC	      	#UNDEFINED
0xDD	      	#UNDEFINED
0xDE	      	#UNDEFINED
0xDF	0x0E3F	#THAI CURRENCY SYMBOL BAHT
0xE0	0x0E40	#THAI CHARACTER SARA E
0xE1	0x0E41	#THAI CHARACTER SARA AE
0xE2	0x0E42	#THAI CHARACTER SARA O
0xE3	0x0E43	#THAI CHARACTER SARA AI MAIMUAN
0xE4	0x0E44	#THAI CHARACTER SARA AI MAIMALAI
0xE5	0x0E45	#THAI CHARACTER LAKKHANGYAO
0xE6	0x0E46	#THAI CHARACTER MAIYAMOK
0xE7	0x0E47	#THAI CHARACTER MAITAIKHU
0xE8	0x0E48	#THAI CHARACTER MAI EK
0xE9	0x0E49	#THAI CHARACTER MAI THO
0xEA	0x0E4A	#THAI CHARACTER MAI TRI
0xEB	0x0E4B	#THAI CHARACTER MAI CHATTAWA
0xEC	0x0E4C	#THAI CHARACTER THANTHAKHAT
0xED	0x0E4D	#THAI CHARACTER NIKHAHIT
0xEE	0x0E4E	#THAI CHARACTER YAMAKKAN
0xEF	0x0E4F	#THAI CHARACTER FONGMAN
0xF0	0x0E50	#THAI DIGIT ZERO
0xF1	0x0E51	#THAI DIGIT ONE
0xF2	0x0E52	#THAI DIGIT TWO
0xF3	0x0E53	#THAI DIGIT THREE
0xF4	0x0E54	#THAI DIGIT FOUR
0xF5	0x0E55	#THAI DIGIT FIVE
0xF6	0x0E56	#THAI DIGIT SIX
0xF7	0x0E57	#THAI DIGIT SEVEN
0xF8	0x0E58	#THAI DIGIT EIGHT
0xF9	0x0E59	#THAI DIGIT NINE
0xFA	0x0E5A	#THAI CHARACTER ANGKHANKHU
0xFB	0x0E5B	#THAI CHARACTER KHOMUT
0xFC	      	#UNDEFINED
0xFD	      	#UNDEFINED
0xFE	      	#UNDEFINED
0xFF	      	#UNDEFINED

Added freshlib/data/_encodings/_sources/CP875.TXT.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#
#    Name:     cp875_IBMGreek to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table format:  Format A
#    Date:          04/24/96
#    Contact: Shawn.Steele@microsoft.com
# 
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp875_IBMGreek code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp875_IBMGreek order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x009C	#CONTROL
0x05	0x0009	#HORIZONTAL TABULATION
0x06	0x0086	#CONTROL
0x07	0x007F	#DELETE
0x08	0x0097	#CONTROL
0x09	0x008D	#CONTROL
0x0A	0x008E	#CONTROL
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x009D	#CONTROL
0x15	0x0085	#CONTROL
0x16	0x0008	#BACKSPACE
0x17	0x0087	#CONTROL
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x0092	#CONTROL
0x1B	0x008F	#CONTROL
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0080	#CONTROL
0x21	0x0081	#CONTROL
0x22	0x0082	#CONTROL
0x23	0x0083	#CONTROL
0x24	0x0084	#CONTROL
0x25	0x000A	#LINE FEED
0x26	0x0017	#END OF TRANSMISSION BLOCK
0x27	0x001B	#ESCAPE
0x28	0x0088	#CONTROL
0x29	0x0089	#CONTROL
0x2A	0x008A	#CONTROL
0x2B	0x008B	#CONTROL
0x2C	0x008C	#CONTROL
0x2D	0x0005	#ENQUIRY
0x2E	0x0006	#ACKNOWLEDGE
0x2F	0x0007	#BELL
0x30	0x0090	#CONTROL
0x31	0x0091	#CONTROL
0x32	0x0016	#SYNCHRONOUS IDLE
0x33	0x0093	#CONTROL
0x34	0x0094	#CONTROL
0x35	0x0095	#CONTROL
0x36	0x0096	#CONTROL
0x37	0x0004	#END OF TRANSMISSION
0x38	0x0098	#CONTROL
0x39	0x0099	#CONTROL
0x3A	0x009A	#CONTROL
0x3B	0x009B	#CONTROL
0x3C	0x0014	#DEVICE CONTROL FOUR
0x3D	0x0015	#NEGATIVE ACKNOWLEDGE
0x3E	0x009E	#CONTROL
0x3F	0x001A	#SUBSTITUTE
0x40	0x0020	#SPACE
0x41	0x0391	#GREEK CAPITAL LETTER ALPHA
0x42	0x0392	#GREEK CAPITAL LETTER BETA
0x43	0x0393	#GREEK CAPITAL LETTER GAMMA
0x44	0x0394	#GREEK CAPITAL LETTER DELTA
0x45	0x0395	#GREEK CAPITAL LETTER EPSILON
0x46	0x0396	#GREEK CAPITAL LETTER ZETA
0x47	0x0397	#GREEK CAPITAL LETTER ETA
0x48	0x0398	#GREEK CAPITAL LETTER THETA
0x49	0x0399	#GREEK CAPITAL LETTER IOTA
0x4A	0x005B	#LEFT SQUARE BRACKET
0x4B	0x002E	#FULL STOP
0x4C	0x003C	#LESS-THAN SIGN
0x4D	0x0028	#LEFT PARENTHESIS
0x4E	0x002B	#PLUS SIGN
0x4F	0x0021	#EXCLAMATION MARK
0x50	0x0026	#AMPERSAND
0x51	0x039A	#GREEK CAPITAL LETTER KAPPA
0x52	0x039B	#GREEK CAPITAL LETTER LAMDA
0x53	0x039C	#GREEK CAPITAL LETTER MU
0x54	0x039D	#GREEK CAPITAL LETTER NU
0x55	0x039E	#GREEK CAPITAL LETTER XI
0x56	0x039F	#GREEK CAPITAL LETTER OMICRON
0x57	0x03A0	#GREEK CAPITAL LETTER PI
0x58	0x03A1	#GREEK CAPITAL LETTER RHO
0x59	0x03A3	#GREEK CAPITAL LETTER SIGMA
0x5A	0x005D	#RIGHT SQUARE BRACKET
0x5B	0x0024	#DOLLAR SIGN
0x5C	0x002A	#ASTERISK
0x5D	0x0029	#RIGHT PARENTHESIS
0x5E	0x003B	#SEMICOLON
0x5F	0x005E	#CIRCUMFLEX ACCENT
0x60	0x002D	#HYPHEN-MINUS
0x61	0x002F	#SOLIDUS
0x62	0x03A4	#GREEK CAPITAL LETTER TAU
0x63	0x03A5	#GREEK CAPITAL LETTER UPSILON
0x64	0x03A6	#GREEK CAPITAL LETTER PHI
0x65	0x03A7	#GREEK CAPITAL LETTER CHI
0x66	0x03A8	#GREEK CAPITAL LETTER PSI
0x67	0x03A9	#GREEK CAPITAL LETTER OMEGA
0x68	0x03AA	#GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
0x69	0x03AB	#GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
0x6A	0x007C	#VERTICAL LINE
0x6B	0x002C	#COMMA
0x6C	0x0025	#PERCENT SIGN
0x6D	0x005F	#LOW LINE
0x6E	0x003E	#GREATER-THAN SIGN
0x6F	0x003F	#QUESTION MARK
0x70	0x00A8	#DIAERESIS
0x71	0x0386	#GREEK CAPITAL LETTER ALPHA WITH TONOS
0x72	0x0388	#GREEK CAPITAL LETTER EPSILON WITH TONOS
0x73	0x0389	#GREEK CAPITAL LETTER ETA WITH TONOS
0x74	0x00A0	#NO-BREAK SPACE
0x75	0x038A	#GREEK CAPITAL LETTER IOTA WITH TONOS
0x76	0x038C	#GREEK CAPITAL LETTER OMICRON WITH TONOS
0x77	0x038E	#GREEK CAPITAL LETTER UPSILON WITH TONOS
0x78	0x038F	#GREEK CAPITAL LETTER OMEGA WITH TONOS
0x79	0x0060	#GRAVE ACCENT
0x7A	0x003A	#COLON
0x7B	0x0023	#NUMBER SIGN
0x7C	0x0040	#COMMERCIAL AT
0x7D	0x0027	#APOSTROPHE
0x7E	0x003D	#EQUALS SIGN
0x7F	0x0022	#QUOTATION MARK
0x80	0x0385	#GREEK DIALYTIKA TONOS
0x81	0x0061	#LATIN SMALL LETTER A
0x82	0x0062	#LATIN SMALL LETTER B
0x83	0x0063	#LATIN SMALL LETTER C
0x84	0x0064	#LATIN SMALL LETTER D
0x85	0x0065	#LATIN SMALL LETTER E
0x86	0x0066	#LATIN SMALL LETTER F
0x87	0x0067	#LATIN SMALL LETTER G
0x88	0x0068	#LATIN SMALL LETTER H
0x89	0x0069	#LATIN SMALL LETTER I
0x8A	0x03B1	#GREEK SMALL LETTER ALPHA
0x8B	0x03B2	#GREEK SMALL LETTER BETA
0x8C	0x03B3	#GREEK SMALL LETTER GAMMA
0x8D	0x03B4	#GREEK SMALL LETTER DELTA
0x8E	0x03B5	#GREEK SMALL LETTER EPSILON
0x8F	0x03B6	#GREEK SMALL LETTER ZETA
0x90	0x00B0	#DEGREE SIGN
0x91	0x006A	#LATIN SMALL LETTER J
0x92	0x006B	#LATIN SMALL LETTER K
0x93	0x006C	#LATIN SMALL LETTER L
0x94	0x006D	#LATIN SMALL LETTER M
0x95	0x006E	#LATIN SMALL LETTER N
0x96	0x006F	#LATIN SMALL LETTER O
0x97	0x0070	#LATIN SMALL LETTER P
0x98	0x0071	#LATIN SMALL LETTER Q
0x99	0x0072	#LATIN SMALL LETTER R
0x9A	0x03B7	#GREEK SMALL LETTER ETA
0x9B	0x03B8	#GREEK SMALL LETTER THETA
0x9C	0x03B9	#GREEK SMALL LETTER IOTA
0x9D	0x03BA	#GREEK SMALL LETTER KAPPA
0x9E	0x03BB	#GREEK SMALL LETTER LAMDA
0x9F	0x03BC	#GREEK SMALL LETTER MU
0xA0	0x00B4	#ACUTE ACCENT
0xA1	0x007E	#TILDE
0xA2	0x0073	#LATIN SMALL LETTER S
0xA3	0x0074	#LATIN SMALL LETTER T
0xA4	0x0075	#LATIN SMALL LETTER U
0xA5	0x0076	#LATIN SMALL LETTER V
0xA6	0x0077	#LATIN SMALL LETTER W
0xA7	0x0078	#LATIN SMALL LETTER X
0xA8	0x0079	#LATIN SMALL LETTER Y
0xA9	0x007A	#LATIN SMALL LETTER Z
0xAA	0x03BD	#GREEK SMALL LETTER NU
0xAB	0x03BE	#GREEK SMALL LETTER XI
0xAC	0x03BF	#GREEK SMALL LETTER OMICRON
0xAD	0x03C0	#GREEK SMALL LETTER PI
0xAE	0x03C1	#GREEK SMALL LETTER RHO
0xAF	0x03C3	#GREEK SMALL LETTER SIGMA
0xB0	0x00A3	#POUND SIGN
0xB1	0x03AC	#GREEK SMALL LETTER ALPHA WITH TONOS
0xB2	0x03AD	#GREEK SMALL LETTER EPSILON WITH TONOS
0xB3	0x03AE	#GREEK SMALL LETTER ETA WITH TONOS
0xB4	0x03CA	#GREEK SMALL LETTER IOTA WITH DIALYTIKA
0xB5	0x03AF	#GREEK SMALL LETTER IOTA WITH TONOS
0xB6	0x03CC	#GREEK SMALL LETTER OMICRON WITH TONOS
0xB7	0x03CD	#GREEK SMALL LETTER UPSILON WITH TONOS
0xB8	0x03CB	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA
0xB9	0x03CE	#GREEK SMALL LETTER OMEGA WITH TONOS
0xBA	0x03C2	#GREEK SMALL LETTER FINAL SIGMA
0xBB	0x03C4	#GREEK SMALL LETTER TAU
0xBC	0x03C5	#GREEK SMALL LETTER UPSILON
0xBD	0x03C6	#GREEK SMALL LETTER PHI
0xBE	0x03C7	#GREEK SMALL LETTER CHI
0xBF	0x03C8	#GREEK SMALL LETTER PSI
0xC0	0x007B	#LEFT CURLY BRACKET
0xC1	0x0041	#LATIN CAPITAL LETTER A
0xC2	0x0042	#LATIN CAPITAL LETTER B
0xC3	0x0043	#LATIN CAPITAL LETTER C
0xC4	0x0044	#LATIN CAPITAL LETTER D
0xC5	0x0045	#LATIN CAPITAL LETTER E
0xC6	0x0046	#LATIN CAPITAL LETTER F
0xC7	0x0047	#LATIN CAPITAL LETTER G
0xC8	0x0048	#LATIN CAPITAL LETTER H
0xC9	0x0049	#LATIN CAPITAL LETTER I
0xCA	0x00AD	#SOFT HYPHEN
0xCB	0x03C9	#GREEK SMALL LETTER OMEGA
0xCC	0x0390	#GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
0xCD	0x03B0	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
0xCE	0x2018	#LEFT SINGLE QUOTATION MARK
0xCF	0x2015	#HORIZONTAL BAR
0xD0	0x007D	#RIGHT CURLY BRACKET
0xD1	0x004A	#LATIN CAPITAL LETTER J
0xD2	0x004B	#LATIN CAPITAL LETTER K
0xD3	0x004C	#LATIN CAPITAL LETTER L
0xD4	0x004D	#LATIN CAPITAL LETTER M
0xD5	0x004E	#LATIN CAPITAL LETTER N
0xD6	0x004F	#LATIN CAPITAL LETTER O
0xD7	0x0050	#LATIN CAPITAL LETTER P
0xD8	0x0051	#LATIN CAPITAL LETTER Q
0xD9	0x0052	#LATIN CAPITAL LETTER R
0xDA	0x00B1	#PLUS-MINUS SIGN
0xDB	0x00BD	#VULGAR FRACTION ONE HALF
0xDC	0x001A	#SUBSTITUTE
0xDD	0x0387	#GREEK ANO TELEIA
0xDE	0x2019	#RIGHT SINGLE QUOTATION MARK
0xDF	0x00A6	#BROKEN BAR
0xE0	0x005C	#REVERSE SOLIDUS
0xE1	0x001A	#SUBSTITUTE
0xE2	0x0053	#LATIN CAPITAL LETTER S
0xE3	0x0054	#LATIN CAPITAL LETTER T
0xE4	0x0055	#LATIN CAPITAL LETTER U
0xE5	0x0056	#LATIN CAPITAL LETTER V
0xE6	0x0057	#LATIN CAPITAL LETTER W
0xE7	0x0058	#LATIN CAPITAL LETTER X
0xE8	0x0059	#LATIN CAPITAL LETTER Y
0xE9	0x005A	#LATIN CAPITAL LETTER Z
0xEA	0x00B2	#SUPERSCRIPT TWO
0xEB	0x00A7	#SECTION SIGN
0xEC	0x001A	#SUBSTITUTE
0xED	0x001A	#SUBSTITUTE
0xEE	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xEF	0x00AC	#NOT SIGN
0xF0	0x0030	#DIGIT ZERO
0xF1	0x0031	#DIGIT ONE
0xF2	0x0032	#DIGIT TWO
0xF3	0x0033	#DIGIT THREE
0xF4	0x0034	#DIGIT FOUR
0xF5	0x0035	#DIGIT FIVE
0xF6	0x0036	#DIGIT SIX
0xF7	0x0037	#DIGIT SEVEN
0xF8	0x0038	#DIGIT EIGHT
0xF9	0x0039	#DIGIT NINE
0xFA	0x00B3	#SUPERSCRIPT THREE
0xFB	0x00A9	#COPYRIGHT SIGN
0xFC	0x001A	#SUBSTITUTE
0xFD	0x001A	#SUBSTITUTE
0xFE	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xFF	0x009F	#CONTROL



Added freshlib/data/_encodings/_sources/CP932.TXT.





























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733
7734
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
#
#    Name:     cp932 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/15/98
#
#    Contact:       Shawn.Steele@microsoft.com
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp932 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp932 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	      	#UNDEFINED
0x81	      	#DBCS LEAD BYTE
0x82	      	#DBCS LEAD BYTE
0x83	      	#DBCS LEAD BYTE
0x84	      	#DBCS LEAD BYTE
0x85	      	#DBCS LEAD BYTE
0x86	      	#DBCS LEAD BYTE
0x87	      	#DBCS LEAD BYTE
0x88	      	#DBCS LEAD BYTE
0x89	      	#DBCS LEAD BYTE
0x8A	      	#DBCS LEAD BYTE
0x8B	      	#DBCS LEAD BYTE
0x8C	      	#DBCS LEAD BYTE
0x8D	      	#DBCS LEAD BYTE
0x8E	      	#DBCS LEAD BYTE
0x8F	      	#DBCS LEAD BYTE
0x90	      	#DBCS LEAD BYTE
0x91	      	#DBCS LEAD BYTE
0x92	      	#DBCS LEAD BYTE
0x93	      	#DBCS LEAD BYTE
0x94	      	#DBCS LEAD BYTE
0x95	      	#DBCS LEAD BYTE
0x96	      	#DBCS LEAD BYTE
0x97	      	#DBCS LEAD BYTE
0x98	      	#DBCS LEAD BYTE
0x99	      	#DBCS LEAD BYTE
0x9A	      	#DBCS LEAD BYTE
0x9B	      	#DBCS LEAD BYTE
0x9C	      	#DBCS LEAD BYTE
0x9D	      	#DBCS LEAD BYTE
0x9E	      	#DBCS LEAD BYTE
0x9F	      	#DBCS LEAD BYTE
0xA0	      	#UNDEFINED
0xA1	0xFF61	#HALFWIDTH IDEOGRAPHIC FULL STOP
0xA2	0xFF62	#HALFWIDTH LEFT CORNER BRACKET
0xA3	0xFF63	#HALFWIDTH RIGHT CORNER BRACKET
0xA4	0xFF64	#HALFWIDTH IDEOGRAPHIC COMMA
0xA5	0xFF65	#HALFWIDTH KATAKANA MIDDLE DOT
0xA6	0xFF66	#HALFWIDTH KATAKANA LETTER WO
0xA7	0xFF67	#HALFWIDTH KATAKANA LETTER SMALL A
0xA8	0xFF68	#HALFWIDTH KATAKANA LETTER SMALL I
0xA9	0xFF69	#HALFWIDTH KATAKANA LETTER SMALL U
0xAA	0xFF6A	#HALFWIDTH KATAKANA LETTER SMALL E
0xAB	0xFF6B	#HALFWIDTH KATAKANA LETTER SMALL O
0xAC	0xFF6C	#HALFWIDTH KATAKANA LETTER SMALL YA
0xAD	0xFF6D	#HALFWIDTH KATAKANA LETTER SMALL YU
0xAE	0xFF6E	#HALFWIDTH KATAKANA LETTER SMALL YO
0xAF	0xFF6F	#HALFWIDTH KATAKANA LETTER SMALL TU
0xB0	0xFF70	#HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
0xB1	0xFF71	#HALFWIDTH KATAKANA LETTER A
0xB2	0xFF72	#HALFWIDTH KATAKANA LETTER I
0xB3	0xFF73	#HALFWIDTH KATAKANA LETTER U
0xB4	0xFF74	#HALFWIDTH KATAKANA LETTER E
0xB5	0xFF75	#HALFWIDTH KATAKANA LETTER O
0xB6	0xFF76	#HALFWIDTH KATAKANA LETTER KA
0xB7	0xFF77	#HALFWIDTH KATAKANA LETTER KI
0xB8	0xFF78	#HALFWIDTH KATAKANA LETTER KU
0xB9	0xFF79	#HALFWIDTH KATAKANA LETTER KE
0xBA	0xFF7A	#HALFWIDTH KATAKANA LETTER KO
0xBB	0xFF7B	#HALFWIDTH KATAKANA LETTER SA
0xBC	0xFF7C	#HALFWIDTH KATAKANA LETTER SI
0xBD	0xFF7D	#HALFWIDTH KATAKANA LETTER SU
0xBE	0xFF7E	#HALFWIDTH KATAKANA LETTER SE
0xBF	0xFF7F	#HALFWIDTH KATAKANA LETTER SO
0xC0	0xFF80	#HALFWIDTH KATAKANA LETTER TA
0xC1	0xFF81	#HALFWIDTH KATAKANA LETTER TI
0xC2	0xFF82	#HALFWIDTH KATAKANA LETTER TU
0xC3	0xFF83	#HALFWIDTH KATAKANA LETTER TE
0xC4	0xFF84	#HALFWIDTH KATAKANA LETTER TO
0xC5	0xFF85	#HALFWIDTH KATAKANA LETTER NA
0xC6	0xFF86	#HALFWIDTH KATAKANA LETTER NI
0xC7	0xFF87	#HALFWIDTH KATAKANA LETTER NU
0xC8	0xFF88	#HALFWIDTH KATAKANA LETTER NE
0xC9	0xFF89	#HALFWIDTH KATAKANA LETTER NO
0xCA	0xFF8A	#HALFWIDTH KATAKANA LETTER HA
0xCB	0xFF8B	#HALFWIDTH KATAKANA LETTER HI
0xCC	0xFF8C	#HALFWIDTH KATAKANA LETTER HU
0xCD	0xFF8D	#HALFWIDTH KATAKANA LETTER HE
0xCE	0xFF8E	#HALFWIDTH KATAKANA LETTER HO
0xCF	0xFF8F	#HALFWIDTH KATAKANA LETTER MA
0xD0	0xFF90	#HALFWIDTH KATAKANA LETTER MI
0xD1	0xFF91	#HALFWIDTH KATAKANA LETTER MU
0xD2	0xFF92	#HALFWIDTH KATAKANA LETTER ME
0xD3	0xFF93	#HALFWIDTH KATAKANA LETTER MO
0xD4	0xFF94	#HALFWIDTH KATAKANA LETTER YA
0xD5	0xFF95	#HALFWIDTH KATAKANA LETTER YU
0xD6	0xFF96	#HALFWIDTH KATAKANA LETTER YO
0xD7	0xFF97	#HALFWIDTH KATAKANA LETTER RA
0xD8	0xFF98	#HALFWIDTH KATAKANA LETTER RI
0xD9	0xFF99	#HALFWIDTH KATAKANA LETTER RU
0xDA	0xFF9A	#HALFWIDTH KATAKANA LETTER RE
0xDB	0xFF9B	#HALFWIDTH KATAKANA LETTER RO
0xDC	0xFF9C	#HALFWIDTH KATAKANA LETTER WA
0xDD	0xFF9D	#HALFWIDTH KATAKANA LETTER N
0xDE	0xFF9E	#HALFWIDTH KATAKANA VOICED SOUND MARK
0xDF	0xFF9F	#HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
0xE0	      	#DBCS LEAD BYTE
0xE1	      	#DBCS LEAD BYTE
0xE2	      	#DBCS LEAD BYTE
0xE3	      	#DBCS LEAD BYTE
0xE4	      	#DBCS LEAD BYTE
0xE5	      	#DBCS LEAD BYTE
0xE6	      	#DBCS LEAD BYTE
0xE7	      	#DBCS LEAD BYTE
0xE8	      	#DBCS LEAD BYTE
0xE9	      	#DBCS LEAD BYTE
0xEA	      	#DBCS LEAD BYTE
0xEB	      	#DBCS LEAD BYTE
0xEC	      	#DBCS LEAD BYTE
0xED	      	#DBCS LEAD BYTE
0xEE	      	#DBCS LEAD BYTE
0xEF	      	#DBCS LEAD BYTE
0xF0	      	#DBCS LEAD BYTE
0xF1	      	#DBCS LEAD BYTE
0xF2	      	#DBCS LEAD BYTE
0xF3	      	#DBCS LEAD BYTE
0xF4	      	#DBCS LEAD BYTE
0xF5	      	#DBCS LEAD BYTE
0xF6	      	#DBCS LEAD BYTE
0xF7	      	#DBCS LEAD BYTE
0xF8	      	#DBCS LEAD BYTE
0xF9	      	#DBCS LEAD BYTE
0xFA	      	#DBCS LEAD BYTE
0xFB	      	#DBCS LEAD BYTE
0xFC	      	#DBCS LEAD BYTE
0xFD	      	#UNDEFINED
0xFE	      	#UNDEFINED
0xFF	      	#UNDEFINED
0x8140	0x3000	#IDEOGRAPHIC SPACE
0x8141	0x3001	#IDEOGRAPHIC COMMA
0x8142	0x3002	#IDEOGRAPHIC FULL STOP
0x8143	0xFF0C	#FULLWIDTH COMMA
0x8144	0xFF0E	#FULLWIDTH FULL STOP
0x8145	0x30FB	#KATAKANA MIDDLE DOT
0x8146	0xFF1A	#FULLWIDTH COLON
0x8147	0xFF1B	#FULLWIDTH SEMICOLON
0x8148	0xFF1F	#FULLWIDTH QUESTION MARK
0x8149	0xFF01	#FULLWIDTH EXCLAMATION MARK
0x814A	0x309B	#KATAKANA-HIRAGANA VOICED SOUND MARK
0x814B	0x309C	#KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
0x814C	0x00B4	#ACUTE ACCENT
0x814D	0xFF40	#FULLWIDTH GRAVE ACCENT
0x814E	0x00A8	#DIAERESIS
0x814F	0xFF3E	#FULLWIDTH CIRCUMFLEX ACCENT
0x8150	0xFFE3	#FULLWIDTH MACRON
0x8151	0xFF3F	#FULLWIDTH LOW LINE
0x8152	0x30FD	#KATAKANA ITERATION MARK
0x8153	0x30FE	#KATAKANA VOICED ITERATION MARK
0x8154	0x309D	#HIRAGANA ITERATION MARK
0x8155	0x309E	#HIRAGANA VOICED ITERATION MARK
0x8156	0x3003	#DITTO MARK
0x8157	0x4EDD	#CJK UNIFIED IDEOGRAPH
0x8158	0x3005	#IDEOGRAPHIC ITERATION MARK
0x8159	0x3006	#IDEOGRAPHIC CLOSING MARK
0x815A	0x3007	#IDEOGRAPHIC NUMBER ZERO
0x815B	0x30FC	#KATAKANA-HIRAGANA PROLONGED SOUND MARK
0x815C	0x2015	#HORIZONTAL BAR
0x815D	0x2010	#HYPHEN
0x815E	0xFF0F	#FULLWIDTH SOLIDUS
0x815F	0xFF3C	#FULLWIDTH REVERSE SOLIDUS
0x8160	0xFF5E	#FULLWIDTH TILDE
0x8161	0x2225	#PARALLEL TO
0x8162	0xFF5C	#FULLWIDTH VERTICAL LINE
0x8163	0x2026	#HORIZONTAL ELLIPSIS
0x8164	0x2025	#TWO DOT LEADER
0x8165	0x2018	#LEFT SINGLE QUOTATION MARK
0x8166	0x2019	#RIGHT SINGLE QUOTATION MARK
0x8167	0x201C	#LEFT DOUBLE QUOTATION MARK
0x8168	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x8169	0xFF08	#FULLWIDTH LEFT PARENTHESIS
0x816A	0xFF09	#FULLWIDTH RIGHT PARENTHESIS
0x816B	0x3014	#LEFT TORTOISE SHELL BRACKET
0x816C	0x3015	#RIGHT TORTOISE SHELL BRACKET
0x816D	0xFF3B	#FULLWIDTH LEFT SQUARE BRACKET
0x816E	0xFF3D	#FULLWIDTH RIGHT SQUARE BRACKET
0x816F	0xFF5B	#FULLWIDTH LEFT CURLY BRACKET
0x8170	0xFF5D	#FULLWIDTH RIGHT CURLY BRACKET
0x8171	0x3008	#LEFT ANGLE BRACKET
0x8172	0x3009	#RIGHT ANGLE BRACKET
0x8173	0x300A	#LEFT DOUBLE ANGLE BRACKET
0x8174	0x300B	#RIGHT DOUBLE ANGLE BRACKET
0x8175	0x300C	#LEFT CORNER BRACKET
0x8176	0x300D	#RIGHT CORNER BRACKET
0x8177	0x300E	#LEFT WHITE CORNER BRACKET
0x8178	0x300F	#RIGHT WHITE CORNER BRACKET
0x8179	0x3010	#LEFT BLACK LENTICULAR BRACKET
0x817A	0x3011	#RIGHT BLACK LENTICULAR BRACKET
0x817B	0xFF0B	#FULLWIDTH PLUS SIGN
0x817C	0xFF0D	#FULLWIDTH HYPHEN-MINUS
0x817D	0x00B1	#PLUS-MINUS SIGN
0x817E	0x00D7	#MULTIPLICATION SIGN
0x8180	0x00F7	#DIVISION SIGN
0x8181	0xFF1D	#FULLWIDTH EQUALS SIGN
0x8182	0x2260	#NOT EQUAL TO
0x8183	0xFF1C	#FULLWIDTH LESS-THAN SIGN
0x8184	0xFF1E	#FULLWIDTH GREATER-THAN SIGN
0x8185	0x2266	#LESS-THAN OVER EQUAL TO
0x8186	0x2267	#GREATER-THAN OVER EQUAL TO
0x8187	0x221E	#INFINITY
0x8188	0x2234	#THEREFORE
0x8189	0x2642	#MALE SIGN
0x818A	0x2640	#FEMALE SIGN
0x818B	0x00B0	#DEGREE SIGN
0x818C	0x2032	#PRIME
0x818D	0x2033	#DOUBLE PRIME
0x818E	0x2103	#DEGREE CELSIUS
0x818F	0xFFE5	#FULLWIDTH YEN SIGN
0x8190	0xFF04	#FULLWIDTH DOLLAR SIGN
0x8191	0xFFE0	#FULLWIDTH CENT SIGN
0x8192	0xFFE1	#FULLWIDTH POUND SIGN
0x8193	0xFF05	#FULLWIDTH PERCENT SIGN
0x8194	0xFF03	#FULLWIDTH NUMBER SIGN
0x8195	0xFF06	#FULLWIDTH AMPERSAND
0x8196	0xFF0A	#FULLWIDTH ASTERISK
0x8197	0xFF20	#FULLWIDTH COMMERCIAL AT
0x8198	0x00A7	#SECTION SIGN
0x8199	0x2606	#WHITE STAR
0x819A	0x2605	#BLACK STAR
0x819B	0x25CB	#WHITE CIRCLE
0x819C	0x25CF	#BLACK CIRCLE
0x819D	0x25CE	#BULLSEYE
0x819E	0x25C7	#WHITE DIAMOND
0x819F	0x25C6	#BLACK DIAMOND
0x81A0	0x25A1	#WHITE SQUARE
0x81A1	0x25A0	#BLACK SQUARE
0x81A2	0x25B3	#WHITE UP-POINTING TRIANGLE
0x81A3	0x25B2	#BLACK UP-POINTING TRIANGLE
0x81A4	0x25BD	#WHITE DOWN-POINTING TRIANGLE
0x81A5	0x25BC	#BLACK DOWN-POINTING TRIANGLE
0x81A6	0x203B	#REFERENCE MARK
0x81A7	0x3012	#POSTAL MARK
0x81A8	0x2192	#RIGHTWARDS ARROW
0x81A9	0x2190	#LEFTWARDS ARROW
0x81AA	0x2191	#UPWARDS ARROW
0x81AB	0x2193	#DOWNWARDS ARROW
0x81AC	0x3013	#GETA MARK
0x81B8	0x2208	#ELEMENT OF
0x81B9	0x220B	#CONTAINS AS MEMBER
0x81BA	0x2286	#SUBSET OF OR EQUAL TO
0x81BB	0x2287	#SUPERSET OF OR EQUAL TO
0x81BC	0x2282	#SUBSET OF
0x81BD	0x2283	#SUPERSET OF
0x81BE	0x222A	#UNION
0x81BF	0x2229	#INTERSECTION
0x81C8	0x2227	#LOGICAL AND
0x81C9	0x2228	#LOGICAL OR
0x81CA	0xFFE2	#FULLWIDTH NOT SIGN
0x81CB	0x21D2	#RIGHTWARDS DOUBLE ARROW
0x81CC	0x21D4	#LEFT RIGHT DOUBLE ARROW
0x81CD	0x2200	#FOR ALL
0x81CE	0x2203	#THERE EXISTS
0x81DA	0x2220	#ANGLE
0x81DB	0x22A5	#UP TACK
0x81DC	0x2312	#ARC
0x81DD	0x2202	#PARTIAL DIFFERENTIAL
0x81DE	0x2207	#NABLA
0x81DF	0x2261	#IDENTICAL TO
0x81E0	0x2252	#APPROXIMATELY EQUAL TO OR THE IMAGE OF
0x81E1	0x226A	#MUCH LESS-THAN
0x81E2	0x226B	#MUCH GREATER-THAN
0x81E3	0x221A	#SQUARE ROOT
0x81E4	0x223D	#REVERSED TILDE
0x81E5	0x221D	#PROPORTIONAL TO
0x81E6	0x2235	#BECAUSE
0x81E7	0x222B	#INTEGRAL
0x81E8	0x222C	#DOUBLE INTEGRAL
0x81F0	0x212B	#ANGSTROM SIGN
0x81F1	0x2030	#PER MILLE SIGN
0x81F2	0x266F	#MUSIC SHARP SIGN
0x81F3	0x266D	#MUSIC FLAT SIGN
0x81F4	0x266A	#EIGHTH NOTE
0x81F5	0x2020	#DAGGER
0x81F6	0x2021	#DOUBLE DAGGER
0x81F7	0x00B6	#PILCROW SIGN
0x81FC	0x25EF	#LARGE CIRCLE
0x824F	0xFF10	#FULLWIDTH DIGIT ZERO
0x8250	0xFF11	#FULLWIDTH DIGIT ONE
0x8251	0xFF12	#FULLWIDTH DIGIT TWO
0x8252	0xFF13	#FULLWIDTH DIGIT THREE
0x8253	0xFF14	#FULLWIDTH DIGIT FOUR
0x8254	0xFF15	#FULLWIDTH DIGIT FIVE
0x8255	0xFF16	#FULLWIDTH DIGIT SIX
0x8256	0xFF17	#FULLWIDTH DIGIT SEVEN
0x8257	0xFF18	#FULLWIDTH DIGIT EIGHT
0x8258	0xFF19	#FULLWIDTH DIGIT NINE
0x8260	0xFF21	#FULLWIDTH LATIN CAPITAL LETTER A
0x8261	0xFF22	#FULLWIDTH LATIN CAPITAL LETTER B
0x8262	0xFF23	#FULLWIDTH LATIN CAPITAL LETTER C
0x8263	0xFF24	#FULLWIDTH LATIN CAPITAL LETTER D
0x8264	0xFF25	#FULLWIDTH LATIN CAPITAL LETTER E
0x8265	0xFF26	#FULLWIDTH LATIN CAPITAL LETTER F
0x8266	0xFF27	#FULLWIDTH LATIN CAPITAL LETTER G
0x8267	0xFF28	#FULLWIDTH LATIN CAPITAL LETTER H
0x8268	0xFF29	#FULLWIDTH LATIN CAPITAL LETTER I
0x8269	0xFF2A	#FULLWIDTH LATIN CAPITAL LETTER J
0x826A	0xFF2B	#FULLWIDTH LATIN CAPITAL LETTER K
0x826B	0xFF2C	#FULLWIDTH LATIN CAPITAL LETTER L
0x826C	0xFF2D	#FULLWIDTH LATIN CAPITAL LETTER M
0x826D	0xFF2E	#FULLWIDTH LATIN CAPITAL LETTER N
0x826E	0xFF2F	#FULLWIDTH LATIN CAPITAL LETTER O
0x826F	0xFF30	#FULLWIDTH LATIN CAPITAL LETTER P
0x8270	0xFF31	#FULLWIDTH LATIN CAPITAL LETTER Q
0x8271	0xFF32	#FULLWIDTH LATIN CAPITAL LETTER R
0x8272	0xFF33	#FULLWIDTH LATIN CAPITAL LETTER S
0x8273	0xFF34	#FULLWIDTH LATIN CAPITAL LETTER T
0x8274	0xFF35	#FULLWIDTH LATIN CAPITAL LETTER U
0x8275	0xFF36	#FULLWIDTH LATIN CAPITAL LETTER V
0x8276	0xFF37	#FULLWIDTH LATIN CAPITAL LETTER W
0x8277	0xFF38	#FULLWIDTH LATIN CAPITAL LETTER X
0x8278	0xFF39	#FULLWIDTH LATIN CAPITAL LETTER Y
0x8279	0xFF3A	#FULLWIDTH LATIN CAPITAL LETTER Z
0x8281	0xFF41	#FULLWIDTH LATIN SMALL LETTER A
0x8282	0xFF42	#FULLWIDTH LATIN SMALL LETTER B
0x8283	0xFF43	#FULLWIDTH LATIN SMALL LETTER C
0x8284	0xFF44	#FULLWIDTH LATIN SMALL LETTER D
0x8285	0xFF45	#FULLWIDTH LATIN SMALL LETTER E
0x8286	0xFF46	#FULLWIDTH LATIN SMALL LETTER F
0x8287	0xFF47	#FULLWIDTH LATIN SMALL LETTER G
0x8288	0xFF48	#FULLWIDTH LATIN SMALL LETTER H
0x8289	0xFF49	#FULLWIDTH LATIN SMALL LETTER I
0x828A	0xFF4A	#FULLWIDTH LATIN SMALL LETTER J
0x828B	0xFF4B	#FULLWIDTH LATIN SMALL LETTER K
0x828C	0xFF4C	#FULLWIDTH LATIN SMALL LETTER L
0x828D	0xFF4D	#FULLWIDTH LATIN SMALL LETTER M
0x828E	0xFF4E	#FULLWIDTH LATIN SMALL LETTER N
0x828F	0xFF4F	#FULLWIDTH LATIN SMALL LETTER O
0x8290	0xFF50	#FULLWIDTH LATIN SMALL LETTER P
0x8291	0xFF51	#FULLWIDTH LATIN SMALL LETTER Q
0x8292	0xFF52	#FULLWIDTH LATIN SMALL LETTER R
0x8293	0xFF53	#FULLWIDTH LATIN SMALL LETTER S
0x8294	0xFF54	#FULLWIDTH LATIN SMALL LETTER T
0x8295	0xFF55	#FULLWIDTH LATIN SMALL LETTER U
0x8296	0xFF56	#FULLWIDTH LATIN SMALL LETTER V
0x8297	0xFF57	#FULLWIDTH LATIN SMALL LETTER W
0x8298	0xFF58	#FULLWIDTH LATIN SMALL LETTER X
0x8299	0xFF59	#FULLWIDTH LATIN SMALL LETTER Y
0x829A	0xFF5A	#FULLWIDTH LATIN SMALL LETTER Z
0x829F	0x3041	#HIRAGANA LETTER SMALL A
0x82A0	0x3042	#HIRAGANA LETTER A
0x82A1	0x3043	#HIRAGANA LETTER SMALL I
0x82A2	0x3044	#HIRAGANA LETTER I
0x82A3	0x3045	#HIRAGANA LETTER SMALL U
0x82A4	0x3046	#HIRAGANA LETTER U
0x82A5	0x3047	#HIRAGANA LETTER SMALL E
0x82A6	0x3048	#HIRAGANA LETTER E
0x82A7	0x3049	#HIRAGANA LETTER SMALL O
0x82A8	0x304A	#HIRAGANA LETTER O
0x82A9	0x304B	#HIRAGANA LETTER KA
0x82AA	0x304C	#HIRAGANA LETTER GA
0x82AB	0x304D	#HIRAGANA LETTER KI
0x82AC	0x304E	#HIRAGANA LETTER GI
0x82AD	0x304F	#HIRAGANA LETTER KU
0x82AE	0x3050	#HIRAGANA LETTER GU
0x82AF	0x3051	#HIRAGANA LETTER KE
0x82B0	0x3052	#HIRAGANA LETTER GE
0x82B1	0x3053	#HIRAGANA LETTER KO
0x82B2	0x3054	#HIRAGANA LETTER GO
0x82B3	0x3055	#HIRAGANA LETTER SA
0x82B4	0x3056	#HIRAGANA LETTER ZA
0x82B5	0x3057	#HIRAGANA LETTER SI
0x82B6	0x3058	#HIRAGANA LETTER ZI
0x82B7	0x3059	#HIRAGANA LETTER SU
0x82B8	0x305A	#HIRAGANA LETTER ZU
0x82B9	0x305B	#HIRAGANA LETTER SE
0x82BA	0x305C	#HIRAGANA LETTER ZE
0x82BB	0x305D	#HIRAGANA LETTER SO
0x82BC	0x305E	#HIRAGANA LETTER ZO
0x82BD	0x305F	#HIRAGANA LETTER TA
0x82BE	0x3060	#HIRAGANA LETTER DA
0x82BF	0x3061	#HIRAGANA LETTER TI
0x82C0	0x3062	#HIRAGANA LETTER DI
0x82C1	0x3063	#HIRAGANA LETTER SMALL TU
0x82C2	0x3064	#HIRAGANA LETTER TU
0x82C3	0x3065	#HIRAGANA LETTER DU
0x82C4	0x3066	#HIRAGANA LETTER TE
0x82C5	0x3067	#HIRAGANA LETTER DE
0x82C6	0x3068	#HIRAGANA LETTER TO
0x82C7	0x3069	#HIRAGANA LETTER DO
0x82C8	0x306A	#HIRAGANA LETTER NA
0x82C9	0x306B	#HIRAGANA LETTER NI
0x82CA	0x306C	#HIRAGANA LETTER NU
0x82CB	0x306D	#HIRAGANA LETTER NE
0x82CC	0x306E	#HIRAGANA LETTER NO
0x82CD	0x306F	#HIRAGANA LETTER HA
0x82CE	0x3070	#HIRAGANA LETTER BA
0x82CF	0x3071	#HIRAGANA LETTER PA
0x82D0	0x3072	#HIRAGANA LETTER HI
0x82D1	0x3073	#HIRAGANA LETTER BI
0x82D2	0x3074	#HIRAGANA LETTER PI
0x82D3	0x3075	#HIRAGANA LETTER HU
0x82D4	0x3076	#HIRAGANA LETTER BU
0x82D5	0x3077	#HIRAGANA LETTER PU
0x82D6	0x3078	#HIRAGANA LETTER HE
0x82D7	0x3079	#HIRAGANA LETTER BE
0x82D8	0x307A	#HIRAGANA LETTER PE
0x82D9	0x307B	#HIRAGANA LETTER HO
0x82DA	0x307C	#HIRAGANA LETTER BO
0x82DB	0x307D	#HIRAGANA LETTER PO
0x82DC	0x307E	#HIRAGANA LETTER MA
0x82DD	0x307F	#HIRAGANA LETTER MI
0x82DE	0x3080	#HIRAGANA LETTER MU
0x82DF	0x3081	#HIRAGANA LETTER ME
0x82E0	0x3082	#HIRAGANA LETTER MO
0x82E1	0x3083	#HIRAGANA LETTER SMALL YA
0x82E2	0x3084	#HIRAGANA LETTER YA
0x82E3	0x3085	#HIRAGANA LETTER SMALL YU
0x82E4	0x3086	#HIRAGANA LETTER YU
0x82E5	0x3087	#HIRAGANA LETTER SMALL YO
0x82E6	0x3088	#HIRAGANA LETTER YO
0x82E7	0x3089	#HIRAGANA LETTER RA
0x82E8	0x308A	#HIRAGANA LETTER RI
0x82E9	0x308B	#HIRAGANA LETTER RU
0x82EA	0x308C	#HIRAGANA LETTER RE
0x82EB	0x308D	#HIRAGANA LETTER RO
0x82EC	0x308E	#HIRAGANA LETTER SMALL WA
0x82ED	0x308F	#HIRAGANA LETTER WA
0x82EE	0x3090	#HIRAGANA LETTER WI
0x82EF	0x3091	#HIRAGANA LETTER WE
0x82F0	0x3092	#HIRAGANA LETTER WO
0x82F1	0x3093	#HIRAGANA LETTER N
0x8340	0x30A1	#KATAKANA LETTER SMALL A
0x8341	0x30A2	#KATAKANA LETTER A
0x8342	0x30A3	#KATAKANA LETTER SMALL I
0x8343	0x30A4	#KATAKANA LETTER I
0x8344	0x30A5	#KATAKANA LETTER SMALL U
0x8345	0x30A6	#KATAKANA LETTER U
0x8346	0x30A7	#KATAKANA LETTER SMALL E
0x8347	0x30A8	#KATAKANA LETTER E
0x8348	0x30A9	#KATAKANA LETTER SMALL O
0x8349	0x30AA	#KATAKANA LETTER O
0x834A	0x30AB	#KATAKANA LETTER KA
0x834B	0x30AC	#KATAKANA LETTER GA
0x834C	0x30AD	#KATAKANA LETTER KI
0x834D	0x30AE	#KATAKANA LETTER GI
0x834E	0x30AF	#KATAKANA LETTER KU
0x834F	0x30B0	#KATAKANA LETTER GU
0x8350	0x30B1	#KATAKANA LETTER KE
0x8351	0x30B2	#KATAKANA LETTER GE
0x8352	0x30B3	#KATAKANA LETTER KO
0x8353	0x30B4	#KATAKANA LETTER GO
0x8354	0x30B5	#KATAKANA LETTER SA
0x8355	0x30B6	#KATAKANA LETTER ZA
0x8356	0x30B7	#KATAKANA LETTER SI
0x8357	0x30B8	#KATAKANA LETTER ZI
0x8358	0x30B9	#KATAKANA LETTER SU
0x8359	0x30BA	#KATAKANA LETTER ZU
0x835A	0x30BB	#KATAKANA LETTER SE
0x835B	0x30BC	#KATAKANA LETTER ZE
0x835C	0x30BD	#KATAKANA LETTER SO
0x835D	0x30BE	#KATAKANA LETTER ZO
0x835E	0x30BF	#KATAKANA LETTER TA
0x835F	0x30C0	#KATAKANA LETTER DA
0x8360	0x30C1	#KATAKANA LETTER TI
0x8361	0x30C2	#KATAKANA LETTER DI
0x8362	0x30C3	#KATAKANA LETTER SMALL TU
0x8363	0x30C4	#KATAKANA LETTER TU
0x8364	0x30C5	#KATAKANA LETTER DU
0x8365	0x30C6	#KATAKANA LETTER TE
0x8366	0x30C7	#KATAKANA LETTER DE
0x8367	0x30C8	#KATAKANA LETTER TO
0x8368	0x30C9	#KATAKANA LETTER DO
0x8369	0x30CA	#KATAKANA LETTER NA
0x836A	0x30CB	#KATAKANA LETTER NI
0x836B	0x30CC	#KATAKANA LETTER NU
0x836C	0x30CD	#KATAKANA LETTER NE
0x836D	0x30CE	#KATAKANA LETTER NO
0x836E	0x30CF	#KATAKANA LETTER HA
0x836F	0x30D0	#KATAKANA LETTER BA
0x8370	0x30D1	#KATAKANA LETTER PA
0x8371	0x30D2	#KATAKANA LETTER HI
0x8372	0x30D3	#KATAKANA LETTER BI
0x8373	0x30D4	#KATAKANA LETTER PI
0x8374	0x30D5	#KATAKANA LETTER HU
0x8375	0x30D6	#KATAKANA LETTER BU
0x8376	0x30D7	#KATAKANA LETTER PU
0x8377	0x30D8	#KATAKANA LETTER HE
0x8378	0x30D9	#KATAKANA LETTER BE
0x8379	0x30DA	#KATAKANA LETTER PE
0x837A	0x30DB	#KATAKANA LETTER HO
0x837B	0x30DC	#KATAKANA LETTER BO
0x837C	0x30DD	#KATAKANA LETTER PO
0x837D	0x30DE	#KATAKANA LETTER MA
0x837E	0x30DF	#KATAKANA LETTER MI
0x8380	0x30E0	#KATAKANA LETTER MU
0x8381	0x30E1	#KATAKANA LETTER ME
0x8382	0x30E2	#KATAKANA LETTER MO
0x8383	0x30E3	#KATAKANA LETTER SMALL YA
0x8384	0x30E4	#KATAKANA LETTER YA
0x8385	0x30E5	#KATAKANA LETTER SMALL YU
0x8386	0x30E6	#KATAKANA LETTER YU
0x8387	0x30E7	#KATAKANA LETTER SMALL YO
0x8388	0x30E8	#KATAKANA LETTER YO
0x8389	0x30E9	#KATAKANA LETTER RA
0x838A	0x30EA	#KATAKANA LETTER RI
0x838B	0x30EB	#KATAKANA LETTER RU
0x838C	0x30EC	#KATAKANA LETTER RE
0x838D	0x30ED	#KATAKANA LETTER RO
0x838E	0x30EE	#KATAKANA LETTER SMALL WA
0x838F	0x30EF	#KATAKANA LETTER WA
0x8390	0x30F0	#KATAKANA LETTER WI
0x8391	0x30F1	#KATAKANA LETTER WE
0x8392	0x30F2	#KATAKANA LETTER WO
0x8393	0x30F3	#KATAKANA LETTER N
0x8394	0x30F4	#KATAKANA LETTER VU
0x8395	0x30F5	#KATAKANA LETTER SMALL KA
0x8396	0x30F6	#KATAKANA LETTER SMALL KE
0x839F	0x0391	#GREEK CAPITAL LETTER ALPHA
0x83A0	0x0392	#GREEK CAPITAL LETTER BETA
0x83A1	0x0393	#GREEK CAPITAL LETTER GAMMA
0x83A2	0x0394	#GREEK CAPITAL LETTER DELTA
0x83A3	0x0395	#GREEK CAPITAL LETTER EPSILON
0x83A4	0x0396	#GREEK CAPITAL LETTER ZETA
0x83A5	0x0397	#GREEK CAPITAL LETTER ETA
0x83A6	0x0398	#GREEK CAPITAL LETTER THETA
0x83A7	0x0399	#GREEK CAPITAL LETTER IOTA
0x83A8	0x039A	#GREEK CAPITAL LETTER KAPPA
0x83A9	0x039B	#GREEK CAPITAL LETTER LAMDA
0x83AA	0x039C	#GREEK CAPITAL LETTER MU
0x83AB	0x039D	#GREEK CAPITAL LETTER NU
0x83AC	0x039E	#GREEK CAPITAL LETTER XI
0x83AD	0x039F	#GREEK CAPITAL LETTER OMICRON
0x83AE	0x03A0	#GREEK CAPITAL LETTER PI
0x83AF	0x03A1	#GREEK CAPITAL LETTER RHO
0x83B0	0x03A3	#GREEK CAPITAL LETTER SIGMA
0x83B1	0x03A4	#GREEK CAPITAL LETTER TAU
0x83B2	0x03A5	#GREEK CAPITAL LETTER UPSILON
0x83B3	0x03A6	#GREEK CAPITAL LETTER PHI
0x83B4	0x03A7	#GREEK CAPITAL LETTER CHI
0x83B5	0x03A8	#GREEK CAPITAL LETTER PSI
0x83B6	0x03A9	#GREEK CAPITAL LETTER OMEGA
0x83BF	0x03B1	#GREEK SMALL LETTER ALPHA
0x83C0	0x03B2	#GREEK SMALL LETTER BETA
0x83C1	0x03B3	#GREEK SMALL LETTER GAMMA
0x83C2	0x03B4	#GREEK SMALL LETTER DELTA
0x83C3	0x03B5	#GREEK SMALL LETTER EPSILON
0x83C4	0x03B6	#GREEK SMALL LETTER ZETA
0x83C5	0x03B7	#GREEK SMALL LETTER ETA
0x83C6	0x03B8	#GREEK SMALL LETTER THETA
0x83C7	0x03B9	#GREEK SMALL LETTER IOTA
0x83C8	0x03BA	#GREEK SMALL LETTER KAPPA
0x83C9	0x03BB	#GREEK SMALL LETTER LAMDA
0x83CA	0x03BC	#GREEK SMALL LETTER MU
0x83CB	0x03BD	#GREEK SMALL LETTER NU
0x83CC	0x03BE	#GREEK SMALL LETTER XI
0x83CD	0x03BF	#GREEK SMALL LETTER OMICRON
0x83CE	0x03C0	#GREEK SMALL LETTER PI
0x83CF	0x03C1	#GREEK SMALL LETTER RHO
0x83D0	0x03C3	#GREEK SMALL LETTER SIGMA
0x83D1	0x03C4	#GREEK SMALL LETTER TAU
0x83D2	0x03C5	#GREEK SMALL LETTER UPSILON
0x83D3	0x03C6	#GREEK SMALL LETTER PHI
0x83D4	0x03C7	#GREEK SMALL LETTER CHI
0x83D5	0x03C8	#GREEK SMALL LETTER PSI
0x83D6	0x03C9	#GREEK SMALL LETTER OMEGA
0x8440	0x0410	#CYRILLIC CAPITAL LETTER A
0x8441	0x0411	#CYRILLIC CAPITAL LETTER BE
0x8442	0x0412	#CYRILLIC CAPITAL LETTER VE
0x8443	0x0413	#CYRILLIC CAPITAL LETTER GHE
0x8444	0x0414	#CYRILLIC CAPITAL LETTER DE
0x8445	0x0415	#CYRILLIC CAPITAL LETTER IE
0x8446	0x0401	#CYRILLIC CAPITAL LETTER IO
0x8447	0x0416	#CYRILLIC CAPITAL LETTER ZHE
0x8448	0x0417	#CYRILLIC CAPITAL LETTER ZE
0x8449	0x0418	#CYRILLIC CAPITAL LETTER I
0x844A	0x0419	#CYRILLIC CAPITAL LETTER SHORT I
0x844B	0x041A	#CYRILLIC CAPITAL LETTER KA
0x844C	0x041B	#CYRILLIC CAPITAL LETTER EL
0x844D	0x041C	#CYRILLIC CAPITAL LETTER EM
0x844E	0x041D	#CYRILLIC CAPITAL LETTER EN
0x844F	0x041E	#CYRILLIC CAPITAL LETTER O
0x8450	0x041F	#CYRILLIC CAPITAL LETTER PE
0x8451	0x0420	#CYRILLIC CAPITAL LETTER ER
0x8452	0x0421	#CYRILLIC CAPITAL LETTER ES
0x8453	0x0422	#CYRILLIC CAPITAL LETTER TE
0x8454	0x0423	#CYRILLIC CAPITAL LETTER U
0x8455	0x0424	#CYRILLIC CAPITAL LETTER EF
0x8456	0x0425	#CYRILLIC CAPITAL LETTER HA
0x8457	0x0426	#CYRILLIC CAPITAL LETTER TSE
0x8458	0x0427	#CYRILLIC CAPITAL LETTER CHE
0x8459	0x0428	#CYRILLIC CAPITAL LETTER SHA
0x845A	0x0429	#CYRILLIC CAPITAL LETTER SHCHA
0x845B	0x042A	#CYRILLIC CAPITAL LETTER HARD SIGN
0x845C	0x042B	#CYRILLIC CAPITAL LETTER YERU
0x845D	0x042C	#CYRILLIC CAPITAL LETTER SOFT SIGN
0x845E	0x042D	#CYRILLIC CAPITAL LETTER E
0x845F	0x042E	#CYRILLIC CAPITAL LETTER YU
0x8460	0x042F	#CYRILLIC CAPITAL LETTER YA
0x8470	0x0430	#CYRILLIC SMALL LETTER A
0x8471	0x0431	#CYRILLIC SMALL LETTER BE
0x8472	0x0432	#CYRILLIC SMALL LETTER VE
0x8473	0x0433	#CYRILLIC SMALL LETTER GHE
0x8474	0x0434	#CYRILLIC SMALL LETTER DE
0x8475	0x0435	#CYRILLIC SMALL LETTER IE
0x8476	0x0451	#CYRILLIC SMALL LETTER IO
0x8477	0x0436	#CYRILLIC SMALL LETTER ZHE
0x8478	0x0437	#CYRILLIC SMALL LETTER ZE
0x8479	0x0438	#CYRILLIC SMALL LETTER I
0x847A	0x0439	#CYRILLIC SMALL LETTER SHORT I
0x847B	0x043A	#CYRILLIC SMALL LETTER KA
0x847C	0x043B	#CYRILLIC SMALL LETTER EL
0x847D	0x043C	#CYRILLIC SMALL LETTER EM
0x847E	0x043D	#CYRILLIC SMALL LETTER EN
0x8480	0x043E	#CYRILLIC SMALL LETTER O
0x8481	0x043F	#CYRILLIC SMALL LETTER PE
0x8482	0x0440	#CYRILLIC SMALL LETTER ER
0x8483	0x0441	#CYRILLIC SMALL LETTER ES
0x8484	0x0442	#CYRILLIC SMALL LETTER TE
0x8485	0x0443	#CYRILLIC SMALL LETTER U
0x8486	0x0444	#CYRILLIC SMALL LETTER EF
0x8487	0x0445	#CYRILLIC SMALL LETTER HA
0x8488	0x0446	#CYRILLIC SMALL LETTER TSE
0x8489	0x0447	#CYRILLIC SMALL LETTER CHE
0x848A	0x0448	#CYRILLIC SMALL LETTER SHA
0x848B	0x0449	#CYRILLIC SMALL LETTER SHCHA
0x848C	0x044A	#CYRILLIC SMALL LETTER HARD SIGN
0x848D	0x044B	#CYRILLIC SMALL LETTER YERU
0x848E	0x044C	#CYRILLIC SMALL LETTER SOFT SIGN
0x848F	0x044D	#CYRILLIC SMALL LETTER E
0x8490	0x044E	#CYRILLIC SMALL LETTER YU
0x8491	0x044F	#CYRILLIC SMALL LETTER YA
0x849F	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
0x84A0	0x2502	#BOX DRAWINGS LIGHT VERTICAL
0x84A1	0x250C	#BOX DRAWINGS LIGHT DOWN AND RIGHT
0x84A2	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
0x84A3	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
0x84A4	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
0x84A5	0x251C	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0x84A6	0x252C	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0x84A7	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
0x84A8	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
0x84A9	0x253C	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0x84AA	0x2501	#BOX DRAWINGS HEAVY HORIZONTAL
0x84AB	0x2503	#BOX DRAWINGS HEAVY VERTICAL
0x84AC	0x250F	#BOX DRAWINGS HEAVY DOWN AND RIGHT
0x84AD	0x2513	#BOX DRAWINGS HEAVY DOWN AND LEFT
0x84AE	0x251B	#BOX DRAWINGS HEAVY UP AND LEFT
0x84AF	0x2517	#BOX DRAWINGS HEAVY UP AND RIGHT
0x84B0	0x2523	#BOX DRAWINGS HEAVY VERTICAL AND RIGHT
0x84B1	0x2533	#BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
0x84B2	0x252B	#BOX DRAWINGS HEAVY VERTICAL AND LEFT
0x84B3	0x253B	#BOX DRAWINGS HEAVY UP AND HORIZONTAL
0x84B4	0x254B	#BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
0x84B5	0x2520	#BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
0x84B6	0x252F	#BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
0x84B7	0x2528	#BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
0x84B8	0x2537	#BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
0x84B9	0x253F	#BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
0x84BA	0x251D	#BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
0x84BB	0x2530	#BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
0x84BC	0x2525	#BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
0x84BD	0x2538	#BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
0x84BE	0x2542	#BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
0x8740	0x2460	#CIRCLED DIGIT ONE
0x8741	0x2461	#CIRCLED DIGIT TWO
0x8742	0x2462	#CIRCLED DIGIT THREE
0x8743	0x2463	#CIRCLED DIGIT FOUR
0x8744	0x2464	#CIRCLED DIGIT FIVE
0x8745	0x2465	#CIRCLED DIGIT SIX
0x8746	0x2466	#CIRCLED DIGIT SEVEN
0x8747	0x2467	#CIRCLED DIGIT EIGHT
0x8748	0x2468	#CIRCLED DIGIT NINE
0x8749	0x2469	#CIRCLED NUMBER TEN
0x874A	0x246A	#CIRCLED NUMBER ELEVEN
0x874B	0x246B	#CIRCLED NUMBER TWELVE
0x874C	0x246C	#CIRCLED NUMBER THIRTEEN
0x874D	0x246D	#CIRCLED NUMBER FOURTEEN
0x874E	0x246E	#CIRCLED NUMBER FIFTEEN
0x874F	0x246F	#CIRCLED NUMBER SIXTEEN
0x8750	0x2470	#CIRCLED NUMBER SEVENTEEN
0x8751	0x2471	#CIRCLED NUMBER EIGHTEEN
0x8752	0x2472	#CIRCLED NUMBER NINETEEN
0x8753	0x2473	#CIRCLED NUMBER TWENTY
0x8754	0x2160	#ROMAN NUMERAL ONE
0x8755	0x2161	#ROMAN NUMERAL TWO
0x8756	0x2162	#ROMAN NUMERAL THREE
0x8757	0x2163	#ROMAN NUMERAL FOUR
0x8758	0x2164	#ROMAN NUMERAL FIVE
0x8759	0x2165	#ROMAN NUMERAL SIX
0x875A	0x2166	#ROMAN NUMERAL SEVEN
0x875B	0x2167	#ROMAN NUMERAL EIGHT
0x875C	0x2168	#ROMAN NUMERAL NINE
0x875D	0x2169	#ROMAN NUMERAL TEN
0x875F	0x3349	#SQUARE MIRI
0x8760	0x3314	#SQUARE KIRO
0x8761	0x3322	#SQUARE SENTI
0x8762	0x334D	#SQUARE MEETORU
0x8763	0x3318	#SQUARE GURAMU
0x8764	0x3327	#SQUARE TON
0x8765	0x3303	#SQUARE AARU
0x8766	0x3336	#SQUARE HEKUTAARU
0x8767	0x3351	#SQUARE RITTORU
0x8768	0x3357	#SQUARE WATTO
0x8769	0x330D	#SQUARE KARORII
0x876A	0x3326	#SQUARE DORU
0x876B	0x3323	#SQUARE SENTO
0x876C	0x332B	#SQUARE PAASENTO
0x876D	0x334A	#SQUARE MIRIBAARU
0x876E	0x333B	#SQUARE PEEZI
0x876F	0x339C	#SQUARE MM
0x8770	0x339D	#SQUARE CM
0x8771	0x339E	#SQUARE KM
0x8772	0x338E	#SQUARE MG
0x8773	0x338F	#SQUARE KG
0x8774	0x33C4	#SQUARE CC
0x8775	0x33A1	#SQUARE M SQUARED
0x877E	0x337B	#SQUARE ERA NAME HEISEI
0x8780	0x301D	#REVERSED DOUBLE PRIME QUOTATION MARK
0x8781	0x301F	#LOW DOUBLE PRIME QUOTATION MARK
0x8782	0x2116	#NUMERO SIGN
0x8783	0x33CD	#SQUARE KK
0x8784	0x2121	#TELEPHONE SIGN
0x8785	0x32A4	#CIRCLED IDEOGRAPH HIGH
0x8786	0x32A5	#CIRCLED IDEOGRAPH CENTRE
0x8787	0x32A6	#CIRCLED IDEOGRAPH LOW
0x8788	0x32A7	#CIRCLED IDEOGRAPH LEFT
0x8789	0x32A8	#CIRCLED IDEOGRAPH RIGHT
0x878A	0x3231	#PARENTHESIZED IDEOGRAPH STOCK
0x878B	0x3232	#PARENTHESIZED IDEOGRAPH HAVE
0x878C	0x3239	#PARENTHESIZED IDEOGRAPH REPRESENT
0x878D	0x337E	#SQUARE ERA NAME MEIZI
0x878E	0x337D	#SQUARE ERA NAME TAISYOU
0x878F	0x337C	#SQUARE ERA NAME SYOUWA
0x8790	0x2252	#APPROXIMATELY EQUAL TO OR THE IMAGE OF
0x8791	0x2261	#IDENTICAL TO
0x8792	0x222B	#INTEGRAL
0x8793	0x222E	#CONTOUR INTEGRAL
0x8794	0x2211	#N-ARY SUMMATION
0x8795	0x221A	#SQUARE ROOT
0x8796	0x22A5	#UP TACK
0x8797	0x2220	#ANGLE
0x8798	0x221F	#RIGHT ANGLE
0x8799	0x22BF	#RIGHT TRIANGLE
0x879A	0x2235	#BECAUSE
0x879B	0x2229	#INTERSECTION
0x879C	0x222A	#UNION
0x889F	0x4E9C	#CJK UNIFIED IDEOGRAPH
0x88A0	0x5516	#CJK UNIFIED IDEOGRAPH
0x88A1	0x5A03	#CJK UNIFIED IDEOGRAPH
0x88A2	0x963F	#CJK UNIFIED IDEOGRAPH
0x88A3	0x54C0	#CJK UNIFIED IDEOGRAPH
0x88A4	0x611B	#CJK UNIFIED IDEOGRAPH
0x88A5	0x6328	#CJK UNIFIED IDEOGRAPH
0x88A6	0x59F6	#CJK UNIFIED IDEOGRAPH
0x88A7	0x9022	#CJK UNIFIED IDEOGRAPH
0x88A8	0x8475	#CJK UNIFIED IDEOGRAPH
0x88A9	0x831C	#CJK UNIFIED IDEOGRAPH
0x88AA	0x7A50	#CJK UNIFIED IDEOGRAPH
0x88AB	0x60AA	#CJK UNIFIED IDEOGRAPH
0x88AC	0x63E1	#CJK UNIFIED IDEOGRAPH
0x88AD	0x6E25	#CJK UNIFIED IDEOGRAPH
0x88AE	0x65ED	#CJK UNIFIED IDEOGRAPH
0x88AF	0x8466	#CJK UNIFIED IDEOGRAPH
0x88B0	0x82A6	#CJK UNIFIED IDEOGRAPH
0x88B1	0x9BF5	#CJK UNIFIED IDEOGRAPH
0x88B2	0x6893	#CJK UNIFIED IDEOGRAPH
0x88B3	0x5727	#CJK UNIFIED IDEOGRAPH
0x88B4	0x65A1	#CJK UNIFIED IDEOGRAPH
0x88B5	0x6271	#CJK UNIFIED IDEOGRAPH
0x88B6	0x5B9B	#CJK UNIFIED IDEOGRAPH
0x88B7	0x59D0	#CJK UNIFIED IDEOGRAPH
0x88B8	0x867B	#CJK UNIFIED IDEOGRAPH
0x88B9	0x98F4	#CJK UNIFIED IDEOGRAPH
0x88BA	0x7D62	#CJK UNIFIED IDEOGRAPH
0x88BB	0x7DBE	#CJK UNIFIED IDEOGRAPH
0x88BC	0x9B8E	#CJK UNIFIED IDEOGRAPH
0x88BD	0x6216	#CJK UNIFIED IDEOGRAPH
0x88BE	0x7C9F	#CJK UNIFIED IDEOGRAPH
0x88BF	0x88B7	#CJK UNIFIED IDEOGRAPH
0x88C0	0x5B89	#CJK UNIFIED IDEOGRAPH
0x88C1	0x5EB5	#CJK UNIFIED IDEOGRAPH
0x88C2	0x6309	#CJK UNIFIED IDEOGRAPH
0x88C3	0x6697	#CJK UNIFIED IDEOGRAPH
0x88C4	0x6848	#CJK UNIFIED IDEOGRAPH
0x88C5	0x95C7	#CJK UNIFIED IDEOGRAPH
0x88C6	0x978D	#CJK UNIFIED IDEOGRAPH
0x88C7	0x674F	#CJK UNIFIED IDEOGRAPH
0x88C8	0x4EE5	#CJK UNIFIED IDEOGRAPH
0x88C9	0x4F0A	#CJK UNIFIED IDEOGRAPH
0x88CA	0x4F4D	#CJK UNIFIED IDEOGRAPH
0x88CB	0x4F9D	#CJK UNIFIED IDEOGRAPH
0x88CC	0x5049	#CJK UNIFIED IDEOGRAPH
0x88CD	0x56F2	#CJK UNIFIED IDEOGRAPH
0x88CE	0x5937	#CJK UNIFIED IDEOGRAPH
0x88CF	0x59D4	#CJK UNIFIED IDEOGRAPH
0x88D0	0x5A01	#CJK UNIFIED IDEOGRAPH
0x88D1	0x5C09	#CJK UNIFIED IDEOGRAPH
0x88D2	0x60DF	#CJK UNIFIED IDEOGRAPH
0x88D3	0x610F	#CJK UNIFIED IDEOGRAPH
0x88D4	0x6170	#CJK UNIFIED IDEOGRAPH
0x88D5	0x6613	#CJK UNIFIED IDEOGRAPH
0x88D6	0x6905	#CJK UNIFIED IDEOGRAPH
0x88D7	0x70BA	#CJK UNIFIED IDEOGRAPH
0x88D8	0x754F	#CJK UNIFIED IDEOGRAPH
0x88D9	0x7570	#CJK UNIFIED IDEOGRAPH
0x88DA	0x79FB	#CJK UNIFIED IDEOGRAPH
0x88DB	0x7DAD	#CJK UNIFIED IDEOGRAPH
0x88DC	0x7DEF	#CJK UNIFIED IDEOGRAPH
0x88DD	0x80C3	#CJK UNIFIED IDEOGRAPH
0x88DE	0x840E	#CJK UNIFIED IDEOGRAPH
0x88DF	0x8863	#CJK UNIFIED IDEOGRAPH
0x88E0	0x8B02	#CJK UNIFIED IDEOGRAPH
0x88E1	0x9055	#CJK UNIFIED IDEOGRAPH
0x88E2	0x907A	#CJK UNIFIED IDEOGRAPH
0x88E3	0x533B	#CJK UNIFIED IDEOGRAPH
0x88E4	0x4E95	#CJK UNIFIED IDEOGRAPH
0x88E5	0x4EA5	#CJK UNIFIED IDEOGRAPH
0x88E6	0x57DF	#CJK UNIFIED IDEOGRAPH
0x88E7	0x80B2	#CJK UNIFIED IDEOGRAPH
0x88E8	0x90C1	#CJK UNIFIED IDEOGRAPH
0x88E9	0x78EF	#CJK UNIFIED IDEOGRAPH
0x88EA	0x4E00	#CJK UNIFIED IDEOGRAPH
0x88EB	0x58F1	#CJK UNIFIED IDEOGRAPH
0x88EC	0x6EA2	#CJK UNIFIED IDEOGRAPH
0x88ED	0x9038	#CJK UNIFIED IDEOGRAPH
0x88EE	0x7A32	#CJK UNIFIED IDEOGRAPH
0x88EF	0x8328	#CJK UNIFIED IDEOGRAPH
0x88F0	0x828B	#CJK UNIFIED IDEOGRAPH
0x88F1	0x9C2F	#CJK UNIFIED IDEOGRAPH
0x88F2	0x5141	#CJK UNIFIED IDEOGRAPH
0x88F3	0x5370	#CJK UNIFIED IDEOGRAPH
0x88F4	0x54BD	#CJK UNIFIED IDEOGRAPH
0x88F5	0x54E1	#CJK UNIFIED IDEOGRAPH
0x88F6	0x56E0	#CJK UNIFIED IDEOGRAPH
0x88F7	0x59FB	#CJK UNIFIED IDEOGRAPH
0x88F8	0x5F15	#CJK UNIFIED IDEOGRAPH
0x88F9	0x98F2	#CJK UNIFIED IDEOGRAPH
0x88FA	0x6DEB	#CJK UNIFIED IDEOGRAPH
0x88FB	0x80E4	#CJK UNIFIED IDEOGRAPH
0x88FC	0x852D	#CJK UNIFIED IDEOGRAPH
0x8940	0x9662	#CJK UNIFIED IDEOGRAPH
0x8941	0x9670	#CJK UNIFIED IDEOGRAPH
0x8942	0x96A0	#CJK UNIFIED IDEOGRAPH
0x8943	0x97FB	#CJK UNIFIED IDEOGRAPH
0x8944	0x540B	#CJK UNIFIED IDEOGRAPH
0x8945	0x53F3	#CJK UNIFIED IDEOGRAPH
0x8946	0x5B87	#CJK UNIFIED IDEOGRAPH
0x8947	0x70CF	#CJK UNIFIED IDEOGRAPH
0x8948	0x7FBD	#CJK UNIFIED IDEOGRAPH
0x8949	0x8FC2	#CJK UNIFIED IDEOGRAPH
0x894A	0x96E8	#CJK UNIFIED IDEOGRAPH
0x894B	0x536F	#CJK UNIFIED IDEOGRAPH
0x894C	0x9D5C	#CJK UNIFIED IDEOGRAPH
0x894D	0x7ABA	#CJK UNIFIED IDEOGRAPH
0x894E	0x4E11	#CJK UNIFIED IDEOGRAPH
0x894F	0x7893	#CJK UNIFIED IDEOGRAPH
0x8950	0x81FC	#CJK UNIFIED IDEOGRAPH
0x8951	0x6E26	#CJK UNIFIED IDEOGRAPH
0x8952	0x5618	#CJK UNIFIED IDEOGRAPH
0x8953	0x5504	#CJK UNIFIED IDEOGRAPH
0x8954	0x6B1D	#CJK UNIFIED IDEOGRAPH
0x8955	0x851A	#CJK UNIFIED IDEOGRAPH
0x8956	0x9C3B	#CJK UNIFIED IDEOGRAPH
0x8957	0x59E5	#CJK UNIFIED IDEOGRAPH
0x8958	0x53A9	#CJK UNIFIED IDEOGRAPH
0x8959	0x6D66	#CJK UNIFIED IDEOGRAPH
0x895A	0x74DC	#CJK UNIFIED IDEOGRAPH
0x895B	0x958F	#CJK UNIFIED IDEOGRAPH
0x895C	0x5642	#CJK UNIFIED IDEOGRAPH
0x895D	0x4E91	#CJK UNIFIED IDEOGRAPH
0x895E	0x904B	#CJK UNIFIED IDEOGRAPH
0x895F	0x96F2	#CJK UNIFIED IDEOGRAPH
0x8960	0x834F	#CJK UNIFIED IDEOGRAPH
0x8961	0x990C	#CJK UNIFIED IDEOGRAPH
0x8962	0x53E1	#CJK UNIFIED IDEOGRAPH
0x8963	0x55B6	#CJK UNIFIED IDEOGRAPH
0x8964	0x5B30	#CJK UNIFIED IDEOGRAPH
0x8965	0x5F71	#CJK UNIFIED IDEOGRAPH
0x8966	0x6620	#CJK UNIFIED IDEOGRAPH
0x8967	0x66F3	#CJK UNIFIED IDEOGRAPH
0x8968	0x6804	#CJK UNIFIED IDEOGRAPH
0x8969	0x6C38	#CJK UNIFIED IDEOGRAPH
0x896A	0x6CF3	#CJK UNIFIED IDEOGRAPH
0x896B	0x6D29	#CJK UNIFIED IDEOGRAPH
0x896C	0x745B	#CJK UNIFIED IDEOGRAPH
0x896D	0x76C8	#CJK UNIFIED IDEOGRAPH
0x896E	0x7A4E	#CJK UNIFIED IDEOGRAPH
0x896F	0x9834	#CJK UNIFIED IDEOGRAPH
0x8970	0x82F1	#CJK UNIFIED IDEOGRAPH
0x8971	0x885B	#CJK UNIFIED IDEOGRAPH
0x8972	0x8A60	#CJK UNIFIED IDEOGRAPH
0x8973	0x92ED	#CJK UNIFIED IDEOGRAPH
0x8974	0x6DB2	#CJK UNIFIED IDEOGRAPH
0x8975	0x75AB	#CJK UNIFIED IDEOGRAPH
0x8976	0x76CA	#CJK UNIFIED IDEOGRAPH
0x8977	0x99C5	#CJK UNIFIED IDEOGRAPH
0x8978	0x60A6	#CJK UNIFIED IDEOGRAPH
0x8979	0x8B01	#CJK UNIFIED IDEOGRAPH
0x897A	0x8D8A	#CJK UNIFIED IDEOGRAPH
0x897B	0x95B2	#CJK UNIFIED IDEOGRAPH
0x897C	0x698E	#CJK UNIFIED IDEOGRAPH
0x897D	0x53AD	#CJK UNIFIED IDEOGRAPH
0x897E	0x5186	#CJK UNIFIED IDEOGRAPH
0x8980	0x5712	#CJK UNIFIED IDEOGRAPH
0x8981	0x5830	#CJK UNIFIED IDEOGRAPH
0x8982	0x5944	#CJK UNIFIED IDEOGRAPH
0x8983	0x5BB4	#CJK UNIFIED IDEOGRAPH
0x8984	0x5EF6	#CJK UNIFIED IDEOGRAPH
0x8985	0x6028	#CJK UNIFIED IDEOGRAPH
0x8986	0x63A9	#CJK UNIFIED IDEOGRAPH
0x8987	0x63F4	#CJK UNIFIED IDEOGRAPH
0x8988	0x6CBF	#CJK UNIFIED IDEOGRAPH
0x8989	0x6F14	#CJK UNIFIED IDEOGRAPH
0x898A	0x708E	#CJK UNIFIED IDEOGRAPH
0x898B	0x7114	#CJK UNIFIED IDEOGRAPH
0x898C	0x7159	#CJK UNIFIED IDEOGRAPH
0x898D	0x71D5	#CJK UNIFIED IDEOGRAPH
0x898E	0x733F	#CJK UNIFIED IDEOGRAPH
0x898F	0x7E01	#CJK UNIFIED IDEOGRAPH
0x8990	0x8276	#CJK UNIFIED IDEOGRAPH
0x8991	0x82D1	#CJK UNIFIED IDEOGRAPH
0x8992	0x8597	#CJK UNIFIED IDEOGRAPH
0x8993	0x9060	#CJK UNIFIED IDEOGRAPH
0x8994	0x925B	#CJK UNIFIED IDEOGRAPH
0x8995	0x9D1B	#CJK UNIFIED IDEOGRAPH
0x8996	0x5869	#CJK UNIFIED IDEOGRAPH
0x8997	0x65BC	#CJK UNIFIED IDEOGRAPH
0x8998	0x6C5A	#CJK UNIFIED IDEOGRAPH
0x8999	0x7525	#CJK UNIFIED IDEOGRAPH
0x899A	0x51F9	#CJK UNIFIED IDEOGRAPH
0x899B	0x592E	#CJK UNIFIED IDEOGRAPH
0x899C	0x5965	#CJK UNIFIED IDEOGRAPH
0x899D	0x5F80	#CJK UNIFIED IDEOGRAPH
0x899E	0x5FDC	#CJK UNIFIED IDEOGRAPH
0x899F	0x62BC	#CJK UNIFIED IDEOGRAPH
0x89A0	0x65FA	#CJK UNIFIED IDEOGRAPH
0x89A1	0x6A2A	#CJK UNIFIED IDEOGRAPH
0x89A2	0x6B27	#CJK UNIFIED IDEOGRAPH
0x89A3	0x6BB4	#CJK UNIFIED IDEOGRAPH
0x89A4	0x738B	#CJK UNIFIED IDEOGRAPH
0x89A5	0x7FC1	#CJK UNIFIED IDEOGRAPH
0x89A6	0x8956	#CJK UNIFIED IDEOGRAPH
0x89A7	0x9D2C	#CJK UNIFIED IDEOGRAPH
0x89A8	0x9D0E	#CJK UNIFIED IDEOGRAPH
0x89A9	0x9EC4	#CJK UNIFIED IDEOGRAPH
0x89AA	0x5CA1	#CJK UNIFIED IDEOGRAPH
0x89AB	0x6C96	#CJK UNIFIED IDEOGRAPH
0x89AC	0x837B	#CJK UNIFIED IDEOGRAPH
0x89AD	0x5104	#CJK UNIFIED IDEOGRAPH
0x89AE	0x5C4B	#CJK UNIFIED IDEOGRAPH
0x89AF	0x61B6	#CJK UNIFIED IDEOGRAPH
0x89B0	0x81C6	#CJK UNIFIED IDEOGRAPH
0x89B1	0x6876	#CJK UNIFIED IDEOGRAPH
0x89B2	0x7261	#CJK UNIFIED IDEOGRAPH
0x89B3	0x4E59	#CJK UNIFIED IDEOGRAPH
0x89B4	0x4FFA	#CJK UNIFIED IDEOGRAPH
0x89B5	0x5378	#CJK UNIFIED IDEOGRAPH
0x89B6	0x6069	#CJK UNIFIED IDEOGRAPH
0x89B7	0x6E29	#CJK UNIFIED IDEOGRAPH
0x89B8	0x7A4F	#CJK UNIFIED IDEOGRAPH
0x89B9	0x97F3	#CJK UNIFIED IDEOGRAPH
0x89BA	0x4E0B	#CJK UNIFIED IDEOGRAPH
0x89BB	0x5316	#CJK UNIFIED IDEOGRAPH
0x89BC	0x4EEE	#CJK UNIFIED IDEOGRAPH
0x89BD	0x4F55	#CJK UNIFIED IDEOGRAPH
0x89BE	0x4F3D	#CJK UNIFIED IDEOGRAPH
0x89BF	0x4FA1	#CJK UNIFIED IDEOGRAPH
0x89C0	0x4F73	#CJK UNIFIED IDEOGRAPH
0x89C1	0x52A0	#CJK UNIFIED IDEOGRAPH
0x89C2	0x53EF	#CJK UNIFIED IDEOGRAPH
0x89C3	0x5609	#CJK UNIFIED IDEOGRAPH
0x89C4	0x590F	#CJK UNIFIED IDEOGRAPH
0x89C5	0x5AC1	#CJK UNIFIED IDEOGRAPH
0x89C6	0x5BB6	#CJK UNIFIED IDEOGRAPH
0x89C7	0x5BE1	#CJK UNIFIED IDEOGRAPH
0x89C8	0x79D1	#CJK UNIFIED IDEOGRAPH
0x89C9	0x6687	#CJK UNIFIED IDEOGRAPH
0x89CA	0x679C	#CJK UNIFIED IDEOGRAPH
0x89CB	0x67B6	#CJK UNIFIED IDEOGRAPH
0x89CC	0x6B4C	#CJK UNIFIED IDEOGRAPH
0x89CD	0x6CB3	#CJK UNIFIED IDEOGRAPH
0x89CE	0x706B	#CJK UNIFIED IDEOGRAPH
0x89CF	0x73C2	#CJK UNIFIED IDEOGRAPH
0x89D0	0x798D	#CJK UNIFIED IDEOGRAPH
0x89D1	0x79BE	#CJK UNIFIED IDEOGRAPH
0x89D2	0x7A3C	#CJK UNIFIED IDEOGRAPH
0x89D3	0x7B87	#CJK UNIFIED IDEOGRAPH
0x89D4	0x82B1	#CJK UNIFIED IDEOGRAPH
0x89D5	0x82DB	#CJK UNIFIED IDEOGRAPH
0x89D6	0x8304	#CJK UNIFIED IDEOGRAPH
0x89D7	0x8377	#CJK UNIFIED IDEOGRAPH
0x89D8	0x83EF	#CJK UNIFIED IDEOGRAPH
0x89D9	0x83D3	#CJK UNIFIED IDEOGRAPH
0x89DA	0x8766	#CJK UNIFIED IDEOGRAPH
0x89DB	0x8AB2	#CJK UNIFIED IDEOGRAPH
0x89DC	0x5629	#CJK UNIFIED IDEOGRAPH
0x89DD	0x8CA8	#CJK UNIFIED IDEOGRAPH
0x89DE	0x8FE6	#CJK UNIFIED IDEOGRAPH
0x89DF	0x904E	#CJK UNIFIED IDEOGRAPH
0x89E0	0x971E	#CJK UNIFIED IDEOGRAPH
0x89E1	0x868A	#CJK UNIFIED IDEOGRAPH
0x89E2	0x4FC4	#CJK UNIFIED IDEOGRAPH
0x89E3	0x5CE8	#CJK UNIFIED IDEOGRAPH
0x89E4	0x6211	#CJK UNIFIED IDEOGRAPH
0x89E5	0x7259	#CJK UNIFIED IDEOGRAPH
0x89E6	0x753B	#CJK UNIFIED IDEOGRAPH
0x89E7	0x81E5	#CJK UNIFIED IDEOGRAPH
0x89E8	0x82BD	#CJK UNIFIED IDEOGRAPH
0x89E9	0x86FE	#CJK UNIFIED IDEOGRAPH
0x89EA	0x8CC0	#CJK UNIFIED IDEOGRAPH
0x89EB	0x96C5	#CJK UNIFIED IDEOGRAPH
0x89EC	0x9913	#CJK UNIFIED IDEOGRAPH
0x89ED	0x99D5	#CJK UNIFIED IDEOGRAPH
0x89EE	0x4ECB	#CJK UNIFIED IDEOGRAPH
0x89EF	0x4F1A	#CJK UNIFIED IDEOGRAPH
0x89F0	0x89E3	#CJK UNIFIED IDEOGRAPH
0x89F1	0x56DE	#CJK UNIFIED IDEOGRAPH
0x89F2	0x584A	#CJK UNIFIED IDEOGRAPH
0x89F3	0x58CA	#CJK UNIFIED IDEOGRAPH
0x89F4	0x5EFB	#CJK UNIFIED IDEOGRAPH
0x89F5	0x5FEB	#CJK UNIFIED IDEOGRAPH
0x89F6	0x602A	#CJK UNIFIED IDEOGRAPH
0x89F7	0x6094	#CJK UNIFIED IDEOGRAPH
0x89F8	0x6062	#CJK UNIFIED IDEOGRAPH
0x89F9	0x61D0	#CJK UNIFIED IDEOGRAPH
0x89FA	0x6212	#CJK UNIFIED IDEOGRAPH
0x89FB	0x62D0	#CJK UNIFIED IDEOGRAPH
0x89FC	0x6539	#CJK UNIFIED IDEOGRAPH
0x8A40	0x9B41	#CJK UNIFIED IDEOGRAPH
0x8A41	0x6666	#CJK UNIFIED IDEOGRAPH
0x8A42	0x68B0	#CJK UNIFIED IDEOGRAPH
0x8A43	0x6D77	#CJK UNIFIED IDEOGRAPH
0x8A44	0x7070	#CJK UNIFIED IDEOGRAPH
0x8A45	0x754C	#CJK UNIFIED IDEOGRAPH
0x8A46	0x7686	#CJK UNIFIED IDEOGRAPH
0x8A47	0x7D75	#CJK UNIFIED IDEOGRAPH
0x8A48	0x82A5	#CJK UNIFIED IDEOGRAPH
0x8A49	0x87F9	#CJK UNIFIED IDEOGRAPH
0x8A4A	0x958B	#CJK UNIFIED IDEOGRAPH
0x8A4B	0x968E	#CJK UNIFIED IDEOGRAPH
0x8A4C	0x8C9D	#CJK UNIFIED IDEOGRAPH
0x8A4D	0x51F1	#CJK UNIFIED IDEOGRAPH
0x8A4E	0x52BE	#CJK UNIFIED IDEOGRAPH
0x8A4F	0x5916	#CJK UNIFIED IDEOGRAPH
0x8A50	0x54B3	#CJK UNIFIED IDEOGRAPH
0x8A51	0x5BB3	#CJK UNIFIED IDEOGRAPH
0x8A52	0x5D16	#CJK UNIFIED IDEOGRAPH
0x8A53	0x6168	#CJK UNIFIED IDEOGRAPH
0x8A54	0x6982	#CJK UNIFIED IDEOGRAPH
0x8A55	0x6DAF	#CJK UNIFIED IDEOGRAPH
0x8A56	0x788D	#CJK UNIFIED IDEOGRAPH
0x8A57	0x84CB	#CJK UNIFIED IDEOGRAPH
0x8A58	0x8857	#CJK UNIFIED IDEOGRAPH
0x8A59	0x8A72	#CJK UNIFIED IDEOGRAPH
0x8A5A	0x93A7	#CJK UNIFIED IDEOGRAPH
0x8A5B	0x9AB8	#CJK UNIFIED IDEOGRAPH
0x8A5C	0x6D6C	#CJK UNIFIED IDEOGRAPH
0x8A5D	0x99A8	#CJK UNIFIED IDEOGRAPH
0x8A5E	0x86D9	#CJK UNIFIED IDEOGRAPH
0x8A5F	0x57A3	#CJK UNIFIED IDEOGRAPH
0x8A60	0x67FF	#CJK UNIFIED IDEOGRAPH
0x8A61	0x86CE	#CJK UNIFIED IDEOGRAPH
0x8A62	0x920E	#CJK UNIFIED IDEOGRAPH
0x8A63	0x5283	#CJK UNIFIED IDEOGRAPH
0x8A64	0x5687	#CJK UNIFIED IDEOGRAPH
0x8A65	0x5404	#CJK UNIFIED IDEOGRAPH
0x8A66	0x5ED3	#CJK UNIFIED IDEOGRAPH
0x8A67	0x62E1	#CJK UNIFIED IDEOGRAPH
0x8A68	0x64B9	#CJK UNIFIED IDEOGRAPH
0x8A69	0x683C	#CJK UNIFIED IDEOGRAPH
0x8A6A	0x6838	#CJK UNIFIED IDEOGRAPH
0x8A6B	0x6BBB	#CJK UNIFIED IDEOGRAPH
0x8A6C	0x7372	#CJK UNIFIED IDEOGRAPH
0x8A6D	0x78BA	#CJK UNIFIED IDEOGRAPH
0x8A6E	0x7A6B	#CJK UNIFIED IDEOGRAPH
0x8A6F	0x899A	#CJK UNIFIED IDEOGRAPH
0x8A70	0x89D2	#CJK UNIFIED IDEOGRAPH
0x8A71	0x8D6B	#CJK UNIFIED IDEOGRAPH
0x8A72	0x8F03	#CJK UNIFIED IDEOGRAPH
0x8A73	0x90ED	#CJK UNIFIED IDEOGRAPH
0x8A74	0x95A3	#CJK UNIFIED IDEOGRAPH
0x8A75	0x9694	#CJK UNIFIED IDEOGRAPH
0x8A76	0x9769	#CJK UNIFIED IDEOGRAPH
0x8A77	0x5B66	#CJK UNIFIED IDEOGRAPH
0x8A78	0x5CB3	#CJK UNIFIED IDEOGRAPH
0x8A79	0x697D	#CJK UNIFIED IDEOGRAPH
0x8A7A	0x984D	#CJK UNIFIED IDEOGRAPH
0x8A7B	0x984E	#CJK UNIFIED IDEOGRAPH
0x8A7C	0x639B	#CJK UNIFIED IDEOGRAPH
0x8A7D	0x7B20	#CJK UNIFIED IDEOGRAPH
0x8A7E	0x6A2B	#CJK UNIFIED IDEOGRAPH
0x8A80	0x6A7F	#CJK UNIFIED IDEOGRAPH
0x8A81	0x68B6	#CJK UNIFIED IDEOGRAPH
0x8A82	0x9C0D	#CJK UNIFIED IDEOGRAPH
0x8A83	0x6F5F	#CJK UNIFIED IDEOGRAPH
0x8A84	0x5272	#CJK UNIFIED IDEOGRAPH
0x8A85	0x559D	#CJK UNIFIED IDEOGRAPH
0x8A86	0x6070	#CJK UNIFIED IDEOGRAPH
0x8A87	0x62EC	#CJK UNIFIED IDEOGRAPH
0x8A88	0x6D3B	#CJK UNIFIED IDEOGRAPH
0x8A89	0x6E07	#CJK UNIFIED IDEOGRAPH
0x8A8A	0x6ED1	#CJK UNIFIED IDEOGRAPH
0x8A8B	0x845B	#CJK UNIFIED IDEOGRAPH
0x8A8C	0x8910	#CJK UNIFIED IDEOGRAPH
0x8A8D	0x8F44	#CJK UNIFIED IDEOGRAPH
0x8A8E	0x4E14	#CJK UNIFIED IDEOGRAPH
0x8A8F	0x9C39	#CJK UNIFIED IDEOGRAPH
0x8A90	0x53F6	#CJK UNIFIED IDEOGRAPH
0x8A91	0x691B	#CJK UNIFIED IDEOGRAPH
0x8A92	0x6A3A	#CJK UNIFIED IDEOGRAPH
0x8A93	0x9784	#CJK UNIFIED IDEOGRAPH
0x8A94	0x682A	#CJK UNIFIED IDEOGRAPH
0x8A95	0x515C	#CJK UNIFIED IDEOGRAPH
0x8A96	0x7AC3	#CJK UNIFIED IDEOGRAPH
0x8A97	0x84B2	#CJK UNIFIED IDEOGRAPH
0x8A98	0x91DC	#CJK UNIFIED IDEOGRAPH
0x8A99	0x938C	#CJK UNIFIED IDEOGRAPH
0x8A9A	0x565B	#CJK UNIFIED IDEOGRAPH
0x8A9B	0x9D28	#CJK UNIFIED IDEOGRAPH
0x8A9C	0x6822	#CJK UNIFIED IDEOGRAPH
0x8A9D	0x8305	#CJK UNIFIED IDEOGRAPH
0x8A9E	0x8431	#CJK UNIFIED IDEOGRAPH
0x8A9F	0x7CA5	#CJK UNIFIED IDEOGRAPH
0x8AA0	0x5208	#CJK UNIFIED IDEOGRAPH
0x8AA1	0x82C5	#CJK UNIFIED IDEOGRAPH
0x8AA2	0x74E6	#CJK UNIFIED IDEOGRAPH
0x8AA3	0x4E7E	#CJK UNIFIED IDEOGRAPH
0x8AA4	0x4F83	#CJK UNIFIED IDEOGRAPH
0x8AA5	0x51A0	#CJK UNIFIED IDEOGRAPH
0x8AA6	0x5BD2	#CJK UNIFIED IDEOGRAPH
0x8AA7	0x520A	#CJK UNIFIED IDEOGRAPH
0x8AA8	0x52D8	#CJK UNIFIED IDEOGRAPH
0x8AA9	0x52E7	#CJK UNIFIED IDEOGRAPH
0x8AAA	0x5DFB	#CJK UNIFIED IDEOGRAPH
0x8AAB	0x559A	#CJK UNIFIED IDEOGRAPH
0x8AAC	0x582A	#CJK UNIFIED IDEOGRAPH
0x8AAD	0x59E6	#CJK UNIFIED IDEOGRAPH
0x8AAE	0x5B8C	#CJK UNIFIED IDEOGRAPH
0x8AAF	0x5B98	#CJK UNIFIED IDEOGRAPH
0x8AB0	0x5BDB	#CJK UNIFIED IDEOGRAPH
0x8AB1	0x5E72	#CJK UNIFIED IDEOGRAPH
0x8AB2	0x5E79	#CJK UNIFIED IDEOGRAPH
0x8AB3	0x60A3	#CJK UNIFIED IDEOGRAPH
0x8AB4	0x611F	#CJK UNIFIED IDEOGRAPH
0x8AB5	0x6163	#CJK UNIFIED IDEOGRAPH
0x8AB6	0x61BE	#CJK UNIFIED IDEOGRAPH
0x8AB7	0x63DB	#CJK UNIFIED IDEOGRAPH
0x8AB8	0x6562	#CJK UNIFIED IDEOGRAPH
0x8AB9	0x67D1	#CJK UNIFIED IDEOGRAPH
0x8ABA	0x6853	#CJK UNIFIED IDEOGRAPH
0x8ABB	0x68FA	#CJK UNIFIED IDEOGRAPH
0x8ABC	0x6B3E	#CJK UNIFIED IDEOGRAPH
0x8ABD	0x6B53	#CJK UNIFIED IDEOGRAPH
0x8ABE	0x6C57	#CJK UNIFIED IDEOGRAPH
0x8ABF	0x6F22	#CJK UNIFIED IDEOGRAPH
0x8AC0	0x6F97	#CJK UNIFIED IDEOGRAPH
0x8AC1	0x6F45	#CJK UNIFIED IDEOGRAPH
0x8AC2	0x74B0	#CJK UNIFIED IDEOGRAPH
0x8AC3	0x7518	#CJK UNIFIED IDEOGRAPH
0x8AC4	0x76E3	#CJK UNIFIED IDEOGRAPH
0x8AC5	0x770B	#CJK UNIFIED IDEOGRAPH
0x8AC6	0x7AFF	#CJK UNIFIED IDEOGRAPH
0x8AC7	0x7BA1	#CJK UNIFIED IDEOGRAPH
0x8AC8	0x7C21	#CJK UNIFIED IDEOGRAPH
0x8AC9	0x7DE9	#CJK UNIFIED IDEOGRAPH
0x8ACA	0x7F36	#CJK UNIFIED IDEOGRAPH
0x8ACB	0x7FF0	#CJK UNIFIED IDEOGRAPH
0x8ACC	0x809D	#CJK UNIFIED IDEOGRAPH
0x8ACD	0x8266	#CJK UNIFIED IDEOGRAPH
0x8ACE	0x839E	#CJK UNIFIED IDEOGRAPH
0x8ACF	0x89B3	#CJK UNIFIED IDEOGRAPH
0x8AD0	0x8ACC	#CJK UNIFIED IDEOGRAPH
0x8AD1	0x8CAB	#CJK UNIFIED IDEOGRAPH
0x8AD2	0x9084	#CJK UNIFIED IDEOGRAPH
0x8AD3	0x9451	#CJK UNIFIED IDEOGRAPH
0x8AD4	0x9593	#CJK UNIFIED IDEOGRAPH
0x8AD5	0x9591	#CJK UNIFIED IDEOGRAPH
0x8AD6	0x95A2	#CJK UNIFIED IDEOGRAPH
0x8AD7	0x9665	#CJK UNIFIED IDEOGRAPH
0x8AD8	0x97D3	#CJK UNIFIED IDEOGRAPH
0x8AD9	0x9928	#CJK UNIFIED IDEOGRAPH
0x8ADA	0x8218	#CJK UNIFIED IDEOGRAPH
0x8ADB	0x4E38	#CJK UNIFIED IDEOGRAPH
0x8ADC	0x542B	#CJK UNIFIED IDEOGRAPH
0x8ADD	0x5CB8	#CJK UNIFIED IDEOGRAPH
0x8ADE	0x5DCC	#CJK UNIFIED IDEOGRAPH
0x8ADF	0x73A9	#CJK UNIFIED IDEOGRAPH
0x8AE0	0x764C	#CJK UNIFIED IDEOGRAPH
0x8AE1	0x773C	#CJK UNIFIED IDEOGRAPH
0x8AE2	0x5CA9	#CJK UNIFIED IDEOGRAPH
0x8AE3	0x7FEB	#CJK UNIFIED IDEOGRAPH
0x8AE4	0x8D0B	#CJK UNIFIED IDEOGRAPH
0x8AE5	0x96C1	#CJK UNIFIED IDEOGRAPH
0x8AE6	0x9811	#CJK UNIFIED IDEOGRAPH
0x8AE7	0x9854	#CJK UNIFIED IDEOGRAPH
0x8AE8	0x9858	#CJK UNIFIED IDEOGRAPH
0x8AE9	0x4F01	#CJK UNIFIED IDEOGRAPH
0x8AEA	0x4F0E	#CJK UNIFIED IDEOGRAPH
0x8AEB	0x5371	#CJK UNIFIED IDEOGRAPH
0x8AEC	0x559C	#CJK UNIFIED IDEOGRAPH
0x8AED	0x5668	#CJK UNIFIED IDEOGRAPH
0x8AEE	0x57FA	#CJK UNIFIED IDEOGRAPH
0x8AEF	0x5947	#CJK UNIFIED IDEOGRAPH
0x8AF0	0x5B09	#CJK UNIFIED IDEOGRAPH
0x8AF1	0x5BC4	#CJK UNIFIED IDEOGRAPH
0x8AF2	0x5C90	#CJK UNIFIED IDEOGRAPH
0x8AF3	0x5E0C	#CJK UNIFIED IDEOGRAPH
0x8AF4	0x5E7E	#CJK UNIFIED IDEOGRAPH
0x8AF5	0x5FCC	#CJK UNIFIED IDEOGRAPH
0x8AF6	0x63EE	#CJK UNIFIED IDEOGRAPH
0x8AF7	0x673A	#CJK UNIFIED IDEOGRAPH
0x8AF8	0x65D7	#CJK UNIFIED IDEOGRAPH
0x8AF9	0x65E2	#CJK UNIFIED IDEOGRAPH
0x8AFA	0x671F	#CJK UNIFIED IDEOGRAPH
0x8AFB	0x68CB	#CJK UNIFIED IDEOGRAPH
0x8AFC	0x68C4	#CJK UNIFIED IDEOGRAPH
0x8B40	0x6A5F	#CJK UNIFIED IDEOGRAPH
0x8B41	0x5E30	#CJK UNIFIED IDEOGRAPH
0x8B42	0x6BC5	#CJK UNIFIED IDEOGRAPH
0x8B43	0x6C17	#CJK UNIFIED IDEOGRAPH
0x8B44	0x6C7D	#CJK UNIFIED IDEOGRAPH
0x8B45	0x757F	#CJK UNIFIED IDEOGRAPH
0x8B46	0x7948	#CJK UNIFIED IDEOGRAPH
0x8B47	0x5B63	#CJK UNIFIED IDEOGRAPH
0x8B48	0x7A00	#CJK UNIFIED IDEOGRAPH
0x8B49	0x7D00	#CJK UNIFIED IDEOGRAPH
0x8B4A	0x5FBD	#CJK UNIFIED IDEOGRAPH
0x8B4B	0x898F	#CJK UNIFIED IDEOGRAPH
0x8B4C	0x8A18	#CJK UNIFIED IDEOGRAPH
0x8B4D	0x8CB4	#CJK UNIFIED IDEOGRAPH
0x8B4E	0x8D77	#CJK UNIFIED IDEOGRAPH
0x8B4F	0x8ECC	#CJK UNIFIED IDEOGRAPH
0x8B50	0x8F1D	#CJK UNIFIED IDEOGRAPH
0x8B51	0x98E2	#CJK UNIFIED IDEOGRAPH
0x8B52	0x9A0E	#CJK UNIFIED IDEOGRAPH
0x8B53	0x9B3C	#CJK UNIFIED IDEOGRAPH
0x8B54	0x4E80	#CJK UNIFIED IDEOGRAPH
0x8B55	0x507D	#CJK UNIFIED IDEOGRAPH
0x8B56	0x5100	#CJK UNIFIED IDEOGRAPH
0x8B57	0x5993	#CJK UNIFIED IDEOGRAPH
0x8B58	0x5B9C	#CJK UNIFIED IDEOGRAPH
0x8B59	0x622F	#CJK UNIFIED IDEOGRAPH
0x8B5A	0x6280	#CJK UNIFIED IDEOGRAPH
0x8B5B	0x64EC	#CJK UNIFIED IDEOGRAPH
0x8B5C	0x6B3A	#CJK UNIFIED IDEOGRAPH
0x8B5D	0x72A0	#CJK UNIFIED IDEOGRAPH
0x8B5E	0x7591	#CJK UNIFIED IDEOGRAPH
0x8B5F	0x7947	#CJK UNIFIED IDEOGRAPH
0x8B60	0x7FA9	#CJK UNIFIED IDEOGRAPH
0x8B61	0x87FB	#CJK UNIFIED IDEOGRAPH
0x8B62	0x8ABC	#CJK UNIFIED IDEOGRAPH
0x8B63	0x8B70	#CJK UNIFIED IDEOGRAPH
0x8B64	0x63AC	#CJK UNIFIED IDEOGRAPH
0x8B65	0x83CA	#CJK UNIFIED IDEOGRAPH
0x8B66	0x97A0	#CJK UNIFIED IDEOGRAPH
0x8B67	0x5409	#CJK UNIFIED IDEOGRAPH
0x8B68	0x5403	#CJK UNIFIED IDEOGRAPH
0x8B69	0x55AB	#CJK UNIFIED IDEOGRAPH
0x8B6A	0x6854	#CJK UNIFIED IDEOGRAPH
0x8B6B	0x6A58	#CJK UNIFIED IDEOGRAPH
0x8B6C	0x8A70	#CJK UNIFIED IDEOGRAPH
0x8B6D	0x7827	#CJK UNIFIED IDEOGRAPH
0x8B6E	0x6775	#CJK UNIFIED IDEOGRAPH
0x8B6F	0x9ECD	#CJK UNIFIED IDEOGRAPH
0x8B70	0x5374	#CJK UNIFIED IDEOGRAPH
0x8B71	0x5BA2	#CJK UNIFIED IDEOGRAPH
0x8B72	0x811A	#CJK UNIFIED IDEOGRAPH
0x8B73	0x8650	#CJK UNIFIED IDEOGRAPH
0x8B74	0x9006	#CJK UNIFIED IDEOGRAPH
0x8B75	0x4E18	#CJK UNIFIED IDEOGRAPH
0x8B76	0x4E45	#CJK UNIFIED IDEOGRAPH
0x8B77	0x4EC7	#CJK UNIFIED IDEOGRAPH
0x8B78	0x4F11	#CJK UNIFIED IDEOGRAPH
0x8B79	0x53CA	#CJK UNIFIED IDEOGRAPH
0x8B7A	0x5438	#CJK UNIFIED IDEOGRAPH
0x8B7B	0x5BAE	#CJK UNIFIED IDEOGRAPH
0x8B7C	0x5F13	#CJK UNIFIED IDEOGRAPH
0x8B7D	0x6025	#CJK UNIFIED IDEOGRAPH
0x8B7E	0x6551	#CJK UNIFIED IDEOGRAPH
0x8B80	0x673D	#CJK UNIFIED IDEOGRAPH
0x8B81	0x6C42	#CJK UNIFIED IDEOGRAPH
0x8B82	0x6C72	#CJK UNIFIED IDEOGRAPH
0x8B83	0x6CE3	#CJK UNIFIED IDEOGRAPH
0x8B84	0x7078	#CJK UNIFIED IDEOGRAPH
0x8B85	0x7403	#CJK UNIFIED IDEOGRAPH
0x8B86	0x7A76	#CJK UNIFIED IDEOGRAPH
0x8B87	0x7AAE	#CJK UNIFIED IDEOGRAPH
0x8B88	0x7B08	#CJK UNIFIED IDEOGRAPH
0x8B89	0x7D1A	#CJK UNIFIED IDEOGRAPH
0x8B8A	0x7CFE	#CJK UNIFIED IDEOGRAPH
0x8B8B	0x7D66	#CJK UNIFIED IDEOGRAPH
0x8B8C	0x65E7	#CJK UNIFIED IDEOGRAPH
0x8B8D	0x725B	#CJK UNIFIED IDEOGRAPH
0x8B8E	0x53BB	#CJK UNIFIED IDEOGRAPH
0x8B8F	0x5C45	#CJK UNIFIED IDEOGRAPH
0x8B90	0x5DE8	#CJK UNIFIED IDEOGRAPH
0x8B91	0x62D2	#CJK UNIFIED IDEOGRAPH
0x8B92	0x62E0	#CJK UNIFIED IDEOGRAPH
0x8B93	0x6319	#CJK UNIFIED IDEOGRAPH
0x8B94	0x6E20	#CJK UNIFIED IDEOGRAPH
0x8B95	0x865A	#CJK UNIFIED IDEOGRAPH
0x8B96	0x8A31	#CJK UNIFIED IDEOGRAPH
0x8B97	0x8DDD	#CJK UNIFIED IDEOGRAPH
0x8B98	0x92F8	#CJK UNIFIED IDEOGRAPH
0x8B99	0x6F01	#CJK UNIFIED IDEOGRAPH
0x8B9A	0x79A6	#CJK UNIFIED IDEOGRAPH
0x8B9B	0x9B5A	#CJK UNIFIED IDEOGRAPH
0x8B9C	0x4EA8	#CJK UNIFIED IDEOGRAPH
0x8B9D	0x4EAB	#CJK UNIFIED IDEOGRAPH
0x8B9E	0x4EAC	#CJK UNIFIED IDEOGRAPH
0x8B9F	0x4F9B	#CJK UNIFIED IDEOGRAPH
0x8BA0	0x4FA0	#CJK UNIFIED IDEOGRAPH
0x8BA1	0x50D1	#CJK UNIFIED IDEOGRAPH
0x8BA2	0x5147	#CJK UNIFIED IDEOGRAPH
0x8BA3	0x7AF6	#CJK UNIFIED IDEOGRAPH
0x8BA4	0x5171	#CJK UNIFIED IDEOGRAPH
0x8BA5	0x51F6	#CJK UNIFIED IDEOGRAPH
0x8BA6	0x5354	#CJK UNIFIED IDEOGRAPH
0x8BA7	0x5321	#CJK UNIFIED IDEOGRAPH
0x8BA8	0x537F	#CJK UNIFIED IDEOGRAPH
0x8BA9	0x53EB	#CJK UNIFIED IDEOGRAPH
0x8BAA	0x55AC	#CJK UNIFIED IDEOGRAPH
0x8BAB	0x5883	#CJK UNIFIED IDEOGRAPH
0x8BAC	0x5CE1	#CJK UNIFIED IDEOGRAPH
0x8BAD	0x5F37	#CJK UNIFIED IDEOGRAPH
0x8BAE	0x5F4A	#CJK UNIFIED IDEOGRAPH
0x8BAF	0x602F	#CJK UNIFIED IDEOGRAPH
0x8BB0	0x6050	#CJK UNIFIED IDEOGRAPH
0x8BB1	0x606D	#CJK UNIFIED IDEOGRAPH
0x8BB2	0x631F	#CJK UNIFIED IDEOGRAPH
0x8BB3	0x6559	#CJK UNIFIED IDEOGRAPH
0x8BB4	0x6A4B	#CJK UNIFIED IDEOGRAPH
0x8BB5	0x6CC1	#CJK UNIFIED IDEOGRAPH
0x8BB6	0x72C2	#CJK UNIFIED IDEOGRAPH
0x8BB7	0x72ED	#CJK UNIFIED IDEOGRAPH
0x8BB8	0x77EF	#CJK UNIFIED IDEOGRAPH
0x8BB9	0x80F8	#CJK UNIFIED IDEOGRAPH
0x8BBA	0x8105	#CJK UNIFIED IDEOGRAPH
0x8BBB	0x8208	#CJK UNIFIED IDEOGRAPH
0x8BBC	0x854E	#CJK UNIFIED IDEOGRAPH
0x8BBD	0x90F7	#CJK UNIFIED IDEOGRAPH
0x8BBE	0x93E1	#CJK UNIFIED IDEOGRAPH
0x8BBF	0x97FF	#CJK UNIFIED IDEOGRAPH
0x8BC0	0x9957	#CJK UNIFIED IDEOGRAPH
0x8BC1	0x9A5A	#CJK UNIFIED IDEOGRAPH
0x8BC2	0x4EF0	#CJK UNIFIED IDEOGRAPH
0x8BC3	0x51DD	#CJK UNIFIED IDEOGRAPH
0x8BC4	0x5C2D	#CJK UNIFIED IDEOGRAPH
0x8BC5	0x6681	#CJK UNIFIED IDEOGRAPH
0x8BC6	0x696D	#CJK UNIFIED IDEOGRAPH
0x8BC7	0x5C40	#CJK UNIFIED IDEOGRAPH
0x8BC8	0x66F2	#CJK UNIFIED IDEOGRAPH
0x8BC9	0x6975	#CJK UNIFIED IDEOGRAPH
0x8BCA	0x7389	#CJK UNIFIED IDEOGRAPH
0x8BCB	0x6850	#CJK UNIFIED IDEOGRAPH
0x8BCC	0x7C81	#CJK UNIFIED IDEOGRAPH
0x8BCD	0x50C5	#CJK UNIFIED IDEOGRAPH
0x8BCE	0x52E4	#CJK UNIFIED IDEOGRAPH
0x8BCF	0x5747	#CJK UNIFIED IDEOGRAPH
0x8BD0	0x5DFE	#CJK UNIFIED IDEOGRAPH
0x8BD1	0x9326	#CJK UNIFIED IDEOGRAPH
0x8BD2	0x65A4	#CJK UNIFIED IDEOGRAPH
0x8BD3	0x6B23	#CJK UNIFIED IDEOGRAPH
0x8BD4	0x6B3D	#CJK UNIFIED IDEOGRAPH
0x8BD5	0x7434	#CJK UNIFIED IDEOGRAPH
0x8BD6	0x7981	#CJK UNIFIED IDEOGRAPH
0x8BD7	0x79BD	#CJK UNIFIED IDEOGRAPH
0x8BD8	0x7B4B	#CJK UNIFIED IDEOGRAPH
0x8BD9	0x7DCA	#CJK UNIFIED IDEOGRAPH
0x8BDA	0x82B9	#CJK UNIFIED IDEOGRAPH
0x8BDB	0x83CC	#CJK UNIFIED IDEOGRAPH
0x8BDC	0x887F	#CJK UNIFIED IDEOGRAPH
0x8BDD	0x895F	#CJK UNIFIED IDEOGRAPH
0x8BDE	0x8B39	#CJK UNIFIED IDEOGRAPH
0x8BDF	0x8FD1	#CJK UNIFIED IDEOGRAPH
0x8BE0	0x91D1	#CJK UNIFIED IDEOGRAPH
0x8BE1	0x541F	#CJK UNIFIED IDEOGRAPH
0x8BE2	0x9280	#CJK UNIFIED IDEOGRAPH
0x8BE3	0x4E5D	#CJK UNIFIED IDEOGRAPH
0x8BE4	0x5036	#CJK UNIFIED IDEOGRAPH
0x8BE5	0x53E5	#CJK UNIFIED IDEOGRAPH
0x8BE6	0x533A	#CJK UNIFIED IDEOGRAPH
0x8BE7	0x72D7	#CJK UNIFIED IDEOGRAPH
0x8BE8	0x7396	#CJK UNIFIED IDEOGRAPH
0x8BE9	0x77E9	#CJK UNIFIED IDEOGRAPH
0x8BEA	0x82E6	#CJK UNIFIED IDEOGRAPH
0x8BEB	0x8EAF	#CJK UNIFIED IDEOGRAPH
0x8BEC	0x99C6	#CJK UNIFIED IDEOGRAPH
0x8BED	0x99C8	#CJK UNIFIED IDEOGRAPH
0x8BEE	0x99D2	#CJK UNIFIED IDEOGRAPH
0x8BEF	0x5177	#CJK UNIFIED IDEOGRAPH
0x8BF0	0x611A	#CJK UNIFIED IDEOGRAPH
0x8BF1	0x865E	#CJK UNIFIED IDEOGRAPH
0x8BF2	0x55B0	#CJK UNIFIED IDEOGRAPH
0x8BF3	0x7A7A	#CJK UNIFIED IDEOGRAPH
0x8BF4	0x5076	#CJK UNIFIED IDEOGRAPH
0x8BF5	0x5BD3	#CJK UNIFIED IDEOGRAPH
0x8BF6	0x9047	#CJK UNIFIED IDEOGRAPH
0x8BF7	0x9685	#CJK UNIFIED IDEOGRAPH
0x8BF8	0x4E32	#CJK UNIFIED IDEOGRAPH
0x8BF9	0x6ADB	#CJK UNIFIED IDEOGRAPH
0x8BFA	0x91E7	#CJK UNIFIED IDEOGRAPH
0x8BFB	0x5C51	#CJK UNIFIED IDEOGRAPH
0x8BFC	0x5C48	#CJK UNIFIED IDEOGRAPH
0x8C40	0x6398	#CJK UNIFIED IDEOGRAPH
0x8C41	0x7A9F	#CJK UNIFIED IDEOGRAPH
0x8C42	0x6C93	#CJK UNIFIED IDEOGRAPH
0x8C43	0x9774	#CJK UNIFIED IDEOGRAPH
0x8C44	0x8F61	#CJK UNIFIED IDEOGRAPH
0x8C45	0x7AAA	#CJK UNIFIED IDEOGRAPH
0x8C46	0x718A	#CJK UNIFIED IDEOGRAPH
0x8C47	0x9688	#CJK UNIFIED IDEOGRAPH
0x8C48	0x7C82	#CJK UNIFIED IDEOGRAPH
0x8C49	0x6817	#CJK UNIFIED IDEOGRAPH
0x8C4A	0x7E70	#CJK UNIFIED IDEOGRAPH
0x8C4B	0x6851	#CJK UNIFIED IDEOGRAPH
0x8C4C	0x936C	#CJK UNIFIED IDEOGRAPH
0x8C4D	0x52F2	#CJK UNIFIED IDEOGRAPH
0x8C4E	0x541B	#CJK UNIFIED IDEOGRAPH
0x8C4F	0x85AB	#CJK UNIFIED IDEOGRAPH
0x8C50	0x8A13	#CJK UNIFIED IDEOGRAPH
0x8C51	0x7FA4	#CJK UNIFIED IDEOGRAPH
0x8C52	0x8ECD	#CJK UNIFIED IDEOGRAPH
0x8C53	0x90E1	#CJK UNIFIED IDEOGRAPH
0x8C54	0x5366	#CJK UNIFIED IDEOGRAPH
0x8C55	0x8888	#CJK UNIFIED IDEOGRAPH
0x8C56	0x7941	#CJK UNIFIED IDEOGRAPH
0x8C57	0x4FC2	#CJK UNIFIED IDEOGRAPH
0x8C58	0x50BE	#CJK UNIFIED IDEOGRAPH
0x8C59	0x5211	#CJK UNIFIED IDEOGRAPH
0x8C5A	0x5144	#CJK UNIFIED IDEOGRAPH
0x8C5B	0x5553	#CJK UNIFIED IDEOGRAPH
0x8C5C	0x572D	#CJK UNIFIED IDEOGRAPH
0x8C5D	0x73EA	#CJK UNIFIED IDEOGRAPH
0x8C5E	0x578B	#CJK UNIFIED IDEOGRAPH
0x8C5F	0x5951	#CJK UNIFIED IDEOGRAPH
0x8C60	0x5F62	#CJK UNIFIED IDEOGRAPH
0x8C61	0x5F84	#CJK UNIFIED IDEOGRAPH
0x8C62	0x6075	#CJK UNIFIED IDEOGRAPH
0x8C63	0x6176	#CJK UNIFIED IDEOGRAPH
0x8C64	0x6167	#CJK UNIFIED IDEOGRAPH
0x8C65	0x61A9	#CJK UNIFIED IDEOGRAPH
0x8C66	0x63B2	#CJK UNIFIED IDEOGRAPH
0x8C67	0x643A	#CJK UNIFIED IDEOGRAPH
0x8C68	0x656C	#CJK UNIFIED IDEOGRAPH
0x8C69	0x666F	#CJK UNIFIED IDEOGRAPH
0x8C6A	0x6842	#CJK UNIFIED IDEOGRAPH
0x8C6B	0x6E13	#CJK UNIFIED IDEOGRAPH
0x8C6C	0x7566	#CJK UNIFIED IDEOGRAPH
0x8C6D	0x7A3D	#CJK UNIFIED IDEOGRAPH
0x8C6E	0x7CFB	#CJK UNIFIED IDEOGRAPH
0x8C6F	0x7D4C	#CJK UNIFIED IDEOGRAPH
0x8C70	0x7D99	#CJK UNIFIED IDEOGRAPH
0x8C71	0x7E4B	#CJK UNIFIED IDEOGRAPH
0x8C72	0x7F6B	#CJK UNIFIED IDEOGRAPH
0x8C73	0x830E	#CJK UNIFIED IDEOGRAPH
0x8C74	0x834A	#CJK UNIFIED IDEOGRAPH
0x8C75	0x86CD	#CJK UNIFIED IDEOGRAPH
0x8C76	0x8A08	#CJK UNIFIED IDEOGRAPH
0x8C77	0x8A63	#CJK UNIFIED IDEOGRAPH
0x8C78	0x8B66	#CJK UNIFIED IDEOGRAPH
0x8C79	0x8EFD	#CJK UNIFIED IDEOGRAPH
0x8C7A	0x981A	#CJK UNIFIED IDEOGRAPH
0x8C7B	0x9D8F	#CJK UNIFIED IDEOGRAPH
0x8C7C	0x82B8	#CJK UNIFIED IDEOGRAPH
0x8C7D	0x8FCE	#CJK UNIFIED IDEOGRAPH
0x8C7E	0x9BE8	#CJK UNIFIED IDEOGRAPH
0x8C80	0x5287	#CJK UNIFIED IDEOGRAPH
0x8C81	0x621F	#CJK UNIFIED IDEOGRAPH
0x8C82	0x6483	#CJK UNIFIED IDEOGRAPH
0x8C83	0x6FC0	#CJK UNIFIED IDEOGRAPH
0x8C84	0x9699	#CJK UNIFIED IDEOGRAPH
0x8C85	0x6841	#CJK UNIFIED IDEOGRAPH
0x8C86	0x5091	#CJK UNIFIED IDEOGRAPH
0x8C87	0x6B20	#CJK UNIFIED IDEOGRAPH
0x8C88	0x6C7A	#CJK UNIFIED IDEOGRAPH
0x8C89	0x6F54	#CJK UNIFIED IDEOGRAPH
0x8C8A	0x7A74	#CJK UNIFIED IDEOGRAPH
0x8C8B	0x7D50	#CJK UNIFIED IDEOGRAPH
0x8C8C	0x8840	#CJK UNIFIED IDEOGRAPH
0x8C8D	0x8A23	#CJK UNIFIED IDEOGRAPH
0x8C8E	0x6708	#CJK UNIFIED IDEOGRAPH
0x8C8F	0x4EF6	#CJK UNIFIED IDEOGRAPH
0x8C90	0x5039	#CJK UNIFIED IDEOGRAPH
0x8C91	0x5026	#CJK UNIFIED IDEOGRAPH
0x8C92	0x5065	#CJK UNIFIED IDEOGRAPH
0x8C93	0x517C	#CJK UNIFIED IDEOGRAPH
0x8C94	0x5238	#CJK UNIFIED IDEOGRAPH
0x8C95	0x5263	#CJK UNIFIED IDEOGRAPH
0x8C96	0x55A7	#CJK UNIFIED IDEOGRAPH
0x8C97	0x570F	#CJK UNIFIED IDEOGRAPH
0x8C98	0x5805	#CJK UNIFIED IDEOGRAPH
0x8C99	0x5ACC	#CJK UNIFIED IDEOGRAPH
0x8C9A	0x5EFA	#CJK UNIFIED IDEOGRAPH
0x8C9B	0x61B2	#CJK UNIFIED IDEOGRAPH
0x8C9C	0x61F8	#CJK UNIFIED IDEOGRAPH
0x8C9D	0x62F3	#CJK UNIFIED IDEOGRAPH
0x8C9E	0x6372	#CJK UNIFIED IDEOGRAPH
0x8C9F	0x691C	#CJK UNIFIED IDEOGRAPH
0x8CA0	0x6A29	#CJK UNIFIED IDEOGRAPH
0x8CA1	0x727D	#CJK UNIFIED IDEOGRAPH
0x8CA2	0x72AC	#CJK UNIFIED IDEOGRAPH
0x8CA3	0x732E	#CJK UNIFIED IDEOGRAPH
0x8CA4	0x7814	#CJK UNIFIED IDEOGRAPH
0x8CA5	0x786F	#CJK UNIFIED IDEOGRAPH
0x8CA6	0x7D79	#CJK UNIFIED IDEOGRAPH
0x8CA7	0x770C	#CJK UNIFIED IDEOGRAPH
0x8CA8	0x80A9	#CJK UNIFIED IDEOGRAPH
0x8CA9	0x898B	#CJK UNIFIED IDEOGRAPH
0x8CAA	0x8B19	#CJK UNIFIED IDEOGRAPH
0x8CAB	0x8CE2	#CJK UNIFIED IDEOGRAPH
0x8CAC	0x8ED2	#CJK UNIFIED IDEOGRAPH
0x8CAD	0x9063	#CJK UNIFIED IDEOGRAPH
0x8CAE	0x9375	#CJK UNIFIED IDEOGRAPH
0x8CAF	0x967A	#CJK UNIFIED IDEOGRAPH
0x8CB0	0x9855	#CJK UNIFIED IDEOGRAPH
0x8CB1	0x9A13	#CJK UNIFIED IDEOGRAPH
0x8CB2	0x9E78	#CJK UNIFIED IDEOGRAPH
0x8CB3	0x5143	#CJK UNIFIED IDEOGRAPH
0x8CB4	0x539F	#CJK UNIFIED IDEOGRAPH
0x8CB5	0x53B3	#CJK UNIFIED IDEOGRAPH
0x8CB6	0x5E7B	#CJK UNIFIED IDEOGRAPH
0x8CB7	0x5F26	#CJK UNIFIED IDEOGRAPH
0x8CB8	0x6E1B	#CJK UNIFIED IDEOGRAPH
0x8CB9	0x6E90	#CJK UNIFIED IDEOGRAPH
0x8CBA	0x7384	#CJK UNIFIED IDEOGRAPH
0x8CBB	0x73FE	#CJK UNIFIED IDEOGRAPH
0x8CBC	0x7D43	#CJK UNIFIED IDEOGRAPH
0x8CBD	0x8237	#CJK UNIFIED IDEOGRAPH
0x8CBE	0x8A00	#CJK UNIFIED IDEOGRAPH
0x8CBF	0x8AFA	#CJK UNIFIED IDEOGRAPH
0x8CC0	0x9650	#CJK UNIFIED IDEOGRAPH
0x8CC1	0x4E4E	#CJK UNIFIED IDEOGRAPH
0x8CC2	0x500B	#CJK UNIFIED IDEOGRAPH
0x8CC3	0x53E4	#CJK UNIFIED IDEOGRAPH
0x8CC4	0x547C	#CJK UNIFIED IDEOGRAPH
0x8CC5	0x56FA	#CJK UNIFIED IDEOGRAPH
0x8CC6	0x59D1	#CJK UNIFIED IDEOGRAPH
0x8CC7	0x5B64	#CJK UNIFIED IDEOGRAPH
0x8CC8	0x5DF1	#CJK UNIFIED IDEOGRAPH
0x8CC9	0x5EAB	#CJK UNIFIED IDEOGRAPH
0x8CCA	0x5F27	#CJK UNIFIED IDEOGRAPH
0x8CCB	0x6238	#CJK UNIFIED IDEOGRAPH
0x8CCC	0x6545	#CJK UNIFIED IDEOGRAPH
0x8CCD	0x67AF	#CJK UNIFIED IDEOGRAPH
0x8CCE	0x6E56	#CJK UNIFIED IDEOGRAPH
0x8CCF	0x72D0	#CJK UNIFIED IDEOGRAPH
0x8CD0	0x7CCA	#CJK UNIFIED IDEOGRAPH
0x8CD1	0x88B4	#CJK UNIFIED IDEOGRAPH
0x8CD2	0x80A1	#CJK UNIFIED IDEOGRAPH
0x8CD3	0x80E1	#CJK UNIFIED IDEOGRAPH
0x8CD4	0x83F0	#CJK UNIFIED IDEOGRAPH
0x8CD5	0x864E	#CJK UNIFIED IDEOGRAPH
0x8CD6	0x8A87	#CJK UNIFIED IDEOGRAPH
0x8CD7	0x8DE8	#CJK UNIFIED IDEOGRAPH
0x8CD8	0x9237	#CJK UNIFIED IDEOGRAPH
0x8CD9	0x96C7	#CJK UNIFIED IDEOGRAPH
0x8CDA	0x9867	#CJK UNIFIED IDEOGRAPH
0x8CDB	0x9F13	#CJK UNIFIED IDEOGRAPH
0x8CDC	0x4E94	#CJK UNIFIED IDEOGRAPH
0x8CDD	0x4E92	#CJK UNIFIED IDEOGRAPH
0x8CDE	0x4F0D	#CJK UNIFIED IDEOGRAPH
0x8CDF	0x5348	#CJK UNIFIED IDEOGRAPH
0x8CE0	0x5449	#CJK UNIFIED IDEOGRAPH
0x8CE1	0x543E	#CJK UNIFIED IDEOGRAPH
0x8CE2	0x5A2F	#CJK UNIFIED IDEOGRAPH
0x8CE3	0x5F8C	#CJK UNIFIED IDEOGRAPH
0x8CE4	0x5FA1	#CJK UNIFIED IDEOGRAPH
0x8CE5	0x609F	#CJK UNIFIED IDEOGRAPH
0x8CE6	0x68A7	#CJK UNIFIED IDEOGRAPH
0x8CE7	0x6A8E	#CJK UNIFIED IDEOGRAPH
0x8CE8	0x745A	#CJK UNIFIED IDEOGRAPH
0x8CE9	0x7881	#CJK UNIFIED IDEOGRAPH
0x8CEA	0x8A9E	#CJK UNIFIED IDEOGRAPH
0x8CEB	0x8AA4	#CJK UNIFIED IDEOGRAPH
0x8CEC	0x8B77	#CJK UNIFIED IDEOGRAPH
0x8CED	0x9190	#CJK UNIFIED IDEOGRAPH
0x8CEE	0x4E5E	#CJK UNIFIED IDEOGRAPH
0x8CEF	0x9BC9	#CJK UNIFIED IDEOGRAPH
0x8CF0	0x4EA4	#CJK UNIFIED IDEOGRAPH
0x8CF1	0x4F7C	#CJK UNIFIED IDEOGRAPH
0x8CF2	0x4FAF	#CJK UNIFIED IDEOGRAPH
0x8CF3	0x5019	#CJK UNIFIED IDEOGRAPH
0x8CF4	0x5016	#CJK UNIFIED IDEOGRAPH
0x8CF5	0x5149	#CJK UNIFIED IDEOGRAPH
0x8CF6	0x516C	#CJK UNIFIED IDEOGRAPH
0x8CF7	0x529F	#CJK UNIFIED IDEOGRAPH
0x8CF8	0x52B9	#CJK UNIFIED IDEOGRAPH
0x8CF9	0x52FE	#CJK UNIFIED IDEOGRAPH
0x8CFA	0x539A	#CJK UNIFIED IDEOGRAPH
0x8CFB	0x53E3	#CJK UNIFIED IDEOGRAPH
0x8CFC	0x5411	#CJK UNIFIED IDEOGRAPH
0x8D40	0x540E	#CJK UNIFIED IDEOGRAPH
0x8D41	0x5589	#CJK UNIFIED IDEOGRAPH
0x8D42	0x5751	#CJK UNIFIED IDEOGRAPH
0x8D43	0x57A2	#CJK UNIFIED IDEOGRAPH
0x8D44	0x597D	#CJK UNIFIED IDEOGRAPH
0x8D45	0x5B54	#CJK UNIFIED IDEOGRAPH
0x8D46	0x5B5D	#CJK UNIFIED IDEOGRAPH
0x8D47	0x5B8F	#CJK UNIFIED IDEOGRAPH
0x8D48	0x5DE5	#CJK UNIFIED IDEOGRAPH
0x8D49	0x5DE7	#CJK UNIFIED IDEOGRAPH
0x8D4A	0x5DF7	#CJK UNIFIED IDEOGRAPH
0x8D4B	0x5E78	#CJK UNIFIED IDEOGRAPH
0x8D4C	0x5E83	#CJK UNIFIED IDEOGRAPH
0x8D4D	0x5E9A	#CJK UNIFIED IDEOGRAPH
0x8D4E	0x5EB7	#CJK UNIFIED IDEOGRAPH
0x8D4F	0x5F18	#CJK UNIFIED IDEOGRAPH
0x8D50	0x6052	#CJK UNIFIED IDEOGRAPH
0x8D51	0x614C	#CJK UNIFIED IDEOGRAPH
0x8D52	0x6297	#CJK UNIFIED IDEOGRAPH
0x8D53	0x62D8	#CJK UNIFIED IDEOGRAPH
0x8D54	0x63A7	#CJK UNIFIED IDEOGRAPH
0x8D55	0x653B	#CJK UNIFIED IDEOGRAPH
0x8D56	0x6602	#CJK UNIFIED IDEOGRAPH
0x8D57	0x6643	#CJK UNIFIED IDEOGRAPH
0x8D58	0x66F4	#CJK UNIFIED IDEOGRAPH
0x8D59	0x676D	#CJK UNIFIED IDEOGRAPH
0x8D5A	0x6821	#CJK UNIFIED IDEOGRAPH
0x8D5B	0x6897	#CJK UNIFIED IDEOGRAPH
0x8D5C	0x69CB	#CJK UNIFIED IDEOGRAPH
0x8D5D	0x6C5F	#CJK UNIFIED IDEOGRAPH
0x8D5E	0x6D2A	#CJK UNIFIED IDEOGRAPH
0x8D5F	0x6D69	#CJK UNIFIED IDEOGRAPH
0x8D60	0x6E2F	#CJK UNIFIED IDEOGRAPH
0x8D61	0x6E9D	#CJK UNIFIED IDEOGRAPH
0x8D62	0x7532	#CJK UNIFIED IDEOGRAPH
0x8D63	0x7687	#CJK UNIFIED IDEOGRAPH
0x8D64	0x786C	#CJK UNIFIED IDEOGRAPH
0x8D65	0x7A3F	#CJK UNIFIED IDEOGRAPH
0x8D66	0x7CE0	#CJK UNIFIED IDEOGRAPH
0x8D67	0x7D05	#CJK UNIFIED IDEOGRAPH
0x8D68	0x7D18	#CJK UNIFIED IDEOGRAPH
0x8D69	0x7D5E	#CJK UNIFIED IDEOGRAPH
0x8D6A	0x7DB1	#CJK UNIFIED IDEOGRAPH
0x8D6B	0x8015	#CJK UNIFIED IDEOGRAPH
0x8D6C	0x8003	#CJK UNIFIED IDEOGRAPH
0x8D6D	0x80AF	#CJK UNIFIED IDEOGRAPH
0x8D6E	0x80B1	#CJK UNIFIED IDEOGRAPH
0x8D6F	0x8154	#CJK UNIFIED IDEOGRAPH
0x8D70	0x818F	#CJK UNIFIED IDEOGRAPH
0x8D71	0x822A	#CJK UNIFIED IDEOGRAPH
0x8D72	0x8352	#CJK UNIFIED IDEOGRAPH
0x8D73	0x884C	#CJK UNIFIED IDEOGRAPH
0x8D74	0x8861	#CJK UNIFIED IDEOGRAPH
0x8D75	0x8B1B	#CJK UNIFIED IDEOGRAPH
0x8D76	0x8CA2	#CJK UNIFIED IDEOGRAPH
0x8D77	0x8CFC	#CJK UNIFIED IDEOGRAPH
0x8D78	0x90CA	#CJK UNIFIED IDEOGRAPH
0x8D79	0x9175	#CJK UNIFIED IDEOGRAPH
0x8D7A	0x9271	#CJK UNIFIED IDEOGRAPH
0x8D7B	0x783F	#CJK UNIFIED IDEOGRAPH
0x8D7C	0x92FC	#CJK UNIFIED IDEOGRAPH
0x8D7D	0x95A4	#CJK UNIFIED IDEOGRAPH
0x8D7E	0x964D	#CJK UNIFIED IDEOGRAPH
0x8D80	0x9805	#CJK UNIFIED IDEOGRAPH
0x8D81	0x9999	#CJK UNIFIED IDEOGRAPH
0x8D82	0x9AD8	#CJK UNIFIED IDEOGRAPH
0x8D83	0x9D3B	#CJK UNIFIED IDEOGRAPH
0x8D84	0x525B	#CJK UNIFIED IDEOGRAPH
0x8D85	0x52AB	#CJK UNIFIED IDEOGRAPH
0x8D86	0x53F7	#CJK UNIFIED IDEOGRAPH
0x8D87	0x5408	#CJK UNIFIED IDEOGRAPH
0x8D88	0x58D5	#CJK UNIFIED IDEOGRAPH
0x8D89	0x62F7	#CJK UNIFIED IDEOGRAPH
0x8D8A	0x6FE0	#CJK UNIFIED IDEOGRAPH
0x8D8B	0x8C6A	#CJK UNIFIED IDEOGRAPH
0x8D8C	0x8F5F	#CJK UNIFIED IDEOGRAPH
0x8D8D	0x9EB9	#CJK UNIFIED IDEOGRAPH
0x8D8E	0x514B	#CJK UNIFIED IDEOGRAPH
0x8D8F	0x523B	#CJK UNIFIED IDEOGRAPH
0x8D90	0x544A	#CJK UNIFIED IDEOGRAPH
0x8D91	0x56FD	#CJK UNIFIED IDEOGRAPH
0x8D92	0x7A40	#CJK UNIFIED IDEOGRAPH
0x8D93	0x9177	#CJK UNIFIED IDEOGRAPH
0x8D94	0x9D60	#CJK UNIFIED IDEOGRAPH
0x8D95	0x9ED2	#CJK UNIFIED IDEOGRAPH
0x8D96	0x7344	#CJK UNIFIED IDEOGRAPH
0x8D97	0x6F09	#CJK UNIFIED IDEOGRAPH
0x8D98	0x8170	#CJK UNIFIED IDEOGRAPH
0x8D99	0x7511	#CJK UNIFIED IDEOGRAPH
0x8D9A	0x5FFD	#CJK UNIFIED IDEOGRAPH
0x8D9B	0x60DA	#CJK UNIFIED IDEOGRAPH
0x8D9C	0x9AA8	#CJK UNIFIED IDEOGRAPH
0x8D9D	0x72DB	#CJK UNIFIED IDEOGRAPH
0x8D9E	0x8FBC	#CJK UNIFIED IDEOGRAPH
0x8D9F	0x6B64	#CJK UNIFIED IDEOGRAPH
0x8DA0	0x9803	#CJK UNIFIED IDEOGRAPH
0x8DA1	0x4ECA	#CJK UNIFIED IDEOGRAPH
0x8DA2	0x56F0	#CJK UNIFIED IDEOGRAPH
0x8DA3	0x5764	#CJK UNIFIED IDEOGRAPH
0x8DA4	0x58BE	#CJK UNIFIED IDEOGRAPH
0x8DA5	0x5A5A	#CJK UNIFIED IDEOGRAPH
0x8DA6	0x6068	#CJK UNIFIED IDEOGRAPH
0x8DA7	0x61C7	#CJK UNIFIED IDEOGRAPH
0x8DA8	0x660F	#CJK UNIFIED IDEOGRAPH
0x8DA9	0x6606	#CJK UNIFIED IDEOGRAPH
0x8DAA	0x6839	#CJK UNIFIED IDEOGRAPH
0x8DAB	0x68B1	#CJK UNIFIED IDEOGRAPH
0x8DAC	0x6DF7	#CJK UNIFIED IDEOGRAPH
0x8DAD	0x75D5	#CJK UNIFIED IDEOGRAPH
0x8DAE	0x7D3A	#CJK UNIFIED IDEOGRAPH
0x8DAF	0x826E	#CJK UNIFIED IDEOGRAPH
0x8DB0	0x9B42	#CJK UNIFIED IDEOGRAPH
0x8DB1	0x4E9B	#CJK UNIFIED IDEOGRAPH
0x8DB2	0x4F50	#CJK UNIFIED IDEOGRAPH
0x8DB3	0x53C9	#CJK UNIFIED IDEOGRAPH
0x8DB4	0x5506	#CJK UNIFIED IDEOGRAPH
0x8DB5	0x5D6F	#CJK UNIFIED IDEOGRAPH
0x8DB6	0x5DE6	#CJK UNIFIED IDEOGRAPH
0x8DB7	0x5DEE	#CJK UNIFIED IDEOGRAPH
0x8DB8	0x67FB	#CJK UNIFIED IDEOGRAPH
0x8DB9	0x6C99	#CJK UNIFIED IDEOGRAPH
0x8DBA	0x7473	#CJK UNIFIED IDEOGRAPH
0x8DBB	0x7802	#CJK UNIFIED IDEOGRAPH
0x8DBC	0x8A50	#CJK UNIFIED IDEOGRAPH
0x8DBD	0x9396	#CJK UNIFIED IDEOGRAPH
0x8DBE	0x88DF	#CJK UNIFIED IDEOGRAPH
0x8DBF	0x5750	#CJK UNIFIED IDEOGRAPH
0x8DC0	0x5EA7	#CJK UNIFIED IDEOGRAPH
0x8DC1	0x632B	#CJK UNIFIED IDEOGRAPH
0x8DC2	0x50B5	#CJK UNIFIED IDEOGRAPH
0x8DC3	0x50AC	#CJK UNIFIED IDEOGRAPH
0x8DC4	0x518D	#CJK UNIFIED IDEOGRAPH
0x8DC5	0x6700	#CJK UNIFIED IDEOGRAPH
0x8DC6	0x54C9	#CJK UNIFIED IDEOGRAPH
0x8DC7	0x585E	#CJK UNIFIED IDEOGRAPH
0x8DC8	0x59BB	#CJK UNIFIED IDEOGRAPH
0x8DC9	0x5BB0	#CJK UNIFIED IDEOGRAPH
0x8DCA	0x5F69	#CJK UNIFIED IDEOGRAPH
0x8DCB	0x624D	#CJK UNIFIED IDEOGRAPH
0x8DCC	0x63A1	#CJK UNIFIED IDEOGRAPH
0x8DCD	0x683D	#CJK UNIFIED IDEOGRAPH
0x8DCE	0x6B73	#CJK UNIFIED IDEOGRAPH
0x8DCF	0x6E08	#CJK UNIFIED IDEOGRAPH
0x8DD0	0x707D	#CJK UNIFIED IDEOGRAPH
0x8DD1	0x91C7	#CJK UNIFIED IDEOGRAPH
0x8DD2	0x7280	#CJK UNIFIED IDEOGRAPH
0x8DD3	0x7815	#CJK UNIFIED IDEOGRAPH
0x8DD4	0x7826	#CJK UNIFIED IDEOGRAPH
0x8DD5	0x796D	#CJK UNIFIED IDEOGRAPH
0x8DD6	0x658E	#CJK UNIFIED IDEOGRAPH
0x8DD7	0x7D30	#CJK UNIFIED IDEOGRAPH
0x8DD8	0x83DC	#CJK UNIFIED IDEOGRAPH
0x8DD9	0x88C1	#CJK UNIFIED IDEOGRAPH
0x8DDA	0x8F09	#CJK UNIFIED IDEOGRAPH
0x8DDB	0x969B	#CJK UNIFIED IDEOGRAPH
0x8DDC	0x5264	#CJK UNIFIED IDEOGRAPH
0x8DDD	0x5728	#CJK UNIFIED IDEOGRAPH
0x8DDE	0x6750	#CJK UNIFIED IDEOGRAPH
0x8DDF	0x7F6A	#CJK UNIFIED IDEOGRAPH
0x8DE0	0x8CA1	#CJK UNIFIED IDEOGRAPH
0x8DE1	0x51B4	#CJK UNIFIED IDEOGRAPH
0x8DE2	0x5742	#CJK UNIFIED IDEOGRAPH
0x8DE3	0x962A	#CJK UNIFIED IDEOGRAPH
0x8DE4	0x583A	#CJK UNIFIED IDEOGRAPH
0x8DE5	0x698A	#CJK UNIFIED IDEOGRAPH
0x8DE6	0x80B4	#CJK UNIFIED IDEOGRAPH
0x8DE7	0x54B2	#CJK UNIFIED IDEOGRAPH
0x8DE8	0x5D0E	#CJK UNIFIED IDEOGRAPH
0x8DE9	0x57FC	#CJK UNIFIED IDEOGRAPH
0x8DEA	0x7895	#CJK UNIFIED IDEOGRAPH
0x8DEB	0x9DFA	#CJK UNIFIED IDEOGRAPH
0x8DEC	0x4F5C	#CJK UNIFIED IDEOGRAPH
0x8DED	0x524A	#CJK UNIFIED IDEOGRAPH
0x8DEE	0x548B	#CJK UNIFIED IDEOGRAPH
0x8DEF	0x643E	#CJK UNIFIED IDEOGRAPH
0x8DF0	0x6628	#CJK UNIFIED IDEOGRAPH
0x8DF1	0x6714	#CJK UNIFIED IDEOGRAPH
0x8DF2	0x67F5	#CJK UNIFIED IDEOGRAPH
0x8DF3	0x7A84	#CJK UNIFIED IDEOGRAPH
0x8DF4	0x7B56	#CJK UNIFIED IDEOGRAPH
0x8DF5	0x7D22	#CJK UNIFIED IDEOGRAPH
0x8DF6	0x932F	#CJK UNIFIED IDEOGRAPH
0x8DF7	0x685C	#CJK UNIFIED IDEOGRAPH
0x8DF8	0x9BAD	#CJK UNIFIED IDEOGRAPH
0x8DF9	0x7B39	#CJK UNIFIED IDEOGRAPH
0x8DFA	0x5319	#CJK UNIFIED IDEOGRAPH
0x8DFB	0x518A	#CJK UNIFIED IDEOGRAPH
0x8DFC	0x5237	#CJK UNIFIED IDEOGRAPH
0x8E40	0x5BDF	#CJK UNIFIED IDEOGRAPH
0x8E41	0x62F6	#CJK UNIFIED IDEOGRAPH
0x8E42	0x64AE	#CJK UNIFIED IDEOGRAPH
0x8E43	0x64E6	#CJK UNIFIED IDEOGRAPH
0x8E44	0x672D	#CJK UNIFIED IDEOGRAPH
0x8E45	0x6BBA	#CJK UNIFIED IDEOGRAPH
0x8E46	0x85A9	#CJK UNIFIED IDEOGRAPH
0x8E47	0x96D1	#CJK UNIFIED IDEOGRAPH
0x8E48	0x7690	#CJK UNIFIED IDEOGRAPH
0x8E49	0x9BD6	#CJK UNIFIED IDEOGRAPH
0x8E4A	0x634C	#CJK UNIFIED IDEOGRAPH
0x8E4B	0x9306	#CJK UNIFIED IDEOGRAPH
0x8E4C	0x9BAB	#CJK UNIFIED IDEOGRAPH
0x8E4D	0x76BF	#CJK UNIFIED IDEOGRAPH
0x8E4E	0x6652	#CJK UNIFIED IDEOGRAPH
0x8E4F	0x4E09	#CJK UNIFIED IDEOGRAPH
0x8E50	0x5098	#CJK UNIFIED IDEOGRAPH
0x8E51	0x53C2	#CJK UNIFIED IDEOGRAPH
0x8E52	0x5C71	#CJK UNIFIED IDEOGRAPH
0x8E53	0x60E8	#CJK UNIFIED IDEOGRAPH
0x8E54	0x6492	#CJK UNIFIED IDEOGRAPH
0x8E55	0x6563	#CJK UNIFIED IDEOGRAPH
0x8E56	0x685F	#CJK UNIFIED IDEOGRAPH
0x8E57	0x71E6	#CJK UNIFIED IDEOGRAPH
0x8E58	0x73CA	#CJK UNIFIED IDEOGRAPH
0x8E59	0x7523	#CJK UNIFIED IDEOGRAPH
0x8E5A	0x7B97	#CJK UNIFIED IDEOGRAPH
0x8E5B	0x7E82	#CJK UNIFIED IDEOGRAPH
0x8E5C	0x8695	#CJK UNIFIED IDEOGRAPH
0x8E5D	0x8B83	#CJK UNIFIED IDEOGRAPH
0x8E5E	0x8CDB	#CJK UNIFIED IDEOGRAPH
0x8E5F	0x9178	#CJK UNIFIED IDEOGRAPH
0x8E60	0x9910	#CJK UNIFIED IDEOGRAPH
0x8E61	0x65AC	#CJK UNIFIED IDEOGRAPH
0x8E62	0x66AB	#CJK UNIFIED IDEOGRAPH
0x8E63	0x6B8B	#CJK UNIFIED IDEOGRAPH
0x8E64	0x4ED5	#CJK UNIFIED IDEOGRAPH
0x8E65	0x4ED4	#CJK UNIFIED IDEOGRAPH
0x8E66	0x4F3A	#CJK UNIFIED IDEOGRAPH
0x8E67	0x4F7F	#CJK UNIFIED IDEOGRAPH
0x8E68	0x523A	#CJK UNIFIED IDEOGRAPH
0x8E69	0x53F8	#CJK UNIFIED IDEOGRAPH
0x8E6A	0x53F2	#CJK UNIFIED IDEOGRAPH
0x8E6B	0x55E3	#CJK UNIFIED IDEOGRAPH
0x8E6C	0x56DB	#CJK UNIFIED IDEOGRAPH
0x8E6D	0x58EB	#CJK UNIFIED IDEOGRAPH
0x8E6E	0x59CB	#CJK UNIFIED IDEOGRAPH
0x8E6F	0x59C9	#CJK UNIFIED IDEOGRAPH
0x8E70	0x59FF	#CJK UNIFIED IDEOGRAPH
0x8E71	0x5B50	#CJK UNIFIED IDEOGRAPH
0x8E72	0x5C4D	#CJK UNIFIED IDEOGRAPH
0x8E73	0x5E02	#CJK UNIFIED IDEOGRAPH
0x8E74	0x5E2B	#CJK UNIFIED IDEOGRAPH
0x8E75	0x5FD7	#CJK UNIFIED IDEOGRAPH
0x8E76	0x601D	#CJK UNIFIED IDEOGRAPH
0x8E77	0x6307	#CJK UNIFIED IDEOGRAPH
0x8E78	0x652F	#CJK UNIFIED IDEOGRAPH
0x8E79	0x5B5C	#CJK UNIFIED IDEOGRAPH
0x8E7A	0x65AF	#CJK UNIFIED IDEOGRAPH
0x8E7B	0x65BD	#CJK UNIFIED IDEOGRAPH
0x8E7C	0x65E8	#CJK UNIFIED IDEOGRAPH
0x8E7D	0x679D	#CJK UNIFIED IDEOGRAPH
0x8E7E	0x6B62	#CJK UNIFIED IDEOGRAPH
0x8E80	0x6B7B	#CJK UNIFIED IDEOGRAPH
0x8E81	0x6C0F	#CJK UNIFIED IDEOGRAPH
0x8E82	0x7345	#CJK UNIFIED IDEOGRAPH
0x8E83	0x7949	#CJK UNIFIED IDEOGRAPH
0x8E84	0x79C1	#CJK UNIFIED IDEOGRAPH
0x8E85	0x7CF8	#CJK UNIFIED IDEOGRAPH
0x8E86	0x7D19	#CJK UNIFIED IDEOGRAPH
0x8E87	0x7D2B	#CJK UNIFIED IDEOGRAPH
0x8E88	0x80A2	#CJK UNIFIED IDEOGRAPH
0x8E89	0x8102	#CJK UNIFIED IDEOGRAPH
0x8E8A	0x81F3	#CJK UNIFIED IDEOGRAPH
0x8E8B	0x8996	#CJK UNIFIED IDEOGRAPH
0x8E8C	0x8A5E	#CJK UNIFIED IDEOGRAPH
0x8E8D	0x8A69	#CJK UNIFIED IDEOGRAPH
0x8E8E	0x8A66	#CJK UNIFIED IDEOGRAPH
0x8E8F	0x8A8C	#CJK UNIFIED IDEOGRAPH
0x8E90	0x8AEE	#CJK UNIFIED IDEOGRAPH
0x8E91	0x8CC7	#CJK UNIFIED IDEOGRAPH
0x8E92	0x8CDC	#CJK UNIFIED IDEOGRAPH
0x8E93	0x96CC	#CJK UNIFIED IDEOGRAPH
0x8E94	0x98FC	#CJK UNIFIED IDEOGRAPH
0x8E95	0x6B6F	#CJK UNIFIED IDEOGRAPH
0x8E96	0x4E8B	#CJK UNIFIED IDEOGRAPH
0x8E97	0x4F3C	#CJK UNIFIED IDEOGRAPH
0x8E98	0x4F8D	#CJK UNIFIED IDEOGRAPH
0x8E99	0x5150	#CJK UNIFIED IDEOGRAPH
0x8E9A	0x5B57	#CJK UNIFIED IDEOGRAPH
0x8E9B	0x5BFA	#CJK UNIFIED IDEOGRAPH
0x8E9C	0x6148	#CJK UNIFIED IDEOGRAPH
0x8E9D	0x6301	#CJK UNIFIED IDEOGRAPH
0x8E9E	0x6642	#CJK UNIFIED IDEOGRAPH
0x8E9F	0x6B21	#CJK UNIFIED IDEOGRAPH
0x8EA0	0x6ECB	#CJK UNIFIED IDEOGRAPH
0x8EA1	0x6CBB	#CJK UNIFIED IDEOGRAPH
0x8EA2	0x723E	#CJK UNIFIED IDEOGRAPH
0x8EA3	0x74BD	#CJK UNIFIED IDEOGRAPH
0x8EA4	0x75D4	#CJK UNIFIED IDEOGRAPH
0x8EA5	0x78C1	#CJK UNIFIED IDEOGRAPH
0x8EA6	0x793A	#CJK UNIFIED IDEOGRAPH
0x8EA7	0x800C	#CJK UNIFIED IDEOGRAPH
0x8EA8	0x8033	#CJK UNIFIED IDEOGRAPH
0x8EA9	0x81EA	#CJK UNIFIED IDEOGRAPH
0x8EAA	0x8494	#CJK UNIFIED IDEOGRAPH
0x8EAB	0x8F9E	#CJK UNIFIED IDEOGRAPH
0x8EAC	0x6C50	#CJK UNIFIED IDEOGRAPH
0x8EAD	0x9E7F	#CJK UNIFIED IDEOGRAPH
0x8EAE	0x5F0F	#CJK UNIFIED IDEOGRAPH
0x8EAF	0x8B58	#CJK UNIFIED IDEOGRAPH
0x8EB0	0x9D2B	#CJK UNIFIED IDEOGRAPH
0x8EB1	0x7AFA	#CJK UNIFIED IDEOGRAPH
0x8EB2	0x8EF8	#CJK UNIFIED IDEOGRAPH
0x8EB3	0x5B8D	#CJK UNIFIED IDEOGRAPH
0x8EB4	0x96EB	#CJK UNIFIED IDEOGRAPH
0x8EB5	0x4E03	#CJK UNIFIED IDEOGRAPH
0x8EB6	0x53F1	#CJK UNIFIED IDEOGRAPH
0x8EB7	0x57F7	#CJK UNIFIED IDEOGRAPH
0x8EB8	0x5931	#CJK UNIFIED IDEOGRAPH
0x8EB9	0x5AC9	#CJK UNIFIED IDEOGRAPH
0x8EBA	0x5BA4	#CJK UNIFIED IDEOGRAPH
0x8EBB	0x6089	#CJK UNIFIED IDEOGRAPH
0x8EBC	0x6E7F	#CJK UNIFIED IDEOGRAPH
0x8EBD	0x6F06	#CJK UNIFIED IDEOGRAPH
0x8EBE	0x75BE	#CJK UNIFIED IDEOGRAPH
0x8EBF	0x8CEA	#CJK UNIFIED IDEOGRAPH
0x8EC0	0x5B9F	#CJK UNIFIED IDEOGRAPH
0x8EC1	0x8500	#CJK UNIFIED IDEOGRAPH
0x8EC2	0x7BE0	#CJK UNIFIED IDEOGRAPH
0x8EC3	0x5072	#CJK UNIFIED IDEOGRAPH
0x8EC4	0x67F4	#CJK UNIFIED IDEOGRAPH
0x8EC5	0x829D	#CJK UNIFIED IDEOGRAPH
0x8EC6	0x5C61	#CJK UNIFIED IDEOGRAPH
0x8EC7	0x854A	#CJK UNIFIED IDEOGRAPH
0x8EC8	0x7E1E	#CJK UNIFIED IDEOGRAPH
0x8EC9	0x820E	#CJK UNIFIED IDEOGRAPH
0x8ECA	0x5199	#CJK UNIFIED IDEOGRAPH
0x8ECB	0x5C04	#CJK UNIFIED IDEOGRAPH
0x8ECC	0x6368	#CJK UNIFIED IDEOGRAPH
0x8ECD	0x8D66	#CJK UNIFIED IDEOGRAPH
0x8ECE	0x659C	#CJK UNIFIED IDEOGRAPH
0x8ECF	0x716E	#CJK UNIFIED IDEOGRAPH
0x8ED0	0x793E	#CJK UNIFIED IDEOGRAPH
0x8ED1	0x7D17	#CJK UNIFIED IDEOGRAPH
0x8ED2	0x8005	#CJK UNIFIED IDEOGRAPH
0x8ED3	0x8B1D	#CJK UNIFIED IDEOGRAPH
0x8ED4	0x8ECA	#CJK UNIFIED IDEOGRAPH
0x8ED5	0x906E	#CJK UNIFIED IDEOGRAPH
0x8ED6	0x86C7	#CJK UNIFIED IDEOGRAPH
0x8ED7	0x90AA	#CJK UNIFIED IDEOGRAPH
0x8ED8	0x501F	#CJK UNIFIED IDEOGRAPH
0x8ED9	0x52FA	#CJK UNIFIED IDEOGRAPH
0x8EDA	0x5C3A	#CJK UNIFIED IDEOGRAPH
0x8EDB	0x6753	#CJK UNIFIED IDEOGRAPH
0x8EDC	0x707C	#CJK UNIFIED IDEOGRAPH
0x8EDD	0x7235	#CJK UNIFIED IDEOGRAPH
0x8EDE	0x914C	#CJK UNIFIED IDEOGRAPH
0x8EDF	0x91C8	#CJK UNIFIED IDEOGRAPH
0x8EE0	0x932B	#CJK UNIFIED IDEOGRAPH
0x8EE1	0x82E5	#CJK UNIFIED IDEOGRAPH
0x8EE2	0x5BC2	#CJK UNIFIED IDEOGRAPH
0x8EE3	0x5F31	#CJK UNIFIED IDEOGRAPH
0x8EE4	0x60F9	#CJK UNIFIED IDEOGRAPH
0x8EE5	0x4E3B	#CJK UNIFIED IDEOGRAPH
0x8EE6	0x53D6	#CJK UNIFIED IDEOGRAPH
0x8EE7	0x5B88	#CJK UNIFIED IDEOGRAPH
0x8EE8	0x624B	#CJK UNIFIED IDEOGRAPH
0x8EE9	0x6731	#CJK UNIFIED IDEOGRAPH
0x8EEA	0x6B8A	#CJK UNIFIED IDEOGRAPH
0x8EEB	0x72E9	#CJK UNIFIED IDEOGRAPH
0x8EEC	0x73E0	#CJK UNIFIED IDEOGRAPH
0x8EED	0x7A2E	#CJK UNIFIED IDEOGRAPH
0x8EEE	0x816B	#CJK UNIFIED IDEOGRAPH
0x8EEF	0x8DA3	#CJK UNIFIED IDEOGRAPH
0x8EF0	0x9152	#CJK UNIFIED IDEOGRAPH
0x8EF1	0x9996	#CJK UNIFIED IDEOGRAPH
0x8EF2	0x5112	#CJK UNIFIED IDEOGRAPH
0x8EF3	0x53D7	#CJK UNIFIED IDEOGRAPH
0x8EF4	0x546A	#CJK UNIFIED IDEOGRAPH
0x8EF5	0x5BFF	#CJK UNIFIED IDEOGRAPH
0x8EF6	0x6388	#CJK UNIFIED IDEOGRAPH
0x8EF7	0x6A39	#CJK UNIFIED IDEOGRAPH
0x8EF8	0x7DAC	#CJK UNIFIED IDEOGRAPH
0x8EF9	0x9700	#CJK UNIFIED IDEOGRAPH
0x8EFA	0x56DA	#CJK UNIFIED IDEOGRAPH
0x8EFB	0x53CE	#CJK UNIFIED IDEOGRAPH
0x8EFC	0x5468	#CJK UNIFIED IDEOGRAPH
0x8F40	0x5B97	#CJK UNIFIED IDEOGRAPH
0x8F41	0x5C31	#CJK UNIFIED IDEOGRAPH
0x8F42	0x5DDE	#CJK UNIFIED IDEOGRAPH
0x8F43	0x4FEE	#CJK UNIFIED IDEOGRAPH
0x8F44	0x6101	#CJK UNIFIED IDEOGRAPH
0x8F45	0x62FE	#CJK UNIFIED IDEOGRAPH
0x8F46	0x6D32	#CJK UNIFIED IDEOGRAPH
0x8F47	0x79C0	#CJK UNIFIED IDEOGRAPH
0x8F48	0x79CB	#CJK UNIFIED IDEOGRAPH
0x8F49	0x7D42	#CJK UNIFIED IDEOGRAPH
0x8F4A	0x7E4D	#CJK UNIFIED IDEOGRAPH
0x8F4B	0x7FD2	#CJK UNIFIED IDEOGRAPH
0x8F4C	0x81ED	#CJK UNIFIED IDEOGRAPH
0x8F4D	0x821F	#CJK UNIFIED IDEOGRAPH
0x8F4E	0x8490	#CJK UNIFIED IDEOGRAPH
0x8F4F	0x8846	#CJK UNIFIED IDEOGRAPH
0x8F50	0x8972	#CJK UNIFIED IDEOGRAPH
0x8F51	0x8B90	#CJK UNIFIED IDEOGRAPH
0x8F52	0x8E74	#CJK UNIFIED IDEOGRAPH
0x8F53	0x8F2F	#CJK UNIFIED IDEOGRAPH
0x8F54	0x9031	#CJK UNIFIED IDEOGRAPH
0x8F55	0x914B	#CJK UNIFIED IDEOGRAPH
0x8F56	0x916C	#CJK UNIFIED IDEOGRAPH
0x8F57	0x96C6	#CJK UNIFIED IDEOGRAPH
0x8F58	0x919C	#CJK UNIFIED IDEOGRAPH
0x8F59	0x4EC0	#CJK UNIFIED IDEOGRAPH
0x8F5A	0x4F4F	#CJK UNIFIED IDEOGRAPH
0x8F5B	0x5145	#CJK UNIFIED IDEOGRAPH
0x8F5C	0x5341	#CJK UNIFIED IDEOGRAPH
0x8F5D	0x5F93	#CJK UNIFIED IDEOGRAPH
0x8F5E	0x620E	#CJK UNIFIED IDEOGRAPH
0x8F5F	0x67D4	#CJK UNIFIED IDEOGRAPH
0x8F60	0x6C41	#CJK UNIFIED IDEOGRAPH
0x8F61	0x6E0B	#CJK UNIFIED IDEOGRAPH
0x8F62	0x7363	#CJK UNIFIED IDEOGRAPH
0x8F63	0x7E26	#CJK UNIFIED IDEOGRAPH
0x8F64	0x91CD	#CJK UNIFIED IDEOGRAPH
0x8F65	0x9283	#CJK UNIFIED IDEOGRAPH
0x8F66	0x53D4	#CJK UNIFIED IDEOGRAPH
0x8F67	0x5919	#CJK UNIFIED IDEOGRAPH
0x8F68	0x5BBF	#CJK UNIFIED IDEOGRAPH
0x8F69	0x6DD1	#CJK UNIFIED IDEOGRAPH
0x8F6A	0x795D	#CJK UNIFIED IDEOGRAPH
0x8F6B	0x7E2E	#CJK UNIFIED IDEOGRAPH
0x8F6C	0x7C9B	#CJK UNIFIED IDEOGRAPH
0x8F6D	0x587E	#CJK UNIFIED IDEOGRAPH
0x8F6E	0x719F	#CJK UNIFIED IDEOGRAPH
0x8F6F	0x51FA	#CJK UNIFIED IDEOGRAPH
0x8F70	0x8853	#CJK UNIFIED IDEOGRAPH
0x8F71	0x8FF0	#CJK UNIFIED IDEOGRAPH
0x8F72	0x4FCA	#CJK UNIFIED IDEOGRAPH
0x8F73	0x5CFB	#CJK UNIFIED IDEOGRAPH
0x8F74	0x6625	#CJK UNIFIED IDEOGRAPH
0x8F75	0x77AC	#CJK UNIFIED IDEOGRAPH
0x8F76	0x7AE3	#CJK UNIFIED IDEOGRAPH
0x8F77	0x821C	#CJK UNIFIED IDEOGRAPH
0x8F78	0x99FF	#CJK UNIFIED IDEOGRAPH
0x8F79	0x51C6	#CJK UNIFIED IDEOGRAPH
0x8F7A	0x5FAA	#CJK UNIFIED IDEOGRAPH
0x8F7B	0x65EC	#CJK UNIFIED IDEOGRAPH
0x8F7C	0x696F	#CJK UNIFIED IDEOGRAPH
0x8F7D	0x6B89	#CJK UNIFIED IDEOGRAPH
0x8F7E	0x6DF3	#CJK UNIFIED IDEOGRAPH
0x8F80	0x6E96	#CJK UNIFIED IDEOGRAPH
0x8F81	0x6F64	#CJK UNIFIED IDEOGRAPH
0x8F82	0x76FE	#CJK UNIFIED IDEOGRAPH
0x8F83	0x7D14	#CJK UNIFIED IDEOGRAPH
0x8F84	0x5DE1	#CJK UNIFIED IDEOGRAPH
0x8F85	0x9075	#CJK UNIFIED IDEOGRAPH
0x8F86	0x9187	#CJK UNIFIED IDEOGRAPH
0x8F87	0x9806	#CJK UNIFIED IDEOGRAPH
0x8F88	0x51E6	#CJK UNIFIED IDEOGRAPH
0x8F89	0x521D	#CJK UNIFIED IDEOGRAPH
0x8F8A	0x6240	#CJK UNIFIED IDEOGRAPH
0x8F8B	0x6691	#CJK UNIFIED IDEOGRAPH
0x8F8C	0x66D9	#CJK UNIFIED IDEOGRAPH
0x8F8D	0x6E1A	#CJK UNIFIED IDEOGRAPH
0x8F8E	0x5EB6	#CJK UNIFIED IDEOGRAPH
0x8F8F	0x7DD2	#CJK UNIFIED IDEOGRAPH
0x8F90	0x7F72	#CJK UNIFIED IDEOGRAPH
0x8F91	0x66F8	#CJK UNIFIED IDEOGRAPH
0x8F92	0x85AF	#CJK UNIFIED IDEOGRAPH
0x8F93	0x85F7	#CJK UNIFIED IDEOGRAPH
0x8F94	0x8AF8	#CJK UNIFIED IDEOGRAPH
0x8F95	0x52A9	#CJK UNIFIED IDEOGRAPH
0x8F96	0x53D9	#CJK UNIFIED IDEOGRAPH
0x8F97	0x5973	#CJK UNIFIED IDEOGRAPH
0x8F98	0x5E8F	#CJK UNIFIED IDEOGRAPH
0x8F99	0x5F90	#CJK UNIFIED IDEOGRAPH
0x8F9A	0x6055	#CJK UNIFIED IDEOGRAPH
0x8F9B	0x92E4	#CJK UNIFIED IDEOGRAPH
0x8F9C	0x9664	#CJK UNIFIED IDEOGRAPH
0x8F9D	0x50B7	#CJK UNIFIED IDEOGRAPH
0x8F9E	0x511F	#CJK UNIFIED IDEOGRAPH
0x8F9F	0x52DD	#CJK UNIFIED IDEOGRAPH
0x8FA0	0x5320	#CJK UNIFIED IDEOGRAPH
0x8FA1	0x5347	#CJK UNIFIED IDEOGRAPH
0x8FA2	0x53EC	#CJK UNIFIED IDEOGRAPH
0x8FA3	0x54E8	#CJK UNIFIED IDEOGRAPH
0x8FA4	0x5546	#CJK UNIFIED IDEOGRAPH
0x8FA5	0x5531	#CJK UNIFIED IDEOGRAPH
0x8FA6	0x5617	#CJK UNIFIED IDEOGRAPH
0x8FA7	0x5968	#CJK UNIFIED IDEOGRAPH
0x8FA8	0x59BE	#CJK UNIFIED IDEOGRAPH
0x8FA9	0x5A3C	#CJK UNIFIED IDEOGRAPH
0x8FAA	0x5BB5	#CJK UNIFIED IDEOGRAPH
0x8FAB	0x5C06	#CJK UNIFIED IDEOGRAPH
0x8FAC	0x5C0F	#CJK UNIFIED IDEOGRAPH
0x8FAD	0x5C11	#CJK UNIFIED IDEOGRAPH
0x8FAE	0x5C1A	#CJK UNIFIED IDEOGRAPH
0x8FAF	0x5E84	#CJK UNIFIED IDEOGRAPH
0x8FB0	0x5E8A	#CJK UNIFIED IDEOGRAPH
0x8FB1	0x5EE0	#CJK UNIFIED IDEOGRAPH
0x8FB2	0x5F70	#CJK UNIFIED IDEOGRAPH
0x8FB3	0x627F	#CJK UNIFIED IDEOGRAPH
0x8FB4	0x6284	#CJK UNIFIED IDEOGRAPH
0x8FB5	0x62DB	#CJK UNIFIED IDEOGRAPH
0x8FB6	0x638C	#CJK UNIFIED IDEOGRAPH
0x8FB7	0x6377	#CJK UNIFIED IDEOGRAPH
0x8FB8	0x6607	#CJK UNIFIED IDEOGRAPH
0x8FB9	0x660C	#CJK UNIFIED IDEOGRAPH
0x8FBA	0x662D	#CJK UNIFIED IDEOGRAPH
0x8FBB	0x6676	#CJK UNIFIED IDEOGRAPH
0x8FBC	0x677E	#CJK UNIFIED IDEOGRAPH
0x8FBD	0x68A2	#CJK UNIFIED IDEOGRAPH
0x8FBE	0x6A1F	#CJK UNIFIED IDEOGRAPH
0x8FBF	0x6A35	#CJK UNIFIED IDEOGRAPH
0x8FC0	0x6CBC	#CJK UNIFIED IDEOGRAPH
0x8FC1	0x6D88	#CJK UNIFIED IDEOGRAPH
0x8FC2	0x6E09	#CJK UNIFIED IDEOGRAPH
0x8FC3	0x6E58	#CJK UNIFIED IDEOGRAPH
0x8FC4	0x713C	#CJK UNIFIED IDEOGRAPH
0x8FC5	0x7126	#CJK UNIFIED IDEOGRAPH
0x8FC6	0x7167	#CJK UNIFIED IDEOGRAPH
0x8FC7	0x75C7	#CJK UNIFIED IDEOGRAPH
0x8FC8	0x7701	#CJK UNIFIED IDEOGRAPH
0x8FC9	0x785D	#CJK UNIFIED IDEOGRAPH
0x8FCA	0x7901	#CJK UNIFIED IDEOGRAPH
0x8FCB	0x7965	#CJK UNIFIED IDEOGRAPH
0x8FCC	0x79F0	#CJK UNIFIED IDEOGRAPH
0x8FCD	0x7AE0	#CJK UNIFIED IDEOGRAPH
0x8FCE	0x7B11	#CJK UNIFIED IDEOGRAPH
0x8FCF	0x7CA7	#CJK UNIFIED IDEOGRAPH
0x8FD0	0x7D39	#CJK UNIFIED IDEOGRAPH
0x8FD1	0x8096	#CJK UNIFIED IDEOGRAPH
0x8FD2	0x83D6	#CJK UNIFIED IDEOGRAPH
0x8FD3	0x848B	#CJK UNIFIED IDEOGRAPH
0x8FD4	0x8549	#CJK UNIFIED IDEOGRAPH
0x8FD5	0x885D	#CJK UNIFIED IDEOGRAPH
0x8FD6	0x88F3	#CJK UNIFIED IDEOGRAPH
0x8FD7	0x8A1F	#CJK UNIFIED IDEOGRAPH
0x8FD8	0x8A3C	#CJK UNIFIED IDEOGRAPH
0x8FD9	0x8A54	#CJK UNIFIED IDEOGRAPH
0x8FDA	0x8A73	#CJK UNIFIED IDEOGRAPH
0x8FDB	0x8C61	#CJK UNIFIED IDEOGRAPH
0x8FDC	0x8CDE	#CJK UNIFIED IDEOGRAPH
0x8FDD	0x91A4	#CJK UNIFIED IDEOGRAPH
0x8FDE	0x9266	#CJK UNIFIED IDEOGRAPH
0x8FDF	0x937E	#CJK UNIFIED IDEOGRAPH
0x8FE0	0x9418	#CJK UNIFIED IDEOGRAPH
0x8FE1	0x969C	#CJK UNIFIED IDEOGRAPH
0x8FE2	0x9798	#CJK UNIFIED IDEOGRAPH
0x8FE3	0x4E0A	#CJK UNIFIED IDEOGRAPH
0x8FE4	0x4E08	#CJK UNIFIED IDEOGRAPH
0x8FE5	0x4E1E	#CJK UNIFIED IDEOGRAPH
0x8FE6	0x4E57	#CJK UNIFIED IDEOGRAPH
0x8FE7	0x5197	#CJK UNIFIED IDEOGRAPH
0x8FE8	0x5270	#CJK UNIFIED IDEOGRAPH
0x8FE9	0x57CE	#CJK UNIFIED IDEOGRAPH
0x8FEA	0x5834	#CJK UNIFIED IDEOGRAPH
0x8FEB	0x58CC	#CJK UNIFIED IDEOGRAPH
0x8FEC	0x5B22	#CJK UNIFIED IDEOGRAPH
0x8FED	0x5E38	#CJK UNIFIED IDEOGRAPH
0x8FEE	0x60C5	#CJK UNIFIED IDEOGRAPH
0x8FEF	0x64FE	#CJK UNIFIED IDEOGRAPH
0x8FF0	0x6761	#CJK UNIFIED IDEOGRAPH
0x8FF1	0x6756	#CJK UNIFIED IDEOGRAPH
0x8FF2	0x6D44	#CJK UNIFIED IDEOGRAPH
0x8FF3	0x72B6	#CJK UNIFIED IDEOGRAPH
0x8FF4	0x7573	#CJK UNIFIED IDEOGRAPH
0x8FF5	0x7A63	#CJK UNIFIED IDEOGRAPH
0x8FF6	0x84B8	#CJK UNIFIED IDEOGRAPH
0x8FF7	0x8B72	#CJK UNIFIED IDEOGRAPH
0x8FF8	0x91B8	#CJK UNIFIED IDEOGRAPH
0x8FF9	0x9320	#CJK UNIFIED IDEOGRAPH
0x8FFA	0x5631	#CJK UNIFIED IDEOGRAPH
0x8FFB	0x57F4	#CJK UNIFIED IDEOGRAPH
0x8FFC	0x98FE	#CJK UNIFIED IDEOGRAPH
0x9040	0x62ED	#CJK UNIFIED IDEOGRAPH
0x9041	0x690D	#CJK UNIFIED IDEOGRAPH
0x9042	0x6B96	#CJK UNIFIED IDEOGRAPH
0x9043	0x71ED	#CJK UNIFIED IDEOGRAPH
0x9044	0x7E54	#CJK UNIFIED IDEOGRAPH
0x9045	0x8077	#CJK UNIFIED IDEOGRAPH
0x9046	0x8272	#CJK UNIFIED IDEOGRAPH
0x9047	0x89E6	#CJK UNIFIED IDEOGRAPH
0x9048	0x98DF	#CJK UNIFIED IDEOGRAPH
0x9049	0x8755	#CJK UNIFIED IDEOGRAPH
0x904A	0x8FB1	#CJK UNIFIED IDEOGRAPH
0x904B	0x5C3B	#CJK UNIFIED IDEOGRAPH
0x904C	0x4F38	#CJK UNIFIED IDEOGRAPH
0x904D	0x4FE1	#CJK UNIFIED IDEOGRAPH
0x904E	0x4FB5	#CJK UNIFIED IDEOGRAPH
0x904F	0x5507	#CJK UNIFIED IDEOGRAPH
0x9050	0x5A20	#CJK UNIFIED IDEOGRAPH
0x9051	0x5BDD	#CJK UNIFIED IDEOGRAPH
0x9052	0x5BE9	#CJK UNIFIED IDEOGRAPH
0x9053	0x5FC3	#CJK UNIFIED IDEOGRAPH
0x9054	0x614E	#CJK UNIFIED IDEOGRAPH
0x9055	0x632F	#CJK UNIFIED IDEOGRAPH
0x9056	0x65B0	#CJK UNIFIED IDEOGRAPH
0x9057	0x664B	#CJK UNIFIED IDEOGRAPH
0x9058	0x68EE	#CJK UNIFIED IDEOGRAPH
0x9059	0x699B	#CJK UNIFIED IDEOGRAPH
0x905A	0x6D78	#CJK UNIFIED IDEOGRAPH
0x905B	0x6DF1	#CJK UNIFIED IDEOGRAPH
0x905C	0x7533	#CJK UNIFIED IDEOGRAPH
0x905D	0x75B9	#CJK UNIFIED IDEOGRAPH
0x905E	0x771F	#CJK UNIFIED IDEOGRAPH
0x905F	0x795E	#CJK UNIFIED IDEOGRAPH
0x9060	0x79E6	#CJK UNIFIED IDEOGRAPH
0x9061	0x7D33	#CJK UNIFIED IDEOGRAPH
0x9062	0x81E3	#CJK UNIFIED IDEOGRAPH
0x9063	0x82AF	#CJK UNIFIED IDEOGRAPH
0x9064	0x85AA	#CJK UNIFIED IDEOGRAPH
0x9065	0x89AA	#CJK UNIFIED IDEOGRAPH
0x9066	0x8A3A	#CJK UNIFIED IDEOGRAPH
0x9067	0x8EAB	#CJK UNIFIED IDEOGRAPH
0x9068	0x8F9B	#CJK UNIFIED IDEOGRAPH
0x9069	0x9032	#CJK UNIFIED IDEOGRAPH
0x906A	0x91DD	#CJK UNIFIED IDEOGRAPH
0x906B	0x9707	#CJK UNIFIED IDEOGRAPH
0x906C	0x4EBA	#CJK UNIFIED IDEOGRAPH
0x906D	0x4EC1	#CJK UNIFIED IDEOGRAPH
0x906E	0x5203	#CJK UNIFIED IDEOGRAPH
0x906F	0x5875	#CJK UNIFIED IDEOGRAPH
0x9070	0x58EC	#CJK UNIFIED IDEOGRAPH
0x9071	0x5C0B	#CJK UNIFIED IDEOGRAPH
0x9072	0x751A	#CJK UNIFIED IDEOGRAPH
0x9073	0x5C3D	#CJK UNIFIED IDEOGRAPH
0x9074	0x814E	#CJK UNIFIED IDEOGRAPH
0x9075	0x8A0A	#CJK UNIFIED IDEOGRAPH
0x9076	0x8FC5	#CJK UNIFIED IDEOGRAPH
0x9077	0x9663	#CJK UNIFIED IDEOGRAPH
0x9078	0x976D	#CJK UNIFIED IDEOGRAPH
0x9079	0x7B25	#CJK UNIFIED IDEOGRAPH
0x907A	0x8ACF	#CJK UNIFIED IDEOGRAPH
0x907B	0x9808	#CJK UNIFIED IDEOGRAPH
0x907C	0x9162	#CJK UNIFIED IDEOGRAPH
0x907D	0x56F3	#CJK UNIFIED IDEOGRAPH
0x907E	0x53A8	#CJK UNIFIED IDEOGRAPH
0x9080	0x9017	#CJK UNIFIED IDEOGRAPH
0x9081	0x5439	#CJK UNIFIED IDEOGRAPH
0x9082	0x5782	#CJK UNIFIED IDEOGRAPH
0x9083	0x5E25	#CJK UNIFIED IDEOGRAPH
0x9084	0x63A8	#CJK UNIFIED IDEOGRAPH
0x9085	0x6C34	#CJK UNIFIED IDEOGRAPH
0x9086	0x708A	#CJK UNIFIED IDEOGRAPH
0x9087	0x7761	#CJK UNIFIED IDEOGRAPH
0x9088	0x7C8B	#CJK UNIFIED IDEOGRAPH
0x9089	0x7FE0	#CJK UNIFIED IDEOGRAPH
0x908A	0x8870	#CJK UNIFIED IDEOGRAPH
0x908B	0x9042	#CJK UNIFIED IDEOGRAPH
0x908C	0x9154	#CJK UNIFIED IDEOGRAPH
0x908D	0x9310	#CJK UNIFIED IDEOGRAPH
0x908E	0x9318	#CJK UNIFIED IDEOGRAPH
0x908F	0x968F	#CJK UNIFIED IDEOGRAPH
0x9090	0x745E	#CJK UNIFIED IDEOGRAPH
0x9091	0x9AC4	#CJK UNIFIED IDEOGRAPH
0x9092	0x5D07	#CJK UNIFIED IDEOGRAPH
0x9093	0x5D69	#CJK UNIFIED IDEOGRAPH
0x9094	0x6570	#CJK UNIFIED IDEOGRAPH
0x9095	0x67A2	#CJK UNIFIED IDEOGRAPH
0x9096	0x8DA8	#CJK UNIFIED IDEOGRAPH
0x9097	0x96DB	#CJK UNIFIED IDEOGRAPH
0x9098	0x636E	#CJK UNIFIED IDEOGRAPH
0x9099	0x6749	#CJK UNIFIED IDEOGRAPH
0x909A	0x6919	#CJK UNIFIED IDEOGRAPH
0x909B	0x83C5	#CJK UNIFIED IDEOGRAPH
0x909C	0x9817	#CJK UNIFIED IDEOGRAPH
0x909D	0x96C0	#CJK UNIFIED IDEOGRAPH
0x909E	0x88FE	#CJK UNIFIED IDEOGRAPH
0x909F	0x6F84	#CJK UNIFIED IDEOGRAPH
0x90A0	0x647A	#CJK UNIFIED IDEOGRAPH
0x90A1	0x5BF8	#CJK UNIFIED IDEOGRAPH
0x90A2	0x4E16	#CJK UNIFIED IDEOGRAPH
0x90A3	0x702C	#CJK UNIFIED IDEOGRAPH
0x90A4	0x755D	#CJK UNIFIED IDEOGRAPH
0x90A5	0x662F	#CJK UNIFIED IDEOGRAPH
0x90A6	0x51C4	#CJK UNIFIED IDEOGRAPH
0x90A7	0x5236	#CJK UNIFIED IDEOGRAPH
0x90A8	0x52E2	#CJK UNIFIED IDEOGRAPH
0x90A9	0x59D3	#CJK UNIFIED IDEOGRAPH
0x90AA	0x5F81	#CJK UNIFIED IDEOGRAPH
0x90AB	0x6027	#CJK UNIFIED IDEOGRAPH
0x90AC	0x6210	#CJK UNIFIED IDEOGRAPH
0x90AD	0x653F	#CJK UNIFIED IDEOGRAPH
0x90AE	0x6574	#CJK UNIFIED IDEOGRAPH
0x90AF	0x661F	#CJK UNIFIED IDEOGRAPH
0x90B0	0x6674	#CJK UNIFIED IDEOGRAPH
0x90B1	0x68F2	#CJK UNIFIED IDEOGRAPH
0x90B2	0x6816	#CJK UNIFIED IDEOGRAPH
0x90B3	0x6B63	#CJK UNIFIED IDEOGRAPH
0x90B4	0x6E05	#CJK UNIFIED IDEOGRAPH
0x90B5	0x7272	#CJK UNIFIED IDEOGRAPH
0x90B6	0x751F	#CJK UNIFIED IDEOGRAPH
0x90B7	0x76DB	#CJK UNIFIED IDEOGRAPH
0x90B8	0x7CBE	#CJK UNIFIED IDEOGRAPH
0x90B9	0x8056	#CJK UNIFIED IDEOGRAPH
0x90BA	0x58F0	#CJK UNIFIED IDEOGRAPH
0x90BB	0x88FD	#CJK UNIFIED IDEOGRAPH
0x90BC	0x897F	#CJK UNIFIED IDEOGRAPH
0x90BD	0x8AA0	#CJK UNIFIED IDEOGRAPH
0x90BE	0x8A93	#CJK UNIFIED IDEOGRAPH
0x90BF	0x8ACB	#CJK UNIFIED IDEOGRAPH
0x90C0	0x901D	#CJK UNIFIED IDEOGRAPH
0x90C1	0x9192	#CJK UNIFIED IDEOGRAPH
0x90C2	0x9752	#CJK UNIFIED IDEOGRAPH
0x90C3	0x9759	#CJK UNIFIED IDEOGRAPH
0x90C4	0x6589	#CJK UNIFIED IDEOGRAPH
0x90C5	0x7A0E	#CJK UNIFIED IDEOGRAPH
0x90C6	0x8106	#CJK UNIFIED IDEOGRAPH
0x90C7	0x96BB	#CJK UNIFIED IDEOGRAPH
0x90C8	0x5E2D	#CJK UNIFIED IDEOGRAPH
0x90C9	0x60DC	#CJK UNIFIED IDEOGRAPH
0x90CA	0x621A	#CJK UNIFIED IDEOGRAPH
0x90CB	0x65A5	#CJK UNIFIED IDEOGRAPH
0x90CC	0x6614	#CJK UNIFIED IDEOGRAPH
0x90CD	0x6790	#CJK UNIFIED IDEOGRAPH
0x90CE	0x77F3	#CJK UNIFIED IDEOGRAPH
0x90CF	0x7A4D	#CJK UNIFIED IDEOGRAPH
0x90D0	0x7C4D	#CJK UNIFIED IDEOGRAPH
0x90D1	0x7E3E	#CJK UNIFIED IDEOGRAPH
0x90D2	0x810A	#CJK UNIFIED IDEOGRAPH
0x90D3	0x8CAC	#CJK UNIFIED IDEOGRAPH
0x90D4	0x8D64	#CJK UNIFIED IDEOGRAPH
0x90D5	0x8DE1	#CJK UNIFIED IDEOGRAPH
0x90D6	0x8E5F	#CJK UNIFIED IDEOGRAPH
0x90D7	0x78A9	#CJK UNIFIED IDEOGRAPH
0x90D8	0x5207	#CJK UNIFIED IDEOGRAPH
0x90D9	0x62D9	#CJK UNIFIED IDEOGRAPH
0x90DA	0x63A5	#CJK UNIFIED IDEOGRAPH
0x90DB	0x6442	#CJK UNIFIED IDEOGRAPH
0x90DC	0x6298	#CJK UNIFIED IDEOGRAPH
0x90DD	0x8A2D	#CJK UNIFIED IDEOGRAPH
0x90DE	0x7A83	#CJK UNIFIED IDEOGRAPH
0x90DF	0x7BC0	#CJK UNIFIED IDEOGRAPH
0x90E0	0x8AAC	#CJK UNIFIED IDEOGRAPH
0x90E1	0x96EA	#CJK UNIFIED IDEOGRAPH
0x90E2	0x7D76	#CJK UNIFIED IDEOGRAPH
0x90E3	0x820C	#CJK UNIFIED IDEOGRAPH
0x90E4	0x8749	#CJK UNIFIED IDEOGRAPH
0x90E5	0x4ED9	#CJK UNIFIED IDEOGRAPH
0x90E6	0x5148	#CJK UNIFIED IDEOGRAPH
0x90E7	0x5343	#CJK UNIFIED IDEOGRAPH
0x90E8	0x5360	#CJK UNIFIED IDEOGRAPH
0x90E9	0x5BA3	#CJK UNIFIED IDEOGRAPH
0x90EA	0x5C02	#CJK UNIFIED IDEOGRAPH
0x90EB	0x5C16	#CJK UNIFIED IDEOGRAPH
0x90EC	0x5DDD	#CJK UNIFIED IDEOGRAPH
0x90ED	0x6226	#CJK UNIFIED IDEOGRAPH
0x90EE	0x6247	#CJK UNIFIED IDEOGRAPH
0x90EF	0x64B0	#CJK UNIFIED IDEOGRAPH
0x90F0	0x6813	#CJK UNIFIED IDEOGRAPH
0x90F1	0x6834	#CJK UNIFIED IDEOGRAPH
0x90F2	0x6CC9	#CJK UNIFIED IDEOGRAPH
0x90F3	0x6D45	#CJK UNIFIED IDEOGRAPH
0x90F4	0x6D17	#CJK UNIFIED IDEOGRAPH
0x90F5	0x67D3	#CJK UNIFIED IDEOGRAPH
0x90F6	0x6F5C	#CJK UNIFIED IDEOGRAPH
0x90F7	0x714E	#CJK UNIFIED IDEOGRAPH
0x90F8	0x717D	#CJK UNIFIED IDEOGRAPH
0x90F9	0x65CB	#CJK UNIFIED IDEOGRAPH
0x90FA	0x7A7F	#CJK UNIFIED IDEOGRAPH
0x90FB	0x7BAD	#CJK UNIFIED IDEOGRAPH
0x90FC	0x7DDA	#CJK UNIFIED IDEOGRAPH
0x9140	0x7E4A	#CJK UNIFIED IDEOGRAPH
0x9141	0x7FA8	#CJK UNIFIED IDEOGRAPH
0x9142	0x817A	#CJK UNIFIED IDEOGRAPH
0x9143	0x821B	#CJK UNIFIED IDEOGRAPH
0x9144	0x8239	#CJK UNIFIED IDEOGRAPH
0x9145	0x85A6	#CJK UNIFIED IDEOGRAPH
0x9146	0x8A6E	#CJK UNIFIED IDEOGRAPH
0x9147	0x8CCE	#CJK UNIFIED IDEOGRAPH
0x9148	0x8DF5	#CJK UNIFIED IDEOGRAPH
0x9149	0x9078	#CJK UNIFIED IDEOGRAPH
0x914A	0x9077	#CJK UNIFIED IDEOGRAPH
0x914B	0x92AD	#CJK UNIFIED IDEOGRAPH
0x914C	0x9291	#CJK UNIFIED IDEOGRAPH
0x914D	0x9583	#CJK UNIFIED IDEOGRAPH
0x914E	0x9BAE	#CJK UNIFIED IDEOGRAPH
0x914F	0x524D	#CJK UNIFIED IDEOGRAPH
0x9150	0x5584	#CJK UNIFIED IDEOGRAPH
0x9151	0x6F38	#CJK UNIFIED IDEOGRAPH
0x9152	0x7136	#CJK UNIFIED IDEOGRAPH
0x9153	0x5168	#CJK UNIFIED IDEOGRAPH
0x9154	0x7985	#CJK UNIFIED IDEOGRAPH
0x9155	0x7E55	#CJK UNIFIED IDEOGRAPH
0x9156	0x81B3	#CJK UNIFIED IDEOGRAPH
0x9157	0x7CCE	#CJK UNIFIED IDEOGRAPH
0x9158	0x564C	#CJK UNIFIED IDEOGRAPH
0x9159	0x5851	#CJK UNIFIED IDEOGRAPH
0x915A	0x5CA8	#CJK UNIFIED IDEOGRAPH
0x915B	0x63AA	#CJK UNIFIED IDEOGRAPH
0x915C	0x66FE	#CJK UNIFIED IDEOGRAPH
0x915D	0x66FD	#CJK UNIFIED IDEOGRAPH
0x915E	0x695A	#CJK UNIFIED IDEOGRAPH
0x915F	0x72D9	#CJK UNIFIED IDEOGRAPH
0x9160	0x758F	#CJK UNIFIED IDEOGRAPH
0x9161	0x758E	#CJK UNIFIED IDEOGRAPH
0x9162	0x790E	#CJK UNIFIED IDEOGRAPH
0x9163	0x7956	#CJK UNIFIED IDEOGRAPH
0x9164	0x79DF	#CJK UNIFIED IDEOGRAPH
0x9165	0x7C97	#CJK UNIFIED IDEOGRAPH
0x9166	0x7D20	#CJK UNIFIED IDEOGRAPH
0x9167	0x7D44	#CJK UNIFIED IDEOGRAPH
0x9168	0x8607	#CJK UNIFIED IDEOGRAPH
0x9169	0x8A34	#CJK UNIFIED IDEOGRAPH
0x916A	0x963B	#CJK UNIFIED IDEOGRAPH
0x916B	0x9061	#CJK UNIFIED IDEOGRAPH
0x916C	0x9F20	#CJK UNIFIED IDEOGRAPH
0x916D	0x50E7	#CJK UNIFIED IDEOGRAPH
0x916E	0x5275	#CJK UNIFIED IDEOGRAPH
0x916F	0x53CC	#CJK UNIFIED IDEOGRAPH
0x9170	0x53E2	#CJK UNIFIED IDEOGRAPH
0x9171	0x5009	#CJK UNIFIED IDEOGRAPH
0x9172	0x55AA	#CJK UNIFIED IDEOGRAPH
0x9173	0x58EE	#CJK UNIFIED IDEOGRAPH
0x9174	0x594F	#CJK UNIFIED IDEOGRAPH
0x9175	0x723D	#CJK UNIFIED IDEOGRAPH
0x9176	0x5B8B	#CJK UNIFIED IDEOGRAPH
0x9177	0x5C64	#CJK UNIFIED IDEOGRAPH
0x9178	0x531D	#CJK UNIFIED IDEOGRAPH
0x9179	0x60E3	#CJK UNIFIED IDEOGRAPH
0x917A	0x60F3	#CJK UNIFIED IDEOGRAPH
0x917B	0x635C	#CJK UNIFIED IDEOGRAPH
0x917C	0x6383	#CJK UNIFIED IDEOGRAPH
0x917D	0x633F	#CJK UNIFIED IDEOGRAPH
0x917E	0x63BB	#CJK UNIFIED IDEOGRAPH
0x9180	0x64CD	#CJK UNIFIED IDEOGRAPH
0x9181	0x65E9	#CJK UNIFIED IDEOGRAPH
0x9182	0x66F9	#CJK UNIFIED IDEOGRAPH
0x9183	0x5DE3	#CJK UNIFIED IDEOGRAPH
0x9184	0x69CD	#CJK UNIFIED IDEOGRAPH
0x9185	0x69FD	#CJK UNIFIED IDEOGRAPH
0x9186	0x6F15	#CJK UNIFIED IDEOGRAPH
0x9187	0x71E5	#CJK UNIFIED IDEOGRAPH
0x9188	0x4E89	#CJK UNIFIED IDEOGRAPH
0x9189	0x75E9	#CJK UNIFIED IDEOGRAPH
0x918A	0x76F8	#CJK UNIFIED IDEOGRAPH
0x918B	0x7A93	#CJK UNIFIED IDEOGRAPH
0x918C	0x7CDF	#CJK UNIFIED IDEOGRAPH
0x918D	0x7DCF	#CJK UNIFIED IDEOGRAPH
0x918E	0x7D9C	#CJK UNIFIED IDEOGRAPH
0x918F	0x8061	#CJK UNIFIED IDEOGRAPH
0x9190	0x8349	#CJK UNIFIED IDEOGRAPH
0x9191	0x8358	#CJK UNIFIED IDEOGRAPH
0x9192	0x846C	#CJK UNIFIED IDEOGRAPH
0x9193	0x84BC	#CJK UNIFIED IDEOGRAPH
0x9194	0x85FB	#CJK UNIFIED IDEOGRAPH
0x9195	0x88C5	#CJK UNIFIED IDEOGRAPH
0x9196	0x8D70	#CJK UNIFIED IDEOGRAPH
0x9197	0x9001	#CJK UNIFIED IDEOGRAPH
0x9198	0x906D	#CJK UNIFIED IDEOGRAPH
0x9199	0x9397	#CJK UNIFIED IDEOGRAPH
0x919A	0x971C	#CJK UNIFIED IDEOGRAPH
0x919B	0x9A12	#CJK UNIFIED IDEOGRAPH
0x919C	0x50CF	#CJK UNIFIED IDEOGRAPH
0x919D	0x5897	#CJK UNIFIED IDEOGRAPH
0x919E	0x618E	#CJK UNIFIED IDEOGRAPH
0x919F	0x81D3	#CJK UNIFIED IDEOGRAPH
0x91A0	0x8535	#CJK UNIFIED IDEOGRAPH
0x91A1	0x8D08	#CJK UNIFIED IDEOGRAPH
0x91A2	0x9020	#CJK UNIFIED IDEOGRAPH
0x91A3	0x4FC3	#CJK UNIFIED IDEOGRAPH
0x91A4	0x5074	#CJK UNIFIED IDEOGRAPH
0x91A5	0x5247	#CJK UNIFIED IDEOGRAPH
0x91A6	0x5373	#CJK UNIFIED IDEOGRAPH
0x91A7	0x606F	#CJK UNIFIED IDEOGRAPH
0x91A8	0x6349	#CJK UNIFIED IDEOGRAPH
0x91A9	0x675F	#CJK UNIFIED IDEOGRAPH
0x91AA	0x6E2C	#CJK UNIFIED IDEOGRAPH
0x91AB	0x8DB3	#CJK UNIFIED IDEOGRAPH
0x91AC	0x901F	#CJK UNIFIED IDEOGRAPH
0x91AD	0x4FD7	#CJK UNIFIED IDEOGRAPH
0x91AE	0x5C5E	#CJK UNIFIED IDEOGRAPH
0x91AF	0x8CCA	#CJK UNIFIED IDEOGRAPH
0x91B0	0x65CF	#CJK UNIFIED IDEOGRAPH
0x91B1	0x7D9A	#CJK UNIFIED IDEOGRAPH
0x91B2	0x5352	#CJK UNIFIED IDEOGRAPH
0x91B3	0x8896	#CJK UNIFIED IDEOGRAPH
0x91B4	0x5176	#CJK UNIFIED IDEOGRAPH
0x91B5	0x63C3	#CJK UNIFIED IDEOGRAPH
0x91B6	0x5B58	#CJK UNIFIED IDEOGRAPH
0x91B7	0x5B6B	#CJK UNIFIED IDEOGRAPH
0x91B8	0x5C0A	#CJK UNIFIED IDEOGRAPH
0x91B9	0x640D	#CJK UNIFIED IDEOGRAPH
0x91BA	0x6751	#CJK UNIFIED IDEOGRAPH
0x91BB	0x905C	#CJK UNIFIED IDEOGRAPH
0x91BC	0x4ED6	#CJK UNIFIED IDEOGRAPH
0x91BD	0x591A	#CJK UNIFIED IDEOGRAPH
0x91BE	0x592A	#CJK UNIFIED IDEOGRAPH
0x91BF	0x6C70	#CJK UNIFIED IDEOGRAPH
0x91C0	0x8A51	#CJK UNIFIED IDEOGRAPH
0x91C1	0x553E	#CJK UNIFIED IDEOGRAPH
0x91C2	0x5815	#CJK UNIFIED IDEOGRAPH
0x91C3	0x59A5	#CJK UNIFIED IDEOGRAPH
0x91C4	0x60F0	#CJK UNIFIED IDEOGRAPH
0x91C5	0x6253	#CJK UNIFIED IDEOGRAPH
0x91C6	0x67C1	#CJK UNIFIED IDEOGRAPH
0x91C7	0x8235	#CJK UNIFIED IDEOGRAPH
0x91C8	0x6955	#CJK UNIFIED IDEOGRAPH
0x91C9	0x9640	#CJK UNIFIED IDEOGRAPH
0x91CA	0x99C4	#CJK UNIFIED IDEOGRAPH
0x91CB	0x9A28	#CJK UNIFIED IDEOGRAPH
0x91CC	0x4F53	#CJK UNIFIED IDEOGRAPH
0x91CD	0x5806	#CJK UNIFIED IDEOGRAPH
0x91CE	0x5BFE	#CJK UNIFIED IDEOGRAPH
0x91CF	0x8010	#CJK UNIFIED IDEOGRAPH
0x91D0	0x5CB1	#CJK UNIFIED IDEOGRAPH
0x91D1	0x5E2F	#CJK UNIFIED IDEOGRAPH
0x91D2	0x5F85	#CJK UNIFIED IDEOGRAPH
0x91D3	0x6020	#CJK UNIFIED IDEOGRAPH
0x91D4	0x614B	#CJK UNIFIED IDEOGRAPH
0x91D5	0x6234	#CJK UNIFIED IDEOGRAPH
0x91D6	0x66FF	#CJK UNIFIED IDEOGRAPH
0x91D7	0x6CF0	#CJK UNIFIED IDEOGRAPH
0x91D8	0x6EDE	#CJK UNIFIED IDEOGRAPH
0x91D9	0x80CE	#CJK UNIFIED IDEOGRAPH
0x91DA	0x817F	#CJK UNIFIED IDEOGRAPH
0x91DB	0x82D4	#CJK UNIFIED IDEOGRAPH
0x91DC	0x888B	#CJK UNIFIED IDEOGRAPH
0x91DD	0x8CB8	#CJK UNIFIED IDEOGRAPH
0x91DE	0x9000	#CJK UNIFIED IDEOGRAPH
0x91DF	0x902E	#CJK UNIFIED IDEOGRAPH
0x91E0	0x968A	#CJK UNIFIED IDEOGRAPH
0x91E1	0x9EDB	#CJK UNIFIED IDEOGRAPH
0x91E2	0x9BDB	#CJK UNIFIED IDEOGRAPH
0x91E3	0x4EE3	#CJK UNIFIED IDEOGRAPH
0x91E4	0x53F0	#CJK UNIFIED IDEOGRAPH
0x91E5	0x5927	#CJK UNIFIED IDEOGRAPH
0x91E6	0x7B2C	#CJK UNIFIED IDEOGRAPH
0x91E7	0x918D	#CJK UNIFIED IDEOGRAPH
0x91E8	0x984C	#CJK UNIFIED IDEOGRAPH
0x91E9	0x9DF9	#CJK UNIFIED IDEOGRAPH
0x91EA	0x6EDD	#CJK UNIFIED IDEOGRAPH
0x91EB	0x7027	#CJK UNIFIED IDEOGRAPH
0x91EC	0x5353	#CJK UNIFIED IDEOGRAPH
0x91ED	0x5544	#CJK UNIFIED IDEOGRAPH
0x91EE	0x5B85	#CJK UNIFIED IDEOGRAPH
0x91EF	0x6258	#CJK UNIFIED IDEOGRAPH
0x91F0	0x629E	#CJK UNIFIED IDEOGRAPH
0x91F1	0x62D3	#CJK UNIFIED IDEOGRAPH
0x91F2	0x6CA2	#CJK UNIFIED IDEOGRAPH
0x91F3	0x6FEF	#CJK UNIFIED IDEOGRAPH
0x91F4	0x7422	#CJK UNIFIED IDEOGRAPH
0x91F5	0x8A17	#CJK UNIFIED IDEOGRAPH
0x91F6	0x9438	#CJK UNIFIED IDEOGRAPH
0x91F7	0x6FC1	#CJK UNIFIED IDEOGRAPH
0x91F8	0x8AFE	#CJK UNIFIED IDEOGRAPH
0x91F9	0x8338	#CJK UNIFIED IDEOGRAPH
0x91FA	0x51E7	#CJK UNIFIED IDEOGRAPH
0x91FB	0x86F8	#CJK UNIFIED IDEOGRAPH
0x91FC	0x53EA	#CJK UNIFIED IDEOGRAPH
0x9240	0x53E9	#CJK UNIFIED IDEOGRAPH
0x9241	0x4F46	#CJK UNIFIED IDEOGRAPH
0x9242	0x9054	#CJK UNIFIED IDEOGRAPH
0x9243	0x8FB0	#CJK UNIFIED IDEOGRAPH
0x9244	0x596A	#CJK UNIFIED IDEOGRAPH
0x9245	0x8131	#CJK UNIFIED IDEOGRAPH
0x9246	0x5DFD	#CJK UNIFIED IDEOGRAPH
0x9247	0x7AEA	#CJK UNIFIED IDEOGRAPH
0x9248	0x8FBF	#CJK UNIFIED IDEOGRAPH
0x9249	0x68DA	#CJK UNIFIED IDEOGRAPH
0x924A	0x8C37	#CJK UNIFIED IDEOGRAPH
0x924B	0x72F8	#CJK UNIFIED IDEOGRAPH
0x924C	0x9C48	#CJK UNIFIED IDEOGRAPH
0x924D	0x6A3D	#CJK UNIFIED IDEOGRAPH
0x924E	0x8AB0	#CJK UNIFIED IDEOGRAPH
0x924F	0x4E39	#CJK UNIFIED IDEOGRAPH
0x9250	0x5358	#CJK UNIFIED IDEOGRAPH
0x9251	0x5606	#CJK UNIFIED IDEOGRAPH
0x9252	0x5766	#CJK UNIFIED IDEOGRAPH
0x9253	0x62C5	#CJK UNIFIED IDEOGRAPH
0x9254	0x63A2	#CJK UNIFIED IDEOGRAPH
0x9255	0x65E6	#CJK UNIFIED IDEOGRAPH
0x9256	0x6B4E	#CJK UNIFIED IDEOGRAPH
0x9257	0x6DE1	#CJK UNIFIED IDEOGRAPH
0x9258	0x6E5B	#CJK UNIFIED IDEOGRAPH
0x9259	0x70AD	#CJK UNIFIED IDEOGRAPH
0x925A	0x77ED	#CJK UNIFIED IDEOGRAPH
0x925B	0x7AEF	#CJK UNIFIED IDEOGRAPH
0x925C	0x7BAA	#CJK UNIFIED IDEOGRAPH
0x925D	0x7DBB	#CJK UNIFIED IDEOGRAPH
0x925E	0x803D	#CJK UNIFIED IDEOGRAPH
0x925F	0x80C6	#CJK UNIFIED IDEOGRAPH
0x9260	0x86CB	#CJK UNIFIED IDEOGRAPH
0x9261	0x8A95	#CJK UNIFIED IDEOGRAPH
0x9262	0x935B	#CJK UNIFIED IDEOGRAPH
0x9263	0x56E3	#CJK UNIFIED IDEOGRAPH
0x9264	0x58C7	#CJK UNIFIED IDEOGRAPH
0x9265	0x5F3E	#CJK UNIFIED IDEOGRAPH
0x9266	0x65AD	#CJK UNIFIED IDEOGRAPH
0x9267	0x6696	#CJK UNIFIED IDEOGRAPH
0x9268	0x6A80	#CJK UNIFIED IDEOGRAPH
0x9269	0x6BB5	#CJK UNIFIED IDEOGRAPH
0x926A	0x7537	#CJK UNIFIED IDEOGRAPH
0x926B	0x8AC7	#CJK UNIFIED IDEOGRAPH
0x926C	0x5024	#CJK UNIFIED IDEOGRAPH
0x926D	0x77E5	#CJK UNIFIED IDEOGRAPH
0x926E	0x5730	#CJK UNIFIED IDEOGRAPH
0x926F	0x5F1B	#CJK UNIFIED IDEOGRAPH
0x9270	0x6065	#CJK UNIFIED IDEOGRAPH
0x9271	0x667A	#CJK UNIFIED IDEOGRAPH
0x9272	0x6C60	#CJK UNIFIED IDEOGRAPH
0x9273	0x75F4	#CJK UNIFIED IDEOGRAPH
0x9274	0x7A1A	#CJK UNIFIED IDEOGRAPH
0x9275	0x7F6E	#CJK UNIFIED IDEOGRAPH
0x9276	0x81F4	#CJK UNIFIED IDEOGRAPH
0x9277	0x8718	#CJK UNIFIED IDEOGRAPH
0x9278	0x9045	#CJK UNIFIED IDEOGRAPH
0x9279	0x99B3	#CJK UNIFIED IDEOGRAPH
0x927A	0x7BC9	#CJK UNIFIED IDEOGRAPH
0x927B	0x755C	#CJK UNIFIED IDEOGRAPH
0x927C	0x7AF9	#CJK UNIFIED IDEOGRAPH
0x927D	0x7B51	#CJK UNIFIED IDEOGRAPH
0x927E	0x84C4	#CJK UNIFIED IDEOGRAPH
0x9280	0x9010	#CJK UNIFIED IDEOGRAPH
0x9281	0x79E9	#CJK UNIFIED IDEOGRAPH
0x9282	0x7A92	#CJK UNIFIED IDEOGRAPH
0x9283	0x8336	#CJK UNIFIED IDEOGRAPH
0x9284	0x5AE1	#CJK UNIFIED IDEOGRAPH
0x9285	0x7740	#CJK UNIFIED IDEOGRAPH
0x9286	0x4E2D	#CJK UNIFIED IDEOGRAPH
0x9287	0x4EF2	#CJK UNIFIED IDEOGRAPH
0x9288	0x5B99	#CJK UNIFIED IDEOGRAPH
0x9289	0x5FE0	#CJK UNIFIED IDEOGRAPH
0x928A	0x62BD	#CJK UNIFIED IDEOGRAPH
0x928B	0x663C	#CJK UNIFIED IDEOGRAPH
0x928C	0x67F1	#CJK UNIFIED IDEOGRAPH
0x928D	0x6CE8	#CJK UNIFIED IDEOGRAPH
0x928E	0x866B	#CJK UNIFIED IDEOGRAPH
0x928F	0x8877	#CJK UNIFIED IDEOGRAPH
0x9290	0x8A3B	#CJK UNIFIED IDEOGRAPH
0x9291	0x914E	#CJK UNIFIED IDEOGRAPH
0x9292	0x92F3	#CJK UNIFIED IDEOGRAPH
0x9293	0x99D0	#CJK UNIFIED IDEOGRAPH
0x9294	0x6A17	#CJK UNIFIED IDEOGRAPH
0x9295	0x7026	#CJK UNIFIED IDEOGRAPH
0x9296	0x732A	#CJK UNIFIED IDEOGRAPH
0x9297	0x82E7	#CJK UNIFIED IDEOGRAPH
0x9298	0x8457	#CJK UNIFIED IDEOGRAPH
0x9299	0x8CAF	#CJK UNIFIED IDEOGRAPH
0x929A	0x4E01	#CJK UNIFIED IDEOGRAPH
0x929B	0x5146	#CJK UNIFIED IDEOGRAPH
0x929C	0x51CB	#CJK UNIFIED IDEOGRAPH
0x929D	0x558B	#CJK UNIFIED IDEOGRAPH
0x929E	0x5BF5	#CJK UNIFIED IDEOGRAPH
0x929F	0x5E16	#CJK UNIFIED IDEOGRAPH
0x92A0	0x5E33	#CJK UNIFIED IDEOGRAPH
0x92A1	0x5E81	#CJK UNIFIED IDEOGRAPH
0x92A2	0x5F14	#CJK UNIFIED IDEOGRAPH
0x92A3	0x5F35	#CJK UNIFIED IDEOGRAPH
0x92A4	0x5F6B	#CJK UNIFIED IDEOGRAPH
0x92A5	0x5FB4	#CJK UNIFIED IDEOGRAPH
0x92A6	0x61F2	#CJK UNIFIED IDEOGRAPH
0x92A7	0x6311	#CJK UNIFIED IDEOGRAPH
0x92A8	0x66A2	#CJK UNIFIED IDEOGRAPH
0x92A9	0x671D	#CJK UNIFIED IDEOGRAPH
0x92AA	0x6F6E	#CJK UNIFIED IDEOGRAPH
0x92AB	0x7252	#CJK UNIFIED IDEOGRAPH
0x92AC	0x753A	#CJK UNIFIED IDEOGRAPH
0x92AD	0x773A	#CJK UNIFIED IDEOGRAPH
0x92AE	0x8074	#CJK UNIFIED IDEOGRAPH
0x92AF	0x8139	#CJK UNIFIED IDEOGRAPH
0x92B0	0x8178	#CJK UNIFIED IDEOGRAPH
0x92B1	0x8776	#CJK UNIFIED IDEOGRAPH
0x92B2	0x8ABF	#CJK UNIFIED IDEOGRAPH
0x92B3	0x8ADC	#CJK UNIFIED IDEOGRAPH
0x92B4	0x8D85	#CJK UNIFIED IDEOGRAPH
0x92B5	0x8DF3	#CJK UNIFIED IDEOGRAPH
0x92B6	0x929A	#CJK UNIFIED IDEOGRAPH
0x92B7	0x9577	#CJK UNIFIED IDEOGRAPH
0x92B8	0x9802	#CJK UNIFIED IDEOGRAPH
0x92B9	0x9CE5	#CJK UNIFIED IDEOGRAPH
0x92BA	0x52C5	#CJK UNIFIED IDEOGRAPH
0x92BB	0x6357	#CJK UNIFIED IDEOGRAPH
0x92BC	0x76F4	#CJK UNIFIED IDEOGRAPH
0x92BD	0x6715	#CJK UNIFIED IDEOGRAPH
0x92BE	0x6C88	#CJK UNIFIED IDEOGRAPH
0x92BF	0x73CD	#CJK UNIFIED IDEOGRAPH
0x92C0	0x8CC3	#CJK UNIFIED IDEOGRAPH
0x92C1	0x93AE	#CJK UNIFIED IDEOGRAPH
0x92C2	0x9673	#CJK UNIFIED IDEOGRAPH
0x92C3	0x6D25	#CJK UNIFIED IDEOGRAPH
0x92C4	0x589C	#CJK UNIFIED IDEOGRAPH
0x92C5	0x690E	#CJK UNIFIED IDEOGRAPH
0x92C6	0x69CC	#CJK UNIFIED IDEOGRAPH
0x92C7	0x8FFD	#CJK UNIFIED IDEOGRAPH
0x92C8	0x939A	#CJK UNIFIED IDEOGRAPH
0x92C9	0x75DB	#CJK UNIFIED IDEOGRAPH
0x92CA	0x901A	#CJK UNIFIED IDEOGRAPH
0x92CB	0x585A	#CJK UNIFIED IDEOGRAPH
0x92CC	0x6802	#CJK UNIFIED IDEOGRAPH
0x92CD	0x63B4	#CJK UNIFIED IDEOGRAPH
0x92CE	0x69FB	#CJK UNIFIED IDEOGRAPH
0x92CF	0x4F43	#CJK UNIFIED IDEOGRAPH
0x92D0	0x6F2C	#CJK UNIFIED IDEOGRAPH
0x92D1	0x67D8	#CJK UNIFIED IDEOGRAPH
0x92D2	0x8FBB	#CJK UNIFIED IDEOGRAPH
0x92D3	0x8526	#CJK UNIFIED IDEOGRAPH
0x92D4	0x7DB4	#CJK UNIFIED IDEOGRAPH
0x92D5	0x9354	#CJK UNIFIED IDEOGRAPH
0x92D6	0x693F	#CJK UNIFIED IDEOGRAPH
0x92D7	0x6F70	#CJK UNIFIED IDEOGRAPH
0x92D8	0x576A	#CJK UNIFIED IDEOGRAPH
0x92D9	0x58F7	#CJK UNIFIED IDEOGRAPH
0x92DA	0x5B2C	#CJK UNIFIED IDEOGRAPH
0x92DB	0x7D2C	#CJK UNIFIED IDEOGRAPH
0x92DC	0x722A	#CJK UNIFIED IDEOGRAPH
0x92DD	0x540A	#CJK UNIFIED IDEOGRAPH
0x92DE	0x91E3	#CJK UNIFIED IDEOGRAPH
0x92DF	0x9DB4	#CJK UNIFIED IDEOGRAPH
0x92E0	0x4EAD	#CJK UNIFIED IDEOGRAPH
0x92E1	0x4F4E	#CJK UNIFIED IDEOGRAPH
0x92E2	0x505C	#CJK UNIFIED IDEOGRAPH
0x92E3	0x5075	#CJK UNIFIED IDEOGRAPH
0x92E4	0x5243	#CJK UNIFIED IDEOGRAPH
0x92E5	0x8C9E	#CJK UNIFIED IDEOGRAPH
0x92E6	0x5448	#CJK UNIFIED IDEOGRAPH
0x92E7	0x5824	#CJK UNIFIED IDEOGRAPH
0x92E8	0x5B9A	#CJK UNIFIED IDEOGRAPH
0x92E9	0x5E1D	#CJK UNIFIED IDEOGRAPH
0x92EA	0x5E95	#CJK UNIFIED IDEOGRAPH
0x92EB	0x5EAD	#CJK UNIFIED IDEOGRAPH
0x92EC	0x5EF7	#CJK UNIFIED IDEOGRAPH
0x92ED	0x5F1F	#CJK UNIFIED IDEOGRAPH
0x92EE	0x608C	#CJK UNIFIED IDEOGRAPH
0x92EF	0x62B5	#CJK UNIFIED IDEOGRAPH
0x92F0	0x633A	#CJK UNIFIED IDEOGRAPH
0x92F1	0x63D0	#CJK UNIFIED IDEOGRAPH
0x92F2	0x68AF	#CJK UNIFIED IDEOGRAPH
0x92F3	0x6C40	#CJK UNIFIED IDEOGRAPH
0x92F4	0x7887	#CJK UNIFIED IDEOGRAPH
0x92F5	0x798E	#CJK UNIFIED IDEOGRAPH
0x92F6	0x7A0B	#CJK UNIFIED IDEOGRAPH
0x92F7	0x7DE0	#CJK UNIFIED IDEOGRAPH
0x92F8	0x8247	#CJK UNIFIED IDEOGRAPH
0x92F9	0x8A02	#CJK UNIFIED IDEOGRAPH
0x92FA	0x8AE6	#CJK UNIFIED IDEOGRAPH
0x92FB	0x8E44	#CJK UNIFIED IDEOGRAPH
0x92FC	0x9013	#CJK UNIFIED IDEOGRAPH
0x9340	0x90B8	#CJK UNIFIED IDEOGRAPH
0x9341	0x912D	#CJK UNIFIED IDEOGRAPH
0x9342	0x91D8	#CJK UNIFIED IDEOGRAPH
0x9343	0x9F0E	#CJK UNIFIED IDEOGRAPH
0x9344	0x6CE5	#CJK UNIFIED IDEOGRAPH
0x9345	0x6458	#CJK UNIFIED IDEOGRAPH
0x9346	0x64E2	#CJK UNIFIED IDEOGRAPH
0x9347	0x6575	#CJK UNIFIED IDEOGRAPH
0x9348	0x6EF4	#CJK UNIFIED IDEOGRAPH
0x9349	0x7684	#CJK UNIFIED IDEOGRAPH
0x934A	0x7B1B	#CJK UNIFIED IDEOGRAPH
0x934B	0x9069	#CJK UNIFIED IDEOGRAPH
0x934C	0x93D1	#CJK UNIFIED IDEOGRAPH
0x934D	0x6EBA	#CJK UNIFIED IDEOGRAPH
0x934E	0x54F2	#CJK UNIFIED IDEOGRAPH
0x934F	0x5FB9	#CJK UNIFIED IDEOGRAPH
0x9350	0x64A4	#CJK UNIFIED IDEOGRAPH
0x9351	0x8F4D	#CJK UNIFIED IDEOGRAPH
0x9352	0x8FED	#CJK UNIFIED IDEOGRAPH
0x9353	0x9244	#CJK UNIFIED IDEOGRAPH
0x9354	0x5178	#CJK UNIFIED IDEOGRAPH
0x9355	0x586B	#CJK UNIFIED IDEOGRAPH
0x9356	0x5929	#CJK UNIFIED IDEOGRAPH
0x9357	0x5C55	#CJK UNIFIED IDEOGRAPH
0x9358	0x5E97	#CJK UNIFIED IDEOGRAPH
0x9359	0x6DFB	#CJK UNIFIED IDEOGRAPH
0x935A	0x7E8F	#CJK UNIFIED IDEOGRAPH
0x935B	0x751C	#CJK UNIFIED IDEOGRAPH
0x935C	0x8CBC	#CJK UNIFIED IDEOGRAPH
0x935D	0x8EE2	#CJK UNIFIED IDEOGRAPH
0x935E	0x985B	#CJK UNIFIED IDEOGRAPH
0x935F	0x70B9	#CJK UNIFIED IDEOGRAPH
0x9360	0x4F1D	#CJK UNIFIED IDEOGRAPH
0x9361	0x6BBF	#CJK UNIFIED IDEOGRAPH
0x9362	0x6FB1	#CJK UNIFIED IDEOGRAPH
0x9363	0x7530	#CJK UNIFIED IDEOGRAPH
0x9364	0x96FB	#CJK UNIFIED IDEOGRAPH
0x9365	0x514E	#CJK UNIFIED IDEOGRAPH
0x9366	0x5410	#CJK UNIFIED IDEOGRAPH
0x9367	0x5835	#CJK UNIFIED IDEOGRAPH
0x9368	0x5857	#CJK UNIFIED IDEOGRAPH
0x9369	0x59AC	#CJK UNIFIED IDEOGRAPH
0x936A	0x5C60	#CJK UNIFIED IDEOGRAPH
0x936B	0x5F92	#CJK UNIFIED IDEOGRAPH
0x936C	0x6597	#CJK UNIFIED IDEOGRAPH
0x936D	0x675C	#CJK UNIFIED IDEOGRAPH
0x936E	0x6E21	#CJK UNIFIED IDEOGRAPH
0x936F	0x767B	#CJK UNIFIED IDEOGRAPH
0x9370	0x83DF	#CJK UNIFIED IDEOGRAPH
0x9371	0x8CED	#CJK UNIFIED IDEOGRAPH
0x9372	0x9014	#CJK UNIFIED IDEOGRAPH
0x9373	0x90FD	#CJK UNIFIED IDEOGRAPH
0x9374	0x934D	#CJK UNIFIED IDEOGRAPH
0x9375	0x7825	#CJK UNIFIED IDEOGRAPH
0x9376	0x783A	#CJK UNIFIED IDEOGRAPH
0x9377	0x52AA	#CJK UNIFIED IDEOGRAPH
0x9378	0x5EA6	#CJK UNIFIED IDEOGRAPH
0x9379	0x571F	#CJK UNIFIED IDEOGRAPH
0x937A	0x5974	#CJK UNIFIED IDEOGRAPH
0x937B	0x6012	#CJK UNIFIED IDEOGRAPH
0x937C	0x5012	#CJK UNIFIED IDEOGRAPH
0x937D	0x515A	#CJK UNIFIED IDEOGRAPH
0x937E	0x51AC	#CJK UNIFIED IDEOGRAPH
0x9380	0x51CD	#CJK UNIFIED IDEOGRAPH
0x9381	0x5200	#CJK UNIFIED IDEOGRAPH
0x9382	0x5510	#CJK UNIFIED IDEOGRAPH
0x9383	0x5854	#CJK UNIFIED IDEOGRAPH
0x9384	0x5858	#CJK UNIFIED IDEOGRAPH
0x9385	0x5957	#CJK UNIFIED IDEOGRAPH
0x9386	0x5B95	#CJK UNIFIED IDEOGRAPH
0x9387	0x5CF6	#CJK UNIFIED IDEOGRAPH
0x9388	0x5D8B	#CJK UNIFIED IDEOGRAPH
0x9389	0x60BC	#CJK UNIFIED IDEOGRAPH
0x938A	0x6295	#CJK UNIFIED IDEOGRAPH
0x938B	0x642D	#CJK UNIFIED IDEOGRAPH
0x938C	0x6771	#CJK UNIFIED IDEOGRAPH
0x938D	0x6843	#CJK UNIFIED IDEOGRAPH
0x938E	0x68BC	#CJK UNIFIED IDEOGRAPH
0x938F	0x68DF	#CJK UNIFIED IDEOGRAPH
0x9390	0x76D7	#CJK UNIFIED IDEOGRAPH
0x9391	0x6DD8	#CJK UNIFIED IDEOGRAPH
0x9392	0x6E6F	#CJK UNIFIED IDEOGRAPH
0x9393	0x6D9B	#CJK UNIFIED IDEOGRAPH
0x9394	0x706F	#CJK UNIFIED IDEOGRAPH
0x9395	0x71C8	#CJK UNIFIED IDEOGRAPH
0x9396	0x5F53	#CJK UNIFIED IDEOGRAPH
0x9397	0x75D8	#CJK UNIFIED IDEOGRAPH
0x9398	0x7977	#CJK UNIFIED IDEOGRAPH
0x9399	0x7B49	#CJK UNIFIED IDEOGRAPH
0x939A	0x7B54	#CJK UNIFIED IDEOGRAPH
0x939B	0x7B52	#CJK UNIFIED IDEOGRAPH
0x939C	0x7CD6	#CJK UNIFIED IDEOGRAPH
0x939D	0x7D71	#CJK UNIFIED IDEOGRAPH
0x939E	0x5230	#CJK UNIFIED IDEOGRAPH
0x939F	0x8463	#CJK UNIFIED IDEOGRAPH
0x93A0	0x8569	#CJK UNIFIED IDEOGRAPH
0x93A1	0x85E4	#CJK UNIFIED IDEOGRAPH
0x93A2	0x8A0E	#CJK UNIFIED IDEOGRAPH
0x93A3	0x8B04	#CJK UNIFIED IDEOGRAPH
0x93A4	0x8C46	#CJK UNIFIED IDEOGRAPH
0x93A5	0x8E0F	#CJK UNIFIED IDEOGRAPH
0x93A6	0x9003	#CJK UNIFIED IDEOGRAPH
0x93A7	0x900F	#CJK UNIFIED IDEOGRAPH
0x93A8	0x9419	#CJK UNIFIED IDEOGRAPH
0x93A9	0x9676	#CJK UNIFIED IDEOGRAPH
0x93AA	0x982D	#CJK UNIFIED IDEOGRAPH
0x93AB	0x9A30	#CJK UNIFIED IDEOGRAPH
0x93AC	0x95D8	#CJK UNIFIED IDEOGRAPH
0x93AD	0x50CD	#CJK UNIFIED IDEOGRAPH
0x93AE	0x52D5	#CJK UNIFIED IDEOGRAPH
0x93AF	0x540C	#CJK UNIFIED IDEOGRAPH
0x93B0	0x5802	#CJK UNIFIED IDEOGRAPH
0x93B1	0x5C0E	#CJK UNIFIED IDEOGRAPH
0x93B2	0x61A7	#CJK UNIFIED IDEOGRAPH
0x93B3	0x649E	#CJK UNIFIED IDEOGRAPH
0x93B4	0x6D1E	#CJK UNIFIED IDEOGRAPH
0x93B5	0x77B3	#CJK UNIFIED IDEOGRAPH
0x93B6	0x7AE5	#CJK UNIFIED IDEOGRAPH
0x93B7	0x80F4	#CJK UNIFIED IDEOGRAPH
0x93B8	0x8404	#CJK UNIFIED IDEOGRAPH
0x93B9	0x9053	#CJK UNIFIED IDEOGRAPH
0x93BA	0x9285	#CJK UNIFIED IDEOGRAPH
0x93BB	0x5CE0	#CJK UNIFIED IDEOGRAPH
0x93BC	0x9D07	#CJK UNIFIED IDEOGRAPH
0x93BD	0x533F	#CJK UNIFIED IDEOGRAPH
0x93BE	0x5F97	#CJK UNIFIED IDEOGRAPH
0x93BF	0x5FB3	#CJK UNIFIED IDEOGRAPH
0x93C0	0x6D9C	#CJK UNIFIED IDEOGRAPH
0x93C1	0x7279	#CJK UNIFIED IDEOGRAPH
0x93C2	0x7763	#CJK UNIFIED IDEOGRAPH
0x93C3	0x79BF	#CJK UNIFIED IDEOGRAPH
0x93C4	0x7BE4	#CJK UNIFIED IDEOGRAPH
0x93C5	0x6BD2	#CJK UNIFIED IDEOGRAPH
0x93C6	0x72EC	#CJK UNIFIED IDEOGRAPH
0x93C7	0x8AAD	#CJK UNIFIED IDEOGRAPH
0x93C8	0x6803	#CJK UNIFIED IDEOGRAPH
0x93C9	0x6A61	#CJK UNIFIED IDEOGRAPH
0x93CA	0x51F8	#CJK UNIFIED IDEOGRAPH
0x93CB	0x7A81	#CJK UNIFIED IDEOGRAPH
0x93CC	0x6934	#CJK UNIFIED IDEOGRAPH
0x93CD	0x5C4A	#CJK UNIFIED IDEOGRAPH
0x93CE	0x9CF6	#CJK UNIFIED IDEOGRAPH
0x93CF	0x82EB	#CJK UNIFIED IDEOGRAPH
0x93D0	0x5BC5	#CJK UNIFIED IDEOGRAPH
0x93D1	0x9149	#CJK UNIFIED IDEOGRAPH
0x93D2	0x701E	#CJK UNIFIED IDEOGRAPH
0x93D3	0x5678	#CJK UNIFIED IDEOGRAPH
0x93D4	0x5C6F	#CJK UNIFIED IDEOGRAPH
0x93D5	0x60C7	#CJK UNIFIED IDEOGRAPH
0x93D6	0x6566	#CJK UNIFIED IDEOGRAPH
0x93D7	0x6C8C	#CJK UNIFIED IDEOGRAPH
0x93D8	0x8C5A	#CJK UNIFIED IDEOGRAPH
0x93D9	0x9041	#CJK UNIFIED IDEOGRAPH
0x93DA	0x9813	#CJK UNIFIED IDEOGRAPH
0x93DB	0x5451	#CJK UNIFIED IDEOGRAPH
0x93DC	0x66C7	#CJK UNIFIED IDEOGRAPH
0x93DD	0x920D	#CJK UNIFIED IDEOGRAPH
0x93DE	0x5948	#CJK UNIFIED IDEOGRAPH
0x93DF	0x90A3	#CJK UNIFIED IDEOGRAPH
0x93E0	0x5185	#CJK UNIFIED IDEOGRAPH
0x93E1	0x4E4D	#CJK UNIFIED IDEOGRAPH
0x93E2	0x51EA	#CJK UNIFIED IDEOGRAPH
0x93E3	0x8599	#CJK UNIFIED IDEOGRAPH
0x93E4	0x8B0E	#CJK UNIFIED IDEOGRAPH
0x93E5	0x7058	#CJK UNIFIED IDEOGRAPH
0x93E6	0x637A	#CJK UNIFIED IDEOGRAPH
0x93E7	0x934B	#CJK UNIFIED IDEOGRAPH
0x93E8	0x6962	#CJK UNIFIED IDEOGRAPH
0x93E9	0x99B4	#CJK UNIFIED IDEOGRAPH
0x93EA	0x7E04	#CJK UNIFIED IDEOGRAPH
0x93EB	0x7577	#CJK UNIFIED IDEOGRAPH
0x93EC	0x5357	#CJK UNIFIED IDEOGRAPH
0x93ED	0x6960	#CJK UNIFIED IDEOGRAPH
0x93EE	0x8EDF	#CJK UNIFIED IDEOGRAPH
0x93EF	0x96E3	#CJK UNIFIED IDEOGRAPH
0x93F0	0x6C5D	#CJK UNIFIED IDEOGRAPH
0x93F1	0x4E8C	#CJK UNIFIED IDEOGRAPH
0x93F2	0x5C3C	#CJK UNIFIED IDEOGRAPH
0x93F3	0x5F10	#CJK UNIFIED IDEOGRAPH
0x93F4	0x8FE9	#CJK UNIFIED IDEOGRAPH
0x93F5	0x5302	#CJK UNIFIED IDEOGRAPH
0x93F6	0x8CD1	#CJK UNIFIED IDEOGRAPH
0x93F7	0x8089	#CJK UNIFIED IDEOGRAPH
0x93F8	0x8679	#CJK UNIFIED IDEOGRAPH
0x93F9	0x5EFF	#CJK UNIFIED IDEOGRAPH
0x93FA	0x65E5	#CJK UNIFIED IDEOGRAPH
0x93FB	0x4E73	#CJK UNIFIED IDEOGRAPH
0x93FC	0x5165	#CJK UNIFIED IDEOGRAPH
0x9440	0x5982	#CJK UNIFIED IDEOGRAPH
0x9441	0x5C3F	#CJK UNIFIED IDEOGRAPH
0x9442	0x97EE	#CJK UNIFIED IDEOGRAPH
0x9443	0x4EFB	#CJK UNIFIED IDEOGRAPH
0x9444	0x598A	#CJK UNIFIED IDEOGRAPH
0x9445	0x5FCD	#CJK UNIFIED IDEOGRAPH
0x9446	0x8A8D	#CJK UNIFIED IDEOGRAPH
0x9447	0x6FE1	#CJK UNIFIED IDEOGRAPH
0x9448	0x79B0	#CJK UNIFIED IDEOGRAPH
0x9449	0x7962	#CJK UNIFIED IDEOGRAPH
0x944A	0x5BE7	#CJK UNIFIED IDEOGRAPH
0x944B	0x8471	#CJK UNIFIED IDEOGRAPH
0x944C	0x732B	#CJK UNIFIED IDEOGRAPH
0x944D	0x71B1	#CJK UNIFIED IDEOGRAPH
0x944E	0x5E74	#CJK UNIFIED IDEOGRAPH
0x944F	0x5FF5	#CJK UNIFIED IDEOGRAPH
0x9450	0x637B	#CJK UNIFIED IDEOGRAPH
0x9451	0x649A	#CJK UNIFIED IDEOGRAPH
0x9452	0x71C3	#CJK UNIFIED IDEOGRAPH
0x9453	0x7C98	#CJK UNIFIED IDEOGRAPH
0x9454	0x4E43	#CJK UNIFIED IDEOGRAPH
0x9455	0x5EFC	#CJK UNIFIED IDEOGRAPH
0x9456	0x4E4B	#CJK UNIFIED IDEOGRAPH
0x9457	0x57DC	#CJK UNIFIED IDEOGRAPH
0x9458	0x56A2	#CJK UNIFIED IDEOGRAPH
0x9459	0x60A9	#CJK UNIFIED IDEOGRAPH
0x945A	0x6FC3	#CJK UNIFIED IDEOGRAPH
0x945B	0x7D0D	#CJK UNIFIED IDEOGRAPH
0x945C	0x80FD	#CJK UNIFIED IDEOGRAPH
0x945D	0x8133	#CJK UNIFIED IDEOGRAPH
0x945E	0x81BF	#CJK UNIFIED IDEOGRAPH
0x945F	0x8FB2	#CJK UNIFIED IDEOGRAPH
0x9460	0x8997	#CJK UNIFIED IDEOGRAPH
0x9461	0x86A4	#CJK UNIFIED IDEOGRAPH
0x9462	0x5DF4	#CJK UNIFIED IDEOGRAPH
0x9463	0x628A	#CJK UNIFIED IDEOGRAPH
0x9464	0x64AD	#CJK UNIFIED IDEOGRAPH
0x9465	0x8987	#CJK UNIFIED IDEOGRAPH
0x9466	0x6777	#CJK UNIFIED IDEOGRAPH
0x9467	0x6CE2	#CJK UNIFIED IDEOGRAPH
0x9468	0x6D3E	#CJK UNIFIED IDEOGRAPH
0x9469	0x7436	#CJK UNIFIED IDEOGRAPH
0x946A	0x7834	#CJK UNIFIED IDEOGRAPH
0x946B	0x5A46	#CJK UNIFIED IDEOGRAPH
0x946C	0x7F75	#CJK UNIFIED IDEOGRAPH
0x946D	0x82AD	#CJK UNIFIED IDEOGRAPH
0x946E	0x99AC	#CJK UNIFIED IDEOGRAPH
0x946F	0x4FF3	#CJK UNIFIED IDEOGRAPH
0x9470	0x5EC3	#CJK UNIFIED IDEOGRAPH
0x9471	0x62DD	#CJK UNIFIED IDEOGRAPH
0x9472	0x6392	#CJK UNIFIED IDEOGRAPH
0x9473	0x6557	#CJK UNIFIED IDEOGRAPH
0x9474	0x676F	#CJK UNIFIED IDEOGRAPH
0x9475	0x76C3	#CJK UNIFIED IDEOGRAPH
0x9476	0x724C	#CJK UNIFIED IDEOGRAPH
0x9477	0x80CC	#CJK UNIFIED IDEOGRAPH
0x9478	0x80BA	#CJK UNIFIED IDEOGRAPH
0x9479	0x8F29	#CJK UNIFIED IDEOGRAPH
0x947A	0x914D	#CJK UNIFIED IDEOGRAPH
0x947B	0x500D	#CJK UNIFIED IDEOGRAPH
0x947C	0x57F9	#CJK UNIFIED IDEOGRAPH
0x947D	0x5A92	#CJK UNIFIED IDEOGRAPH
0x947E	0x6885	#CJK UNIFIED IDEOGRAPH
0x9480	0x6973	#CJK UNIFIED IDEOGRAPH
0x9481	0x7164	#CJK UNIFIED IDEOGRAPH
0x9482	0x72FD	#CJK UNIFIED IDEOGRAPH
0x9483	0x8CB7	#CJK UNIFIED IDEOGRAPH
0x9484	0x58F2	#CJK UNIFIED IDEOGRAPH
0x9485	0x8CE0	#CJK UNIFIED IDEOGRAPH
0x9486	0x966A	#CJK UNIFIED IDEOGRAPH
0x9487	0x9019	#CJK UNIFIED IDEOGRAPH
0x9488	0x877F	#CJK UNIFIED IDEOGRAPH
0x9489	0x79E4	#CJK UNIFIED IDEOGRAPH
0x948A	0x77E7	#CJK UNIFIED IDEOGRAPH
0x948B	0x8429	#CJK UNIFIED IDEOGRAPH
0x948C	0x4F2F	#CJK UNIFIED IDEOGRAPH
0x948D	0x5265	#CJK UNIFIED IDEOGRAPH
0x948E	0x535A	#CJK UNIFIED IDEOGRAPH
0x948F	0x62CD	#CJK UNIFIED IDEOGRAPH
0x9490	0x67CF	#CJK UNIFIED IDEOGRAPH
0x9491	0x6CCA	#CJK UNIFIED IDEOGRAPH
0x9492	0x767D	#CJK UNIFIED IDEOGRAPH
0x9493	0x7B94	#CJK UNIFIED IDEOGRAPH
0x9494	0x7C95	#CJK UNIFIED IDEOGRAPH
0x9495	0x8236	#CJK UNIFIED IDEOGRAPH
0x9496	0x8584	#CJK UNIFIED IDEOGRAPH
0x9497	0x8FEB	#CJK UNIFIED IDEOGRAPH
0x9498	0x66DD	#CJK UNIFIED IDEOGRAPH
0x9499	0x6F20	#CJK UNIFIED IDEOGRAPH
0x949A	0x7206	#CJK UNIFIED IDEOGRAPH
0x949B	0x7E1B	#CJK UNIFIED IDEOGRAPH
0x949C	0x83AB	#CJK UNIFIED IDEOGRAPH
0x949D	0x99C1	#CJK UNIFIED IDEOGRAPH
0x949E	0x9EA6	#CJK UNIFIED IDEOGRAPH
0x949F	0x51FD	#CJK UNIFIED IDEOGRAPH
0x94A0	0x7BB1	#CJK UNIFIED IDEOGRAPH
0x94A1	0x7872	#CJK UNIFIED IDEOGRAPH
0x94A2	0x7BB8	#CJK UNIFIED IDEOGRAPH
0x94A3	0x8087	#CJK UNIFIED IDEOGRAPH
0x94A4	0x7B48	#CJK UNIFIED IDEOGRAPH
0x94A5	0x6AE8	#CJK UNIFIED IDEOGRAPH
0x94A6	0x5E61	#CJK UNIFIED IDEOGRAPH
0x94A7	0x808C	#CJK UNIFIED IDEOGRAPH
0x94A8	0x7551	#CJK UNIFIED IDEOGRAPH
0x94A9	0x7560	#CJK UNIFIED IDEOGRAPH
0x94AA	0x516B	#CJK UNIFIED IDEOGRAPH
0x94AB	0x9262	#CJK UNIFIED IDEOGRAPH
0x94AC	0x6E8C	#CJK UNIFIED IDEOGRAPH
0x94AD	0x767A	#CJK UNIFIED IDEOGRAPH
0x94AE	0x9197	#CJK UNIFIED IDEOGRAPH
0x94AF	0x9AEA	#CJK UNIFIED IDEOGRAPH
0x94B0	0x4F10	#CJK UNIFIED IDEOGRAPH
0x94B1	0x7F70	#CJK UNIFIED IDEOGRAPH
0x94B2	0x629C	#CJK UNIFIED IDEOGRAPH
0x94B3	0x7B4F	#CJK UNIFIED IDEOGRAPH
0x94B4	0x95A5	#CJK UNIFIED IDEOGRAPH
0x94B5	0x9CE9	#CJK UNIFIED IDEOGRAPH
0x94B6	0x567A	#CJK UNIFIED IDEOGRAPH
0x94B7	0x5859	#CJK UNIFIED IDEOGRAPH
0x94B8	0x86E4	#CJK UNIFIED IDEOGRAPH
0x94B9	0x96BC	#CJK UNIFIED IDEOGRAPH
0x94BA	0x4F34	#CJK UNIFIED IDEOGRAPH
0x94BB	0x5224	#CJK UNIFIED IDEOGRAPH
0x94BC	0x534A	#CJK UNIFIED IDEOGRAPH
0x94BD	0x53CD	#CJK UNIFIED IDEOGRAPH
0x94BE	0x53DB	#CJK UNIFIED IDEOGRAPH
0x94BF	0x5E06	#CJK UNIFIED IDEOGRAPH
0x94C0	0x642C	#CJK UNIFIED IDEOGRAPH
0x94C1	0x6591	#CJK UNIFIED IDEOGRAPH
0x94C2	0x677F	#CJK UNIFIED IDEOGRAPH
0x94C3	0x6C3E	#CJK UNIFIED IDEOGRAPH
0x94C4	0x6C4E	#CJK UNIFIED IDEOGRAPH
0x94C5	0x7248	#CJK UNIFIED IDEOGRAPH
0x94C6	0x72AF	#CJK UNIFIED IDEOGRAPH
0x94C7	0x73ED	#CJK UNIFIED IDEOGRAPH
0x94C8	0x7554	#CJK UNIFIED IDEOGRAPH
0x94C9	0x7E41	#CJK UNIFIED IDEOGRAPH
0x94CA	0x822C	#CJK UNIFIED IDEOGRAPH
0x94CB	0x85E9	#CJK UNIFIED IDEOGRAPH
0x94CC	0x8CA9	#CJK UNIFIED IDEOGRAPH
0x94CD	0x7BC4	#CJK UNIFIED IDEOGRAPH
0x94CE	0x91C6	#CJK UNIFIED IDEOGRAPH
0x94CF	0x7169	#CJK UNIFIED IDEOGRAPH
0x94D0	0x9812	#CJK UNIFIED IDEOGRAPH
0x94D1	0x98EF	#CJK UNIFIED IDEOGRAPH
0x94D2	0x633D	#CJK UNIFIED IDEOGRAPH
0x94D3	0x6669	#CJK UNIFIED IDEOGRAPH
0x94D4	0x756A	#CJK UNIFIED IDEOGRAPH
0x94D5	0x76E4	#CJK UNIFIED IDEOGRAPH
0x94D6	0x78D0	#CJK UNIFIED IDEOGRAPH
0x94D7	0x8543	#CJK UNIFIED IDEOGRAPH
0x94D8	0x86EE	#CJK UNIFIED IDEOGRAPH
0x94D9	0x532A	#CJK UNIFIED IDEOGRAPH
0x94DA	0x5351	#CJK UNIFIED IDEOGRAPH
0x94DB	0x5426	#CJK UNIFIED IDEOGRAPH
0x94DC	0x5983	#CJK UNIFIED IDEOGRAPH
0x94DD	0x5E87	#CJK UNIFIED IDEOGRAPH
0x94DE	0x5F7C	#CJK UNIFIED IDEOGRAPH
0x94DF	0x60B2	#CJK UNIFIED IDEOGRAPH
0x94E0	0x6249	#CJK UNIFIED IDEOGRAPH
0x94E1	0x6279	#CJK UNIFIED IDEOGRAPH
0x94E2	0x62AB	#CJK UNIFIED IDEOGRAPH
0x94E3	0x6590	#CJK UNIFIED IDEOGRAPH
0x94E4	0x6BD4	#CJK UNIFIED IDEOGRAPH
0x94E5	0x6CCC	#CJK UNIFIED IDEOGRAPH
0x94E6	0x75B2	#CJK UNIFIED IDEOGRAPH
0x94E7	0x76AE	#CJK UNIFIED IDEOGRAPH
0x94E8	0x7891	#CJK UNIFIED IDEOGRAPH
0x94E9	0x79D8	#CJK UNIFIED IDEOGRAPH
0x94EA	0x7DCB	#CJK UNIFIED IDEOGRAPH
0x94EB	0x7F77	#CJK UNIFIED IDEOGRAPH
0x94EC	0x80A5	#CJK UNIFIED IDEOGRAPH
0x94ED	0x88AB	#CJK UNIFIED IDEOGRAPH
0x94EE	0x8AB9	#CJK UNIFIED IDEOGRAPH
0x94EF	0x8CBB	#CJK UNIFIED IDEOGRAPH
0x94F0	0x907F	#CJK UNIFIED IDEOGRAPH
0x94F1	0x975E	#CJK UNIFIED IDEOGRAPH
0x94F2	0x98DB	#CJK UNIFIED IDEOGRAPH
0x94F3	0x6A0B	#CJK UNIFIED IDEOGRAPH
0x94F4	0x7C38	#CJK UNIFIED IDEOGRAPH
0x94F5	0x5099	#CJK UNIFIED IDEOGRAPH
0x94F6	0x5C3E	#CJK UNIFIED IDEOGRAPH
0x94F7	0x5FAE	#CJK UNIFIED IDEOGRAPH
0x94F8	0x6787	#CJK UNIFIED IDEOGRAPH
0x94F9	0x6BD8	#CJK UNIFIED IDEOGRAPH
0x94FA	0x7435	#CJK UNIFIED IDEOGRAPH
0x94FB	0x7709	#CJK UNIFIED IDEOGRAPH
0x94FC	0x7F8E	#CJK UNIFIED IDEOGRAPH
0x9540	0x9F3B	#CJK UNIFIED IDEOGRAPH
0x9541	0x67CA	#CJK UNIFIED IDEOGRAPH
0x9542	0x7A17	#CJK UNIFIED IDEOGRAPH
0x9543	0x5339	#CJK UNIFIED IDEOGRAPH
0x9544	0x758B	#CJK UNIFIED IDEOGRAPH
0x9545	0x9AED	#CJK UNIFIED IDEOGRAPH
0x9546	0x5F66	#CJK UNIFIED IDEOGRAPH
0x9547	0x819D	#CJK UNIFIED IDEOGRAPH
0x9548	0x83F1	#CJK UNIFIED IDEOGRAPH
0x9549	0x8098	#CJK UNIFIED IDEOGRAPH
0x954A	0x5F3C	#CJK UNIFIED IDEOGRAPH
0x954B	0x5FC5	#CJK UNIFIED IDEOGRAPH
0x954C	0x7562	#CJK UNIFIED IDEOGRAPH
0x954D	0x7B46	#CJK UNIFIED IDEOGRAPH
0x954E	0x903C	#CJK UNIFIED IDEOGRAPH
0x954F	0x6867	#CJK UNIFIED IDEOGRAPH
0x9550	0x59EB	#CJK UNIFIED IDEOGRAPH
0x9551	0x5A9B	#CJK UNIFIED IDEOGRAPH
0x9552	0x7D10	#CJK UNIFIED IDEOGRAPH
0x9553	0x767E	#CJK UNIFIED IDEOGRAPH
0x9554	0x8B2C	#CJK UNIFIED IDEOGRAPH
0x9555	0x4FF5	#CJK UNIFIED IDEOGRAPH
0x9556	0x5F6A	#CJK UNIFIED IDEOGRAPH
0x9557	0x6A19	#CJK UNIFIED IDEOGRAPH
0x9558	0x6C37	#CJK UNIFIED IDEOGRAPH
0x9559	0x6F02	#CJK UNIFIED IDEOGRAPH
0x955A	0x74E2	#CJK UNIFIED IDEOGRAPH
0x955B	0x7968	#CJK UNIFIED IDEOGRAPH
0x955C	0x8868	#CJK UNIFIED IDEOGRAPH
0x955D	0x8A55	#CJK UNIFIED IDEOGRAPH
0x955E	0x8C79	#CJK UNIFIED IDEOGRAPH
0x955F	0x5EDF	#CJK UNIFIED IDEOGRAPH
0x9560	0x63CF	#CJK UNIFIED IDEOGRAPH
0x9561	0x75C5	#CJK UNIFIED IDEOGRAPH
0x9562	0x79D2	#CJK UNIFIED IDEOGRAPH
0x9563	0x82D7	#CJK UNIFIED IDEOGRAPH
0x9564	0x9328	#CJK UNIFIED IDEOGRAPH
0x9565	0x92F2	#CJK UNIFIED IDEOGRAPH
0x9566	0x849C	#CJK UNIFIED IDEOGRAPH
0x9567	0x86ED	#CJK UNIFIED IDEOGRAPH
0x9568	0x9C2D	#CJK UNIFIED IDEOGRAPH
0x9569	0x54C1	#CJK UNIFIED IDEOGRAPH
0x956A	0x5F6C	#CJK UNIFIED IDEOGRAPH
0x956B	0x658C	#CJK UNIFIED IDEOGRAPH
0x956C	0x6D5C	#CJK UNIFIED IDEOGRAPH
0x956D	0x7015	#CJK UNIFIED IDEOGRAPH
0x956E	0x8CA7	#CJK UNIFIED IDEOGRAPH
0x956F	0x8CD3	#CJK UNIFIED IDEOGRAPH
0x9570	0x983B	#CJK UNIFIED IDEOGRAPH
0x9571	0x654F	#CJK UNIFIED IDEOGRAPH
0x9572	0x74F6	#CJK UNIFIED IDEOGRAPH
0x9573	0x4E0D	#CJK UNIFIED IDEOGRAPH
0x9574	0x4ED8	#CJK UNIFIED IDEOGRAPH
0x9575	0x57E0	#CJK UNIFIED IDEOGRAPH
0x9576	0x592B	#CJK UNIFIED IDEOGRAPH
0x9577	0x5A66	#CJK UNIFIED IDEOGRAPH
0x9578	0x5BCC	#CJK UNIFIED IDEOGRAPH
0x9579	0x51A8	#CJK UNIFIED IDEOGRAPH
0x957A	0x5E03	#CJK UNIFIED IDEOGRAPH
0x957B	0x5E9C	#CJK UNIFIED IDEOGRAPH
0x957C	0x6016	#CJK UNIFIED IDEOGRAPH
0x957D	0x6276	#CJK UNIFIED IDEOGRAPH
0x957E	0x6577	#CJK UNIFIED IDEOGRAPH
0x9580	0x65A7	#CJK UNIFIED IDEOGRAPH
0x9581	0x666E	#CJK UNIFIED IDEOGRAPH
0x9582	0x6D6E	#CJK UNIFIED IDEOGRAPH
0x9583	0x7236	#CJK UNIFIED IDEOGRAPH
0x9584	0x7B26	#CJK UNIFIED IDEOGRAPH
0x9585	0x8150	#CJK UNIFIED IDEOGRAPH
0x9586	0x819A	#CJK UNIFIED IDEOGRAPH
0x9587	0x8299	#CJK UNIFIED IDEOGRAPH
0x9588	0x8B5C	#CJK UNIFIED IDEOGRAPH
0x9589	0x8CA0	#CJK UNIFIED IDEOGRAPH
0x958A	0x8CE6	#CJK UNIFIED IDEOGRAPH
0x958B	0x8D74	#CJK UNIFIED IDEOGRAPH
0x958C	0x961C	#CJK UNIFIED IDEOGRAPH
0x958D	0x9644	#CJK UNIFIED IDEOGRAPH
0x958E	0x4FAE	#CJK UNIFIED IDEOGRAPH
0x958F	0x64AB	#CJK UNIFIED IDEOGRAPH
0x9590	0x6B66	#CJK UNIFIED IDEOGRAPH
0x9591	0x821E	#CJK UNIFIED IDEOGRAPH
0x9592	0x8461	#CJK UNIFIED IDEOGRAPH
0x9593	0x856A	#CJK UNIFIED IDEOGRAPH
0x9594	0x90E8	#CJK UNIFIED IDEOGRAPH
0x9595	0x5C01	#CJK UNIFIED IDEOGRAPH
0x9596	0x6953	#CJK UNIFIED IDEOGRAPH
0x9597	0x98A8	#CJK UNIFIED IDEOGRAPH
0x9598	0x847A	#CJK UNIFIED IDEOGRAPH
0x9599	0x8557	#CJK UNIFIED IDEOGRAPH
0x959A	0x4F0F	#CJK UNIFIED IDEOGRAPH
0x959B	0x526F	#CJK UNIFIED IDEOGRAPH
0x959C	0x5FA9	#CJK UNIFIED IDEOGRAPH
0x959D	0x5E45	#CJK UNIFIED IDEOGRAPH
0x959E	0x670D	#CJK UNIFIED IDEOGRAPH
0x959F	0x798F	#CJK UNIFIED IDEOGRAPH
0x95A0	0x8179	#CJK UNIFIED IDEOGRAPH
0x95A1	0x8907	#CJK UNIFIED IDEOGRAPH
0x95A2	0x8986	#CJK UNIFIED IDEOGRAPH
0x95A3	0x6DF5	#CJK UNIFIED IDEOGRAPH
0x95A4	0x5F17	#CJK UNIFIED IDEOGRAPH
0x95A5	0x6255	#CJK UNIFIED IDEOGRAPH
0x95A6	0x6CB8	#CJK UNIFIED IDEOGRAPH
0x95A7	0x4ECF	#CJK UNIFIED IDEOGRAPH
0x95A8	0x7269	#CJK UNIFIED IDEOGRAPH
0x95A9	0x9B92	#CJK UNIFIED IDEOGRAPH
0x95AA	0x5206	#CJK UNIFIED IDEOGRAPH
0x95AB	0x543B	#CJK UNIFIED IDEOGRAPH
0x95AC	0x5674	#CJK UNIFIED IDEOGRAPH
0x95AD	0x58B3	#CJK UNIFIED IDEOGRAPH
0x95AE	0x61A4	#CJK UNIFIED IDEOGRAPH
0x95AF	0x626E	#CJK UNIFIED IDEOGRAPH
0x95B0	0x711A	#CJK UNIFIED IDEOGRAPH
0x95B1	0x596E	#CJK UNIFIED IDEOGRAPH
0x95B2	0x7C89	#CJK UNIFIED IDEOGRAPH
0x95B3	0x7CDE	#CJK UNIFIED IDEOGRAPH
0x95B4	0x7D1B	#CJK UNIFIED IDEOGRAPH
0x95B5	0x96F0	#CJK UNIFIED IDEOGRAPH
0x95B6	0x6587	#CJK UNIFIED IDEOGRAPH
0x95B7	0x805E	#CJK UNIFIED IDEOGRAPH
0x95B8	0x4E19	#CJK UNIFIED IDEOGRAPH
0x95B9	0x4F75	#CJK UNIFIED IDEOGRAPH
0x95BA	0x5175	#CJK UNIFIED IDEOGRAPH
0x95BB	0x5840	#CJK UNIFIED IDEOGRAPH
0x95BC	0x5E63	#CJK UNIFIED IDEOGRAPH
0x95BD	0x5E73	#CJK UNIFIED IDEOGRAPH
0x95BE	0x5F0A	#CJK UNIFIED IDEOGRAPH
0x95BF	0x67C4	#CJK UNIFIED IDEOGRAPH
0x95C0	0x4E26	#CJK UNIFIED IDEOGRAPH
0x95C1	0x853D	#CJK UNIFIED IDEOGRAPH
0x95C2	0x9589	#CJK UNIFIED IDEOGRAPH
0x95C3	0x965B	#CJK UNIFIED IDEOGRAPH
0x95C4	0x7C73	#CJK UNIFIED IDEOGRAPH
0x95C5	0x9801	#CJK UNIFIED IDEOGRAPH
0x95C6	0x50FB	#CJK UNIFIED IDEOGRAPH
0x95C7	0x58C1	#CJK UNIFIED IDEOGRAPH
0x95C8	0x7656	#CJK UNIFIED IDEOGRAPH
0x95C9	0x78A7	#CJK UNIFIED IDEOGRAPH
0x95CA	0x5225	#CJK UNIFIED IDEOGRAPH
0x95CB	0x77A5	#CJK UNIFIED IDEOGRAPH
0x95CC	0x8511	#CJK UNIFIED IDEOGRAPH
0x95CD	0x7B86	#CJK UNIFIED IDEOGRAPH
0x95CE	0x504F	#CJK UNIFIED IDEOGRAPH
0x95CF	0x5909	#CJK UNIFIED IDEOGRAPH
0x95D0	0x7247	#CJK UNIFIED IDEOGRAPH
0x95D1	0x7BC7	#CJK UNIFIED IDEOGRAPH
0x95D2	0x7DE8	#CJK UNIFIED IDEOGRAPH
0x95D3	0x8FBA	#CJK UNIFIED IDEOGRAPH
0x95D4	0x8FD4	#CJK UNIFIED IDEOGRAPH
0x95D5	0x904D	#CJK UNIFIED IDEOGRAPH
0x95D6	0x4FBF	#CJK UNIFIED IDEOGRAPH
0x95D7	0x52C9	#CJK UNIFIED IDEOGRAPH
0x95D8	0x5A29	#CJK UNIFIED IDEOGRAPH
0x95D9	0x5F01	#CJK UNIFIED IDEOGRAPH
0x95DA	0x97AD	#CJK UNIFIED IDEOGRAPH
0x95DB	0x4FDD	#CJK UNIFIED IDEOGRAPH
0x95DC	0x8217	#CJK UNIFIED IDEOGRAPH
0x95DD	0x92EA	#CJK UNIFIED IDEOGRAPH
0x95DE	0x5703	#CJK UNIFIED IDEOGRAPH
0x95DF	0x6355	#CJK UNIFIED IDEOGRAPH
0x95E0	0x6B69	#CJK UNIFIED IDEOGRAPH
0x95E1	0x752B	#CJK UNIFIED IDEOGRAPH
0x95E2	0x88DC	#CJK UNIFIED IDEOGRAPH
0x95E3	0x8F14	#CJK UNIFIED IDEOGRAPH
0x95E4	0x7A42	#CJK UNIFIED IDEOGRAPH
0x95E5	0x52DF	#CJK UNIFIED IDEOGRAPH
0x95E6	0x5893	#CJK UNIFIED IDEOGRAPH
0x95E7	0x6155	#CJK UNIFIED IDEOGRAPH
0x95E8	0x620A	#CJK UNIFIED IDEOGRAPH
0x95E9	0x66AE	#CJK UNIFIED IDEOGRAPH
0x95EA	0x6BCD	#CJK UNIFIED IDEOGRAPH
0x95EB	0x7C3F	#CJK UNIFIED IDEOGRAPH
0x95EC	0x83E9	#CJK UNIFIED IDEOGRAPH
0x95ED	0x5023	#CJK UNIFIED IDEOGRAPH
0x95EE	0x4FF8	#CJK UNIFIED IDEOGRAPH
0x95EF	0x5305	#CJK UNIFIED IDEOGRAPH
0x95F0	0x5446	#CJK UNIFIED IDEOGRAPH
0x95F1	0x5831	#CJK UNIFIED IDEOGRAPH
0x95F2	0x5949	#CJK UNIFIED IDEOGRAPH
0x95F3	0x5B9D	#CJK UNIFIED IDEOGRAPH
0x95F4	0x5CF0	#CJK UNIFIED IDEOGRAPH
0x95F5	0x5CEF	#CJK UNIFIED IDEOGRAPH
0x95F6	0x5D29	#CJK UNIFIED IDEOGRAPH
0x95F7	0x5E96	#CJK UNIFIED IDEOGRAPH
0x95F8	0x62B1	#CJK UNIFIED IDEOGRAPH
0x95F9	0x6367	#CJK UNIFIED IDEOGRAPH
0x95FA	0x653E	#CJK UNIFIED IDEOGRAPH
0x95FB	0x65B9	#CJK UNIFIED IDEOGRAPH
0x95FC	0x670B	#CJK UNIFIED IDEOGRAPH
0x9640	0x6CD5	#CJK UNIFIED IDEOGRAPH
0x9641	0x6CE1	#CJK UNIFIED IDEOGRAPH
0x9642	0x70F9	#CJK UNIFIED IDEOGRAPH
0x9643	0x7832	#CJK UNIFIED IDEOGRAPH
0x9644	0x7E2B	#CJK UNIFIED IDEOGRAPH
0x9645	0x80DE	#CJK UNIFIED IDEOGRAPH
0x9646	0x82B3	#CJK UNIFIED IDEOGRAPH
0x9647	0x840C	#CJK UNIFIED IDEOGRAPH
0x9648	0x84EC	#CJK UNIFIED IDEOGRAPH
0x9649	0x8702	#CJK UNIFIED IDEOGRAPH
0x964A	0x8912	#CJK UNIFIED IDEOGRAPH
0x964B	0x8A2A	#CJK UNIFIED IDEOGRAPH
0x964C	0x8C4A	#CJK UNIFIED IDEOGRAPH
0x964D	0x90A6	#CJK UNIFIED IDEOGRAPH
0x964E	0x92D2	#CJK UNIFIED IDEOGRAPH
0x964F	0x98FD	#CJK UNIFIED IDEOGRAPH
0x9650	0x9CF3	#CJK UNIFIED IDEOGRAPH
0x9651	0x9D6C	#CJK UNIFIED IDEOGRAPH
0x9652	0x4E4F	#CJK UNIFIED IDEOGRAPH
0x9653	0x4EA1	#CJK UNIFIED IDEOGRAPH
0x9654	0x508D	#CJK UNIFIED IDEOGRAPH
0x9655	0x5256	#CJK UNIFIED IDEOGRAPH
0x9656	0x574A	#CJK UNIFIED IDEOGRAPH
0x9657	0x59A8	#CJK UNIFIED IDEOGRAPH
0x9658	0x5E3D	#CJK UNIFIED IDEOGRAPH
0x9659	0x5FD8	#CJK UNIFIED IDEOGRAPH
0x965A	0x5FD9	#CJK UNIFIED IDEOGRAPH
0x965B	0x623F	#CJK UNIFIED IDEOGRAPH
0x965C	0x66B4	#CJK UNIFIED IDEOGRAPH
0x965D	0x671B	#CJK UNIFIED IDEOGRAPH
0x965E	0x67D0	#CJK UNIFIED IDEOGRAPH
0x965F	0x68D2	#CJK UNIFIED IDEOGRAPH
0x9660	0x5192	#CJK UNIFIED IDEOGRAPH
0x9661	0x7D21	#CJK UNIFIED IDEOGRAPH
0x9662	0x80AA	#CJK UNIFIED IDEOGRAPH
0x9663	0x81A8	#CJK UNIFIED IDEOGRAPH
0x9664	0x8B00	#CJK UNIFIED IDEOGRAPH
0x9665	0x8C8C	#CJK UNIFIED IDEOGRAPH
0x9666	0x8CBF	#CJK UNIFIED IDEOGRAPH
0x9667	0x927E	#CJK UNIFIED IDEOGRAPH
0x9668	0x9632	#CJK UNIFIED IDEOGRAPH
0x9669	0x5420	#CJK UNIFIED IDEOGRAPH
0x966A	0x982C	#CJK UNIFIED IDEOGRAPH
0x966B	0x5317	#CJK UNIFIED IDEOGRAPH
0x966C	0x50D5	#CJK UNIFIED IDEOGRAPH
0x966D	0x535C	#CJK UNIFIED IDEOGRAPH
0x966E	0x58A8	#CJK UNIFIED IDEOGRAPH
0x966F	0x64B2	#CJK UNIFIED IDEOGRAPH
0x9670	0x6734	#CJK UNIFIED IDEOGRAPH
0x9671	0x7267	#CJK UNIFIED IDEOGRAPH
0x9672	0x7766	#CJK UNIFIED IDEOGRAPH
0x9673	0x7A46	#CJK UNIFIED IDEOGRAPH
0x9674	0x91E6	#CJK UNIFIED IDEOGRAPH
0x9675	0x52C3	#CJK UNIFIED IDEOGRAPH
0x9676	0x6CA1	#CJK UNIFIED IDEOGRAPH
0x9677	0x6B86	#CJK UNIFIED IDEOGRAPH
0x9678	0x5800	#CJK UNIFIED IDEOGRAPH
0x9679	0x5E4C	#CJK UNIFIED IDEOGRAPH
0x967A	0x5954	#CJK UNIFIED IDEOGRAPH
0x967B	0x672C	#CJK UNIFIED IDEOGRAPH
0x967C	0x7FFB	#CJK UNIFIED IDEOGRAPH
0x967D	0x51E1	#CJK UNIFIED IDEOGRAPH
0x967E	0x76C6	#CJK UNIFIED IDEOGRAPH
0x9680	0x6469	#CJK UNIFIED IDEOGRAPH
0x9681	0x78E8	#CJK UNIFIED IDEOGRAPH
0x9682	0x9B54	#CJK UNIFIED IDEOGRAPH
0x9683	0x9EBB	#CJK UNIFIED IDEOGRAPH
0x9684	0x57CB	#CJK UNIFIED IDEOGRAPH
0x9685	0x59B9	#CJK UNIFIED IDEOGRAPH
0x9686	0x6627	#CJK UNIFIED IDEOGRAPH
0x9687	0x679A	#CJK UNIFIED IDEOGRAPH
0x9688	0x6BCE	#CJK UNIFIED IDEOGRAPH
0x9689	0x54E9	#CJK UNIFIED IDEOGRAPH
0x968A	0x69D9	#CJK UNIFIED IDEOGRAPH
0x968B	0x5E55	#CJK UNIFIED IDEOGRAPH
0x968C	0x819C	#CJK UNIFIED IDEOGRAPH
0x968D	0x6795	#CJK UNIFIED IDEOGRAPH
0x968E	0x9BAA	#CJK UNIFIED IDEOGRAPH
0x968F	0x67FE	#CJK UNIFIED IDEOGRAPH
0x9690	0x9C52	#CJK UNIFIED IDEOGRAPH
0x9691	0x685D	#CJK UNIFIED IDEOGRAPH
0x9692	0x4EA6	#CJK UNIFIED IDEOGRAPH
0x9693	0x4FE3	#CJK UNIFIED IDEOGRAPH
0x9694	0x53C8	#CJK UNIFIED IDEOGRAPH
0x9695	0x62B9	#CJK UNIFIED IDEOGRAPH
0x9696	0x672B	#CJK UNIFIED IDEOGRAPH
0x9697	0x6CAB	#CJK UNIFIED IDEOGRAPH
0x9698	0x8FC4	#CJK UNIFIED IDEOGRAPH
0x9699	0x4FAD	#CJK UNIFIED IDEOGRAPH
0x969A	0x7E6D	#CJK UNIFIED IDEOGRAPH
0x969B	0x9EBF	#CJK UNIFIED IDEOGRAPH
0x969C	0x4E07	#CJK UNIFIED IDEOGRAPH
0x969D	0x6162	#CJK UNIFIED IDEOGRAPH
0x969E	0x6E80	#CJK UNIFIED IDEOGRAPH
0x969F	0x6F2B	#CJK UNIFIED IDEOGRAPH
0x96A0	0x8513	#CJK UNIFIED IDEOGRAPH
0x96A1	0x5473	#CJK UNIFIED IDEOGRAPH
0x96A2	0x672A	#CJK UNIFIED IDEOGRAPH
0x96A3	0x9B45	#CJK UNIFIED IDEOGRAPH
0x96A4	0x5DF3	#CJK UNIFIED IDEOGRAPH
0x96A5	0x7B95	#CJK UNIFIED IDEOGRAPH
0x96A6	0x5CAC	#CJK UNIFIED IDEOGRAPH
0x96A7	0x5BC6	#CJK UNIFIED IDEOGRAPH
0x96A8	0x871C	#CJK UNIFIED IDEOGRAPH
0x96A9	0x6E4A	#CJK UNIFIED IDEOGRAPH
0x96AA	0x84D1	#CJK UNIFIED IDEOGRAPH
0x96AB	0x7A14	#CJK UNIFIED IDEOGRAPH
0x96AC	0x8108	#CJK UNIFIED IDEOGRAPH
0x96AD	0x5999	#CJK UNIFIED IDEOGRAPH
0x96AE	0x7C8D	#CJK UNIFIED IDEOGRAPH
0x96AF	0x6C11	#CJK UNIFIED IDEOGRAPH
0x96B0	0x7720	#CJK UNIFIED IDEOGRAPH
0x96B1	0x52D9	#CJK UNIFIED IDEOGRAPH
0x96B2	0x5922	#CJK UNIFIED IDEOGRAPH
0x96B3	0x7121	#CJK UNIFIED IDEOGRAPH
0x96B4	0x725F	#CJK UNIFIED IDEOGRAPH
0x96B5	0x77DB	#CJK UNIFIED IDEOGRAPH
0x96B6	0x9727	#CJK UNIFIED IDEOGRAPH
0x96B7	0x9D61	#CJK UNIFIED IDEOGRAPH
0x96B8	0x690B	#CJK UNIFIED IDEOGRAPH
0x96B9	0x5A7F	#CJK UNIFIED IDEOGRAPH
0x96BA	0x5A18	#CJK UNIFIED IDEOGRAPH
0x96BB	0x51A5	#CJK UNIFIED IDEOGRAPH
0x96BC	0x540D	#CJK UNIFIED IDEOGRAPH
0x96BD	0x547D	#CJK UNIFIED IDEOGRAPH
0x96BE	0x660E	#CJK UNIFIED IDEOGRAPH
0x96BF	0x76DF	#CJK UNIFIED IDEOGRAPH
0x96C0	0x8FF7	#CJK UNIFIED IDEOGRAPH
0x96C1	0x9298	#CJK UNIFIED IDEOGRAPH
0x96C2	0x9CF4	#CJK UNIFIED IDEOGRAPH
0x96C3	0x59EA	#CJK UNIFIED IDEOGRAPH
0x96C4	0x725D	#CJK UNIFIED IDEOGRAPH
0x96C5	0x6EC5	#CJK UNIFIED IDEOGRAPH
0x96C6	0x514D	#CJK UNIFIED IDEOGRAPH
0x96C7	0x68C9	#CJK UNIFIED IDEOGRAPH
0x96C8	0x7DBF	#CJK UNIFIED IDEOGRAPH
0x96C9	0x7DEC	#CJK UNIFIED IDEOGRAPH
0x96CA	0x9762	#CJK UNIFIED IDEOGRAPH
0x96CB	0x9EBA	#CJK UNIFIED IDEOGRAPH
0x96CC	0x6478	#CJK UNIFIED IDEOGRAPH
0x96CD	0x6A21	#CJK UNIFIED IDEOGRAPH
0x96CE	0x8302	#CJK UNIFIED IDEOGRAPH
0x96CF	0x5984	#CJK UNIFIED IDEOGRAPH
0x96D0	0x5B5F	#CJK UNIFIED IDEOGRAPH
0x96D1	0x6BDB	#CJK UNIFIED IDEOGRAPH
0x96D2	0x731B	#CJK UNIFIED IDEOGRAPH
0x96D3	0x76F2	#CJK UNIFIED IDEOGRAPH
0x96D4	0x7DB2	#CJK UNIFIED IDEOGRAPH
0x96D5	0x8017	#CJK UNIFIED IDEOGRAPH
0x96D6	0x8499	#CJK UNIFIED IDEOGRAPH
0x96D7	0x5132	#CJK UNIFIED IDEOGRAPH
0x96D8	0x6728	#CJK UNIFIED IDEOGRAPH
0x96D9	0x9ED9	#CJK UNIFIED IDEOGRAPH
0x96DA	0x76EE	#CJK UNIFIED IDEOGRAPH
0x96DB	0x6762	#CJK UNIFIED IDEOGRAPH
0x96DC	0x52FF	#CJK UNIFIED IDEOGRAPH
0x96DD	0x9905	#CJK UNIFIED IDEOGRAPH
0x96DE	0x5C24	#CJK UNIFIED IDEOGRAPH
0x96DF	0x623B	#CJK UNIFIED IDEOGRAPH
0x96E0	0x7C7E	#CJK UNIFIED IDEOGRAPH
0x96E1	0x8CB0	#CJK UNIFIED IDEOGRAPH
0x96E2	0x554F	#CJK UNIFIED IDEOGRAPH
0x96E3	0x60B6	#CJK UNIFIED IDEOGRAPH
0x96E4	0x7D0B	#CJK UNIFIED IDEOGRAPH
0x96E5	0x9580	#CJK UNIFIED IDEOGRAPH
0x96E6	0x5301	#CJK UNIFIED IDEOGRAPH
0x96E7	0x4E5F	#CJK UNIFIED IDEOGRAPH
0x96E8	0x51B6	#CJK UNIFIED IDEOGRAPH
0x96E9	0x591C	#CJK UNIFIED IDEOGRAPH
0x96EA	0x723A	#CJK UNIFIED IDEOGRAPH
0x96EB	0x8036	#CJK UNIFIED IDEOGRAPH
0x96EC	0x91CE	#CJK UNIFIED IDEOGRAPH
0x96ED	0x5F25	#CJK UNIFIED IDEOGRAPH
0x96EE	0x77E2	#CJK UNIFIED IDEOGRAPH
0x96EF	0x5384	#CJK UNIFIED IDEOGRAPH
0x96F0	0x5F79	#CJK UNIFIED IDEOGRAPH
0x96F1	0x7D04	#CJK UNIFIED IDEOGRAPH
0x96F2	0x85AC	#CJK UNIFIED IDEOGRAPH
0x96F3	0x8A33	#CJK UNIFIED IDEOGRAPH
0x96F4	0x8E8D	#CJK UNIFIED IDEOGRAPH
0x96F5	0x9756	#CJK UNIFIED IDEOGRAPH
0x96F6	0x67F3	#CJK UNIFIED IDEOGRAPH
0x96F7	0x85AE	#CJK UNIFIED IDEOGRAPH
0x96F8	0x9453	#CJK UNIFIED IDEOGRAPH
0x96F9	0x6109	#CJK UNIFIED IDEOGRAPH
0x96FA	0x6108	#CJK UNIFIED IDEOGRAPH
0x96FB	0x6CB9	#CJK UNIFIED IDEOGRAPH
0x96FC	0x7652	#CJK UNIFIED IDEOGRAPH
0x9740	0x8AED	#CJK UNIFIED IDEOGRAPH
0x9741	0x8F38	#CJK UNIFIED IDEOGRAPH
0x9742	0x552F	#CJK UNIFIED IDEOGRAPH
0x9743	0x4F51	#CJK UNIFIED IDEOGRAPH
0x9744	0x512A	#CJK UNIFIED IDEOGRAPH
0x9745	0x52C7	#CJK UNIFIED IDEOGRAPH
0x9746	0x53CB	#CJK UNIFIED IDEOGRAPH
0x9747	0x5BA5	#CJK UNIFIED IDEOGRAPH
0x9748	0x5E7D	#CJK UNIFIED IDEOGRAPH
0x9749	0x60A0	#CJK UNIFIED IDEOGRAPH
0x974A	0x6182	#CJK UNIFIED IDEOGRAPH
0x974B	0x63D6	#CJK UNIFIED IDEOGRAPH
0x974C	0x6709	#CJK UNIFIED IDEOGRAPH
0x974D	0x67DA	#CJK UNIFIED IDEOGRAPH
0x974E	0x6E67	#CJK UNIFIED IDEOGRAPH
0x974F	0x6D8C	#CJK UNIFIED IDEOGRAPH
0x9750	0x7336	#CJK UNIFIED IDEOGRAPH
0x9751	0x7337	#CJK UNIFIED IDEOGRAPH
0x9752	0x7531	#CJK UNIFIED IDEOGRAPH
0x9753	0x7950	#CJK UNIFIED IDEOGRAPH
0x9754	0x88D5	#CJK UNIFIED IDEOGRAPH
0x9755	0x8A98	#CJK UNIFIED IDEOGRAPH
0x9756	0x904A	#CJK UNIFIED IDEOGRAPH
0x9757	0x9091	#CJK UNIFIED IDEOGRAPH
0x9758	0x90F5	#CJK UNIFIED IDEOGRAPH
0x9759	0x96C4	#CJK UNIFIED IDEOGRAPH
0x975A	0x878D	#CJK UNIFIED IDEOGRAPH
0x975B	0x5915	#CJK UNIFIED IDEOGRAPH
0x975C	0x4E88	#CJK UNIFIED IDEOGRAPH
0x975D	0x4F59	#CJK UNIFIED IDEOGRAPH
0x975E	0x4E0E	#CJK UNIFIED IDEOGRAPH
0x975F	0x8A89	#CJK UNIFIED IDEOGRAPH
0x9760	0x8F3F	#CJK UNIFIED IDEOGRAPH
0x9761	0x9810	#CJK UNIFIED IDEOGRAPH
0x9762	0x50AD	#CJK UNIFIED IDEOGRAPH
0x9763	0x5E7C	#CJK UNIFIED IDEOGRAPH
0x9764	0x5996	#CJK UNIFIED IDEOGRAPH
0x9765	0x5BB9	#CJK UNIFIED IDEOGRAPH
0x9766	0x5EB8	#CJK UNIFIED IDEOGRAPH
0x9767	0x63DA	#CJK UNIFIED IDEOGRAPH
0x9768	0x63FA	#CJK UNIFIED IDEOGRAPH
0x9769	0x64C1	#CJK UNIFIED IDEOGRAPH
0x976A	0x66DC	#CJK UNIFIED IDEOGRAPH
0x976B	0x694A	#CJK UNIFIED IDEOGRAPH
0x976C	0x69D8	#CJK UNIFIED IDEOGRAPH
0x976D	0x6D0B	#CJK UNIFIED IDEOGRAPH
0x976E	0x6EB6	#CJK UNIFIED IDEOGRAPH
0x976F	0x7194	#CJK UNIFIED IDEOGRAPH
0x9770	0x7528	#CJK UNIFIED IDEOGRAPH
0x9771	0x7AAF	#CJK UNIFIED IDEOGRAPH
0x9772	0x7F8A	#CJK UNIFIED IDEOGRAPH
0x9773	0x8000	#CJK UNIFIED IDEOGRAPH
0x9774	0x8449	#CJK UNIFIED IDEOGRAPH
0x9775	0x84C9	#CJK UNIFIED IDEOGRAPH
0x9776	0x8981	#CJK UNIFIED IDEOGRAPH
0x9777	0x8B21	#CJK UNIFIED IDEOGRAPH
0x9778	0x8E0A	#CJK UNIFIED IDEOGRAPH
0x9779	0x9065	#CJK UNIFIED IDEOGRAPH
0x977A	0x967D	#CJK UNIFIED IDEOGRAPH
0x977B	0x990A	#CJK UNIFIED IDEOGRAPH
0x977C	0x617E	#CJK UNIFIED IDEOGRAPH
0x977D	0x6291	#CJK UNIFIED IDEOGRAPH
0x977E	0x6B32	#CJK UNIFIED IDEOGRAPH
0x9780	0x6C83	#CJK UNIFIED IDEOGRAPH
0x9781	0x6D74	#CJK UNIFIED IDEOGRAPH
0x9782	0x7FCC	#CJK UNIFIED IDEOGRAPH
0x9783	0x7FFC	#CJK UNIFIED IDEOGRAPH
0x9784	0x6DC0	#CJK UNIFIED IDEOGRAPH
0x9785	0x7F85	#CJK UNIFIED IDEOGRAPH
0x9786	0x87BA	#CJK UNIFIED IDEOGRAPH
0x9787	0x88F8	#CJK UNIFIED IDEOGRAPH
0x9788	0x6765	#CJK UNIFIED IDEOGRAPH
0x9789	0x83B1	#CJK UNIFIED IDEOGRAPH
0x978A	0x983C	#CJK UNIFIED IDEOGRAPH
0x978B	0x96F7	#CJK UNIFIED IDEOGRAPH
0x978C	0x6D1B	#CJK UNIFIED IDEOGRAPH
0x978D	0x7D61	#CJK UNIFIED IDEOGRAPH
0x978E	0x843D	#CJK UNIFIED IDEOGRAPH
0x978F	0x916A	#CJK UNIFIED IDEOGRAPH
0x9790	0x4E71	#CJK UNIFIED IDEOGRAPH
0x9791	0x5375	#CJK UNIFIED IDEOGRAPH
0x9792	0x5D50	#CJK UNIFIED IDEOGRAPH
0x9793	0x6B04	#CJK UNIFIED IDEOGRAPH
0x9794	0x6FEB	#CJK UNIFIED IDEOGRAPH
0x9795	0x85CD	#CJK UNIFIED IDEOGRAPH
0x9796	0x862D	#CJK UNIFIED IDEOGRAPH
0x9797	0x89A7	#CJK UNIFIED IDEOGRAPH
0x9798	0x5229	#CJK UNIFIED IDEOGRAPH
0x9799	0x540F	#CJK UNIFIED IDEOGRAPH
0x979A	0x5C65	#CJK UNIFIED IDEOGRAPH
0x979B	0x674E	#CJK UNIFIED IDEOGRAPH
0x979C	0x68A8	#CJK UNIFIED IDEOGRAPH
0x979D	0x7406	#CJK UNIFIED IDEOGRAPH
0x979E	0x7483	#CJK UNIFIED IDEOGRAPH
0x979F	0x75E2	#CJK UNIFIED IDEOGRAPH
0x97A0	0x88CF	#CJK UNIFIED IDEOGRAPH
0x97A1	0x88E1	#CJK UNIFIED IDEOGRAPH
0x97A2	0x91CC	#CJK UNIFIED IDEOGRAPH
0x97A3	0x96E2	#CJK UNIFIED IDEOGRAPH
0x97A4	0x9678	#CJK UNIFIED IDEOGRAPH
0x97A5	0x5F8B	#CJK UNIFIED IDEOGRAPH
0x97A6	0x7387	#CJK UNIFIED IDEOGRAPH
0x97A7	0x7ACB	#CJK UNIFIED IDEOGRAPH
0x97A8	0x844E	#CJK UNIFIED IDEOGRAPH
0x97A9	0x63A0	#CJK UNIFIED IDEOGRAPH
0x97AA	0x7565	#CJK UNIFIED IDEOGRAPH
0x97AB	0x5289	#CJK UNIFIED IDEOGRAPH
0x97AC	0x6D41	#CJK UNIFIED IDEOGRAPH
0x97AD	0x6E9C	#CJK UNIFIED IDEOGRAPH
0x97AE	0x7409	#CJK UNIFIED IDEOGRAPH
0x97AF	0x7559	#CJK UNIFIED IDEOGRAPH
0x97B0	0x786B	#CJK UNIFIED IDEOGRAPH
0x97B1	0x7C92	#CJK UNIFIED IDEOGRAPH
0x97B2	0x9686	#CJK UNIFIED IDEOGRAPH
0x97B3	0x7ADC	#CJK UNIFIED IDEOGRAPH
0x97B4	0x9F8D	#CJK UNIFIED IDEOGRAPH
0x97B5	0x4FB6	#CJK UNIFIED IDEOGRAPH
0x97B6	0x616E	#CJK UNIFIED IDEOGRAPH
0x97B7	0x65C5	#CJK UNIFIED IDEOGRAPH
0x97B8	0x865C	#CJK UNIFIED IDEOGRAPH
0x97B9	0x4E86	#CJK UNIFIED IDEOGRAPH
0x97BA	0x4EAE	#CJK UNIFIED IDEOGRAPH
0x97BB	0x50DA	#CJK UNIFIED IDEOGRAPH
0x97BC	0x4E21	#CJK UNIFIED IDEOGRAPH
0x97BD	0x51CC	#CJK UNIFIED IDEOGRAPH
0x97BE	0x5BEE	#CJK UNIFIED IDEOGRAPH
0x97BF	0x6599	#CJK UNIFIED IDEOGRAPH
0x97C0	0x6881	#CJK UNIFIED IDEOGRAPH
0x97C1	0x6DBC	#CJK UNIFIED IDEOGRAPH
0x97C2	0x731F	#CJK UNIFIED IDEOGRAPH
0x97C3	0x7642	#CJK UNIFIED IDEOGRAPH
0x97C4	0x77AD	#CJK UNIFIED IDEOGRAPH
0x97C5	0x7A1C	#CJK UNIFIED IDEOGRAPH
0x97C6	0x7CE7	#CJK UNIFIED IDEOGRAPH
0x97C7	0x826F	#CJK UNIFIED IDEOGRAPH
0x97C8	0x8AD2	#CJK UNIFIED IDEOGRAPH
0x97C9	0x907C	#CJK UNIFIED IDEOGRAPH
0x97CA	0x91CF	#CJK UNIFIED IDEOGRAPH
0x97CB	0x9675	#CJK UNIFIED IDEOGRAPH
0x97CC	0x9818	#CJK UNIFIED IDEOGRAPH
0x97CD	0x529B	#CJK UNIFIED IDEOGRAPH
0x97CE	0x7DD1	#CJK UNIFIED IDEOGRAPH
0x97CF	0x502B	#CJK UNIFIED IDEOGRAPH
0x97D0	0x5398	#CJK UNIFIED IDEOGRAPH
0x97D1	0x6797	#CJK UNIFIED IDEOGRAPH
0x97D2	0x6DCB	#CJK UNIFIED IDEOGRAPH
0x97D3	0x71D0	#CJK UNIFIED IDEOGRAPH
0x97D4	0x7433	#CJK UNIFIED IDEOGRAPH
0x97D5	0x81E8	#CJK UNIFIED IDEOGRAPH
0x97D6	0x8F2A	#CJK UNIFIED IDEOGRAPH
0x97D7	0x96A3	#CJK UNIFIED IDEOGRAPH
0x97D8	0x9C57	#CJK UNIFIED IDEOGRAPH
0x97D9	0x9E9F	#CJK UNIFIED IDEOGRAPH
0x97DA	0x7460	#CJK UNIFIED IDEOGRAPH
0x97DB	0x5841	#CJK UNIFIED IDEOGRAPH
0x97DC	0x6D99	#CJK UNIFIED IDEOGRAPH
0x97DD	0x7D2F	#CJK UNIFIED IDEOGRAPH
0x97DE	0x985E	#CJK UNIFIED IDEOGRAPH
0x97DF	0x4EE4	#CJK UNIFIED IDEOGRAPH
0x97E0	0x4F36	#CJK UNIFIED IDEOGRAPH
0x97E1	0x4F8B	#CJK UNIFIED IDEOGRAPH
0x97E2	0x51B7	#CJK UNIFIED IDEOGRAPH
0x97E3	0x52B1	#CJK UNIFIED IDEOGRAPH
0x97E4	0x5DBA	#CJK UNIFIED IDEOGRAPH
0x97E5	0x601C	#CJK UNIFIED IDEOGRAPH
0x97E6	0x73B2	#CJK UNIFIED IDEOGRAPH
0x97E7	0x793C	#CJK UNIFIED IDEOGRAPH
0x97E8	0x82D3	#CJK UNIFIED IDEOGRAPH
0x97E9	0x9234	#CJK UNIFIED IDEOGRAPH
0x97EA	0x96B7	#CJK UNIFIED IDEOGRAPH
0x97EB	0x96F6	#CJK UNIFIED IDEOGRAPH
0x97EC	0x970A	#CJK UNIFIED IDEOGRAPH
0x97ED	0x9E97	#CJK UNIFIED IDEOGRAPH
0x97EE	0x9F62	#CJK UNIFIED IDEOGRAPH
0x97EF	0x66A6	#CJK UNIFIED IDEOGRAPH
0x97F0	0x6B74	#CJK UNIFIED IDEOGRAPH
0x97F1	0x5217	#CJK UNIFIED IDEOGRAPH
0x97F2	0x52A3	#CJK UNIFIED IDEOGRAPH
0x97F3	0x70C8	#CJK UNIFIED IDEOGRAPH
0x97F4	0x88C2	#CJK UNIFIED IDEOGRAPH
0x97F5	0x5EC9	#CJK UNIFIED IDEOGRAPH
0x97F6	0x604B	#CJK UNIFIED IDEOGRAPH
0x97F7	0x6190	#CJK UNIFIED IDEOGRAPH
0x97F8	0x6F23	#CJK UNIFIED IDEOGRAPH
0x97F9	0x7149	#CJK UNIFIED IDEOGRAPH
0x97FA	0x7C3E	#CJK UNIFIED IDEOGRAPH
0x97FB	0x7DF4	#CJK UNIFIED IDEOGRAPH
0x97FC	0x806F	#CJK UNIFIED IDEOGRAPH
0x9840	0x84EE	#CJK UNIFIED IDEOGRAPH
0x9841	0x9023	#CJK UNIFIED IDEOGRAPH
0x9842	0x932C	#CJK UNIFIED IDEOGRAPH
0x9843	0x5442	#CJK UNIFIED IDEOGRAPH
0x9844	0x9B6F	#CJK UNIFIED IDEOGRAPH
0x9845	0x6AD3	#CJK UNIFIED IDEOGRAPH
0x9846	0x7089	#CJK UNIFIED IDEOGRAPH
0x9847	0x8CC2	#CJK UNIFIED IDEOGRAPH
0x9848	0x8DEF	#CJK UNIFIED IDEOGRAPH
0x9849	0x9732	#CJK UNIFIED IDEOGRAPH
0x984A	0x52B4	#CJK UNIFIED IDEOGRAPH
0x984B	0x5A41	#CJK UNIFIED IDEOGRAPH
0x984C	0x5ECA	#CJK UNIFIED IDEOGRAPH
0x984D	0x5F04	#CJK UNIFIED IDEOGRAPH
0x984E	0x6717	#CJK UNIFIED IDEOGRAPH
0x984F	0x697C	#CJK UNIFIED IDEOGRAPH
0x9850	0x6994	#CJK UNIFIED IDEOGRAPH
0x9851	0x6D6A	#CJK UNIFIED IDEOGRAPH
0x9852	0x6F0F	#CJK UNIFIED IDEOGRAPH
0x9853	0x7262	#CJK UNIFIED IDEOGRAPH
0x9854	0x72FC	#CJK UNIFIED IDEOGRAPH
0x9855	0x7BED	#CJK UNIFIED IDEOGRAPH
0x9856	0x8001	#CJK UNIFIED IDEOGRAPH
0x9857	0x807E	#CJK UNIFIED IDEOGRAPH
0x9858	0x874B	#CJK UNIFIED IDEOGRAPH
0x9859	0x90CE	#CJK UNIFIED IDEOGRAPH
0x985A	0x516D	#CJK UNIFIED IDEOGRAPH
0x985B	0x9E93	#CJK UNIFIED IDEOGRAPH
0x985C	0x7984	#CJK UNIFIED IDEOGRAPH
0x985D	0x808B	#CJK UNIFIED IDEOGRAPH
0x985E	0x9332	#CJK UNIFIED IDEOGRAPH
0x985F	0x8AD6	#CJK UNIFIED IDEOGRAPH
0x9860	0x502D	#CJK UNIFIED IDEOGRAPH
0x9861	0x548C	#CJK UNIFIED IDEOGRAPH
0x9862	0x8A71	#CJK UNIFIED IDEOGRAPH
0x9863	0x6B6A	#CJK UNIFIED IDEOGRAPH
0x9864	0x8CC4	#CJK UNIFIED IDEOGRAPH
0x9865	0x8107	#CJK UNIFIED IDEOGRAPH
0x9866	0x60D1	#CJK UNIFIED IDEOGRAPH
0x9867	0x67A0	#CJK UNIFIED IDEOGRAPH
0x9868	0x9DF2	#CJK UNIFIED IDEOGRAPH
0x9869	0x4E99	#CJK UNIFIED IDEOGRAPH
0x986A	0x4E98	#CJK UNIFIED IDEOGRAPH
0x986B	0x9C10	#CJK UNIFIED IDEOGRAPH
0x986C	0x8A6B	#CJK UNIFIED IDEOGRAPH
0x986D	0x85C1	#CJK UNIFIED IDEOGRAPH
0x986E	0x8568	#CJK UNIFIED IDEOGRAPH
0x986F	0x6900	#CJK UNIFIED IDEOGRAPH
0x9870	0x6E7E	#CJK UNIFIED IDEOGRAPH
0x9871	0x7897	#CJK UNIFIED IDEOGRAPH
0x9872	0x8155	#CJK UNIFIED IDEOGRAPH
0x989F	0x5F0C	#CJK UNIFIED IDEOGRAPH
0x98A0	0x4E10	#CJK UNIFIED IDEOGRAPH
0x98A1	0x4E15	#CJK UNIFIED IDEOGRAPH
0x98A2	0x4E2A	#CJK UNIFIED IDEOGRAPH
0x98A3	0x4E31	#CJK UNIFIED IDEOGRAPH
0x98A4	0x4E36	#CJK UNIFIED IDEOGRAPH
0x98A5	0x4E3C	#CJK UNIFIED IDEOGRAPH
0x98A6	0x4E3F	#CJK UNIFIED IDEOGRAPH
0x98A7	0x4E42	#CJK UNIFIED IDEOGRAPH
0x98A8	0x4E56	#CJK UNIFIED IDEOGRAPH
0x98A9	0x4E58	#CJK UNIFIED IDEOGRAPH
0x98AA	0x4E82	#CJK UNIFIED IDEOGRAPH
0x98AB	0x4E85	#CJK UNIFIED IDEOGRAPH
0x98AC	0x8C6B	#CJK UNIFIED IDEOGRAPH
0x98AD	0x4E8A	#CJK UNIFIED IDEOGRAPH
0x98AE	0x8212	#CJK UNIFIED IDEOGRAPH
0x98AF	0x5F0D	#CJK UNIFIED IDEOGRAPH
0x98B0	0x4E8E	#CJK UNIFIED IDEOGRAPH
0x98B1	0x4E9E	#CJK UNIFIED IDEOGRAPH
0x98B2	0x4E9F	#CJK UNIFIED IDEOGRAPH
0x98B3	0x4EA0	#CJK UNIFIED IDEOGRAPH
0x98B4	0x4EA2	#CJK UNIFIED IDEOGRAPH
0x98B5	0x4EB0	#CJK UNIFIED IDEOGRAPH
0x98B6	0x4EB3	#CJK UNIFIED IDEOGRAPH
0x98B7	0x4EB6	#CJK UNIFIED IDEOGRAPH
0x98B8	0x4ECE	#CJK UNIFIED IDEOGRAPH
0x98B9	0x4ECD	#CJK UNIFIED IDEOGRAPH
0x98BA	0x4EC4	#CJK UNIFIED IDEOGRAPH
0x98BB	0x4EC6	#CJK UNIFIED IDEOGRAPH
0x98BC	0x4EC2	#CJK UNIFIED IDEOGRAPH
0x98BD	0x4ED7	#CJK UNIFIED IDEOGRAPH
0x98BE	0x4EDE	#CJK UNIFIED IDEOGRAPH
0x98BF	0x4EED	#CJK UNIFIED IDEOGRAPH
0x98C0	0x4EDF	#CJK UNIFIED IDEOGRAPH
0x98C1	0x4EF7	#CJK UNIFIED IDEOGRAPH
0x98C2	0x4F09	#CJK UNIFIED IDEOGRAPH
0x98C3	0x4F5A	#CJK UNIFIED IDEOGRAPH
0x98C4	0x4F30	#CJK UNIFIED IDEOGRAPH
0x98C5	0x4F5B	#CJK UNIFIED IDEOGRAPH
0x98C6	0x4F5D	#CJK UNIFIED IDEOGRAPH
0x98C7	0x4F57	#CJK UNIFIED IDEOGRAPH
0x98C8	0x4F47	#CJK UNIFIED IDEOGRAPH
0x98C9	0x4F76	#CJK UNIFIED IDEOGRAPH
0x98CA	0x4F88	#CJK UNIFIED IDEOGRAPH
0x98CB	0x4F8F	#CJK UNIFIED IDEOGRAPH
0x98CC	0x4F98	#CJK UNIFIED IDEOGRAPH
0x98CD	0x4F7B	#CJK UNIFIED IDEOGRAPH
0x98CE	0x4F69	#CJK UNIFIED IDEOGRAPH
0x98CF	0x4F70	#CJK UNIFIED IDEOGRAPH
0x98D0	0x4F91	#CJK UNIFIED IDEOGRAPH
0x98D1	0x4F6F	#CJK UNIFIED IDEOGRAPH
0x98D2	0x4F86	#CJK UNIFIED IDEOGRAPH
0x98D3	0x4F96	#CJK UNIFIED IDEOGRAPH
0x98D4	0x5118	#CJK UNIFIED IDEOGRAPH
0x98D5	0x4FD4	#CJK UNIFIED IDEOGRAPH
0x98D6	0x4FDF	#CJK UNIFIED IDEOGRAPH
0x98D7	0x4FCE	#CJK UNIFIED IDEOGRAPH
0x98D8	0x4FD8	#CJK UNIFIED IDEOGRAPH
0x98D9	0x4FDB	#CJK UNIFIED IDEOGRAPH
0x98DA	0x4FD1	#CJK UNIFIED IDEOGRAPH
0x98DB	0x4FDA	#CJK UNIFIED IDEOGRAPH
0x98DC	0x4FD0	#CJK UNIFIED IDEOGRAPH
0x98DD	0x4FE4	#CJK UNIFIED IDEOGRAPH
0x98DE	0x4FE5	#CJK UNIFIED IDEOGRAPH
0x98DF	0x501A	#CJK UNIFIED IDEOGRAPH
0x98E0	0x5028	#CJK UNIFIED IDEOGRAPH
0x98E1	0x5014	#CJK UNIFIED IDEOGRAPH
0x98E2	0x502A	#CJK UNIFIED IDEOGRAPH
0x98E3	0x5025	#CJK UNIFIED IDEOGRAPH
0x98E4	0x5005	#CJK UNIFIED IDEOGRAPH
0x98E5	0x4F1C	#CJK UNIFIED IDEOGRAPH
0x98E6	0x4FF6	#CJK UNIFIED IDEOGRAPH
0x98E7	0x5021	#CJK UNIFIED IDEOGRAPH
0x98E8	0x5029	#CJK UNIFIED IDEOGRAPH
0x98E9	0x502C	#CJK UNIFIED IDEOGRAPH
0x98EA	0x4FFE	#CJK UNIFIED IDEOGRAPH
0x98EB	0x4FEF	#CJK UNIFIED IDEOGRAPH
0x98EC	0x5011	#CJK UNIFIED IDEOGRAPH
0x98ED	0x5006	#CJK UNIFIED IDEOGRAPH
0x98EE	0x5043	#CJK UNIFIED IDEOGRAPH
0x98EF	0x5047	#CJK UNIFIED IDEOGRAPH
0x98F0	0x6703	#CJK UNIFIED IDEOGRAPH
0x98F1	0x5055	#CJK UNIFIED IDEOGRAPH
0x98F2	0x5050	#CJK UNIFIED IDEOGRAPH
0x98F3	0x5048	#CJK UNIFIED IDEOGRAPH
0x98F4	0x505A	#CJK UNIFIED IDEOGRAPH
0x98F5	0x5056	#CJK UNIFIED IDEOGRAPH
0x98F6	0x506C	#CJK UNIFIED IDEOGRAPH
0x98F7	0x5078	#CJK UNIFIED IDEOGRAPH
0x98F8	0x5080	#CJK UNIFIED IDEOGRAPH
0x98F9	0x509A	#CJK UNIFIED IDEOGRAPH
0x98FA	0x5085	#CJK UNIFIED IDEOGRAPH
0x98FB	0x50B4	#CJK UNIFIED IDEOGRAPH
0x98FC	0x50B2	#CJK UNIFIED IDEOGRAPH
0x9940	0x50C9	#CJK UNIFIED IDEOGRAPH
0x9941	0x50CA	#CJK UNIFIED IDEOGRAPH
0x9942	0x50B3	#CJK UNIFIED IDEOGRAPH
0x9943	0x50C2	#CJK UNIFIED IDEOGRAPH
0x9944	0x50D6	#CJK UNIFIED IDEOGRAPH
0x9945	0x50DE	#CJK UNIFIED IDEOGRAPH
0x9946	0x50E5	#CJK UNIFIED IDEOGRAPH
0x9947	0x50ED	#CJK UNIFIED IDEOGRAPH
0x9948	0x50E3	#CJK UNIFIED IDEOGRAPH
0x9949	0x50EE	#CJK UNIFIED IDEOGRAPH
0x994A	0x50F9	#CJK UNIFIED IDEOGRAPH
0x994B	0x50F5	#CJK UNIFIED IDEOGRAPH
0x994C	0x5109	#CJK UNIFIED IDEOGRAPH
0x994D	0x5101	#CJK UNIFIED IDEOGRAPH
0x994E	0x5102	#CJK UNIFIED IDEOGRAPH
0x994F	0x5116	#CJK UNIFIED IDEOGRAPH
0x9950	0x5115	#CJK UNIFIED IDEOGRAPH
0x9951	0x5114	#CJK UNIFIED IDEOGRAPH
0x9952	0x511A	#CJK UNIFIED IDEOGRAPH
0x9953	0x5121	#CJK UNIFIED IDEOGRAPH
0x9954	0x513A	#CJK UNIFIED IDEOGRAPH
0x9955	0x5137	#CJK UNIFIED IDEOGRAPH
0x9956	0x513C	#CJK UNIFIED IDEOGRAPH
0x9957	0x513B	#CJK UNIFIED IDEOGRAPH
0x9958	0x513F	#CJK UNIFIED IDEOGRAPH
0x9959	0x5140	#CJK UNIFIED IDEOGRAPH
0x995A	0x5152	#CJK UNIFIED IDEOGRAPH
0x995B	0x514C	#CJK UNIFIED IDEOGRAPH
0x995C	0x5154	#CJK UNIFIED IDEOGRAPH
0x995D	0x5162	#CJK UNIFIED IDEOGRAPH
0x995E	0x7AF8	#CJK UNIFIED IDEOGRAPH
0x995F	0x5169	#CJK UNIFIED IDEOGRAPH
0x9960	0x516A	#CJK UNIFIED IDEOGRAPH
0x9961	0x516E	#CJK UNIFIED IDEOGRAPH
0x9962	0x5180	#CJK UNIFIED IDEOGRAPH
0x9963	0x5182	#CJK UNIFIED IDEOGRAPH
0x9964	0x56D8	#CJK UNIFIED IDEOGRAPH
0x9965	0x518C	#CJK UNIFIED IDEOGRAPH
0x9966	0x5189	#CJK UNIFIED IDEOGRAPH
0x9967	0x518F	#CJK UNIFIED IDEOGRAPH
0x9968	0x5191	#CJK UNIFIED IDEOGRAPH
0x9969	0x5193	#CJK UNIFIED IDEOGRAPH
0x996A	0x5195	#CJK UNIFIED IDEOGRAPH
0x996B	0x5196	#CJK UNIFIED IDEOGRAPH
0x996C	0x51A4	#CJK UNIFIED IDEOGRAPH
0x996D	0x51A6	#CJK UNIFIED IDEOGRAPH
0x996E	0x51A2	#CJK UNIFIED IDEOGRAPH
0x996F	0x51A9	#CJK UNIFIED IDEOGRAPH
0x9970	0x51AA	#CJK UNIFIED IDEOGRAPH
0x9971	0x51AB	#CJK UNIFIED IDEOGRAPH
0x9972	0x51B3	#CJK UNIFIED IDEOGRAPH
0x9973	0x51B1	#CJK UNIFIED IDEOGRAPH
0x9974	0x51B2	#CJK UNIFIED IDEOGRAPH
0x9975	0x51B0	#CJK UNIFIED IDEOGRAPH
0x9976	0x51B5	#CJK UNIFIED IDEOGRAPH
0x9977	0x51BD	#CJK UNIFIED IDEOGRAPH
0x9978	0x51C5	#CJK UNIFIED IDEOGRAPH
0x9979	0x51C9	#CJK UNIFIED IDEOGRAPH
0x997A	0x51DB	#CJK UNIFIED IDEOGRAPH
0x997B	0x51E0	#CJK UNIFIED IDEOGRAPH
0x997C	0x8655	#CJK UNIFIED IDEOGRAPH
0x997D	0x51E9	#CJK UNIFIED IDEOGRAPH
0x997E	0x51ED	#CJK UNIFIED IDEOGRAPH
0x9980	0x51F0	#CJK UNIFIED IDEOGRAPH
0x9981	0x51F5	#CJK UNIFIED IDEOGRAPH
0x9982	0x51FE	#CJK UNIFIED IDEOGRAPH
0x9983	0x5204	#CJK UNIFIED IDEOGRAPH
0x9984	0x520B	#CJK UNIFIED IDEOGRAPH
0x9985	0x5214	#CJK UNIFIED IDEOGRAPH
0x9986	0x520E	#CJK UNIFIED IDEOGRAPH
0x9987	0x5227	#CJK UNIFIED IDEOGRAPH
0x9988	0x522A	#CJK UNIFIED IDEOGRAPH
0x9989	0x522E	#CJK UNIFIED IDEOGRAPH
0x998A	0x5233	#CJK UNIFIED IDEOGRAPH
0x998B	0x5239	#CJK UNIFIED IDEOGRAPH
0x998C	0x524F	#CJK UNIFIED IDEOGRAPH
0x998D	0x5244	#CJK UNIFIED IDEOGRAPH
0x998E	0x524B	#CJK UNIFIED IDEOGRAPH
0x998F	0x524C	#CJK UNIFIED IDEOGRAPH
0x9990	0x525E	#CJK UNIFIED IDEOGRAPH
0x9991	0x5254	#CJK UNIFIED IDEOGRAPH
0x9992	0x526A	#CJK UNIFIED IDEOGRAPH
0x9993	0x5274	#CJK UNIFIED IDEOGRAPH
0x9994	0x5269	#CJK UNIFIED IDEOGRAPH
0x9995	0x5273	#CJK UNIFIED IDEOGRAPH
0x9996	0x527F	#CJK UNIFIED IDEOGRAPH
0x9997	0x527D	#CJK UNIFIED IDEOGRAPH
0x9998	0x528D	#CJK UNIFIED IDEOGRAPH
0x9999	0x5294	#CJK UNIFIED IDEOGRAPH
0x999A	0x5292	#CJK UNIFIED IDEOGRAPH
0x999B	0x5271	#CJK UNIFIED IDEOGRAPH
0x999C	0x5288	#CJK UNIFIED IDEOGRAPH
0x999D	0x5291	#CJK UNIFIED IDEOGRAPH
0x999E	0x8FA8	#CJK UNIFIED IDEOGRAPH
0x999F	0x8FA7	#CJK UNIFIED IDEOGRAPH
0x99A0	0x52AC	#CJK UNIFIED IDEOGRAPH
0x99A1	0x52AD	#CJK UNIFIED IDEOGRAPH
0x99A2	0x52BC	#CJK UNIFIED IDEOGRAPH
0x99A3	0x52B5	#CJK UNIFIED IDEOGRAPH
0x99A4	0x52C1	#CJK UNIFIED IDEOGRAPH
0x99A5	0x52CD	#CJK UNIFIED IDEOGRAPH
0x99A6	0x52D7	#CJK UNIFIED IDEOGRAPH
0x99A7	0x52DE	#CJK UNIFIED IDEOGRAPH
0x99A8	0x52E3	#CJK UNIFIED IDEOGRAPH
0x99A9	0x52E6	#CJK UNIFIED IDEOGRAPH
0x99AA	0x98ED	#CJK UNIFIED IDEOGRAPH
0x99AB	0x52E0	#CJK UNIFIED IDEOGRAPH
0x99AC	0x52F3	#CJK UNIFIED IDEOGRAPH
0x99AD	0x52F5	#CJK UNIFIED IDEOGRAPH
0x99AE	0x52F8	#CJK UNIFIED IDEOGRAPH
0x99AF	0x52F9	#CJK UNIFIED IDEOGRAPH
0x99B0	0x5306	#CJK UNIFIED IDEOGRAPH
0x99B1	0x5308	#CJK UNIFIED IDEOGRAPH
0x99B2	0x7538	#CJK UNIFIED IDEOGRAPH
0x99B3	0x530D	#CJK UNIFIED IDEOGRAPH
0x99B4	0x5310	#CJK UNIFIED IDEOGRAPH
0x99B5	0x530F	#CJK UNIFIED IDEOGRAPH
0x99B6	0x5315	#CJK UNIFIED IDEOGRAPH
0x99B7	0x531A	#CJK UNIFIED IDEOGRAPH
0x99B8	0x5323	#CJK UNIFIED IDEOGRAPH
0x99B9	0x532F	#CJK UNIFIED IDEOGRAPH
0x99BA	0x5331	#CJK UNIFIED IDEOGRAPH
0x99BB	0x5333	#CJK UNIFIED IDEOGRAPH
0x99BC	0x5338	#CJK UNIFIED IDEOGRAPH
0x99BD	0x5340	#CJK UNIFIED IDEOGRAPH
0x99BE	0x5346	#CJK UNIFIED IDEOGRAPH
0x99BF	0x5345	#CJK UNIFIED IDEOGRAPH
0x99C0	0x4E17	#CJK UNIFIED IDEOGRAPH
0x99C1	0x5349	#CJK UNIFIED IDEOGRAPH
0x99C2	0x534D	#CJK UNIFIED IDEOGRAPH
0x99C3	0x51D6	#CJK UNIFIED IDEOGRAPH
0x99C4	0x535E	#CJK UNIFIED IDEOGRAPH
0x99C5	0x5369	#CJK UNIFIED IDEOGRAPH
0x99C6	0x536E	#CJK UNIFIED IDEOGRAPH
0x99C7	0x5918	#CJK UNIFIED IDEOGRAPH
0x99C8	0x537B	#CJK UNIFIED IDEOGRAPH
0x99C9	0x5377	#CJK UNIFIED IDEOGRAPH
0x99CA	0x5382	#CJK UNIFIED IDEOGRAPH
0x99CB	0x5396	#CJK UNIFIED IDEOGRAPH
0x99CC	0x53A0	#CJK UNIFIED IDEOGRAPH
0x99CD	0x53A6	#CJK UNIFIED IDEOGRAPH
0x99CE	0x53A5	#CJK UNIFIED IDEOGRAPH
0x99CF	0x53AE	#CJK UNIFIED IDEOGRAPH
0x99D0	0x53B0	#CJK UNIFIED IDEOGRAPH
0x99D1	0x53B6	#CJK UNIFIED IDEOGRAPH
0x99D2	0x53C3	#CJK UNIFIED IDEOGRAPH
0x99D3	0x7C12	#CJK UNIFIED IDEOGRAPH
0x99D4	0x96D9	#CJK UNIFIED IDEOGRAPH
0x99D5	0x53DF	#CJK UNIFIED IDEOGRAPH
0x99D6	0x66FC	#CJK UNIFIED IDEOGRAPH
0x99D7	0x71EE	#CJK UNIFIED IDEOGRAPH
0x99D8	0x53EE	#CJK UNIFIED IDEOGRAPH
0x99D9	0x53E8	#CJK UNIFIED IDEOGRAPH
0x99DA	0x53ED	#CJK UNIFIED IDEOGRAPH
0x99DB	0x53FA	#CJK UNIFIED IDEOGRAPH
0x99DC	0x5401	#CJK UNIFIED IDEOGRAPH
0x99DD	0x543D	#CJK UNIFIED IDEOGRAPH
0x99DE	0x5440	#CJK UNIFIED IDEOGRAPH
0x99DF	0x542C	#CJK UNIFIED IDEOGRAPH
0x99E0	0x542D	#CJK UNIFIED IDEOGRAPH
0x99E1	0x543C	#CJK UNIFIED IDEOGRAPH
0x99E2	0x542E	#CJK UNIFIED IDEOGRAPH
0x99E3	0x5436	#CJK UNIFIED IDEOGRAPH
0x99E4	0x5429	#CJK UNIFIED IDEOGRAPH
0x99E5	0x541D	#CJK UNIFIED IDEOGRAPH
0x99E6	0x544E	#CJK UNIFIED IDEOGRAPH
0x99E7	0x548F	#CJK UNIFIED IDEOGRAPH
0x99E8	0x5475	#CJK UNIFIED IDEOGRAPH
0x99E9	0x548E	#CJK UNIFIED IDEOGRAPH
0x99EA	0x545F	#CJK UNIFIED IDEOGRAPH
0x99EB	0x5471	#CJK UNIFIED IDEOGRAPH
0x99EC	0x5477	#CJK UNIFIED IDEOGRAPH
0x99ED	0x5470	#CJK UNIFIED IDEOGRAPH
0x99EE	0x5492	#CJK UNIFIED IDEOGRAPH
0x99EF	0x547B	#CJK UNIFIED IDEOGRAPH
0x99F0	0x5480	#CJK UNIFIED IDEOGRAPH
0x99F1	0x5476	#CJK UNIFIED IDEOGRAPH
0x99F2	0x5484	#CJK UNIFIED IDEOGRAPH
0x99F3	0x5490	#CJK UNIFIED IDEOGRAPH
0x99F4	0x5486	#CJK UNIFIED IDEOGRAPH
0x99F5	0x54C7	#CJK UNIFIED IDEOGRAPH
0x99F6	0x54A2	#CJK UNIFIED IDEOGRAPH
0x99F7	0x54B8	#CJK UNIFIED IDEOGRAPH
0x99F8	0x54A5	#CJK UNIFIED IDEOGRAPH
0x99F9	0x54AC	#CJK UNIFIED IDEOGRAPH
0x99FA	0x54C4	#CJK UNIFIED IDEOGRAPH
0x99FB	0x54C8	#CJK UNIFIED IDEOGRAPH
0x99FC	0x54A8	#CJK UNIFIED IDEOGRAPH
0x9A40	0x54AB	#CJK UNIFIED IDEOGRAPH
0x9A41	0x54C2	#CJK UNIFIED IDEOGRAPH
0x9A42	0x54A4	#CJK UNIFIED IDEOGRAPH
0x9A43	0x54BE	#CJK UNIFIED IDEOGRAPH
0x9A44	0x54BC	#CJK UNIFIED IDEOGRAPH
0x9A45	0x54D8	#CJK UNIFIED IDEOGRAPH
0x9A46	0x54E5	#CJK UNIFIED IDEOGRAPH
0x9A47	0x54E6	#CJK UNIFIED IDEOGRAPH
0x9A48	0x550F	#CJK UNIFIED IDEOGRAPH
0x9A49	0x5514	#CJK UNIFIED IDEOGRAPH
0x9A4A	0x54FD	#CJK UNIFIED IDEOGRAPH
0x9A4B	0x54EE	#CJK UNIFIED IDEOGRAPH
0x9A4C	0x54ED	#CJK UNIFIED IDEOGRAPH
0x9A4D	0x54FA	#CJK UNIFIED IDEOGRAPH
0x9A4E	0x54E2	#CJK UNIFIED IDEOGRAPH
0x9A4F	0x5539	#CJK UNIFIED IDEOGRAPH
0x9A50	0x5540	#CJK UNIFIED IDEOGRAPH
0x9A51	0x5563	#CJK UNIFIED IDEOGRAPH
0x9A52	0x554C	#CJK UNIFIED IDEOGRAPH
0x9A53	0x552E	#CJK UNIFIED IDEOGRAPH
0x9A54	0x555C	#CJK UNIFIED IDEOGRAPH
0x9A55	0x5545	#CJK UNIFIED IDEOGRAPH
0x9A56	0x5556	#CJK UNIFIED IDEOGRAPH
0x9A57	0x5557	#CJK UNIFIED IDEOGRAPH
0x9A58	0x5538	#CJK UNIFIED IDEOGRAPH
0x9A59	0x5533	#CJK UNIFIED IDEOGRAPH
0x9A5A	0x555D	#CJK UNIFIED IDEOGRAPH
0x9A5B	0x5599	#CJK UNIFIED IDEOGRAPH
0x9A5C	0x5580	#CJK UNIFIED IDEOGRAPH
0x9A5D	0x54AF	#CJK UNIFIED IDEOGRAPH
0x9A5E	0x558A	#CJK UNIFIED IDEOGRAPH
0x9A5F	0x559F	#CJK UNIFIED IDEOGRAPH
0x9A60	0x557B	#CJK UNIFIED IDEOGRAPH
0x9A61	0x557E	#CJK UNIFIED IDEOGRAPH
0x9A62	0x5598	#CJK UNIFIED IDEOGRAPH
0x9A63	0x559E	#CJK UNIFIED IDEOGRAPH
0x9A64	0x55AE	#CJK UNIFIED IDEOGRAPH
0x9A65	0x557C	#CJK UNIFIED IDEOGRAPH
0x9A66	0x5583	#CJK UNIFIED IDEOGRAPH
0x9A67	0x55A9	#CJK UNIFIED IDEOGRAPH
0x9A68	0x5587	#CJK UNIFIED IDEOGRAPH
0x9A69	0x55A8	#CJK UNIFIED IDEOGRAPH
0x9A6A	0x55DA	#CJK UNIFIED IDEOGRAPH
0x9A6B	0x55C5	#CJK UNIFIED IDEOGRAPH
0x9A6C	0x55DF	#CJK UNIFIED IDEOGRAPH
0x9A6D	0x55C4	#CJK UNIFIED IDEOGRAPH
0x9A6E	0x55DC	#CJK UNIFIED IDEOGRAPH
0x9A6F	0x55E4	#CJK UNIFIED IDEOGRAPH
0x9A70	0x55D4	#CJK UNIFIED IDEOGRAPH
0x9A71	0x5614	#CJK UNIFIED IDEOGRAPH
0x9A72	0x55F7	#CJK UNIFIED IDEOGRAPH
0x9A73	0x5616	#CJK UNIFIED IDEOGRAPH
0x9A74	0x55FE	#CJK UNIFIED IDEOGRAPH
0x9A75	0x55FD	#CJK UNIFIED IDEOGRAPH
0x9A76	0x561B	#CJK UNIFIED IDEOGRAPH
0x9A77	0x55F9	#CJK UNIFIED IDEOGRAPH
0x9A78	0x564E	#CJK UNIFIED IDEOGRAPH
0x9A79	0x5650	#CJK UNIFIED IDEOGRAPH
0x9A7A	0x71DF	#CJK UNIFIED IDEOGRAPH
0x9A7B	0x5634	#CJK UNIFIED IDEOGRAPH
0x9A7C	0x5636	#CJK UNIFIED IDEOGRAPH
0x9A7D	0x5632	#CJK UNIFIED IDEOGRAPH
0x9A7E	0x5638	#CJK UNIFIED IDEOGRAPH
0x9A80	0x566B	#CJK UNIFIED IDEOGRAPH
0x9A81	0x5664	#CJK UNIFIED IDEOGRAPH
0x9A82	0x562F	#CJK UNIFIED IDEOGRAPH
0x9A83	0x566C	#CJK UNIFIED IDEOGRAPH
0x9A84	0x566A	#CJK UNIFIED IDEOGRAPH
0x9A85	0x5686	#CJK UNIFIED IDEOGRAPH
0x9A86	0x5680	#CJK UNIFIED IDEOGRAPH
0x9A87	0x568A	#CJK UNIFIED IDEOGRAPH
0x9A88	0x56A0	#CJK UNIFIED IDEOGRAPH
0x9A89	0x5694	#CJK UNIFIED IDEOGRAPH
0x9A8A	0x568F	#CJK UNIFIED IDEOGRAPH
0x9A8B	0x56A5	#CJK UNIFIED IDEOGRAPH
0x9A8C	0x56AE	#CJK UNIFIED IDEOGRAPH
0x9A8D	0x56B6	#CJK UNIFIED IDEOGRAPH
0x9A8E	0x56B4	#CJK UNIFIED IDEOGRAPH
0x9A8F	0x56C2	#CJK UNIFIED IDEOGRAPH
0x9A90	0x56BC	#CJK UNIFIED IDEOGRAPH
0x9A91	0x56C1	#CJK UNIFIED IDEOGRAPH
0x9A92	0x56C3	#CJK UNIFIED IDEOGRAPH
0x9A93	0x56C0	#CJK UNIFIED IDEOGRAPH
0x9A94	0x56C8	#CJK UNIFIED IDEOGRAPH
0x9A95	0x56CE	#CJK UNIFIED IDEOGRAPH
0x9A96	0x56D1	#CJK UNIFIED IDEOGRAPH
0x9A97	0x56D3	#CJK UNIFIED IDEOGRAPH
0x9A98	0x56D7	#CJK UNIFIED IDEOGRAPH
0x9A99	0x56EE	#CJK UNIFIED IDEOGRAPH
0x9A9A	0x56F9	#CJK UNIFIED IDEOGRAPH
0x9A9B	0x5700	#CJK UNIFIED IDEOGRAPH
0x9A9C	0x56FF	#CJK UNIFIED IDEOGRAPH
0x9A9D	0x5704	#CJK UNIFIED IDEOGRAPH
0x9A9E	0x5709	#CJK UNIFIED IDEOGRAPH
0x9A9F	0x5708	#CJK UNIFIED IDEOGRAPH
0x9AA0	0x570B	#CJK UNIFIED IDEOGRAPH
0x9AA1	0x570D	#CJK UNIFIED IDEOGRAPH
0x9AA2	0x5713	#CJK UNIFIED IDEOGRAPH
0x9AA3	0x5718	#CJK UNIFIED IDEOGRAPH
0x9AA4	0x5716	#CJK UNIFIED IDEOGRAPH
0x9AA5	0x55C7	#CJK UNIFIED IDEOGRAPH
0x9AA6	0x571C	#CJK UNIFIED IDEOGRAPH
0x9AA7	0x5726	#CJK UNIFIED IDEOGRAPH
0x9AA8	0x5737	#CJK UNIFIED IDEOGRAPH
0x9AA9	0x5738	#CJK UNIFIED IDEOGRAPH
0x9AAA	0x574E	#CJK UNIFIED IDEOGRAPH
0x9AAB	0x573B	#CJK UNIFIED IDEOGRAPH
0x9AAC	0x5740	#CJK UNIFIED IDEOGRAPH
0x9AAD	0x574F	#CJK UNIFIED IDEOGRAPH
0x9AAE	0x5769	#CJK UNIFIED IDEOGRAPH
0x9AAF	0x57C0	#CJK UNIFIED IDEOGRAPH
0x9AB0	0x5788	#CJK UNIFIED IDEOGRAPH
0x9AB1	0x5761	#CJK UNIFIED IDEOGRAPH
0x9AB2	0x577F	#CJK UNIFIED IDEOGRAPH
0x9AB3	0x5789	#CJK UNIFIED IDEOGRAPH
0x9AB4	0x5793	#CJK UNIFIED IDEOGRAPH
0x9AB5	0x57A0	#CJK UNIFIED IDEOGRAPH
0x9AB6	0x57B3	#CJK UNIFIED IDEOGRAPH
0x9AB7	0x57A4	#CJK UNIFIED IDEOGRAPH
0x9AB8	0x57AA	#CJK UNIFIED IDEOGRAPH
0x9AB9	0x57B0	#CJK UNIFIED IDEOGRAPH
0x9ABA	0x57C3	#CJK UNIFIED IDEOGRAPH
0x9ABB	0x57C6	#CJK UNIFIED IDEOGRAPH
0x9ABC	0x57D4	#CJK UNIFIED IDEOGRAPH
0x9ABD	0x57D2	#CJK UNIFIED IDEOGRAPH
0x9ABE	0x57D3	#CJK UNIFIED IDEOGRAPH
0x9ABF	0x580A	#CJK UNIFIED IDEOGRAPH
0x9AC0	0x57D6	#CJK UNIFIED IDEOGRAPH
0x9AC1	0x57E3	#CJK UNIFIED IDEOGRAPH
0x9AC2	0x580B	#CJK UNIFIED IDEOGRAPH
0x9AC3	0x5819	#CJK UNIFIED IDEOGRAPH
0x9AC4	0x581D	#CJK UNIFIED IDEOGRAPH
0x9AC5	0x5872	#CJK UNIFIED IDEOGRAPH
0x9AC6	0x5821	#CJK UNIFIED IDEOGRAPH
0x9AC7	0x5862	#CJK UNIFIED IDEOGRAPH
0x9AC8	0x584B	#CJK UNIFIED IDEOGRAPH
0x9AC9	0x5870	#CJK UNIFIED IDEOGRAPH
0x9ACA	0x6BC0	#CJK UNIFIED IDEOGRAPH
0x9ACB	0x5852	#CJK UNIFIED IDEOGRAPH
0x9ACC	0x583D	#CJK UNIFIED IDEOGRAPH
0x9ACD	0x5879	#CJK UNIFIED IDEOGRAPH
0x9ACE	0x5885	#CJK UNIFIED IDEOGRAPH
0x9ACF	0x58B9	#CJK UNIFIED IDEOGRAPH
0x9AD0	0x589F	#CJK UNIFIED IDEOGRAPH
0x9AD1	0x58AB	#CJK UNIFIED IDEOGRAPH
0x9AD2	0x58BA	#CJK UNIFIED IDEOGRAPH
0x9AD3	0x58DE	#CJK UNIFIED IDEOGRAPH
0x9AD4	0x58BB	#CJK UNIFIED IDEOGRAPH
0x9AD5	0x58B8	#CJK UNIFIED IDEOGRAPH
0x9AD6	0x58AE	#CJK UNIFIED IDEOGRAPH
0x9AD7	0x58C5	#CJK UNIFIED IDEOGRAPH
0x9AD8	0x58D3	#CJK UNIFIED IDEOGRAPH
0x9AD9	0x58D1	#CJK UNIFIED IDEOGRAPH
0x9ADA	0x58D7	#CJK UNIFIED IDEOGRAPH
0x9ADB	0x58D9	#CJK UNIFIED IDEOGRAPH
0x9ADC	0x58D8	#CJK UNIFIED IDEOGRAPH
0x9ADD	0x58E5	#CJK UNIFIED IDEOGRAPH
0x9ADE	0x58DC	#CJK UNIFIED IDEOGRAPH
0x9ADF	0x58E4	#CJK UNIFIED IDEOGRAPH
0x9AE0	0x58DF	#CJK UNIFIED IDEOGRAPH
0x9AE1	0x58EF	#CJK UNIFIED IDEOGRAPH
0x9AE2	0x58FA	#CJK UNIFIED IDEOGRAPH
0x9AE3	0x58F9	#CJK UNIFIED IDEOGRAPH
0x9AE4	0x58FB	#CJK UNIFIED IDEOGRAPH
0x9AE5	0x58FC	#CJK UNIFIED IDEOGRAPH
0x9AE6	0x58FD	#CJK UNIFIED IDEOGRAPH
0x9AE7	0x5902	#CJK UNIFIED IDEOGRAPH
0x9AE8	0x590A	#CJK UNIFIED IDEOGRAPH
0x9AE9	0x5910	#CJK UNIFIED IDEOGRAPH
0x9AEA	0x591B	#CJK UNIFIED IDEOGRAPH
0x9AEB	0x68A6	#CJK UNIFIED IDEOGRAPH
0x9AEC	0x5925	#CJK UNIFIED IDEOGRAPH
0x9AED	0x592C	#CJK UNIFIED IDEOGRAPH
0x9AEE	0x592D	#CJK UNIFIED IDEOGRAPH
0x9AEF	0x5932	#CJK UNIFIED IDEOGRAPH
0x9AF0	0x5938	#CJK UNIFIED IDEOGRAPH
0x9AF1	0x593E	#CJK UNIFIED IDEOGRAPH
0x9AF2	0x7AD2	#CJK UNIFIED IDEOGRAPH
0x9AF3	0x5955	#CJK UNIFIED IDEOGRAPH
0x9AF4	0x5950	#CJK UNIFIED IDEOGRAPH
0x9AF5	0x594E	#CJK UNIFIED IDEOGRAPH
0x9AF6	0x595A	#CJK UNIFIED IDEOGRAPH
0x9AF7	0x5958	#CJK UNIFIED IDEOGRAPH
0x9AF8	0x5962	#CJK UNIFIED IDEOGRAPH
0x9AF9	0x5960	#CJK UNIFIED IDEOGRAPH
0x9AFA	0x5967	#CJK UNIFIED IDEOGRAPH
0x9AFB	0x596C	#CJK UNIFIED IDEOGRAPH
0x9AFC	0x5969	#CJK UNIFIED IDEOGRAPH
0x9B40	0x5978	#CJK UNIFIED IDEOGRAPH
0x9B41	0x5981	#CJK UNIFIED IDEOGRAPH
0x9B42	0x599D	#CJK UNIFIED IDEOGRAPH
0x9B43	0x4F5E	#CJK UNIFIED IDEOGRAPH
0x9B44	0x4FAB	#CJK UNIFIED IDEOGRAPH
0x9B45	0x59A3	#CJK UNIFIED IDEOGRAPH
0x9B46	0x59B2	#CJK UNIFIED IDEOGRAPH
0x9B47	0x59C6	#CJK UNIFIED IDEOGRAPH
0x9B48	0x59E8	#CJK UNIFIED IDEOGRAPH
0x9B49	0x59DC	#CJK UNIFIED IDEOGRAPH
0x9B4A	0x598D	#CJK UNIFIED IDEOGRAPH
0x9B4B	0x59D9	#CJK UNIFIED IDEOGRAPH
0x9B4C	0x59DA	#CJK UNIFIED IDEOGRAPH
0x9B4D	0x5A25	#CJK UNIFIED IDEOGRAPH
0x9B4E	0x5A1F	#CJK UNIFIED IDEOGRAPH
0x9B4F	0x5A11	#CJK UNIFIED IDEOGRAPH
0x9B50	0x5A1C	#CJK UNIFIED IDEOGRAPH
0x9B51	0x5A09	#CJK UNIFIED IDEOGRAPH
0x9B52	0x5A1A	#CJK UNIFIED IDEOGRAPH
0x9B53	0x5A40	#CJK UNIFIED IDEOGRAPH
0x9B54	0x5A6C	#CJK UNIFIED IDEOGRAPH
0x9B55	0x5A49	#CJK UNIFIED IDEOGRAPH
0x9B56	0x5A35	#CJK UNIFIED IDEOGRAPH
0x9B57	0x5A36	#CJK UNIFIED IDEOGRAPH
0x9B58	0x5A62	#CJK UNIFIED IDEOGRAPH
0x9B59	0x5A6A	#CJK UNIFIED IDEOGRAPH
0x9B5A	0x5A9A	#CJK UNIFIED IDEOGRAPH
0x9B5B	0x5ABC	#CJK UNIFIED IDEOGRAPH
0x9B5C	0x5ABE	#CJK UNIFIED IDEOGRAPH
0x9B5D	0x5ACB	#CJK UNIFIED IDEOGRAPH
0x9B5E	0x5AC2	#CJK UNIFIED IDEOGRAPH
0x9B5F	0x5ABD	#CJK UNIFIED IDEOGRAPH
0x9B60	0x5AE3	#CJK UNIFIED IDEOGRAPH
0x9B61	0x5AD7	#CJK UNIFIED IDEOGRAPH
0x9B62	0x5AE6	#CJK UNIFIED IDEOGRAPH
0x9B63	0x5AE9	#CJK UNIFIED IDEOGRAPH
0x9B64	0x5AD6	#CJK UNIFIED IDEOGRAPH
0x9B65	0x5AFA	#CJK UNIFIED IDEOGRAPH
0x9B66	0x5AFB	#CJK UNIFIED IDEOGRAPH
0x9B67	0x5B0C	#CJK UNIFIED IDEOGRAPH
0x9B68	0x5B0B	#CJK UNIFIED IDEOGRAPH
0x9B69	0x5B16	#CJK UNIFIED IDEOGRAPH
0x9B6A	0x5B32	#CJK UNIFIED IDEOGRAPH
0x9B6B	0x5AD0	#CJK UNIFIED IDEOGRAPH
0x9B6C	0x5B2A	#CJK UNIFIED IDEOGRAPH
0x9B6D	0x5B36	#CJK UNIFIED IDEOGRAPH
0x9B6E	0x5B3E	#CJK UNIFIED IDEOGRAPH
0x9B6F	0x5B43	#CJK UNIFIED IDEOGRAPH
0x9B70	0x5B45	#CJK UNIFIED IDEOGRAPH
0x9B71	0x5B40	#CJK UNIFIED IDEOGRAPH
0x9B72	0x5B51	#CJK UNIFIED IDEOGRAPH
0x9B73	0x5B55	#CJK UNIFIED IDEOGRAPH
0x9B74	0x5B5A	#CJK UNIFIED IDEOGRAPH
0x9B75	0x5B5B	#CJK UNIFIED IDEOGRAPH
0x9B76	0x5B65	#CJK UNIFIED IDEOGRAPH
0x9B77	0x5B69	#CJK UNIFIED IDEOGRAPH
0x9B78	0x5B70	#CJK UNIFIED IDEOGRAPH
0x9B79	0x5B73	#CJK UNIFIED IDEOGRAPH
0x9B7A	0x5B75	#CJK UNIFIED IDEOGRAPH
0x9B7B	0x5B78	#CJK UNIFIED IDEOGRAPH
0x9B7C	0x6588	#CJK UNIFIED IDEOGRAPH
0x9B7D	0x5B7A	#CJK UNIFIED IDEOGRAPH
0x9B7E	0x5B80	#CJK UNIFIED IDEOGRAPH
0x9B80	0x5B83	#CJK UNIFIED IDEOGRAPH
0x9B81	0x5BA6	#CJK UNIFIED IDEOGRAPH
0x9B82	0x5BB8	#CJK UNIFIED IDEOGRAPH
0x9B83	0x5BC3	#CJK UNIFIED IDEOGRAPH
0x9B84	0x5BC7	#CJK UNIFIED IDEOGRAPH
0x9B85	0x5BC9	#CJK UNIFIED IDEOGRAPH
0x9B86	0x5BD4	#CJK UNIFIED IDEOGRAPH
0x9B87	0x5BD0	#CJK UNIFIED IDEOGRAPH
0x9B88	0x5BE4	#CJK UNIFIED IDEOGRAPH
0x9B89	0x5BE6	#CJK UNIFIED IDEOGRAPH
0x9B8A	0x5BE2	#CJK UNIFIED IDEOGRAPH
0x9B8B	0x5BDE	#CJK UNIFIED IDEOGRAPH
0x9B8C	0x5BE5	#CJK UNIFIED IDEOGRAPH
0x9B8D	0x5BEB	#CJK UNIFIED IDEOGRAPH
0x9B8E	0x5BF0	#CJK UNIFIED IDEOGRAPH
0x9B8F	0x5BF6	#CJK UNIFIED IDEOGRAPH
0x9B90	0x5BF3	#CJK UNIFIED IDEOGRAPH
0x9B91	0x5C05	#CJK UNIFIED IDEOGRAPH
0x9B92	0x5C07	#CJK UNIFIED IDEOGRAPH
0x9B93	0x5C08	#CJK UNIFIED IDEOGRAPH
0x9B94	0x5C0D	#CJK UNIFIED IDEOGRAPH
0x9B95	0x5C13	#CJK UNIFIED IDEOGRAPH
0x9B96	0x5C20	#CJK UNIFIED IDEOGRAPH
0x9B97	0x5C22	#CJK UNIFIED IDEOGRAPH
0x9B98	0x5C28	#CJK UNIFIED IDEOGRAPH
0x9B99	0x5C38	#CJK UNIFIED IDEOGRAPH
0x9B9A	0x5C39	#CJK UNIFIED IDEOGRAPH
0x9B9B	0x5C41	#CJK UNIFIED IDEOGRAPH
0x9B9C	0x5C46	#CJK UNIFIED IDEOGRAPH
0x9B9D	0x5C4E	#CJK UNIFIED IDEOGRAPH
0x9B9E	0x5C53	#CJK UNIFIED IDEOGRAPH
0x9B9F	0x5C50	#CJK UNIFIED IDEOGRAPH
0x9BA0	0x5C4F	#CJK UNIFIED IDEOGRAPH
0x9BA1	0x5B71	#CJK UNIFIED IDEOGRAPH
0x9BA2	0x5C6C	#CJK UNIFIED IDEOGRAPH
0x9BA3	0x5C6E	#CJK UNIFIED IDEOGRAPH
0x9BA4	0x4E62	#CJK UNIFIED IDEOGRAPH
0x9BA5	0x5C76	#CJK UNIFIED IDEOGRAPH
0x9BA6	0x5C79	#CJK UNIFIED IDEOGRAPH
0x9BA7	0x5C8C	#CJK UNIFIED IDEOGRAPH
0x9BA8	0x5C91	#CJK UNIFIED IDEOGRAPH
0x9BA9	0x5C94	#CJK UNIFIED IDEOGRAPH
0x9BAA	0x599B	#CJK UNIFIED IDEOGRAPH
0x9BAB	0x5CAB	#CJK UNIFIED IDEOGRAPH
0x9BAC	0x5CBB	#CJK UNIFIED IDEOGRAPH
0x9BAD	0x5CB6	#CJK UNIFIED IDEOGRAPH
0x9BAE	0x5CBC	#CJK UNIFIED IDEOGRAPH
0x9BAF	0x5CB7	#CJK UNIFIED IDEOGRAPH
0x9BB0	0x5CC5	#CJK UNIFIED IDEOGRAPH
0x9BB1	0x5CBE	#CJK UNIFIED IDEOGRAPH
0x9BB2	0x5CC7	#CJK UNIFIED IDEOGRAPH
0x9BB3	0x5CD9	#CJK UNIFIED IDEOGRAPH
0x9BB4	0x5CE9	#CJK UNIFIED IDEOGRAPH
0x9BB5	0x5CFD	#CJK UNIFIED IDEOGRAPH
0x9BB6	0x5CFA	#CJK UNIFIED IDEOGRAPH
0x9BB7	0x5CED	#CJK UNIFIED IDEOGRAPH
0x9BB8	0x5D8C	#CJK UNIFIED IDEOGRAPH
0x9BB9	0x5CEA	#CJK UNIFIED IDEOGRAPH
0x9BBA	0x5D0B	#CJK UNIFIED IDEOGRAPH
0x9BBB	0x5D15	#CJK UNIFIED IDEOGRAPH
0x9BBC	0x5D17	#CJK UNIFIED IDEOGRAPH
0x9BBD	0x5D5C	#CJK UNIFIED IDEOGRAPH
0x9BBE	0x5D1F	#CJK UNIFIED IDEOGRAPH
0x9BBF	0x5D1B	#CJK UNIFIED IDEOGRAPH
0x9BC0	0x5D11	#CJK UNIFIED IDEOGRAPH
0x9BC1	0x5D14	#CJK UNIFIED IDEOGRAPH
0x9BC2	0x5D22	#CJK UNIFIED IDEOGRAPH
0x9BC3	0x5D1A	#CJK UNIFIED IDEOGRAPH
0x9BC4	0x5D19	#CJK UNIFIED IDEOGRAPH
0x9BC5	0x5D18	#CJK UNIFIED IDEOGRAPH
0x9BC6	0x5D4C	#CJK UNIFIED IDEOGRAPH
0x9BC7	0x5D52	#CJK UNIFIED IDEOGRAPH
0x9BC8	0x5D4E	#CJK UNIFIED IDEOGRAPH
0x9BC9	0x5D4B	#CJK UNIFIED IDEOGRAPH
0x9BCA	0x5D6C	#CJK UNIFIED IDEOGRAPH
0x9BCB	0x5D73	#CJK UNIFIED IDEOGRAPH
0x9BCC	0x5D76	#CJK UNIFIED IDEOGRAPH
0x9BCD	0x5D87	#CJK UNIFIED IDEOGRAPH
0x9BCE	0x5D84	#CJK UNIFIED IDEOGRAPH
0x9BCF	0x5D82	#CJK UNIFIED IDEOGRAPH
0x9BD0	0x5DA2	#CJK UNIFIED IDEOGRAPH
0x9BD1	0x5D9D	#CJK UNIFIED IDEOGRAPH
0x9BD2	0x5DAC	#CJK UNIFIED IDEOGRAPH
0x9BD3	0x5DAE	#CJK UNIFIED IDEOGRAPH
0x9BD4	0x5DBD	#CJK UNIFIED IDEOGRAPH
0x9BD5	0x5D90	#CJK UNIFIED IDEOGRAPH
0x9BD6	0x5DB7	#CJK UNIFIED IDEOGRAPH
0x9BD7	0x5DBC	#CJK UNIFIED IDEOGRAPH
0x9BD8	0x5DC9	#CJK UNIFIED IDEOGRAPH
0x9BD9	0x5DCD	#CJK UNIFIED IDEOGRAPH
0x9BDA	0x5DD3	#CJK UNIFIED IDEOGRAPH
0x9BDB	0x5DD2	#CJK UNIFIED IDEOGRAPH
0x9BDC	0x5DD6	#CJK UNIFIED IDEOGRAPH
0x9BDD	0x5DDB	#CJK UNIFIED IDEOGRAPH
0x9BDE	0x5DEB	#CJK UNIFIED IDEOGRAPH
0x9BDF	0x5DF2	#CJK UNIFIED IDEOGRAPH
0x9BE0	0x5DF5	#CJK UNIFIED IDEOGRAPH
0x9BE1	0x5E0B	#CJK UNIFIED IDEOGRAPH
0x9BE2	0x5E1A	#CJK UNIFIED IDEOGRAPH
0x9BE3	0x5E19	#CJK UNIFIED IDEOGRAPH
0x9BE4	0x5E11	#CJK UNIFIED IDEOGRAPH
0x9BE5	0x5E1B	#CJK UNIFIED IDEOGRAPH
0x9BE6	0x5E36	#CJK UNIFIED IDEOGRAPH
0x9BE7	0x5E37	#CJK UNIFIED IDEOGRAPH
0x9BE8	0x5E44	#CJK UNIFIED IDEOGRAPH
0x9BE9	0x5E43	#CJK UNIFIED IDEOGRAPH
0x9BEA	0x5E40	#CJK UNIFIED IDEOGRAPH
0x9BEB	0x5E4E	#CJK UNIFIED IDEOGRAPH
0x9BEC	0x5E57	#CJK UNIFIED IDEOGRAPH
0x9BED	0x5E54	#CJK UNIFIED IDEOGRAPH
0x9BEE	0x5E5F	#CJK UNIFIED IDEOGRAPH
0x9BEF	0x5E62	#CJK UNIFIED IDEOGRAPH
0x9BF0	0x5E64	#CJK UNIFIED IDEOGRAPH
0x9BF1	0x5E47	#CJK UNIFIED IDEOGRAPH
0x9BF2	0x5E75	#CJK UNIFIED IDEOGRAPH
0x9BF3	0x5E76	#CJK UNIFIED IDEOGRAPH
0x9BF4	0x5E7A	#CJK UNIFIED IDEOGRAPH
0x9BF5	0x9EBC	#CJK UNIFIED IDEOGRAPH
0x9BF6	0x5E7F	#CJK UNIFIED IDEOGRAPH
0x9BF7	0x5EA0	#CJK UNIFIED IDEOGRAPH
0x9BF8	0x5EC1	#CJK UNIFIED IDEOGRAPH
0x9BF9	0x5EC2	#CJK UNIFIED IDEOGRAPH
0x9BFA	0x5EC8	#CJK UNIFIED IDEOGRAPH
0x9BFB	0x5ED0	#CJK UNIFIED IDEOGRAPH
0x9BFC	0x5ECF	#CJK UNIFIED IDEOGRAPH
0x9C40	0x5ED6	#CJK UNIFIED IDEOGRAPH
0x9C41	0x5EE3	#CJK UNIFIED IDEOGRAPH
0x9C42	0x5EDD	#CJK UNIFIED IDEOGRAPH
0x9C43	0x5EDA	#CJK UNIFIED IDEOGRAPH
0x9C44	0x5EDB	#CJK UNIFIED IDEOGRAPH
0x9C45	0x5EE2	#CJK UNIFIED IDEOGRAPH
0x9C46	0x5EE1	#CJK UNIFIED IDEOGRAPH
0x9C47	0x5EE8	#CJK UNIFIED IDEOGRAPH
0x9C48	0x5EE9	#CJK UNIFIED IDEOGRAPH
0x9C49	0x5EEC	#CJK UNIFIED IDEOGRAPH
0x9C4A	0x5EF1	#CJK UNIFIED IDEOGRAPH
0x9C4B	0x5EF3	#CJK UNIFIED IDEOGRAPH
0x9C4C	0x5EF0	#CJK UNIFIED IDEOGRAPH
0x9C4D	0x5EF4	#CJK UNIFIED IDEOGRAPH
0x9C4E	0x5EF8	#CJK UNIFIED IDEOGRAPH
0x9C4F	0x5EFE	#CJK UNIFIED IDEOGRAPH
0x9C50	0x5F03	#CJK UNIFIED IDEOGRAPH
0x9C51	0x5F09	#CJK UNIFIED IDEOGRAPH
0x9C52	0x5F5D	#CJK UNIFIED IDEOGRAPH
0x9C53	0x5F5C	#CJK UNIFIED IDEOGRAPH
0x9C54	0x5F0B	#CJK UNIFIED IDEOGRAPH
0x9C55	0x5F11	#CJK UNIFIED IDEOGRAPH
0x9C56	0x5F16	#CJK UNIFIED IDEOGRAPH
0x9C57	0x5F29	#CJK UNIFIED IDEOGRAPH
0x9C58	0x5F2D	#CJK UNIFIED IDEOGRAPH
0x9C59	0x5F38	#CJK UNIFIED IDEOGRAPH
0x9C5A	0x5F41	#CJK UNIFIED IDEOGRAPH
0x9C5B	0x5F48	#CJK UNIFIED IDEOGRAPH
0x9C5C	0x5F4C	#CJK UNIFIED IDEOGRAPH
0x9C5D	0x5F4E	#CJK UNIFIED IDEOGRAPH
0x9C5E	0x5F2F	#CJK UNIFIED IDEOGRAPH
0x9C5F	0x5F51	#CJK UNIFIED IDEOGRAPH
0x9C60	0x5F56	#CJK UNIFIED IDEOGRAPH
0x9C61	0x5F57	#CJK UNIFIED IDEOGRAPH
0x9C62	0x5F59	#CJK UNIFIED IDEOGRAPH
0x9C63	0x5F61	#CJK UNIFIED IDEOGRAPH
0x9C64	0x5F6D	#CJK UNIFIED IDEOGRAPH
0x9C65	0x5F73	#CJK UNIFIED IDEOGRAPH
0x9C66	0x5F77	#CJK UNIFIED IDEOGRAPH
0x9C67	0x5F83	#CJK UNIFIED IDEOGRAPH
0x9C68	0x5F82	#CJK UNIFIED IDEOGRAPH
0x9C69	0x5F7F	#CJK UNIFIED IDEOGRAPH
0x9C6A	0x5F8A	#CJK UNIFIED IDEOGRAPH
0x9C6B	0x5F88	#CJK UNIFIED IDEOGRAPH
0x9C6C	0x5F91	#CJK UNIFIED IDEOGRAPH
0x9C6D	0x5F87	#CJK UNIFIED IDEOGRAPH
0x9C6E	0x5F9E	#CJK UNIFIED IDEOGRAPH
0x9C6F	0x5F99	#CJK UNIFIED IDEOGRAPH
0x9C70	0x5F98	#CJK UNIFIED IDEOGRAPH
0x9C71	0x5FA0	#CJK UNIFIED IDEOGRAPH
0x9C72	0x5FA8	#CJK UNIFIED IDEOGRAPH
0x9C73	0x5FAD	#CJK UNIFIED IDEOGRAPH
0x9C74	0x5FBC	#CJK UNIFIED IDEOGRAPH
0x9C75	0x5FD6	#CJK UNIFIED IDEOGRAPH
0x9C76	0x5FFB	#CJK UNIFIED IDEOGRAPH
0x9C77	0x5FE4	#CJK UNIFIED IDEOGRAPH
0x9C78	0x5FF8	#CJK UNIFIED IDEOGRAPH
0x9C79	0x5FF1	#CJK UNIFIED IDEOGRAPH
0x9C7A	0x5FDD	#CJK UNIFIED IDEOGRAPH
0x9C7B	0x60B3	#CJK UNIFIED IDEOGRAPH
0x9C7C	0x5FFF	#CJK UNIFIED IDEOGRAPH
0x9C7D	0x6021	#CJK UNIFIED IDEOGRAPH
0x9C7E	0x6060	#CJK UNIFIED IDEOGRAPH
0x9C80	0x6019	#CJK UNIFIED IDEOGRAPH
0x9C81	0x6010	#CJK UNIFIED IDEOGRAPH
0x9C82	0x6029	#CJK UNIFIED IDEOGRAPH
0x9C83	0x600E	#CJK UNIFIED IDEOGRAPH
0x9C84	0x6031	#CJK UNIFIED IDEOGRAPH
0x9C85	0x601B	#CJK UNIFIED IDEOGRAPH
0x9C86	0x6015	#CJK UNIFIED IDEOGRAPH
0x9C87	0x602B	#CJK UNIFIED IDEOGRAPH
0x9C88	0x6026	#CJK UNIFIED IDEOGRAPH
0x9C89	0x600F	#CJK UNIFIED IDEOGRAPH
0x9C8A	0x603A	#CJK UNIFIED IDEOGRAPH
0x9C8B	0x605A	#CJK UNIFIED IDEOGRAPH
0x9C8C	0x6041	#CJK UNIFIED IDEOGRAPH
0x9C8D	0x606A	#CJK UNIFIED IDEOGRAPH
0x9C8E	0x6077	#CJK UNIFIED IDEOGRAPH
0x9C8F	0x605F	#CJK UNIFIED IDEOGRAPH
0x9C90	0x604A	#CJK UNIFIED IDEOGRAPH
0x9C91	0x6046	#CJK UNIFIED IDEOGRAPH
0x9C92	0x604D	#CJK UNIFIED IDEOGRAPH
0x9C93	0x6063	#CJK UNIFIED IDEOGRAPH
0x9C94	0x6043	#CJK UNIFIED IDEOGRAPH
0x9C95	0x6064	#CJK UNIFIED IDEOGRAPH
0x9C96	0x6042	#CJK UNIFIED IDEOGRAPH
0x9C97	0x606C	#CJK UNIFIED IDEOGRAPH
0x9C98	0x606B	#CJK UNIFIED IDEOGRAPH
0x9C99	0x6059	#CJK UNIFIED IDEOGRAPH
0x9C9A	0x6081	#CJK UNIFIED IDEOGRAPH
0x9C9B	0x608D	#CJK UNIFIED IDEOGRAPH
0x9C9C	0x60E7	#CJK UNIFIED IDEOGRAPH
0x9C9D	0x6083	#CJK UNIFIED IDEOGRAPH
0x9C9E	0x609A	#CJK UNIFIED IDEOGRAPH
0x9C9F	0x6084	#CJK UNIFIED IDEOGRAPH
0x9CA0	0x609B	#CJK UNIFIED IDEOGRAPH
0x9CA1	0x6096	#CJK UNIFIED IDEOGRAPH
0x9CA2	0x6097	#CJK UNIFIED IDEOGRAPH
0x9CA3	0x6092	#CJK UNIFIED IDEOGRAPH
0x9CA4	0x60A7	#CJK UNIFIED IDEOGRAPH
0x9CA5	0x608B	#CJK UNIFIED IDEOGRAPH
0x9CA6	0x60E1	#CJK UNIFIED IDEOGRAPH
0x9CA7	0x60B8	#CJK UNIFIED IDEOGRAPH
0x9CA8	0x60E0	#CJK UNIFIED IDEOGRAPH
0x9CA9	0x60D3	#CJK UNIFIED IDEOGRAPH
0x9CAA	0x60B4	#CJK UNIFIED IDEOGRAPH
0x9CAB	0x5FF0	#CJK UNIFIED IDEOGRAPH
0x9CAC	0x60BD	#CJK UNIFIED IDEOGRAPH
0x9CAD	0x60C6	#CJK UNIFIED IDEOGRAPH
0x9CAE	0x60B5	#CJK UNIFIED IDEOGRAPH
0x9CAF	0x60D8	#CJK UNIFIED IDEOGRAPH
0x9CB0	0x614D	#CJK UNIFIED IDEOGRAPH
0x9CB1	0x6115	#CJK UNIFIED IDEOGRAPH
0x9CB2	0x6106	#CJK UNIFIED IDEOGRAPH
0x9CB3	0x60F6	#CJK UNIFIED IDEOGRAPH
0x9CB4	0x60F7	#CJK UNIFIED IDEOGRAPH
0x9CB5	0x6100	#CJK UNIFIED IDEOGRAPH
0x9CB6	0x60F4	#CJK UNIFIED IDEOGRAPH
0x9CB7	0x60FA	#CJK UNIFIED IDEOGRAPH
0x9CB8	0x6103	#CJK UNIFIED IDEOGRAPH
0x9CB9	0x6121	#CJK UNIFIED IDEOGRAPH
0x9CBA	0x60FB	#CJK UNIFIED IDEOGRAPH
0x9CBB	0x60F1	#CJK UNIFIED IDEOGRAPH
0x9CBC	0x610D	#CJK UNIFIED IDEOGRAPH
0x9CBD	0x610E	#CJK UNIFIED IDEOGRAPH
0x9CBE	0x6147	#CJK UNIFIED IDEOGRAPH
0x9CBF	0x613E	#CJK UNIFIED IDEOGRAPH
0x9CC0	0x6128	#CJK UNIFIED IDEOGRAPH
0x9CC1	0x6127	#CJK UNIFIED IDEOGRAPH
0x9CC2	0x614A	#CJK UNIFIED IDEOGRAPH
0x9CC3	0x613F	#CJK UNIFIED IDEOGRAPH
0x9CC4	0x613C	#CJK UNIFIED IDEOGRAPH
0x9CC5	0x612C	#CJK UNIFIED IDEOGRAPH
0x9CC6	0x6134	#CJK UNIFIED IDEOGRAPH
0x9CC7	0x613D	#CJK UNIFIED IDEOGRAPH
0x9CC8	0x6142	#CJK UNIFIED IDEOGRAPH
0x9CC9	0x6144	#CJK UNIFIED IDEOGRAPH
0x9CCA	0x6173	#CJK UNIFIED IDEOGRAPH
0x9CCB	0x6177	#CJK UNIFIED IDEOGRAPH
0x9CCC	0x6158	#CJK UNIFIED IDEOGRAPH
0x9CCD	0x6159	#CJK UNIFIED IDEOGRAPH
0x9CCE	0x615A	#CJK UNIFIED IDEOGRAPH
0x9CCF	0x616B	#CJK UNIFIED IDEOGRAPH
0x9CD0	0x6174	#CJK UNIFIED IDEOGRAPH
0x9CD1	0x616F	#CJK UNIFIED IDEOGRAPH
0x9CD2	0x6165	#CJK UNIFIED IDEOGRAPH
0x9CD3	0x6171	#CJK UNIFIED IDEOGRAPH
0x9CD4	0x615F	#CJK UNIFIED IDEOGRAPH
0x9CD5	0x615D	#CJK UNIFIED IDEOGRAPH
0x9CD6	0x6153	#CJK UNIFIED IDEOGRAPH
0x9CD7	0x6175	#CJK UNIFIED IDEOGRAPH
0x9CD8	0x6199	#CJK UNIFIED IDEOGRAPH
0x9CD9	0x6196	#CJK UNIFIED IDEOGRAPH
0x9CDA	0x6187	#CJK UNIFIED IDEOGRAPH
0x9CDB	0x61AC	#CJK UNIFIED IDEOGRAPH
0x9CDC	0x6194	#CJK UNIFIED IDEOGRAPH
0x9CDD	0x619A	#CJK UNIFIED IDEOGRAPH
0x9CDE	0x618A	#CJK UNIFIED IDEOGRAPH
0x9CDF	0x6191	#CJK UNIFIED IDEOGRAPH
0x9CE0	0x61AB	#CJK UNIFIED IDEOGRAPH
0x9CE1	0x61AE	#CJK UNIFIED IDEOGRAPH
0x9CE2	0x61CC	#CJK UNIFIED IDEOGRAPH
0x9CE3	0x61CA	#CJK UNIFIED IDEOGRAPH
0x9CE4	0x61C9	#CJK UNIFIED IDEOGRAPH
0x9CE5	0x61F7	#CJK UNIFIED IDEOGRAPH
0x9CE6	0x61C8	#CJK UNIFIED IDEOGRAPH
0x9CE7	0x61C3	#CJK UNIFIED IDEOGRAPH
0x9CE8	0x61C6	#CJK UNIFIED IDEOGRAPH
0x9CE9	0x61BA	#CJK UNIFIED IDEOGRAPH
0x9CEA	0x61CB	#CJK UNIFIED IDEOGRAPH
0x9CEB	0x7F79	#CJK UNIFIED IDEOGRAPH
0x9CEC	0x61CD	#CJK UNIFIED IDEOGRAPH
0x9CED	0x61E6	#CJK UNIFIED IDEOGRAPH
0x9CEE	0x61E3	#CJK UNIFIED IDEOGRAPH
0x9CEF	0x61F6	#CJK UNIFIED IDEOGRAPH
0x9CF0	0x61FA	#CJK UNIFIED IDEOGRAPH
0x9CF1	0x61F4	#CJK UNIFIED IDEOGRAPH
0x9CF2	0x61FF	#CJK UNIFIED IDEOGRAPH
0x9CF3	0x61FD	#CJK UNIFIED IDEOGRAPH
0x9CF4	0x61FC	#CJK UNIFIED IDEOGRAPH
0x9CF5	0x61FE	#CJK UNIFIED IDEOGRAPH
0x9CF6	0x6200	#CJK UNIFIED IDEOGRAPH
0x9CF7	0x6208	#CJK UNIFIED IDEOGRAPH
0x9CF8	0x6209	#CJK UNIFIED IDEOGRAPH
0x9CF9	0x620D	#CJK UNIFIED IDEOGRAPH
0x9CFA	0x620C	#CJK UNIFIED IDEOGRAPH
0x9CFB	0x6214	#CJK UNIFIED IDEOGRAPH
0x9CFC	0x621B	#CJK UNIFIED IDEOGRAPH
0x9D40	0x621E	#CJK UNIFIED IDEOGRAPH
0x9D41	0x6221	#CJK UNIFIED IDEOGRAPH
0x9D42	0x622A	#CJK UNIFIED IDEOGRAPH
0x9D43	0x622E	#CJK UNIFIED IDEOGRAPH
0x9D44	0x6230	#CJK UNIFIED IDEOGRAPH
0x9D45	0x6232	#CJK UNIFIED IDEOGRAPH
0x9D46	0x6233	#CJK UNIFIED IDEOGRAPH
0x9D47	0x6241	#CJK UNIFIED IDEOGRAPH
0x9D48	0x624E	#CJK UNIFIED IDEOGRAPH
0x9D49	0x625E	#CJK UNIFIED IDEOGRAPH
0x9D4A	0x6263	#CJK UNIFIED IDEOGRAPH
0x9D4B	0x625B	#CJK UNIFIED IDEOGRAPH
0x9D4C	0x6260	#CJK UNIFIED IDEOGRAPH
0x9D4D	0x6268	#CJK UNIFIED IDEOGRAPH
0x9D4E	0x627C	#CJK UNIFIED IDEOGRAPH
0x9D4F	0x6282	#CJK UNIFIED IDEOGRAPH
0x9D50	0x6289	#CJK UNIFIED IDEOGRAPH
0x9D51	0x627E	#CJK UNIFIED IDEOGRAPH
0x9D52	0x6292	#CJK UNIFIED IDEOGRAPH
0x9D53	0x6293	#CJK UNIFIED IDEOGRAPH
0x9D54	0x6296	#CJK UNIFIED IDEOGRAPH
0x9D55	0x62D4	#CJK UNIFIED IDEOGRAPH
0x9D56	0x6283	#CJK UNIFIED IDEOGRAPH
0x9D57	0x6294	#CJK UNIFIED IDEOGRAPH
0x9D58	0x62D7	#CJK UNIFIED IDEOGRAPH
0x9D59	0x62D1	#CJK UNIFIED IDEOGRAPH
0x9D5A	0x62BB	#CJK UNIFIED IDEOGRAPH
0x9D5B	0x62CF	#CJK UNIFIED IDEOGRAPH
0x9D5C	0x62FF	#CJK UNIFIED IDEOGRAPH
0x9D5D	0x62C6	#CJK UNIFIED IDEOGRAPH
0x9D5E	0x64D4	#CJK UNIFIED IDEOGRAPH
0x9D5F	0x62C8	#CJK UNIFIED IDEOGRAPH
0x9D60	0x62DC	#CJK UNIFIED IDEOGRAPH
0x9D61	0x62CC	#CJK UNIFIED IDEOGRAPH
0x9D62	0x62CA	#CJK UNIFIED IDEOGRAPH
0x9D63	0x62C2	#CJK UNIFIED IDEOGRAPH
0x9D64	0x62C7	#CJK UNIFIED IDEOGRAPH
0x9D65	0x629B	#CJK UNIFIED IDEOGRAPH
0x9D66	0x62C9	#CJK UNIFIED IDEOGRAPH
0x9D67	0x630C	#CJK UNIFIED IDEOGRAPH
0x9D68	0x62EE	#CJK UNIFIED IDEOGRAPH
0x9D69	0x62F1	#CJK UNIFIED IDEOGRAPH
0x9D6A	0x6327	#CJK UNIFIED IDEOGRAPH
0x9D6B	0x6302	#CJK UNIFIED IDEOGRAPH
0x9D6C	0x6308	#CJK UNIFIED IDEOGRAPH
0x9D6D	0x62EF	#CJK UNIFIED IDEOGRAPH
0x9D6E	0x62F5	#CJK UNIFIED IDEOGRAPH
0x9D6F	0x6350	#CJK UNIFIED IDEOGRAPH
0x9D70	0x633E	#CJK UNIFIED IDEOGRAPH
0x9D71	0x634D	#CJK UNIFIED IDEOGRAPH
0x9D72	0x641C	#CJK UNIFIED IDEOGRAPH
0x9D73	0x634F	#CJK UNIFIED IDEOGRAPH
0x9D74	0x6396	#CJK UNIFIED IDEOGRAPH
0x9D75	0x638E	#CJK UNIFIED IDEOGRAPH
0x9D76	0x6380	#CJK UNIFIED IDEOGRAPH
0x9D77	0x63AB	#CJK UNIFIED IDEOGRAPH
0x9D78	0x6376	#CJK UNIFIED IDEOGRAPH
0x9D79	0x63A3	#CJK UNIFIED IDEOGRAPH
0x9D7A	0x638F	#CJK UNIFIED IDEOGRAPH
0x9D7B	0x6389	#CJK UNIFIED IDEOGRAPH
0x9D7C	0x639F	#CJK UNIFIED IDEOGRAPH
0x9D7D	0x63B5	#CJK UNIFIED IDEOGRAPH
0x9D7E	0x636B	#CJK UNIFIED IDEOGRAPH
0x9D80	0x6369	#CJK UNIFIED IDEOGRAPH
0x9D81	0x63BE	#CJK UNIFIED IDEOGRAPH
0x9D82	0x63E9	#CJK UNIFIED IDEOGRAPH
0x9D83	0x63C0	#CJK UNIFIED IDEOGRAPH
0x9D84	0x63C6	#CJK UNIFIED IDEOGRAPH
0x9D85	0x63E3	#CJK UNIFIED IDEOGRAPH
0x9D86	0x63C9	#CJK UNIFIED IDEOGRAPH
0x9D87	0x63D2	#CJK UNIFIED IDEOGRAPH
0x9D88	0x63F6	#CJK UNIFIED IDEOGRAPH
0x9D89	0x63C4	#CJK UNIFIED IDEOGRAPH
0x9D8A	0x6416	#CJK UNIFIED IDEOGRAPH
0x9D8B	0x6434	#CJK UNIFIED IDEOGRAPH
0x9D8C	0x6406	#CJK UNIFIED IDEOGRAPH
0x9D8D	0x6413	#CJK UNIFIED IDEOGRAPH
0x9D8E	0x6426	#CJK UNIFIED IDEOGRAPH
0x9D8F	0x6436	#CJK UNIFIED IDEOGRAPH
0x9D90	0x651D	#CJK UNIFIED IDEOGRAPH
0x9D91	0x6417	#CJK UNIFIED IDEOGRAPH
0x9D92	0x6428	#CJK UNIFIED IDEOGRAPH
0x9D93	0x640F	#CJK UNIFIED IDEOGRAPH
0x9D94	0x6467	#CJK UNIFIED IDEOGRAPH
0x9D95	0x646F	#CJK UNIFIED IDEOGRAPH
0x9D96	0x6476	#CJK UNIFIED IDEOGRAPH
0x9D97	0x644E	#CJK UNIFIED IDEOGRAPH
0x9D98	0x652A	#CJK UNIFIED IDEOGRAPH
0x9D99	0x6495	#CJK UNIFIED IDEOGRAPH
0x9D9A	0x6493	#CJK UNIFIED IDEOGRAPH
0x9D9B	0x64A5	#CJK UNIFIED IDEOGRAPH
0x9D9C	0x64A9	#CJK UNIFIED IDEOGRAPH
0x9D9D	0x6488	#CJK UNIFIED IDEOGRAPH
0x9D9E	0x64BC	#CJK UNIFIED IDEOGRAPH
0x9D9F	0x64DA	#CJK UNIFIED IDEOGRAPH
0x9DA0	0x64D2	#CJK UNIFIED IDEOGRAPH
0x9DA1	0x64C5	#CJK UNIFIED IDEOGRAPH
0x9DA2	0x64C7	#CJK UNIFIED IDEOGRAPH
0x9DA3	0x64BB	#CJK UNIFIED IDEOGRAPH
0x9DA4	0x64D8	#CJK UNIFIED IDEOGRAPH
0x9DA5	0x64C2	#CJK UNIFIED IDEOGRAPH
0x9DA6	0x64F1	#CJK UNIFIED IDEOGRAPH
0x9DA7	0x64E7	#CJK UNIFIED IDEOGRAPH
0x9DA8	0x8209	#CJK UNIFIED IDEOGRAPH
0x9DA9	0x64E0	#CJK UNIFIED IDEOGRAPH
0x9DAA	0x64E1	#CJK UNIFIED IDEOGRAPH
0x9DAB	0x62AC	#CJK UNIFIED IDEOGRAPH
0x9DAC	0x64E3	#CJK UNIFIED IDEOGRAPH
0x9DAD	0x64EF	#CJK UNIFIED IDEOGRAPH
0x9DAE	0x652C	#CJK UNIFIED IDEOGRAPH
0x9DAF	0x64F6	#CJK UNIFIED IDEOGRAPH
0x9DB0	0x64F4	#CJK UNIFIED IDEOGRAPH
0x9DB1	0x64F2	#CJK UNIFIED IDEOGRAPH
0x9DB2	0x64FA	#CJK UNIFIED IDEOGRAPH
0x9DB3	0x6500	#CJK UNIFIED IDEOGRAPH
0x9DB4	0x64FD	#CJK UNIFIED IDEOGRAPH
0x9DB5	0x6518	#CJK UNIFIED IDEOGRAPH
0x9DB6	0x651C	#CJK UNIFIED IDEOGRAPH
0x9DB7	0x6505	#CJK UNIFIED IDEOGRAPH
0x9DB8	0x6524	#CJK UNIFIED IDEOGRAPH
0x9DB9	0x6523	#CJK UNIFIED IDEOGRAPH
0x9DBA	0x652B	#CJK UNIFIED IDEOGRAPH
0x9DBB	0x6534	#CJK UNIFIED IDEOGRAPH
0x9DBC	0x6535	#CJK UNIFIED IDEOGRAPH
0x9DBD	0x6537	#CJK UNIFIED IDEOGRAPH
0x9DBE	0x6536	#CJK UNIFIED IDEOGRAPH
0x9DBF	0x6538	#CJK UNIFIED IDEOGRAPH
0x9DC0	0x754B	#CJK UNIFIED IDEOGRAPH
0x9DC1	0x6548	#CJK UNIFIED IDEOGRAPH
0x9DC2	0x6556	#CJK UNIFIED IDEOGRAPH
0x9DC3	0x6555	#CJK UNIFIED IDEOGRAPH
0x9DC4	0x654D	#CJK UNIFIED IDEOGRAPH
0x9DC5	0x6558	#CJK UNIFIED IDEOGRAPH
0x9DC6	0x655E	#CJK UNIFIED IDEOGRAPH
0x9DC7	0x655D	#CJK UNIFIED IDEOGRAPH
0x9DC8	0x6572	#CJK UNIFIED IDEOGRAPH
0x9DC9	0x6578	#CJK UNIFIED IDEOGRAPH
0x9DCA	0x6582	#CJK UNIFIED IDEOGRAPH
0x9DCB	0x6583	#CJK UNIFIED IDEOGRAPH
0x9DCC	0x8B8A	#CJK UNIFIED IDEOGRAPH
0x9DCD	0x659B	#CJK UNIFIED IDEOGRAPH
0x9DCE	0x659F	#CJK UNIFIED IDEOGRAPH
0x9DCF	0x65AB	#CJK UNIFIED IDEOGRAPH
0x9DD0	0x65B7	#CJK UNIFIED IDEOGRAPH
0x9DD1	0x65C3	#CJK UNIFIED IDEOGRAPH
0x9DD2	0x65C6	#CJK UNIFIED IDEOGRAPH
0x9DD3	0x65C1	#CJK UNIFIED IDEOGRAPH
0x9DD4	0x65C4	#CJK UNIFIED IDEOGRAPH
0x9DD5	0x65CC	#CJK UNIFIED IDEOGRAPH
0x9DD6	0x65D2	#CJK UNIFIED IDEOGRAPH
0x9DD7	0x65DB	#CJK UNIFIED IDEOGRAPH
0x9DD8	0x65D9	#CJK UNIFIED IDEOGRAPH
0x9DD9	0x65E0	#CJK UNIFIED IDEOGRAPH
0x9DDA	0x65E1	#CJK UNIFIED IDEOGRAPH
0x9DDB	0x65F1	#CJK UNIFIED IDEOGRAPH
0x9DDC	0x6772	#CJK UNIFIED IDEOGRAPH
0x9DDD	0x660A	#CJK UNIFIED IDEOGRAPH
0x9DDE	0x6603	#CJK UNIFIED IDEOGRAPH
0x9DDF	0x65FB	#CJK UNIFIED IDEOGRAPH
0x9DE0	0x6773	#CJK UNIFIED IDEOGRAPH
0x9DE1	0x6635	#CJK UNIFIED IDEOGRAPH
0x9DE2	0x6636	#CJK UNIFIED IDEOGRAPH
0x9DE3	0x6634	#CJK UNIFIED IDEOGRAPH
0x9DE4	0x661C	#CJK UNIFIED IDEOGRAPH
0x9DE5	0x664F	#CJK UNIFIED IDEOGRAPH
0x9DE6	0x6644	#CJK UNIFIED IDEOGRAPH
0x9DE7	0x6649	#CJK UNIFIED IDEOGRAPH
0x9DE8	0x6641	#CJK UNIFIED IDEOGRAPH
0x9DE9	0x665E	#CJK UNIFIED IDEOGRAPH
0x9DEA	0x665D	#CJK UNIFIED IDEOGRAPH
0x9DEB	0x6664	#CJK UNIFIED IDEOGRAPH
0x9DEC	0x6667	#CJK UNIFIED IDEOGRAPH
0x9DED	0x6668	#CJK UNIFIED IDEOGRAPH
0x9DEE	0x665F	#CJK UNIFIED IDEOGRAPH
0x9DEF	0x6662	#CJK UNIFIED IDEOGRAPH
0x9DF0	0x6670	#CJK UNIFIED IDEOGRAPH
0x9DF1	0x6683	#CJK UNIFIED IDEOGRAPH
0x9DF2	0x6688	#CJK UNIFIED IDEOGRAPH
0x9DF3	0x668E	#CJK UNIFIED IDEOGRAPH
0x9DF4	0x6689	#CJK UNIFIED IDEOGRAPH
0x9DF5	0x6684	#CJK UNIFIED IDEOGRAPH
0x9DF6	0x6698	#CJK UNIFIED IDEOGRAPH
0x9DF7	0x669D	#CJK UNIFIED IDEOGRAPH
0x9DF8	0x66C1	#CJK UNIFIED IDEOGRAPH
0x9DF9	0x66B9	#CJK UNIFIED IDEOGRAPH
0x9DFA	0x66C9	#CJK UNIFIED IDEOGRAPH
0x9DFB	0x66BE	#CJK UNIFIED IDEOGRAPH
0x9DFC	0x66BC	#CJK UNIFIED IDEOGRAPH
0x9E40	0x66C4	#CJK UNIFIED IDEOGRAPH
0x9E41	0x66B8	#CJK UNIFIED IDEOGRAPH
0x9E42	0x66D6	#CJK UNIFIED IDEOGRAPH
0x9E43	0x66DA	#CJK UNIFIED IDEOGRAPH
0x9E44	0x66E0	#CJK UNIFIED IDEOGRAPH
0x9E45	0x663F	#CJK UNIFIED IDEOGRAPH
0x9E46	0x66E6	#CJK UNIFIED IDEOGRAPH
0x9E47	0x66E9	#CJK UNIFIED IDEOGRAPH
0x9E48	0x66F0	#CJK UNIFIED IDEOGRAPH
0x9E49	0x66F5	#CJK UNIFIED IDEOGRAPH
0x9E4A	0x66F7	#CJK UNIFIED IDEOGRAPH
0x9E4B	0x670F	#CJK UNIFIED IDEOGRAPH
0x9E4C	0x6716	#CJK UNIFIED IDEOGRAPH
0x9E4D	0x671E	#CJK UNIFIED IDEOGRAPH
0x9E4E	0x6726	#CJK UNIFIED IDEOGRAPH
0x9E4F	0x6727	#CJK UNIFIED IDEOGRAPH
0x9E50	0x9738	#CJK UNIFIED IDEOGRAPH
0x9E51	0x672E	#CJK UNIFIED IDEOGRAPH
0x9E52	0x673F	#CJK UNIFIED IDEOGRAPH
0x9E53	0x6736	#CJK UNIFIED IDEOGRAPH
0x9E54	0x6741	#CJK UNIFIED IDEOGRAPH
0x9E55	0x6738	#CJK UNIFIED IDEOGRAPH
0x9E56	0x6737	#CJK UNIFIED IDEOGRAPH
0x9E57	0x6746	#CJK UNIFIED IDEOGRAPH
0x9E58	0x675E	#CJK UNIFIED IDEOGRAPH
0x9E59	0x6760	#CJK UNIFIED IDEOGRAPH
0x9E5A	0x6759	#CJK UNIFIED IDEOGRAPH
0x9E5B	0x6763	#CJK UNIFIED IDEOGRAPH
0x9E5C	0x6764	#CJK UNIFIED IDEOGRAPH
0x9E5D	0x6789	#CJK UNIFIED IDEOGRAPH
0x9E5E	0x6770	#CJK UNIFIED IDEOGRAPH
0x9E5F	0x67A9	#CJK UNIFIED IDEOGRAPH
0x9E60	0x677C	#CJK UNIFIED IDEOGRAPH
0x9E61	0x676A	#CJK UNIFIED IDEOGRAPH
0x9E62	0x678C	#CJK UNIFIED IDEOGRAPH
0x9E63	0x678B	#CJK UNIFIED IDEOGRAPH
0x9E64	0x67A6	#CJK UNIFIED IDEOGRAPH
0x9E65	0x67A1	#CJK UNIFIED IDEOGRAPH
0x9E66	0x6785	#CJK UNIFIED IDEOGRAPH
0x9E67	0x67B7	#CJK UNIFIED IDEOGRAPH
0x9E68	0x67EF	#CJK UNIFIED IDEOGRAPH
0x9E69	0x67B4	#CJK UNIFIED IDEOGRAPH
0x9E6A	0x67EC	#CJK UNIFIED IDEOGRAPH
0x9E6B	0x67B3	#CJK UNIFIED IDEOGRAPH
0x9E6C	0x67E9	#CJK UNIFIED IDEOGRAPH
0x9E6D	0x67B8	#CJK UNIFIED IDEOGRAPH
0x9E6E	0x67E4	#CJK UNIFIED IDEOGRAPH
0x9E6F	0x67DE	#CJK UNIFIED IDEOGRAPH
0x9E70	0x67DD	#CJK UNIFIED IDEOGRAPH
0x9E71	0x67E2	#CJK UNIFIED IDEOGRAPH
0x9E72	0x67EE	#CJK UNIFIED IDEOGRAPH
0x9E73	0x67B9	#CJK UNIFIED IDEOGRAPH
0x9E74	0x67CE	#CJK UNIFIED IDEOGRAPH
0x9E75	0x67C6	#CJK UNIFIED IDEOGRAPH
0x9E76	0x67E7	#CJK UNIFIED IDEOGRAPH
0x9E77	0x6A9C	#CJK UNIFIED IDEOGRAPH
0x9E78	0x681E	#CJK UNIFIED IDEOGRAPH
0x9E79	0x6846	#CJK UNIFIED IDEOGRAPH
0x9E7A	0x6829	#CJK UNIFIED IDEOGRAPH
0x9E7B	0x6840	#CJK UNIFIED IDEOGRAPH
0x9E7C	0x684D	#CJK UNIFIED IDEOGRAPH
0x9E7D	0x6832	#CJK UNIFIED IDEOGRAPH
0x9E7E	0x684E	#CJK UNIFIED IDEOGRAPH
0x9E80	0x68B3	#CJK UNIFIED IDEOGRAPH
0x9E81	0x682B	#CJK UNIFIED IDEOGRAPH
0x9E82	0x6859	#CJK UNIFIED IDEOGRAPH
0x9E83	0x6863	#CJK UNIFIED IDEOGRAPH
0x9E84	0x6877	#CJK UNIFIED IDEOGRAPH
0x9E85	0x687F	#CJK UNIFIED IDEOGRAPH
0x9E86	0x689F	#CJK UNIFIED IDEOGRAPH
0x9E87	0x688F	#CJK UNIFIED IDEOGRAPH
0x9E88	0x68AD	#CJK UNIFIED IDEOGRAPH
0x9E89	0x6894	#CJK UNIFIED IDEOGRAPH
0x9E8A	0x689D	#CJK UNIFIED IDEOGRAPH
0x9E8B	0x689B	#CJK UNIFIED IDEOGRAPH
0x9E8C	0x6883	#CJK UNIFIED IDEOGRAPH
0x9E8D	0x6AAE	#CJK UNIFIED IDEOGRAPH
0x9E8E	0x68B9	#CJK UNIFIED IDEOGRAPH
0x9E8F	0x6874	#CJK UNIFIED IDEOGRAPH
0x9E90	0x68B5	#CJK UNIFIED IDEOGRAPH
0x9E91	0x68A0	#CJK UNIFIED IDEOGRAPH
0x9E92	0x68BA	#CJK UNIFIED IDEOGRAPH
0x9E93	0x690F	#CJK UNIFIED IDEOGRAPH
0x9E94	0x688D	#CJK UNIFIED IDEOGRAPH
0x9E95	0x687E	#CJK UNIFIED IDEOGRAPH
0x9E96	0x6901	#CJK UNIFIED IDEOGRAPH
0x9E97	0x68CA	#CJK UNIFIED IDEOGRAPH
0x9E98	0x6908	#CJK UNIFIED IDEOGRAPH
0x9E99	0x68D8	#CJK UNIFIED IDEOGRAPH
0x9E9A	0x6922	#CJK UNIFIED IDEOGRAPH
0x9E9B	0x6926	#CJK UNIFIED IDEOGRAPH
0x9E9C	0x68E1	#CJK UNIFIED IDEOGRAPH
0x9E9D	0x690C	#CJK UNIFIED IDEOGRAPH
0x9E9E	0x68CD	#CJK UNIFIED IDEOGRAPH
0x9E9F	0x68D4	#CJK UNIFIED IDEOGRAPH
0x9EA0	0x68E7	#CJK UNIFIED IDEOGRAPH
0x9EA1	0x68D5	#CJK UNIFIED IDEOGRAPH
0x9EA2	0x6936	#CJK UNIFIED IDEOGRAPH
0x9EA3	0x6912	#CJK UNIFIED IDEOGRAPH
0x9EA4	0x6904	#CJK UNIFIED IDEOGRAPH
0x9EA5	0x68D7	#CJK UNIFIED IDEOGRAPH
0x9EA6	0x68E3	#CJK UNIFIED IDEOGRAPH
0x9EA7	0x6925	#CJK UNIFIED IDEOGRAPH
0x9EA8	0x68F9	#CJK UNIFIED IDEOGRAPH
0x9EA9	0x68E0	#CJK UNIFIED IDEOGRAPH
0x9EAA	0x68EF	#CJK UNIFIED IDEOGRAPH
0x9EAB	0x6928	#CJK UNIFIED IDEOGRAPH
0x9EAC	0x692A	#CJK UNIFIED IDEOGRAPH
0x9EAD	0x691A	#CJK UNIFIED IDEOGRAPH
0x9EAE	0x6923	#CJK UNIFIED IDEOGRAPH
0x9EAF	0x6921	#CJK UNIFIED IDEOGRAPH
0x9EB0	0x68C6	#CJK UNIFIED IDEOGRAPH
0x9EB1	0x6979	#CJK UNIFIED IDEOGRAPH
0x9EB2	0x6977	#CJK UNIFIED IDEOGRAPH
0x9EB3	0x695C	#CJK UNIFIED IDEOGRAPH
0x9EB4	0x6978	#CJK UNIFIED IDEOGRAPH
0x9EB5	0x696B	#CJK UNIFIED IDEOGRAPH
0x9EB6	0x6954	#CJK UNIFIED IDEOGRAPH
0x9EB7	0x697E	#CJK UNIFIED IDEOGRAPH
0x9EB8	0x696E	#CJK UNIFIED IDEOGRAPH
0x9EB9	0x6939	#CJK UNIFIED IDEOGRAPH
0x9EBA	0x6974	#CJK UNIFIED IDEOGRAPH
0x9EBB	0x693D	#CJK UNIFIED IDEOGRAPH
0x9EBC	0x6959	#CJK UNIFIED IDEOGRAPH
0x9EBD	0x6930	#CJK UNIFIED IDEOGRAPH
0x9EBE	0x6961	#CJK UNIFIED IDEOGRAPH
0x9EBF	0x695E	#CJK UNIFIED IDEOGRAPH
0x9EC0	0x695D	#CJK UNIFIED IDEOGRAPH
0x9EC1	0x6981	#CJK UNIFIED IDEOGRAPH
0x9EC2	0x696A	#CJK UNIFIED IDEOGRAPH
0x9EC3	0x69B2	#CJK UNIFIED IDEOGRAPH
0x9EC4	0x69AE	#CJK UNIFIED IDEOGRAPH
0x9EC5	0x69D0	#CJK UNIFIED IDEOGRAPH
0x9EC6	0x69BF	#CJK UNIFIED IDEOGRAPH
0x9EC7	0x69C1	#CJK UNIFIED IDEOGRAPH
0x9EC8	0x69D3	#CJK UNIFIED IDEOGRAPH
0x9EC9	0x69BE	#CJK UNIFIED IDEOGRAPH
0x9ECA	0x69CE	#CJK UNIFIED IDEOGRAPH
0x9ECB	0x5BE8	#CJK UNIFIED IDEOGRAPH
0x9ECC	0x69CA	#CJK UNIFIED IDEOGRAPH
0x9ECD	0x69DD	#CJK UNIFIED IDEOGRAPH
0x9ECE	0x69BB	#CJK UNIFIED IDEOGRAPH
0x9ECF	0x69C3	#CJK UNIFIED IDEOGRAPH
0x9ED0	0x69A7	#CJK UNIFIED IDEOGRAPH
0x9ED1	0x6A2E	#CJK UNIFIED IDEOGRAPH
0x9ED2	0x6991	#CJK UNIFIED IDEOGRAPH
0x9ED3	0x69A0	#CJK UNIFIED IDEOGRAPH
0x9ED4	0x699C	#CJK UNIFIED IDEOGRAPH
0x9ED5	0x6995	#CJK UNIFIED IDEOGRAPH
0x9ED6	0x69B4	#CJK UNIFIED IDEOGRAPH
0x9ED7	0x69DE	#CJK UNIFIED IDEOGRAPH
0x9ED8	0x69E8	#CJK UNIFIED IDEOGRAPH
0x9ED9	0x6A02	#CJK UNIFIED IDEOGRAPH
0x9EDA	0x6A1B	#CJK UNIFIED IDEOGRAPH
0x9EDB	0x69FF	#CJK UNIFIED IDEOGRAPH
0x9EDC	0x6B0A	#CJK UNIFIED IDEOGRAPH
0x9EDD	0x69F9	#CJK UNIFIED IDEOGRAPH
0x9EDE	0x69F2	#CJK UNIFIED IDEOGRAPH
0x9EDF	0x69E7	#CJK UNIFIED IDEOGRAPH
0x9EE0	0x6A05	#CJK UNIFIED IDEOGRAPH
0x9EE1	0x69B1	#CJK UNIFIED IDEOGRAPH
0x9EE2	0x6A1E	#CJK UNIFIED IDEOGRAPH
0x9EE3	0x69ED	#CJK UNIFIED IDEOGRAPH
0x9EE4	0x6A14	#CJK UNIFIED IDEOGRAPH
0x9EE5	0x69EB	#CJK UNIFIED IDEOGRAPH
0x9EE6	0x6A0A	#CJK UNIFIED IDEOGRAPH
0x9EE7	0x6A12	#CJK UNIFIED IDEOGRAPH
0x9EE8	0x6AC1	#CJK UNIFIED IDEOGRAPH
0x9EE9	0x6A23	#CJK UNIFIED IDEOGRAPH
0x9EEA	0x6A13	#CJK UNIFIED IDEOGRAPH
0x9EEB	0x6A44	#CJK UNIFIED IDEOGRAPH
0x9EEC	0x6A0C	#CJK UNIFIED IDEOGRAPH
0x9EED	0x6A72	#CJK UNIFIED IDEOGRAPH
0x9EEE	0x6A36	#CJK UNIFIED IDEOGRAPH
0x9EEF	0x6A78	#CJK UNIFIED IDEOGRAPH
0x9EF0	0x6A47	#CJK UNIFIED IDEOGRAPH
0x9EF1	0x6A62	#CJK UNIFIED IDEOGRAPH
0x9EF2	0x6A59	#CJK UNIFIED IDEOGRAPH
0x9EF3	0x6A66	#CJK UNIFIED IDEOGRAPH
0x9EF4	0x6A48	#CJK UNIFIED IDEOGRAPH
0x9EF5	0x6A38	#CJK UNIFIED IDEOGRAPH
0x9EF6	0x6A22	#CJK UNIFIED IDEOGRAPH
0x9EF7	0x6A90	#CJK UNIFIED IDEOGRAPH
0x9EF8	0x6A8D	#CJK UNIFIED IDEOGRAPH
0x9EF9	0x6AA0	#CJK UNIFIED IDEOGRAPH
0x9EFA	0x6A84	#CJK UNIFIED IDEOGRAPH
0x9EFB	0x6AA2	#CJK UNIFIED IDEOGRAPH
0x9EFC	0x6AA3	#CJK UNIFIED IDEOGRAPH
0x9F40	0x6A97	#CJK UNIFIED IDEOGRAPH
0x9F41	0x8617	#CJK UNIFIED IDEOGRAPH
0x9F42	0x6ABB	#CJK UNIFIED IDEOGRAPH
0x9F43	0x6AC3	#CJK UNIFIED IDEOGRAPH
0x9F44	0x6AC2	#CJK UNIFIED IDEOGRAPH
0x9F45	0x6AB8	#CJK UNIFIED IDEOGRAPH
0x9F46	0x6AB3	#CJK UNIFIED IDEOGRAPH
0x9F47	0x6AAC	#CJK UNIFIED IDEOGRAPH
0x9F48	0x6ADE	#CJK UNIFIED IDEOGRAPH
0x9F49	0x6AD1	#CJK UNIFIED IDEOGRAPH
0x9F4A	0x6ADF	#CJK UNIFIED IDEOGRAPH
0x9F4B	0x6AAA	#CJK UNIFIED IDEOGRAPH
0x9F4C	0x6ADA	#CJK UNIFIED IDEOGRAPH
0x9F4D	0x6AEA	#CJK UNIFIED IDEOGRAPH
0x9F4E	0x6AFB	#CJK UNIFIED IDEOGRAPH
0x9F4F	0x6B05	#CJK UNIFIED IDEOGRAPH
0x9F50	0x8616	#CJK UNIFIED IDEOGRAPH
0x9F51	0x6AFA	#CJK UNIFIED IDEOGRAPH
0x9F52	0x6B12	#CJK UNIFIED IDEOGRAPH
0x9F53	0x6B16	#CJK UNIFIED IDEOGRAPH
0x9F54	0x9B31	#CJK UNIFIED IDEOGRAPH
0x9F55	0x6B1F	#CJK UNIFIED IDEOGRAPH
0x9F56	0x6B38	#CJK UNIFIED IDEOGRAPH
0x9F57	0x6B37	#CJK UNIFIED IDEOGRAPH
0x9F58	0x76DC	#CJK UNIFIED IDEOGRAPH
0x9F59	0x6B39	#CJK UNIFIED IDEOGRAPH
0x9F5A	0x98EE	#CJK UNIFIED IDEOGRAPH
0x9F5B	0x6B47	#CJK UNIFIED IDEOGRAPH
0x9F5C	0x6B43	#CJK UNIFIED IDEOGRAPH
0x9F5D	0x6B49	#CJK UNIFIED IDEOGRAPH
0x9F5E	0x6B50	#CJK UNIFIED IDEOGRAPH
0x9F5F	0x6B59	#CJK UNIFIED IDEOGRAPH
0x9F60	0x6B54	#CJK UNIFIED IDEOGRAPH
0x9F61	0x6B5B	#CJK UNIFIED IDEOGRAPH
0x9F62	0x6B5F	#CJK UNIFIED IDEOGRAPH
0x9F63	0x6B61	#CJK UNIFIED IDEOGRAPH
0x9F64	0x6B78	#CJK UNIFIED IDEOGRAPH
0x9F65	0x6B79	#CJK UNIFIED IDEOGRAPH
0x9F66	0x6B7F	#CJK UNIFIED IDEOGRAPH
0x9F67	0x6B80	#CJK UNIFIED IDEOGRAPH
0x9F68	0x6B84	#CJK UNIFIED IDEOGRAPH
0x9F69	0x6B83	#CJK UNIFIED IDEOGRAPH
0x9F6A	0x6B8D	#CJK UNIFIED IDEOGRAPH
0x9F6B	0x6B98	#CJK UNIFIED IDEOGRAPH
0x9F6C	0x6B95	#CJK UNIFIED IDEOGRAPH
0x9F6D	0x6B9E	#CJK UNIFIED IDEOGRAPH
0x9F6E	0x6BA4	#CJK UNIFIED IDEOGRAPH
0x9F6F	0x6BAA	#CJK UNIFIED IDEOGRAPH
0x9F70	0x6BAB	#CJK UNIFIED IDEOGRAPH
0x9F71	0x6BAF	#CJK UNIFIED IDEOGRAPH
0x9F72	0x6BB2	#CJK UNIFIED IDEOGRAPH
0x9F73	0x6BB1	#CJK UNIFIED IDEOGRAPH
0x9F74	0x6BB3	#CJK UNIFIED IDEOGRAPH
0x9F75	0x6BB7	#CJK UNIFIED IDEOGRAPH
0x9F76	0x6BBC	#CJK UNIFIED IDEOGRAPH
0x9F77	0x6BC6	#CJK UNIFIED IDEOGRAPH
0x9F78	0x6BCB	#CJK UNIFIED IDEOGRAPH
0x9F79	0x6BD3	#CJK UNIFIED IDEOGRAPH
0x9F7A	0x6BDF	#CJK UNIFIED IDEOGRAPH
0x9F7B	0x6BEC	#CJK UNIFIED IDEOGRAPH
0x9F7C	0x6BEB	#CJK UNIFIED IDEOGRAPH
0x9F7D	0x6BF3	#CJK UNIFIED IDEOGRAPH
0x9F7E	0x6BEF	#CJK UNIFIED IDEOGRAPH
0x9F80	0x9EBE	#CJK UNIFIED IDEOGRAPH
0x9F81	0x6C08	#CJK UNIFIED IDEOGRAPH
0x9F82	0x6C13	#CJK UNIFIED IDEOGRAPH
0x9F83	0x6C14	#CJK UNIFIED IDEOGRAPH
0x9F84	0x6C1B	#CJK UNIFIED IDEOGRAPH
0x9F85	0x6C24	#CJK UNIFIED IDEOGRAPH
0x9F86	0x6C23	#CJK UNIFIED IDEOGRAPH
0x9F87	0x6C5E	#CJK UNIFIED IDEOGRAPH
0x9F88	0x6C55	#CJK UNIFIED IDEOGRAPH
0x9F89	0x6C62	#CJK UNIFIED IDEOGRAPH
0x9F8A	0x6C6A	#CJK UNIFIED IDEOGRAPH
0x9F8B	0x6C82	#CJK UNIFIED IDEOGRAPH
0x9F8C	0x6C8D	#CJK UNIFIED IDEOGRAPH
0x9F8D	0x6C9A	#CJK UNIFIED IDEOGRAPH
0x9F8E	0x6C81	#CJK UNIFIED IDEOGRAPH
0x9F8F	0x6C9B	#CJK UNIFIED IDEOGRAPH
0x9F90	0x6C7E	#CJK UNIFIED IDEOGRAPH
0x9F91	0x6C68	#CJK UNIFIED IDEOGRAPH
0x9F92	0x6C73	#CJK UNIFIED IDEOGRAPH
0x9F93	0x6C92	#CJK UNIFIED IDEOGRAPH
0x9F94	0x6C90	#CJK UNIFIED IDEOGRAPH
0x9F95	0x6CC4	#CJK UNIFIED IDEOGRAPH
0x9F96	0x6CF1	#CJK UNIFIED IDEOGRAPH
0x9F97	0x6CD3	#CJK UNIFIED IDEOGRAPH
0x9F98	0x6CBD	#CJK UNIFIED IDEOGRAPH
0x9F99	0x6CD7	#CJK UNIFIED IDEOGRAPH
0x9F9A	0x6CC5	#CJK UNIFIED IDEOGRAPH
0x9F9B	0x6CDD	#CJK UNIFIED IDEOGRAPH
0x9F9C	0x6CAE	#CJK UNIFIED IDEOGRAPH
0x9F9D	0x6CB1	#CJK UNIFIED IDEOGRAPH
0x9F9E	0x6CBE	#CJK UNIFIED IDEOGRAPH
0x9F9F	0x6CBA	#CJK UNIFIED IDEOGRAPH
0x9FA0	0x6CDB	#CJK UNIFIED IDEOGRAPH
0x9FA1	0x6CEF	#CJK UNIFIED IDEOGRAPH
0x9FA2	0x6CD9	#CJK UNIFIED IDEOGRAPH
0x9FA3	0x6CEA	#CJK UNIFIED IDEOGRAPH
0x9FA4	0x6D1F	#CJK UNIFIED IDEOGRAPH
0x9FA5	0x884D	#CJK UNIFIED IDEOGRAPH
0x9FA6	0x6D36	#CJK UNIFIED IDEOGRAPH
0x9FA7	0x6D2B	#CJK UNIFIED IDEOGRAPH
0x9FA8	0x6D3D	#CJK UNIFIED IDEOGRAPH
0x9FA9	0x6D38	#CJK UNIFIED IDEOGRAPH
0x9FAA	0x6D19	#CJK UNIFIED IDEOGRAPH
0x9FAB	0x6D35	#CJK UNIFIED IDEOGRAPH
0x9FAC	0x6D33	#CJK UNIFIED IDEOGRAPH
0x9FAD	0x6D12	#CJK UNIFIED IDEOGRAPH
0x9FAE	0x6D0C	#CJK UNIFIED IDEOGRAPH
0x9FAF	0x6D63	#CJK UNIFIED IDEOGRAPH
0x9FB0	0x6D93	#CJK UNIFIED IDEOGRAPH
0x9FB1	0x6D64	#CJK UNIFIED IDEOGRAPH
0x9FB2	0x6D5A	#CJK UNIFIED IDEOGRAPH
0x9FB3	0x6D79	#CJK UNIFIED IDEOGRAPH
0x9FB4	0x6D59	#CJK UNIFIED IDEOGRAPH
0x9FB5	0x6D8E	#CJK UNIFIED IDEOGRAPH
0x9FB6	0x6D95	#CJK UNIFIED IDEOGRAPH
0x9FB7	0x6FE4	#CJK UNIFIED IDEOGRAPH
0x9FB8	0x6D85	#CJK UNIFIED IDEOGRAPH
0x9FB9	0x6DF9	#CJK UNIFIED IDEOGRAPH
0x9FBA	0x6E15	#CJK UNIFIED IDEOGRAPH
0x9FBB	0x6E0A	#CJK UNIFIED IDEOGRAPH
0x9FBC	0x6DB5	#CJK UNIFIED IDEOGRAPH
0x9FBD	0x6DC7	#CJK UNIFIED IDEOGRAPH
0x9FBE	0x6DE6	#CJK UNIFIED IDEOGRAPH
0x9FBF	0x6DB8	#CJK UNIFIED IDEOGRAPH
0x9FC0	0x6DC6	#CJK UNIFIED IDEOGRAPH
0x9FC1	0x6DEC	#CJK UNIFIED IDEOGRAPH
0x9FC2	0x6DDE	#CJK UNIFIED IDEOGRAPH
0x9FC3	0x6DCC	#CJK UNIFIED IDEOGRAPH
0x9FC4	0x6DE8	#CJK UNIFIED IDEOGRAPH
0x9FC5	0x6DD2	#CJK UNIFIED IDEOGRAPH
0x9FC6	0x6DC5	#CJK UNIFIED IDEOGRAPH
0x9FC7	0x6DFA	#CJK UNIFIED IDEOGRAPH
0x9FC8	0x6DD9	#CJK UNIFIED IDEOGRAPH
0x9FC9	0x6DE4	#CJK UNIFIED IDEOGRAPH
0x9FCA	0x6DD5	#CJK UNIFIED IDEOGRAPH
0x9FCB	0x6DEA	#CJK UNIFIED IDEOGRAPH
0x9FCC	0x6DEE	#CJK UNIFIED IDEOGRAPH
0x9FCD	0x6E2D	#CJK UNIFIED IDEOGRAPH
0x9FCE	0x6E6E	#CJK UNIFIED IDEOGRAPH
0x9FCF	0x6E2E	#CJK UNIFIED IDEOGRAPH
0x9FD0	0x6E19	#CJK UNIFIED IDEOGRAPH
0x9FD1	0x6E72	#CJK UNIFIED IDEOGRAPH
0x9FD2	0x6E5F	#CJK UNIFIED IDEOGRAPH
0x9FD3	0x6E3E	#CJK UNIFIED IDEOGRAPH
0x9FD4	0x6E23	#CJK UNIFIED IDEOGRAPH
0x9FD5	0x6E6B	#CJK UNIFIED IDEOGRAPH
0x9FD6	0x6E2B	#CJK UNIFIED IDEOGRAPH
0x9FD7	0x6E76	#CJK UNIFIED IDEOGRAPH
0x9FD8	0x6E4D	#CJK UNIFIED IDEOGRAPH
0x9FD9	0x6E1F	#CJK UNIFIED IDEOGRAPH
0x9FDA	0x6E43	#CJK UNIFIED IDEOGRAPH
0x9FDB	0x6E3A	#CJK UNIFIED IDEOGRAPH
0x9FDC	0x6E4E	#CJK UNIFIED IDEOGRAPH
0x9FDD	0x6E24	#CJK UNIFIED IDEOGRAPH
0x9FDE	0x6EFF	#CJK UNIFIED IDEOGRAPH
0x9FDF	0x6E1D	#CJK UNIFIED IDEOGRAPH
0x9FE0	0x6E38	#CJK UNIFIED IDEOGRAPH
0x9FE1	0x6E82	#CJK UNIFIED IDEOGRAPH
0x9FE2	0x6EAA	#CJK UNIFIED IDEOGRAPH
0x9FE3	0x6E98	#CJK UNIFIED IDEOGRAPH
0x9FE4	0x6EC9	#CJK UNIFIED IDEOGRAPH
0x9FE5	0x6EB7	#CJK UNIFIED IDEOGRAPH
0x9FE6	0x6ED3	#CJK UNIFIED IDEOGRAPH
0x9FE7	0x6EBD	#CJK UNIFIED IDEOGRAPH
0x9FE8	0x6EAF	#CJK UNIFIED IDEOGRAPH
0x9FE9	0x6EC4	#CJK UNIFIED IDEOGRAPH
0x9FEA	0x6EB2	#CJK UNIFIED IDEOGRAPH
0x9FEB	0x6ED4	#CJK UNIFIED IDEOGRAPH
0x9FEC	0x6ED5	#CJK UNIFIED IDEOGRAPH
0x9FED	0x6E8F	#CJK UNIFIED IDEOGRAPH
0x9FEE	0x6EA5	#CJK UNIFIED IDEOGRAPH
0x9FEF	0x6EC2	#CJK UNIFIED IDEOGRAPH
0x9FF0	0x6E9F	#CJK UNIFIED IDEOGRAPH
0x9FF1	0x6F41	#CJK UNIFIED IDEOGRAPH
0x9FF2	0x6F11	#CJK UNIFIED IDEOGRAPH
0x9FF3	0x704C	#CJK UNIFIED IDEOGRAPH
0x9FF4	0x6EEC	#CJK UNIFIED IDEOGRAPH
0x9FF5	0x6EF8	#CJK UNIFIED IDEOGRAPH
0x9FF6	0x6EFE	#CJK UNIFIED IDEOGRAPH
0x9FF7	0x6F3F	#CJK UNIFIED IDEOGRAPH
0x9FF8	0x6EF2	#CJK UNIFIED IDEOGRAPH
0x9FF9	0x6F31	#CJK UNIFIED IDEOGRAPH
0x9FFA	0x6EEF	#CJK UNIFIED IDEOGRAPH
0x9FFB	0x6F32	#CJK UNIFIED IDEOGRAPH
0x9FFC	0x6ECC	#CJK UNIFIED IDEOGRAPH
0xE040	0x6F3E	#CJK UNIFIED IDEOGRAPH
0xE041	0x6F13	#CJK UNIFIED IDEOGRAPH
0xE042	0x6EF7	#CJK UNIFIED IDEOGRAPH
0xE043	0x6F86	#CJK UNIFIED IDEOGRAPH
0xE044	0x6F7A	#CJK UNIFIED IDEOGRAPH
0xE045	0x6F78	#CJK UNIFIED IDEOGRAPH
0xE046	0x6F81	#CJK UNIFIED IDEOGRAPH
0xE047	0x6F80	#CJK UNIFIED IDEOGRAPH
0xE048	0x6F6F	#CJK UNIFIED IDEOGRAPH
0xE049	0x6F5B	#CJK UNIFIED IDEOGRAPH
0xE04A	0x6FF3	#CJK UNIFIED IDEOGRAPH
0xE04B	0x6F6D	#CJK UNIFIED IDEOGRAPH
0xE04C	0x6F82	#CJK UNIFIED IDEOGRAPH
0xE04D	0x6F7C	#CJK UNIFIED IDEOGRAPH
0xE04E	0x6F58	#CJK UNIFIED IDEOGRAPH
0xE04F	0x6F8E	#CJK UNIFIED IDEOGRAPH
0xE050	0x6F91	#CJK UNIFIED IDEOGRAPH
0xE051	0x6FC2	#CJK UNIFIED IDEOGRAPH
0xE052	0x6F66	#CJK UNIFIED IDEOGRAPH
0xE053	0x6FB3	#CJK UNIFIED IDEOGRAPH
0xE054	0x6FA3	#CJK UNIFIED IDEOGRAPH
0xE055	0x6FA1	#CJK UNIFIED IDEOGRAPH
0xE056	0x6FA4	#CJK UNIFIED IDEOGRAPH
0xE057	0x6FB9	#CJK UNIFIED IDEOGRAPH
0xE058	0x6FC6	#CJK UNIFIED IDEOGRAPH
0xE059	0x6FAA	#CJK UNIFIED IDEOGRAPH
0xE05A	0x6FDF	#CJK UNIFIED IDEOGRAPH
0xE05B	0x6FD5	#CJK UNIFIED IDEOGRAPH
0xE05C	0x6FEC	#CJK UNIFIED IDEOGRAPH
0xE05D	0x6FD4	#CJK UNIFIED IDEOGRAPH
0xE05E	0x6FD8	#CJK UNIFIED IDEOGRAPH
0xE05F	0x6FF1	#CJK UNIFIED IDEOGRAPH
0xE060	0x6FEE	#CJK UNIFIED IDEOGRAPH
0xE061	0x6FDB	#CJK UNIFIED IDEOGRAPH
0xE062	0x7009	#CJK UNIFIED IDEOGRAPH
0xE063	0x700B	#CJK UNIFIED IDEOGRAPH
0xE064	0x6FFA	#CJK UNIFIED IDEOGRAPH
0xE065	0x7011	#CJK UNIFIED IDEOGRAPH
0xE066	0x7001	#CJK UNIFIED IDEOGRAPH
0xE067	0x700F	#CJK UNIFIED IDEOGRAPH
0xE068	0x6FFE	#CJK UNIFIED IDEOGRAPH
0xE069	0x701B	#CJK UNIFIED IDEOGRAPH
0xE06A	0x701A	#CJK UNIFIED IDEOGRAPH
0xE06B	0x6F74	#CJK UNIFIED IDEOGRAPH
0xE06C	0x701D	#CJK UNIFIED IDEOGRAPH
0xE06D	0x7018	#CJK UNIFIED IDEOGRAPH
0xE06E	0x701F	#CJK UNIFIED IDEOGRAPH
0xE06F	0x7030	#CJK UNIFIED IDEOGRAPH
0xE070	0x703E	#CJK UNIFIED IDEOGRAPH
0xE071	0x7032	#CJK UNIFIED IDEOGRAPH
0xE072	0x7051	#CJK UNIFIED IDEOGRAPH
0xE073	0x7063	#CJK UNIFIED IDEOGRAPH
0xE074	0x7099	#CJK UNIFIED IDEOGRAPH
0xE075	0x7092	#CJK UNIFIED IDEOGRAPH
0xE076	0x70AF	#CJK UNIFIED IDEOGRAPH
0xE077	0x70F1	#CJK UNIFIED IDEOGRAPH
0xE078	0x70AC	#CJK UNIFIED IDEOGRAPH
0xE079	0x70B8	#CJK UNIFIED IDEOGRAPH
0xE07A	0x70B3	#CJK UNIFIED IDEOGRAPH
0xE07B	0x70AE	#CJK UNIFIED IDEOGRAPH
0xE07C	0x70DF	#CJK UNIFIED IDEOGRAPH
0xE07D	0x70CB	#CJK UNIFIED IDEOGRAPH
0xE07E	0x70DD	#CJK UNIFIED IDEOGRAPH
0xE080	0x70D9	#CJK UNIFIED IDEOGRAPH
0xE081	0x7109	#CJK UNIFIED IDEOGRAPH
0xE082	0x70FD	#CJK UNIFIED IDEOGRAPH
0xE083	0x711C	#CJK UNIFIED IDEOGRAPH
0xE084	0x7119	#CJK UNIFIED IDEOGRAPH
0xE085	0x7165	#CJK UNIFIED IDEOGRAPH
0xE086	0x7155	#CJK UNIFIED IDEOGRAPH
0xE087	0x7188	#CJK UNIFIED IDEOGRAPH
0xE088	0x7166	#CJK UNIFIED IDEOGRAPH
0xE089	0x7162	#CJK UNIFIED IDEOGRAPH
0xE08A	0x714C	#CJK UNIFIED IDEOGRAPH
0xE08B	0x7156	#CJK UNIFIED IDEOGRAPH
0xE08C	0x716C	#CJK UNIFIED IDEOGRAPH
0xE08D	0x718F	#CJK UNIFIED IDEOGRAPH
0xE08E	0x71FB	#CJK UNIFIED IDEOGRAPH
0xE08F	0x7184	#CJK UNIFIED IDEOGRAPH
0xE090	0x7195	#CJK UNIFIED IDEOGRAPH
0xE091	0x71A8	#CJK UNIFIED IDEOGRAPH
0xE092	0x71AC	#CJK UNIFIED IDEOGRAPH
0xE093	0x71D7	#CJK UNIFIED IDEOGRAPH
0xE094	0x71B9	#CJK UNIFIED IDEOGRAPH
0xE095	0x71BE	#CJK UNIFIED IDEOGRAPH
0xE096	0x71D2	#CJK UNIFIED IDEOGRAPH
0xE097	0x71C9	#CJK UNIFIED IDEOGRAPH
0xE098	0x71D4	#CJK UNIFIED IDEOGRAPH
0xE099	0x71CE	#CJK UNIFIED IDEOGRAPH
0xE09A	0x71E0	#CJK UNIFIED IDEOGRAPH
0xE09B	0x71EC	#CJK UNIFIED IDEOGRAPH
0xE09C	0x71E7	#CJK UNIFIED IDEOGRAPH
0xE09D	0x71F5	#CJK UNIFIED IDEOGRAPH
0xE09E	0x71FC	#CJK UNIFIED IDEOGRAPH
0xE09F	0x71F9	#CJK UNIFIED IDEOGRAPH
0xE0A0	0x71FF	#CJK UNIFIED IDEOGRAPH
0xE0A1	0x720D	#CJK UNIFIED IDEOGRAPH
0xE0A2	0x7210	#CJK UNIFIED IDEOGRAPH
0xE0A3	0x721B	#CJK UNIFIED IDEOGRAPH
0xE0A4	0x7228	#CJK UNIFIED IDEOGRAPH
0xE0A5	0x722D	#CJK UNIFIED IDEOGRAPH
0xE0A6	0x722C	#CJK UNIFIED IDEOGRAPH
0xE0A7	0x7230	#CJK UNIFIED IDEOGRAPH
0xE0A8	0x7232	#CJK UNIFIED IDEOGRAPH
0xE0A9	0x723B	#CJK UNIFIED IDEOGRAPH
0xE0AA	0x723C	#CJK UNIFIED IDEOGRAPH
0xE0AB	0x723F	#CJK UNIFIED IDEOGRAPH
0xE0AC	0x7240	#CJK UNIFIED IDEOGRAPH
0xE0AD	0x7246	#CJK UNIFIED IDEOGRAPH
0xE0AE	0x724B	#CJK UNIFIED IDEOGRAPH
0xE0AF	0x7258	#CJK UNIFIED IDEOGRAPH
0xE0B0	0x7274	#CJK UNIFIED IDEOGRAPH
0xE0B1	0x727E	#CJK UNIFIED IDEOGRAPH
0xE0B2	0x7282	#CJK UNIFIED IDEOGRAPH
0xE0B3	0x7281	#CJK UNIFIED IDEOGRAPH
0xE0B4	0x7287	#CJK UNIFIED IDEOGRAPH
0xE0B5	0x7292	#CJK UNIFIED IDEOGRAPH
0xE0B6	0x7296	#CJK UNIFIED IDEOGRAPH
0xE0B7	0x72A2	#CJK UNIFIED IDEOGRAPH
0xE0B8	0x72A7	#CJK UNIFIED IDEOGRAPH
0xE0B9	0x72B9	#CJK UNIFIED IDEOGRAPH
0xE0BA	0x72B2	#CJK UNIFIED IDEOGRAPH
0xE0BB	0x72C3	#CJK UNIFIED IDEOGRAPH
0xE0BC	0x72C6	#CJK UNIFIED IDEOGRAPH
0xE0BD	0x72C4	#CJK UNIFIED IDEOGRAPH
0xE0BE	0x72CE	#CJK UNIFIED IDEOGRAPH
0xE0BF	0x72D2	#CJK UNIFIED IDEOGRAPH
0xE0C0	0x72E2	#CJK UNIFIED IDEOGRAPH
0xE0C1	0x72E0	#CJK UNIFIED IDEOGRAPH
0xE0C2	0x72E1	#CJK UNIFIED IDEOGRAPH
0xE0C3	0x72F9	#CJK UNIFIED IDEOGRAPH
0xE0C4	0x72F7	#CJK UNIFIED IDEOGRAPH
0xE0C5	0x500F	#CJK UNIFIED IDEOGRAPH
0xE0C6	0x7317	#CJK UNIFIED IDEOGRAPH
0xE0C7	0x730A	#CJK UNIFIED IDEOGRAPH
0xE0C8	0x731C	#CJK UNIFIED IDEOGRAPH
0xE0C9	0x7316	#CJK UNIFIED IDEOGRAPH
0xE0CA	0x731D	#CJK UNIFIED IDEOGRAPH
0xE0CB	0x7334	#CJK UNIFIED IDEOGRAPH
0xE0CC	0x732F	#CJK UNIFIED IDEOGRAPH
0xE0CD	0x7329	#CJK UNIFIED IDEOGRAPH
0xE0CE	0x7325	#CJK UNIFIED IDEOGRAPH
0xE0CF	0x733E	#CJK UNIFIED IDEOGRAPH
0xE0D0	0x734E	#CJK UNIFIED IDEOGRAPH
0xE0D1	0x734F	#CJK UNIFIED IDEOGRAPH
0xE0D2	0x9ED8	#CJK UNIFIED IDEOGRAPH
0xE0D3	0x7357	#CJK UNIFIED IDEOGRAPH
0xE0D4	0x736A	#CJK UNIFIED IDEOGRAPH
0xE0D5	0x7368	#CJK UNIFIED IDEOGRAPH
0xE0D6	0x7370	#CJK UNIFIED IDEOGRAPH
0xE0D7	0x7378	#CJK UNIFIED IDEOGRAPH
0xE0D8	0x7375	#CJK UNIFIED IDEOGRAPH
0xE0D9	0x737B	#CJK UNIFIED IDEOGRAPH
0xE0DA	0x737A	#CJK UNIFIED IDEOGRAPH
0xE0DB	0x73C8	#CJK UNIFIED IDEOGRAPH
0xE0DC	0x73B3	#CJK UNIFIED IDEOGRAPH
0xE0DD	0x73CE	#CJK UNIFIED IDEOGRAPH
0xE0DE	0x73BB	#CJK UNIFIED IDEOGRAPH
0xE0DF	0x73C0	#CJK UNIFIED IDEOGRAPH
0xE0E0	0x73E5	#CJK UNIFIED IDEOGRAPH
0xE0E1	0x73EE	#CJK UNIFIED IDEOGRAPH
0xE0E2	0x73DE	#CJK UNIFIED IDEOGRAPH
0xE0E3	0x74A2	#CJK UNIFIED IDEOGRAPH
0xE0E4	0x7405	#CJK UNIFIED IDEOGRAPH
0xE0E5	0x746F	#CJK UNIFIED IDEOGRAPH
0xE0E6	0x7425	#CJK UNIFIED IDEOGRAPH
0xE0E7	0x73F8	#CJK UNIFIED IDEOGRAPH
0xE0E8	0x7432	#CJK UNIFIED IDEOGRAPH
0xE0E9	0x743A	#CJK UNIFIED IDEOGRAPH
0xE0EA	0x7455	#CJK UNIFIED IDEOGRAPH
0xE0EB	0x743F	#CJK UNIFIED IDEOGRAPH
0xE0EC	0x745F	#CJK UNIFIED IDEOGRAPH
0xE0ED	0x7459	#CJK UNIFIED IDEOGRAPH
0xE0EE	0x7441	#CJK UNIFIED IDEOGRAPH
0xE0EF	0x745C	#CJK UNIFIED IDEOGRAPH
0xE0F0	0x7469	#CJK UNIFIED IDEOGRAPH
0xE0F1	0x7470	#CJK UNIFIED IDEOGRAPH
0xE0F2	0x7463	#CJK UNIFIED IDEOGRAPH
0xE0F3	0x746A	#CJK UNIFIED IDEOGRAPH
0xE0F4	0x7476	#CJK UNIFIED IDEOGRAPH
0xE0F5	0x747E	#CJK UNIFIED IDEOGRAPH
0xE0F6	0x748B	#CJK UNIFIED IDEOGRAPH
0xE0F7	0x749E	#CJK UNIFIED IDEOGRAPH
0xE0F8	0x74A7	#CJK UNIFIED IDEOGRAPH
0xE0F9	0x74CA	#CJK UNIFIED IDEOGRAPH
0xE0FA	0x74CF	#CJK UNIFIED IDEOGRAPH
0xE0FB	0x74D4	#CJK UNIFIED IDEOGRAPH
0xE0FC	0x73F1	#CJK UNIFIED IDEOGRAPH
0xE140	0x74E0	#CJK UNIFIED IDEOGRAPH
0xE141	0x74E3	#CJK UNIFIED IDEOGRAPH
0xE142	0x74E7	#CJK UNIFIED IDEOGRAPH
0xE143	0x74E9	#CJK UNIFIED IDEOGRAPH
0xE144	0x74EE	#CJK UNIFIED IDEOGRAPH
0xE145	0x74F2	#CJK UNIFIED IDEOGRAPH
0xE146	0x74F0	#CJK UNIFIED IDEOGRAPH
0xE147	0x74F1	#CJK UNIFIED IDEOGRAPH
0xE148	0x74F8	#CJK UNIFIED IDEOGRAPH
0xE149	0x74F7	#CJK UNIFIED IDEOGRAPH
0xE14A	0x7504	#CJK UNIFIED IDEOGRAPH
0xE14B	0x7503	#CJK UNIFIED IDEOGRAPH
0xE14C	0x7505	#CJK UNIFIED IDEOGRAPH
0xE14D	0x750C	#CJK UNIFIED IDEOGRAPH
0xE14E	0x750E	#CJK UNIFIED IDEOGRAPH
0xE14F	0x750D	#CJK UNIFIED IDEOGRAPH
0xE150	0x7515	#CJK UNIFIED IDEOGRAPH
0xE151	0x7513	#CJK UNIFIED IDEOGRAPH
0xE152	0x751E	#CJK UNIFIED IDEOGRAPH
0xE153	0x7526	#CJK UNIFIED IDEOGRAPH
0xE154	0x752C	#CJK UNIFIED IDEOGRAPH
0xE155	0x753C	#CJK UNIFIED IDEOGRAPH
0xE156	0x7544	#CJK UNIFIED IDEOGRAPH
0xE157	0x754D	#CJK UNIFIED IDEOGRAPH
0xE158	0x754A	#CJK UNIFIED IDEOGRAPH
0xE159	0x7549	#CJK UNIFIED IDEOGRAPH
0xE15A	0x755B	#CJK UNIFIED IDEOGRAPH
0xE15B	0x7546	#CJK UNIFIED IDEOGRAPH
0xE15C	0x755A	#CJK UNIFIED IDEOGRAPH
0xE15D	0x7569	#CJK UNIFIED IDEOGRAPH
0xE15E	0x7564	#CJK UNIFIED IDEOGRAPH
0xE15F	0x7567	#CJK UNIFIED IDEOGRAPH
0xE160	0x756B	#CJK UNIFIED IDEOGRAPH
0xE161	0x756D	#CJK UNIFIED IDEOGRAPH
0xE162	0x7578	#CJK UNIFIED IDEOGRAPH
0xE163	0x7576	#CJK UNIFIED IDEOGRAPH
0xE164	0x7586	#CJK UNIFIED IDEOGRAPH
0xE165	0x7587	#CJK UNIFIED IDEOGRAPH
0xE166	0x7574	#CJK UNIFIED IDEOGRAPH
0xE167	0x758A	#CJK UNIFIED IDEOGRAPH
0xE168	0x7589	#CJK UNIFIED IDEOGRAPH
0xE169	0x7582	#CJK UNIFIED IDEOGRAPH
0xE16A	0x7594	#CJK UNIFIED IDEOGRAPH
0xE16B	0x759A	#CJK UNIFIED IDEOGRAPH
0xE16C	0x759D	#CJK UNIFIED IDEOGRAPH
0xE16D	0x75A5	#CJK UNIFIED IDEOGRAPH
0xE16E	0x75A3	#CJK UNIFIED IDEOGRAPH
0xE16F	0x75C2	#CJK UNIFIED IDEOGRAPH
0xE170	0x75B3	#CJK UNIFIED IDEOGRAPH
0xE171	0x75C3	#CJK UNIFIED IDEOGRAPH
0xE172	0x75B5	#CJK UNIFIED IDEOGRAPH
0xE173	0x75BD	#CJK UNIFIED IDEOGRAPH
0xE174	0x75B8	#CJK UNIFIED IDEOGRAPH
0xE175	0x75BC	#CJK UNIFIED IDEOGRAPH
0xE176	0x75B1	#CJK UNIFIED IDEOGRAPH
0xE177	0x75CD	#CJK UNIFIED IDEOGRAPH
0xE178	0x75CA	#CJK UNIFIED IDEOGRAPH
0xE179	0x75D2	#CJK UNIFIED IDEOGRAPH
0xE17A	0x75D9	#CJK UNIFIED IDEOGRAPH
0xE17B	0x75E3	#CJK UNIFIED IDEOGRAPH
0xE17C	0x75DE	#CJK UNIFIED IDEOGRAPH
0xE17D	0x75FE	#CJK UNIFIED IDEOGRAPH
0xE17E	0x75FF	#CJK UNIFIED IDEOGRAPH
0xE180	0x75FC	#CJK UNIFIED IDEOGRAPH
0xE181	0x7601	#CJK UNIFIED IDEOGRAPH
0xE182	0x75F0	#CJK UNIFIED IDEOGRAPH
0xE183	0x75FA	#CJK UNIFIED IDEOGRAPH
0xE184	0x75F2	#CJK UNIFIED IDEOGRAPH
0xE185	0x75F3	#CJK UNIFIED IDEOGRAPH
0xE186	0x760B	#CJK UNIFIED IDEOGRAPH
0xE187	0x760D	#CJK UNIFIED IDEOGRAPH
0xE188	0x7609	#CJK UNIFIED IDEOGRAPH
0xE189	0x761F	#CJK UNIFIED IDEOGRAPH
0xE18A	0x7627	#CJK UNIFIED IDEOGRAPH
0xE18B	0x7620	#CJK UNIFIED IDEOGRAPH
0xE18C	0x7621	#CJK UNIFIED IDEOGRAPH
0xE18D	0x7622	#CJK UNIFIED IDEOGRAPH
0xE18E	0x7624	#CJK UNIFIED IDEOGRAPH
0xE18F	0x7634	#CJK UNIFIED IDEOGRAPH
0xE190	0x7630	#CJK UNIFIED IDEOGRAPH
0xE191	0x763B	#CJK UNIFIED IDEOGRAPH
0xE192	0x7647	#CJK UNIFIED IDEOGRAPH
0xE193	0x7648	#CJK UNIFIED IDEOGRAPH
0xE194	0x7646	#CJK UNIFIED IDEOGRAPH
0xE195	0x765C	#CJK UNIFIED IDEOGRAPH
0xE196	0x7658	#CJK UNIFIED IDEOGRAPH
0xE197	0x7661	#CJK UNIFIED IDEOGRAPH
0xE198	0x7662	#CJK UNIFIED IDEOGRAPH
0xE199	0x7668	#CJK UNIFIED IDEOGRAPH
0xE19A	0x7669	#CJK UNIFIED IDEOGRAPH
0xE19B	0x766A	#CJK UNIFIED IDEOGRAPH
0xE19C	0x7667	#CJK UNIFIED IDEOGRAPH
0xE19D	0x766C	#CJK UNIFIED IDEOGRAPH
0xE19E	0x7670	#CJK UNIFIED IDEOGRAPH
0xE19F	0x7672	#CJK UNIFIED IDEOGRAPH
0xE1A0	0x7676	#CJK UNIFIED IDEOGRAPH
0xE1A1	0x7678	#CJK UNIFIED IDEOGRAPH
0xE1A2	0x767C	#CJK UNIFIED IDEOGRAPH
0xE1A3	0x7680	#CJK UNIFIED IDEOGRAPH
0xE1A4	0x7683	#CJK UNIFIED IDEOGRAPH
0xE1A5	0x7688	#CJK UNIFIED IDEOGRAPH
0xE1A6	0x768B	#CJK UNIFIED IDEOGRAPH
0xE1A7	0x768E	#CJK UNIFIED IDEOGRAPH
0xE1A8	0x7696	#CJK UNIFIED IDEOGRAPH
0xE1A9	0x7693	#CJK UNIFIED IDEOGRAPH
0xE1AA	0x7699	#CJK UNIFIED IDEOGRAPH
0xE1AB	0x769A	#CJK UNIFIED IDEOGRAPH
0xE1AC	0x76B0	#CJK UNIFIED IDEOGRAPH
0xE1AD	0x76B4	#CJK UNIFIED IDEOGRAPH
0xE1AE	0x76B8	#CJK UNIFIED IDEOGRAPH
0xE1AF	0x76B9	#CJK UNIFIED IDEOGRAPH
0xE1B0	0x76BA	#CJK UNIFIED IDEOGRAPH
0xE1B1	0x76C2	#CJK UNIFIED IDEOGRAPH
0xE1B2	0x76CD	#CJK UNIFIED IDEOGRAPH
0xE1B3	0x76D6	#CJK UNIFIED IDEOGRAPH
0xE1B4	0x76D2	#CJK UNIFIED IDEOGRAPH
0xE1B5	0x76DE	#CJK UNIFIED IDEOGRAPH
0xE1B6	0x76E1	#CJK UNIFIED IDEOGRAPH
0xE1B7	0x76E5	#CJK UNIFIED IDEOGRAPH
0xE1B8	0x76E7	#CJK UNIFIED IDEOGRAPH
0xE1B9	0x76EA	#CJK UNIFIED IDEOGRAPH
0xE1BA	0x862F	#CJK UNIFIED IDEOGRAPH
0xE1BB	0x76FB	#CJK UNIFIED IDEOGRAPH
0xE1BC	0x7708	#CJK UNIFIED IDEOGRAPH
0xE1BD	0x7707	#CJK UNIFIED IDEOGRAPH
0xE1BE	0x7704	#CJK UNIFIED IDEOGRAPH
0xE1BF	0x7729	#CJK UNIFIED IDEOGRAPH
0xE1C0	0x7724	#CJK UNIFIED IDEOGRAPH
0xE1C1	0x771E	#CJK UNIFIED IDEOGRAPH
0xE1C2	0x7725	#CJK UNIFIED IDEOGRAPH
0xE1C3	0x7726	#CJK UNIFIED IDEOGRAPH
0xE1C4	0x771B	#CJK UNIFIED IDEOGRAPH
0xE1C5	0x7737	#CJK UNIFIED IDEOGRAPH
0xE1C6	0x7738	#CJK UNIFIED IDEOGRAPH
0xE1C7	0x7747	#CJK UNIFIED IDEOGRAPH
0xE1C8	0x775A	#CJK UNIFIED IDEOGRAPH
0xE1C9	0x7768	#CJK UNIFIED IDEOGRAPH
0xE1CA	0x776B	#CJK UNIFIED IDEOGRAPH
0xE1CB	0x775B	#CJK UNIFIED IDEOGRAPH
0xE1CC	0x7765	#CJK UNIFIED IDEOGRAPH
0xE1CD	0x777F	#CJK UNIFIED IDEOGRAPH
0xE1CE	0x777E	#CJK UNIFIED IDEOGRAPH
0xE1CF	0x7779	#CJK UNIFIED IDEOGRAPH
0xE1D0	0x778E	#CJK UNIFIED IDEOGRAPH
0xE1D1	0x778B	#CJK UNIFIED IDEOGRAPH
0xE1D2	0x7791	#CJK UNIFIED IDEOGRAPH
0xE1D3	0x77A0	#CJK UNIFIED IDEOGRAPH
0xE1D4	0x779E	#CJK UNIFIED IDEOGRAPH
0xE1D5	0x77B0	#CJK UNIFIED IDEOGRAPH
0xE1D6	0x77B6	#CJK UNIFIED IDEOGRAPH
0xE1D7	0x77B9	#CJK UNIFIED IDEOGRAPH
0xE1D8	0x77BF	#CJK UNIFIED IDEOGRAPH
0xE1D9	0x77BC	#CJK UNIFIED IDEOGRAPH
0xE1DA	0x77BD	#CJK UNIFIED IDEOGRAPH
0xE1DB	0x77BB	#CJK UNIFIED IDEOGRAPH
0xE1DC	0x77C7	#CJK UNIFIED IDEOGRAPH
0xE1DD	0x77CD	#CJK UNIFIED IDEOGRAPH
0xE1DE	0x77D7	#CJK UNIFIED IDEOGRAPH
0xE1DF	0x77DA	#CJK UNIFIED IDEOGRAPH
0xE1E0	0x77DC	#CJK UNIFIED IDEOGRAPH
0xE1E1	0x77E3	#CJK UNIFIED IDEOGRAPH
0xE1E2	0x77EE	#CJK UNIFIED IDEOGRAPH
0xE1E3	0x77FC	#CJK UNIFIED IDEOGRAPH
0xE1E4	0x780C	#CJK UNIFIED IDEOGRAPH
0xE1E5	0x7812	#CJK UNIFIED IDEOGRAPH
0xE1E6	0x7926	#CJK UNIFIED IDEOGRAPH
0xE1E7	0x7820	#CJK UNIFIED IDEOGRAPH
0xE1E8	0x792A	#CJK UNIFIED IDEOGRAPH
0xE1E9	0x7845	#CJK UNIFIED IDEOGRAPH
0xE1EA	0x788E	#CJK UNIFIED IDEOGRAPH
0xE1EB	0x7874	#CJK UNIFIED IDEOGRAPH
0xE1EC	0x7886	#CJK UNIFIED IDEOGRAPH
0xE1ED	0x787C	#CJK UNIFIED IDEOGRAPH
0xE1EE	0x789A	#CJK UNIFIED IDEOGRAPH
0xE1EF	0x788C	#CJK UNIFIED IDEOGRAPH
0xE1F0	0x78A3	#CJK UNIFIED IDEOGRAPH
0xE1F1	0x78B5	#CJK UNIFIED IDEOGRAPH
0xE1F2	0x78AA	#CJK UNIFIED IDEOGRAPH
0xE1F3	0x78AF	#CJK UNIFIED IDEOGRAPH
0xE1F4	0x78D1	#CJK UNIFIED IDEOGRAPH
0xE1F5	0x78C6	#CJK UNIFIED IDEOGRAPH
0xE1F6	0x78CB	#CJK UNIFIED IDEOGRAPH
0xE1F7	0x78D4	#CJK UNIFIED IDEOGRAPH
0xE1F8	0x78BE	#CJK UNIFIED IDEOGRAPH
0xE1F9	0x78BC	#CJK UNIFIED IDEOGRAPH
0xE1FA	0x78C5	#CJK UNIFIED IDEOGRAPH
0xE1FB	0x78CA	#CJK UNIFIED IDEOGRAPH
0xE1FC	0x78EC	#CJK UNIFIED IDEOGRAPH
0xE240	0x78E7	#CJK UNIFIED IDEOGRAPH
0xE241	0x78DA	#CJK UNIFIED IDEOGRAPH
0xE242	0x78FD	#CJK UNIFIED IDEOGRAPH
0xE243	0x78F4	#CJK UNIFIED IDEOGRAPH
0xE244	0x7907	#CJK UNIFIED IDEOGRAPH
0xE245	0x7912	#CJK UNIFIED IDEOGRAPH
0xE246	0x7911	#CJK UNIFIED IDEOGRAPH
0xE247	0x7919	#CJK UNIFIED IDEOGRAPH
0xE248	0x792C	#CJK UNIFIED IDEOGRAPH
0xE249	0x792B	#CJK UNIFIED IDEOGRAPH
0xE24A	0x7940	#CJK UNIFIED IDEOGRAPH
0xE24B	0x7960	#CJK UNIFIED IDEOGRAPH
0xE24C	0x7957	#CJK UNIFIED IDEOGRAPH
0xE24D	0x795F	#CJK UNIFIED IDEOGRAPH
0xE24E	0x795A	#CJK UNIFIED IDEOGRAPH
0xE24F	0x7955	#CJK UNIFIED IDEOGRAPH
0xE250	0x7953	#CJK UNIFIED IDEOGRAPH
0xE251	0x797A	#CJK UNIFIED IDEOGRAPH
0xE252	0x797F	#CJK UNIFIED IDEOGRAPH
0xE253	0x798A	#CJK UNIFIED IDEOGRAPH
0xE254	0x799D	#CJK UNIFIED IDEOGRAPH
0xE255	0x79A7	#CJK UNIFIED IDEOGRAPH
0xE256	0x9F4B	#CJK UNIFIED IDEOGRAPH
0xE257	0x79AA	#CJK UNIFIED IDEOGRAPH
0xE258	0x79AE	#CJK UNIFIED IDEOGRAPH
0xE259	0x79B3	#CJK UNIFIED IDEOGRAPH
0xE25A	0x79B9	#CJK UNIFIED IDEOGRAPH
0xE25B	0x79BA	#CJK UNIFIED IDEOGRAPH
0xE25C	0x79C9	#CJK UNIFIED IDEOGRAPH
0xE25D	0x79D5	#CJK UNIFIED IDEOGRAPH
0xE25E	0x79E7	#CJK UNIFIED IDEOGRAPH
0xE25F	0x79EC	#CJK UNIFIED IDEOGRAPH
0xE260	0x79E1	#CJK UNIFIED IDEOGRAPH
0xE261	0x79E3	#CJK UNIFIED IDEOGRAPH
0xE262	0x7A08	#CJK UNIFIED IDEOGRAPH
0xE263	0x7A0D	#CJK UNIFIED IDEOGRAPH
0xE264	0x7A18	#CJK UNIFIED IDEOGRAPH
0xE265	0x7A19	#CJK UNIFIED IDEOGRAPH
0xE266	0x7A20	#CJK UNIFIED IDEOGRAPH
0xE267	0x7A1F	#CJK UNIFIED IDEOGRAPH
0xE268	0x7980	#CJK UNIFIED IDEOGRAPH
0xE269	0x7A31	#CJK UNIFIED IDEOGRAPH
0xE26A	0x7A3B	#CJK UNIFIED IDEOGRAPH
0xE26B	0x7A3E	#CJK UNIFIED IDEOGRAPH
0xE26C	0x7A37	#CJK UNIFIED IDEOGRAPH
0xE26D	0x7A43	#CJK UNIFIED IDEOGRAPH
0xE26E	0x7A57	#CJK UNIFIED IDEOGRAPH
0xE26F	0x7A49	#CJK UNIFIED IDEOGRAPH
0xE270	0x7A61	#CJK UNIFIED IDEOGRAPH
0xE271	0x7A62	#CJK UNIFIED IDEOGRAPH
0xE272	0x7A69	#CJK UNIFIED IDEOGRAPH
0xE273	0x9F9D	#CJK UNIFIED IDEOGRAPH
0xE274	0x7A70	#CJK UNIFIED IDEOGRAPH
0xE275	0x7A79	#CJK UNIFIED IDEOGRAPH
0xE276	0x7A7D	#CJK UNIFIED IDEOGRAPH
0xE277	0x7A88	#CJK UNIFIED IDEOGRAPH
0xE278	0x7A97	#CJK UNIFIED IDEOGRAPH
0xE279	0x7A95	#CJK UNIFIED IDEOGRAPH
0xE27A	0x7A98	#CJK UNIFIED IDEOGRAPH
0xE27B	0x7A96	#CJK UNIFIED IDEOGRAPH
0xE27C	0x7AA9	#CJK UNIFIED IDEOGRAPH
0xE27D	0x7AC8	#CJK UNIFIED IDEOGRAPH
0xE27E	0x7AB0	#CJK UNIFIED IDEOGRAPH
0xE280	0x7AB6	#CJK UNIFIED IDEOGRAPH
0xE281	0x7AC5	#CJK UNIFIED IDEOGRAPH
0xE282	0x7AC4	#CJK UNIFIED IDEOGRAPH
0xE283	0x7ABF	#CJK UNIFIED IDEOGRAPH
0xE284	0x9083	#CJK UNIFIED IDEOGRAPH
0xE285	0x7AC7	#CJK UNIFIED IDEOGRAPH
0xE286	0x7ACA	#CJK UNIFIED IDEOGRAPH
0xE287	0x7ACD	#CJK UNIFIED IDEOGRAPH
0xE288	0x7ACF	#CJK UNIFIED IDEOGRAPH
0xE289	0x7AD5	#CJK UNIFIED IDEOGRAPH
0xE28A	0x7AD3	#CJK UNIFIED IDEOGRAPH
0xE28B	0x7AD9	#CJK UNIFIED IDEOGRAPH
0xE28C	0x7ADA	#CJK UNIFIED IDEOGRAPH
0xE28D	0x7ADD	#CJK UNIFIED IDEOGRAPH
0xE28E	0x7AE1	#CJK UNIFIED IDEOGRAPH
0xE28F	0x7AE2	#CJK UNIFIED IDEOGRAPH
0xE290	0x7AE6	#CJK UNIFIED IDEOGRAPH
0xE291	0x7AED	#CJK UNIFIED IDEOGRAPH
0xE292	0x7AF0	#CJK UNIFIED IDEOGRAPH
0xE293	0x7B02	#CJK UNIFIED IDEOGRAPH
0xE294	0x7B0F	#CJK UNIFIED IDEOGRAPH
0xE295	0x7B0A	#CJK UNIFIED IDEOGRAPH
0xE296	0x7B06	#CJK UNIFIED IDEOGRAPH
0xE297	0x7B33	#CJK UNIFIED IDEOGRAPH
0xE298	0x7B18	#CJK UNIFIED IDEOGRAPH
0xE299	0x7B19	#CJK UNIFIED IDEOGRAPH
0xE29A	0x7B1E	#CJK UNIFIED IDEOGRAPH
0xE29B	0x7B35	#CJK UNIFIED IDEOGRAPH
0xE29C	0x7B28	#CJK UNIFIED IDEOGRAPH
0xE29D	0x7B36	#CJK UNIFIED IDEOGRAPH
0xE29E	0x7B50	#CJK UNIFIED IDEOGRAPH
0xE29F	0x7B7A	#CJK UNIFIED IDEOGRAPH
0xE2A0	0x7B04	#CJK UNIFIED IDEOGRAPH
0xE2A1	0x7B4D	#CJK UNIFIED IDEOGRAPH
0xE2A2	0x7B0B	#CJK UNIFIED IDEOGRAPH
0xE2A3	0x7B4C	#CJK UNIFIED IDEOGRAPH
0xE2A4	0x7B45	#CJK UNIFIED IDEOGRAPH
0xE2A5	0x7B75	#CJK UNIFIED IDEOGRAPH
0xE2A6	0x7B65	#CJK UNIFIED IDEOGRAPH
0xE2A7	0x7B74	#CJK UNIFIED IDEOGRAPH
0xE2A8	0x7B67	#CJK UNIFIED IDEOGRAPH
0xE2A9	0x7B70	#CJK UNIFIED IDEOGRAPH
0xE2AA	0x7B71	#CJK UNIFIED IDEOGRAPH
0xE2AB	0x7B6C	#CJK UNIFIED IDEOGRAPH
0xE2AC	0x7B6E	#CJK UNIFIED IDEOGRAPH
0xE2AD	0x7B9D	#CJK UNIFIED IDEOGRAPH
0xE2AE	0x7B98	#CJK UNIFIED IDEOGRAPH
0xE2AF	0x7B9F	#CJK UNIFIED IDEOGRAPH
0xE2B0	0x7B8D	#CJK UNIFIED IDEOGRAPH
0xE2B1	0x7B9C	#CJK UNIFIED IDEOGRAPH
0xE2B2	0x7B9A	#CJK UNIFIED IDEOGRAPH
0xE2B3	0x7B8B	#CJK UNIFIED IDEOGRAPH
0xE2B4	0x7B92	#CJK UNIFIED IDEOGRAPH
0xE2B5	0x7B8F	#CJK UNIFIED IDEOGRAPH
0xE2B6	0x7B5D	#CJK UNIFIED IDEOGRAPH
0xE2B7	0x7B99	#CJK UNIFIED IDEOGRAPH
0xE2B8	0x7BCB	#CJK UNIFIED IDEOGRAPH
0xE2B9	0x7BC1	#CJK UNIFIED IDEOGRAPH
0xE2BA	0x7BCC	#CJK UNIFIED IDEOGRAPH
0xE2BB	0x7BCF	#CJK UNIFIED IDEOGRAPH
0xE2BC	0x7BB4	#CJK UNIFIED IDEOGRAPH
0xE2BD	0x7BC6	#CJK UNIFIED IDEOGRAPH
0xE2BE	0x7BDD	#CJK UNIFIED IDEOGRAPH
0xE2BF	0x7BE9	#CJK UNIFIED IDEOGRAPH
0xE2C0	0x7C11	#CJK UNIFIED IDEOGRAPH
0xE2C1	0x7C14	#CJK UNIFIED IDEOGRAPH
0xE2C2	0x7BE6	#CJK UNIFIED IDEOGRAPH
0xE2C3	0x7BE5	#CJK UNIFIED IDEOGRAPH
0xE2C4	0x7C60	#CJK UNIFIED IDEOGRAPH
0xE2C5	0x7C00	#CJK UNIFIED IDEOGRAPH
0xE2C6	0x7C07	#CJK UNIFIED IDEOGRAPH
0xE2C7	0x7C13	#CJK UNIFIED IDEOGRAPH
0xE2C8	0x7BF3	#CJK UNIFIED IDEOGRAPH
0xE2C9	0x7BF7	#CJK UNIFIED IDEOGRAPH
0xE2CA	0x7C17	#CJK UNIFIED IDEOGRAPH
0xE2CB	0x7C0D	#CJK UNIFIED IDEOGRAPH
0xE2CC	0x7BF6	#CJK UNIFIED IDEOGRAPH
0xE2CD	0x7C23	#CJK UNIFIED IDEOGRAPH
0xE2CE	0x7C27	#CJK UNIFIED IDEOGRAPH
0xE2CF	0x7C2A	#CJK UNIFIED IDEOGRAPH
0xE2D0	0x7C1F	#CJK UNIFIED IDEOGRAPH
0xE2D1	0x7C37	#CJK UNIFIED IDEOGRAPH
0xE2D2	0x7C2B	#CJK UNIFIED IDEOGRAPH
0xE2D3	0x7C3D	#CJK UNIFIED IDEOGRAPH
0xE2D4	0x7C4C	#CJK UNIFIED IDEOGRAPH
0xE2D5	0x7C43	#CJK UNIFIED IDEOGRAPH
0xE2D6	0x7C54	#CJK UNIFIED IDEOGRAPH
0xE2D7	0x7C4F	#CJK UNIFIED IDEOGRAPH
0xE2D8	0x7C40	#CJK UNIFIED IDEOGRAPH
0xE2D9	0x7C50	#CJK UNIFIED IDEOGRAPH
0xE2DA	0x7C58	#CJK UNIFIED IDEOGRAPH
0xE2DB	0x7C5F	#CJK UNIFIED IDEOGRAPH
0xE2DC	0x7C64	#CJK UNIFIED IDEOGRAPH
0xE2DD	0x7C56	#CJK UNIFIED IDEOGRAPH
0xE2DE	0x7C65	#CJK UNIFIED IDEOGRAPH
0xE2DF	0x7C6C	#CJK UNIFIED IDEOGRAPH
0xE2E0	0x7C75	#CJK UNIFIED IDEOGRAPH
0xE2E1	0x7C83	#CJK UNIFIED IDEOGRAPH
0xE2E2	0x7C90	#CJK UNIFIED IDEOGRAPH
0xE2E3	0x7CA4	#CJK UNIFIED IDEOGRAPH
0xE2E4	0x7CAD	#CJK UNIFIED IDEOGRAPH
0xE2E5	0x7CA2	#CJK UNIFIED IDEOGRAPH
0xE2E6	0x7CAB	#CJK UNIFIED IDEOGRAPH
0xE2E7	0x7CA1	#CJK UNIFIED IDEOGRAPH
0xE2E8	0x7CA8	#CJK UNIFIED IDEOGRAPH
0xE2E9	0x7CB3	#CJK UNIFIED IDEOGRAPH
0xE2EA	0x7CB2	#CJK UNIFIED IDEOGRAPH
0xE2EB	0x7CB1	#CJK UNIFIED IDEOGRAPH
0xE2EC	0x7CAE	#CJK UNIFIED IDEOGRAPH
0xE2ED	0x7CB9	#CJK UNIFIED IDEOGRAPH
0xE2EE	0x7CBD	#CJK UNIFIED IDEOGRAPH
0xE2EF	0x7CC0	#CJK UNIFIED IDEOGRAPH
0xE2F0	0x7CC5	#CJK UNIFIED IDEOGRAPH
0xE2F1	0x7CC2	#CJK UNIFIED IDEOGRAPH
0xE2F2	0x7CD8	#CJK UNIFIED IDEOGRAPH
0xE2F3	0x7CD2	#CJK UNIFIED IDEOGRAPH
0xE2F4	0x7CDC	#CJK UNIFIED IDEOGRAPH
0xE2F5	0x7CE2	#CJK UNIFIED IDEOGRAPH
0xE2F6	0x9B3B	#CJK UNIFIED IDEOGRAPH
0xE2F7	0x7CEF	#CJK UNIFIED IDEOGRAPH
0xE2F8	0x7CF2	#CJK UNIFIED IDEOGRAPH
0xE2F9	0x7CF4	#CJK UNIFIED IDEOGRAPH
0xE2FA	0x7CF6	#CJK UNIFIED IDEOGRAPH
0xE2FB	0x7CFA	#CJK UNIFIED IDEOGRAPH
0xE2FC	0x7D06	#CJK UNIFIED IDEOGRAPH
0xE340	0x7D02	#CJK UNIFIED IDEOGRAPH
0xE341	0x7D1C	#CJK UNIFIED IDEOGRAPH
0xE342	0x7D15	#CJK UNIFIED IDEOGRAPH
0xE343	0x7D0A	#CJK UNIFIED IDEOGRAPH
0xE344	0x7D45	#CJK UNIFIED IDEOGRAPH
0xE345	0x7D4B	#CJK UNIFIED IDEOGRAPH
0xE346	0x7D2E	#CJK UNIFIED IDEOGRAPH
0xE347	0x7D32	#CJK UNIFIED IDEOGRAPH
0xE348	0x7D3F	#CJK UNIFIED IDEOGRAPH
0xE349	0x7D35	#CJK UNIFIED IDEOGRAPH
0xE34A	0x7D46	#CJK UNIFIED IDEOGRAPH
0xE34B	0x7D73	#CJK UNIFIED IDEOGRAPH
0xE34C	0x7D56	#CJK UNIFIED IDEOGRAPH
0xE34D	0x7D4E	#CJK UNIFIED IDEOGRAPH
0xE34E	0x7D72	#CJK UNIFIED IDEOGRAPH
0xE34F	0x7D68	#CJK UNIFIED IDEOGRAPH
0xE350	0x7D6E	#CJK UNIFIED IDEOGRAPH
0xE351	0x7D4F	#CJK UNIFIED IDEOGRAPH
0xE352	0x7D63	#CJK UNIFIED IDEOGRAPH
0xE353	0x7D93	#CJK UNIFIED IDEOGRAPH
0xE354	0x7D89	#CJK UNIFIED IDEOGRAPH
0xE355	0x7D5B	#CJK UNIFIED IDEOGRAPH
0xE356	0x7D8F	#CJK UNIFIED IDEOGRAPH
0xE357	0x7D7D	#CJK UNIFIED IDEOGRAPH
0xE358	0x7D9B	#CJK UNIFIED IDEOGRAPH
0xE359	0x7DBA	#CJK UNIFIED IDEOGRAPH
0xE35A	0x7DAE	#CJK UNIFIED IDEOGRAPH
0xE35B	0x7DA3	#CJK UNIFIED IDEOGRAPH
0xE35C	0x7DB5	#CJK UNIFIED IDEOGRAPH
0xE35D	0x7DC7	#CJK UNIFIED IDEOGRAPH
0xE35E	0x7DBD	#CJK UNIFIED IDEOGRAPH
0xE35F	0x7DAB	#CJK UNIFIED IDEOGRAPH
0xE360	0x7E3D	#CJK UNIFIED IDEOGRAPH
0xE361	0x7DA2	#CJK UNIFIED IDEOGRAPH
0xE362	0x7DAF	#CJK UNIFIED IDEOGRAPH
0xE363	0x7DDC	#CJK UNIFIED IDEOGRAPH
0xE364	0x7DB8	#CJK UNIFIED IDEOGRAPH
0xE365	0x7D9F	#CJK UNIFIED IDEOGRAPH
0xE366	0x7DB0	#CJK UNIFIED IDEOGRAPH
0xE367	0x7DD8	#CJK UNIFIED IDEOGRAPH
0xE368	0x7DDD	#CJK UNIFIED IDEOGRAPH
0xE369	0x7DE4	#CJK UNIFIED IDEOGRAPH
0xE36A	0x7DDE	#CJK UNIFIED IDEOGRAPH
0xE36B	0x7DFB	#CJK UNIFIED IDEOGRAPH
0xE36C	0x7DF2	#CJK UNIFIED IDEOGRAPH
0xE36D	0x7DE1	#CJK UNIFIED IDEOGRAPH
0xE36E	0x7E05	#CJK UNIFIED IDEOGRAPH
0xE36F	0x7E0A	#CJK UNIFIED IDEOGRAPH
0xE370	0x7E23	#CJK UNIFIED IDEOGRAPH
0xE371	0x7E21	#CJK UNIFIED IDEOGRAPH
0xE372	0x7E12	#CJK UNIFIED IDEOGRAPH
0xE373	0x7E31	#CJK UNIFIED IDEOGRAPH
0xE374	0x7E1F	#CJK UNIFIED IDEOGRAPH
0xE375	0x7E09	#CJK UNIFIED IDEOGRAPH
0xE376	0x7E0B	#CJK UNIFIED IDEOGRAPH
0xE377	0x7E22	#CJK UNIFIED IDEOGRAPH
0xE378	0x7E46	#CJK UNIFIED IDEOGRAPH
0xE379	0x7E66	#CJK UNIFIED IDEOGRAPH
0xE37A	0x7E3B	#CJK UNIFIED IDEOGRAPH
0xE37B	0x7E35	#CJK UNIFIED IDEOGRAPH
0xE37C	0x7E39	#CJK UNIFIED IDEOGRAPH
0xE37D	0x7E43	#CJK UNIFIED IDEOGRAPH
0xE37E	0x7E37	#CJK UNIFIED IDEOGRAPH
0xE380	0x7E32	#CJK UNIFIED IDEOGRAPH
0xE381	0x7E3A	#CJK UNIFIED IDEOGRAPH
0xE382	0x7E67	#CJK UNIFIED IDEOGRAPH
0xE383	0x7E5D	#CJK UNIFIED IDEOGRAPH
0xE384	0x7E56	#CJK UNIFIED IDEOGRAPH
0xE385	0x7E5E	#CJK UNIFIED IDEOGRAPH
0xE386	0x7E59	#CJK UNIFIED IDEOGRAPH
0xE387	0x7E5A	#CJK UNIFIED IDEOGRAPH
0xE388	0x7E79	#CJK UNIFIED IDEOGRAPH
0xE389	0x7E6A	#CJK UNIFIED IDEOGRAPH
0xE38A	0x7E69	#CJK UNIFIED IDEOGRAPH
0xE38B	0x7E7C	#CJK UNIFIED IDEOGRAPH
0xE38C	0x7E7B	#CJK UNIFIED IDEOGRAPH
0xE38D	0x7E83	#CJK UNIFIED IDEOGRAPH
0xE38E	0x7DD5	#CJK UNIFIED IDEOGRAPH
0xE38F	0x7E7D	#CJK UNIFIED IDEOGRAPH
0xE390	0x8FAE	#CJK UNIFIED IDEOGRAPH
0xE391	0x7E7F	#CJK UNIFIED IDEOGRAPH
0xE392	0x7E88	#CJK UNIFIED IDEOGRAPH
0xE393	0x7E89	#CJK UNIFIED IDEOGRAPH
0xE394	0x7E8C	#CJK UNIFIED IDEOGRAPH
0xE395	0x7E92	#CJK UNIFIED IDEOGRAPH
0xE396	0x7E90	#CJK UNIFIED IDEOGRAPH
0xE397	0x7E93	#CJK UNIFIED IDEOGRAPH
0xE398	0x7E94	#CJK UNIFIED IDEOGRAPH
0xE399	0x7E96	#CJK UNIFIED IDEOGRAPH
0xE39A	0x7E8E	#CJK UNIFIED IDEOGRAPH
0xE39B	0x7E9B	#CJK UNIFIED IDEOGRAPH
0xE39C	0x7E9C	#CJK UNIFIED IDEOGRAPH
0xE39D	0x7F38	#CJK UNIFIED IDEOGRAPH
0xE39E	0x7F3A	#CJK UNIFIED IDEOGRAPH
0xE39F	0x7F45	#CJK UNIFIED IDEOGRAPH
0xE3A0	0x7F4C	#CJK UNIFIED IDEOGRAPH
0xE3A1	0x7F4D	#CJK UNIFIED IDEOGRAPH
0xE3A2	0x7F4E	#CJK UNIFIED IDEOGRAPH
0xE3A3	0x7F50	#CJK UNIFIED IDEOGRAPH
0xE3A4	0x7F51	#CJK UNIFIED IDEOGRAPH
0xE3A5	0x7F55	#CJK UNIFIED IDEOGRAPH
0xE3A6	0x7F54	#CJK UNIFIED IDEOGRAPH
0xE3A7	0x7F58	#CJK UNIFIED IDEOGRAPH
0xE3A8	0x7F5F	#CJK UNIFIED IDEOGRAPH
0xE3A9	0x7F60	#CJK UNIFIED IDEOGRAPH
0xE3AA	0x7F68	#CJK UNIFIED IDEOGRAPH
0xE3AB	0x7F69	#CJK UNIFIED IDEOGRAPH
0xE3AC	0x7F67	#CJK UNIFIED IDEOGRAPH
0xE3AD	0x7F78	#CJK UNIFIED IDEOGRAPH
0xE3AE	0x7F82	#CJK UNIFIED IDEOGRAPH
0xE3AF	0x7F86	#CJK UNIFIED IDEOGRAPH
0xE3B0	0x7F83	#CJK UNIFIED IDEOGRAPH
0xE3B1	0x7F88	#CJK UNIFIED IDEOGRAPH
0xE3B2	0x7F87	#CJK UNIFIED IDEOGRAPH
0xE3B3	0x7F8C	#CJK UNIFIED IDEOGRAPH
0xE3B4	0x7F94	#CJK UNIFIED IDEOGRAPH
0xE3B5	0x7F9E	#CJK UNIFIED IDEOGRAPH
0xE3B6	0x7F9D	#CJK UNIFIED IDEOGRAPH
0xE3B7	0x7F9A	#CJK UNIFIED IDEOGRAPH
0xE3B8	0x7FA3	#CJK UNIFIED IDEOGRAPH
0xE3B9	0x7FAF	#CJK UNIFIED IDEOGRAPH
0xE3BA	0x7FB2	#CJK UNIFIED IDEOGRAPH
0xE3BB	0x7FB9	#CJK UNIFIED IDEOGRAPH
0xE3BC	0x7FAE	#CJK UNIFIED IDEOGRAPH
0xE3BD	0x7FB6	#CJK UNIFIED IDEOGRAPH
0xE3BE	0x7FB8	#CJK UNIFIED IDEOGRAPH
0xE3BF	0x8B71	#CJK UNIFIED IDEOGRAPH
0xE3C0	0x7FC5	#CJK UNIFIED IDEOGRAPH
0xE3C1	0x7FC6	#CJK UNIFIED IDEOGRAPH
0xE3C2	0x7FCA	#CJK UNIFIED IDEOGRAPH
0xE3C3	0x7FD5	#CJK UNIFIED IDEOGRAPH
0xE3C4	0x7FD4	#CJK UNIFIED IDEOGRAPH
0xE3C5	0x7FE1	#CJK UNIFIED IDEOGRAPH
0xE3C6	0x7FE6	#CJK UNIFIED IDEOGRAPH
0xE3C7	0x7FE9	#CJK UNIFIED IDEOGRAPH
0xE3C8	0x7FF3	#CJK UNIFIED IDEOGRAPH
0xE3C9	0x7FF9	#CJK UNIFIED IDEOGRAPH
0xE3CA	0x98DC	#CJK UNIFIED IDEOGRAPH
0xE3CB	0x8006	#CJK UNIFIED IDEOGRAPH
0xE3CC	0x8004	#CJK UNIFIED IDEOGRAPH
0xE3CD	0x800B	#CJK UNIFIED IDEOGRAPH
0xE3CE	0x8012	#CJK UNIFIED IDEOGRAPH
0xE3CF	0x8018	#CJK UNIFIED IDEOGRAPH
0xE3D0	0x8019	#CJK UNIFIED IDEOGRAPH
0xE3D1	0x801C	#CJK UNIFIED IDEOGRAPH
0xE3D2	0x8021	#CJK UNIFIED IDEOGRAPH
0xE3D3	0x8028	#CJK UNIFIED IDEOGRAPH
0xE3D4	0x803F	#CJK UNIFIED IDEOGRAPH
0xE3D5	0x803B	#CJK UNIFIED IDEOGRAPH
0xE3D6	0x804A	#CJK UNIFIED IDEOGRAPH
0xE3D7	0x8046	#CJK UNIFIED IDEOGRAPH
0xE3D8	0x8052	#CJK UNIFIED IDEOGRAPH
0xE3D9	0x8058	#CJK UNIFIED IDEOGRAPH
0xE3DA	0x805A	#CJK UNIFIED IDEOGRAPH
0xE3DB	0x805F	#CJK UNIFIED IDEOGRAPH
0xE3DC	0x8062	#CJK UNIFIED IDEOGRAPH
0xE3DD	0x8068	#CJK UNIFIED IDEOGRAPH
0xE3DE	0x8073	#CJK UNIFIED IDEOGRAPH
0xE3DF	0x8072	#CJK UNIFIED IDEOGRAPH
0xE3E0	0x8070	#CJK UNIFIED IDEOGRAPH
0xE3E1	0x8076	#CJK UNIFIED IDEOGRAPH
0xE3E2	0x8079	#CJK UNIFIED IDEOGRAPH
0xE3E3	0x807D	#CJK UNIFIED IDEOGRAPH
0xE3E4	0x807F	#CJK UNIFIED IDEOGRAPH
0xE3E5	0x8084	#CJK UNIFIED IDEOGRAPH
0xE3E6	0x8086	#CJK UNIFIED IDEOGRAPH
0xE3E7	0x8085	#CJK UNIFIED IDEOGRAPH
0xE3E8	0x809B	#CJK UNIFIED IDEOGRAPH
0xE3E9	0x8093	#CJK UNIFIED IDEOGRAPH
0xE3EA	0x809A	#CJK UNIFIED IDEOGRAPH
0xE3EB	0x80AD	#CJK UNIFIED IDEOGRAPH
0xE3EC	0x5190	#CJK UNIFIED IDEOGRAPH
0xE3ED	0x80AC	#CJK UNIFIED IDEOGRAPH
0xE3EE	0x80DB	#CJK UNIFIED IDEOGRAPH
0xE3EF	0x80E5	#CJK UNIFIED IDEOGRAPH
0xE3F0	0x80D9	#CJK UNIFIED IDEOGRAPH
0xE3F1	0x80DD	#CJK UNIFIED IDEOGRAPH
0xE3F2	0x80C4	#CJK UNIFIED IDEOGRAPH
0xE3F3	0x80DA	#CJK UNIFIED IDEOGRAPH
0xE3F4	0x80D6	#CJK UNIFIED IDEOGRAPH
0xE3F5	0x8109	#CJK UNIFIED IDEOGRAPH
0xE3F6	0x80EF	#CJK UNIFIED IDEOGRAPH
0xE3F7	0x80F1	#CJK UNIFIED IDEOGRAPH
0xE3F8	0x811B	#CJK UNIFIED IDEOGRAPH
0xE3F9	0x8129	#CJK UNIFIED IDEOGRAPH
0xE3FA	0x8123	#CJK UNIFIED IDEOGRAPH
0xE3FB	0x812F	#CJK UNIFIED IDEOGRAPH
0xE3FC	0x814B	#CJK UNIFIED IDEOGRAPH
0xE440	0x968B	#CJK UNIFIED IDEOGRAPH
0xE441	0x8146	#CJK UNIFIED IDEOGRAPH
0xE442	0x813E	#CJK UNIFIED IDEOGRAPH
0xE443	0x8153	#CJK UNIFIED IDEOGRAPH
0xE444	0x8151	#CJK UNIFIED IDEOGRAPH
0xE445	0x80FC	#CJK UNIFIED IDEOGRAPH
0xE446	0x8171	#CJK UNIFIED IDEOGRAPH
0xE447	0x816E	#CJK UNIFIED IDEOGRAPH
0xE448	0x8165	#CJK UNIFIED IDEOGRAPH
0xE449	0x8166	#CJK UNIFIED IDEOGRAPH
0xE44A	0x8174	#CJK UNIFIED IDEOGRAPH
0xE44B	0x8183	#CJK UNIFIED IDEOGRAPH
0xE44C	0x8188	#CJK UNIFIED IDEOGRAPH
0xE44D	0x818A	#CJK UNIFIED IDEOGRAPH
0xE44E	0x8180	#CJK UNIFIED IDEOGRAPH
0xE44F	0x8182	#CJK UNIFIED IDEOGRAPH
0xE450	0x81A0	#CJK UNIFIED IDEOGRAPH
0xE451	0x8195	#CJK UNIFIED IDEOGRAPH
0xE452	0x81A4	#CJK UNIFIED IDEOGRAPH
0xE453	0x81A3	#CJK UNIFIED IDEOGRAPH
0xE454	0x815F	#CJK UNIFIED IDEOGRAPH
0xE455	0x8193	#CJK UNIFIED IDEOGRAPH
0xE456	0x81A9	#CJK UNIFIED IDEOGRAPH
0xE457	0x81B0	#CJK UNIFIED IDEOGRAPH
0xE458	0x81B5	#CJK UNIFIED IDEOGRAPH
0xE459	0x81BE	#CJK UNIFIED IDEOGRAPH
0xE45A	0x81B8	#CJK UNIFIED IDEOGRAPH
0xE45B	0x81BD	#CJK UNIFIED IDEOGRAPH
0xE45C	0x81C0	#CJK UNIFIED IDEOGRAPH
0xE45D	0x81C2	#CJK UNIFIED IDEOGRAPH
0xE45E	0x81BA	#CJK UNIFIED IDEOGRAPH
0xE45F	0x81C9	#CJK UNIFIED IDEOGRAPH
0xE460	0x81CD	#CJK UNIFIED IDEOGRAPH
0xE461	0x81D1	#CJK UNIFIED IDEOGRAPH
0xE462	0x81D9	#CJK UNIFIED IDEOGRAPH
0xE463	0x81D8	#CJK UNIFIED IDEOGRAPH
0xE464	0x81C8	#CJK UNIFIED IDEOGRAPH
0xE465	0x81DA	#CJK UNIFIED IDEOGRAPH
0xE466	0x81DF	#CJK UNIFIED IDEOGRAPH
0xE467	0x81E0	#CJK UNIFIED IDEOGRAPH
0xE468	0x81E7	#CJK UNIFIED IDEOGRAPH
0xE469	0x81FA	#CJK UNIFIED IDEOGRAPH
0xE46A	0x81FB	#CJK UNIFIED IDEOGRAPH
0xE46B	0x81FE	#CJK UNIFIED IDEOGRAPH
0xE46C	0x8201	#CJK UNIFIED IDEOGRAPH
0xE46D	0x8202	#CJK UNIFIED IDEOGRAPH
0xE46E	0x8205	#CJK UNIFIED IDEOGRAPH
0xE46F	0x8207	#CJK UNIFIED IDEOGRAPH
0xE470	0x820A	#CJK UNIFIED IDEOGRAPH
0xE471	0x820D	#CJK UNIFIED IDEOGRAPH
0xE472	0x8210	#CJK UNIFIED IDEOGRAPH
0xE473	0x8216	#CJK UNIFIED IDEOGRAPH
0xE474	0x8229	#CJK UNIFIED IDEOGRAPH
0xE475	0x822B	#CJK UNIFIED IDEOGRAPH
0xE476	0x8238	#CJK UNIFIED IDEOGRAPH
0xE477	0x8233	#CJK UNIFIED IDEOGRAPH
0xE478	0x8240	#CJK UNIFIED IDEOGRAPH
0xE479	0x8259	#CJK UNIFIED IDEOGRAPH
0xE47A	0x8258	#CJK UNIFIED IDEOGRAPH
0xE47B	0x825D	#CJK UNIFIED IDEOGRAPH
0xE47C	0x825A	#CJK UNIFIED IDEOGRAPH
0xE47D	0x825F	#CJK UNIFIED IDEOGRAPH
0xE47E	0x8264	#CJK UNIFIED IDEOGRAPH
0xE480	0x8262	#CJK UNIFIED IDEOGRAPH
0xE481	0x8268	#CJK UNIFIED IDEOGRAPH
0xE482	0x826A	#CJK UNIFIED IDEOGRAPH
0xE483	0x826B	#CJK UNIFIED IDEOGRAPH
0xE484	0x822E	#CJK UNIFIED IDEOGRAPH
0xE485	0x8271	#CJK UNIFIED IDEOGRAPH
0xE486	0x8277	#CJK UNIFIED IDEOGRAPH
0xE487	0x8278	#CJK UNIFIED IDEOGRAPH
0xE488	0x827E	#CJK UNIFIED IDEOGRAPH
0xE489	0x828D	#CJK UNIFIED IDEOGRAPH
0xE48A	0x8292	#CJK UNIFIED IDEOGRAPH
0xE48B	0x82AB	#CJK UNIFIED IDEOGRAPH
0xE48C	0x829F	#CJK UNIFIED IDEOGRAPH
0xE48D	0x82BB	#CJK UNIFIED IDEOGRAPH
0xE48E	0x82AC	#CJK UNIFIED IDEOGRAPH
0xE48F	0x82E1	#CJK UNIFIED IDEOGRAPH
0xE490	0x82E3	#CJK UNIFIED IDEOGRAPH
0xE491	0x82DF	#CJK UNIFIED IDEOGRAPH
0xE492	0x82D2	#CJK UNIFIED IDEOGRAPH
0xE493	0x82F4	#CJK UNIFIED IDEOGRAPH
0xE494	0x82F3	#CJK UNIFIED IDEOGRAPH
0xE495	0x82FA	#CJK UNIFIED IDEOGRAPH
0xE496	0x8393	#CJK UNIFIED IDEOGRAPH
0xE497	0x8303	#CJK UNIFIED IDEOGRAPH
0xE498	0x82FB	#CJK UNIFIED IDEOGRAPH
0xE499	0x82F9	#CJK UNIFIED IDEOGRAPH
0xE49A	0x82DE	#CJK UNIFIED IDEOGRAPH
0xE49B	0x8306	#CJK UNIFIED IDEOGRAPH
0xE49C	0x82DC	#CJK UNIFIED IDEOGRAPH
0xE49D	0x8309	#CJK UNIFIED IDEOGRAPH
0xE49E	0x82D9	#CJK UNIFIED IDEOGRAPH
0xE49F	0x8335	#CJK UNIFIED IDEOGRAPH
0xE4A0	0x8334	#CJK UNIFIED IDEOGRAPH
0xE4A1	0x8316	#CJK UNIFIED IDEOGRAPH
0xE4A2	0x8332	#CJK UNIFIED IDEOGRAPH
0xE4A3	0x8331	#CJK UNIFIED IDEOGRAPH
0xE4A4	0x8340	#CJK UNIFIED IDEOGRAPH
0xE4A5	0x8339	#CJK UNIFIED IDEOGRAPH
0xE4A6	0x8350	#CJK UNIFIED IDEOGRAPH
0xE4A7	0x8345	#CJK UNIFIED IDEOGRAPH
0xE4A8	0x832F	#CJK UNIFIED IDEOGRAPH
0xE4A9	0x832B	#CJK UNIFIED IDEOGRAPH
0xE4AA	0x8317	#CJK UNIFIED IDEOGRAPH
0xE4AB	0x8318	#CJK UNIFIED IDEOGRAPH
0xE4AC	0x8385	#CJK UNIFIED IDEOGRAPH
0xE4AD	0x839A	#CJK UNIFIED IDEOGRAPH
0xE4AE	0x83AA	#CJK UNIFIED IDEOGRAPH
0xE4AF	0x839F	#CJK UNIFIED IDEOGRAPH
0xE4B0	0x83A2	#CJK UNIFIED IDEOGRAPH
0xE4B1	0x8396	#CJK UNIFIED IDEOGRAPH
0xE4B2	0x8323	#CJK UNIFIED IDEOGRAPH
0xE4B3	0x838E	#CJK UNIFIED IDEOGRAPH
0xE4B4	0x8387	#CJK UNIFIED IDEOGRAPH
0xE4B5	0x838A	#CJK UNIFIED IDEOGRAPH
0xE4B6	0x837C	#CJK UNIFIED IDEOGRAPH
0xE4B7	0x83B5	#CJK UNIFIED IDEOGRAPH
0xE4B8	0x8373	#CJK UNIFIED IDEOGRAPH
0xE4B9	0x8375	#CJK UNIFIED IDEOGRAPH
0xE4BA	0x83A0	#CJK UNIFIED IDEOGRAPH
0xE4BB	0x8389	#CJK UNIFIED IDEOGRAPH
0xE4BC	0x83A8	#CJK UNIFIED IDEOGRAPH
0xE4BD	0x83F4	#CJK UNIFIED IDEOGRAPH
0xE4BE	0x8413	#CJK UNIFIED IDEOGRAPH
0xE4BF	0x83EB	#CJK UNIFIED IDEOGRAPH
0xE4C0	0x83CE	#CJK UNIFIED IDEOGRAPH
0xE4C1	0x83FD	#CJK UNIFIED IDEOGRAPH
0xE4C2	0x8403	#CJK UNIFIED IDEOGRAPH
0xE4C3	0x83D8	#CJK UNIFIED IDEOGRAPH
0xE4C4	0x840B	#CJK UNIFIED IDEOGRAPH
0xE4C5	0x83C1	#CJK UNIFIED IDEOGRAPH
0xE4C6	0x83F7	#CJK UNIFIED IDEOGRAPH
0xE4C7	0x8407	#CJK UNIFIED IDEOGRAPH
0xE4C8	0x83E0	#CJK UNIFIED IDEOGRAPH
0xE4C9	0x83F2	#CJK UNIFIED IDEOGRAPH
0xE4CA	0x840D	#CJK UNIFIED IDEOGRAPH
0xE4CB	0x8422	#CJK UNIFIED IDEOGRAPH
0xE4CC	0x8420	#CJK UNIFIED IDEOGRAPH
0xE4CD	0x83BD	#CJK UNIFIED IDEOGRAPH
0xE4CE	0x8438	#CJK UNIFIED IDEOGRAPH
0xE4CF	0x8506	#CJK UNIFIED IDEOGRAPH
0xE4D0	0x83FB	#CJK UNIFIED IDEOGRAPH
0xE4D1	0x846D	#CJK UNIFIED IDEOGRAPH
0xE4D2	0x842A	#CJK UNIFIED IDEOGRAPH
0xE4D3	0x843C	#CJK UNIFIED IDEOGRAPH
0xE4D4	0x855A	#CJK UNIFIED IDEOGRAPH
0xE4D5	0x8484	#CJK UNIFIED IDEOGRAPH
0xE4D6	0x8477	#CJK UNIFIED IDEOGRAPH
0xE4D7	0x846B	#CJK UNIFIED IDEOGRAPH
0xE4D8	0x84AD	#CJK UNIFIED IDEOGRAPH
0xE4D9	0x846E	#CJK UNIFIED IDEOGRAPH
0xE4DA	0x8482	#CJK UNIFIED IDEOGRAPH
0xE4DB	0x8469	#CJK UNIFIED IDEOGRAPH
0xE4DC	0x8446	#CJK UNIFIED IDEOGRAPH
0xE4DD	0x842C	#CJK UNIFIED IDEOGRAPH
0xE4DE	0x846F	#CJK UNIFIED IDEOGRAPH
0xE4DF	0x8479	#CJK UNIFIED IDEOGRAPH
0xE4E0	0x8435	#CJK UNIFIED IDEOGRAPH
0xE4E1	0x84CA	#CJK UNIFIED IDEOGRAPH
0xE4E2	0x8462	#CJK UNIFIED IDEOGRAPH
0xE4E3	0x84B9	#CJK UNIFIED IDEOGRAPH
0xE4E4	0x84BF	#CJK UNIFIED IDEOGRAPH
0xE4E5	0x849F	#CJK UNIFIED IDEOGRAPH
0xE4E6	0x84D9	#CJK UNIFIED IDEOGRAPH
0xE4E7	0x84CD	#CJK UNIFIED IDEOGRAPH
0xE4E8	0x84BB	#CJK UNIFIED IDEOGRAPH
0xE4E9	0x84DA	#CJK UNIFIED IDEOGRAPH
0xE4EA	0x84D0	#CJK UNIFIED IDEOGRAPH
0xE4EB	0x84C1	#CJK UNIFIED IDEOGRAPH
0xE4EC	0x84C6	#CJK UNIFIED IDEOGRAPH
0xE4ED	0x84D6	#CJK UNIFIED IDEOGRAPH
0xE4EE	0x84A1	#CJK UNIFIED IDEOGRAPH
0xE4EF	0x8521	#CJK UNIFIED IDEOGRAPH
0xE4F0	0x84FF	#CJK UNIFIED IDEOGRAPH
0xE4F1	0x84F4	#CJK UNIFIED IDEOGRAPH
0xE4F2	0x8517	#CJK UNIFIED IDEOGRAPH
0xE4F3	0x8518	#CJK UNIFIED IDEOGRAPH
0xE4F4	0x852C	#CJK UNIFIED IDEOGRAPH
0xE4F5	0x851F	#CJK UNIFIED IDEOGRAPH
0xE4F6	0x8515	#CJK UNIFIED IDEOGRAPH
0xE4F7	0x8514	#CJK UNIFIED IDEOGRAPH
0xE4F8	0x84FC	#CJK UNIFIED IDEOGRAPH
0xE4F9	0x8540	#CJK UNIFIED IDEOGRAPH
0xE4FA	0x8563	#CJK UNIFIED IDEOGRAPH
0xE4FB	0x8558	#CJK UNIFIED IDEOGRAPH
0xE4FC	0x8548	#CJK UNIFIED IDEOGRAPH
0xE540	0x8541	#CJK UNIFIED IDEOGRAPH
0xE541	0x8602	#CJK UNIFIED IDEOGRAPH
0xE542	0x854B	#CJK UNIFIED IDEOGRAPH
0xE543	0x8555	#CJK UNIFIED IDEOGRAPH
0xE544	0x8580	#CJK UNIFIED IDEOGRAPH
0xE545	0x85A4	#CJK UNIFIED IDEOGRAPH
0xE546	0x8588	#CJK UNIFIED IDEOGRAPH
0xE547	0x8591	#CJK UNIFIED IDEOGRAPH
0xE548	0x858A	#CJK UNIFIED IDEOGRAPH
0xE549	0x85A8	#CJK UNIFIED IDEOGRAPH
0xE54A	0x856D	#CJK UNIFIED IDEOGRAPH
0xE54B	0x8594	#CJK UNIFIED IDEOGRAPH
0xE54C	0x859B	#CJK UNIFIED IDEOGRAPH
0xE54D	0x85EA	#CJK UNIFIED IDEOGRAPH
0xE54E	0x8587	#CJK UNIFIED IDEOGRAPH
0xE54F	0x859C	#CJK UNIFIED IDEOGRAPH
0xE550	0x8577	#CJK UNIFIED IDEOGRAPH
0xE551	0x857E	#CJK UNIFIED IDEOGRAPH
0xE552	0x8590	#CJK UNIFIED IDEOGRAPH
0xE553	0x85C9	#CJK UNIFIED IDEOGRAPH
0xE554	0x85BA	#CJK UNIFIED IDEOGRAPH
0xE555	0x85CF	#CJK UNIFIED IDEOGRAPH
0xE556	0x85B9	#CJK UNIFIED IDEOGRAPH
0xE557	0x85D0	#CJK UNIFIED IDEOGRAPH
0xE558	0x85D5	#CJK UNIFIED IDEOGRAPH
0xE559	0x85DD	#CJK UNIFIED IDEOGRAPH
0xE55A	0x85E5	#CJK UNIFIED IDEOGRAPH
0xE55B	0x85DC	#CJK UNIFIED IDEOGRAPH
0xE55C	0x85F9	#CJK UNIFIED IDEOGRAPH
0xE55D	0x860A	#CJK UNIFIED IDEOGRAPH
0xE55E	0x8613	#CJK UNIFIED IDEOGRAPH
0xE55F	0x860B	#CJK UNIFIED IDEOGRAPH
0xE560	0x85FE	#CJK UNIFIED IDEOGRAPH
0xE561	0x85FA	#CJK UNIFIED IDEOGRAPH
0xE562	0x8606	#CJK UNIFIED IDEOGRAPH
0xE563	0x8622	#CJK UNIFIED IDEOGRAPH
0xE564	0x861A	#CJK UNIFIED IDEOGRAPH
0xE565	0x8630	#CJK UNIFIED IDEOGRAPH
0xE566	0x863F	#CJK UNIFIED IDEOGRAPH
0xE567	0x864D	#CJK UNIFIED IDEOGRAPH
0xE568	0x4E55	#CJK UNIFIED IDEOGRAPH
0xE569	0x8654	#CJK UNIFIED IDEOGRAPH
0xE56A	0x865F	#CJK UNIFIED IDEOGRAPH
0xE56B	0x8667	#CJK UNIFIED IDEOGRAPH
0xE56C	0x8671	#CJK UNIFIED IDEOGRAPH
0xE56D	0x8693	#CJK UNIFIED IDEOGRAPH
0xE56E	0x86A3	#CJK UNIFIED IDEOGRAPH
0xE56F	0x86A9	#CJK UNIFIED IDEOGRAPH
0xE570	0x86AA	#CJK UNIFIED IDEOGRAPH
0xE571	0x868B	#CJK UNIFIED IDEOGRAPH
0xE572	0x868C	#CJK UNIFIED IDEOGRAPH
0xE573	0x86B6	#CJK UNIFIED IDEOGRAPH
0xE574	0x86AF	#CJK UNIFIED IDEOGRAPH
0xE575	0x86C4	#CJK UNIFIED IDEOGRAPH
0xE576	0x86C6	#CJK UNIFIED IDEOGRAPH
0xE577	0x86B0	#CJK UNIFIED IDEOGRAPH
0xE578	0x86C9	#CJK UNIFIED IDEOGRAPH
0xE579	0x8823	#CJK UNIFIED IDEOGRAPH
0xE57A	0x86AB	#CJK UNIFIED IDEOGRAPH
0xE57B	0x86D4	#CJK UNIFIED IDEOGRAPH
0xE57C	0x86DE	#CJK UNIFIED IDEOGRAPH
0xE57D	0x86E9	#CJK UNIFIED IDEOGRAPH
0xE57E	0x86EC	#CJK UNIFIED IDEOGRAPH
0xE580	0x86DF	#CJK UNIFIED IDEOGRAPH
0xE581	0x86DB	#CJK UNIFIED IDEOGRAPH
0xE582	0x86EF	#CJK UNIFIED IDEOGRAPH
0xE583	0x8712	#CJK UNIFIED IDEOGRAPH
0xE584	0x8706	#CJK UNIFIED IDEOGRAPH
0xE585	0x8708	#CJK UNIFIED IDEOGRAPH
0xE586	0x8700	#CJK UNIFIED IDEOGRAPH
0xE587	0x8703	#CJK UNIFIED IDEOGRAPH
0xE588	0x86FB	#CJK UNIFIED IDEOGRAPH
0xE589	0x8711	#CJK UNIFIED IDEOGRAPH
0xE58A	0x8709	#CJK UNIFIED IDEOGRAPH
0xE58B	0x870D	#CJK UNIFIED IDEOGRAPH
0xE58C	0x86F9	#CJK UNIFIED IDEOGRAPH
0xE58D	0x870A	#CJK UNIFIED IDEOGRAPH
0xE58E	0x8734	#CJK UNIFIED IDEOGRAPH
0xE58F	0x873F	#CJK UNIFIED IDEOGRAPH
0xE590	0x8737	#CJK UNIFIED IDEOGRAPH
0xE591	0x873B	#CJK UNIFIED IDEOGRAPH
0xE592	0x8725	#CJK UNIFIED IDEOGRAPH
0xE593	0x8729	#CJK UNIFIED IDEOGRAPH
0xE594	0x871A	#CJK UNIFIED IDEOGRAPH
0xE595	0x8760	#CJK UNIFIED IDEOGRAPH
0xE596	0x875F	#CJK UNIFIED IDEOGRAPH
0xE597	0x8778	#CJK UNIFIED IDEOGRAPH
0xE598	0x874C	#CJK UNIFIED IDEOGRAPH
0xE599	0x874E	#CJK UNIFIED IDEOGRAPH
0xE59A	0x8774	#CJK UNIFIED IDEOGRAPH
0xE59B	0x8757	#CJK UNIFIED IDEOGRAPH
0xE59C	0x8768	#CJK UNIFIED IDEOGRAPH
0xE59D	0x876E	#CJK UNIFIED IDEOGRAPH
0xE59E	0x8759	#CJK UNIFIED IDEOGRAPH
0xE59F	0x8753	#CJK UNIFIED IDEOGRAPH
0xE5A0	0x8763	#CJK UNIFIED IDEOGRAPH
0xE5A1	0x876A	#CJK UNIFIED IDEOGRAPH
0xE5A2	0x8805	#CJK UNIFIED IDEOGRAPH
0xE5A3	0x87A2	#CJK UNIFIED IDEOGRAPH
0xE5A4	0x879F	#CJK UNIFIED IDEOGRAPH
0xE5A5	0x8782	#CJK UNIFIED IDEOGRAPH
0xE5A6	0x87AF	#CJK UNIFIED IDEOGRAPH
0xE5A7	0x87CB	#CJK UNIFIED IDEOGRAPH
0xE5A8	0x87BD	#CJK UNIFIED IDEOGRAPH
0xE5A9	0x87C0	#CJK UNIFIED IDEOGRAPH
0xE5AA	0x87D0	#CJK UNIFIED IDEOGRAPH
0xE5AB	0x96D6	#CJK UNIFIED IDEOGRAPH
0xE5AC	0x87AB	#CJK UNIFIED IDEOGRAPH
0xE5AD	0x87C4	#CJK UNIFIED IDEOGRAPH
0xE5AE	0x87B3	#CJK UNIFIED IDEOGRAPH
0xE5AF	0x87C7	#CJK UNIFIED IDEOGRAPH
0xE5B0	0x87C6	#CJK UNIFIED IDEOGRAPH
0xE5B1	0x87BB	#CJK UNIFIED IDEOGRAPH
0xE5B2	0x87EF	#CJK UNIFIED IDEOGRAPH
0xE5B3	0x87F2	#CJK UNIFIED IDEOGRAPH
0xE5B4	0x87E0	#CJK UNIFIED IDEOGRAPH
0xE5B5	0x880F	#CJK UNIFIED IDEOGRAPH
0xE5B6	0x880D	#CJK UNIFIED IDEOGRAPH
0xE5B7	0x87FE	#CJK UNIFIED IDEOGRAPH
0xE5B8	0x87F6	#CJK UNIFIED IDEOGRAPH
0xE5B9	0x87F7	#CJK UNIFIED IDEOGRAPH
0xE5BA	0x880E	#CJK UNIFIED IDEOGRAPH
0xE5BB	0x87D2	#CJK UNIFIED IDEOGRAPH
0xE5BC	0x8811	#CJK UNIFIED IDEOGRAPH
0xE5BD	0x8816	#CJK UNIFIED IDEOGRAPH
0xE5BE	0x8815	#CJK UNIFIED IDEOGRAPH
0xE5BF	0x8822	#CJK UNIFIED IDEOGRAPH
0xE5C0	0x8821	#CJK UNIFIED IDEOGRAPH
0xE5C1	0x8831	#CJK UNIFIED IDEOGRAPH
0xE5C2	0x8836	#CJK UNIFIED IDEOGRAPH
0xE5C3	0x8839	#CJK UNIFIED IDEOGRAPH
0xE5C4	0x8827	#CJK UNIFIED IDEOGRAPH
0xE5C5	0x883B	#CJK UNIFIED IDEOGRAPH
0xE5C6	0x8844	#CJK UNIFIED IDEOGRAPH
0xE5C7	0x8842	#CJK UNIFIED IDEOGRAPH
0xE5C8	0x8852	#CJK UNIFIED IDEOGRAPH
0xE5C9	0x8859	#CJK UNIFIED IDEOGRAPH
0xE5CA	0x885E	#CJK UNIFIED IDEOGRAPH
0xE5CB	0x8862	#CJK UNIFIED IDEOGRAPH
0xE5CC	0x886B	#CJK UNIFIED IDEOGRAPH
0xE5CD	0x8881	#CJK UNIFIED IDEOGRAPH
0xE5CE	0x887E	#CJK UNIFIED IDEOGRAPH
0xE5CF	0x889E	#CJK UNIFIED IDEOGRAPH
0xE5D0	0x8875	#CJK UNIFIED IDEOGRAPH
0xE5D1	0x887D	#CJK UNIFIED IDEOGRAPH
0xE5D2	0x88B5	#CJK UNIFIED IDEOGRAPH
0xE5D3	0x8872	#CJK UNIFIED IDEOGRAPH
0xE5D4	0x8882	#CJK UNIFIED IDEOGRAPH
0xE5D5	0x8897	#CJK UNIFIED IDEOGRAPH
0xE5D6	0x8892	#CJK UNIFIED IDEOGRAPH
0xE5D7	0x88AE	#CJK UNIFIED IDEOGRAPH
0xE5D8	0x8899	#CJK UNIFIED IDEOGRAPH
0xE5D9	0x88A2	#CJK UNIFIED IDEOGRAPH
0xE5DA	0x888D	#CJK UNIFIED IDEOGRAPH
0xE5DB	0x88A4	#CJK UNIFIED IDEOGRAPH
0xE5DC	0x88B0	#CJK UNIFIED IDEOGRAPH
0xE5DD	0x88BF	#CJK UNIFIED IDEOGRAPH
0xE5DE	0x88B1	#CJK UNIFIED IDEOGRAPH
0xE5DF	0x88C3	#CJK UNIFIED IDEOGRAPH
0xE5E0	0x88C4	#CJK UNIFIED IDEOGRAPH
0xE5E1	0x88D4	#CJK UNIFIED IDEOGRAPH
0xE5E2	0x88D8	#CJK UNIFIED IDEOGRAPH
0xE5E3	0x88D9	#CJK UNIFIED IDEOGRAPH
0xE5E4	0x88DD	#CJK UNIFIED IDEOGRAPH
0xE5E5	0x88F9	#CJK UNIFIED IDEOGRAPH
0xE5E6	0x8902	#CJK UNIFIED IDEOGRAPH
0xE5E7	0x88FC	#CJK UNIFIED IDEOGRAPH
0xE5E8	0x88F4	#CJK UNIFIED IDEOGRAPH
0xE5E9	0x88E8	#CJK UNIFIED IDEOGRAPH
0xE5EA	0x88F2	#CJK UNIFIED IDEOGRAPH
0xE5EB	0x8904	#CJK UNIFIED IDEOGRAPH
0xE5EC	0x890C	#CJK UNIFIED IDEOGRAPH
0xE5ED	0x890A	#CJK UNIFIED IDEOGRAPH
0xE5EE	0x8913	#CJK UNIFIED IDEOGRAPH
0xE5EF	0x8943	#CJK UNIFIED IDEOGRAPH
0xE5F0	0x891E	#CJK UNIFIED IDEOGRAPH
0xE5F1	0x8925	#CJK UNIFIED IDEOGRAPH
0xE5F2	0x892A	#CJK UNIFIED IDEOGRAPH
0xE5F3	0x892B	#CJK UNIFIED IDEOGRAPH
0xE5F4	0x8941	#CJK UNIFIED IDEOGRAPH
0xE5F5	0x8944	#CJK UNIFIED IDEOGRAPH
0xE5F6	0x893B	#CJK UNIFIED IDEOGRAPH
0xE5F7	0x8936	#CJK UNIFIED IDEOGRAPH
0xE5F8	0x8938	#CJK UNIFIED IDEOGRAPH
0xE5F9	0x894C	#CJK UNIFIED IDEOGRAPH
0xE5FA	0x891D	#CJK UNIFIED IDEOGRAPH
0xE5FB	0x8960	#CJK UNIFIED IDEOGRAPH
0xE5FC	0x895E	#CJK UNIFIED IDEOGRAPH
0xE640	0x8966	#CJK UNIFIED IDEOGRAPH
0xE641	0x8964	#CJK UNIFIED IDEOGRAPH
0xE642	0x896D	#CJK UNIFIED IDEOGRAPH
0xE643	0x896A	#CJK UNIFIED IDEOGRAPH
0xE644	0x896F	#CJK UNIFIED IDEOGRAPH
0xE645	0x8974	#CJK UNIFIED IDEOGRAPH
0xE646	0x8977	#CJK UNIFIED IDEOGRAPH
0xE647	0x897E	#CJK UNIFIED IDEOGRAPH
0xE648	0x8983	#CJK UNIFIED IDEOGRAPH
0xE649	0x8988	#CJK UNIFIED IDEOGRAPH
0xE64A	0x898A	#CJK UNIFIED IDEOGRAPH
0xE64B	0x8993	#CJK UNIFIED IDEOGRAPH
0xE64C	0x8998	#CJK UNIFIED IDEOGRAPH
0xE64D	0x89A1	#CJK UNIFIED IDEOGRAPH
0xE64E	0x89A9	#CJK UNIFIED IDEOGRAPH
0xE64F	0x89A6	#CJK UNIFIED IDEOGRAPH
0xE650	0x89AC	#CJK UNIFIED IDEOGRAPH
0xE651	0x89AF	#CJK UNIFIED IDEOGRAPH
0xE652	0x89B2	#CJK UNIFIED IDEOGRAPH
0xE653	0x89BA	#CJK UNIFIED IDEOGRAPH
0xE654	0x89BD	#CJK UNIFIED IDEOGRAPH
0xE655	0x89BF	#CJK UNIFIED IDEOGRAPH
0xE656	0x89C0	#CJK UNIFIED IDEOGRAPH
0xE657	0x89DA	#CJK UNIFIED IDEOGRAPH
0xE658	0x89DC	#CJK UNIFIED IDEOGRAPH
0xE659	0x89DD	#CJK UNIFIED IDEOGRAPH
0xE65A	0x89E7	#CJK UNIFIED IDEOGRAPH
0xE65B	0x89F4	#CJK UNIFIED IDEOGRAPH
0xE65C	0x89F8	#CJK UNIFIED IDEOGRAPH
0xE65D	0x8A03	#CJK UNIFIED IDEOGRAPH
0xE65E	0x8A16	#CJK UNIFIED IDEOGRAPH
0xE65F	0x8A10	#CJK UNIFIED IDEOGRAPH
0xE660	0x8A0C	#CJK UNIFIED IDEOGRAPH
0xE661	0x8A1B	#CJK UNIFIED IDEOGRAPH
0xE662	0x8A1D	#CJK UNIFIED IDEOGRAPH
0xE663	0x8A25	#CJK UNIFIED IDEOGRAPH
0xE664	0x8A36	#CJK UNIFIED IDEOGRAPH
0xE665	0x8A41	#CJK UNIFIED IDEOGRAPH
0xE666	0x8A5B	#CJK UNIFIED IDEOGRAPH
0xE667	0x8A52	#CJK UNIFIED IDEOGRAPH
0xE668	0x8A46	#CJK UNIFIED IDEOGRAPH
0xE669	0x8A48	#CJK UNIFIED IDEOGRAPH
0xE66A	0x8A7C	#CJK UNIFIED IDEOGRAPH
0xE66B	0x8A6D	#CJK UNIFIED IDEOGRAPH
0xE66C	0x8A6C	#CJK UNIFIED IDEOGRAPH
0xE66D	0x8A62	#CJK UNIFIED IDEOGRAPH
0xE66E	0x8A85	#CJK UNIFIED IDEOGRAPH
0xE66F	0x8A82	#CJK UNIFIED IDEOGRAPH
0xE670	0x8A84	#CJK UNIFIED IDEOGRAPH
0xE671	0x8AA8	#CJK UNIFIED IDEOGRAPH
0xE672	0x8AA1	#CJK UNIFIED IDEOGRAPH
0xE673	0x8A91	#CJK UNIFIED IDEOGRAPH
0xE674	0x8AA5	#CJK UNIFIED IDEOGRAPH
0xE675	0x8AA6	#CJK UNIFIED IDEOGRAPH
0xE676	0x8A9A	#CJK UNIFIED IDEOGRAPH
0xE677	0x8AA3	#CJK UNIFIED IDEOGRAPH
0xE678	0x8AC4	#CJK UNIFIED IDEOGRAPH
0xE679	0x8ACD	#CJK UNIFIED IDEOGRAPH
0xE67A	0x8AC2	#CJK UNIFIED IDEOGRAPH
0xE67B	0x8ADA	#CJK UNIFIED IDEOGRAPH
0xE67C	0x8AEB	#CJK UNIFIED IDEOGRAPH
0xE67D	0x8AF3	#CJK UNIFIED IDEOGRAPH
0xE67E	0x8AE7	#CJK UNIFIED IDEOGRAPH
0xE680	0x8AE4	#CJK UNIFIED IDEOGRAPH
0xE681	0x8AF1	#CJK UNIFIED IDEOGRAPH
0xE682	0x8B14	#CJK UNIFIED IDEOGRAPH
0xE683	0x8AE0	#CJK UNIFIED IDEOGRAPH
0xE684	0x8AE2	#CJK UNIFIED IDEOGRAPH
0xE685	0x8AF7	#CJK UNIFIED IDEOGRAPH
0xE686	0x8ADE	#CJK UNIFIED IDEOGRAPH
0xE687	0x8ADB	#CJK UNIFIED IDEOGRAPH
0xE688	0x8B0C	#CJK UNIFIED IDEOGRAPH
0xE689	0x8B07	#CJK UNIFIED IDEOGRAPH
0xE68A	0x8B1A	#CJK UNIFIED IDEOGRAPH
0xE68B	0x8AE1	#CJK UNIFIED IDEOGRAPH
0xE68C	0x8B16	#CJK UNIFIED IDEOGRAPH
0xE68D	0x8B10	#CJK UNIFIED IDEOGRAPH
0xE68E	0x8B17	#CJK UNIFIED IDEOGRAPH
0xE68F	0x8B20	#CJK UNIFIED IDEOGRAPH
0xE690	0x8B33	#CJK UNIFIED IDEOGRAPH
0xE691	0x97AB	#CJK UNIFIED IDEOGRAPH
0xE692	0x8B26	#CJK UNIFIED IDEOGRAPH
0xE693	0x8B2B	#CJK UNIFIED IDEOGRAPH
0xE694	0x8B3E	#CJK UNIFIED IDEOGRAPH
0xE695	0x8B28	#CJK UNIFIED IDEOGRAPH
0xE696	0x8B41	#CJK UNIFIED IDEOGRAPH
0xE697	0x8B4C	#CJK UNIFIED IDEOGRAPH
0xE698	0x8B4F	#CJK UNIFIED IDEOGRAPH
0xE699	0x8B4E	#CJK UNIFIED IDEOGRAPH
0xE69A	0x8B49	#CJK UNIFIED IDEOGRAPH
0xE69B	0x8B56	#CJK UNIFIED IDEOGRAPH
0xE69C	0x8B5B	#CJK UNIFIED IDEOGRAPH
0xE69D	0x8B5A	#CJK UNIFIED IDEOGRAPH
0xE69E	0x8B6B	#CJK UNIFIED IDEOGRAPH
0xE69F	0x8B5F	#CJK UNIFIED IDEOGRAPH
0xE6A0	0x8B6C	#CJK UNIFIED IDEOGRAPH
0xE6A1	0x8B6F	#CJK UNIFIED IDEOGRAPH
0xE6A2	0x8B74	#CJK UNIFIED IDEOGRAPH
0xE6A3	0x8B7D	#CJK UNIFIED IDEOGRAPH
0xE6A4	0x8B80	#CJK UNIFIED IDEOGRAPH
0xE6A5	0x8B8C	#CJK UNIFIED IDEOGRAPH
0xE6A6	0x8B8E	#CJK UNIFIED IDEOGRAPH
0xE6A7	0x8B92	#CJK UNIFIED IDEOGRAPH
0xE6A8	0x8B93	#CJK UNIFIED IDEOGRAPH
0xE6A9	0x8B96	#CJK UNIFIED IDEOGRAPH
0xE6AA	0x8B99	#CJK UNIFIED IDEOGRAPH
0xE6AB	0x8B9A	#CJK UNIFIED IDEOGRAPH
0xE6AC	0x8C3A	#CJK UNIFIED IDEOGRAPH
0xE6AD	0x8C41	#CJK UNIFIED IDEOGRAPH
0xE6AE	0x8C3F	#CJK UNIFIED IDEOGRAPH
0xE6AF	0x8C48	#CJK UNIFIED IDEOGRAPH
0xE6B0	0x8C4C	#CJK UNIFIED IDEOGRAPH
0xE6B1	0x8C4E	#CJK UNIFIED IDEOGRAPH
0xE6B2	0x8C50	#CJK UNIFIED IDEOGRAPH
0xE6B3	0x8C55	#CJK UNIFIED IDEOGRAPH
0xE6B4	0x8C62	#CJK UNIFIED IDEOGRAPH
0xE6B5	0x8C6C	#CJK UNIFIED IDEOGRAPH
0xE6B6	0x8C78	#CJK UNIFIED IDEOGRAPH
0xE6B7	0x8C7A	#CJK UNIFIED IDEOGRAPH
0xE6B8	0x8C82	#CJK UNIFIED IDEOGRAPH
0xE6B9	0x8C89	#CJK UNIFIED IDEOGRAPH
0xE6BA	0x8C85	#CJK UNIFIED IDEOGRAPH
0xE6BB	0x8C8A	#CJK UNIFIED IDEOGRAPH
0xE6BC	0x8C8D	#CJK UNIFIED IDEOGRAPH
0xE6BD	0x8C8E	#CJK UNIFIED IDEOGRAPH
0xE6BE	0x8C94	#CJK UNIFIED IDEOGRAPH
0xE6BF	0x8C7C	#CJK UNIFIED IDEOGRAPH
0xE6C0	0x8C98	#CJK UNIFIED IDEOGRAPH
0xE6C1	0x621D	#CJK UNIFIED IDEOGRAPH
0xE6C2	0x8CAD	#CJK UNIFIED IDEOGRAPH
0xE6C3	0x8CAA	#CJK UNIFIED IDEOGRAPH
0xE6C4	0x8CBD	#CJK UNIFIED IDEOGRAPH
0xE6C5	0x8CB2	#CJK UNIFIED IDEOGRAPH
0xE6C6	0x8CB3	#CJK UNIFIED IDEOGRAPH
0xE6C7	0x8CAE	#CJK UNIFIED IDEOGRAPH
0xE6C8	0x8CB6	#CJK UNIFIED IDEOGRAPH
0xE6C9	0x8CC8	#CJK UNIFIED IDEOGRAPH
0xE6CA	0x8CC1	#CJK UNIFIED IDEOGRAPH
0xE6CB	0x8CE4	#CJK UNIFIED IDEOGRAPH
0xE6CC	0x8CE3	#CJK UNIFIED IDEOGRAPH
0xE6CD	0x8CDA	#CJK UNIFIED IDEOGRAPH
0xE6CE	0x8CFD	#CJK UNIFIED IDEOGRAPH
0xE6CF	0x8CFA	#CJK UNIFIED IDEOGRAPH
0xE6D0	0x8CFB	#CJK UNIFIED IDEOGRAPH
0xE6D1	0x8D04	#CJK UNIFIED IDEOGRAPH
0xE6D2	0x8D05	#CJK UNIFIED IDEOGRAPH
0xE6D3	0x8D0A	#CJK UNIFIED IDEOGRAPH
0xE6D4	0x8D07	#CJK UNIFIED IDEOGRAPH
0xE6D5	0x8D0F	#CJK UNIFIED IDEOGRAPH
0xE6D6	0x8D0D	#CJK UNIFIED IDEOGRAPH
0xE6D7	0x8D10	#CJK UNIFIED IDEOGRAPH
0xE6D8	0x9F4E	#CJK UNIFIED IDEOGRAPH
0xE6D9	0x8D13	#CJK UNIFIED IDEOGRAPH
0xE6DA	0x8CCD	#CJK UNIFIED IDEOGRAPH
0xE6DB	0x8D14	#CJK UNIFIED IDEOGRAPH
0xE6DC	0x8D16	#CJK UNIFIED IDEOGRAPH
0xE6DD	0x8D67	#CJK UNIFIED IDEOGRAPH
0xE6DE	0x8D6D	#CJK UNIFIED IDEOGRAPH
0xE6DF	0x8D71	#CJK UNIFIED IDEOGRAPH
0xE6E0	0x8D73	#CJK UNIFIED IDEOGRAPH
0xE6E1	0x8D81	#CJK UNIFIED IDEOGRAPH
0xE6E2	0x8D99	#CJK UNIFIED IDEOGRAPH
0xE6E3	0x8DC2	#CJK UNIFIED IDEOGRAPH
0xE6E4	0x8DBE	#CJK UNIFIED IDEOGRAPH
0xE6E5	0x8DBA	#CJK UNIFIED IDEOGRAPH
0xE6E6	0x8DCF	#CJK UNIFIED IDEOGRAPH
0xE6E7	0x8DDA	#CJK UNIFIED IDEOGRAPH
0xE6E8	0x8DD6	#CJK UNIFIED IDEOGRAPH
0xE6E9	0x8DCC	#CJK UNIFIED IDEOGRAPH
0xE6EA	0x8DDB	#CJK UNIFIED IDEOGRAPH
0xE6EB	0x8DCB	#CJK UNIFIED IDEOGRAPH
0xE6EC	0x8DEA	#CJK UNIFIED IDEOGRAPH
0xE6ED	0x8DEB	#CJK UNIFIED IDEOGRAPH
0xE6EE	0x8DDF	#CJK UNIFIED IDEOGRAPH
0xE6EF	0x8DE3	#CJK UNIFIED IDEOGRAPH
0xE6F0	0x8DFC	#CJK UNIFIED IDEOGRAPH
0xE6F1	0x8E08	#CJK UNIFIED IDEOGRAPH
0xE6F2	0x8E09	#CJK UNIFIED IDEOGRAPH
0xE6F3	0x8DFF	#CJK UNIFIED IDEOGRAPH
0xE6F4	0x8E1D	#CJK UNIFIED IDEOGRAPH
0xE6F5	0x8E1E	#CJK UNIFIED IDEOGRAPH
0xE6F6	0x8E10	#CJK UNIFIED IDEOGRAPH
0xE6F7	0x8E1F	#CJK UNIFIED IDEOGRAPH
0xE6F8	0x8E42	#CJK UNIFIED IDEOGRAPH
0xE6F9	0x8E35	#CJK UNIFIED IDEOGRAPH
0xE6FA	0x8E30	#CJK UNIFIED IDEOGRAPH
0xE6FB	0x8E34	#CJK UNIFIED IDEOGRAPH
0xE6FC	0x8E4A	#CJK UNIFIED IDEOGRAPH
0xE740	0x8E47	#CJK UNIFIED IDEOGRAPH
0xE741	0x8E49	#CJK UNIFIED IDEOGRAPH
0xE742	0x8E4C	#CJK UNIFIED IDEOGRAPH
0xE743	0x8E50	#CJK UNIFIED IDEOGRAPH
0xE744	0x8E48	#CJK UNIFIED IDEOGRAPH
0xE745	0x8E59	#CJK UNIFIED IDEOGRAPH
0xE746	0x8E64	#CJK UNIFIED IDEOGRAPH
0xE747	0x8E60	#CJK UNIFIED IDEOGRAPH
0xE748	0x8E2A	#CJK UNIFIED IDEOGRAPH
0xE749	0x8E63	#CJK UNIFIED IDEOGRAPH
0xE74A	0x8E55	#CJK UNIFIED IDEOGRAPH
0xE74B	0x8E76	#CJK UNIFIED IDEOGRAPH
0xE74C	0x8E72	#CJK UNIFIED IDEOGRAPH
0xE74D	0x8E7C	#CJK UNIFIED IDEOGRAPH
0xE74E	0x8E81	#CJK UNIFIED IDEOGRAPH
0xE74F	0x8E87	#CJK UNIFIED IDEOGRAPH
0xE750	0x8E85	#CJK UNIFIED IDEOGRAPH
0xE751	0x8E84	#CJK UNIFIED IDEOGRAPH
0xE752	0x8E8B	#CJK UNIFIED IDEOGRAPH
0xE753	0x8E8A	#CJK UNIFIED IDEOGRAPH
0xE754	0x8E93	#CJK UNIFIED IDEOGRAPH
0xE755	0x8E91	#CJK UNIFIED IDEOGRAPH
0xE756	0x8E94	#CJK UNIFIED IDEOGRAPH
0xE757	0x8E99	#CJK UNIFIED IDEOGRAPH
0xE758	0x8EAA	#CJK UNIFIED IDEOGRAPH
0xE759	0x8EA1	#CJK UNIFIED IDEOGRAPH
0xE75A	0x8EAC	#CJK UNIFIED IDEOGRAPH
0xE75B	0x8EB0	#CJK UNIFIED IDEOGRAPH
0xE75C	0x8EC6	#CJK UNIFIED IDEOGRAPH
0xE75D	0x8EB1	#CJK UNIFIED IDEOGRAPH
0xE75E	0x8EBE	#CJK UNIFIED IDEOGRAPH
0xE75F	0x8EC5	#CJK UNIFIED IDEOGRAPH
0xE760	0x8EC8	#CJK UNIFIED IDEOGRAPH
0xE761	0x8ECB	#CJK UNIFIED IDEOGRAPH
0xE762	0x8EDB	#CJK UNIFIED IDEOGRAPH
0xE763	0x8EE3	#CJK UNIFIED IDEOGRAPH
0xE764	0x8EFC	#CJK UNIFIED IDEOGRAPH
0xE765	0x8EFB	#CJK UNIFIED IDEOGRAPH
0xE766	0x8EEB	#CJK UNIFIED IDEOGRAPH
0xE767	0x8EFE	#CJK UNIFIED IDEOGRAPH
0xE768	0x8F0A	#CJK UNIFIED IDEOGRAPH
0xE769	0x8F05	#CJK UNIFIED IDEOGRAPH
0xE76A	0x8F15	#CJK UNIFIED IDEOGRAPH
0xE76B	0x8F12	#CJK UNIFIED IDEOGRAPH
0xE76C	0x8F19	#CJK UNIFIED IDEOGRAPH
0xE76D	0x8F13	#CJK UNIFIED IDEOGRAPH
0xE76E	0x8F1C	#CJK UNIFIED IDEOGRAPH
0xE76F	0x8F1F	#CJK UNIFIED IDEOGRAPH
0xE770	0x8F1B	#CJK UNIFIED IDEOGRAPH
0xE771	0x8F0C	#CJK UNIFIED IDEOGRAPH
0xE772	0x8F26	#CJK UNIFIED IDEOGRAPH
0xE773	0x8F33	#CJK UNIFIED IDEOGRAPH
0xE774	0x8F3B	#CJK UNIFIED IDEOGRAPH
0xE775	0x8F39	#CJK UNIFIED IDEOGRAPH
0xE776	0x8F45	#CJK UNIFIED IDEOGRAPH
0xE777	0x8F42	#CJK UNIFIED IDEOGRAPH
0xE778	0x8F3E	#CJK UNIFIED IDEOGRAPH
0xE779	0x8F4C	#CJK UNIFIED IDEOGRAPH
0xE77A	0x8F49	#CJK UNIFIED IDEOGRAPH
0xE77B	0x8F46	#CJK UNIFIED IDEOGRAPH
0xE77C	0x8F4E	#CJK UNIFIED IDEOGRAPH
0xE77D	0x8F57	#CJK UNIFIED IDEOGRAPH
0xE77E	0x8F5C	#CJK UNIFIED IDEOGRAPH
0xE780	0x8F62	#CJK UNIFIED IDEOGRAPH
0xE781	0x8F63	#CJK UNIFIED IDEOGRAPH
0xE782	0x8F64	#CJK UNIFIED IDEOGRAPH
0xE783	0x8F9C	#CJK UNIFIED IDEOGRAPH
0xE784	0x8F9F	#CJK UNIFIED IDEOGRAPH
0xE785	0x8FA3	#CJK UNIFIED IDEOGRAPH
0xE786	0x8FAD	#CJK UNIFIED IDEOGRAPH
0xE787	0x8FAF	#CJK UNIFIED IDEOGRAPH
0xE788	0x8FB7	#CJK UNIFIED IDEOGRAPH
0xE789	0x8FDA	#CJK UNIFIED IDEOGRAPH
0xE78A	0x8FE5	#CJK UNIFIED IDEOGRAPH
0xE78B	0x8FE2	#CJK UNIFIED IDEOGRAPH
0xE78C	0x8FEA	#CJK UNIFIED IDEOGRAPH
0xE78D	0x8FEF	#CJK UNIFIED IDEOGRAPH
0xE78E	0x9087	#CJK UNIFIED IDEOGRAPH
0xE78F	0x8FF4	#CJK UNIFIED IDEOGRAPH
0xE790	0x9005	#CJK UNIFIED IDEOGRAPH
0xE791	0x8FF9	#CJK UNIFIED IDEOGRAPH
0xE792	0x8FFA	#CJK UNIFIED IDEOGRAPH
0xE793	0x9011	#CJK UNIFIED IDEOGRAPH
0xE794	0x9015	#CJK UNIFIED IDEOGRAPH
0xE795	0x9021	#CJK UNIFIED IDEOGRAPH
0xE796	0x900D	#CJK UNIFIED IDEOGRAPH
0xE797	0x901E	#CJK UNIFIED IDEOGRAPH
0xE798	0x9016	#CJK UNIFIED IDEOGRAPH
0xE799	0x900B	#CJK UNIFIED IDEOGRAPH
0xE79A	0x9027	#CJK UNIFIED IDEOGRAPH
0xE79B	0x9036	#CJK UNIFIED IDEOGRAPH
0xE79C	0x9035	#CJK UNIFIED IDEOGRAPH
0xE79D	0x9039	#CJK UNIFIED IDEOGRAPH
0xE79E	0x8FF8	#CJK UNIFIED IDEOGRAPH
0xE79F	0x904F	#CJK UNIFIED IDEOGRAPH
0xE7A0	0x9050	#CJK UNIFIED IDEOGRAPH
0xE7A1	0x9051	#CJK UNIFIED IDEOGRAPH
0xE7A2	0x9052	#CJK UNIFIED IDEOGRAPH
0xE7A3	0x900E	#CJK UNIFIED IDEOGRAPH
0xE7A4	0x9049	#CJK UNIFIED IDEOGRAPH
0xE7A5	0x903E	#CJK UNIFIED IDEOGRAPH
0xE7A6	0x9056	#CJK UNIFIED IDEOGRAPH
0xE7A7	0x9058	#CJK UNIFIED IDEOGRAPH
0xE7A8	0x905E	#CJK UNIFIED IDEOGRAPH
0xE7A9	0x9068	#CJK UNIFIED IDEOGRAPH
0xE7AA	0x906F	#CJK UNIFIED IDEOGRAPH
0xE7AB	0x9076	#CJK UNIFIED IDEOGRAPH
0xE7AC	0x96A8	#CJK UNIFIED IDEOGRAPH
0xE7AD	0x9072	#CJK UNIFIED IDEOGRAPH
0xE7AE	0x9082	#CJK UNIFIED IDEOGRAPH
0xE7AF	0x907D	#CJK UNIFIED IDEOGRAPH
0xE7B0	0x9081	#CJK UNIFIED IDEOGRAPH
0xE7B1	0x9080	#CJK UNIFIED IDEOGRAPH
0xE7B2	0x908A	#CJK UNIFIED IDEOGRAPH
0xE7B3	0x9089	#CJK UNIFIED IDEOGRAPH
0xE7B4	0x908F	#CJK UNIFIED IDEOGRAPH
0xE7B5	0x90A8	#CJK UNIFIED IDEOGRAPH
0xE7B6	0x90AF	#CJK UNIFIED IDEOGRAPH
0xE7B7	0x90B1	#CJK UNIFIED IDEOGRAPH
0xE7B8	0x90B5	#CJK UNIFIED IDEOGRAPH
0xE7B9	0x90E2	#CJK UNIFIED IDEOGRAPH
0xE7BA	0x90E4	#CJK UNIFIED IDEOGRAPH
0xE7BB	0x6248	#CJK UNIFIED IDEOGRAPH
0xE7BC	0x90DB	#CJK UNIFIED IDEOGRAPH
0xE7BD	0x9102	#CJK UNIFIED IDEOGRAPH
0xE7BE	0x9112	#CJK UNIFIED IDEOGRAPH
0xE7BF	0x9119	#CJK UNIFIED IDEOGRAPH
0xE7C0	0x9132	#CJK UNIFIED IDEOGRAPH
0xE7C1	0x9130	#CJK UNIFIED IDEOGRAPH
0xE7C2	0x914A	#CJK UNIFIED IDEOGRAPH
0xE7C3	0x9156	#CJK UNIFIED IDEOGRAPH
0xE7C4	0x9158	#CJK UNIFIED IDEOGRAPH
0xE7C5	0x9163	#CJK UNIFIED IDEOGRAPH
0xE7C6	0x9165	#CJK UNIFIED IDEOGRAPH
0xE7C7	0x9169	#CJK UNIFIED IDEOGRAPH
0xE7C8	0x9173	#CJK UNIFIED IDEOGRAPH
0xE7C9	0x9172	#CJK UNIFIED IDEOGRAPH
0xE7CA	0x918B	#CJK UNIFIED IDEOGRAPH
0xE7CB	0x9189	#CJK UNIFIED IDEOGRAPH
0xE7CC	0x9182	#CJK UNIFIED IDEOGRAPH
0xE7CD	0x91A2	#CJK UNIFIED IDEOGRAPH
0xE7CE	0x91AB	#CJK UNIFIED IDEOGRAPH
0xE7CF	0x91AF	#CJK UNIFIED IDEOGRAPH
0xE7D0	0x91AA	#CJK UNIFIED IDEOGRAPH
0xE7D1	0x91B5	#CJK UNIFIED IDEOGRAPH
0xE7D2	0x91B4	#CJK UNIFIED IDEOGRAPH
0xE7D3	0x91BA	#CJK UNIFIED IDEOGRAPH
0xE7D4	0x91C0	#CJK UNIFIED IDEOGRAPH
0xE7D5	0x91C1	#CJK UNIFIED IDEOGRAPH
0xE7D6	0x91C9	#CJK UNIFIED IDEOGRAPH
0xE7D7	0x91CB	#CJK UNIFIED IDEOGRAPH
0xE7D8	0x91D0	#CJK UNIFIED IDEOGRAPH
0xE7D9	0x91D6	#CJK UNIFIED IDEOGRAPH
0xE7DA	0x91DF	#CJK UNIFIED IDEOGRAPH
0xE7DB	0x91E1	#CJK UNIFIED IDEOGRAPH
0xE7DC	0x91DB	#CJK UNIFIED IDEOGRAPH
0xE7DD	0x91FC	#CJK UNIFIED IDEOGRAPH
0xE7DE	0x91F5	#CJK UNIFIED IDEOGRAPH
0xE7DF	0x91F6	#CJK UNIFIED IDEOGRAPH
0xE7E0	0x921E	#CJK UNIFIED IDEOGRAPH
0xE7E1	0x91FF	#CJK UNIFIED IDEOGRAPH
0xE7E2	0x9214	#CJK UNIFIED IDEOGRAPH
0xE7E3	0x922C	#CJK UNIFIED IDEOGRAPH
0xE7E4	0x9215	#CJK UNIFIED IDEOGRAPH
0xE7E5	0x9211	#CJK UNIFIED IDEOGRAPH
0xE7E6	0x925E	#CJK UNIFIED IDEOGRAPH
0xE7E7	0x9257	#CJK UNIFIED IDEOGRAPH
0xE7E8	0x9245	#CJK UNIFIED IDEOGRAPH
0xE7E9	0x9249	#CJK UNIFIED IDEOGRAPH
0xE7EA	0x9264	#CJK UNIFIED IDEOGRAPH
0xE7EB	0x9248	#CJK UNIFIED IDEOGRAPH
0xE7EC	0x9295	#CJK UNIFIED IDEOGRAPH
0xE7ED	0x923F	#CJK UNIFIED IDEOGRAPH
0xE7EE	0x924B	#CJK UNIFIED IDEOGRAPH
0xE7EF	0x9250	#CJK UNIFIED IDEOGRAPH
0xE7F0	0x929C	#CJK UNIFIED IDEOGRAPH
0xE7F1	0x9296	#CJK UNIFIED IDEOGRAPH
0xE7F2	0x9293	#CJK UNIFIED IDEOGRAPH
0xE7F3	0x929B	#CJK UNIFIED IDEOGRAPH
0xE7F4	0x925A	#CJK UNIFIED IDEOGRAPH
0xE7F5	0x92CF	#CJK UNIFIED IDEOGRAPH
0xE7F6	0x92B9	#CJK UNIFIED IDEOGRAPH
0xE7F7	0x92B7	#CJK UNIFIED IDEOGRAPH
0xE7F8	0x92E9	#CJK UNIFIED IDEOGRAPH
0xE7F9	0x930F	#CJK UNIFIED IDEOGRAPH
0xE7FA	0x92FA	#CJK UNIFIED IDEOGRAPH
0xE7FB	0x9344	#CJK UNIFIED IDEOGRAPH
0xE7FC	0x932E	#CJK UNIFIED IDEOGRAPH
0xE840	0x9319	#CJK UNIFIED IDEOGRAPH
0xE841	0x9322	#CJK UNIFIED IDEOGRAPH
0xE842	0x931A	#CJK UNIFIED IDEOGRAPH
0xE843	0x9323	#CJK UNIFIED IDEOGRAPH
0xE844	0x933A	#CJK UNIFIED IDEOGRAPH
0xE845	0x9335	#CJK UNIFIED IDEOGRAPH
0xE846	0x933B	#CJK UNIFIED IDEOGRAPH
0xE847	0x935C	#CJK UNIFIED IDEOGRAPH
0xE848	0x9360	#CJK UNIFIED IDEOGRAPH
0xE849	0x937C	#CJK UNIFIED IDEOGRAPH
0xE84A	0x936E	#CJK UNIFIED IDEOGRAPH
0xE84B	0x9356	#CJK UNIFIED IDEOGRAPH
0xE84C	0x93B0	#CJK UNIFIED IDEOGRAPH
0xE84D	0x93AC	#CJK UNIFIED IDEOGRAPH
0xE84E	0x93AD	#CJK UNIFIED IDEOGRAPH
0xE84F	0x9394	#CJK UNIFIED IDEOGRAPH
0xE850	0x93B9	#CJK UNIFIED IDEOGRAPH
0xE851	0x93D6	#CJK UNIFIED IDEOGRAPH
0xE852	0x93D7	#CJK UNIFIED IDEOGRAPH
0xE853	0x93E8	#CJK UNIFIED IDEOGRAPH
0xE854	0x93E5	#CJK UNIFIED IDEOGRAPH
0xE855	0x93D8	#CJK UNIFIED IDEOGRAPH
0xE856	0x93C3	#CJK UNIFIED IDEOGRAPH
0xE857	0x93DD	#CJK UNIFIED IDEOGRAPH
0xE858	0x93D0	#CJK UNIFIED IDEOGRAPH
0xE859	0x93C8	#CJK UNIFIED IDEOGRAPH
0xE85A	0x93E4	#CJK UNIFIED IDEOGRAPH
0xE85B	0x941A	#CJK UNIFIED IDEOGRAPH
0xE85C	0x9414	#CJK UNIFIED IDEOGRAPH
0xE85D	0x9413	#CJK UNIFIED IDEOGRAPH
0xE85E	0x9403	#CJK UNIFIED IDEOGRAPH
0xE85F	0x9407	#CJK UNIFIED IDEOGRAPH
0xE860	0x9410	#CJK UNIFIED IDEOGRAPH
0xE861	0x9436	#CJK UNIFIED IDEOGRAPH
0xE862	0x942B	#CJK UNIFIED IDEOGRAPH
0xE863	0x9435	#CJK UNIFIED IDEOGRAPH
0xE864	0x9421	#CJK UNIFIED IDEOGRAPH
0xE865	0x943A	#CJK UNIFIED IDEOGRAPH
0xE866	0x9441	#CJK UNIFIED IDEOGRAPH
0xE867	0x9452	#CJK UNIFIED IDEOGRAPH
0xE868	0x9444	#CJK UNIFIED IDEOGRAPH
0xE869	0x945B	#CJK UNIFIED IDEOGRAPH
0xE86A	0x9460	#CJK UNIFIED IDEOGRAPH
0xE86B	0x9462	#CJK UNIFIED IDEOGRAPH
0xE86C	0x945E	#CJK UNIFIED IDEOGRAPH
0xE86D	0x946A	#CJK UNIFIED IDEOGRAPH
0xE86E	0x9229	#CJK UNIFIED IDEOGRAPH
0xE86F	0x9470	#CJK UNIFIED IDEOGRAPH
0xE870	0x9475	#CJK UNIFIED IDEOGRAPH
0xE871	0x9477	#CJK UNIFIED IDEOGRAPH
0xE872	0x947D	#CJK UNIFIED IDEOGRAPH
0xE873	0x945A	#CJK UNIFIED IDEOGRAPH
0xE874	0x947C	#CJK UNIFIED IDEOGRAPH
0xE875	0x947E	#CJK UNIFIED IDEOGRAPH
0xE876	0x9481	#CJK UNIFIED IDEOGRAPH
0xE877	0x947F	#CJK UNIFIED IDEOGRAPH
0xE878	0x9582	#CJK UNIFIED IDEOGRAPH
0xE879	0x9587	#CJK UNIFIED IDEOGRAPH
0xE87A	0x958A	#CJK UNIFIED IDEOGRAPH
0xE87B	0x9594	#CJK UNIFIED IDEOGRAPH
0xE87C	0x9596	#CJK UNIFIED IDEOGRAPH
0xE87D	0x9598	#CJK UNIFIED IDEOGRAPH
0xE87E	0x9599	#CJK UNIFIED IDEOGRAPH
0xE880	0x95A0	#CJK UNIFIED IDEOGRAPH
0xE881	0x95A8	#CJK UNIFIED IDEOGRAPH
0xE882	0x95A7	#CJK UNIFIED IDEOGRAPH
0xE883	0x95AD	#CJK UNIFIED IDEOGRAPH
0xE884	0x95BC	#CJK UNIFIED IDEOGRAPH
0xE885	0x95BB	#CJK UNIFIED IDEOGRAPH
0xE886	0x95B9	#CJK UNIFIED IDEOGRAPH
0xE887	0x95BE	#CJK UNIFIED IDEOGRAPH
0xE888	0x95CA	#CJK UNIFIED IDEOGRAPH
0xE889	0x6FF6	#CJK UNIFIED IDEOGRAPH
0xE88A	0x95C3	#CJK UNIFIED IDEOGRAPH
0xE88B	0x95CD	#CJK UNIFIED IDEOGRAPH
0xE88C	0x95CC	#CJK UNIFIED IDEOGRAPH
0xE88D	0x95D5	#CJK UNIFIED IDEOGRAPH
0xE88E	0x95D4	#CJK UNIFIED IDEOGRAPH
0xE88F	0x95D6	#CJK UNIFIED IDEOGRAPH
0xE890	0x95DC	#CJK UNIFIED IDEOGRAPH
0xE891	0x95E1	#CJK UNIFIED IDEOGRAPH
0xE892	0x95E5	#CJK UNIFIED IDEOGRAPH
0xE893	0x95E2	#CJK UNIFIED IDEOGRAPH
0xE894	0x9621	#CJK UNIFIED IDEOGRAPH
0xE895	0x9628	#CJK UNIFIED IDEOGRAPH
0xE896	0x962E	#CJK UNIFIED IDEOGRAPH
0xE897	0x962F	#CJK UNIFIED IDEOGRAPH
0xE898	0x9642	#CJK UNIFIED IDEOGRAPH
0xE899	0x964C	#CJK UNIFIED IDEOGRAPH
0xE89A	0x964F	#CJK UNIFIED IDEOGRAPH
0xE89B	0x964B	#CJK UNIFIED IDEOGRAPH
0xE89C	0x9677	#CJK UNIFIED IDEOGRAPH
0xE89D	0x965C	#CJK UNIFIED IDEOGRAPH
0xE89E	0x965E	#CJK UNIFIED IDEOGRAPH
0xE89F	0x965D	#CJK UNIFIED IDEOGRAPH
0xE8A0	0x965F	#CJK UNIFIED IDEOGRAPH
0xE8A1	0x9666	#CJK UNIFIED IDEOGRAPH
0xE8A2	0x9672	#CJK UNIFIED IDEOGRAPH
0xE8A3	0x966C	#CJK UNIFIED IDEOGRAPH
0xE8A4	0x968D	#CJK UNIFIED IDEOGRAPH
0xE8A5	0x9698	#CJK UNIFIED IDEOGRAPH
0xE8A6	0x9695	#CJK UNIFIED IDEOGRAPH
0xE8A7	0x9697	#CJK UNIFIED IDEOGRAPH
0xE8A8	0x96AA	#CJK UNIFIED IDEOGRAPH
0xE8A9	0x96A7	#CJK UNIFIED IDEOGRAPH
0xE8AA	0x96B1	#CJK UNIFIED IDEOGRAPH
0xE8AB	0x96B2	#CJK UNIFIED IDEOGRAPH
0xE8AC	0x96B0	#CJK UNIFIED IDEOGRAPH
0xE8AD	0x96B4	#CJK UNIFIED IDEOGRAPH
0xE8AE	0x96B6	#CJK UNIFIED IDEOGRAPH
0xE8AF	0x96B8	#CJK UNIFIED IDEOGRAPH
0xE8B0	0x96B9	#CJK UNIFIED IDEOGRAPH
0xE8B1	0x96CE	#CJK UNIFIED IDEOGRAPH
0xE8B2	0x96CB	#CJK UNIFIED IDEOGRAPH
0xE8B3	0x96C9	#CJK UNIFIED IDEOGRAPH
0xE8B4	0x96CD	#CJK UNIFIED IDEOGRAPH
0xE8B5	0x894D	#CJK UNIFIED IDEOGRAPH
0xE8B6	0x96DC	#CJK UNIFIED IDEOGRAPH
0xE8B7	0x970D	#CJK UNIFIED IDEOGRAPH
0xE8B8	0x96D5	#CJK UNIFIED IDEOGRAPH
0xE8B9	0x96F9	#CJK UNIFIED IDEOGRAPH
0xE8BA	0x9704	#CJK UNIFIED IDEOGRAPH
0xE8BB	0x9706	#CJK UNIFIED IDEOGRAPH
0xE8BC	0x9708	#CJK UNIFIED IDEOGRAPH
0xE8BD	0x9713	#CJK UNIFIED IDEOGRAPH
0xE8BE	0x970E	#CJK UNIFIED IDEOGRAPH
0xE8BF	0x9711	#CJK UNIFIED IDEOGRAPH
0xE8C0	0x970F	#CJK UNIFIED IDEOGRAPH
0xE8C1	0x9716	#CJK UNIFIED IDEOGRAPH
0xE8C2	0x9719	#CJK UNIFIED IDEOGRAPH
0xE8C3	0x9724	#CJK UNIFIED IDEOGRAPH
0xE8C4	0x972A	#CJK UNIFIED IDEOGRAPH
0xE8C5	0x9730	#CJK UNIFIED IDEOGRAPH
0xE8C6	0x9739	#CJK UNIFIED IDEOGRAPH
0xE8C7	0x973D	#CJK UNIFIED IDEOGRAPH
0xE8C8	0x973E	#CJK UNIFIED IDEOGRAPH
0xE8C9	0x9744	#CJK UNIFIED IDEOGRAPH
0xE8CA	0x9746	#CJK UNIFIED IDEOGRAPH
0xE8CB	0x9748	#CJK UNIFIED IDEOGRAPH
0xE8CC	0x9742	#CJK UNIFIED IDEOGRAPH
0xE8CD	0x9749	#CJK UNIFIED IDEOGRAPH
0xE8CE	0x975C	#CJK UNIFIED IDEOGRAPH
0xE8CF	0x9760	#CJK UNIFIED IDEOGRAPH
0xE8D0	0x9764	#CJK UNIFIED IDEOGRAPH
0xE8D1	0x9766	#CJK UNIFIED IDEOGRAPH
0xE8D2	0x9768	#CJK UNIFIED IDEOGRAPH
0xE8D3	0x52D2	#CJK UNIFIED IDEOGRAPH
0xE8D4	0x976B	#CJK UNIFIED IDEOGRAPH
0xE8D5	0x9771	#CJK UNIFIED IDEOGRAPH
0xE8D6	0x9779	#CJK UNIFIED IDEOGRAPH
0xE8D7	0x9785	#CJK UNIFIED IDEOGRAPH
0xE8D8	0x977C	#CJK UNIFIED IDEOGRAPH
0xE8D9	0x9781	#CJK UNIFIED IDEOGRAPH
0xE8DA	0x977A	#CJK UNIFIED IDEOGRAPH
0xE8DB	0x9786	#CJK UNIFIED IDEOGRAPH
0xE8DC	0x978B	#CJK UNIFIED IDEOGRAPH
0xE8DD	0x978F	#CJK UNIFIED IDEOGRAPH
0xE8DE	0x9790	#CJK UNIFIED IDEOGRAPH
0xE8DF	0x979C	#CJK UNIFIED IDEOGRAPH
0xE8E0	0x97A8	#CJK UNIFIED IDEOGRAPH
0xE8E1	0x97A6	#CJK UNIFIED IDEOGRAPH
0xE8E2	0x97A3	#CJK UNIFIED IDEOGRAPH
0xE8E3	0x97B3	#CJK UNIFIED IDEOGRAPH
0xE8E4	0x97B4	#CJK UNIFIED IDEOGRAPH
0xE8E5	0x97C3	#CJK UNIFIED IDEOGRAPH
0xE8E6	0x97C6	#CJK UNIFIED IDEOGRAPH
0xE8E7	0x97C8	#CJK UNIFIED IDEOGRAPH
0xE8E8	0x97CB	#CJK UNIFIED IDEOGRAPH
0xE8E9	0x97DC	#CJK UNIFIED IDEOGRAPH
0xE8EA	0x97ED	#CJK UNIFIED IDEOGRAPH
0xE8EB	0x9F4F	#CJK UNIFIED IDEOGRAPH
0xE8EC	0x97F2	#CJK UNIFIED IDEOGRAPH
0xE8ED	0x7ADF	#CJK UNIFIED IDEOGRAPH
0xE8EE	0x97F6	#CJK UNIFIED IDEOGRAPH
0xE8EF	0x97F5	#CJK UNIFIED IDEOGRAPH
0xE8F0	0x980F	#CJK UNIFIED IDEOGRAPH
0xE8F1	0x980C	#CJK UNIFIED IDEOGRAPH
0xE8F2	0x9838	#CJK UNIFIED IDEOGRAPH
0xE8F3	0x9824	#CJK UNIFIED IDEOGRAPH
0xE8F4	0x9821	#CJK UNIFIED IDEOGRAPH
0xE8F5	0x9837	#CJK UNIFIED IDEOGRAPH
0xE8F6	0x983D	#CJK UNIFIED IDEOGRAPH
0xE8F7	0x9846	#CJK UNIFIED IDEOGRAPH
0xE8F8	0x984F	#CJK UNIFIED IDEOGRAPH
0xE8F9	0x984B	#CJK UNIFIED IDEOGRAPH
0xE8FA	0x986B	#CJK UNIFIED IDEOGRAPH
0xE8FB	0x986F	#CJK UNIFIED IDEOGRAPH
0xE8FC	0x9870	#CJK UNIFIED IDEOGRAPH
0xE940	0x9871	#CJK UNIFIED IDEOGRAPH
0xE941	0x9874	#CJK UNIFIED IDEOGRAPH
0xE942	0x9873	#CJK UNIFIED IDEOGRAPH
0xE943	0x98AA	#CJK UNIFIED IDEOGRAPH
0xE944	0x98AF	#CJK UNIFIED IDEOGRAPH
0xE945	0x98B1	#CJK UNIFIED IDEOGRAPH
0xE946	0x98B6	#CJK UNIFIED IDEOGRAPH
0xE947	0x98C4	#CJK UNIFIED IDEOGRAPH
0xE948	0x98C3	#CJK UNIFIED IDEOGRAPH
0xE949	0x98C6	#CJK UNIFIED IDEOGRAPH
0xE94A	0x98E9	#CJK UNIFIED IDEOGRAPH
0xE94B	0x98EB	#CJK UNIFIED IDEOGRAPH
0xE94C	0x9903	#CJK UNIFIED IDEOGRAPH
0xE94D	0x9909	#CJK UNIFIED IDEOGRAPH
0xE94E	0x9912	#CJK UNIFIED IDEOGRAPH
0xE94F	0x9914	#CJK UNIFIED IDEOGRAPH
0xE950	0x9918	#CJK UNIFIED IDEOGRAPH
0xE951	0x9921	#CJK UNIFIED IDEOGRAPH
0xE952	0x991D	#CJK UNIFIED IDEOGRAPH
0xE953	0x991E	#CJK UNIFIED IDEOGRAPH
0xE954	0x9924	#CJK UNIFIED IDEOGRAPH
0xE955	0x9920	#CJK UNIFIED IDEOGRAPH
0xE956	0x992C	#CJK UNIFIED IDEOGRAPH
0xE957	0x992E	#CJK UNIFIED IDEOGRAPH
0xE958	0x993D	#CJK UNIFIED IDEOGRAPH
0xE959	0x993E	#CJK UNIFIED IDEOGRAPH
0xE95A	0x9942	#CJK UNIFIED IDEOGRAPH
0xE95B	0x9949	#CJK UNIFIED IDEOGRAPH
0xE95C	0x9945	#CJK UNIFIED IDEOGRAPH
0xE95D	0x9950	#CJK UNIFIED IDEOGRAPH
0xE95E	0x994B	#CJK UNIFIED IDEOGRAPH
0xE95F	0x9951	#CJK UNIFIED IDEOGRAPH
0xE960	0x9952	#CJK UNIFIED IDEOGRAPH
0xE961	0x994C	#CJK UNIFIED IDEOGRAPH
0xE962	0x9955	#CJK UNIFIED IDEOGRAPH
0xE963	0x9997	#CJK UNIFIED IDEOGRAPH
0xE964	0x9998	#CJK UNIFIED IDEOGRAPH
0xE965	0x99A5	#CJK UNIFIED IDEOGRAPH
0xE966	0x99AD	#CJK UNIFIED IDEOGRAPH
0xE967	0x99AE	#CJK UNIFIED IDEOGRAPH
0xE968	0x99BC	#CJK UNIFIED IDEOGRAPH
0xE969	0x99DF	#CJK UNIFIED IDEOGRAPH
0xE96A	0x99DB	#CJK UNIFIED IDEOGRAPH
0xE96B	0x99DD	#CJK UNIFIED IDEOGRAPH
0xE96C	0x99D8	#CJK UNIFIED IDEOGRAPH
0xE96D	0x99D1	#CJK UNIFIED IDEOGRAPH
0xE96E	0x99ED	#CJK UNIFIED IDEOGRAPH
0xE96F	0x99EE	#CJK UNIFIED IDEOGRAPH
0xE970	0x99F1	#CJK UNIFIED IDEOGRAPH
0xE971	0x99F2	#CJK UNIFIED IDEOGRAPH
0xE972	0x99FB	#CJK UNIFIED IDEOGRAPH
0xE973	0x99F8	#CJK UNIFIED IDEOGRAPH
0xE974	0x9A01	#CJK UNIFIED IDEOGRAPH
0xE975	0x9A0F	#CJK UNIFIED IDEOGRAPH
0xE976	0x9A05	#CJK UNIFIED IDEOGRAPH
0xE977	0x99E2	#CJK UNIFIED IDEOGRAPH
0xE978	0x9A19	#CJK UNIFIED IDEOGRAPH
0xE979	0x9A2B	#CJK UNIFIED IDEOGRAPH
0xE97A	0x9A37	#CJK UNIFIED IDEOGRAPH
0xE97B	0x9A45	#CJK UNIFIED IDEOGRAPH
0xE97C	0x9A42	#CJK UNIFIED IDEOGRAPH
0xE97D	0x9A40	#CJK UNIFIED IDEOGRAPH
0xE97E	0x9A43	#CJK UNIFIED IDEOGRAPH
0xE980	0x9A3E	#CJK UNIFIED IDEOGRAPH
0xE981	0x9A55	#CJK UNIFIED IDEOGRAPH
0xE982	0x9A4D	#CJK UNIFIED IDEOGRAPH
0xE983	0x9A5B	#CJK UNIFIED IDEOGRAPH
0xE984	0x9A57	#CJK UNIFIED IDEOGRAPH
0xE985	0x9A5F	#CJK UNIFIED IDEOGRAPH
0xE986	0x9A62	#CJK UNIFIED IDEOGRAPH
0xE987	0x9A65	#CJK UNIFIED IDEOGRAPH
0xE988	0x9A64	#CJK UNIFIED IDEOGRAPH
0xE989	0x9A69	#CJK UNIFIED IDEOGRAPH
0xE98A	0x9A6B	#CJK UNIFIED IDEOGRAPH
0xE98B	0x9A6A	#CJK UNIFIED IDEOGRAPH
0xE98C	0x9AAD	#CJK UNIFIED IDEOGRAPH
0xE98D	0x9AB0	#CJK UNIFIED IDEOGRAPH
0xE98E	0x9ABC	#CJK UNIFIED IDEOGRAPH
0xE98F	0x9AC0	#CJK UNIFIED IDEOGRAPH
0xE990	0x9ACF	#CJK UNIFIED IDEOGRAPH
0xE991	0x9AD1	#CJK UNIFIED IDEOGRAPH
0xE992	0x9AD3	#CJK UNIFIED IDEOGRAPH
0xE993	0x9AD4	#CJK UNIFIED IDEOGRAPH
0xE994	0x9ADE	#CJK UNIFIED IDEOGRAPH
0xE995	0x9ADF	#CJK UNIFIED IDEOGRAPH
0xE996	0x9AE2	#CJK UNIFIED IDEOGRAPH
0xE997	0x9AE3	#CJK UNIFIED IDEOGRAPH
0xE998	0x9AE6	#CJK UNIFIED IDEOGRAPH
0xE999	0x9AEF	#CJK UNIFIED IDEOGRAPH
0xE99A	0x9AEB	#CJK UNIFIED IDEOGRAPH
0xE99B	0x9AEE	#CJK UNIFIED IDEOGRAPH
0xE99C	0x9AF4	#CJK UNIFIED IDEOGRAPH
0xE99D	0x9AF1	#CJK UNIFIED IDEOGRAPH
0xE99E	0x9AF7	#CJK UNIFIED IDEOGRAPH
0xE99F	0x9AFB	#CJK UNIFIED IDEOGRAPH
0xE9A0	0x9B06	#CJK UNIFIED IDEOGRAPH
0xE9A1	0x9B18	#CJK UNIFIED IDEOGRAPH
0xE9A2	0x9B1A	#CJK UNIFIED IDEOGRAPH
0xE9A3	0x9B1F	#CJK UNIFIED IDEOGRAPH
0xE9A4	0x9B22	#CJK UNIFIED IDEOGRAPH
0xE9A5	0x9B23	#CJK UNIFIED IDEOGRAPH
0xE9A6	0x9B25	#CJK UNIFIED IDEOGRAPH
0xE9A7	0x9B27	#CJK UNIFIED IDEOGRAPH
0xE9A8	0x9B28	#CJK UNIFIED IDEOGRAPH
0xE9A9	0x9B29	#CJK UNIFIED IDEOGRAPH
0xE9AA	0x9B2A	#CJK UNIFIED IDEOGRAPH
0xE9AB	0x9B2E	#CJK UNIFIED IDEOGRAPH
0xE9AC	0x9B2F	#CJK UNIFIED IDEOGRAPH
0xE9AD	0x9B32	#CJK UNIFIED IDEOGRAPH
0xE9AE	0x9B44	#CJK UNIFIED IDEOGRAPH
0xE9AF	0x9B43	#CJK UNIFIED IDEOGRAPH
0xE9B0	0x9B4F	#CJK UNIFIED IDEOGRAPH
0xE9B1	0x9B4D	#CJK UNIFIED IDEOGRAPH
0xE9B2	0x9B4E	#CJK UNIFIED IDEOGRAPH
0xE9B3	0x9B51	#CJK UNIFIED IDEOGRAPH
0xE9B4	0x9B58	#CJK UNIFIED IDEOGRAPH
0xE9B5	0x9B74	#CJK UNIFIED IDEOGRAPH
0xE9B6	0x9B93	#CJK UNIFIED IDEOGRAPH
0xE9B7	0x9B83	#CJK UNIFIED IDEOGRAPH
0xE9B8	0x9B91	#CJK UNIFIED IDEOGRAPH
0xE9B9	0x9B96	#CJK UNIFIED IDEOGRAPH
0xE9BA	0x9B97	#CJK UNIFIED IDEOGRAPH
0xE9BB	0x9B9F	#CJK UNIFIED IDEOGRAPH
0xE9BC	0x9BA0	#CJK UNIFIED IDEOGRAPH
0xE9BD	0x9BA8	#CJK UNIFIED IDEOGRAPH
0xE9BE	0x9BB4	#CJK UNIFIED IDEOGRAPH
0xE9BF	0x9BC0	#CJK UNIFIED IDEOGRAPH
0xE9C0	0x9BCA	#CJK UNIFIED IDEOGRAPH
0xE9C1	0x9BB9	#CJK UNIFIED IDEOGRAPH
0xE9C2	0x9BC6	#CJK UNIFIED IDEOGRAPH
0xE9C3	0x9BCF	#CJK UNIFIED IDEOGRAPH
0xE9C4	0x9BD1	#CJK UNIFIED IDEOGRAPH
0xE9C5	0x9BD2	#CJK UNIFIED IDEOGRAPH
0xE9C6	0x9BE3	#CJK UNIFIED IDEOGRAPH
0xE9C7	0x9BE2	#CJK UNIFIED IDEOGRAPH
0xE9C8	0x9BE4	#CJK UNIFIED IDEOGRAPH
0xE9C9	0x9BD4	#CJK UNIFIED IDEOGRAPH
0xE9CA	0x9BE1	#CJK UNIFIED IDEOGRAPH
0xE9CB	0x9C3A	#CJK UNIFIED IDEOGRAPH
0xE9CC	0x9BF2	#CJK UNIFIED IDEOGRAPH
0xE9CD	0x9BF1	#CJK UNIFIED IDEOGRAPH
0xE9CE	0x9BF0	#CJK UNIFIED IDEOGRAPH
0xE9CF	0x9C15	#CJK UNIFIED IDEOGRAPH
0xE9D0	0x9C14	#CJK UNIFIED IDEOGRAPH
0xE9D1	0x9C09	#CJK UNIFIED IDEOGRAPH
0xE9D2	0x9C13	#CJK UNIFIED IDEOGRAPH
0xE9D3	0x9C0C	#CJK UNIFIED IDEOGRAPH
0xE9D4	0x9C06	#CJK UNIFIED IDEOGRAPH
0xE9D5	0x9C08	#CJK UNIFIED IDEOGRAPH
0xE9D6	0x9C12	#CJK UNIFIED IDEOGRAPH
0xE9D7	0x9C0A	#CJK UNIFIED IDEOGRAPH
0xE9D8	0x9C04	#CJK UNIFIED IDEOGRAPH
0xE9D9	0x9C2E	#CJK UNIFIED IDEOGRAPH
0xE9DA	0x9C1B	#CJK UNIFIED IDEOGRAPH
0xE9DB	0x9C25	#CJK UNIFIED IDEOGRAPH
0xE9DC	0x9C24	#CJK UNIFIED IDEOGRAPH
0xE9DD	0x9C21	#CJK UNIFIED IDEOGRAPH
0xE9DE	0x9C30	#CJK UNIFIED IDEOGRAPH
0xE9DF	0x9C47	#CJK UNIFIED IDEOGRAPH
0xE9E0	0x9C32	#CJK UNIFIED IDEOGRAPH
0xE9E1	0x9C46	#CJK UNIFIED IDEOGRAPH
0xE9E2	0x9C3E	#CJK UNIFIED IDEOGRAPH
0xE9E3	0x9C5A	#CJK UNIFIED IDEOGRAPH
0xE9E4	0x9C60	#CJK UNIFIED IDEOGRAPH
0xE9E5	0x9C67	#CJK UNIFIED IDEOGRAPH
0xE9E6	0x9C76	#CJK UNIFIED IDEOGRAPH
0xE9E7	0x9C78	#CJK UNIFIED IDEOGRAPH
0xE9E8	0x9CE7	#CJK UNIFIED IDEOGRAPH
0xE9E9	0x9CEC	#CJK UNIFIED IDEOGRAPH
0xE9EA	0x9CF0	#CJK UNIFIED IDEOGRAPH
0xE9EB	0x9D09	#CJK UNIFIED IDEOGRAPH
0xE9EC	0x9D08	#CJK UNIFIED IDEOGRAPH
0xE9ED	0x9CEB	#CJK UNIFIED IDEOGRAPH
0xE9EE	0x9D03	#CJK UNIFIED IDEOGRAPH
0xE9EF	0x9D06	#CJK UNIFIED IDEOGRAPH
0xE9F0	0x9D2A	#CJK UNIFIED IDEOGRAPH
0xE9F1	0x9D26	#CJK UNIFIED IDEOGRAPH
0xE9F2	0x9DAF	#CJK UNIFIED IDEOGRAPH
0xE9F3	0x9D23	#CJK UNIFIED IDEOGRAPH
0xE9F4	0x9D1F	#CJK UNIFIED IDEOGRAPH
0xE9F5	0x9D44	#CJK UNIFIED IDEOGRAPH
0xE9F6	0x9D15	#CJK UNIFIED IDEOGRAPH
0xE9F7	0x9D12	#CJK UNIFIED IDEOGRAPH
0xE9F8	0x9D41	#CJK UNIFIED IDEOGRAPH
0xE9F9	0x9D3F	#CJK UNIFIED IDEOGRAPH
0xE9FA	0x9D3E	#CJK UNIFIED IDEOGRAPH
0xE9FB	0x9D46	#CJK UNIFIED IDEOGRAPH
0xE9FC	0x9D48	#CJK UNIFIED IDEOGRAPH
0xEA40	0x9D5D	#CJK UNIFIED IDEOGRAPH
0xEA41	0x9D5E	#CJK UNIFIED IDEOGRAPH
0xEA42	0x9D64	#CJK UNIFIED IDEOGRAPH
0xEA43	0x9D51	#CJK UNIFIED IDEOGRAPH
0xEA44	0x9D50	#CJK UNIFIED IDEOGRAPH
0xEA45	0x9D59	#CJK UNIFIED IDEOGRAPH
0xEA46	0x9D72	#CJK UNIFIED IDEOGRAPH
0xEA47	0x9D89	#CJK UNIFIED IDEOGRAPH
0xEA48	0x9D87	#CJK UNIFIED IDEOGRAPH
0xEA49	0x9DAB	#CJK UNIFIED IDEOGRAPH
0xEA4A	0x9D6F	#CJK UNIFIED IDEOGRAPH
0xEA4B	0x9D7A	#CJK UNIFIED IDEOGRAPH
0xEA4C	0x9D9A	#CJK UNIFIED IDEOGRAPH
0xEA4D	0x9DA4	#CJK UNIFIED IDEOGRAPH
0xEA4E	0x9DA9	#CJK UNIFIED IDEOGRAPH
0xEA4F	0x9DB2	#CJK UNIFIED IDEOGRAPH
0xEA50	0x9DC4	#CJK UNIFIED IDEOGRAPH
0xEA51	0x9DC1	#CJK UNIFIED IDEOGRAPH
0xEA52	0x9DBB	#CJK UNIFIED IDEOGRAPH
0xEA53	0x9DB8	#CJK UNIFIED IDEOGRAPH
0xEA54	0x9DBA	#CJK UNIFIED IDEOGRAPH
0xEA55	0x9DC6	#CJK UNIFIED IDEOGRAPH
0xEA56	0x9DCF	#CJK UNIFIED IDEOGRAPH
0xEA57	0x9DC2	#CJK UNIFIED IDEOGRAPH
0xEA58	0x9DD9	#CJK UNIFIED IDEOGRAPH
0xEA59	0x9DD3	#CJK UNIFIED IDEOGRAPH
0xEA5A	0x9DF8	#CJK UNIFIED IDEOGRAPH
0xEA5B	0x9DE6	#CJK UNIFIED IDEOGRAPH
0xEA5C	0x9DED	#CJK UNIFIED IDEOGRAPH
0xEA5D	0x9DEF	#CJK UNIFIED IDEOGRAPH
0xEA5E	0x9DFD	#CJK UNIFIED IDEOGRAPH
0xEA5F	0x9E1A	#CJK UNIFIED IDEOGRAPH
0xEA60	0x9E1B	#CJK UNIFIED IDEOGRAPH
0xEA61	0x9E1E	#CJK UNIFIED IDEOGRAPH
0xEA62	0x9E75	#CJK UNIFIED IDEOGRAPH
0xEA63	0x9E79	#CJK UNIFIED IDEOGRAPH
0xEA64	0x9E7D	#CJK UNIFIED IDEOGRAPH
0xEA65	0x9E81	#CJK UNIFIED IDEOGRAPH
0xEA66	0x9E88	#CJK UNIFIED IDEOGRAPH
0xEA67	0x9E8B	#CJK UNIFIED IDEOGRAPH
0xEA68	0x9E8C	#CJK UNIFIED IDEOGRAPH
0xEA69	0x9E92	#CJK UNIFIED IDEOGRAPH
0xEA6A	0x9E95	#CJK UNIFIED IDEOGRAPH
0xEA6B	0x9E91	#CJK UNIFIED IDEOGRAPH
0xEA6C	0x9E9D	#CJK UNIFIED IDEOGRAPH
0xEA6D	0x9EA5	#CJK UNIFIED IDEOGRAPH
0xEA6E	0x9EA9	#CJK UNIFIED IDEOGRAPH
0xEA6F	0x9EB8	#CJK UNIFIED IDEOGRAPH
0xEA70	0x9EAA	#CJK UNIFIED IDEOGRAPH
0xEA71	0x9EAD	#CJK UNIFIED IDEOGRAPH
0xEA72	0x9761	#CJK UNIFIED IDEOGRAPH
0xEA73	0x9ECC	#CJK UNIFIED IDEOGRAPH
0xEA74	0x9ECE	#CJK UNIFIED IDEOGRAPH
0xEA75	0x9ECF	#CJK UNIFIED IDEOGRAPH
0xEA76	0x9ED0	#CJK UNIFIED IDEOGRAPH
0xEA77	0x9ED4	#CJK UNIFIED IDEOGRAPH
0xEA78	0x9EDC	#CJK UNIFIED IDEOGRAPH
0xEA79	0x9EDE	#CJK UNIFIED IDEOGRAPH
0xEA7A	0x9EDD	#CJK UNIFIED IDEOGRAPH
0xEA7B	0x9EE0	#CJK UNIFIED IDEOGRAPH
0xEA7C	0x9EE5	#CJK UNIFIED IDEOGRAPH
0xEA7D	0x9EE8	#CJK UNIFIED IDEOGRAPH
0xEA7E	0x9EEF	#CJK UNIFIED IDEOGRAPH
0xEA80	0x9EF4	#CJK UNIFIED IDEOGRAPH
0xEA81	0x9EF6	#CJK UNIFIED IDEOGRAPH
0xEA82	0x9EF7	#CJK UNIFIED IDEOGRAPH
0xEA83	0x9EF9	#CJK UNIFIED IDEOGRAPH
0xEA84	0x9EFB	#CJK UNIFIED IDEOGRAPH
0xEA85	0x9EFC	#CJK UNIFIED IDEOGRAPH
0xEA86	0x9EFD	#CJK UNIFIED IDEOGRAPH
0xEA87	0x9F07	#CJK UNIFIED IDEOGRAPH
0xEA88	0x9F08	#CJK UNIFIED IDEOGRAPH
0xEA89	0x76B7	#CJK UNIFIED IDEOGRAPH
0xEA8A	0x9F15	#CJK UNIFIED IDEOGRAPH
0xEA8B	0x9F21	#CJK UNIFIED IDEOGRAPH
0xEA8C	0x9F2C	#CJK UNIFIED IDEOGRAPH
0xEA8D	0x9F3E	#CJK UNIFIED IDEOGRAPH
0xEA8E	0x9F4A	#CJK UNIFIED IDEOGRAPH
0xEA8F	0x9F52	#CJK UNIFIED IDEOGRAPH
0xEA90	0x9F54	#CJK UNIFIED IDEOGRAPH
0xEA91	0x9F63	#CJK UNIFIED IDEOGRAPH
0xEA92	0x9F5F	#CJK UNIFIED IDEOGRAPH
0xEA93	0x9F60	#CJK UNIFIED IDEOGRAPH
0xEA94	0x9F61	#CJK UNIFIED IDEOGRAPH
0xEA95	0x9F66	#CJK UNIFIED IDEOGRAPH
0xEA96	0x9F67	#CJK UNIFIED IDEOGRAPH
0xEA97	0x9F6C	#CJK UNIFIED IDEOGRAPH
0xEA98	0x9F6A	#CJK UNIFIED IDEOGRAPH
0xEA99	0x9F77	#CJK UNIFIED IDEOGRAPH
0xEA9A	0x9F72	#CJK UNIFIED IDEOGRAPH
0xEA9B	0x9F76	#CJK UNIFIED IDEOGRAPH
0xEA9C	0x9F95	#CJK UNIFIED IDEOGRAPH
0xEA9D	0x9F9C	#CJK UNIFIED IDEOGRAPH
0xEA9E	0x9FA0	#CJK UNIFIED IDEOGRAPH
0xEA9F	0x582F	#CJK UNIFIED IDEOGRAPH
0xEAA0	0x69C7	#CJK UNIFIED IDEOGRAPH
0xEAA1	0x9059	#CJK UNIFIED IDEOGRAPH
0xEAA2	0x7464	#CJK UNIFIED IDEOGRAPH
0xEAA3	0x51DC	#CJK UNIFIED IDEOGRAPH
0xEAA4	0x7199	#CJK UNIFIED IDEOGRAPH
0xED40	0x7E8A	#CJK UNIFIED IDEOGRAPH
0xED41	0x891C	#CJK UNIFIED IDEOGRAPH
0xED42	0x9348	#CJK UNIFIED IDEOGRAPH
0xED43	0x9288	#CJK UNIFIED IDEOGRAPH
0xED44	0x84DC	#CJK UNIFIED IDEOGRAPH
0xED45	0x4FC9	#CJK UNIFIED IDEOGRAPH
0xED46	0x70BB	#CJK UNIFIED IDEOGRAPH
0xED47	0x6631	#CJK UNIFIED IDEOGRAPH
0xED48	0x68C8	#CJK UNIFIED IDEOGRAPH
0xED49	0x92F9	#CJK UNIFIED IDEOGRAPH
0xED4A	0x66FB	#CJK UNIFIED IDEOGRAPH
0xED4B	0x5F45	#CJK UNIFIED IDEOGRAPH
0xED4C	0x4E28	#CJK UNIFIED IDEOGRAPH
0xED4D	0x4EE1	#CJK UNIFIED IDEOGRAPH
0xED4E	0x4EFC	#CJK UNIFIED IDEOGRAPH
0xED4F	0x4F00	#CJK UNIFIED IDEOGRAPH
0xED50	0x4F03	#CJK UNIFIED IDEOGRAPH
0xED51	0x4F39	#CJK UNIFIED IDEOGRAPH
0xED52	0x4F56	#CJK UNIFIED IDEOGRAPH
0xED53	0x4F92	#CJK UNIFIED IDEOGRAPH
0xED54	0x4F8A	#CJK UNIFIED IDEOGRAPH
0xED55	0x4F9A	#CJK UNIFIED IDEOGRAPH
0xED56	0x4F94	#CJK UNIFIED IDEOGRAPH
0xED57	0x4FCD	#CJK UNIFIED IDEOGRAPH
0xED58	0x5040	#CJK UNIFIED IDEOGRAPH
0xED59	0x5022	#CJK UNIFIED IDEOGRAPH
0xED5A	0x4FFF	#CJK UNIFIED IDEOGRAPH
0xED5B	0x501E	#CJK UNIFIED IDEOGRAPH
0xED5C	0x5046	#CJK UNIFIED IDEOGRAPH
0xED5D	0x5070	#CJK UNIFIED IDEOGRAPH
0xED5E	0x5042	#CJK UNIFIED IDEOGRAPH
0xED5F	0x5094	#CJK UNIFIED IDEOGRAPH
0xED60	0x50F4	#CJK UNIFIED IDEOGRAPH
0xED61	0x50D8	#CJK UNIFIED IDEOGRAPH
0xED62	0x514A	#CJK UNIFIED IDEOGRAPH
0xED63	0x5164	#CJK UNIFIED IDEOGRAPH
0xED64	0x519D	#CJK UNIFIED IDEOGRAPH
0xED65	0x51BE	#CJK UNIFIED IDEOGRAPH
0xED66	0x51EC	#CJK UNIFIED IDEOGRAPH
0xED67	0x5215	#CJK UNIFIED IDEOGRAPH
0xED68	0x529C	#CJK UNIFIED IDEOGRAPH
0xED69	0x52A6	#CJK UNIFIED IDEOGRAPH
0xED6A	0x52C0	#CJK UNIFIED IDEOGRAPH
0xED6B	0x52DB	#CJK UNIFIED IDEOGRAPH
0xED6C	0x5300	#CJK UNIFIED IDEOGRAPH
0xED6D	0x5307	#CJK UNIFIED IDEOGRAPH
0xED6E	0x5324	#CJK UNIFIED IDEOGRAPH
0xED6F	0x5372	#CJK UNIFIED IDEOGRAPH
0xED70	0x5393	#CJK UNIFIED IDEOGRAPH
0xED71	0x53B2	#CJK UNIFIED IDEOGRAPH
0xED72	0x53DD	#CJK UNIFIED IDEOGRAPH
0xED73	0xFA0E	#CJK COMPATIBILITY IDEOGRAPH
0xED74	0x549C	#CJK UNIFIED IDEOGRAPH
0xED75	0x548A	#CJK UNIFIED IDEOGRAPH
0xED76	0x54A9	#CJK UNIFIED IDEOGRAPH
0xED77	0x54FF	#CJK UNIFIED IDEOGRAPH
0xED78	0x5586	#CJK UNIFIED IDEOGRAPH
0xED79	0x5759	#CJK UNIFIED IDEOGRAPH
0xED7A	0x5765	#CJK UNIFIED IDEOGRAPH
0xED7B	0x57AC	#CJK UNIFIED IDEOGRAPH
0xED7C	0x57C8	#CJK UNIFIED IDEOGRAPH
0xED7D	0x57C7	#CJK UNIFIED IDEOGRAPH
0xED7E	0xFA0F	#CJK COMPATIBILITY IDEOGRAPH
0xED80	0xFA10	#CJK COMPATIBILITY IDEOGRAPH
0xED81	0x589E	#CJK UNIFIED IDEOGRAPH
0xED82	0x58B2	#CJK UNIFIED IDEOGRAPH
0xED83	0x590B	#CJK UNIFIED IDEOGRAPH
0xED84	0x5953	#CJK UNIFIED IDEOGRAPH
0xED85	0x595B	#CJK UNIFIED IDEOGRAPH
0xED86	0x595D	#CJK UNIFIED IDEOGRAPH
0xED87	0x5963	#CJK UNIFIED IDEOGRAPH
0xED88	0x59A4	#CJK UNIFIED IDEOGRAPH
0xED89	0x59BA	#CJK UNIFIED IDEOGRAPH
0xED8A	0x5B56	#CJK UNIFIED IDEOGRAPH
0xED8B	0x5BC0	#CJK UNIFIED IDEOGRAPH
0xED8C	0x752F	#CJK UNIFIED IDEOGRAPH
0xED8D	0x5BD8	#CJK UNIFIED IDEOGRAPH
0xED8E	0x5BEC	#CJK UNIFIED IDEOGRAPH
0xED8F	0x5C1E	#CJK UNIFIED IDEOGRAPH
0xED90	0x5CA6	#CJK UNIFIED IDEOGRAPH
0xED91	0x5CBA	#CJK UNIFIED IDEOGRAPH
0xED92	0x5CF5	#CJK UNIFIED IDEOGRAPH
0xED93	0x5D27	#CJK UNIFIED IDEOGRAPH
0xED94	0x5D53	#CJK UNIFIED IDEOGRAPH
0xED95	0xFA11	#CJK COMPATIBILITY IDEOGRAPH
0xED96	0x5D42	#CJK UNIFIED IDEOGRAPH
0xED97	0x5D6D	#CJK UNIFIED IDEOGRAPH
0xED98	0x5DB8	#CJK UNIFIED IDEOGRAPH
0xED99	0x5DB9	#CJK UNIFIED IDEOGRAPH
0xED9A	0x5DD0	#CJK UNIFIED IDEOGRAPH
0xED9B	0x5F21	#CJK UNIFIED IDEOGRAPH
0xED9C	0x5F34	#CJK UNIFIED IDEOGRAPH
0xED9D	0x5F67	#CJK UNIFIED IDEOGRAPH
0xED9E	0x5FB7	#CJK UNIFIED IDEOGRAPH
0xED9F	0x5FDE	#CJK UNIFIED IDEOGRAPH
0xEDA0	0x605D	#CJK UNIFIED IDEOGRAPH
0xEDA1	0x6085	#CJK UNIFIED IDEOGRAPH
0xEDA2	0x608A	#CJK UNIFIED IDEOGRAPH
0xEDA3	0x60DE	#CJK UNIFIED IDEOGRAPH
0xEDA4	0x60D5	#CJK UNIFIED IDEOGRAPH
0xEDA5	0x6120	#CJK UNIFIED IDEOGRAPH
0xEDA6	0x60F2	#CJK UNIFIED IDEOGRAPH
0xEDA7	0x6111	#CJK UNIFIED IDEOGRAPH
0xEDA8	0x6137	#CJK UNIFIED IDEOGRAPH
0xEDA9	0x6130	#CJK UNIFIED IDEOGRAPH
0xEDAA	0x6198	#CJK UNIFIED IDEOGRAPH
0xEDAB	0x6213	#CJK UNIFIED IDEOGRAPH
0xEDAC	0x62A6	#CJK UNIFIED IDEOGRAPH
0xEDAD	0x63F5	#CJK UNIFIED IDEOGRAPH
0xEDAE	0x6460	#CJK UNIFIED IDEOGRAPH
0xEDAF	0x649D	#CJK UNIFIED IDEOGRAPH
0xEDB0	0x64CE	#CJK UNIFIED IDEOGRAPH
0xEDB1	0x654E	#CJK UNIFIED IDEOGRAPH
0xEDB2	0x6600	#CJK UNIFIED IDEOGRAPH
0xEDB3	0x6615	#CJK UNIFIED IDEOGRAPH
0xEDB4	0x663B	#CJK UNIFIED IDEOGRAPH
0xEDB5	0x6609	#CJK UNIFIED IDEOGRAPH
0xEDB6	0x662E	#CJK UNIFIED IDEOGRAPH
0xEDB7	0x661E	#CJK UNIFIED IDEOGRAPH
0xEDB8	0x6624	#CJK UNIFIED IDEOGRAPH
0xEDB9	0x6665	#CJK UNIFIED IDEOGRAPH
0xEDBA	0x6657	#CJK UNIFIED IDEOGRAPH
0xEDBB	0x6659	#CJK UNIFIED IDEOGRAPH
0xEDBC	0xFA12	#CJK COMPATIBILITY IDEOGRAPH
0xEDBD	0x6673	#CJK UNIFIED IDEOGRAPH
0xEDBE	0x6699	#CJK UNIFIED IDEOGRAPH
0xEDBF	0x66A0	#CJK UNIFIED IDEOGRAPH
0xEDC0	0x66B2	#CJK UNIFIED IDEOGRAPH
0xEDC1	0x66BF	#CJK UNIFIED IDEOGRAPH
0xEDC2	0x66FA	#CJK UNIFIED IDEOGRAPH
0xEDC3	0x670E	#CJK UNIFIED IDEOGRAPH
0xEDC4	0xF929	#CJK COMPATIBILITY IDEOGRAPH
0xEDC5	0x6766	#CJK UNIFIED IDEOGRAPH
0xEDC6	0x67BB	#CJK UNIFIED IDEOGRAPH
0xEDC7	0x6852	#CJK UNIFIED IDEOGRAPH
0xEDC8	0x67C0	#CJK UNIFIED IDEOGRAPH
0xEDC9	0x6801	#CJK UNIFIED IDEOGRAPH
0xEDCA	0x6844	#CJK UNIFIED IDEOGRAPH
0xEDCB	0x68CF	#CJK UNIFIED IDEOGRAPH
0xEDCC	0xFA13	#CJK COMPATIBILITY IDEOGRAPH
0xEDCD	0x6968	#CJK UNIFIED IDEOGRAPH
0xEDCE	0xFA14	#CJK COMPATIBILITY IDEOGRAPH
0xEDCF	0x6998	#CJK UNIFIED IDEOGRAPH
0xEDD0	0x69E2	#CJK UNIFIED IDEOGRAPH
0xEDD1	0x6A30	#CJK UNIFIED IDEOGRAPH
0xEDD2	0x6A6B	#CJK UNIFIED IDEOGRAPH
0xEDD3	0x6A46	#CJK UNIFIED IDEOGRAPH
0xEDD4	0x6A73	#CJK UNIFIED IDEOGRAPH
0xEDD5	0x6A7E	#CJK UNIFIED IDEOGRAPH
0xEDD6	0x6AE2	#CJK UNIFIED IDEOGRAPH
0xEDD7	0x6AE4	#CJK UNIFIED IDEOGRAPH
0xEDD8	0x6BD6	#CJK UNIFIED IDEOGRAPH
0xEDD9	0x6C3F	#CJK UNIFIED IDEOGRAPH
0xEDDA	0x6C5C	#CJK UNIFIED IDEOGRAPH
0xEDDB	0x6C86	#CJK UNIFIED IDEOGRAPH
0xEDDC	0x6C6F	#CJK UNIFIED IDEOGRAPH
0xEDDD	0x6CDA	#CJK UNIFIED IDEOGRAPH
0xEDDE	0x6D04	#CJK UNIFIED IDEOGRAPH
0xEDDF	0x6D87	#CJK UNIFIED IDEOGRAPH
0xEDE0	0x6D6F	#CJK UNIFIED IDEOGRAPH
0xEDE1	0x6D96	#CJK UNIFIED IDEOGRAPH
0xEDE2	0x6DAC	#CJK UNIFIED IDEOGRAPH
0xEDE3	0x6DCF	#CJK UNIFIED IDEOGRAPH
0xEDE4	0x6DF8	#CJK UNIFIED IDEOGRAPH
0xEDE5	0x6DF2	#CJK UNIFIED IDEOGRAPH
0xEDE6	0x6DFC	#CJK UNIFIED IDEOGRAPH
0xEDE7	0x6E39	#CJK UNIFIED IDEOGRAPH
0xEDE8	0x6E5C	#CJK UNIFIED IDEOGRAPH
0xEDE9	0x6E27	#CJK UNIFIED IDEOGRAPH
0xEDEA	0x6E3C	#CJK UNIFIED IDEOGRAPH
0xEDEB	0x6EBF	#CJK UNIFIED IDEOGRAPH
0xEDEC	0x6F88	#CJK UNIFIED IDEOGRAPH
0xEDED	0x6FB5	#CJK UNIFIED IDEOGRAPH
0xEDEE	0x6FF5	#CJK UNIFIED IDEOGRAPH
0xEDEF	0x7005	#CJK UNIFIED IDEOGRAPH
0xEDF0	0x7007	#CJK UNIFIED IDEOGRAPH
0xEDF1	0x7028	#CJK UNIFIED IDEOGRAPH
0xEDF2	0x7085	#CJK UNIFIED IDEOGRAPH
0xEDF3	0x70AB	#CJK UNIFIED IDEOGRAPH
0xEDF4	0x710F	#CJK UNIFIED IDEOGRAPH
0xEDF5	0x7104	#CJK UNIFIED IDEOGRAPH
0xEDF6	0x715C	#CJK UNIFIED IDEOGRAPH
0xEDF7	0x7146	#CJK UNIFIED IDEOGRAPH
0xEDF8	0x7147	#CJK UNIFIED IDEOGRAPH
0xEDF9	0xFA15	#CJK COMPATIBILITY IDEOGRAPH
0xEDFA	0x71C1	#CJK UNIFIED IDEOGRAPH
0xEDFB	0x71FE	#CJK UNIFIED IDEOGRAPH
0xEDFC	0x72B1	#CJK UNIFIED IDEOGRAPH
0xEE40	0x72BE	#CJK UNIFIED IDEOGRAPH
0xEE41	0x7324	#CJK UNIFIED IDEOGRAPH
0xEE42	0xFA16	#CJK COMPATIBILITY IDEOGRAPH
0xEE43	0x7377	#CJK UNIFIED IDEOGRAPH
0xEE44	0x73BD	#CJK UNIFIED IDEOGRAPH
0xEE45	0x73C9	#CJK UNIFIED IDEOGRAPH
0xEE46	0x73D6	#CJK UNIFIED IDEOGRAPH
0xEE47	0x73E3	#CJK UNIFIED IDEOGRAPH
0xEE48	0x73D2	#CJK UNIFIED IDEOGRAPH
0xEE49	0x7407	#CJK UNIFIED IDEOGRAPH
0xEE4A	0x73F5	#CJK UNIFIED IDEOGRAPH
0xEE4B	0x7426	#CJK UNIFIED IDEOGRAPH
0xEE4C	0x742A	#CJK UNIFIED IDEOGRAPH
0xEE4D	0x7429	#CJK UNIFIED IDEOGRAPH
0xEE4E	0x742E	#CJK UNIFIED IDEOGRAPH
0xEE4F	0x7462	#CJK UNIFIED IDEOGRAPH
0xEE50	0x7489	#CJK UNIFIED IDEOGRAPH
0xEE51	0x749F	#CJK UNIFIED IDEOGRAPH
0xEE52	0x7501	#CJK UNIFIED IDEOGRAPH
0xEE53	0x756F	#CJK UNIFIED IDEOGRAPH
0xEE54	0x7682	#CJK UNIFIED IDEOGRAPH
0xEE55	0x769C	#CJK UNIFIED IDEOGRAPH
0xEE56	0x769E	#CJK UNIFIED IDEOGRAPH
0xEE57	0x769B	#CJK UNIFIED IDEOGRAPH
0xEE58	0x76A6	#CJK UNIFIED IDEOGRAPH
0xEE59	0xFA17	#CJK COMPATIBILITY IDEOGRAPH
0xEE5A	0x7746	#CJK UNIFIED IDEOGRAPH
0xEE5B	0x52AF	#CJK UNIFIED IDEOGRAPH
0xEE5C	0x7821	#CJK UNIFIED IDEOGRAPH
0xEE5D	0x784E	#CJK UNIFIED IDEOGRAPH
0xEE5E	0x7864	#CJK UNIFIED IDEOGRAPH
0xEE5F	0x787A	#CJK UNIFIED IDEOGRAPH
0xEE60	0x7930	#CJK UNIFIED IDEOGRAPH
0xEE61	0xFA18	#CJK COMPATIBILITY IDEOGRAPH
0xEE62	0xFA19	#CJK COMPATIBILITY IDEOGRAPH
0xEE63	0xFA1A	#CJK COMPATIBILITY IDEOGRAPH
0xEE64	0x7994	#CJK UNIFIED IDEOGRAPH
0xEE65	0xFA1B	#CJK COMPATIBILITY IDEOGRAPH
0xEE66	0x799B	#CJK UNIFIED IDEOGRAPH
0xEE67	0x7AD1	#CJK UNIFIED IDEOGRAPH
0xEE68	0x7AE7	#CJK UNIFIED IDEOGRAPH
0xEE69	0xFA1C	#CJK COMPATIBILITY IDEOGRAPH
0xEE6A	0x7AEB	#CJK UNIFIED IDEOGRAPH
0xEE6B	0x7B9E	#CJK UNIFIED IDEOGRAPH
0xEE6C	0xFA1D	#CJK COMPATIBILITY IDEOGRAPH
0xEE6D	0x7D48	#CJK UNIFIED IDEOGRAPH
0xEE6E	0x7D5C	#CJK UNIFIED IDEOGRAPH
0xEE6F	0x7DB7	#CJK UNIFIED IDEOGRAPH
0xEE70	0x7DA0	#CJK UNIFIED IDEOGRAPH
0xEE71	0x7DD6	#CJK UNIFIED IDEOGRAPH
0xEE72	0x7E52	#CJK UNIFIED IDEOGRAPH
0xEE73	0x7F47	#CJK UNIFIED IDEOGRAPH
0xEE74	0x7FA1	#CJK UNIFIED IDEOGRAPH
0xEE75	0xFA1E	#CJK COMPATIBILITY IDEOGRAPH
0xEE76	0x8301	#CJK UNIFIED IDEOGRAPH
0xEE77	0x8362	#CJK UNIFIED IDEOGRAPH
0xEE78	0x837F	#CJK UNIFIED IDEOGRAPH
0xEE79	0x83C7	#CJK UNIFIED IDEOGRAPH
0xEE7A	0x83F6	#CJK UNIFIED IDEOGRAPH
0xEE7B	0x8448	#CJK UNIFIED IDEOGRAPH
0xEE7C	0x84B4	#CJK UNIFIED IDEOGRAPH
0xEE7D	0x8553	#CJK UNIFIED IDEOGRAPH
0xEE7E	0x8559	#CJK UNIFIED IDEOGRAPH
0xEE80	0x856B	#CJK UNIFIED IDEOGRAPH
0xEE81	0xFA1F	#CJK COMPATIBILITY IDEOGRAPH
0xEE82	0x85B0	#CJK UNIFIED IDEOGRAPH
0xEE83	0xFA20	#CJK COMPATIBILITY IDEOGRAPH
0xEE84	0xFA21	#CJK COMPATIBILITY IDEOGRAPH
0xEE85	0x8807	#CJK UNIFIED IDEOGRAPH
0xEE86	0x88F5	#CJK UNIFIED IDEOGRAPH
0xEE87	0x8A12	#CJK UNIFIED IDEOGRAPH
0xEE88	0x8A37	#CJK UNIFIED IDEOGRAPH
0xEE89	0x8A79	#CJK UNIFIED IDEOGRAPH
0xEE8A	0x8AA7	#CJK UNIFIED IDEOGRAPH
0xEE8B	0x8ABE	#CJK UNIFIED IDEOGRAPH
0xEE8C	0x8ADF	#CJK UNIFIED IDEOGRAPH
0xEE8D	0xFA22	#CJK COMPATIBILITY IDEOGRAPH
0xEE8E	0x8AF6	#CJK UNIFIED IDEOGRAPH
0xEE8F	0x8B53	#CJK UNIFIED IDEOGRAPH
0xEE90	0x8B7F	#CJK UNIFIED IDEOGRAPH
0xEE91	0x8CF0	#CJK UNIFIED IDEOGRAPH
0xEE92	0x8CF4	#CJK UNIFIED IDEOGRAPH
0xEE93	0x8D12	#CJK UNIFIED IDEOGRAPH
0xEE94	0x8D76	#CJK UNIFIED IDEOGRAPH
0xEE95	0xFA23	#CJK COMPATIBILITY IDEOGRAPH
0xEE96	0x8ECF	#CJK UNIFIED IDEOGRAPH
0xEE97	0xFA24	#CJK COMPATIBILITY IDEOGRAPH
0xEE98	0xFA25	#CJK COMPATIBILITY IDEOGRAPH
0xEE99	0x9067	#CJK UNIFIED IDEOGRAPH
0xEE9A	0x90DE	#CJK UNIFIED IDEOGRAPH
0xEE9B	0xFA26	#CJK COMPATIBILITY IDEOGRAPH
0xEE9C	0x9115	#CJK UNIFIED IDEOGRAPH
0xEE9D	0x9127	#CJK UNIFIED IDEOGRAPH
0xEE9E	0x91DA	#CJK UNIFIED IDEOGRAPH
0xEE9F	0x91D7	#CJK UNIFIED IDEOGRAPH
0xEEA0	0x91DE	#CJK UNIFIED IDEOGRAPH
0xEEA1	0x91ED	#CJK UNIFIED IDEOGRAPH
0xEEA2	0x91EE	#CJK UNIFIED IDEOGRAPH
0xEEA3	0x91E4	#CJK UNIFIED IDEOGRAPH
0xEEA4	0x91E5	#CJK UNIFIED IDEOGRAPH
0xEEA5	0x9206	#CJK UNIFIED IDEOGRAPH
0xEEA6	0x9210	#CJK UNIFIED IDEOGRAPH
0xEEA7	0x920A	#CJK UNIFIED IDEOGRAPH
0xEEA8	0x923A	#CJK UNIFIED IDEOGRAPH
0xEEA9	0x9240	#CJK UNIFIED IDEOGRAPH
0xEEAA	0x923C	#CJK UNIFIED IDEOGRAPH
0xEEAB	0x924E	#CJK UNIFIED IDEOGRAPH
0xEEAC	0x9259	#CJK UNIFIED IDEOGRAPH
0xEEAD	0x9251	#CJK UNIFIED IDEOGRAPH
0xEEAE	0x9239	#CJK UNIFIED IDEOGRAPH
0xEEAF	0x9267	#CJK UNIFIED IDEOGRAPH
0xEEB0	0x92A7	#CJK UNIFIED IDEOGRAPH
0xEEB1	0x9277	#CJK UNIFIED IDEOGRAPH
0xEEB2	0x9278	#CJK UNIFIED IDEOGRAPH
0xEEB3	0x92E7	#CJK UNIFIED IDEOGRAPH
0xEEB4	0x92D7	#CJK UNIFIED IDEOGRAPH
0xEEB5	0x92D9	#CJK UNIFIED IDEOGRAPH
0xEEB6	0x92D0	#CJK UNIFIED IDEOGRAPH
0xEEB7	0xFA27	#CJK COMPATIBILITY IDEOGRAPH
0xEEB8	0x92D5	#CJK UNIFIED IDEOGRAPH
0xEEB9	0x92E0	#CJK UNIFIED IDEOGRAPH
0xEEBA	0x92D3	#CJK UNIFIED IDEOGRAPH
0xEEBB	0x9325	#CJK UNIFIED IDEOGRAPH
0xEEBC	0x9321	#CJK UNIFIED IDEOGRAPH
0xEEBD	0x92FB	#CJK UNIFIED IDEOGRAPH
0xEEBE	0xFA28	#CJK COMPATIBILITY IDEOGRAPH
0xEEBF	0x931E	#CJK UNIFIED IDEOGRAPH
0xEEC0	0x92FF	#CJK UNIFIED IDEOGRAPH
0xEEC1	0x931D	#CJK UNIFIED IDEOGRAPH
0xEEC2	0x9302	#CJK UNIFIED IDEOGRAPH
0xEEC3	0x9370	#CJK UNIFIED IDEOGRAPH
0xEEC4	0x9357	#CJK UNIFIED IDEOGRAPH
0xEEC5	0x93A4	#CJK UNIFIED IDEOGRAPH
0xEEC6	0x93C6	#CJK UNIFIED IDEOGRAPH
0xEEC7	0x93DE	#CJK UNIFIED IDEOGRAPH
0xEEC8	0x93F8	#CJK UNIFIED IDEOGRAPH
0xEEC9	0x9431	#CJK UNIFIED IDEOGRAPH
0xEECA	0x9445	#CJK UNIFIED IDEOGRAPH
0xEECB	0x9448	#CJK UNIFIED IDEOGRAPH
0xEECC	0x9592	#CJK UNIFIED IDEOGRAPH
0xEECD	0xF9DC	#CJK COMPATIBILITY IDEOGRAPH
0xEECE	0xFA29	#CJK COMPATIBILITY IDEOGRAPH
0xEECF	0x969D	#CJK UNIFIED IDEOGRAPH
0xEED0	0x96AF	#CJK UNIFIED IDEOGRAPH
0xEED1	0x9733	#CJK UNIFIED IDEOGRAPH
0xEED2	0x973B	#CJK UNIFIED IDEOGRAPH
0xEED3	0x9743	#CJK UNIFIED IDEOGRAPH
0xEED4	0x974D	#CJK UNIFIED IDEOGRAPH
0xEED5	0x974F	#CJK UNIFIED IDEOGRAPH
0xEED6	0x9751	#CJK UNIFIED IDEOGRAPH
0xEED7	0x9755	#CJK UNIFIED IDEOGRAPH
0xEED8	0x9857	#CJK UNIFIED IDEOGRAPH
0xEED9	0x9865	#CJK UNIFIED IDEOGRAPH
0xEEDA	0xFA2A	#CJK COMPATIBILITY IDEOGRAPH
0xEEDB	0xFA2B	#CJK COMPATIBILITY IDEOGRAPH
0xEEDC	0x9927	#CJK UNIFIED IDEOGRAPH
0xEEDD	0xFA2C	#CJK COMPATIBILITY IDEOGRAPH
0xEEDE	0x999E	#CJK UNIFIED IDEOGRAPH
0xEEDF	0x9A4E	#CJK UNIFIED IDEOGRAPH
0xEEE0	0x9AD9	#CJK UNIFIED IDEOGRAPH
0xEEE1	0x9ADC	#CJK UNIFIED IDEOGRAPH
0xEEE2	0x9B75	#CJK UNIFIED IDEOGRAPH
0xEEE3	0x9B72	#CJK UNIFIED IDEOGRAPH
0xEEE4	0x9B8F	#CJK UNIFIED IDEOGRAPH
0xEEE5	0x9BB1	#CJK UNIFIED IDEOGRAPH
0xEEE6	0x9BBB	#CJK UNIFIED IDEOGRAPH
0xEEE7	0x9C00	#CJK UNIFIED IDEOGRAPH
0xEEE8	0x9D70	#CJK UNIFIED IDEOGRAPH
0xEEE9	0x9D6B	#CJK UNIFIED IDEOGRAPH
0xEEEA	0xFA2D	#CJK COMPATIBILITY IDEOGRAPH
0xEEEB	0x9E19	#CJK UNIFIED IDEOGRAPH
0xEEEC	0x9ED1	#CJK UNIFIED IDEOGRAPH
0xEEEF	0x2170	#SMALL ROMAN NUMERAL ONE
0xEEF0	0x2171	#SMALL ROMAN NUMERAL TWO
0xEEF1	0x2172	#SMALL ROMAN NUMERAL THREE
0xEEF2	0x2173	#SMALL ROMAN NUMERAL FOUR
0xEEF3	0x2174	#SMALL ROMAN NUMERAL FIVE
0xEEF4	0x2175	#SMALL ROMAN NUMERAL SIX
0xEEF5	0x2176	#SMALL ROMAN NUMERAL SEVEN
0xEEF6	0x2177	#SMALL ROMAN NUMERAL EIGHT
0xEEF7	0x2178	#SMALL ROMAN NUMERAL NINE
0xEEF8	0x2179	#SMALL ROMAN NUMERAL TEN
0xEEF9	0xFFE2	#FULLWIDTH NOT SIGN
0xEEFA	0xFFE4	#FULLWIDTH BROKEN BAR
0xEEFB	0xFF07	#FULLWIDTH APOSTROPHE
0xEEFC	0xFF02	#FULLWIDTH QUOTATION MARK
0xFA40	0x2170	#SMALL ROMAN NUMERAL ONE
0xFA41	0x2171	#SMALL ROMAN NUMERAL TWO
0xFA42	0x2172	#SMALL ROMAN NUMERAL THREE
0xFA43	0x2173	#SMALL ROMAN NUMERAL FOUR
0xFA44	0x2174	#SMALL ROMAN NUMERAL FIVE
0xFA45	0x2175	#SMALL ROMAN NUMERAL SIX
0xFA46	0x2176	#SMALL ROMAN NUMERAL SEVEN
0xFA47	0x2177	#SMALL ROMAN NUMERAL EIGHT
0xFA48	0x2178	#SMALL ROMAN NUMERAL NINE
0xFA49	0x2179	#SMALL ROMAN NUMERAL TEN
0xFA4A	0x2160	#ROMAN NUMERAL ONE
0xFA4B	0x2161	#ROMAN NUMERAL TWO
0xFA4C	0x2162	#ROMAN NUMERAL THREE
0xFA4D	0x2163	#ROMAN NUMERAL FOUR
0xFA4E	0x2164	#ROMAN NUMERAL FIVE
0xFA4F	0x2165	#ROMAN NUMERAL SIX
0xFA50	0x2166	#ROMAN NUMERAL SEVEN
0xFA51	0x2167	#ROMAN NUMERAL EIGHT
0xFA52	0x2168	#ROMAN NUMERAL NINE
0xFA53	0x2169	#ROMAN NUMERAL TEN
0xFA54	0xFFE2	#FULLWIDTH NOT SIGN
0xFA55	0xFFE4	#FULLWIDTH BROKEN BAR
0xFA56	0xFF07	#FULLWIDTH APOSTROPHE
0xFA57	0xFF02	#FULLWIDTH QUOTATION MARK
0xFA58	0x3231	#PARENTHESIZED IDEOGRAPH STOCK
0xFA59	0x2116	#NUMERO SIGN
0xFA5A	0x2121	#TELEPHONE SIGN
0xFA5B	0x2235	#BECAUSE
0xFA5C	0x7E8A	#CJK UNIFIED IDEOGRAPH
0xFA5D	0x891C	#CJK UNIFIED IDEOGRAPH
0xFA5E	0x9348	#CJK UNIFIED IDEOGRAPH
0xFA5F	0x9288	#CJK UNIFIED IDEOGRAPH
0xFA60	0x84DC	#CJK UNIFIED IDEOGRAPH
0xFA61	0x4FC9	#CJK UNIFIED IDEOGRAPH
0xFA62	0x70BB	#CJK UNIFIED IDEOGRAPH
0xFA63	0x6631	#CJK UNIFIED IDEOGRAPH
0xFA64	0x68C8	#CJK UNIFIED IDEOGRAPH
0xFA65	0x92F9	#CJK UNIFIED IDEOGRAPH
0xFA66	0x66FB	#CJK UNIFIED IDEOGRAPH
0xFA67	0x5F45	#CJK UNIFIED IDEOGRAPH
0xFA68	0x4E28	#CJK UNIFIED IDEOGRAPH
0xFA69	0x4EE1	#CJK UNIFIED IDEOGRAPH
0xFA6A	0x4EFC	#CJK UNIFIED IDEOGRAPH
0xFA6B	0x4F00	#CJK UNIFIED IDEOGRAPH
0xFA6C	0x4F03	#CJK UNIFIED IDEOGRAPH
0xFA6D	0x4F39	#CJK UNIFIED IDEOGRAPH
0xFA6E	0x4F56	#CJK UNIFIED IDEOGRAPH
0xFA6F	0x4F92	#CJK UNIFIED IDEOGRAPH
0xFA70	0x4F8A	#CJK UNIFIED IDEOGRAPH
0xFA71	0x4F9A	#CJK UNIFIED IDEOGRAPH
0xFA72	0x4F94	#CJK UNIFIED IDEOGRAPH
0xFA73	0x4FCD	#CJK UNIFIED IDEOGRAPH
0xFA74	0x5040	#CJK UNIFIED IDEOGRAPH
0xFA75	0x5022	#CJK UNIFIED IDEOGRAPH
0xFA76	0x4FFF	#CJK UNIFIED IDEOGRAPH
0xFA77	0x501E	#CJK UNIFIED IDEOGRAPH
0xFA78	0x5046	#CJK UNIFIED IDEOGRAPH
0xFA79	0x5070	#CJK UNIFIED IDEOGRAPH
0xFA7A	0x5042	#CJK UNIFIED IDEOGRAPH
0xFA7B	0x5094	#CJK UNIFIED IDEOGRAPH
0xFA7C	0x50F4	#CJK UNIFIED IDEOGRAPH
0xFA7D	0x50D8	#CJK UNIFIED IDEOGRAPH
0xFA7E	0x514A	#CJK UNIFIED IDEOGRAPH
0xFA80	0x5164	#CJK UNIFIED IDEOGRAPH
0xFA81	0x519D	#CJK UNIFIED IDEOGRAPH
0xFA82	0x51BE	#CJK UNIFIED IDEOGRAPH
0xFA83	0x51EC	#CJK UNIFIED IDEOGRAPH
0xFA84	0x5215	#CJK UNIFIED IDEOGRAPH
0xFA85	0x529C	#CJK UNIFIED IDEOGRAPH
0xFA86	0x52A6	#CJK UNIFIED IDEOGRAPH
0xFA87	0x52C0	#CJK UNIFIED IDEOGRAPH
0xFA88	0x52DB	#CJK UNIFIED IDEOGRAPH
0xFA89	0x5300	#CJK UNIFIED IDEOGRAPH
0xFA8A	0x5307	#CJK UNIFIED IDEOGRAPH
0xFA8B	0x5324	#CJK UNIFIED IDEOGRAPH
0xFA8C	0x5372	#CJK UNIFIED IDEOGRAPH
0xFA8D	0x5393	#CJK UNIFIED IDEOGRAPH
0xFA8E	0x53B2	#CJK UNIFIED IDEOGRAPH
0xFA8F	0x53DD	#CJK UNIFIED IDEOGRAPH
0xFA90	0xFA0E	#CJK COMPATIBILITY IDEOGRAPH
0xFA91	0x549C	#CJK UNIFIED IDEOGRAPH
0xFA92	0x548A	#CJK UNIFIED IDEOGRAPH
0xFA93	0x54A9	#CJK UNIFIED IDEOGRAPH
0xFA94	0x54FF	#CJK UNIFIED IDEOGRAPH
0xFA95	0x5586	#CJK UNIFIED IDEOGRAPH
0xFA96	0x5759	#CJK UNIFIED IDEOGRAPH
0xFA97	0x5765	#CJK UNIFIED IDEOGRAPH
0xFA98	0x57AC	#CJK UNIFIED IDEOGRAPH
0xFA99	0x57C8	#CJK UNIFIED IDEOGRAPH
0xFA9A	0x57C7	#CJK UNIFIED IDEOGRAPH
0xFA9B	0xFA0F	#CJK COMPATIBILITY IDEOGRAPH
0xFA9C	0xFA10	#CJK COMPATIBILITY IDEOGRAPH
0xFA9D	0x589E	#CJK UNIFIED IDEOGRAPH
0xFA9E	0x58B2	#CJK UNIFIED IDEOGRAPH
0xFA9F	0x590B	#CJK UNIFIED IDEOGRAPH
0xFAA0	0x5953	#CJK UNIFIED IDEOGRAPH
0xFAA1	0x595B	#CJK UNIFIED IDEOGRAPH
0xFAA2	0x595D	#CJK UNIFIED IDEOGRAPH
0xFAA3	0x5963	#CJK UNIFIED IDEOGRAPH
0xFAA4	0x59A4	#CJK UNIFIED IDEOGRAPH
0xFAA5	0x59BA	#CJK UNIFIED IDEOGRAPH
0xFAA6	0x5B56	#CJK UNIFIED IDEOGRAPH
0xFAA7	0x5BC0	#CJK UNIFIED IDEOGRAPH
0xFAA8	0x752F	#CJK UNIFIED IDEOGRAPH
0xFAA9	0x5BD8	#CJK UNIFIED IDEOGRAPH
0xFAAA	0x5BEC	#CJK UNIFIED IDEOGRAPH
0xFAAB	0x5C1E	#CJK UNIFIED IDEOGRAPH
0xFAAC	0x5CA6	#CJK UNIFIED IDEOGRAPH
0xFAAD	0x5CBA	#CJK UNIFIED IDEOGRAPH
0xFAAE	0x5CF5	#CJK UNIFIED IDEOGRAPH
0xFAAF	0x5D27	#CJK UNIFIED IDEOGRAPH
0xFAB0	0x5D53	#CJK UNIFIED IDEOGRAPH
0xFAB1	0xFA11	#CJK COMPATIBILITY IDEOGRAPH
0xFAB2	0x5D42	#CJK UNIFIED IDEOGRAPH
0xFAB3	0x5D6D	#CJK UNIFIED IDEOGRAPH
0xFAB4	0x5DB8	#CJK UNIFIED IDEOGRAPH
0xFAB5	0x5DB9	#CJK UNIFIED IDEOGRAPH
0xFAB6	0x5DD0	#CJK UNIFIED IDEOGRAPH
0xFAB7	0x5F21	#CJK UNIFIED IDEOGRAPH
0xFAB8	0x5F34	#CJK UNIFIED IDEOGRAPH
0xFAB9	0x5F67	#CJK UNIFIED IDEOGRAPH
0xFABA	0x5FB7	#CJK UNIFIED IDEOGRAPH
0xFABB	0x5FDE	#CJK UNIFIED IDEOGRAPH
0xFABC	0x605D	#CJK UNIFIED IDEOGRAPH
0xFABD	0x6085	#CJK UNIFIED IDEOGRAPH
0xFABE	0x608A	#CJK UNIFIED IDEOGRAPH
0xFABF	0x60DE	#CJK UNIFIED IDEOGRAPH
0xFAC0	0x60D5	#CJK UNIFIED IDEOGRAPH
0xFAC1	0x6120	#CJK UNIFIED IDEOGRAPH
0xFAC2	0x60F2	#CJK UNIFIED IDEOGRAPH
0xFAC3	0x6111	#CJK UNIFIED IDEOGRAPH
0xFAC4	0x6137	#CJK UNIFIED IDEOGRAPH
0xFAC5	0x6130	#CJK UNIFIED IDEOGRAPH
0xFAC6	0x6198	#CJK UNIFIED IDEOGRAPH
0xFAC7	0x6213	#CJK UNIFIED IDEOGRAPH
0xFAC8	0x62A6	#CJK UNIFIED IDEOGRAPH
0xFAC9	0x63F5	#CJK UNIFIED IDEOGRAPH
0xFACA	0x6460	#CJK UNIFIED IDEOGRAPH
0xFACB	0x649D	#CJK UNIFIED IDEOGRAPH
0xFACC	0x64CE	#CJK UNIFIED IDEOGRAPH
0xFACD	0x654E	#CJK UNIFIED IDEOGRAPH
0xFACE	0x6600	#CJK UNIFIED IDEOGRAPH
0xFACF	0x6615	#CJK UNIFIED IDEOGRAPH
0xFAD0	0x663B	#CJK UNIFIED IDEOGRAPH
0xFAD1	0x6609	#CJK UNIFIED IDEOGRAPH
0xFAD2	0x662E	#CJK UNIFIED IDEOGRAPH
0xFAD3	0x661E	#CJK UNIFIED IDEOGRAPH
0xFAD4	0x6624	#CJK UNIFIED IDEOGRAPH
0xFAD5	0x6665	#CJK UNIFIED IDEOGRAPH
0xFAD6	0x6657	#CJK UNIFIED IDEOGRAPH
0xFAD7	0x6659	#CJK UNIFIED IDEOGRAPH
0xFAD8	0xFA12	#CJK COMPATIBILITY IDEOGRAPH
0xFAD9	0x6673	#CJK UNIFIED IDEOGRAPH
0xFADA	0x6699	#CJK UNIFIED IDEOGRAPH
0xFADB	0x66A0	#CJK UNIFIED IDEOGRAPH
0xFADC	0x66B2	#CJK UNIFIED IDEOGRAPH
0xFADD	0x66BF	#CJK UNIFIED IDEOGRAPH
0xFADE	0x66FA	#CJK UNIFIED IDEOGRAPH
0xFADF	0x670E	#CJK UNIFIED IDEOGRAPH
0xFAE0	0xF929	#CJK COMPATIBILITY IDEOGRAPH
0xFAE1	0x6766	#CJK UNIFIED IDEOGRAPH
0xFAE2	0x67BB	#CJK UNIFIED IDEOGRAPH
0xFAE3	0x6852	#CJK UNIFIED IDEOGRAPH
0xFAE4	0x67C0	#CJK UNIFIED IDEOGRAPH
0xFAE5	0x6801	#CJK UNIFIED IDEOGRAPH
0xFAE6	0x6844	#CJK UNIFIED IDEOGRAPH
0xFAE7	0x68CF	#CJK UNIFIED IDEOGRAPH
0xFAE8	0xFA13	#CJK COMPATIBILITY IDEOGRAPH
0xFAE9	0x6968	#CJK UNIFIED IDEOGRAPH
0xFAEA	0xFA14	#CJK COMPATIBILITY IDEOGRAPH
0xFAEB	0x6998	#CJK UNIFIED IDEOGRAPH
0xFAEC	0x69E2	#CJK UNIFIED IDEOGRAPH
0xFAED	0x6A30	#CJK UNIFIED IDEOGRAPH
0xFAEE	0x6A6B	#CJK UNIFIED IDEOGRAPH
0xFAEF	0x6A46	#CJK UNIFIED IDEOGRAPH
0xFAF0	0x6A73	#CJK UNIFIED IDEOGRAPH
0xFAF1	0x6A7E	#CJK UNIFIED IDEOGRAPH
0xFAF2	0x6AE2	#CJK UNIFIED IDEOGRAPH
0xFAF3	0x6AE4	#CJK UNIFIED IDEOGRAPH
0xFAF4	0x6BD6	#CJK UNIFIED IDEOGRAPH
0xFAF5	0x6C3F	#CJK UNIFIED IDEOGRAPH
0xFAF6	0x6C5C	#CJK UNIFIED IDEOGRAPH
0xFAF7	0x6C86	#CJK UNIFIED IDEOGRAPH
0xFAF8	0x6C6F	#CJK UNIFIED IDEOGRAPH
0xFAF9	0x6CDA	#CJK UNIFIED IDEOGRAPH
0xFAFA	0x6D04	#CJK UNIFIED IDEOGRAPH
0xFAFB	0x6D87	#CJK UNIFIED IDEOGRAPH
0xFAFC	0x6D6F	#CJK UNIFIED IDEOGRAPH
0xFB40	0x6D96	#CJK UNIFIED IDEOGRAPH
0xFB41	0x6DAC	#CJK UNIFIED IDEOGRAPH
0xFB42	0x6DCF	#CJK UNIFIED IDEOGRAPH
0xFB43	0x6DF8	#CJK UNIFIED IDEOGRAPH
0xFB44	0x6DF2	#CJK UNIFIED IDEOGRAPH
0xFB45	0x6DFC	#CJK UNIFIED IDEOGRAPH
0xFB46	0x6E39	#CJK UNIFIED IDEOGRAPH
0xFB47	0x6E5C	#CJK UNIFIED IDEOGRAPH
0xFB48	0x6E27	#CJK UNIFIED IDEOGRAPH
0xFB49	0x6E3C	#CJK UNIFIED IDEOGRAPH
0xFB4A	0x6EBF	#CJK UNIFIED IDEOGRAPH
0xFB4B	0x6F88	#CJK UNIFIED IDEOGRAPH
0xFB4C	0x6FB5	#CJK UNIFIED IDEOGRAPH
0xFB4D	0x6FF5	#CJK UNIFIED IDEOGRAPH
0xFB4E	0x7005	#CJK UNIFIED IDEOGRAPH
0xFB4F	0x7007	#CJK UNIFIED IDEOGRAPH
0xFB50	0x7028	#CJK UNIFIED IDEOGRAPH
0xFB51	0x7085	#CJK UNIFIED IDEOGRAPH
0xFB52	0x70AB	#CJK UNIFIED IDEOGRAPH
0xFB53	0x710F	#CJK UNIFIED IDEOGRAPH
0xFB54	0x7104	#CJK UNIFIED IDEOGRAPH
0xFB55	0x715C	#CJK UNIFIED IDEOGRAPH
0xFB56	0x7146	#CJK UNIFIED IDEOGRAPH
0xFB57	0x7147	#CJK UNIFIED IDEOGRAPH
0xFB58	0xFA15	#CJK COMPATIBILITY IDEOGRAPH
0xFB59	0x71C1	#CJK UNIFIED IDEOGRAPH
0xFB5A	0x71FE	#CJK UNIFIED IDEOGRAPH
0xFB5B	0x72B1	#CJK UNIFIED IDEOGRAPH
0xFB5C	0x72BE	#CJK UNIFIED IDEOGRAPH
0xFB5D	0x7324	#CJK UNIFIED IDEOGRAPH
0xFB5E	0xFA16	#CJK COMPATIBILITY IDEOGRAPH
0xFB5F	0x7377	#CJK UNIFIED IDEOGRAPH
0xFB60	0x73BD	#CJK UNIFIED IDEOGRAPH
0xFB61	0x73C9	#CJK UNIFIED IDEOGRAPH
0xFB62	0x73D6	#CJK UNIFIED IDEOGRAPH
0xFB63	0x73E3	#CJK UNIFIED IDEOGRAPH
0xFB64	0x73D2	#CJK UNIFIED IDEOGRAPH
0xFB65	0x7407	#CJK UNIFIED IDEOGRAPH
0xFB66	0x73F5	#CJK UNIFIED IDEOGRAPH
0xFB67	0x7426	#CJK UNIFIED IDEOGRAPH
0xFB68	0x742A	#CJK UNIFIED IDEOGRAPH
0xFB69	0x7429	#CJK UNIFIED IDEOGRAPH
0xFB6A	0x742E	#CJK UNIFIED IDEOGRAPH
0xFB6B	0x7462	#CJK UNIFIED IDEOGRAPH
0xFB6C	0x7489	#CJK UNIFIED IDEOGRAPH
0xFB6D	0x749F	#CJK UNIFIED IDEOGRAPH
0xFB6E	0x7501	#CJK UNIFIED IDEOGRAPH
0xFB6F	0x756F	#CJK UNIFIED IDEOGRAPH
0xFB70	0x7682	#CJK UNIFIED IDEOGRAPH
0xFB71	0x769C	#CJK UNIFIED IDEOGRAPH
0xFB72	0x769E	#CJK UNIFIED IDEOGRAPH
0xFB73	0x769B	#CJK UNIFIED IDEOGRAPH
0xFB74	0x76A6	#CJK UNIFIED IDEOGRAPH
0xFB75	0xFA17	#CJK COMPATIBILITY IDEOGRAPH
0xFB76	0x7746	#CJK UNIFIED IDEOGRAPH
0xFB77	0x52AF	#CJK UNIFIED IDEOGRAPH
0xFB78	0x7821	#CJK UNIFIED IDEOGRAPH
0xFB79	0x784E	#CJK UNIFIED IDEOGRAPH
0xFB7A	0x7864	#CJK UNIFIED IDEOGRAPH
0xFB7B	0x787A	#CJK UNIFIED IDEOGRAPH
0xFB7C	0x7930	#CJK UNIFIED IDEOGRAPH
0xFB7D	0xFA18	#CJK COMPATIBILITY IDEOGRAPH
0xFB7E	0xFA19	#CJK COMPATIBILITY IDEOGRAPH
0xFB80	0xFA1A	#CJK COMPATIBILITY IDEOGRAPH
0xFB81	0x7994	#CJK UNIFIED IDEOGRAPH
0xFB82	0xFA1B	#CJK COMPATIBILITY IDEOGRAPH
0xFB83	0x799B	#CJK UNIFIED IDEOGRAPH
0xFB84	0x7AD1	#CJK UNIFIED IDEOGRAPH
0xFB85	0x7AE7	#CJK UNIFIED IDEOGRAPH
0xFB86	0xFA1C	#CJK COMPATIBILITY IDEOGRAPH
0xFB87	0x7AEB	#CJK UNIFIED IDEOGRAPH
0xFB88	0x7B9E	#CJK UNIFIED IDEOGRAPH
0xFB89	0xFA1D	#CJK COMPATIBILITY IDEOGRAPH
0xFB8A	0x7D48	#CJK UNIFIED IDEOGRAPH
0xFB8B	0x7D5C	#CJK UNIFIED IDEOGRAPH
0xFB8C	0x7DB7	#CJK UNIFIED IDEOGRAPH
0xFB8D	0x7DA0	#CJK UNIFIED IDEOGRAPH
0xFB8E	0x7DD6	#CJK UNIFIED IDEOGRAPH
0xFB8F	0x7E52	#CJK UNIFIED IDEOGRAPH
0xFB90	0x7F47	#CJK UNIFIED IDEOGRAPH
0xFB91	0x7FA1	#CJK UNIFIED IDEOGRAPH
0xFB92	0xFA1E	#CJK COMPATIBILITY IDEOGRAPH
0xFB93	0x8301	#CJK UNIFIED IDEOGRAPH
0xFB94	0x8362	#CJK UNIFIED IDEOGRAPH
0xFB95	0x837F	#CJK UNIFIED IDEOGRAPH
0xFB96	0x83C7	#CJK UNIFIED IDEOGRAPH
0xFB97	0x83F6	#CJK UNIFIED IDEOGRAPH
0xFB98	0x8448	#CJK UNIFIED IDEOGRAPH
0xFB99	0x84B4	#CJK UNIFIED IDEOGRAPH
0xFB9A	0x8553	#CJK UNIFIED IDEOGRAPH
0xFB9B	0x8559	#CJK UNIFIED IDEOGRAPH
0xFB9C	0x856B	#CJK UNIFIED IDEOGRAPH
0xFB9D	0xFA1F	#CJK COMPATIBILITY IDEOGRAPH
0xFB9E	0x85B0	#CJK UNIFIED IDEOGRAPH
0xFB9F	0xFA20	#CJK COMPATIBILITY IDEOGRAPH
0xFBA0	0xFA21	#CJK COMPATIBILITY IDEOGRAPH
0xFBA1	0x8807	#CJK UNIFIED IDEOGRAPH
0xFBA2	0x88F5	#CJK UNIFIED IDEOGRAPH
0xFBA3	0x8A12	#CJK UNIFIED IDEOGRAPH
0xFBA4	0x8A37	#CJK UNIFIED IDEOGRAPH
0xFBA5	0x8A79	#CJK UNIFIED IDEOGRAPH
0xFBA6	0x8AA7	#CJK UNIFIED IDEOGRAPH
0xFBA7	0x8ABE	#CJK UNIFIED IDEOGRAPH
0xFBA8	0x8ADF	#CJK UNIFIED IDEOGRAPH
0xFBA9	0xFA22	#CJK COMPATIBILITY IDEOGRAPH
0xFBAA	0x8AF6	#CJK UNIFIED IDEOGRAPH
0xFBAB	0x8B53	#CJK UNIFIED IDEOGRAPH
0xFBAC	0x8B7F	#CJK UNIFIED IDEOGRAPH
0xFBAD	0x8CF0	#CJK UNIFIED IDEOGRAPH
0xFBAE	0x8CF4	#CJK UNIFIED IDEOGRAPH
0xFBAF	0x8D12	#CJK UNIFIED IDEOGRAPH
0xFBB0	0x8D76	#CJK UNIFIED IDEOGRAPH
0xFBB1	0xFA23	#CJK COMPATIBILITY IDEOGRAPH
0xFBB2	0x8ECF	#CJK UNIFIED IDEOGRAPH
0xFBB3	0xFA24	#CJK COMPATIBILITY IDEOGRAPH
0xFBB4	0xFA25	#CJK COMPATIBILITY IDEOGRAPH
0xFBB5	0x9067	#CJK UNIFIED IDEOGRAPH
0xFBB6	0x90DE	#CJK UNIFIED IDEOGRAPH
0xFBB7	0xFA26	#CJK COMPATIBILITY IDEOGRAPH
0xFBB8	0x9115	#CJK UNIFIED IDEOGRAPH
0xFBB9	0x9127	#CJK UNIFIED IDEOGRAPH
0xFBBA	0x91DA	#CJK UNIFIED IDEOGRAPH
0xFBBB	0x91D7	#CJK UNIFIED IDEOGRAPH
0xFBBC	0x91DE	#CJK UNIFIED IDEOGRAPH
0xFBBD	0x91ED	#CJK UNIFIED IDEOGRAPH
0xFBBE	0x91EE	#CJK UNIFIED IDEOGRAPH
0xFBBF	0x91E4	#CJK UNIFIED IDEOGRAPH
0xFBC0	0x91E5	#CJK UNIFIED IDEOGRAPH
0xFBC1	0x9206	#CJK UNIFIED IDEOGRAPH
0xFBC2	0x9210	#CJK UNIFIED IDEOGRAPH
0xFBC3	0x920A	#CJK UNIFIED IDEOGRAPH
0xFBC4	0x923A	#CJK UNIFIED IDEOGRAPH
0xFBC5	0x9240	#CJK UNIFIED IDEOGRAPH
0xFBC6	0x923C	#CJK UNIFIED IDEOGRAPH
0xFBC7	0x924E	#CJK UNIFIED IDEOGRAPH
0xFBC8	0x9259	#CJK UNIFIED IDEOGRAPH
0xFBC9	0x9251	#CJK UNIFIED IDEOGRAPH
0xFBCA	0x9239	#CJK UNIFIED IDEOGRAPH
0xFBCB	0x9267	#CJK UNIFIED IDEOGRAPH
0xFBCC	0x92A7	#CJK UNIFIED IDEOGRAPH
0xFBCD	0x9277	#CJK UNIFIED IDEOGRAPH
0xFBCE	0x9278	#CJK UNIFIED IDEOGRAPH
0xFBCF	0x92E7	#CJK UNIFIED IDEOGRAPH
0xFBD0	0x92D7	#CJK UNIFIED IDEOGRAPH
0xFBD1	0x92D9	#CJK UNIFIED IDEOGRAPH
0xFBD2	0x92D0	#CJK UNIFIED IDEOGRAPH
0xFBD3	0xFA27	#CJK COMPATIBILITY IDEOGRAPH
0xFBD4	0x92D5	#CJK UNIFIED IDEOGRAPH
0xFBD5	0x92E0	#CJK UNIFIED IDEOGRAPH
0xFBD6	0x92D3	#CJK UNIFIED IDEOGRAPH
0xFBD7	0x9325	#CJK UNIFIED IDEOGRAPH
0xFBD8	0x9321	#CJK UNIFIED IDEOGRAPH
0xFBD9	0x92FB	#CJK UNIFIED IDEOGRAPH
0xFBDA	0xFA28	#CJK COMPATIBILITY IDEOGRAPH
0xFBDB	0x931E	#CJK UNIFIED IDEOGRAPH
0xFBDC	0x92FF	#CJK UNIFIED IDEOGRAPH
0xFBDD	0x931D	#CJK UNIFIED IDEOGRAPH
0xFBDE	0x9302	#CJK UNIFIED IDEOGRAPH
0xFBDF	0x9370	#CJK UNIFIED IDEOGRAPH
0xFBE0	0x9357	#CJK UNIFIED IDEOGRAPH
0xFBE1	0x93A4	#CJK UNIFIED IDEOGRAPH
0xFBE2	0x93C6	#CJK UNIFIED IDEOGRAPH
0xFBE3	0x93DE	#CJK UNIFIED IDEOGRAPH
0xFBE4	0x93F8	#CJK UNIFIED IDEOGRAPH
0xFBE5	0x9431	#CJK UNIFIED IDEOGRAPH
0xFBE6	0x9445	#CJK UNIFIED IDEOGRAPH
0xFBE7	0x9448	#CJK UNIFIED IDEOGRAPH
0xFBE8	0x9592	#CJK UNIFIED IDEOGRAPH
0xFBE9	0xF9DC	#CJK COMPATIBILITY IDEOGRAPH
0xFBEA	0xFA29	#CJK COMPATIBILITY IDEOGRAPH
0xFBEB	0x969D	#CJK UNIFIED IDEOGRAPH
0xFBEC	0x96AF	#CJK UNIFIED IDEOGRAPH
0xFBED	0x9733	#CJK UNIFIED IDEOGRAPH
0xFBEE	0x973B	#CJK UNIFIED IDEOGRAPH
0xFBEF	0x9743	#CJK UNIFIED IDEOGRAPH
0xFBF0	0x974D	#CJK UNIFIED IDEOGRAPH
0xFBF1	0x974F	#CJK UNIFIED IDEOGRAPH
0xFBF2	0x9751	#CJK UNIFIED IDEOGRAPH
0xFBF3	0x9755	#CJK UNIFIED IDEOGRAPH
0xFBF4	0x9857	#CJK UNIFIED IDEOGRAPH
0xFBF5	0x9865	#CJK UNIFIED IDEOGRAPH
0xFBF6	0xFA2A	#CJK COMPATIBILITY IDEOGRAPH
0xFBF7	0xFA2B	#CJK COMPATIBILITY IDEOGRAPH
0xFBF8	0x9927	#CJK UNIFIED IDEOGRAPH
0xFBF9	0xFA2C	#CJK COMPATIBILITY IDEOGRAPH
0xFBFA	0x999E	#CJK UNIFIED IDEOGRAPH
0xFBFB	0x9A4E	#CJK UNIFIED IDEOGRAPH
0xFBFC	0x9AD9	#CJK UNIFIED IDEOGRAPH
0xFC40	0x9ADC	#CJK UNIFIED IDEOGRAPH
0xFC41	0x9B75	#CJK UNIFIED IDEOGRAPH
0xFC42	0x9B72	#CJK UNIFIED IDEOGRAPH
0xFC43	0x9B8F	#CJK UNIFIED IDEOGRAPH
0xFC44	0x9BB1	#CJK UNIFIED IDEOGRAPH
0xFC45	0x9BBB	#CJK UNIFIED IDEOGRAPH
0xFC46	0x9C00	#CJK UNIFIED IDEOGRAPH
0xFC47	0x9D70	#CJK UNIFIED IDEOGRAPH
0xFC48	0x9D6B	#CJK UNIFIED IDEOGRAPH
0xFC49	0xFA2D	#CJK COMPATIBILITY IDEOGRAPH
0xFC4A	0x9E19	#CJK UNIFIED IDEOGRAPH
0xFC4B	0x9ED1	#CJK UNIFIED IDEOGRAPH

Added freshlib/data/_encodings/_sources/CP936.TXT.

more than 10,000 changes

Added freshlib/data/_encodings/_sources/CP949.TXT.

more than 10,000 changes

Added freshlib/data/_encodings/_sources/KOI8-R.TXT.













































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
# KOI8-R.TXT
# Date: 2016-01-04 23:05:00 GMT [KW]
# © 2016 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             KOI8-R (RFC1489) to Unicode
#	Unicode version:  3.0
#	Table version:    2.0
#	Table format:     Format A
#	Date:             18 August 1999 (header updated: 2016-January-04)
#	Authors:          Helmut Richter <richter@lrz.de>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       KOI8-R characters map into Unicode. The underlying document is the
#	mapping described in RFC 1489. No statements are made as to whether
#	this mapping is the same as the mapping defined as "Code Page 878"
#	with some vendors.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the KOI8-R code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in KOI8-R order.
#
#	Version history
#	1.0 version: created.
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		http://www.unicode.org/Public/MAPPINGS/
#
#	Any comments or problems, contact us at:
#       http://www.unicode.org/reporting.html
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x2500	#	BOX DRAWINGS LIGHT HORIZONTAL
0x81	0x2502	#	BOX DRAWINGS LIGHT VERTICAL
0x82	0x250C	#	BOX DRAWINGS LIGHT DOWN AND RIGHT
0x83	0x2510	#	BOX DRAWINGS LIGHT DOWN AND LEFT
0x84	0x2514	#	BOX DRAWINGS LIGHT UP AND RIGHT
0x85	0x2518	#	BOX DRAWINGS LIGHT UP AND LEFT
0x86	0x251C	#	BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0x87	0x2524	#	BOX DRAWINGS LIGHT VERTICAL AND LEFT
0x88	0x252C	#	BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0x89	0x2534	#	BOX DRAWINGS LIGHT UP AND HORIZONTAL
0x8A	0x253C	#	BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0x8B	0x2580	#	UPPER HALF BLOCK
0x8C	0x2584	#	LOWER HALF BLOCK
0x8D	0x2588	#	FULL BLOCK
0x8E	0x258C	#	LEFT HALF BLOCK
0x8F	0x2590	#	RIGHT HALF BLOCK
0x90	0x2591	#	LIGHT SHADE
0x91	0x2592	#	MEDIUM SHADE
0x92	0x2593	#	DARK SHADE
0x93	0x2320	#	TOP HALF INTEGRAL
0x94	0x25A0	#	BLACK SQUARE
0x95	0x2219	#	BULLET OPERATOR
0x96	0x221A	#	SQUARE ROOT
0x97	0x2248	#	ALMOST EQUAL TO
0x98	0x2264	#	LESS-THAN OR EQUAL TO
0x99	0x2265	#	GREATER-THAN OR EQUAL TO
0x9A	0x00A0	#	NO-BREAK SPACE
0x9B	0x2321	#	BOTTOM HALF INTEGRAL
0x9C	0x00B0	#	DEGREE SIGN
0x9D	0x00B2	#	SUPERSCRIPT TWO
0x9E	0x00B7	#	MIDDLE DOT
0x9F	0x00F7	#	DIVISION SIGN
0xA0	0x2550	#	BOX DRAWINGS DOUBLE HORIZONTAL
0xA1	0x2551	#	BOX DRAWINGS DOUBLE VERTICAL
0xA2	0x2552	#	BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
0xA3	0x0451	#	CYRILLIC SMALL LETTER IO
0xA4	0x2553	#	BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
0xA5	0x2554	#	BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xA6	0x2555	#	BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
0xA7	0x2556	#	BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
0xA8	0x2557	#	BOX DRAWINGS DOUBLE DOWN AND LEFT
0xA9	0x2558	#	BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
0xAA	0x2559	#	BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
0xAB	0x255A	#	BOX DRAWINGS DOUBLE UP AND RIGHT
0xAC	0x255B	#	BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
0xAD	0x255C	#	BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
0xAE	0x255D	#	BOX DRAWINGS DOUBLE UP AND LEFT
0xAF	0x255E	#	BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
0xB0	0x255F	#	BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
0xB1	0x2560	#	BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xB2	0x2561	#	BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
0xB3	0x0401	#	CYRILLIC CAPITAL LETTER IO
0xB4	0x2562	#	BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
0xB5	0x2563	#	BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xB6	0x2564	#	BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
0xB7	0x2565	#	BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
0xB8	0x2566	#	BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xB9	0x2567	#	BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
0xBA	0x2568	#	BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
0xBB	0x2569	#	BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xBC	0x256A	#	BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
0xBD	0x256B	#	BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
0xBE	0x256C	#	BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xBF	0x00A9	#	COPYRIGHT SIGN
0xC0	0x044E	#	CYRILLIC SMALL LETTER YU
0xC1	0x0430	#	CYRILLIC SMALL LETTER A
0xC2	0x0431	#	CYRILLIC SMALL LETTER BE
0xC3	0x0446	#	CYRILLIC SMALL LETTER TSE
0xC4	0x0434	#	CYRILLIC SMALL LETTER DE
0xC5	0x0435	#	CYRILLIC SMALL LETTER IE
0xC6	0x0444	#	CYRILLIC SMALL LETTER EF
0xC7	0x0433	#	CYRILLIC SMALL LETTER GHE
0xC8	0x0445	#	CYRILLIC SMALL LETTER HA
0xC9	0x0438	#	CYRILLIC SMALL LETTER I
0xCA	0x0439	#	CYRILLIC SMALL LETTER SHORT I
0xCB	0x043A	#	CYRILLIC SMALL LETTER KA
0xCC	0x043B	#	CYRILLIC SMALL LETTER EL
0xCD	0x043C	#	CYRILLIC SMALL LETTER EM
0xCE	0x043D	#	CYRILLIC SMALL LETTER EN
0xCF	0x043E	#	CYRILLIC SMALL LETTER O
0xD0	0x043F	#	CYRILLIC SMALL LETTER PE
0xD1	0x044F	#	CYRILLIC SMALL LETTER YA
0xD2	0x0440	#	CYRILLIC SMALL LETTER ER
0xD3	0x0441	#	CYRILLIC SMALL LETTER ES
0xD4	0x0442	#	CYRILLIC SMALL LETTER TE
0xD5	0x0443	#	CYRILLIC SMALL LETTER U
0xD6	0x0436	#	CYRILLIC SMALL LETTER ZHE
0xD7	0x0432	#	CYRILLIC SMALL LETTER VE
0xD8	0x044C	#	CYRILLIC SMALL LETTER SOFT SIGN
0xD9	0x044B	#	CYRILLIC SMALL LETTER YERU
0xDA	0x0437	#	CYRILLIC SMALL LETTER ZE
0xDB	0x0448	#	CYRILLIC SMALL LETTER SHA
0xDC	0x044D	#	CYRILLIC SMALL LETTER E
0xDD	0x0449	#	CYRILLIC SMALL LETTER SHCHA
0xDE	0x0447	#	CYRILLIC SMALL LETTER CHE
0xDF	0x044A	#	CYRILLIC SMALL LETTER HARD SIGN
0xE0	0x042E	#	CYRILLIC CAPITAL LETTER YU
0xE1	0x0410	#	CYRILLIC CAPITAL LETTER A
0xE2	0x0411	#	CYRILLIC CAPITAL LETTER BE
0xE3	0x0426	#	CYRILLIC CAPITAL LETTER TSE
0xE4	0x0414	#	CYRILLIC CAPITAL LETTER DE
0xE5	0x0415	#	CYRILLIC CAPITAL LETTER IE
0xE6	0x0424	#	CYRILLIC CAPITAL LETTER EF
0xE7	0x0413	#	CYRILLIC CAPITAL LETTER GHE
0xE8	0x0425	#	CYRILLIC CAPITAL LETTER HA
0xE9	0x0418	#	CYRILLIC CAPITAL LETTER I
0xEA	0x0419	#	CYRILLIC CAPITAL LETTER SHORT I
0xEB	0x041A	#	CYRILLIC CAPITAL LETTER KA
0xEC	0x041B	#	CYRILLIC CAPITAL LETTER EL
0xED	0x041C	#	CYRILLIC CAPITAL LETTER EM
0xEE	0x041D	#	CYRILLIC CAPITAL LETTER EN
0xEF	0x041E	#	CYRILLIC CAPITAL LETTER O
0xF0	0x041F	#	CYRILLIC CAPITAL LETTER PE
0xF1	0x042F	#	CYRILLIC CAPITAL LETTER YA
0xF2	0x0420	#	CYRILLIC CAPITAL LETTER ER
0xF3	0x0421	#	CYRILLIC CAPITAL LETTER ES
0xF4	0x0422	#	CYRILLIC CAPITAL LETTER TE
0xF5	0x0423	#	CYRILLIC CAPITAL LETTER U
0xF6	0x0416	#	CYRILLIC CAPITAL LETTER ZHE
0xF7	0x0412	#	CYRILLIC CAPITAL LETTER VE
0xF8	0x042C	#	CYRILLIC CAPITAL LETTER SOFT SIGN
0xF9	0x042B	#	CYRILLIC CAPITAL LETTER YERU
0xFA	0x0417	#	CYRILLIC CAPITAL LETTER ZE
0xFB	0x0428	#	CYRILLIC CAPITAL LETTER SHA
0xFC	0x042D	#	CYRILLIC CAPITAL LETTER E
0xFD	0x0429	#	CYRILLIC CAPITAL LETTER SHCHA
0xFE	0x0427	#	CYRILLIC CAPITAL LETTER CHE
0xFF	0x042A	#	CYRILLIC CAPITAL LETTER HARD SIGN

Added freshlib/data/_encodings/_sources/KOI8-U.TXT.



























































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
# KOI8-U.TXT
# Date: 2016-01-04 23:09:00 GMT [KW]
# © 2016 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#
#	Name:             KOI8-U (RFC2319) to Unicode
#	Unicode version:  5.1
#	Table version:    2.0
#	Table format:     Format A
#	Date:             13 October 2008 (header updated: 2016-January-04)
#	Authors:          Philippe Verdy <verdy_p AT wanadoo.fr>,
#	                  Helmut Richter <richter@lrz.de>
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#	KOI8-U characters map into Unicode. The underlying document is the
#	mapping described in RFC 2319. No statements are made as to whether
#	this mapping is the same as the mapping defined as "Code Page 878"
#	with some vendors.
#
#	The KOI8-U (RFC2319) encoding is a variant based on KOI8-R (RFC1489),
#	where the support for four additional Cyrillic letters was added (both small
#	and capital letters), replacing 8 box-drawing characters. It is still widely
#	used to encode texts in Ukrainian, Byelorussian and Bulgarian.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the KOI8-U code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in KOI8-U order.
#
#	Version history
#	1.0 version: created.
#   2.0 version: updates to copyright notice and terms of use; no
#       changes to character mappings
#
#	Updated versions of this file may be found in:
#		<http://www.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact the Unicode Consortium at:
#	        <http://www.unicode.org/reporting.html>
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x2500	#	BOX DRAWINGS LIGHT HORIZONTAL
0x81	0x2502	#	BOX DRAWINGS LIGHT VERTICAL
0x82	0x250C	#	BOX DRAWINGS LIGHT DOWN AND RIGHT
0x83	0x2510	#	BOX DRAWINGS LIGHT DOWN AND LEFT
0x84	0x2514	#	BOX DRAWINGS LIGHT UP AND RIGHT
0x85	0x2518	#	BOX DRAWINGS LIGHT UP AND LEFT
0x86	0x251C	#	BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0x87	0x2524	#	BOX DRAWINGS LIGHT VERTICAL AND LEFT
0x88	0x252C	#	BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0x89	0x2534	#	BOX DRAWINGS LIGHT UP AND HORIZONTAL
0x8A	0x253C	#	BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0x8B	0x2580	#	UPPER HALF BLOCK
0x8C	0x2584	#	LOWER HALF BLOCK
0x8D	0x2588	#	FULL BLOCK
0x8E	0x258C	#	LEFT HALF BLOCK
0x8F	0x2590	#	RIGHT HALF BLOCK
0x90	0x2591	#	LIGHT SHADE
0x91	0x2592	#	MEDIUM SHADE
0x92	0x2593	#	DARK SHADE
0x93	0x2320	#	TOP HALF INTEGRAL
0x94	0x25A0	#	BLACK SQUARE
0x95	0x2219	#	BULLET OPERATOR
0x96	0x221A	#	SQUARE ROOT
0x97	0x2248	#	ALMOST EQUAL TO
0x98	0x2264	#	LESS-THAN OR EQUAL TO
0x99	0x2265	#	GREATER-THAN OR EQUAL TO
0x9A	0x00A0	#	NO-BREAK SPACE
0x9B	0x2321	#	BOTTOM HALF INTEGRAL
0x9C	0x00B0	#	DEGREE SIGN
0x9D	0x00B2	#	SUPERSCRIPT TWO
0x9E	0x00B7	#	MIDDLE DOT
0x9F	0x00F7	#	DIVISION SIGN
0xA0	0x2550	#	BOX DRAWINGS DOUBLE HORIZONTAL
0xA1	0x2551	#	BOX DRAWINGS DOUBLE VERTICAL
0xA2	0x2552	#	BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
0xA3	0x0451	#	CYRILLIC SMALL LETTER IO
0xA4	0x0454	#	CYRILLIC SMALL LETTER UKRAINIAN IE
0xA5	0x2554	#	BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xA6	0x0456	#	CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
0xA7	0x0457	#	CYRILLIC SMALL LETTER YI (UKRAINIAN)
0xA8	0x2557	#	BOX DRAWINGS DOUBLE DOWN AND LEFT
0xA9	0x2558	#	BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
0xAA	0x2559	#	BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
0xAB	0x255A	#	BOX DRAWINGS DOUBLE UP AND RIGHT
0xAC	0x255B	#	BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
0xAD	0x0491	#	CYRILLIC SMALL LETTER GHE WITH UPTURN
0xAE	0x255D	#	BOX DRAWINGS DOUBLE UP AND LEFT
0xAF	0x255E	#	BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
0xB0	0x255F	#	BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
0xB1	0x2560	#	BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xB2	0x2561	#	BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
0xB3	0x0401	#	CYRILLIC CAPITAL LETTER IO
0xB4	0x0404	#	CYRILLIC CAPITAL LETTER UKRAINIAN IE
0xB5	0x2563	#	BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xB6	0x0406	#	CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
0xB7	0x0407	#	CYRILLIC CAPITAL LETTER YI (UKRAINIAN)
0xB8	0x2566	#	BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xB9	0x2567	#	BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
0xBA	0x2568	#	BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
0xBB	0x2569	#	BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xBC	0x256A	#	BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
0xBD	0x0490	#	CYRILLIC CAPITAL LETTER GHE WITH UPTURN
0xBE	0x256C	#	BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xBF	0x00A9	#	COPYRIGHT SIGN
0xC0	0x044E	#	CYRILLIC SMALL LETTER YU
0xC1	0x0430	#	CYRILLIC SMALL LETTER A
0xC2	0x0431	#	CYRILLIC SMALL LETTER BE
0xC3	0x0446	#	CYRILLIC SMALL LETTER TSE
0xC4	0x0434	#	CYRILLIC SMALL LETTER DE
0xC5	0x0435	#	CYRILLIC SMALL LETTER IE
0xC6	0x0444	#	CYRILLIC SMALL LETTER EF
0xC7	0x0433	#	CYRILLIC SMALL LETTER GHE
0xC8	0x0445	#	CYRILLIC SMALL LETTER HA
0xC9	0x0438	#	CYRILLIC SMALL LETTER I
0xCA	0x0439	#	CYRILLIC SMALL LETTER SHORT I
0xCB	0x043A	#	CYRILLIC SMALL LETTER KA
0xCC	0x043B	#	CYRILLIC SMALL LETTER EL
0xCD	0x043C	#	CYRILLIC SMALL LETTER EM
0xCE	0x043D	#	CYRILLIC SMALL LETTER EN
0xCF	0x043E	#	CYRILLIC SMALL LETTER O
0xD0	0x043F	#	CYRILLIC SMALL LETTER PE
0xD1	0x044F	#	CYRILLIC SMALL LETTER YA
0xD2	0x0440	#	CYRILLIC SMALL LETTER ER
0xD3	0x0441	#	CYRILLIC SMALL LETTER ES
0xD4	0x0442	#	CYRILLIC SMALL LETTER TE
0xD5	0x0443	#	CYRILLIC SMALL LETTER U
0xD6	0x0436	#	CYRILLIC SMALL LETTER ZHE
0xD7	0x0432	#	CYRILLIC SMALL LETTER VE
0xD8	0x044C	#	CYRILLIC SMALL LETTER SOFT SIGN
0xD9	0x044B	#	CYRILLIC SMALL LETTER YERU
0xDA	0x0437	#	CYRILLIC SMALL LETTER ZE
0xDB	0x0448	#	CYRILLIC SMALL LETTER SHA
0xDC	0x044D	#	CYRILLIC SMALL LETTER E
0xDD	0x0449	#	CYRILLIC SMALL LETTER SHCHA
0xDE	0x0447	#	CYRILLIC SMALL LETTER CHE
0xDF	0x044A	#	CYRILLIC SMALL LETTER HARD SIGN
0xE0	0x042E	#	CYRILLIC CAPITAL LETTER YU
0xE1	0x0410	#	CYRILLIC CAPITAL LETTER A
0xE2	0x0411	#	CYRILLIC CAPITAL LETTER BE
0xE3	0x0426	#	CYRILLIC CAPITAL LETTER TSE
0xE4	0x0414	#	CYRILLIC CAPITAL LETTER DE
0xE5	0x0415	#	CYRILLIC CAPITAL LETTER IE
0xE6	0x0424	#	CYRILLIC CAPITAL LETTER EF
0xE7	0x0413	#	CYRILLIC CAPITAL LETTER GHE
0xE8	0x0425	#	CYRILLIC CAPITAL LETTER HA
0xE9	0x0418	#	CYRILLIC CAPITAL LETTER I
0xEA	0x0419	#	CYRILLIC CAPITAL LETTER SHORT I
0xEB	0x041A	#	CYRILLIC CAPITAL LETTER KA
0xEC	0x041B	#	CYRILLIC CAPITAL LETTER EL
0xED	0x041C	#	CYRILLIC CAPITAL LETTER EM
0xEE	0x041D	#	CYRILLIC CAPITAL LETTER EN
0xEF	0x041E	#	CYRILLIC CAPITAL LETTER O
0xF0	0x041F	#	CYRILLIC CAPITAL LETTER PE
0xF1	0x042F	#	CYRILLIC CAPITAL LETTER YA
0xF2	0x0420	#	CYRILLIC CAPITAL LETTER ER
0xF3	0x0421	#	CYRILLIC CAPITAL LETTER ES
0xF4	0x0422	#	CYRILLIC CAPITAL LETTER TE
0xF5	0x0423	#	CYRILLIC CAPITAL LETTER U
0xF6	0x0416	#	CYRILLIC CAPITAL LETTER ZHE
0xF7	0x0412	#	CYRILLIC CAPITAL LETTER VE
0xF8	0x042C	#	CYRILLIC CAPITAL LETTER SOFT SIGN
0xF9	0x042B	#	CYRILLIC CAPITAL LETTER YERU
0xFA	0x0417	#	CYRILLIC CAPITAL LETTER ZE
0xFB	0x0428	#	CYRILLIC CAPITAL LETTER SHA
0xFC	0x042D	#	CYRILLIC CAPITAL LETTER E
0xFD	0x0429	#	CYRILLIC CAPITAL LETTER SHCHA
0xFE	0x0427	#	CYRILLIC CAPITAL LETTER CHE
0xFF	0x042A	#	CYRILLIC CAPITAL LETTER HARD SIGN

Added freshlib/data/_encodings/_sources/KPS9566.TXT.

more than 10,000 changes

Added freshlib/data/_encodings/_sources/NEXTSTEP.TXT.



























































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
172
173
#
#       Name:             NextStep Encoding to Unicode
#       Unicode version:  1.1
#       Table version:    0.1
#       Table format:     Format A
#       Date:             1999 September 23
#       Authors:          Rick McGowan
#
#       Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       NextStep Encoding characters map into Unicode.  Since the first
#	128 characters (0x0 - 0x7f) are identical to ASCII and Unicode,
#	this table only maps the NextStep range from 0x80 - 0xFF.
#
#	This file is provided for historical reference only and pertains
#	to NextStep and OpenStep products shipped prior to the aquisition
#	of NeXT by Apple Computer, Inc.  See http://www.apple.com for
#	further information.
#
#       Format:  Three tab-separated columns
#                Column #1 is the NextStep code (in hex as 0xXX)
#                Column #2 is the Unicode (in hex as 0xXXXX)
#                Column #3 NextStep name, Unicode name (follows a comment sign, '#')
#
#       The entries are in NextStep order
#
#       Any comments or problems, contact info@unicode.org
#
0x80	0x00a0	# NO-BREAK SPACE
0x81	0x00c0	# LATIN CAPITAL LETTER A WITH GRAVE
0x82	0x00c1	# LATIN CAPITAL LETTER A WITH ACUTE
0x83	0x00c2	# LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0x84	0x00c3	# LATIN CAPITAL LETTER A WITH TILDE
0x85	0x00c4	# LATIN CAPITAL LETTER A WITH DIAERESIS
0x86	0x00c5	# LATIN CAPITAL LETTER A WITH RING
0x87	0x00c7	# LATIN CAPITAL LETTER C WITH CEDILLA
0x88	0x00c8	# LATIN CAPITAL LETTER E WITH GRAVE
0x89	0x00c9	# LATIN CAPITAL LETTER E WITH ACUTE
0x8a	0x00ca	# LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0x8b	0x00cb	# LATIN CAPITAL LETTER E WITH DIAERESIS
0x8c	0x00cc	# LATIN CAPITAL LETTER I WITH GRAVE
0x8d	0x00cd	# LATIN CAPITAL LETTER I WITH ACUTE
0x8e	0x00ce	# LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0x8f	0x00cf	# LATIN CAPITAL LETTER I WITH DIAERESIS
0x90	0x00d0	# LATIN CAPITAL LETTER ETH
0x91	0x00d1	# LATIN CAPITAL LETTER N WITH TILDE
0x92	0x00d2	# LATIN CAPITAL LETTER O WITH GRAVE
0x93	0x00d3	# LATIN CAPITAL LETTER O WITH ACUTE
0x94	0x00d4	# LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0x95	0x00d5	# LATIN CAPITAL LETTER O WITH TILDE
0x96	0x00d6	# LATIN CAPITAL LETTER O WITH DIAERESIS
0x97	0x00d9	# LATIN CAPITAL LETTER U WITH GRAVE
0x98	0x00da	# LATIN CAPITAL LETTER U WITH ACUTE
0x99	0x00db	# LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0x9a	0x00dc	# LATIN CAPITAL LETTER U WITH DIAERESIS
0x9b	0x00dd	# LATIN CAPITAL LETTER Y WITH ACUTE
0x9c	0x00de	# LATIN CAPITAL LETTER THORN
0x9d	0x00b5	# MICRO SIGN 
0x9e	0x00d7	# MULTIPLICATION SIGN
0x9f	0x00f7	# DIVISION SIGN
0xa0	0x00a9	# COPYRIGHT SIGN
0xa1	0x00a1	# INVERTED EXCLAMATION MARK
0xa2	0x00a2	# CENT SIGN
0xa3	0x00a3	# POUND SIGN
0xa4	0x2044	# FRACTION SLASH
0xa5	0x00a5	# YEN SIGN
0xa6	0x0192	# LATIN SMALL LETTER F WITH HOOK
0xa7	0x00a7	# SECTION SIGN
0xa8	0x00a4	# CURRENCY SIGN
0xa9	0x2019	# RIGHT SINGLE QUOTATION MARK
0xaa	0x201c	# LEFT DOUBLE QUOTATION MARK
0xab	0x00ab	# LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xac	0x2039	# SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0xad	0x203a	# SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0xae	0xfb01	# LATIN SMALL LIGATURE FI
0xaf	0xfb02	# LATIN SMALL LIGATURE FL
0xb0	0x00ae	# REGISTERED SIGN
0xb1	0x2013	# EN DASH
0xb2	0x2020	# DAGGER
0xb3	0x2021	# DOUBLE DAGGER
0xb4	0x00b7	# MIDDLE DOT
0xb5	0x00a6	# BROKEN BAR
0xb6	0x00b6	# PILCROW SIGN
0xb7	0x2022	# BULLET
0xb8	0x201a	# SINGLE LOW-9 QUOTATION MARK
0xb9	0x201e	# DOUBLE LOW-9 QUOTATION MARK
0xba	0x201d	# RIGHT DOUBLE QUOTATION MARK
0xbb	0x00bb	# RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xbc	0x2026	# HORIZONTAL ELLIPSIS
0xbd	0x2030	# PER MILLE SIGN
0xbe	0x00ac	# NOT SIGN
0xbf	0x00bf	# INVERTED QUESTION MARK
0xc0	0x00b9	# SUPERSCRIPT ONE
0xc1	0x02cb	# MODIFIER LETTER GRAVE ACCENT
0xc2	0x00b4	# ACUTE ACCENT
0xc3	0x02c6	# MODIFIER LETTER CIRCUMFLEX ACCENT
0xc4	0x02dc	# SMALL TILDE
0xc5	0x00af	# MACRON
0xc6	0x02d8	# BREVE
0xc7	0x02d9	# DOT ABOVE
0xc8	0x00a8	# DIAERESIS
0xc9	0x00b2	# SUPERSCRIPT TWO
0xca	0x02da	# RING ABOVE
0xcb	0x00b8	# CEDILLA
0xcc	0x00b3	# SUPERSCRIPT THREE
0xcd	0x02dd	# DOUBLE ACUTE ACCENT
0xce	0x02db	# OGONEK
0xcf	0x02c7	# CARON
0xd0	0x2014	# EM DASH
0xd1	0x00b1	# PLUS-MINUS SIGN
0xd2	0x00bc	# VULGAR FRACTION ONE QUARTER
0xd3	0x00bd	# VULGAR FRACTION ONE HALF
0xd4	0x00be	# VULGAR FRACTION THREE QUARTERS
0xd5	0x00e0	# LATIN SMALL LETTER A WITH GRAVE
0xd6	0x00e1	# LATIN SMALL LETTER A WITH ACUTE
0xd7	0x00e2	# LATIN SMALL LETTER A WITH CIRCUMFLEX
0xd8	0x00e3	# LATIN SMALL LETTER A WITH TILDE
0xd9	0x00e4	# LATIN SMALL LETTER A WITH DIAERESIS
0xda	0x00e5	# LATIN SMALL LETTER A WITH RING ABOVE
0xdb	0x00e7	# LATIN SMALL LETTER C WITH CEDILLA
0xdc	0x00e8	# LATIN SMALL LETTER E WITH GRAVE
0xdd	0x00e9	# LATIN SMALL LETTER E WITH ACUTE
0xde	0x00ea	# LATIN SMALL LETTER E WITH CIRCUMFLEX
0xdf	0x00eb	# LATIN SMALL LETTER E WITH DIAERESIS
0xe0	0x00ec	# LATIN SMALL LETTER I WITH GRAVE
0xe1	0x00c6	# LATIN CAPITAL LETTER AE
0xe2	0x00ed	# LATIN SMALL LETTER I WITH ACUTE
0xe3	0x00aa	# FEMININE ORDINAL INDICATOR
0xe4	0x00ee	# LATIN SMALL LETTER I WITH CIRCUMFLEX
0xe5	0x00ef	# LATIN SMALL LETTER I WITH DIAERESIS
0xe6	0x00f0	# LATIN SMALL LETTER ETH
0xe7	0x00f1	# LATIN SMALL LETTER N WITH TILDE
0xe8	0x0141	# LATIN CAPITAL LETTER L WITH STROKE
0xe9	0x00d8	# LATIN CAPITAL LETTER O WITH STROKE
0xea	0x0152	# LATIN CAPITAL LIGATURE OE
0xeb	0x00ba	# MASCULINE ORDINAL INDICATOR
0xec	0x00f2	# LATIN SMALL LETTER O WITH GRAVE
0xed	0x00f3	# LATIN SMALL LETTER O WITH ACUTE
0xee	0x00f4	# LATIN SMALL LETTER O WITH CIRCUMFLEX
0xef	0x00f5	# LATIN SMALL LETTER O WITH TILDE
0xf0	0x00f6	# LATIN SMALL LETTER O WITH DIAERESIS
0xf1	0x00e6	# LATIN SMALL LETTER AE
0xf2	0x00f9	# LATIN SMALL LETTER U WITH GRAVE
0xf3	0x00fa	# LATIN SMALL LETTER U WITH ACUTE
0xf4	0x00fb	# LATIN SMALL LETTER U WITH CIRCUMFLEX
0xf5	0x0131	# LATIN SMALL LETTER DOTLESS I
0xf6	0x00fc	# LATIN SMALL LETTER U WITH DIAERESIS
0xf7	0x00fd	# LATIN SMALL LETTER Y WITH ACUTE
0xf8	0x0142	# LATIN SMALL LETTER L WITH STROKE
0xf9	0x00f8	# LATIN SMALL LETTER O WITH STROKE
0xfa	0x0153	# LATIN SMALL LIGATURE OE
0xfb	0x00df	# LATIN SMALL LETTER SHARP S
0xfc	0x00fe	# LATIN SMALL LETTER THORN
0xfd	0x00ff	# LATIN SMALL LETTER Y WITH DIAERESIS
0xfe	0xfffd	# .notdef, REPLACEMENT CHARACTER
0xff	0xfffd	# .notdef, REPLACEMENT CHARACTER

Added freshlib/data/_encodings/build.

cannot compute difference between binary files

Added freshlib/data/_encodings/buildall.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

echo "module 'Encoding tables'" > ./encodings.inc

for i in _sources/*.TXT; do
  dst=$(basename "$i" .TXT)
  lbl=$(echo -n $dst | tr '-' '_')

  if [[ $lbl =~ ^[0-9] ]]; then
    lbl="ISO$lbl"
  fi

  ./build "$i" "./$dst.tbl"

  echo "EncodingTable $lbl, './$dst.tbl'" >> ./encodings.inc
done

echo "endmodule" >> ./encodings.inc

Added freshlib/data/_encodings/encodings.inc.

















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
module 'Encoding tables'
EncodingTable ISO8859_10, './8859-10.tbl'
EncodingTable ISO8859_11, './8859-11.tbl'
EncodingTable ISO8859_13, './8859-13.tbl'
EncodingTable ISO8859_14, './8859-14.tbl'
EncodingTable ISO8859_15, './8859-15.tbl'
EncodingTable ISO8859_16, './8859-16.tbl'
EncodingTable ISO8859_1, './8859-1.tbl'
EncodingTable ISO8859_2, './8859-2.tbl'
EncodingTable ISO8859_3, './8859-3.tbl'
EncodingTable ISO8859_4, './8859-4.tbl'
EncodingTable ISO8859_5, './8859-5.tbl'
EncodingTable ISO8859_6, './8859-6.tbl'
EncodingTable ISO8859_7, './8859-7.tbl'
EncodingTable ISO8859_8, './8859-8.tbl'
EncodingTable ISO8859_9, './8859-9.tbl'
EncodingTable CP037, './CP037.tbl'
EncodingTable CP1006, './CP1006.tbl'
EncodingTable CP1026, './CP1026.tbl'
EncodingTable CP1250, './CP1250.tbl'
EncodingTable CP1251, './CP1251.tbl'
EncodingTable CP1252, './CP1252.tbl'
EncodingTable CP1253, './CP1253.tbl'
EncodingTable CP1254, './CP1254.tbl'
EncodingTable CP1255, './CP1255.tbl'
EncodingTable CP1256, './CP1256.tbl'
EncodingTable CP1257, './CP1257.tbl'
EncodingTable CP1258, './CP1258.tbl'
EncodingTable CP424, './CP424.tbl'
EncodingTable CP437, './CP437.tbl'
EncodingTable CP500, './CP500.tbl'
EncodingTable CP737, './CP737.tbl'
EncodingTable CP775, './CP775.tbl'
EncodingTable CP850, './CP850.tbl'
EncodingTable CP852, './CP852.tbl'
EncodingTable CP855, './CP855.tbl'
EncodingTable CP856, './CP856.tbl'
EncodingTable CP857, './CP857.tbl'
EncodingTable CP860, './CP860.tbl'
EncodingTable CP861, './CP861.tbl'
EncodingTable CP862, './CP862.tbl'
EncodingTable CP863, './CP863.tbl'
EncodingTable CP864, './CP864.tbl'
EncodingTable CP865, './CP865.tbl'
EncodingTable CP866, './CP866.tbl'
EncodingTable CP869, './CP869.tbl'
EncodingTable CP874, './CP874.tbl'
EncodingTable CP875, './CP875.tbl'
EncodingTable CP932, './CP932.tbl'
EncodingTable CP936, './CP936.tbl'
EncodingTable CP949, './CP949.tbl'
EncodingTable KOI8_R, './KOI8-R.tbl'
EncodingTable KOI8_U, './KOI8-U.tbl'
EncodingTable KPS9566, './KPS9566.tbl'
EncodingTable NEXTSTEP, './NEXTSTEP.tbl'
endmodule

Added freshlib/data/_encodings/tools/BuildEncodingTable.fpz.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
;FreshProject_v3
Compiler.Memory = 300000
Compiler.BinaryNameAuto = 0
Compiler.BinaryName = "../build"
Compiler.MainFile = "build.asm"
Aliases.TargetOS = "Linux|Win32|KolibriOS"
ProjectTree.Documents/ = 2

Added freshlib/data/_encodings/tools/build.asm.











































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType console

include "%lib%/freshlib.asm"

; include your includes here.

start:
        InitializeAll

        stdcall GetCmdArguments
        jc      .error_arg

        mov     edi, eax

.check_params:
        cmp     [edi+TArray.count], 2
        jb      .error_arg

        stdcall FileOpen, [edi+TArray.array+4]
        jc      .file_not_found

        mov     [hSourceFile], eax

        call    InitArrays

.line_loop:
        stdcall FileReadLine, [hSourceFile]
        jc      .error_read

        test    eax, eax
        jz      .end_of_file

        stdcall ProcessOneLine, eax
        stdcall StrDel, eax

        jmp     .line_loop


.end_of_file:
        stdcall FileClose, ebx

; sort the second table
        xor     ecx, ecx

.outer:
        lea     ebx, [ecx+1]
.inner:
        mov     ax, [Table2+2*ecx]
        cmp     ax, [Table2+2*ebx]
        jb      .next

        xchg    ax, [Table2+2*ebx]
        mov     [Table2+2*ecx], ax

        mov     al, [Table3+ecx]
        xchg    al, [Table3+ebx]
        mov     [Table3+ecx], al

.next:
        inc     ebx
        cmp     ebx, $80
        jne     .inner

        inc     ecx
        cmp     ecx, $80-1
        jne     .outer


        cmp     [edi+TArray.count], 3
        jb      .default_file

        mov     eax, [edi+TArray.array+8]
        jmp     .save

.default_file:
        mov     eax, cDefaultOutput

.save:
        stdcall SaveBinaryFile, eax, Table1, 384
        stdcall ListFree, edi, StrDel
        jmp     .finish

cDefaultOutput text 'table.bin'


.error_read:
        stdcall FileWriteString, [STDERR], <'Source file read error.', 13, 10>
        jmp     .end_of_file


.file_not_found:
        stdcall FileWriteString, [STDERR], <'Source file not found.', 13, 10>
        jmp     .finish

.error_arg:
        stdcall FileWriteString, [STDERR], <'Use: build SOURCE DESTINATION', 13, 10>


.finish:
        FinalizeAll
        stdcall TerminateAll, 0



proc ProcessOneLine, .hString
begin
        pushad

;        stdcall FileWriteString, [STDOUT], [.hString]
;        stdcall FileWriteString, [STDOUT], cCRLF

        mov     eax, [.hString]
        stdcall StrClipSpacesR, eax
        stdcall StrClipSpacesL, eax
        stdcall StrCleanDupSpaces, eax
        stdcall StrLCase, eax

        stdcall StrPtr, eax
        mov     esi, eax

        cmp     byte [esi], '#'
        je      .finish         ; comment line

        mov     edi, esi

.loop1:
        lodsb
        cmp     al, ' '
        ja      .loop1

        test    al, al
        jz      .finish         ; the string is invalid, skip it.

        dec     esi

        mov     eax, esi
        sub     eax, edi
        stdcall StrExtract, edi, 0, eax
        push    eax
        stdcall StrToNumEx, eax
        stdcall StrDel ; from the stack
        jc      .finish                 ; invalid number

        cmp     eax, $ff
        ja      .finish                 ; multibyte code page.

        mov     ebx, eax                ; remember for now.

.loop2:
        lodsb
        test    al, al
        jz      .finish                 ; there is no second number
        cmp     al, ' '
        jb      .loop2

        lea     edi, [esi-1]

.loop3:
        lodsb
        cmp     al, ' '
        ja      .loop3

        dec     esi
        mov     eax, esi
        sub     eax, edi
        stdcall StrExtract, edi, 0, eax
        push    eax
        stdcall StrToNumEx, eax
        stdcall StrDel ; from the stack
        jnc     .numok                  ; invalid second number - undefined character.

        mov     eax, $fffd              ; replace with space

.numok:
        cmp     eax, $ffff
        ja      .finish                 ; too big unicode letter. Should be fixed maybe, but the tables are 16 bit.

        cmp     ebx, $80
        jae     .addit

        cmp     ebx, eax
        je      .finish                 ; it is

;        int3                            ; is it not possible ?
        jmp     .finish

.addit:
        mov     ecx, ebx
        sub     ecx, $80

        mov     word [Table1+2*ecx], ax
        mov     word [Table2+2*ecx], ax
        mov     byte [Table3+ecx], bl


.finish:
        popad
        return
endp


proc InitArrays
begin
        push    ecx
        
        mov     ecx, 80h

.loop:
        mov     [Table1+2*ecx-256], cx
        mov     [Table2+2*ecx-256], cx
        mov     [Table3+ecx-256], cl
        inc     cl
        jnz     .loop

        pop     ecx
        return
endp



uglobal
  hSourceFile dd ?
  Table1      rw 128         ; table for ANSI -> Unicode translation.
  Table3      rb 128
  Table2      rw 128         ; needed only for the sorting of the index.
endg

cCRLF text 13, 10

Added freshlib/data/all.asm.



































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
include 'i18n.asm'
include 'arrays.asm'
include 'trees.asm'
include 'strlib.asm'
include 'base64.asm'
include 'uconfig.asm'
include 'memstream.asm'
include 'hashes.asm'

include 'bitstream.asm'
include 'bytestream.asm'
include 'deflate.asm'

include 'named_array.asm'
include 'buffergap.asm'
include 'counter_array.asm'
include 'random.asm'

Changes to freshlib/data/arrays.asm.

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
; ____________________________________________________________________
;|                                                                    |
;| This file is part of the project:                                  |
;|                                                                    |
;| ..::FreshLib::.. - portable, assembler library and GUI toolkit.    |
;|____________________________________________________________________|
;|                                                                    |
;|                          This file                                 |
;|                          _________                                 |
;|   Author: John Found                                               |
;|                                                                    |

;|   Title: arrays.asm - OS independent dynamic arrays library.       |
;|                                                                    |

;|   OS: Any                                                          |
;|                                                                    |
;|   Notes and changes:                                               |

;|     Uses memory.asm library for memory functions.                  |


;|____________________________________________________________________|



struct TArray
  .count     dd ?           ; Count of elements in dynamic array
  .capacity  dd ?           ; Capacity of the array allocated memory.
  .itemsize  dd ?           ; Size of one element in dynamic array. Aligned on dword.
  .lparam    dd ?           ; User defined value.
  label .array dword
|
|
<
<
|
|
<
<
<
<
<
>
|
<
>
|
<
<
>
|
>
>
|

>







1
2


3
4





5
6

7
8


9
10
11
12
13
14
15
16
17
18
19
20
21
22
; _______________________________________________________________________________________
;|                                                                                       |


;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|





;
;  Description: OS independent dynamic arrays library.

;
;  Target OS: Any


;
;  Dependencies: memory.asm
;
;  Notes:
;_________________________________________________________________________________________

module "Arrays library"

struct TArray
  .count     dd ?           ; Count of elements in dynamic array
  .capacity  dd ?           ; Capacity of the array allocated memory.
  .itemsize  dd ?           ; Size of one element in dynamic array. Aligned on dword.
  .lparam    dd ?           ; User defined value.
  label .array dword
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
97
98
99
100
101
102
103
104
105

106

107
108
109
110

111
112
113
114
115
116
117
118
119
120
121
122
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

172
173


174
175
176
177
178
179
180
        add     ecx, 3
        and     cl, $fc
        mov     edx, ecx

        imul    ecx, cInitialCapacity
        add     ecx, sizeof.TArray
        stdcall GetMem, ecx
.retaddr:
        jc      .finish

        mov     [eax+TArray.itemsize], edx
        mov     [eax+TArray.capacity], cInitialCapacity
        clc

.finish:
        pop     edx ecx
        return
endp





































;____________________________________________________________________
;
;  proc AddArrayItem - adds new item at the end of TArray
;                      dynamic array.
;  Arguments:
;
;    ptrArray - pointer to dword variable containing pointer
;               to TArray structure.

;
;  Returns:
;    CF=1 if error: edx - pointer to the original array.
;
;    CF=0 if OK:    eax - pointer to new created element.
;                   edx - pointer to the array.
;
;  Notes:
;    The procedure returns in edx pointer to the TArray. This pointer
;    can differs from .ptrArray argument, if the memory was
;    reallocated. The user should save the pointer for future access
;    to the array. It is safe to save the pointer before check of CF
;    for error, because the procedure returns original pointer in case
;    of memory allocation error.
;____________________________________________________________________

proc AddArrayItem, .ptrArray
begin
        push    ebx ecx

        mov     edx, [.ptrArray]
        test    edx, edx
        jnz     @f

        stc
        pop     ecx ebx
        return

@@:

        mov     ecx, [edx+TArray.capacity]

        cmp     ecx, [edx+TArray.count]
        ja      .memallocated

; enlarge the array. Strategy here is not clear.

        call    [ResizeIt]
        jc      .finish

        mov     ebx, ecx
        imul    ecx, [edx+TArray.itemsize]
        add     ecx, sizeof.TArray

        stdcall ResizeMem, edx, ecx
.retaddr:
        jc      .finish

        mov     edx, eax
        mov     [edx+TArray.capacity], ebx

.memallocated:
        mov     eax, [edx+TArray.count]

        inc     [edx+TArray.count]

        imul    eax, [edx+TArray.itemsize]
        lea     eax, [edx+eax+TArray.array]
        clc

.finish:
        pop     ecx ebx
        return
endp


;____________________________________________________________________
;
;  proc InsertArrayItem - inserts new item in the array.
;
;  If .iElement is larger or equal to [TArray.count] the element is
;  appended at the end of the array. Otherwise, all elements are moved
;  to make room for the new element. If the capacity of the array is
;  not enough to hold new element, the array is resized.
;
;  Arguments:
;
;    ptrArray - pointer to TArray structure.


;
;  Returns:
;    CF=1 if error: edx - pointer to the original array; new element is
;                         not inserted.
;
;    CF=0 if OK:    eax - pointer to new created element.
;                   edx - pointer to the array.
;
;  Notes:





;    The procedure returns in edx pointer to the TArray. This pointer
;    can differs from .ptrArray argument, if the memory was
;    reallocated. The user should save the pointer for future access
;    to the array. It is safe to save the pointer before check of CF
;    for error, because the procedure returns original pointer in case
;    of memory allocation error.
;____________________________________________________________________

proc InsertArrayItem, .ptrArray, .iElement
begin
        stdcall AddArrayItem, [.ptrArray]
        jc      .end1

        push    ecx

        mov     ecx, [.iElement]
        inc     ecx


        cmp     ecx, [edx+TArray.count]
        jae     .end2

        push    esi edi

        imul    ecx, [edx+TArray.itemsize]
        lea     ecx, [edx+ecx+TArray.array]







<












>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


|



|

>
















|












>

>
|
|


>
|







<







>
|
>



>








|
<
<
<
<
<



|
>
>


|


|



>
>
>
>
>








|

|



>

|
>
>







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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
        add     ecx, 3
        and     cl, $fc
        mov     edx, ecx

        imul    ecx, cInitialCapacity
        add     ecx, sizeof.TArray
        stdcall GetMem, ecx

        jc      .finish

        mov     [eax+TArray.itemsize], edx
        mov     [eax+TArray.capacity], cInitialCapacity
        clc

.finish:
        pop     edx ecx
        return
endp


; returns a pointer to the array item.
; Arguments:
;  .array - pointer to TArray
;  .index - index of the array element.
;
; Returns:
;   CF=0; EAX = pointer to the array element.
;   CF=1 - indicates that [.index] is bigger than the array element count;
;          in this case EAX = points after the last element of the array.

proc GetArrayItem, .array, .index
begin
        push    ecx esi

        mov     esi, [.array]
        mov     eax, [.index]
        mov     ecx, [esi+TArray.count]

        cmp     eax, ecx
        cmovae  eax, ecx

        imul    eax, [esi+TArray.itemsize]
        lea     eax, [esi+TArray.array+eax]

; set CF
        sub     ecx, 1
        jc      @f
        cmp     ecx, [.index]
@@:
        pop     esi ecx
        return
endp



;____________________________________________________________________
;
;  proc AddArrayItems - adds new item at the end of TArray
;                      dynamic array.
;  Arguments:
;
;    .ptrArray - pointer to dword variable containing pointer
;               to TArray structure.
;    .count - count of the elements to be added.
;
;  Returns:
;    CF=1 if error: edx - pointer to the original array.
;
;    CF=0 if OK:    eax - pointer to new created element.
;                   edx - pointer to the array.
;
;  Notes:
;    The procedure returns in edx pointer to the TArray. This pointer
;    can differs from .ptrArray argument, if the memory was
;    reallocated. The user should save the pointer for future access
;    to the array. It is safe to save the pointer before check of CF
;    for error, because the procedure returns original pointer in case
;    of memory allocation error.
;____________________________________________________________________

proc AddArrayItems, .ptrArray, .count
begin
        push    ebx ecx

        mov     edx, [.ptrArray]
        test    edx, edx
        jnz     @f

        stc
        pop     ecx ebx
        return

@@:
        mov     eax, [edx+TArray.count]
        mov     ecx, [edx+TArray.capacity]
        add     eax, [.count]
        cmp     ecx, eax
        jae     .memallocated

; enlarge the array. Strategy here is not clear.
        mov     ecx, eax
        call    dword [ResizeIt]
        jc      .finish

        mov     ebx, ecx
        imul    ecx, [edx+TArray.itemsize]
        add     ecx, sizeof.TArray

        stdcall ResizeMem, edx, ecx

        jc      .finish

        mov     edx, eax
        mov     [edx+TArray.capacity], ebx

.memallocated:
        mov     eax, [edx+TArray.count]
        mov     ecx, [.count]
        add     [edx+TArray.count], ecx

        imul    eax, [edx+TArray.itemsize]
        lea     eax, [edx+eax+TArray.array]
        clc

.finish:
        pop     ecx ebx
        return
endp


;____________________________________________________________________
;
;  proc InsertArrayItems - inserts new item in the array.





;
;  Arguments:
;
;    .ptrArray - pointer to TArray structure.
;    .iElement - on what index to be inserted the new elements.
;    .count    - how many elements to be inserted.
;
;  Returns:
;    CF=1 if error: edx - pointer to the original array; new elements are
;                         not inserted.
;
;    CF=0 if OK:    eax - pointer to the first of the new inserted elements.
;                   edx - pointer to the array.
;
;  Notes:
;    If .iElement is larger or equal to [TArray.count] the elements are
;    appended at the end of the array. Otherwise, all elements are moved
;    to make room for the new elements. If the capacity of the array is
;    not enough to hold the new elements, the array is resized.
;
;    The procedure returns in edx pointer to the TArray. This pointer
;    can differs from .ptrArray argument, if the memory was
;    reallocated. The user should save the pointer for future access
;    to the array. It is safe to save the pointer before check of CF
;    for error, because the procedure returns original pointer in case
;    of memory allocation error.
;____________________________________________________________________

proc InsertArrayItems, .ptrArray, .iElement, .count
begin
        stdcall AddArrayItems, [.ptrArray], [.count]
        jc      .end1

        push    ecx

        mov     ecx, [.iElement]
        add     ecx, [.count]
        jc      .end2

        cmp     ecx, [edx+TArray.count]
        jae     .end2

        push    esi edi

        imul    ecx, [edx+TArray.itemsize]
        lea     ecx, [edx+ecx+TArray.array]
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
235
236
237
238
239
240
241
242




243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266




267
268
269
270
271
272
273
274
275
276
277
278
279
280







281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305


306


307



















308
309
310
311
312
313
314
        sub     edi, 4

        std

; scroll the data.
        rep movsd

; clear the new item.
        mov     ecx, [edx+TArray.itemsize]

        shr     ecx, 2
        xor     eax, eax
        rep stosd
        lea     eax, [edi+4]


        cld

        pop     edi esi

.end2:
        pop     ecx

.end1:
        return
endp


;**************************************************************
;  proc DeleteArrayItem - deletes the item with the specified

;                         index from TArray dynamic array.
;  If the capacity of the array is bigger than the recomended
;  for the new count, then the array is resized.
;  The recomended size is calculated using ResizeIt procedure
;  from memory library.
;
;  Arguments:
;    .ptrArray - pointer to TArray structure.
;    .iElement - index of the element to be deleted.

;
;  Returns: edx - pointer to the TArray. In the most cases
;                 this pointer can not be changed, but this
;                 also depents on the current OS memory
;                 allocation API, so it is safer to store
;                 the pointer for future use, instead of
;                 passed to the procedure.
;
;  Notes:
;           This function can't fail, because delete is
;           always possible in already allocated array.
;           in some cases shrinking resize possibly can fail
;           but this will not affect the data in the array.
;




;*******************************************************
proc DeleteArrayItem, .ptrArray, .iElement
begin
        push    edi esi ecx ebx

        mov     edx, [.ptrArray]
        test    edx, edx
        jz      .exit

        mov     ecx, [.iElement]
        mov     eax, [edx+TArray.count]

        test    ecx, ecx
        js      .exit

        cmp     ecx, eax
        jae     .exit                   ; index greater or equal to the count...

        dec     eax
        cmp     ecx, eax
        je      .movedone               ; if deleted element is the last, don't move

        mov     eax, [edx+TArray.itemsize]





        imul    ecx, eax                        ; offset of the deleted element.
        lea     edi, [edx+ecx+TArray.array]     ; destination address.
        mov     esi, eax
        add     esi, edi                        ; pointer to the next array element.

        mov     ecx, [edx+TArray.count]
        imul    ecx, eax
        lea     ecx, [ecx+edx+TArray.array]
        sub     ecx, esi                        ; bytes to be moved. It should be dword aligned count.

        shr     ecx, 2
        rep movsd                               ; move the data.

.movedone:







        dec     [edx+TArray.count]

        mov     ecx, [edx+TArray.count]
        call    [ResizeIt]
        jc      .exit                           ; the array is OK, but the resize failed.

        cmp     ecx, [edx+TArray.capacity]
        jae     .exit                           ; the array have smaller capacity than recomended, so don't resize.

        mov     eax, ecx
        imul    eax, [edx+TArray.itemsize]
        add     eax, sizeof.TArray
        stdcall ResizeMem, edx, eax
        jc      .exit                           ; the resize failed, but the array is ok.

        mov     edx, eax
        mov     [edx+TArray.capacity], ecx      ; set new capacity.

.exit:
        pop     ebx ecx esi edi
        return
endp




























proc VacuumArray, .ptrArray
begin
        push    eax ecx

        mov     edx, [.ptrArray]
        mov     ecx, [edx+TArray.count]
        mov     eax, [edx+TArray.itemsize]







|

>



<

>



>


>






|
>
|








>


|
|

|








>
>
>
>

|

|














|

|



>
>
>
>


<
<










>
>
>
>
>
>
>
|

<
















|





>
>
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







234
235
236
237
238
239
240
241
242
243
244
245
246

247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321


322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340

341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
        sub     edi, 4

        std

; scroll the data.
        rep movsd

; clear the new items.
        mov     ecx, [edx+TArray.itemsize]
        imul    ecx, [.count]
        shr     ecx, 2
        xor     eax, eax
        rep stosd


        lea     eax, [edi+4]
        cld

        pop     edi esi

.end2:
        pop     ecx
        clc
.end1:
        return
endp


;**************************************************************
;  proc DeleteArrayItems - deletes the items with the specified
;                          index and specified count from TArray
;                          dynamic array.
;  If the capacity of the array is bigger than the recomended
;  for the new count, then the array is resized.
;  The recomended size is calculated using ResizeIt procedure
;  from memory library.
;
;  Arguments:
;    .ptrArray - pointer to TArray structure.
;    .iElement - index of the element to be deleted.
;    .count    - how many elements to be deleted.
;
;  Returns: edx - pointer to the TArray. In the most cases
;                 this pointer will not be changed, but this
;                 also depends on the current OS memory
;                 allocation API, so it is safer to store
;                 the pointer for future use instead of
;                 passed to the procedure.
;
;  Notes:
;           This function can't fail, because delete is
;           always possible in already allocated array.
;           in some cases shrinking resize possibly can fail
;           but this will not affect the data in the array.
;
;           if [.iElement]+[.count] is bigger that the [TArray.count]
;           of the array, only the elements to the end of the array
;           will be deleted.
;
;*******************************************************
proc DeleteArrayItems, .ptrArray, .iElement, .count
begin
        push    edi esi ecx ebx eax

        mov     edx, [.ptrArray]
        test    edx, edx
        jz      .exit

        mov     ecx, [.iElement]
        mov     eax, [edx+TArray.count]

        test    ecx, ecx
        js      .exit

        cmp     ecx, eax
        jae     .exit                   ; index greater or equal to the count...

        add     ecx, [.count]
        cmp     ecx, eax
        jae     .movedone               ; if there is no more elements after the last deleted element, don't move

        mov     eax, [edx+TArray.itemsize]

        imul    ecx, eax
        lea     esi, [edx+ecx+TArray.array]     ; the first after deleted

        mov     ecx, [.iElement]
        imul    ecx, eax                        ; offset of the deleted element.
        lea     edi, [edx+ecx+TArray.array]     ; destination address.



        mov     ecx, [edx+TArray.count]
        imul    ecx, eax
        lea     ecx, [ecx+edx+TArray.array]
        sub     ecx, esi                        ; bytes to be moved. It should be dword aligned count.

        shr     ecx, 2
        rep movsd                               ; move the data.

.movedone:
        mov     ecx, [edx+TArray.count]
        mov     eax, [.iElement]
        sub     ecx, [.count]
        cmp     ecx, eax
        ja      @f
        mov     ecx, eax
@@:
        mov     [edx+TArray.count], ecx


        call    [ResizeIt]
        jc      .exit                           ; the array is OK, but the resize failed.

        cmp     ecx, [edx+TArray.capacity]
        jae     .exit                           ; the array have smaller capacity than recomended, so don't resize.

        mov     eax, ecx
        imul    eax, [edx+TArray.itemsize]
        add     eax, sizeof.TArray
        stdcall ResizeMem, edx, eax
        jc      .exit                           ; the resize failed, but the array is ok.

        mov     edx, eax
        mov     [edx+TArray.capacity], ecx      ; set new capacity.

.exit:
        pop     eax ebx ecx esi edi
        return
endp



;**************************************************************
;  proc VacuumArray - deletes the reserved memory from the array.
;
;  Arguments:
;    .ptrArray - pointer to TArray structure.
;
;  Returns: edx - pointer to the TArray. In the most cases
;                 this pointer will not be changed, but this
;                 also depends on the current OS memory
;                 allocation API, so it is safer to store
;                 the pointer for future use instead of
;                 passed to the procedure.
;           CF=1 - there is a error on vacuuming. This is not
;                  exactly error, because this case indicates
;                  simply some memory manager unabiliry to reallocate
;                  memory. Although the array will not be changed.
;
; This procedure removes all reserved space in the array.
; Vacuum can save a lot of memory space, but takes time and
; also will make future inserts of new elements
; slower at least for the first add/insert.
;
; it is wise to vacuum the array after it is filled with
; most/all of the needed elements.
;
proc VacuumArray, .ptrArray
begin
        push    eax ecx

        mov     edx, [.ptrArray]
        mov     ecx, [edx+TArray.count]
        mov     eax, [edx+TArray.itemsize]
323
324
325
326
327
328
329










































































































































































330
331
332
333
334
335
336
        mov     [eax+TArray.capacity], ecx

.exit:
        pop     ecx eax
        return

endp















































































































































































;____________________________________________________________________
;







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
        mov     [eax+TArray.capacity], ecx

.exit:
        pop     ecx eax
        return

endp


;***************************************************
;  Returns the result in the flags CF and ZF in a way
;  to be used with JB,JA,JE:
;
;     if E1<E2 -> CF = 1, ZF=0    (JB to be taken)
;     if E1=E2 -> CF = 0, ZF=1    (JE to be taken)
;     if E1>E2 -> CF=0, ZF=0      (JA to be taken)
;
;****************************************************
interface CompareProc, .pElement1, .pElement2, .param

;****************************************************
; Quick sort of the array in the memory.
; Arguments:
;  .ptrArray       - pointer to TArray structure.
;  .ptrCompareProc - pointer to procedure that compares two elements.
;  .param          - parameter that is directly passed to the
;                    comparison procedure.
;
; .ptrCompareProc has interface:
;
;  proc CompareSomething, .ptrElement1, .ptrElement2, .param
;
;  Returns the result in the flags CF and ZF in a way
;  to be used with JB,JA,JE:
;
;     if E1<E2 -> CF = 1, ZF=0    (JB to be taken)
;     if E1=E2 -> CF = 0, ZF=1    (JE to be taken)
;     if E1>E2 -> CF=0, ZF=0      (JA to be taken)
;
;****************************************************

proc SortArray, .ptrArray, .ptrCompareProc, .param
begin
        pushad

        mov     esi, [.ptrArray]
        mov     edi, [.ptrCompareProc]
        mov     ebx, [esi+TArray.itemsize]

        mov     edx, [esi+TArray.count]
        dec     edx
        xor     ecx, ecx

        lea     esi, [esi+TArray.array]
        mov     [.ptrArray], esi

        call    .DoQSort

        popad
        return

; ECX = LEFT
; EDX = RIGHT
.DoQSort:
        push    eax

        cmp     ecx, edx
        jge     .finish

        push    edx ecx

        mov     esi, edx
        sub     esi, ecx
        sar     esi, 1
        add     esi, ecx

        imul    esi, ebx
        imul    ecx, ebx
        imul    edx, ebx
        add     esi, [.ptrArray]
        add     ecx, [.ptrArray]
        add     edx, [.ptrArray]

; copy the pivot element.
        sub     esp, ebx
        mov     edi, esp

        push    ecx
        mov     ecx, ebx
        rep movsb
        pop     ecx

        mov     edi, esp

; here edi contains pointer to the copied element.
; partition
        sub     ecx, ebx
        add     edx, ebx

.whilei:
        add     ecx, ebx
        stdcall [.ptrCompareProc], ecx, edi, [.param]
        jb      .whilei         ; search for the left element >= pivote

        cmp     ecx, edx
        jg      .next

.whilej:
        sub     edx, ebx
        stdcall [.ptrCompareProc], edi, edx, [.param]
        jb      .whilej         ; search for the right element <= pivote

        cmp     ecx, edx
        jg      .next           ;i>j
        je      .whilei

; swap elements:
        push    ebx

.swap_loop:
        dec     ebx
        js      .end_swap

        mov     al, [ecx+ebx]
        xchg    al, [edx+ebx]
        mov     [ecx+ebx], al
        jmp     .swap_loop

.end_swap:
        pop     ebx
        jmp     .whilei

.next:
        add     esp, ebx

        mov     eax, edx        ; j
        sub     eax, [.ptrArray]
        cdq
        idiv    ebx
        mov     edi, eax

        mov     eax, ecx        ; i
        sub     eax, [.ptrArray]
        cdq
        idiv    ebx

        pop     ecx
        mov     edx, edi
        call    .DoQSort        ; Left, j

        mov     ecx, eax
        pop     edx
        call    .DoQSort        ; i, Right

.finish:
        pop     eax
        retn
endp





proc CompareIntAscending as CompareProc
begin
        push    eax esi edi

        mov     esi, [.pElement1]
        mov     edi, [.pElement2]

        mov     eax, [esi]
        cmp     eax, [edi]
        pop     edi esi eax
        return
endp







;____________________________________________________________________
;
376
377
378
379
380
381
382





















































383
384
385
386
387
388
389
390
391
392
393
394



395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413



.found:
        clc
        mov     eax, ecx
        pop     ecx edi
        return
endp























































;--------------------------------------------
; Frees all elements of the list calling
; [FreeProc] on every element.
; (proc FreeProc, ptrItem)
; Frees the array of items
;--------------------------------------------
proc ListFree, .ptrList, .FreeProc
begin
        push    edi ebx

        mov     edi, [.ptrList]



        mov     ebx, [edi+TArray.count]

        cmp     [.FreeProc], 0
        je      .endwhile

.freeloop:
        dec     ebx
        js      .endwhile

        stdcall [.FreeProc], [edi+4*ebx+TArray.array]
        jmp     .freeloop

.endwhile:
        stdcall FreeMem, edi

.finish:
        pop     ebx edi
        return
endp










>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>









|


>
>
>
















|


>
>
>
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
.found:
        clc
        mov     eax, ecx
        pop     ecx edi
        return
endp




;____________________________________________________________________
;
; proc ListIndexOfStr, .ptrArray, .hString - searches dynamic list of
; strings for the the given string.
;
; List is a special case of dynamic array, where the size of the
; elements is dword (4 bytes).
;
; Arguments:
;   .ptrList - pointer to TArray dynamic array.
;   .hString - value of the element.
; Returns:
;   CF = 0 if the element was found. eax contains index of
;          the element.
;   CF = 1 the element is not found.
;____________________________________________________________________


proc ListIndexOfStr, .ptrList, .hString
begin
        push    edi ecx

        mov     edi, [.ptrList]

        cmp     [edi+TArray.itemsize], 4
        jne     .notfound

        mov     ecx, [edi+TArray.count]
        jecxz   .notfound

.loop:
        dec     ecx
        js      .notfound

        stdcall StrCompCase, [.hString], [edi+TArray.array+4*ecx]
        jnc     .loop

        clc
        mov     eax, ecx
        pop     ecx edi
        return

.notfound:
        stc
        pop     ecx edi
        return
endp




;--------------------------------------------
; Frees all elements of the list calling
; [FreeProc] on every element.
; (proc FreeProc, ptrItem)
; Frees the array of items
;--------------------------------------------
proc ListFree, .ptrList, .FreeProc
begin
        pushad

        mov     edi, [.ptrList]
        test    edi, edi
        jz      .finish

        mov     ebx, [edi+TArray.count]

        cmp     [.FreeProc], 0
        je      .endwhile

.freeloop:
        dec     ebx
        js      .endwhile

        stdcall [.FreeProc], [edi+4*ebx+TArray.array]
        jmp     .freeloop

.endwhile:
        stdcall FreeMem, edi

.finish:
        popad
        return
endp


endmodule

Added freshlib/data/base64.asm.

























































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS independent string manipulation library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Author of this library is Decard (Mateusz Tymek)
;
;_________________________________________________________________________________________

module "Base64 library"

if used base64_table
  base64_table db "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
               db "abcdefghijklmnopqrstuvwxyz"
               db "0123456789+/"
end if


; calculates size of base64 stream after encoding

proc Base64Size, .DataLen
begin
        push    ebx ecx edx

        mov     eax, [.DataLen]
        mov     ebx, eax
        add     eax, 2

        xor     edx, edx

        mov     ecx, 3
        div     ecx

        add     ebx, 3

        sub     ebx, edx

        mov     eax, ebx

        xor     edx, edx
        div     ecx
        shl     eax, 2

        pop     edx ecx ebx
        return
endp


; encodes given buffer into base64 stream

proc EncodeBase64, .pData, .Length
begin
        push    ecx edx esi edi

        mov     esi, [.pData]
        mov     ecx, [.Length]

        stdcall StrNew
        mov     edi, eax

        stdcall Base64Size, ecx
        stdcall StrSetCapacity, edi, eax

        push    edi

        stdcall StrPtr, edi
        mov     edi, eax

        push    edi

.loop:
        mov     edx, [esi]
        cmp     ecx, 3
        jae     .remainder_ok
        and     edx, 0xffff
        cmp     ecx, 2
        jae     .remainder_ok
        and     edx, 0xff

.remainder_ok:
        bswap   edx

        mov     eax, edx
        shr     eax, 26
        and     eax, 111111b
        mov     al, [base64_table+eax]
        mov     [edi], al
        inc     edi

        mov     eax, edx
        shr     eax, 20
        and     eax, 111111b
        mov     al, [base64_table+eax]
        mov     [edi], al
        inc     edi
        dec     ecx
        jz      .r2

        mov     eax, edx
        shr     eax, 14
        and     eax, 111111b
        mov     al, [base64_table+eax]
        mov     [edi], al
        inc     edi
        dec     ecx
        jz      .r1

        mov     eax, edx
        shr     eax, 8
        and     eax, 111111b
        mov     al, [base64_table+eax]
        mov     [edi], al
        inc     edi

        add     esi, 3
        dec     ecx
        jnz     .loop
        jmp     .finish

.r2:
        mov     byte [edi], '='
        inc     edi

.r1:
        mov     byte [edi], '='
        inc     edi

.finish:
        mov     byte [edi], 0

        mov     ecx, edi
        pop     edi

        sub     ecx, edi    ; string length.
        mov     [edi+string.len], ecx

        pop     eax             ; string handle

        pop     edi esi edx ecx
        return
endp





; decodes base64 stream into given buffer

proc DecodeBase64, .hString
.decode_table rb 0x100
.ret          dd ?
begin
        push    ebx ecx edx esi edi

        xor     eax, eax
        mov     ebx, 63

.make_table:
        mov     al, [base64_table+ebx]
        mov     [.decode_table+eax], bl
        dec     ebx
        jns     .make_table

        mov     [.decode_table+'-'], 0
        mov     [.decode_table+'='], 0

        stdcall StrPtr, [.hString]
        mov     esi, eax

        stdcall StrLen, [.hString]
        mov     ecx, eax

        lea     eax, [ecx+4]
        stdcall GetMem, eax
        lea     edi, [eax+4]
        mov     [.ret], edi

        xor     ebx, ebx
        xor     eax, eax

.load_dword:
        mov     edx, [esi]
        bswap   edx
        add     esi, 4
        mov     al, dl
        mov     al, [.decode_table+eax]
        shrd    ebx, eax, 6
        shr     edx, 8
        mov     al, dl
        mov     al, [.decode_table+eax]
        shrd    ebx, eax, 6
        shr     edx, 8
        mov     al, dl
        mov     al, [.decode_table+eax]
        shrd    ebx, eax, 6
        shr     edx, 8
        mov     al, dl
        mov     al, [.decode_table+eax]
        shrd    ebx, eax, 6
        bswap   ebx

        mov     [edi], ebx
        add     edi, 3
        sub     ecx, 4
        js      .exit_loop      ; this jump should be never taken
        jnz     .load_dword     ; (src_size should be a multiple of four)

.exit_loop:
        sub     edi, 2
        cmp     byte [edi], 0
        je      .size_ok

        inc     edi
        cmp     byte [edi], 0
        je      .size_ok

        inc     edi

.size_ok:
        mov     eax, [.ret]
        sub     edi, eax
        mov     [eax-4], edi

        pop     edi esi edx ecx ebx
        return
endp



endmodule

Added freshlib/data/bbcode.asm.

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
module "BBCode translator"

match =HTML_IMG_ATTR, HTML_IMG_ATTR {
  HTML_IMG_ATTR equ ' crossorigin="anonymous" '
}

iglobal
PHashTable tableBBtags, tpl_func,                      \
        'b',       tagStrong,                          \
        '*',       tagListItem,                        \
        'i',       tagEm,                              \
        'u',       tagUnderlined,                      \
        's',       tagDel,                             \
        'c',       tagInlineCode,                      \
        'url',     tagURL,                             \
        'img',     tagImg,                             \
        'quote',   tagQuote,                           \
        'code',    tagCode,                            \
        'size',    tagSize,                            \
        'color',   tagColor,                           \
        'list',    tagUL,                              \
        'ul',      tagUL,                              \
        'ol',      tagOL,                              \
        'table',   tagTable,                           \
        'tr',      tagTR,                              \
        'th',      tagTH,                              \
        'td',      tagTD,                              \
        'spoiler', tagSpoiler,                         \
        'email',   tagEmail,                           \
        'h1',      tagH1,                              \
        'h2',      tagH2,                              \
        'h3',      tagH3,                              \
        'h4',      tagH4,                              \
        'h5',      tagH5,                              \
        'h6',      tagH6,                              \
        ':)',      emoSmile,                           \
        ':d',      emoLol,                             \
        ':rofl:',  emoRofl,                            \
        ';)',      emoWink,                            \
        ':p',      emoTongue,                          \
        ':(',      emoSad,                             \
        ':`(',     emoCry,                             \
        '>:(',     emoAngry
endg

struct TOneTag
  .pOpenP    dd ?       ; Open tag prefix. for example '<img src="'
  .lOpenP    dd ?
  .pOpenS    dd ?       ; Open tag suffix. for example '" alt="'
  .lOpenS    dd ?
  .pClose    dd ?       ; Close tag. for example '" />'
  .lClose    dd ?
  .flags     dd ?       ; encoding flags for this tag. the first byte contain flags for the text between .pOpenP and .pOpenS
                        ; the second byte for the text between .pOpenS and .pClose
ends

; examples:
; [b]:                                  '<b>', 0, '</b>'
; [quote=title]text[/quote]:            '<blockquote><header>', '</header>', '</blockquote>'
; [img]image_url[/img]:                 '<img alt="', '" src="', '" />'
; [code=language][/code]:               '<code class="', '">', '</code>'


struc flex [arg] {
common
  local f1, f2, cnt, sz
  cnt = 0
  sz = 0
  f1 = 1
  f2 equ FALSE
forward
  match any, arg \{
    match `arg, arg \\{ f2 equ TRUE \\}
  \}

  cnt = cnt + 1
  if arg eqtype ''
    virtual at 0
      db arg
      sz = sz + $
    end virtual
  end if

common
  local lbl

  match =txt string, arg \{
    f1 = 0
    lbl text string
    f2 equ FALSE
  \}

  if (sz > 4) | (cnt>1)
    f1 = 0
  end if

  if f1
    . = arg
    .length = 0
  else
    . = lbl
    .length = lbl#\.length
  end if
  match =TRUE, f2 \{ lbl text arg \}
}


struc onetag prefix, suffix, close, flags {
common
  local ..pref, ..suff, ..close
  local ..fpr, ..fsf, ..fcl

  label . dword
if used .
  ..pref flex prefix
  ..suff flex suffix
  ..close flex close

  .pOpenP dd ..pref
  .lOpenP dd ..pref#\.length
  .pOpenS dd ..suff
  .lOpenS dd ..suff#\.length
  .pClose dd ..close
  .lClose dd ..close#\.length
  .flags  dd flags
end if
}


fEmptyAttr    = $00000001        ; empty value of the attribute is acceptable.
fBlockTag     = $00000002        ; This is a block tag. Allows paragraph generation and resets its state.
fDisableTags  = $00000004        ; Disable tag generation inside this block; The only tag that is recongized is the respective closing tag.
fLines        = $00000008        ; the tag can contain text lines.
fInlineTag    = $00000010
fURLAttribute = $00000020        ; the attribute of the tag contains URL, that need to be sanitized.
fURLContent   = $00000040        ; the content of the tag is an URL.
fMixedDist    = $00000080        ; The argument of the tag should be formatted as mixed ascii-unicode text.
fMinimagBlock = $80000000        ; The tags, that are open/close by ;tagname/;end in MiniMagAsm


iglobal
  align 4

  tagStrong       onetag txt '<strong>',                              0,              txt '</strong>',    fInlineTag
  tagEm           onetag txt '<em>',                                  0,              txt '</em>',        fInlineTag
  tagUnderlined   onetag txt '<span class="underlined">',             0,              txt '</span>',      fInlineTag
  tagDel          onetag txt '<del>',                                 0,              txt '</del>',       fInlineTag
  tagInlineCode   onetag txt '<code>',                                0,              txt '</code>',      fInlineTag or fDisableTags
  tagCode         onetag txt '<pre><code class="',                   txt '">',       txt '</code></pre>', fBlockTag or fEmptyAttr or fDisableTags or fMinimagBlock
  tagQuote        onetag txt '<blockquote><header>',                  txt '</header>',txt '</blockquote>',fBlockTag or fEmptyAttr or fMinimagBlock or fMixedDist
  tagUL           onetag txt '<ul>',                                  0,              txt '</ul>',        fBlockTag or fMinimagBlock
  tagOL           onetag txt '<ol type="',                            txt '">',       txt '</ol>',        fBlockTag or fEmptyAttr or fMinimagBlock
  tagListItem     onetag txt '<li>',                                  0,              txt '</li>',        fBlockTag
  tagTable        onetag txt '<table>',                               0,              txt '</table>',     fBlockTag or fMinimagBlock
  tagTR           onetag txt '<tr>',                                  0,              txt '</tr>',        fBlockTag
  tagTH           onetag txt '<th>',                                  0,              txt '</th>',        fBlockTag
  tagTD           onetag txt '<td>',                                  0,              txt '</td>',        fBlockTag
  tagSpoiler      onetag txt '<details><summary>',                    txt '</summary>',txt '</details>',   fBlockTag or fMinimagBlock
  tagURL          onetag txt '<a href="',                             txt '">',       txt '</a>',         fURLAttribute or fInlineTag
  tagAnchor       onetag txt '<a href="',                               txt '" id="',       txt '"></a>', fURLAttribute or fInlineTag
  tagImg          onetag <txt '<img class="block"', HTML_IMG_ATTR, 'alt="'>, txt '" src="',  txt '" />',         fBlockTag  or fDisableTags or fURLContent
  tagInlineImg    onetag <txt '<img class="inline"', HTML_IMG_ATTR,'alt="'>, txt '" src="',  txt '" />',         fInlineTag or fDisableTags or fURLContent
  tagSize         onetag txt '<span style="font-size:',               txt '">',       txt '</span>',      fInlineTag
  tagColor        onetag txt '<span style="color:',                   txt '">',       txt '</span>',      fInlineTag
  tagEmail        onetag txt '<a href="mailto:',                      txt '">',       txt '</a>',         0
  tagH1           onetag txt '<h1>',                                  0,              txt '</h1>',        fBlockTag or fLines
  tagH2           onetag txt '<h2>',                                  0,              txt '</h2>',        fBlockTag or fLines
  tagH3           onetag txt '<h3>',                                  0,              txt '</h3>',        fBlockTag or fLines
  tagH4           onetag txt '<h4>',                                  0,              txt '</h4>',        fBlockTag or fLines
  tagH5           onetag txt '<h5>',                                  0,              txt '</h5>',        fBlockTag or fLines
  tagH6           onetag txt '<h6>',                                  0,              txt '</h6>',        fBlockTag or fLines
  tagPara         onetag txt '<p>',                                   0,              txt '</p>',         fLines
  tagHR           onetag txt '<hr>',                                  0,              0,                  0

  tagImgMM        onetag <txt '<img class="block"', HTML_IMG_ATTR, 'src="'>, txt '" alt="',   txt '" />',           fBlockTag  or fDisableTags
  tagInlineImgMM  onetag <txt '<img class="inline"', HTML_IMG_ATTR,'src="'>, txt '" alt="',  txt '" />',           fInlineTag or fDisableTags
  tagVideoMM      onetag <txt '<video', HTML_IMG_ATTR, 'controls><source src="'>, txt '">',   txt '</video>',     0

  ; Emoticons tags.

  emoSmile        onetag <'<img class="emoticon" src="', EMOTICONS_PATH, 'smile.gif" alt=":)">'>,   0,              0,              0
  emoLol          onetag <'<img class="emoticon" src="', EMOTICONS_PATH, 'lol.gif" alt=":D">'>,     0,              0,              0
  emoRofl         onetag <'<img class="emoticon" src="', EMOTICONS_PATH, 'rofl.gif" alt=":D">'>,    0,              0,              0
  emoWink         onetag <'<img class="emoticon" src="', EMOTICONS_PATH, 'wink.gif" alt=";)">'>,    0,              0,              0
  emoTongue       onetag <'<img class="emoticon" src="', EMOTICONS_PATH, 'tongue.gif" alt=":P">'>,  0,              0,              0
  emoSad          onetag <'<img class="emoticon" src="', EMOTICONS_PATH, 'sad.gif" alt=":(">'>,     0,              0,              0
  emoCry          onetag <'<img class="emoticon" src="', EMOTICONS_PATH, 'cry.gif" alt=":`(">'>,    0,              0,              0
  emoAngry        onetag <'<img class="emoticon" src="', EMOTICONS_PATH, 'angry.gif" alt=">:(">'>,  0,              0,              0

  emoJ            onetag txt '<span class="emoji"><span>', 0, txt '</span></span>', 0
endg

; 1 - paragraph starts on every new line.
; 2 - paragraph starts on every two consecutive new lines (like in MarkDown)
NEW_PARAGRAPH_EMPTY_LINES = 1

;--------------------------------------------------------------
; Converts BB code into HTML. Starts from the position [.from]
; and ends at the end of the text or at first NULL character.
;
; Arguments:
;    .pBBCode - pointer to the TText structure with the BBCode
;               formatted text.
;    .from    - the position where to start.
;
; Returns:
;    edx - The same structure (possibly reallocated) with
;    the translated to html code text.
;

proc TranslateBBCode, .pBBCode, .from, .procSanitizeURL
.pStack dd ?
.ofsStart dd ?
.tagType  dd ?
.tagAddr  dd ?
.tagFlags dd ?

.tagMix   dd ?
.char     rb 4

.fNewLine dd ?

.emoj = emoJ    ; use this label.
begin
        pushad

        stdcall CreateArray, 4
        mov     [.pStack], eax

        mov     [.fNewLine], NEW_PARAGRAPH_EMPTY_LINES ; first new line implicit.
        and     [.tagFlags], 0

        mov     edx, [.pBBCode]

        OutputValue "BBCode TText.GapBegin: ", [edx+TText.GapBegin], 10, -1
        OutputValue "               GapEnd: ", [edx+TText.GapEnd], 10, -1
        OutputValue "               Length: ", [edx+TText.Length], 10, -1
        OutputValue "       Translate from: ", [.from], 10, -1

        mov     ebx, [.from]
        jmp     .loop

.next:
        inc     ebx

.loop:
        mov     ecx, [edx+TText.GapEnd]
        cmp     ebx, [edx+TText.GapBegin]
        cmovb   ecx, [edx+TText.GapBegin]
        sub     ecx, [edx+TText.GapBegin]
        add     ecx, ebx
        cmp     ecx, [edx+TText.Length]
        jae     .end_of_text

        movzx   eax, byte [edx+ecx]

        test    al, al
        jz      .end_of_text

        cmp     al, $0d
        je      .new_line

        cmp     al, $0a
        je      .new_line

        cmp     al, $20
        jbe     .next           ; skip all whitespace

        cmp     [.fNewLine], NEW_PARAGRAPH_EMPTY_LINES
        mov     [.fNewLine], 0
        jb      .paragraph_ok

        test    [.tagFlags], fDisableTags
        jnz     .paragraph_ok

        push    eax
        stdcall TextMoveGap, edx, ebx
        stdcall TextSetGapSize, edx, 4
        mov     eax, [edx+TText.GapBegin]
        mov     dword [edx+eax], "<p>"
        add     [edx+TText.GapBegin], 3
        add     ebx, 3
        pop     eax

.paragraph_ok:

        cmp     al, "["
        je      .start_tag

; here check for emoticons

        cmp     al, $f0         ; emoji?
        jb      .continue

        stdcall TextMoveGap, edx, ebx

        mov     ecx, [edx+TText.GapEnd]
        mov     esi, ecx        ; the start of thet emoji

.loop_emoji:
        stdcall IsEmoji, [edx+ecx]
        jnc     .end_emoji

        add     ecx, eax
        cmp     ecx, [edx+TText.Length]
        jb      .loop_emoji

.end_emoji:
        sub     ecx, esi
        jz      .loop           ; no emoji here...

        add     ebx, ecx

        mov     eax, [emoJ.lOpenP]
        add     eax, [emoJ.lClose]
        stdcall TextSetGapSize, edx, eax

        mov     edi, [edx+TText.GapBegin]
        add     edi, edx

        mov     esi, [emoJ.pOpenP]
        mov     ecx, [emoJ.lOpenP]
        add     ebx, ecx
        add     [edx+TText.GapBegin], ecx

        rep movsb

        stdcall TextMoveGap, edx, ebx

        mov     edi, [edx+TText.GapBegin]
        add     edi, edx

        mov     esi, [emoJ.pClose]
        mov     ecx, [emoJ.lClose]
        add     ebx, ecx
        add     [edx+TText.GapBegin], ecx

        rep movsb

        jmp     .loop

.continue:

; html encoding from here

        test    al, al          ; all values > 127 are unicode and should not be encoded.
        js      .next

        movzx   eax, byte [tbl_html+eax]
        test    al, al
        jz      .del_char
        jns     .next           ; the same as above

        lea     esi, [eax+tbl_html]     ; the address of the replacement string.
        lodsb
        movzx   ecx, al         ; length

; insert the replacement html encoding from esi
        stdcall TextMoveGap, edx, ebx
        stdcall TextSetGapSize, edx, ecx
        inc     [edx+TText.GapEnd]      ; delete the previous char.

        mov     edi, [edx+TText.GapBegin]
        add     edi, edx
        add     [edx+TText.GapBegin], ecx
        add     ebx, ecx

        rep movsb
        jmp     .loop

.del_char:
        stdcall TextMoveGap, edx, ebx
        inc     [edx+TText.GapEnd]      ; delete the current char.
        jmp     .loop

.not_a_tag_pop:

        add     esp, 4

.not_a_tag:

        mov     ebx, [.ofsStart]
        mov     eax, "["
        jmp     .continue

;------------------------------------------------------------------------------------

.new_line:
        inc     ebx

        mov     ecx, [edx+TText.GapEnd]
        cmp     ebx, [edx+TText.GapBegin]
        cmovb   ecx, [edx+TText.GapBegin]
        sub     ecx, [edx+TText.GapBegin]
        add     ecx, ebx
        cmp     ecx, [edx+TText.Length]
        jae     .end_of_text

        inc     [.fNewLine]

        xor     al, byte [edx+ecx]
        cmp     al, $0a xor $0d
        jne     .loop
        jmp     .next   ; skip the next char. it is part of CRLF (or LFCR sequence).

;-----------------------------------------------------------------------------

.start_tag:

        xor     ecx, ecx
        mov     [.ofsStart], ebx

.first_non_ws:
        inc     ebx

        mov     esi, [edx+TText.GapEnd]
        cmp     ebx, [edx+TText.GapBegin]
        cmovb   esi, [edx+TText.GapBegin]
        sub     esi, [edx+TText.GapBegin]
        add     esi, ebx
        cmp     esi, [edx+TText.Length]
        jae     .not_a_tag

        mov     al, [edx+esi]

        test    al, al
        jz      .not_a_tag

        cmp     al, ' '
        jbe     .first_non_ws

        mov     edi, ebx        ; the start of the hash name

        cmp     al, "/"
        je      .closing_tag

        test    [.tagFlags], fDisableTags
        jnz     .loop

.hash1:
        cmp     al, "="
        je      .tag_found
        cmp     al, "]"
        je      .tag_found

        mov     ah, al
        and     ah, $40
        shr     ah, 1
        or      al, ah  ; case insensitive hash.

        xor     cl, al
        mov     cl, [ tpl_func + ecx]

        inc     ebx

        mov     esi, [edx+TText.GapEnd]
        cmp     ebx, [edx+TText.GapBegin]
        cmovb   esi, [edx+TText.GapBegin]
        sub     esi, [edx+TText.GapBegin]
        add     esi, ebx
        cmp     esi, [edx+TText.Length]
        jae     .not_a_tag

        mov     al, [edx+esi]
        jmp     .hash1


.tag_found:

        mov     [.tagType], eax ; al = "=" or "]"

        mov     esi, [tableBBtags + sizeof.TPHashItem * ecx + TPHashItem.pKeyname]
        test    esi, esi
        jz      .not_a_tag      ; empty hash table cell.

        push    ecx

        mov     eax, ebx
        sub     eax, edi        ; the length of the tag
        movzx   ecx, byte [esi-1]  ; the length of the string in the hash table.
        cmp     ecx, eax
        jne     .not_a_tag_pop

        lea     eax, [ebx+1]
        stdcall TextMoveGap, edx, eax           ; the gap is after the tag, so, the offset and the position are the same.

        add     edi, edx           ; = pointer to the tag start. (edi contains the offset);
        xchg    esi, edi

.cmp_loop:
        dec     ecx
        js      .equal

        lodsb

        mov     ah, al
        and     ah, $40
        shr     ah, 1
        or      al, ah

        scasb
        je      .cmp_loop
        jmp     .not_a_tag_pop   ; the strings are different, so it is a collision. Ignore.

.equal:
        pop     ecx

; the tag name is the same!

        mov     eax, [tableBBtags + sizeof.TPHashItem * ecx + TPHashItem.Value]
        cmp     [eax+TOneTag.pClose], 0
        je      .stack_ok                       ; no need to push to the stack tags without closing tag.

        push    edx
        stdcall AddArrayItems, [.pStack], 1
        mov     [.pStack], edx
        mov     [eax], ecx      ; the last tag for close.
        pop     edx

.stack_ok:

        mov     edi, ebx   ; edi points one char before the attribute value or to the tag content value, depending on the tag type (with or without attribute).
        add     edi, [edx+TText.GapEnd]
        sub     edi, [edx+TText.GapBegin]

.skip_ws1:
        inc     edi
        cmp     edi, [edx+TText.Length]
        jae     .attr_here                      ; it is an empty attribute actually...

        cmp     byte [edx+edi], 0
        je      .attr_here

        cmp     byte [edx+edi], ' '
        jbe     .skip_ws1

.attr_here:
        add     edi, [edx+TText.GapBegin]
        sub     edi, [edx+TText.GapEnd]

; Here edi contains the position of the first non whitespace character of the attribute.
; Don't forget to increment it accordingly on inserting text before it.

        OutputValue "Open tag with hash=", ecx, 10, -1

        mov     eax, [edx+TText.GapBegin]
        sub     eax, [.ofsStart]

        sub     [edx+TText.GapBegin], eax       ; delete the start of the tag.
        sub     ebx, eax                        ; move ebx back, because of the deleted tag text.
        sub     edi, eax

        mov     eax, [tableBBtags + sizeof.TPHashItem * ecx + TPHashItem.Value]

        mov     [.tagAddr], eax

        push    [eax+TOneTag.flags]
        pop     [.tagFlags]

; remove the last paragraph (if exists) if the tag is block tag:
        test    [.tagFlags], fBlockTag
        jz      @f

        mov     ecx, [edx+TText.GapBegin]
        mov     ecx, [edx+ecx-3]
        and     ecx, $ffffff
        cmp     ecx, '<p>'
        jne     .clear_newline

        sub     [edx+TText.GapBegin], 3
        sub     ebx, 3
        sub     edi, 3

        jmp     .clear_newline

@@:
        cmp     [.fNewLine], 1
        jbe     .copy_tag_prefix

        mov     esi, [tagPara.pOpenP]
        mov     ecx, [tagPara.lOpenP]
        add     edi, ecx
        call    .copy_tag

.clear_newline:

        and     [.fNewLine], 0

.copy_tag_prefix:
        mov     esi, [eax+TOneTag.pOpenP]
        mov     ecx, [eax+TOneTag.lOpenP]
        add     edi, ecx
        call    .copy_tag

        mov     esi, [eax+TOneTag.pOpenS]
        mov     ecx, [eax+TOneTag.lOpenS]
        test    esi, esi
        jz      .mono_open_tag  ; the open tag consists of only one part, without attributes.

        cmp     byte [.tagType], '='
        je      .process_attribute

        test    [eax+TOneTag.flags], fEmptyAttr         ; if the tag allows empty attribute, simply copy
        jnz     .copy                                   ; the tag suffix without trying to replace the attribute.

; here copy and encode the attribute value:
.process_attribute:
;        inc     ebx

        push    esi ecx [edx+TText.GapBegin]

        lea     esi, [edi-1]

        mov     [.tagMix], '<u >'

        mov     eax, edi                     ; == esi+1
        add     eax, [edx+TText.GapEnd]
        sub     eax, [edx+TText.GapBegin]    ; eax = eax + (GapEnd - GapBegin)
        mov     al, byte [edx+eax]
        mov     [.char], al

.attr_loop:
        inc     esi

        mov     eax, esi
        add     eax, [edx+TText.GapEnd]
        sub     eax, [edx+TText.GapBegin]    ; eax = eax + (GapEnd - GapBegin)
        cmp     eax, [edx+TText.Length]
        jae     .end_of_attr2

        movzx   eax, byte [edx+eax]

        test    al, al
        jz      .end_of_attr2

        cmp     al, "]"
        je      .end_of_attr1

        cmp     al, "["
        je      .end_of_attr2

; check the mix flag

        test    [.tagFlags], fMixedDist
        jz      .mixed_ok

        xor     [.char], al
        mov     [.char], al
        jns     .mixed_ok

        stdcall TextSetGapSize, edx, 4
        mov     edi, [edx+TText.GapBegin]
        pushd   [.tagMix]
        popd    [edx+edi]
        add     [edx+TText.GapBegin], 4
        add     ebx, 4
        add     esi, 4
        xor     [.tagMix], '<u >' xor '</u>'

.mixed_ok:
; encode with HTML encoding.

        test    al, al          ; all values > 127 are unicode and should not be encoded.
        js      .store_char

        movzx   eax, byte [tbl_html+eax]
        test    al, al
        jz      .attr_loop
        jns     .store_char     ; it is non-encodable character, just copy it.

        push    esi

        lea     esi, [eax+tbl_html]     ; the address of the replacement string.
        lodsb
        movzx   ecx, al         ; length

        stdcall TextSetGapSize, edx, ecx
        mov     edi, [edx+TText.GapBegin]
        add     edi, edx
        add     [edx+TText.GapBegin], ecx
        add     ebx, ecx
        add     [esp], ecx      ; increase ESI that is in the stack right now.

        rep movsb
        pop     esi
        jmp     .attr_loop

.store_char:
        stdcall TextSetGapSize, edx, 1
        mov     edi, [edx+TText.GapBegin]
        mov     [edx+edi], al
        inc     [edx+TText.GapBegin]
        inc     ebx
        inc     esi
        jmp     .attr_loop


.end_of_attr1:
        inc     esi     ; delete "]"

        add     esi, [edx+TText.GapEnd]
        sub     esi, [edx+TText.GapBegin]
        mov     [edx+TText.GapEnd], esi

.end_of_attr2:
        cmp     [.tagMix], '</u>'
        jne     .mix_closed

        stdcall TextSetGapSize, edx, 4
        mov     edi, [edx+TText.GapBegin]
        pushd   [.tagMix]
        popd    [edx+edi]
        add     [edx+TText.GapBegin], 4
        add     ebx, 4
        add     esi, 4
        xor     [.tagMix], '<u >' xor '</u>'

.mix_closed:
        pop     edi     ; the start [edx+TText.GapBegin] - this is the start of the copied attribute.

        test    [.tagFlags], fURLAttribute
        jz      .url_ok

        mov     ecx, [edx+TText.GapBegin]
        sub     ecx, edi

        add     edi, edx

        sub     ebx, ecx
        sub     [edx+TText.GapBegin], ecx

        stdcall [.procSanitizeURL], edi, ecx
        push    eax

        stdcall StrPtr, eax

        mov     esi, eax
        mov     ecx, [eax+string.len]

        stdcall TextSetGapSize, edx, ecx

        add     ebx, ecx
        add     [edx+TText.GapBegin], ecx

        rep movsb

        stdcall StrDel ; from the stack

.url_ok:
        pop     ecx esi

.copy:
        call    .copy_tag
        test    [.tagFlags], fBlockTag
        jz      .next

        mov     [.fNewLine], NEW_PARAGRAPH_EMPTY_LINES  ; after start of a block tag, the first text starts a paragraph.
        jmp     .next


.mono_open_tag:

        cmp     byte [.tagType], '='
        jne     .next

; search the end of the attribute

        dec     edi
        add     edi, [edx+TText.GapEnd]
        sub     edi, [edx+TText.GapBegin]    ; edi = edi + (GapEnd - GapBegin)

.attr_loop2:
        inc     edi
        cmp     edi, [edx+TText.Length]
        jae     .end_of_attr3

        cmp     byte [edx+edi], 0
        je      .end_of_attr3

        cmp     byte [edx+edi], "]"
        jne     .attr_loop2

        inc     edi

.end_of_attr3:
        mov     [edx+TText.GapEnd], edi
        jmp     .next


.closing_tag:

.hash2:
        inc     ebx

        mov     esi, [edx+TText.GapEnd]
        cmp     ebx, [edx+TText.GapBegin]
        cmovb   esi, [edx+TText.GapBegin]
        sub     esi, [edx+TText.GapBegin]
        add     esi, ebx
        cmp     esi, [edx+TText.Length]
        jae     .not_a_tag

        mov     al, [edx+esi]
        test    al, al
        jz      .not_a_tag

        cmp     al, "]"
        je      .close_here

        mov     ah, al
        and     ah, $40
        shr     ah, 1
        or      al, ah  ; case insensitive hash.

        xor     cl, al
        mov     cl, [ tpl_func + ecx]
        jmp     .hash2

.close_here:

        OutputValue "Closing tag with hash=", ecx, 10, -1

        inc     edi     ; skip "/" char.

        mov     esi, [tableBBtags + sizeof.TPHashItem * ecx + TPHashItem.pKeyname]
        test    esi, esi
        jz      .not_a_tag

        test    [.tagFlags], fDisableTags
        jz      .process_closing

        mov     eax, [tableBBtags + sizeof.TPHashItem * ecx + TPHashItem.Value]
        cmp     eax, [.tagAddr]
        jne     .not_a_tag

.process_closing:
        and     [.tagFlags], 0

        push    ecx

        mov     eax, ebx
        sub     eax, edi        ; the length of the tag
        movzx   ecx, byte [esi-1]  ; the length of the string in the hash table.
        cmp     ecx, eax
        jne     .not_a_closing_tag

        lea     eax, [ebx+1]
        stdcall TextMoveGap, edx, eax           ; the gap is after the tag, so, the offset and the position are the same.

        add     edi, edx        ; the pointer to the tag start.
        xchg    esi, edi

.cmp_loop2:
        dec     ecx
        js      .equal2

        lodsb

        mov     ah, al
        and     ah, $40
        shr     ah, 1
        or      al, ah

        scasb
        je      .cmp_loop2

.not_a_closing_tag:
        pop     ecx
        jmp     .not_a_tag   ; the strings are different, so it is a collision. Ignore.

.equal2:
        pop     ecx

; the tag name is the same!

        mov     eax, [edx+TText.GapBegin]
        sub     eax, [.ofsStart]

        sub     ebx, eax                        ; move ebx back, because of the deleted tag text.
        sub     [edx+TText.GapBegin], eax       ; delete the start of the tag.

        mov     edi, [.pStack]
        mov     eax, [edi+TArray.count]
        test    eax, eax
        jz      .next           ; the stack is empty, so ignore the closing tag!

.close_loop:
        dec     eax
        js      .error_stack

        push    ecx
        mov     esi, [edi+TArray.array + 4*eax]
        mov     esi, [tableBBtags + sizeof.TPHashItem * esi + TPHashItem.Value]
        mov     ecx, [esi+TOneTag.lClose]
        mov     esi, [esi+TOneTag.pClose]
        call    .copy_tag
        pop     ecx

        cmp     ecx, [edi+TArray.array + 4*eax]
        jne     .close_loop

        mov     [edi+TArray.count], eax
        jmp     .next

.error_stack:
        inc     eax
        mov     [edi+TArray.count], eax
        jmp     .next


.end_of_text:
; here, close all open tags and free the stack array.

        stdcall TextMoveGap, edx, ebx

        mov     edi, [.pStack]
        mov     eax, [edi+TArray.count]

.closeall:
        dec     eax
        js      .finish

        mov     esi, [edi+TArray.array + 4*eax]
        mov     esi, [tableBBtags + sizeof.TPHashItem * esi + TPHashItem.Value]

        mov     ecx, [esi+TOneTag.lClose]
        mov     esi, [esi+TOneTag.pClose]
        call    .copy_tag
        jmp     .closeall

.finish:
        stdcall FreeMem, edi

        mov     [esp+4*regEDX], edx
        popad
        return


.copy_tag:
        push    edi
        stdcall TextSetGapSize, edx, ecx

        mov     edi, [edx+TText.GapBegin]
        add     edi, edx
        add     [edx+TText.GapBegin], ecx
        add     ebx, ecx

        rep movsb
        pop     edi
        retn
endp



macro HtmlEntities name, [char, encoding] {
common
  local ..tabl

  label ..tabl byte
  if used name
    label name byte
    db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
    db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
    db $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $2a, $2b, $2c, $2d, $2e, $2f
    db $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3a, $3b, $3c, $3d, $3e, $3f
    db $40, $41, $42, $43, $44, $45, $46, $47, $48, $49, $4a, $4b, $4c, $4d, $4e, $4f
    db $50, $51, $52, $53, $54, $55, $56, $57, $58, $59, $5a, $5b, $5c, $5d, $5e, $5f
    db $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6a, $6b, $6c, $6d, $6e, $6f
    db $70, $71, $72, $73, $74, $75, $76, $77, $78, $79, $7a, $7b, $7c, $7d, $7e, $7f

forward
  local ..offs, ..name, ..len

  if encoding eqtype ''
    ..name db ..len, encoding
    ..len = $ - ..name - 1
    ..offs = ..name - ..tabl
  else
    ..offs = encoding
  end if

  assert ..offs < 256

forward
  local ..char, ..ascii
  virtual at 0
    ..char db char
    load ..ascii byte from ..char
  end virtual
  assert ..ascii < 128
  store byte ..offs at ..tabl + ..ascii

common
  end if
  DispSize "HTML entities table:", $-..tabl
}


iglobal
  HtmlEntities tbl_html,        \
    $09, $0d,                   \
    $0a, $0a,                   \
    $0d, $0d,                   \
    '<', '&lt;',                \
    '>', '&gt;',                \
    '"', '&quot;',              \
    "'", '&apos;',              \
    '&', '&amp;'
endg





endmodule

Added freshlib/data/bitstream.asm.













































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Dynamic bit streams library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Based on works of Mateusz Tymek.
;_________________________________________________________________________________________


module "BitStream"

;struct TBitStream2
;  .dwLength   dd ?       ; length of the stream in dwords
;  .dwCurrent  dd ?       ; current bit dword.
;
;  .bitLength  db ?       ; remainder of length in bits [0..31]
;  .bitCurrent db ?       ; current bit number [0..31]
;              rb 2       ; align
;
;  .capacity   dd ?       ; capacity in dwords
;  label .data dword
;ends


struct TBitStream
  .bitLength   dd ?     ; length of the stream data in bits.
  .capacity    dd ?     ; in dword
  .biCurrent   dd ?     ; current bit index...
  .lparam      dd ?     ; user defined value.
  label .data dword
ends


; creates bits stream and returns pointer
; free it with FreeMem
proc BitsCreate, .length
begin
        push    ecx

        mov     ecx, [.length]
        add     ecx, 3
        and     ecx, $fffffffc
        add     ecx, sizeof.TBitStream

        stdcall GetMem, ecx
        jc      .finish

        sub     ecx, sizeof.TBitStream
        shr     ecx, 2  ; length in dwords.
        mov     [eax+TBitStream.capacity], ecx

        clc

.finish:
        pop     ecx
        return
endp



; puts given number of bits into stream
; returns in EAX the address of the
; stream. It can be changed if the stream was resized.

proc BitsPut, .pStream, .bits, .bit_count
begin
        pushad

        and     [.bit_count], $1f       ; max of 32 bits at once.

        mov     ebx, [.pStream]

; provide some room first:

        mov     ecx, [ebx+TBitStream.biCurrent]
        shr     ecx, 5          ; dword index
        add     ecx, 2          ; at least two dword reserve.
        cmp     ecx, [ebx+TBitStream.capacity]
        jbe     .sizeok

        call    [ResizeIt]
        mov     edx, ecx

        shl     ecx, 2  ; in bytes
        add     ecx, sizeof.TBitStream

        stdcall ResizeMem, ebx, ecx
        jc      .error                  ; can't be resized; the stream buffer is full

        mov     ebx, eax
        mov     [ebx+TBitStream.capacity], edx

.sizeok:
        ; generate mask in edi:esi
        xor     eax, eax
        dec     eax
        mov     esi, eax
        mov     edi, eax

        mov     ecx, [.bit_count]

        shl     esi, cl
        mov     ecx, [ebx+TBitStream.biCurrent]
        and     ecx, $1f

        shld    edi, esi, cl
        shld    esi, eax, cl

        ; load new bits into edx:ecx; at this point ecx == [ebx+TBitStream.bitCurrent]
        xor     edx, edx
        mov     eax, [.bits]
        shld    edx, eax, cl
        shl     eax, cl
        mov     ecx, eax

; finally, store new bits using
        mov     eax, [ebx+TBitStream.biCurrent]
        shr     eax, 5

        and     [ebx+TBitStream.data+4*eax], esi
        or      [ebx+TBitStream.data+4*eax], ecx

        inc     eax

        and     [ebx+TBitStream.data+4*eax], edi
        or      [ebx+TBitStream.data+4*eax], edx

; and fix the pointers
.done:
        mov     eax, [.bit_count]
        add     eax, [ebx+TBitStream.biCurrent]

        cmp     eax, [ebx+TBitStream.bitLength]
        jbe     @f
        mov     [ebx+TBitStream.bitLength], eax
@@:
        mov     [ebx+TBitStream.biCurrent], eax

.finish:
        mov     [esp+4*regEAX], ebx
        clc
        popad
        return

.error:
        popad
        stc
        return
endp



; reads given number of bits form the stream
proc BitsGet, .pStream, .bit_count
begin
        pushad

        and     [.bit_count], $1f

        ; generate mask (in esi)
        xor     esi, esi
        dec     esi
        mov     ecx, [.bit_count]
        shl     esi, cl
        not     esi

        mov     ebx, [.pStream]

        mov     eax, [ebx+TBitStream.biCurrent]
        mov     edx, [.bit_count]
        add     edx, eax
        cmp     edx, [ebx+TBitStream.bitLength]
        ja      .error

        mov     ecx, eax
        shr     eax, 5
        and     ecx, $1f

        mov     edx, [ebx+TBitStream.data+4*eax+4]
        mov     eax, [ebx+TBitStream.data+4*eax]

        shrd    eax, edx, cl
        and     eax, esi

; update the current position
        mov     edx, [.bit_count]
        add     [ebx+TBitStream.biCurrent], edx

        mov     [esp+4*regEAX], eax
        popad
        clc
        return

.error:
        popad
        stc
        return
endp


proc BitsSkipToByte, .pStream
begin
        mov     eax, [.pStream]
        add     [eax+TBitStream.biCurrent], 7
        and     [eax+TBitStream.biCurrent], $fffffff8
        mov     eax, [eax+TBitStream.biCurrent]
        shr     eax, 3
        return
endp

; returns the pointer at the begining of the requested block in EAX
; returns the stream pointer in EDX (it can be changed on reallocation)
proc BitsGetRoom, .pStream, .room
begin
        push    ebx ecx

        mov     edx, [.pStream]

        mov     ebx, [edx+TBitStream.biCurrent]
        add     ebx, 7
        and     ebx, $fffffff8
        shr     ebx, 3  ; index in bytes.

        mov     ecx, [edx+TBitStream.capacity]
        shl     ecx, 2  ; capacity in bytes.

        mov     eax, [.room]
        add     eax, ebx        ; the total size needed

        cmp     eax, ecx
        jbe     .sizeok

        mov     ecx, eax
        call    [ResizeIt]

; align to dword
        add     ecx, 3
        and     ecx, $fffffffc
        lea     eax, [ecx+sizeof.TBitStream]

        stdcall ResizeMem, edx, eax
        jc      .error ;.finish    ; CF=1

        shr     ecx, 2
        mov     edx, eax
        mov     [eax+TBitStream.capacity], ecx

        mov     eax, [.room]

.sizeok:
        mov     eax, [.room]
        add     eax, ebx
        lea     eax, [8*eax]
        mov     [edx+TBitStream.biCurrent], eax
        cmp     eax, [edx+TBitStream.bitLength]
        jbe     @f
        mov     [edx+TBitStream.bitLength], eax
@@:
        lea     eax, [edx+ebx+sizeof.TBitStream]
        clc

.finish:
        pop     ecx ebx
        return

.error:
        int3
        jmp     .finish

endp



; returns the current size (in bytes) of the given stream

proc BitsGetSize, .pStream
begin
        mov     eax, [.pStream]
        mov     eax, [eax+TBitStream.bitLength]
        add     eax, $7
        shr     eax, 3
        return
endp



proc BitsLoadFromFile, .ptrFileName
begin
        push    esi edi ebx

        stdcall FileOpen, [.ptrFileName]
        jc      .error

        mov     edi, eax

        stdcall FileSize, edi
        jc      .errorclose

        mov     ebx, eax
        lea     ecx, [eax+3]
        and     ecx, $fffffffc

        lea     ecx, [eax+8+sizeof.TBitStream]    ; It is for the case that the file is
                                                  ; text and we want to use it as null terminated
                                                  ; string.

        stdcall GetMem, ecx
        jc      .errorclose
        mov     esi, eax

        mov     eax, ebx
        mov     ecx, ebx
        shl     eax, 3          ; bit length
        lea     ecx, [eax+3]
        shr     ecx, 2          ; capacity in dword;

        mov     [esi + TBitStream.bitLength], eax
        mov     [esi + TBitStream.capacity], ecx

        lea     eax, [esi+TBitStream.data]
        stdcall FileRead, edi, eax, ebx
        jc      .errorclosemem

        mov     ecx, eax

        stdcall FileClose, edi

        mov     eax, esi
        clc
        pop     ebx edi esi
        return

.errorclosemem:
        stdcall FreeMem, esi

.errorclose:
        push    eax
        stdcall FileClose, edi
        pop     eax

.error:
        xor     ecx, ecx
        stc
        pop     ebx edi esi
        return
endp





endmodule

Added freshlib/data/buffergap.asm.

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TText structure and handling library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: TText is so called "buffer gap" method of editing text information.
;         it allows fast insert and delete operations.
;_________________________________________________________________________________________
module "Buffer gap engine"


gapDefaultSize = 4096 ; 256

; There are 3 coordinate systems in the TText structure:
;
;   1. "Offset"   - this is simple offset inside the memory, relative to the begining of the structure.
;
;   2. "Position" - this is the coordinate of the bytes in the buffer, excluding the gap (which can be placed anywhere in the text).
;
;   3. "Index"    - character position - the coordinate of a character in the text buffer. In the case the buffer contains only ANSI characters index=pos;
;                   In the case when the buffer contains UTF-8 characters, the relation is not so direct and has to be computed for every character.
;                   This coordinate is not easy to be calculated, but it is rarely needed.
;
; The structure TText is backward structure. All members has negative offsets and the
; pointer to the structure points to its end, not to the start.
;
; The structure has fixed header and variable, dynamically changed length.
; All the text in the structure has positive offsets and all the header fields, negative.

rstruct TText
  .Length     dd  ?       ; The total length of the buffer in bytes
  .GapBegin   dd  ?       ; In offset units.
  .GapEnd     dd  ?       ; In offset units.
  .struc_size dd  ?       ; the size of the structure (it can be extended up).
  label .     byte        ; the text in UTF-8 encoding.
ends



proc TextIndexToPos, .pText, .index
begin
        pushad

        mov     esi, [.pText]
        xor     edx, edx
        mov     ebx, [.index]

.loop:
        dec     ebx
        js      .finish

        mov     eax, [esi+TText.GapBegin]
        cmp     edx, eax
        cmovae  eax, [esi+TText.GapEnd]
        sub     eax, [esi+TText.GapBegin]
        add     eax, edx

        cmp     eax, [esi+TText.Length]
        jae     .error

        movzx   eax, byte [esi+eax]

                                ; compute the length of the UTF-8 character by its first byte (version without branches) Is it fast?
        not     al              ; utf-8 starts with one of: 0xxxxxxx, 110xxxxx, 1110xxxx, 11110xxx, 111110xx, 1111110x
        bsr     eax, eax        ; eax =                 7,  5,  4,  3,  2,  1
        sub     eax, 7          ; eax =                 0, -2, -3, -4, -5, -6
                                ; CF  =                 0,  1,  1,  1,  1,  1
        not     eax             ; eax =                -1, +1, +2, +3, +4, +5
        sbb     eax, -2         ; eax = edx + 2 - CF = +1, +2, +3, +4, +5, +6

        add     edx, eax
        jmp     .loop

.finish:
        mov     [esp+4*regEAX], edx
        clc
        popad
        return

.error:
        mov     eax, [esi+TText.Length]
        sub     eax, [esi+TText.GapEnd]
        add     eax, [esi+TText.GapBegin]
        mov     [esp+4*regEAX], eax
        stc
        popad
        return
endp




proc TextPosToIndex, .pText, .Pos
begin
        pushad

        mov     edx, [.pText]
        mov     ecx, [.Pos]

        mov     eax, [edx+TText.Length]
        sub     eax, [edx+TText.GapEnd]
        add     eax, [edx+TText.GapBegin]

        cmp     ecx, eax
        cmova   ecx, eax

        xor     ebx, ebx

.loop:
        dec     ecx
        js      .finish

        mov     esi, [edx+TText.GapEnd]
        cmp     ecx, [edx+TText.GapBegin]
        cmovb   esi, [edx+TText.GapBegin]
        sub     esi, [edx+TText.GapBegin]
        add     esi, ecx

        mov     al, [edx+esi]
        and     al, 11000000b
        cmp     al, 10000000b
        je      .loop

        inc     ebx
        jmp     .loop


.finish:
        mov     [esp+4*regEAX], ebx
        popad
        return
endp






; Converts from text position (in bytes) to buffer position (in bytes).
; returns CF=1 if the position is outside the text.
; the returned position is relative to the text start.
;
; esi == .buffer; eax = .pos
;
; If eax is above the size of the text, the position of the buffer end is returned.
; All positions are unsigned, so passing eax = $ffffffff will return the end of the
; data in the buffer.
;
; See also the pos2ofs macro. Because of the simple operation it is better to use it
; or even explicit processing.

proc TextPosToOffset, .pText, .pos
begin
        push    ebx
        mov     eax, [.pos]
        mov     ebx, [.pText]

        cmp     eax, [ebx+TText.GapBegin]
        jb      @f
        add     eax, [ebx+TText.GapEnd]
        sub     eax, [ebx+TText.GapBegin]
@@:
        cmp     eax, [ebx+TText.Length]
        cmova   eax, [ebx+TText.Length]
        pop     ebx
        return
endp


macro pos2ofs  pos, text {
local ..skip

  if pos eqtype eax & text eqtype eax
    cmp    pos, [text+TText.GapBegin]
    jb     ..skip
    add    pos, [text+TText.GapEnd]
    sub    pos, [text+TText.GapBegin]
..skip:
    cmp    pos, [text+TText.Length]    ; ?????????
    cmova  pos, [text+TText.Length]    ; ?????????
  else
    error "Error! Arguments must be registers!"
    err
  end if
}


; Converts from buffer offset to the text position.
; Arguments:
;   .pText: points to the TText strucure, eax is the offset
;   .offs: offset in bytes.
;
; if the buffer offset is placed inside the gap, the start of the gap is returned.
;
; See also ofs2pos macro. Very often it is better to use the macro or explicit processing,
; instead of procedure call, because the operation is very simple.

proc TextOffsetToPos, .pText, .offs
begin
        push    ebx
        mov     eax, [.offs]
        mov     ebx, [.pText]

        cmp     eax, [ebx+TText.Length]
        cmova   eax, [ebx+TText.Length]

        cmp     eax, [ebx+TText.GapBegin]
        jb      .finish

        add     eax, [ebx+TText.GapEnd]
        sub     eax, [ebx+TText.GapBegin]

        cmp     eax, [ebx+TText.GapBegin]
        cmovb   eax, [ebx+TText.GapBegin]

.finish:
        pop     ebx
        return
endp


macro ofs2pos ofs, text {
local ..skip

  if ofs eqtype eax & text eqtype eax
        cmp     ofs, [text+TText.Length]
        cmova   ofs, [text+TText.Length]

        cmp     ofs, [text+TText.GapBegin]
        jb      ..skip

        add     ofs, [text+TText.GapBegin]
        sub     ofs, [text+TText.GapEnd]

        cmp     ofs, [text+TText.GapBegin]
        cmovb   ofs, [text+TText.GapBegin]
..skip:
  else
    error "Error! Arguments must be registers!"
    err
  end if
}


; Moves the gap to the desired position.
; Arguments:
;   .pText        - pointer to the TText
;   .position     - position of the gap in position units.
; Returns:
;   Nothing
;
; This operation can't fail. Preserves all registers.

proc TextMoveGap, .pText, .position
begin
        pushad

        mov     edx, [.pText]
        mov     ecx, [.position]

        mov     eax, [edx+TText.Length]
        mov     edi, [edx+TText.GapBegin]
        mov     esi, [edx+TText.GapEnd]

        sub     eax, esi
        add     eax, edi

        cmp     ecx, eax
        cmova   ecx, eax        ; the maximal possible position for the gap.

        sub     ecx, edi        ; [edx+TText.GapBegin]  ; ecx is the distance to move the gap.
        jz      .finish                                 ; source and destination are the same - no move.

        add     [edx+TText.GapBegin], ecx
        add     [edx+TText.GapEnd], ecx

        cmp     esi, edi
        je      .finish        ; the gap length is 0 nothing to move

        add     edi, edx
        add     esi, edx

        test    ecx, ecx
        js      .move_back

        push    ecx
        shr     ecx, 2
        rep movsd
        pop     ecx
        and     ecx, 3
        rep movsb

.finish:

; fill the gap with placeholder char in order to make debug easy! It lowers the performance a lot!!!
if defined options.DebugMode & options.DebugMode
        call    __fill_the_gap
end if

        popad
        return

.move_back:
        std

        neg     ecx
        xchg    esi, edi

        dec     esi
        dec     edi

        push    ecx
        and     ecx, 3
        rep movsb

        sub     esi, 3
        sub     edi, 3

        pop     ecx
        shr     ecx, 2
        rep movsd

        cld
        jmp     .finish
endp


proc __fill_the_gap
begin
        push    edi ecx eax

        mov     edi, [edx+TText.GapBegin]
        mov     ecx, [edx+TText.GapEnd]
        sub     ecx, edi
        add     edi, edx
        mov     al, '*'
        rep stosb

        pop     eax ecx edi
        return
endp



proc TextCreate, .struc_size
begin
        push    ecx

        mov     ecx, [.struc_size]
        mov     eax, ecx
        add     eax, gapDefaultSize

        stdcall GetMem, eax
        jc      .finish

        lea     eax, [eax+ecx]
        mov     [eax+TText.struc_size], ecx
        xor     ecx, ecx
        mov     [eax+TText.GapBegin], ecx
        mov     [eax+TText.GapEnd], gapDefaultSize
        mov     [eax+TText.Length], gapDefaultSize

.finish:
        pop     ecx
        return
endp


;---------------------------------------------------------------------------------
; Duplicates TText structure of any size. Returns pointer to the structure in EAX
; The returned pointer have to be freed with TextFree when not needed anymore.
;
; Arguments:
;   .pText - pointer to the source structure
;
; Returns:
;   CF = 0 if everithing is OK. In this case EAX is a pointer to the new TText structure.
;   CF = 1 if there is an error. The TText is not duplicated and EAX contains the value
;          before the call.
;---------------------------------------------------------------------------------

proc TextDup, .pText
begin
        pushad

        mov     esi, [.pText]
        test    esi, esi
        stc
        jz      .finish

        mov     ecx, [esi+TText.Length]
        add     ecx, [esi+TText.struc_size]

        stdcall GetMem, ecx
        jc      .finish
        mov     edi, eax

        mov     edx, [esi+TText.struc_size]

        add     eax, edx
        mov     [esp+4*regEAX], eax

        sub     esi, edx

        mov     ebx, ecx
        shr     ecx, 2
        and     ebx, 3

        rep movsd

        mov     ecx, ebx
        rep movsb
        clc

.finish:
        popad
        return
endp



proc TextFree, .pText
begin
        push    eax
        mov     eax, [.pText]
        test    eax, eax
        jz      .exit

        sub     eax, [eax+TText.struc_size]
        stdcall FreeMem, eax

.exit:
        pop     eax
        return
endp



; Ensures that the gap size is at least [.desired_size] bytes long.
; If needed, reallocates the TText
;
; In order to provide less frequent reallocations, the procedure
; always allocates bigger gap than requested.
; max([.desired_size]*2, gapDefaultSize) memory is allocated,
; if the buffer is to be reallocated.
;
; Arguments:
;   .pText        - pointer to TText
;   .desired_size - desired size of the gap.
;
; Returns
;   edx - pointer to the same TText. Can be changed because of memory reallocation.
;   CF = 0 if OK
;   CF = 1 if the memory reallocation failed.
;

proc TextSetGapSize, .pText, .desired_size
begin
        pushad

        mov     edx, [.pText]
        mov     ecx, [.desired_size]
        mov     eax, [edx+TText.GapEnd]
        sub     eax, [edx+TText.GapBegin]

        cmp     eax, ecx
        jae     .finish         ; CF==0

        lea     ecx, [2*ecx]
        mov     eax, gapDefaultSize
        cmp     ecx, eax
        cmovl   ecx, eax                          ; ecx is the new gap size here.

        mov     ebx, [edx+TText.Length]           ; current data size. text+gap
        add     ebx, [edx+TText.GapBegin]
        sub     ebx, [edx+TText.GapEnd]
        add     ebx, ecx
        add     ebx, [edx+TText.struc_size]       ; the new buffer size. it will always be higher than the current.
        add     ebx, $0000000f
        and     ebx, $fffffff0

        push    [edx+TText.struc_size]
        sub     edx, [edx+TText.struc_size]
        stdcall ResizeMem, edx, ebx
        pop     edx
        lea     edx, [edx+eax]
        jc      .finish                           ; well, it is just an error, but how to proceed?

        sub     ebx, [edx+TText.struc_size]       ; total size of the buffer

        lea     edi, [edx+ebx]
        xchg    ebx,[edx+TText.Length]            ; ebx is now the old buffer length.

        lea     esi, [edx+ebx]

; the space is allocated and there are 2 gaps. So, merge them now. The new gap is always at the end.
; the size of the new gap is

        mov     ecx, ebx
        sub     ecx, [edx+TText.GapEnd]

        std

        dec     esi
        dec     edi

        push    ecx
        and     ecx, 3

        rep movsb

        sub     esi, 3
        sub     edi, 3

        pop     ecx
        shr     ecx, 2

        rep movsd

        cld

        sub     edi, edx
        add     edi, 4
        mov     [edx+TText.GapEnd], edi

        clc

.finish:
        mov     [esp+4*regEDX], edx

; fill the gap with placeholder char in order to make debug easy! It lowers the performance a lot!!!
if defined options.DebugMode & options.DebugMode
        call    __fill_the_gap
end if
        popad
        return
endp





; Inserts on the current gap position up to 4 bytes of character data.
; They can be 4 ANSI characters, or one 4 byte encoded UTF-8 or
; two 2-byte encoded UTF-8, one ASCII and one 2 byte UTF-8 and so on.
;
; .pText - pointer to the TText,
; .char -  from 0 to 4 bytes character data.

proc TextAddChar, .pText, .char
begin
        push    eax ecx

        mov     edx, [.pText]

        stdcall TextSetGapSize, edx, 8
        jc      .finish

        mov     eax, [edx+TText.GapBegin]

        pushd   0 [.char]
        popd    [edx+eax] [edx+eax+4]

        mov     ecx, 4

.len_loop:
        cmp     byte [edx+eax], 0
        je      .len_ok
        inc     eax
        loop    .len_loop

.len_ok:
        mov     [edx+TText.GapBegin], eax
        clc

.finish:
        pop     ecx eax
        return
endp




; Deletes one UTF-8 character at the current gap position.
; esi - pointer to TText

proc TextDelChar, .pText
begin
        push    eax edx
        mov     edx, [.pText]

        mov     eax, [edx+TText.GapEnd]
        cmp     eax, [edx+TText.Length]
        jae     .len_ok

        movzx   eax, byte [edx+eax]
                                ; compute the length of the UTF-8 character by its first byte (version without branches) Is it fast?
        not     al              ; utf-8 starts with one of: 0xxxxxxx, 110xxxxx, 1110xxxx, 11110xxx, 111110xx, 1111110x
        bsr     eax, eax        ; eax =                 7,  5,  4,  3,  2,  1
        sub     eax, 7          ; eax =                 0, -2, -3, -4, -5, -6
                                ; CF  =                 0,  1,  1,  1,  1,  1
        not     eax             ; eax =                -1, +1, +2, +3, +4, +5
        sbb     eax, -2         ; eax = eax + 2 - CF = +1, +2, +3, +4, +5, +6

        add     [edx+TText.GapEnd], eax

.len_ok:
        pop     edx eax
        return
endp



; returns eax - the character in utf-8
;         edx - the length of the char in bytes.
; CF = 1 if the gap is after the text.

proc TextGetChar, .pText
begin
        pushad
        mov     esi, [.pText]

        mov     eax, [esi+TText.GapEnd]
        cmp     eax, [esi+TText.Length]

        cmc              ;
        jc      .finish  ; == jae, but CF == 1

        movzx   edx, byte [esi+eax]
        mov     eax, dword [esi+eax]

                                ; compute the length of the UTF-8 character by its first byte (version without branches) Is it fast?
        not     dl              ; utf-8 starts with one of: 0xxxxxxx, 110xxxxx, 1110xxxx, 11110xxx, 111110xx, 1111110x
        bsr     edx, edx        ; edx =                 7,  5,  4,  3,  2,  1
        sub     edx, 7          ; edx =                 0, -2, -3, -4, -5, -6
                                ; CF  =                 0,  1,  1,  1,  1,  1
        not     edx             ; edx =                -1, +1, +2, +3, +4, +5
        sbb     edx, -2         ; edx = edx + 2 - CF = +1, +2, +3, +4, +5, +6

        lea     ecx, [8*edx]
        xor     ebx, ebx
        dec     ebx
        shl     ebx, cl
        not     ebx
        and     eax, ebx

        mov     [esp+4*regEAX], eax
        mov     [esp+4*regEDX], edx

.finish:
        popad
        return
endp




; Inserts a string in the TText structure
; which can be pointer to NULL terminated string or
; string handle.
;
; Arguments:
;   .pText - pointer to the TText structure
;   .position  - position where the string to be inserted.
;   .hString - pointer or handle of string to be inserted.
; Returns:
;   edx: pointer to TText structure. Can be changed because of reallocations.
;   eax: length of the string added.

proc TextAddString, .pText, .position, .hString
begin
        pushad

        mov     edx, [.pText]

        stdcall StrLen, [.hString]
        mov     ecx, eax
        mov     ebx, eax

        stdcall StrPtr, [.hString]
        mov     esi, eax

        stdcall TextSetGapSize, edx, ecx
        jc      .finish

        stdcall TextMoveGap, edx, [.position]

        mov     edi, [edx+TText.GapBegin]
        add     edi, edx

        shr     ecx, 2
        rep movsd
        mov     ecx, ebx
        and     ecx, 3
        rep movsb

        add     [edx+TText.GapBegin], ebx

.finish:
        mov     [esp+4*regEAX], ebx
        mov     [esp+4*regEDX], edx
        popad
        return
endp





proc TextAddStr2, .pText, .position, .hString, .maxLength
begin
        pushad
        mov     edx, [.pText]

        mov     eax, [.hString]
        cmp     eax, [StrHandleOffs]
        jb      .proceed
        cmp     eax, [StrHandleEnd]
        jae     .proceed

        stdcall StrLen, [.hString]
        mov     [.maxLength], eax

        stdcall StrPtr, [.hString]

.proceed:
        mov     esi, eax

        add     [.maxLength], 4  ; some reserve
        stdcall TextSetGapSize, edx, [.maxLength]
        jc      .finish

        stdcall TextMoveGap, edx, [.position]

        mov     edi, [edx+TText.GapBegin]
        add     edi, edx

.copy_loop:
        lodsd
        stosd

        mov     ebx, eax
        not     eax
        sub     ebx, $01010101
        and     eax, ebx
        and     eax, $80808080
        jz      .copy_loop

        xor     eax, eax
        sub     edi, 5

.final_loop:
        inc     edi
        cmp     [edi], al
        jne     .final_loop

        sub     edi, edx
        sub     edi, [edx+TText.GapBegin]
        add     [edx+TText.GapBegin], edi

        clc
        mov     [esp+4*regEAX], edi

.finish:
        mov     [esp+4*regEDX], edx
        popad
        return
endp



proc TextAddBytes, .pText, .position, .pData, .DataLen
begin
        pushad
        mov     edx, [.pText]
        mov     esi, [.pData]

        stdcall TextSetGapSize, edx, [.DataLen]
        jc      .finish

        stdcall TextMoveGap, edx, [.position]

        mov     edi, [edx+TText.GapBegin]
        add     edi, edx
        mov     ebx, [.DataLen]

        mov     ecx, ebx
        shr     ecx, 2
        rep movsd

        mov     ecx, ebx
        and     ecx, 3
        rep movsb

        add     [edx+TText.GapBegin], ebx

.finish:
        mov     [esp+4*regEDX], edx
        popad
        return
endp




proc TextAddText, .pText, .position, .pTextSrc
begin
        pushad

        mov     edx, [.pText]
        mov     ebx, [.pTextSrc]

        mov     ecx, [ebx+TText.Length]
        sub     ecx, [ebx+TText.GapEnd]
        add     ecx, [ebx+TText.GapBegin]       ; total length
        mov     [esp+4*regEAX], ecx

        stdcall TextSetGapSize, edx, ecx
        stdcall TextMoveGap, edx, [.position]

        mov     edi, edx
        mov     esi, ebx

        add     edi, [edx+TText.GapBegin]
        mov     eax, [ebx+TText.GapBegin]

        mov     ecx, eax
        and     eax, 3
        shr     ecx, 2

        rep movsd
        mov     ecx, eax
        rep movsb

        mov     eax, [ebx+TText.Length]
        mov     esi, ebx

        sub     eax, [ebx+TText.GapEnd]
        add     esi, [ebx+TText.GapEnd]

        mov     ecx, eax
        and     eax, 3
        shr     ecx, 2

        rep movsd
        mov     ecx, eax
        rep movsb

        sub     edi, edx
        mov     [edx+TText.GapBegin], edi

        mov     [esp+4*regEDX], edx
        popad
        return
endp



; Moves the gap to the end of the text and if possible inserts byte 0 after it, so
; the buffer can be used as an ASCIIZ string.
; returns the length of the string in eax and the pointer to the TText object in edx (it can be changed!)

proc TextCompact, .pText
begin
        mov     edx, [.pText]
        stdcall TextMoveGap, edx, -1
        stdcall TextSetGapSize, edx, 4

        mov     eax, [edx+TText.GapBegin]   ; the length of the text.
        and     dword [edx+eax], 0
        return
endp


tsfCaseIgnore = 0
tsfCaseSensitive = 1

; Returns the prepared index table for the substring search algorithm.
; After use need to be freed by FreeMem.
; The Knuth-Morris-Pratt prefix function is used.
proc TextPrepareSearch, .hSubstr, .flags
begin
        pushad

        stdcall StrPtr, [.hSubstr]
        mov     esi, eax

        stdcall StrLen, [.hSubstr]
        shl     eax, 2

        stdcall GetMem, eax
        mov     edi, eax
        mov     [esp + 4*regEAX], eax

        xor     ebx, ebx      ; i
        xor     edx, edx      ; j

        mov     [edi], ebx                  ; pf[0] = 0

.loop:
        inc     ebx
        mov     al, [esi+ebx]               ; s[i]

        test    al, al
        jz      .finish

        test    [.flags], tsfCaseSensitive
        jnz     .inner

        and     al, $40
        shr     al, 1
        or      al, [esi+ebx] ; locase(s[i])

.inner:
        mov     ah, [esi+edx]

        test    [.flags], tsfCaseSensitive
        jnz     .case_ok

        and     ah, $40
        shr     ah, 1
        or      ah, [esi+edx] ; locase(s[j])

.case_ok:
        test    edx, edx
        jz      .nexti                      ; j == 0

        cmp     al, ah               ; s[i] == s[j]?
        je      .nexti                      ; ==

        mov     edx, [edi + 4*edx - 4]      ; j = pf[j-1]
        jmp     .inner

.nexti:
        cmp     al, ah                  ; s[i] == s[j]?
        lea     eax, [edx + 1]
        cmove   edx, eax                ; if s[i] == s[j] j++

        mov     [edi + 4*ebx], edx      ; pf[i] = j
        jmp     .loop

.finish:
        popad
        return
endp


; Searches a substring in the TText, starting from position .From.
; Returns the substring Position
; Knuth-Morris-Pratt search is implemented.
; For the index - call TextPrepareSearch procedure.
proc TextSearch, .pText, .hSubstr, .From, .pIndex, .flags
.slen dd ?
begin
        pushad

        mov     edx, [.pText]
        mov     edi, [.pIndex]

        stdcall StrLen, [.hSubstr]
        mov     [.slen], eax

        stdcall StrPtr, [.hSubstr]
        mov     esi, eax

        mov     ebx, [.From]   ; i
        xor     ecx, ecx       ; j

        dec     ebx

.loop:
        inc     ebx
        cmp     ebx, [edx+TText.GapBegin]
        jb      .iok
        cmp     ebx, [edx+TText.GapEnd]
        jae     .iok

        add     ebx, [edx+TText.GapEnd]
        sub     ebx, [edx+TText.GapBegin]

.iok:
        cmp     ebx, [edx+TText.Length]
        jae     .not_found

        mov     al, [edx+ebx]  ; s[i]
        test    [.flags], tsfCaseSensitive
        jnz     .inner

        and     al, $40
        shr     al, 1
        or      al, [edx+ebx] ; locase(s[i])

.inner:
        mov     ah, [esi+ecx]                   ; p[j]
        test    [.flags], tsfCaseSensitive
        jnz     .case_ok

        and     ah, $40
        shr     ah, 1
        or      ah, [esi+ecx] ; loCase(p[j])

.case_ok:
        jecxz   .nexti

        cmp     al, ah
        je      .nexti

        mov     ecx, [edi+4*ecx-4]      ; j = pf[j-1]
        jmp     .inner

.nexti:
        cmp     al, ah           ; s[i] == p[j]
        lea     eax, [ecx+1]
        cmove   ecx, eax         ; j++ if s[i] == p[j]

        cmp     ecx, [.slen]
        jb      .loop

; found
        inc     ebx
        sub     ebx, ecx
        cmp     ebx, [edx+TText.GapBegin]
        jb      .pos_ok

        sub     ebx, [edx+TText.GapEnd]
        add     ebx, [edx+TText.GapBegin]

.pos_ok:
        mov     [esp+4*regEAX], ebx
        stc
        popad
        return

.not_found:
        clc
        popad
        return
endp




proc TextDebugInfo, .pText, .hLabel
begin
        pushad

        mov     esi, [.pText]

        stdcall FileWriteString, [STDOUT], [.hLabel]
        stdcall FileWriteString, [STDOUT], <txt 13, 10, "START OF INFO BLOCK ==============================", 13, 10>

        stdcall FileWriteString, [STDOUT], txt "TText content length: "
        stdcall NumToStr, [esi+TText.Length], ntsUnsigned or ntsDec
        push    eax
        stdcall FileWriteString, [STDOUT], eax
        stdcall StrDel ; from the stack.
        stdcall FileWriteString, [STDOUT], <txt "bytes", 13, 10>


        stdcall FileWriteString, [STDOUT], txt "Text length: "
        mov     eax, [esi+TText.Length]
        sub     eax, [esi+TText.GapEnd]
        add     eax, [esi+TText.GapBegin]
        stdcall NumToStr, eax, ntsUnsigned or ntsDec
        push    eax
        stdcall FileWriteString, [STDOUT], eax
        stdcall StrDel ; from the stack.
        stdcall FileWriteString, [STDOUT], <txt "bytes", 13, 10>


        stdcall FileWriteString, [STDOUT], txt "Gap begin: "
        stdcall NumToStr, [esi+TText.GapBegin], ntsUnsigned or ntsDec
        push    eax
        stdcall FileWriteString, [STDOUT], eax
        stdcall StrDel ; from the stack.
        stdcall FileWriteString, [STDOUT], txt ", end: "

        stdcall NumToStr, [esi+TText.GapEnd], ntsUnsigned or ntsDec
        push    eax
        stdcall FileWriteString, [STDOUT], eax
        stdcall StrDel ; from the stack.
        stdcall FileWriteString, [STDOUT], <txt 13, 10, 13, 10>

        stdcall FileWriteString, [STDOUT], <txt "The text before gap: ", 13, 10, ">>>>">

        cmp     [esi+TText.GapBegin], 0
        jle     @f
        stdcall FileWrite, [STDOUT], esi, [esi+TText.GapBegin]
@@:
        stdcall FileWriteString, [STDOUT], <txt "<<<<", 13, 10, 13, 10, "The text after the gap:", 13, 10, ">>>>">

        mov     ecx, [esi+TText.Length]
        mov     eax, [esi+TText.GapEnd]

        add     eax, esi

        sub     ecx, [esi+TText.GapEnd]
        jle     @f
        stdcall FileWrite, [STDOUT], eax, ecx
@@:
        stdcall FileWriteString, [STDOUT], <txt "<<<<", 13, 10, 13, 10>

        stdcall FileWriteString, [STDOUT], <txt 13, 10, "END OF INFO BLOCK ==============================", 13, 10>

        popad
        return
endp














endmodule

Added freshlib/data/bytestream.asm.













































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Dynamic byte streams library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Based on works of Mateusz Tymek.
;_________________________________________________________________________________________

module "ByteStream"


struct TByteStream
  .capacity dd  ?
  .size     dd  ?
  .offset   dd  ?
  .lparam   dd  ?
  label .data byte
ends



; creates byte stream and returns pointer
; free it with FreeMem
proc BytesCreate, .length
begin
        push    ecx

        mov     ecx, [.length]
        add     ecx, sizeof.TByteStream

        stdcall GetMem, ecx
        jc      .finish

        sub     ecx, sizeof.TByteStream
        mov     [eax+TByteStream.capacity], ecx

        clc

.finish:
        pop     ecx
        return
endp



; returns the pointer at the begining of the requested block in EDI
; returns the stream pointer in EBX (it can be changed on reallocation)
proc BytesGetRoom, .pStream, .room
begin
        push    eax ecx edx

        mov     ebx, [.pStream]
        mov     edi, [ebx+TByteStream.offset]

        mov     edx, [.room]
        add     edx, edi             ; the total size needed

        cmp     edx, [ebx+TByteStream.capacity]
        jbe     .sizeok

        lea     ecx, [2*edx]
        lea     eax, [ecx+sizeof.TByteStream]

        stdcall ResizeMem, ebx, eax
        jc      .finish    ; CF=1

        mov     ebx, eax
        mov     [eax+TByteStream.capacity], ecx

.sizeok:
        mov     [ebx+TByteStream.offset], edx

        cmp     edx, [ebx+TByteStream.size]
        jbe     @f
        mov     [ebx+TByteStream.size], edx
@@:
        lea     edi, [edi+ebx+sizeof.TByteStream]
        clc

.finish:
        pop     edx ecx eax
        return
endp






proc BytesLoadFromFile, .ptrFileName
begin
        push    esi edi ebx ecx

        stdcall FileOpen, [.ptrFileName]
        jc      .error

        mov     edi, eax

        stdcall FileSize, edi
        jc      .errorclose

        mov     ebx, eax
        lea     ecx, [eax+8+sizeof.TByteStream]    ; It is for the case that the file is
                                                   ; text and we want to use it as null terminated
                                                   ; string.

        stdcall GetMem, ecx
        jc      .errorclose
        mov     esi, eax

        mov     eax, ebx

        mov     [esi + TByteStream.size], ebx
        mov     [esi + TByteStream.capacity], ebx

        lea     eax, [esi+TByteStream.data]
        stdcall FileRead, edi, eax, ebx
        jc      .errorclosemem

        stdcall FileClose, edi

        mov     eax, esi
        clc
        pop     ecx ebx edi esi
        return

.errorclosemem:
        stdcall FreeMem, esi

.errorclose:
        push    eax
        stdcall FileClose, edi
        pop     eax

.error:
        stc
        pop     ecx ebx edi esi
        return
endp




endmodule

Added freshlib/data/counter_array.asm.



































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Sorted counter array.
;
;  Target OS: Any
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

module "Value counter array library"


struct TCounter
  .value dd ?
  .count dd ?
ends


; returns:
;  edx - the new pointer to the array.
;  eax - pointer to the element incremented.

proc IncCount, .pArray, .value
begin
        mov     edx, [.pArray]
        stdcall __SearchCountArray, edx, [.value]
        jc      .add_new

        lea     eax, [edx+TArray.array+sizeof.TCounter*eax]
        inc     [eax+TCounter.count]
        js      .error
        return

.add_new:
        stdcall InsertArrayItems, edx, eax, 1
        push    [.value]
        pop     [eax+TCounter.value]
        mov     [eax+TCounter.count], 1
        return

.error:
        int3
        return
endp



; returns:
;  edx - the new pointer to the array.
;  eax - pointer to the element incremented or NULL, if the element has been deleted from the array.

proc DecCount, .pArray, .value
begin
        push    ecx

        mov     edx, [.pArray]
        stdcall __SearchCountArray, edx, [.value]
        jc      .error                  ; can't decrement not existing element!

        lea     ecx, [edx+TArray.array+sizeof.TCounter*eax]
        dec     [ecx+TCounter.count]
        js      .error
        jnz     .finish

        stdcall DeleteArrayItems, edx, eax, 1
        xor     ecx, ecx

.finish:
        mov     eax, ecx
        pop     ecx
        return

.error:
        int3
        jmp     .finish
endp


; binary search [.value] in the array.
; returns:
;   eax, the index where the element has been found or the index where the element has to be inserted, if not found
;   CF = 0 - element has been found.
;   CF = 1 - element not found.

proc __SearchCountArray, .pArray, .value
begin
        pushad

        mov     esi, [.pArray]

        xor     eax, eax
        xor     ecx, ecx                ; left
        mov     edx, [esi+TArray.count] ; right

        dec     edx
        js      .not_found

        mov     ebx, [.value]

.loop:
        cmp     edx, ecx
        jl      .not_found

        lea     eax, [ecx+edx]
        sar     eax, 1

        cmp     ebx, [esi+TArray.array+ sizeof.TCounter*eax+TCounter.value]
        je      .found

        ja      .goto_right

; goto left
        lea     edx, [eax-1]
        jmp     .loop


.goto_right:
        inc     eax
        mov     ecx, eax
        jmp     .loop

.found:
        clc

.finish:
        mov     [esp+4*regEAX], eax
        popad
        return

.not_found:
        stc
        jmp     .finish
endp






endmodule

Added freshlib/data/deflate.asm.































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Deflate uncompress library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

module "Deflate"


DEFLATE_MAX_BITS = 15

DEFLATE_SIZE_LEN_TREE  = 320*2
DEFLATE_SIZE_DIST_TREE = 32*2
DEFLATE_SIZE_LL_TREE   = 32*2
DEFLATE_SIZE_LEN_BUF   = 300+300


; Decompress the block in memory.
; Arguments:
;  .pDest    points to a buffer of type TBitStream for the uncompressed data.
;  .pSrc     points to a source memory buffer.
;  .bitOffs  bit offset of the start of the stream, related to [.pSrc].
;  .srcCount byte size of the source buffer, measured from [.pSrc].
;
; Returns:
;  CF=0; The stream is decompressed without errors.
;
;  CF=1: There was error on decompression, because of malformed stream or memory
;        allocations.
;
;  EAX:  Pointer to the destination stream. (It can be changed on reallocations)
;
;  NOTE: Even on error, the stream can be partially decompressed in the destination
;        stream;
;
proc Inflate, .pDest, .dstCount, .pSrc, .srcCount

  .len_tree      rd DEFLATE_SIZE_LEN_TREE
  .dist_tree     rd DEFLATE_SIZE_DIST_TREE
  .ll_tree       rd DEFLATE_SIZE_LL_TREE
  .lengths       rb DEFLATE_SIZE_LEN_BUF

  .final         dd ?

  .pEndSrc       dd ?
  .pEndDst       dd ?
  .pCurrent      dd ?

  .p_lengths_end dd ?

  .LLCount       dd ?
  .DCount        dd ?

  .b_type dd ?

begin
        pushad

        mov     eax, [.pDest]
        mov     [.pCurrent], eax
        add     eax, [.dstCount]
        mov     [.pEndDst], eax

; prepare the stream pointers.

        mov     esi, [.pSrc]

        mov     eax, esi
        add     eax, [.srcCount]
        mov     [.pEndSrc], eax

        mov     ch, $10
        mov     eax, [esi]

.main_loop:

; read 1 bit header BFINAL

        mov     [.final], eax
        shr     eax, 1

        and     [.final], 1

        dec     ch
        jnz     @f

        add     esi, 2
        cmp     esi, [.pEndSrc]
        jae     .error2

        mov     eax, [esi]
        mov     ch, $10

@@:

; read 2 bit header BTYPE
        mov     edx, eax
        shr     eax, 2
        and     edx, 3

        sub     ch, 2

        dec     edx
        js      .uncompressed     ; BTYPE == 0 uncompressed type

        mov     [.b_type], edx    ; 0 if fixed tree; <>0 if dynamic tree
        jnz     .dynamic_tree

; BTYPE == 1 compressed with fixed huffman tree.

; load the fixed huffman tree for literal/lengths.
        pushad

        lea     edi, [.lengths]
        lea     esi, [.TreeFixed]
        mov     ebx, edi

        xor     eax, eax
        xor     ecx, ecx
        mov     dl, 4      ; edx == 0 here.

.loop_fx:
        lodsw
        mov     cl, ah
        rep stosb
        dec     edx
        jnz     .loop_fx

        sub     edi, ebx
        lea     eax, [.len_tree]

        stdcall __tree_by_lengths, ebx, edi, eax

        popad

        jmp     .decode


.dynamic_tree:
        dec     edx
        jnz     .error3           ; BTYPE == 3 invalid block type

; Compressed with dynamic huffman table. Read it from the stream.

; first read the counts

; 5 bits HLIT - Number of Literal/length codes - 257.
; 5 bits HDIST - Number of distance codes - 1.
; 4 bits HCLEN - Number of code length codes - 4.

        mov     edi, eax
        mov     ebx, eax
        mov     edx, eax

        shr     ebx, 5
        shr     edx, 10
        shr     eax, 14

        and     edi, $1f
        and     ebx, $1f
        and     edx, $0f

        sub     ch, 14
        jg      @f

        add     esi, 2
        cmp     esi, [.pEndSrc]
        jae     .error4

        mov     cl, ch
        mov     eax, [esi]
        add     ch, $10
        rol     eax, cl

@@:
        add     edi, 257
        inc     ebx
        add     edx, 4

        mov     [.LLCount], edi
        mov     [.DCount], ebx

; second, read the fixed 3bit table for the code lengths.

; clear the lengths array

        lea     edi, [.lengths]
        xor     ebx, ebx

        mov     [edi],    ebx
        mov     [edi+4],  ebx
        mov     [edi+8],  ebx
        mov     [edi+12], ebx
;        mov     [edi+16], ebx  ; codes 16, 17 and 18 are always transmitted, no need to clear;
        mov     bl, $0f

.loop_hc:
        movzx   ebx, [.clclOrder2+ebx]

        mov     [edi+ebx], al
        shr     eax, 3

        and     byte [edi+ebx], $07

        sub     ch, 3
        jg      @f

        add     esi, 2
        cmp     esi, [.pEndSrc]
        jae     .error5

        mov     cl, ch
        mov     eax, [esi]
        add     ch, $10
        rol     eax, cl

@@:
        dec     edx
        jnz     .loop_hc

        lea     ebx, [.ll_tree]
        stdcall __tree_by_lengths, edi, 19, ebx
        jnz     .error6

; now create the two remaining huffman trees: for literal/lengths and for distances.

; First the literal/lengths huffman tree

        mov     edx, [.LLCount]
        lea     edi, [.len_tree]
        call    .decode_lengths
        jnz     .error9

; Second, the distances huffman tree.

        mov     edx, [.DCount]
        lea     edi, [.dist_tree]
        call    .decode_lengths
        jnz     .error10

; At the end - trees are ready, so decode the compressed block.

        mov     edi, [.pCurrent]

.decode:
        cmp     esi, [.pEndSrc]
        jae     .error7

; read literal/length code

        xor     edx, edx

.bitloop1:
        shr     eax, 1
        rcl     edx, 1                    ; edx = 2*edx+CF

        dec     ch
        jnz     @f

        add     esi, 2

        mov     eax, [esi]
        mov     ch, $10

@@:
        xor     edx, [.len_tree+4*edx]
        jns     .bitloop1

        not     edx

        cmp     edx, 255
        ja      .copy_from_older        ; if EDX <= 255 then it is simple encoded byte, so store it.


;        OutputValue "Literal: ", edx, 16, 2


; Store literal value.
        cmp     edi, [.pEndDst]
        jae     .error14

        mov     [edi], dl
        inc     edi
        jmp     .decode



.copy_from_older:
;        OutputValue "Length code:", edx, 10, 3

        sub     edx, 257
        js      .next_block             ; if EDX == 256 then end of block flag.

; The code is a length code. Compute the length of string to be copied from the previous decoded data.

; Compute the additional length and the extra bit count.
; 2^n(4 + edx mod 4)

        xor     ebx, ebx

        cmp     edx, 4
        jb      .length_ok

        sub     edx, 4
        mov     cl, dl
        and     edx, 3  ; edx = edx mod 4
        shr     cl, 2   ; cl = edx div 4
        lea     edx, [edx+4]
        jz      .length_ok
        shl     edx, cl

        dec     edx
        cmp     cl, 6           ; damn exceptions!
        jae     .length_ok

        adc     ebx, edx        ; CF = 1 here!

; read CL bits from the stream
        or      edx, -1
        shl     edx, cl
        not     edx

        and     edx, eax
        shr     eax, cl

;        OutputValue "Additional value:", edx, 10, 2

        sub     ch, cl
        jg      .length_ok

        add     esi, 2

        mov     cl, ch
        mov     eax, [esi]
        add     ch, $10
        rol     eax, cl

.length_ok:
        lea     ebx, [ebx+edx+3]


;        OutputValue "Copy length:", ebx, 10, 3

; ... so now decode the distance code

        cmp     [.b_type], 0
        jne     .decode_dist  ; when there is fixed huffman table, then the distances are encoded with 5 bit fixed code

; read fixed 5 bit distance.

        mov     cl, 5
        xor     edx, edx

.bitloop4:
        shr     eax, 1
        rcl     edx, 1

        dec     cl
        jnz     .bitloop4

;        OutputValue "Distance code:", edx, 10, 2

        sub     ch, 5
        jg      .compute_distance

        add     esi, 2

        mov     cl, ch
        mov     eax, [esi]
        add     ch, $10
        rol     eax, cl

        jmp     .compute_distance


.decode_dist:
        xor     edx, edx

.bitloop2:
        shr     eax, 1
        rcl     edx, 1                    ; edx = 2*edx+CF

        dec     ch
        jnz     @f

        add     esi, 2

        mov     eax, [esi]
        mov     ch, $10

@@:
        xor     edx, [.dist_tree+4*edx]
        jns     .bitloop2

        not     edx

.compute_distance:
        cmp     edx, 30
        jae     .error8

; 2^n(2 + edx mod 2)
; compute the additional distance and extra bit count for the distance.

        xor     cl, cl
        cmp     edx, 2
        jb      .distance_ok

        sub     edx, 2
        mov     cl, dl  ;
        and     edx, 1  ; edx = edx mod 2
        shr     cl, 1   ; cl = edx div 2
        lea     edx, [edx+2]
        jz      .distance_ok

        shl     edx, cl  ; edx = 2^cl * (edx mod 2 + 2)

; read CL bits from the stream in EBX
        push    ebx

        or      ebx, -1  ; mask
        shl     ebx, cl  ; mask
        not     ebx      ; mask

        and     ebx, eax
        shr     eax, cl

        add     edx, ebx
        pop     ebx

        sub     ch, cl
        jg      .distance_ok

        add     esi, 2

        mov     cl, ch
        mov     eax, [esi]
        add     ch, $10
        rol     eax, cl

.distance_ok:
        inc     edx

; copy the string
        push    esi ecx

        neg     edx
        mov     ecx, ebx

        lea     esi, [edi+edx]
        lea     ebx, [edi+ecx]

        cmp     esi, [.pDest]
        jb      .error_cp1

        cmp     ebx, [.pEndDst]
        ja      .error_cp2

        rep movsb

        pop     ecx esi
        jmp     .decode

.error_cp1:
        dbrk
.error_cp2:
        dbrk
        pop     ecx esi

; these all "error" labels are equal in release mode. In debug mode, there are int3 instructions inbetween in order to allow error tracing.
.error2:
        dbrk
.error3:
        dbrk
.error4:
        dbrk
.error5:
        dbrk
.error6:
        dbrk
.error7:
        dbrk
.error8:
        dbrk
.error9:
        dbrk
.error10:
        dbrk
.error11:
        dbrk
.error12:
        dbrk
.error13:
        dbrk
.error14:
        dbrk
.error:
        dbrk
        not     [.final]          ; Tricky makes CF=1 on exit.

.next_block:
        mov     [.pCurrent], edi
        cmp     [.final], 0
        je      .main_loop

        shl     [.final], 1      ; If normal end [.final] is always 1; If error, [.final] is $ffffffff or $fffffffe

        popad
        return


; not compressed block
;-----------------------------------------------------------
.uncompressed:

; align to byte
        mov     cl, 16
        sub     cl, ch
        movzx   ecx, cl
        add     ecx, 7
        shr     ecx, 3

        add     esi, ecx

        cmp     esi, [.pEndSrc]
        jae     .error11

        mov     edi, [.pCurrent]

        xor     eax, eax

        lodsw                           ; LEN
        mov     ecx, eax
        lodsw                           ; NLEN
        not     ax
        cmp     ecx, eax
        jne     .error12

        add     eax, edi
        cmp     eax, [.pEndDst]
        ja      .error13

        rep movsb

; resync stream
        mov     ch, $10
        mov     eax, [esi]
        jmp     .next_block


; ebx = pointer to the .ll_tree huffman tree
; edx = count of the encoded lengths
; edi = pointer to the tree memory

.decode_lengths:

; arguments.
        push    edi
        push    edx
        lea     edi, [.lengths]
        push    edi

; buffer overflow?
        add     edx, edi
        mov     [.p_lengths_end], edx

.loop_len:
        xor     edx, edx
        cmp     esi, [.pEndSrc]
        jae     .errordl

.bitloop3:
        shr     eax, 1
        rcl     edx, 1                  ; edx = 2*edx+CF

        dec     ch
        jnz     @f

        add     esi, 2
        mov     eax, [esi]
        mov     ch, $10

@@:
        xor     edx, [ebx+4*edx]
        jns     .bitloop3

; here dh = $ff
        xor     dh, dl          ; dh = not dl because dh is always $ff for this tree.

        mov     dl, 1           ; count
        cmp     dh, 16
        jb      .rep_loop

        mov     cl, 7
        mov     dl, 11
        sub     dh, 18
        jz      .repeat         ; dh = 18

        mov     cl, 3
        mov     dl, 3
        inc     dh
        jz      .repeat         ; dh = 17

        cmp     edi, [esp]
        je      .errordl        ; it is the first length, there is no previous.

        mov     cl, 2
        mov     dh, [edi-1]   ; previous length; dl=3 here

.repeat:
        shl     edx, 8

; read CL bits from the stream: CL = 2, 3 or 7
        or      dl, -1
        shl     dl, cl
        not     dl

        and     dl, al
        shr     eax, cl

        sub     ch, cl
        jg      @f

        add     esi, 2

        mov     cl, ch
        mov     eax, [esi]
        add     ch, $10
        rol     eax, cl

@@:
        add     dh, dl
        shr     edx, 8          ; now dl is the count, dh is the byte to be repeat!

.rep_loop:
        mov     [edi], dh
        inc     edi
        dec     dl
        jnz     .rep_loop

; next length
        cmp     edi, [.p_lengths_end]
        jb      .loop_len
        ja      .errordl

        stdcall __tree_by_lengths   ; the arguments are already in the stack.
        retn

; The assembly way of error handling. ;)
.errordl:
        add     esp, 3*4 + 4 ; pushed arguments and the return address.
        jmp     .error

;  .clclOrder     db 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15   ; original order.
.clclOrder2  db  8, 15, 14, 13, 12, 11, 10, 9, 7, 6, 5, 4, 3, 2, 1, 16, 17, 18, 0    ; recoded in order to make better lookup code.

; The fixed Huffman table, encoded in RLE.
; bits, count, ...  total 288 codes.
.TreeFixed  db 8, 144, 9, 112, 7, 24, 8, 8



endp


; Restores the Huffman tree from given code lengths.
; .pTree  - pointer to memory for the huffman tree structure.
; .pLengths - array of bytes, containing the lengths for every code needed.
; .count  - count of the array elements.
;
; Returns:
;   ZF=1; The tree is properly created on [.pTree]; The tree is an array of qwords
;         Every element represents one node of the binary tree. The low order dword
;         contains index to the left (0) child and the high order dword, index to
;         the right (1) child.
;         The indexes are a number of a qword element of the array xored with the index of the current element.
;         If the high order bit of the word (bit 15) is set, the word is a leaf
;         and contains NOT-ed symbol value instead of index in the array.
;
;   ZF=0  Error. The provided length list describes not valid Huffman tree.
;         In this case no values are filled in the tree.
;
; The comments in the code are according to the RFC-1951
;
proc __tree_by_lengths, .pLengths, .count, .pTree

.bl_count  rd DEFLATE_MAX_BITS + 1
.next_code rd DEFLATE_MAX_BITS + 1      ; keep immediately after .bl_count

begin
        pushad

        xor     eax, eax

        lea     edi, [.bl_count]
        mov     ecx, 2*(DEFLATE_MAX_BITS+1)
        rep stosd                               ; initializes both: .bl_count and .next_code arrays!

; 1)  Count the number of codes for each code length.  Let bl_count[N] be the number of
; codes of length N, N >= 1.

        mov     esi, [.pLengths]
        mov     ecx, [.count]

.loop:
        lodsb                               ; tree[i].len
        inc     dword [.bl_count+4*eax]     ; count one code length
        loop    .loop

; 2)  Find the numerical value of the smallest code for each code length:
; loop from 1 to [.max_bits]

;        xor     ecx, ecx         ; bits - 1    ; here ecx == 0, see the previous instr.
        xor     eax, eax         ; bl_count[0] = 0  ; but we still need to keep the original bl_count[0].
        cdq                      ; edx = 0 = code
        lea     ebx, [eax+2]     ; ebx = 2

.loop2:
        inc     ecx

        add     edx, eax                       ; code = code + bl_count[bits-1]
        shl     edx, 1                         ; code = code << 1

        mov     eax, [.bl_count+4*ecx]         ; for the next loop
        mov     [.next_code+4*ecx], edx        ; next_code[bits] = code

        sub     ebx, eax     ; data validity control.
        shl     ebx, 1

        cmp     ecx, DEFLATE_MAX_BITS
        jb      .loop2

; 3) Assign numerical values to all codes, using consecutive
;    values for all codes of the same length with the base
;    values determined at step 2. Codes that are never used
;    (which have a bit length of zero) must not be assigned a
;    value.
;
; The assigned codes are put inside the binary tree, represented in
; an array pointed by EDI

        mov     ecx, [.count]        ; count of all elements
        sub     ecx, [.bl_count]     ; minus the count of zero elements .bl_count[0]

; PKZIP exception when the Huffman tree contains single 1bit long element, the second
; is allowed to be not defined and ebx will not be zero... damn exceptions!

        cmp     ecx, 1
        jne     .check

        cmp     [.bl_count+4], 0        ; count of codes with length 1 bit.
        jne     .valid

.check:
        test    ebx, ebx
        jnz     .finish         ; it is invalid Huffman tree if EBX <> 0 here.

.valid:

; clear the tree area
        shl     ecx, 1
        mov     edi, [.pTree]   ; the needed nodes memory is (K-1)*8 bytes,
        or      eax, -1         ; where K is the count of the codes with length <> 0;
        rep stosd               ; but we allocate one element more in order to work-around the
                                ; above described exception.

        mov     edi, [.pTree]   ; the huffman tree array.
        xor     ebx, ebx        ; offset to the last free element of the tree.

        mov     esi, [.pLengths]

.loop3:
        movzx   ecx, byte [esi]     ; ecx = length of the code.
        jecxz   .next

        mov     eax, [.next_code+4*ecx]    ; next_code[len]
        inc     [.next_code+4*ecx]

        ror     eax, cl         ; start from the high order bit.
        xor     edx, edx        ; the traversing index in the tree array.

.bit_loop:
        shl     eax, 1          ; the high order bit in CF
        rcl     edx, 1          ; edx = 2*edx + CF  ; edx now points to the needed WORD element of the tree.

        dec     ecx
        jz      .put_code       ; this is the last bit, so put the code here.

.next_node:
        xor     edx, [edi+4*edx]
        jns     .bit_loop

        not     edx

        inc     ebx
        mov     [edi+4*edx], edx   ; the current free element.
        xor     [edi+4*edx], ebx   ; it is tricky here - the idea is to allow the next node offset to be obtained not by MOV, but by XOR instuction.
                                   ; for details see the tree traversing code on "bitloop1" label.
        jmp     .next_node

.put_code:
        mov     ecx, esi
        sub     ecx, [.pLengths]
        not     ecx
        xor     ecx, edx
        mov     [edi+4*edx], ecx

.next:
        inc     esi
        dec     [.count]
        jnz     .loop3

.finish:                        ; here ZF = 1 if OK and 0 if error!
        popad
        return
endp




endmodule



Added freshlib/data/encodings.asm.















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS independent text encodings translation library.
;
;  Target OS: Any
;
;  Dependencies: StrLib.asm
;
;  Notes:
;
;_________________________________________________________________________________________



; AnsiToUnicodeChar converts an Ansi character into Unicode
;
; arguments:
;   .SrcEncoding - pointer to 256 ansi2unicode conversion table.
;   .char - ansi char.
; returns:
;   eax - unicode for the char.

proc AnsiToUnicodeChar, .SrcEncoding, .char
begin
        push    ebx

        mov     ebx, [.SrcEncoding]
        movzx   eax, byte [.char]
        cmp     eax, $80
        jb      .finish

        sub     eax, $80
        movzx   eax, word [ebx+2*eax]

.finish:
        pop     ebx
        return
endp




; AnsiToUtf8 converts string from ANSI to UTF-8
;
; arguments:
;   .SrcEncoding - pointer to 256 ansi2unicode conversion table.
;   .hString - handle or pointer to the source string.
; returns:
;   eax - handle of new created string with utf-8 encoded text.


proc AnsiToUtf8, .SrcEncoding, .hString
.result dd ?
.start  dd ?
begin
        pushad

        stdcall StrLen, [.hString]
        lea     ecx, [4*eax+16]

        stdcall StrNew
        mov     [.result], eax

        jecxz   .finish2

        stdcall StrSetCapacity, [.result], ecx
        mov     edi, eax
        mov     [.start], eax

        stdcall StrPtr, [.hString]
        mov     esi, eax

        mov     ebx, [.SrcEncoding]

.loop:
        movzx   eax, byte [esi]
        lea     esi, [esi+1]
        test    eax, eax
        jz      .finish

        mov     edx, 1
        cmp     eax, $80
        jb      .direct

        sub     eax, $80
        movzx   eax, word [ebx+2*eax]
        stdcall EncodeUtf8, eax

.direct:
        mov     [edi], eax
        add     edi, edx

        jmp     .loop

.finish:
        xor     eax, eax
        mov     [edi], eax

        mov     eax, [.start]
        sub     edi, eax
        mov     [eax+string.len], edi

.finish2:
        popad
        mov     eax, [.result]
        return
endp


; Utf8ToAnsi converts string from UTF-8 to some ANSI encoding.
;
; arguments:
;   .hString - pointer of handle of utf-8 string.
;   .DstEncoding - pointer to utf2ansi conversion table.
; returns:
;   eax - handle of new created string with ansi encoded text.


proc Utf8ToAnsi, .hString, .DstEncoding
.result dd ?
.char   dd ?
begin
        pushad
        mov     ebx, [.DstEncoding]

        stdcall StrLen, [.hString]
        mov     ecx, eax

        stdcall StrNew
        mov     [.result], eax

        stdcall StrSetCapacity, eax, ecx
        mov     edi, eax

        stdcall StrPtr, [.hString]
        mov     esi, eax

.loop:
        stdcall DecodeUtf8, [esi]
        lea     esi, [esi+edx]
        jnc     .ok

        test    edx, edx
        jz      .end_of_string          ; invalid unicode char

.ok:
        test    eax, eax
        jz      .end_of_string          ; zero terminated

        cmp     eax, $ffff
        ja      .not_found

        cmp     eax, $80
        jb      .store

; search in the table

        mov     [.char], eax
        xor     edx, edx
        xor     cl, cl       ; start
        mov     ch, $7f      ; end

.search_loop:
        cmp     cl, ch
        ja      .not_found

        mov     dl, cl
        add     dl, ch
        shr     edx, 1

        movzx   eax, byte [ebx+256+edx]
        movzx   eax, word [ebx+2*eax-$100]   ; unicode character

        cmp     [.char], eax
        je      .found
        ja      .bigger

        mov     ch, dl
        sub     ch, 1
        jc      .not_found
        jmp     .search_loop

.bigger:
        mov     cl, dl
        inc     cl
        jmp     .search_loop

.found:
        mov     al, [ebx+256+edx]

.store:
        stosb
        jmp     .loop

.not_found:
        mov     al, '?'
        stosb
        jmp     .loop

.end_of_string:
        mov     dword [edi], 0
        stdcall StrPtr, [.result]
        sub     edi, eax
        mov     [eax+string.len], edi

        popad
        mov     eax, [.result]
        return
endp





; converts unicode character [.unichar] to UTF-8 encoding (max to 4 bytes)
;
; returns: CF=0
;   EAX = utf-8 character
;   EDX = lenfth of the character in bytes.
; CF=1 - the encoding can not be provided.
;   eax = 0
;   edx = 0

proc EncodeUtf8, .unichar
begin
        push    ebx ecx edi

        xor     eax, eax
        mov     edi, 1
        mov     ebx, [.unichar]
        cmp     ebx, $80
        jb      .one_byte

        mov     edx, $ffffffc0         ; mask

.loop:
        inc     edi
        cmp     edi, 4
        ja      .error

        sar     edx, 1

        movzx   ecx, bl
        and     cl, $3f
        or      cl, $80

        shl     eax, 8
        shr     ebx, 6
        or      eax, ecx        ; eax == result

        test    ebx, edx
        jnz     .loop

        lea     ecx, [2*edx]
        xor     ecx, edx

        or      ebx, edx
        xor     ebx, ecx

        shl     eax, 8
        mov     al, bl

.finish:
        mov     edx, edi
        pop     edi ecx ebx
        clc
        return

.one_byte:
        mov     eax, ebx
        jmp     .finish

.error:
        xor     eax, eax
        xor     edx, edx
        pop     edi ecx ebx
        stc
        return
endp




; decodes 4 bytes in [.chars] to UNICODE dword value.
; returns:
;   CF=0 - no error
;     eax - unicode value.
;     edx - byte count of the char. [1..4]
;   CF=1 - invalid utf-8 char;
;     eax = edx = 0  the character can not be decoded.
;     edx <> 0 -> eax = the overlong encoded character. edx = byte count of the char.
;
;  Note: When CF=1 and [.chars] are overlong encoded char.
;        eax contains the proper value and edx contains the proper length.
;        But it is still invalid character, according to the standards.
proc DecodeUtf8, .chars
begin
        push    ebx ecx

        xor     ecx, ecx

.loop1:
        shl     byte [.chars], 1
        jnc     .countok
        inc     ecx
        jmp     .loop1

.countok:
        jecxz   .ascii

        cmp     ecx, 1
        je      .error          ; internal byte
        cmp     ecx, 4
        ja      .error          ; more than 4 bytes

        mov     edx, 1
        xor     ebx, ebx
        movzx   eax, byte [.chars]
        shr     eax, cl
        shr     eax, 1

.loop2:
        mov     bl, byte [.chars+edx]
        and     bl, $c0
        cmp     bl, $80
        jne     .error
        mov     bl, byte [.chars+edx]
        and     bl, $3f
        shl     eax, 6
        or      eax, ebx
        inc     edx
        cmp     edx, ecx
        jne     .loop2

        and     eax, $1fffff
        cmp     eax, $10ffff
        ja      .error

        cmp     eax, [._minimal+4*edx-8]
        jb      .overlong   ; overlong coding.

        clc
        pop     ecx ebx
        return

.ascii:
        movzx   eax, byte [.chars]
        shr     eax, 1
        mov     edx, 1
        pop     ecx ebx
        clc
        return

.error:
        xor     eax, eax
        xor     edx, edx

.overlong:
        stc
        pop     ecx ebx
        return

._minimal dd $80, $800, $10000

endp




; decodes 2 words in [.chars] to UNICODE dword value.
; returns:
;   CF=0 - no error
;     eax - unicode value.
;     edx - byte count of the char. [2 or 4]
;   CF=1 - invalid utf-8 char;
;     eax = edx = 0  the character can not be decoded.
;     edx <> 0 -> eax = the overlong encoded character. edx = byte count of the char.
;
;  Note: When CF=1 and [.chars] are overlong encoded char.
;        eax contains the proper value and edx contains the proper length.
;        But it is still invalid character, according to the standards.


proc DecodeUtf16, .chars
begin
        mov     eax, [.chars]
        cmp     ax, $d800
        jb      .direct
        cmp     ax, $dc00
        jae     .direct

        sub     ax, $d800
        movzx   ecx, ax
        shr     eax, 16
        shl     ecx, 10
        sub     ax, $dc00
        or      eax, ecx

        mov     edx, 4
        cmp     eax, $110000
        jb      .decoded

        xor     eax, eax
        xor     edx, edx
        stc
        return

.direct:
        mov     edx, 2
        and     eax, $ffff

.decoded:
        clc
        return
endp



; Returns CF = 0 if the string contains only utf-8 encoded characters.
;         CF = 1 if the string contains at least one not utf-8 character.
; Registers are preserved, the string is not changed.

proc CheckUtf8, .hString
begin
        pushad
        
        stdcall StrPtr, [.hString]
        mov     esi, eax

.loop:
        stdcall DecodeUtf8, [esi]
        jc      .finish
        
        test    eax, eax
        jz      .finish         ; CF=0 after test.

        add     esi, edx
        jmp     .loop

.finish:
        popad
        return
endp







; Encoding tables


macro EncodingTable name, filename {
  name#.@here = 1
  if used name
    align 4
    label name word
    file  filename
  end if
}


align 4
include "_encodings/encodings.inc"



Added freshlib/data/hashes.asm.











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS independent hashes algorithm library.
;
;  Target OS: Any
;
;  Dependencies: memory.asm
;
;  Notes: Contains: MD5, ADLER32, FNV1b, CRC32
;
;_________________________________________________________________________________________

module "Hashes library"

include "sha1.asm"


; MD5 algorithm.
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

struct TContextMD5
    .__cntx rb 88
    .value  rb 16
ends


iglobal
  if used ___MD5InternalData
    ___MD5InternalData db     0,1,1,5,5,3,0,7, \
                              7,5,5,5,5,4,5,6, \
                              4,7,5,7,6,4,5,6
  end if
endg


uglobal
  if used ___MD5SineTable
    ___MD5SineTable  rd       65
  end if
endg



if used md5_Init
initialize ___md5_init
begin
        xor     eax, eax
        finit
        pushd   4F800000h
        pushd   0
        fstcw   word [esp+2]
        fstcw   word [esp]
        or      word [esp], 0F3Fh
        fldcw   word [esp]
        push    1
    @@: fild    dword [esp]
        fsin
        fabs
        fmul    dword [esp+8]
        fistp   qword [eax*4+___MD5SineTable]
        inc     dword [esp]
        inc     eax
        test    al, 40h
        jz      @b
        fldcw   word [esp+6]
        add     esp, 12
        return
endp
end if




;******************************************************
; Computes MD5 hash of the data block from [.pData] with
; length in [.pLen]
; Returns new string handle in eax containing the hash of
; the data.
;******************************************************
proc DataMD5, .pData, .pLen
begin
        push    ebx ecx esi edi

        stdcall md5_Init
        mov     ebx, eax

        stdcall md5_Update, ebx, [.pData], [.pLen]
        stdcall md5_GetValue, ebx

        stdcall StrNew
        mov     edi, eax
        lea     esi, [ebx+TContextMD5.value]
        mov     ecx, 16

.loop:
        movzx   eax, byte [esi]
        inc     esi
        stdcall NumToStr, eax, ntsUnsigned or ntsHex or ntsFixedWidth + 2
        push    eax
        stdcall StrCat, edi, eax
        stdcall StrDel ; from the stack
        loop    .loop

        stdcall StrLCase, edi
        stdcall FreeMem, ebx

        mov     eax, edi
        pop     edi esi ecx ebx
        return
endp






;............................................................................
; md5_Init is  used to allocate and initialize TContextMD5 structure for use with
; subsequent processing.
;
; Arguments:
;   no
;
; Return Value: EAX - pointer to the allocated TContextMD5 structure.
;
; Modifies Registers: EAX
;............................................................................
proc md5_Init
begin
        push    edi

        stdcall GetMem, sizeof.TContextMD5
        mov     edi, eax
        push    eax

        mov     al, 01h

    @@: stosb
        add     al, 22h
        jnc     @b

        mov     al, 0FEh
    @@: stosb
        sub     al, 22h
        jnc     @b

        xor     eax, eax
        stosd
        stosd

        pop     eax edi
        return
endp




;............................................................................
; md5_Update scans a  block of data and  updates the  working context.  Call it
; once on a single  block of data, or  call it multiple  times on consecutive
; blocks of data, before retrieving the MD5 signature with MD5_Digest
;
; Arguments:
;   lpMD5CTXT - address of an initialized MD5CTXT structure
;   lpBuf     - address of a contiguous block of data
;   bufLen    - the size, in bytes, of the block of data
;
; Return Value: None
;
; Modifies Registers: None
;............................................................................
proc md5_Update ;, .lpMD5CTXT, .lpBuf, .bufLen
begin
        pushad
        mov     esi, [esp+40]
        mov     ebp, [esp+36]
        lea     edi, [ebp+24]
        mov     edx, [esp+44]
        mov     ebx, edi
        mov     eax, edx
        shl     eax, 3
        mov     ecx, edx
        shr     ecx, 29
        push    dword [ebp+16]
        add     [ebp+16], eax
        adc     [ebp+20], ecx
        pop     eax
        shr     eax, 3
        and     eax, 3Fh
   .mn: xor     ecx, ecx
        mov     cl, 40h
        sub     ecx, eax
        cmp     ecx, edx
        jbe     @f
        mov     ecx, edx
    @@: sub     edx, ecx
        add     edi, eax
        add     eax, ecx
        rep     movsb
        mov     edi, ebx
        cmp     eax, 40h
        jb      @f

        stdcall ___md5_BTrnsf, ebp, edi

    @@: xor     eax, eax
        or      edx, edx
        jnz     .mn
        popad
        ret     12
endp




;............................................................................
; md5_GetValue is used to retrieve the MD5 hash for the working context. It may
; be called at any point during a buffer read to get the current MD5 hash for
; all data scanned up to that point.  It does not modify the contexutal data,
; so this procedure may be called as many times as needed.
; The value is stored in the context structure TContextMD5.value
;
; Arguments:
;   .pContextMD5 - address of an TContextMD5 structure
;
; Return Value: None
;
; Modifies Registers: None
;............................................................................
proc md5_GetValue   ;, .pContextMD5
begin
        pushad
        mov     esi, dword [esp+36]
        lea     edi, [esi+TContextMD5.value]
        lea     ebp, [esi+16]
        mov     ebx, edi
        sub     esp, 64
        movsd
        movsd
        movsd
        movsd
        lodsd
        shr     eax, 3
        add     esi, 4
        and     eax, 3Fh
        mov     edi, esp
        mov     ecx, eax
        rep     movsb
        inc     eax
        sub     ecx, eax
        mov     al, 80h
        stosb
        xor     eax, eax
        cmp     ecx, -56
        jae     @f
        xor     eax, eax
        add     ecx, 64
        rep     stosb
        mov     edi, esp

        stdcall ___md5_BTrnsf, ebx, edi

    @@: xor     eax, eax
        add     ecx, 56
        rep     stosb
        mov     esi, ebp
        movsd
        movsd

        stdcall ___md5_BTrnsf, ebx, esp

        add     esp, 64
        popad
        ret     4
endp




proc ___md5_BTrnsf   ;, .phash, .lpBlock
begin
        pushad
        mov     eax, dword [esp+36]
        xor     ecx, ecx
        mov     cl, 4
    @@: push    dword [eax]
        add     eax, 4
        loop    @b
   .mn: mov     ebp, ecx
        shr     ebp, 12
        add     dl, dh
        and     dl, 0Fh
        test    ch, 03h
        jnz     @f
        xor     cl, cl
        test    ch, 0Fh
        jnz     @f
        mov     esi, ___MD5InternalData
        mov     edx, dword [esi+ebp*2]
        mov     ebx, dword [esi+ebp*4+8]
    @@: add     cl, bl
        ror     ebx, 8
        push    edx
        push    ecx
        push    ebx
        mov     ebx, dword [esp+20]
        mov     ecx, dword [esp+16]
        mov     edx, dword [esp+12]
        test    ebp, 02h
        jnz     .hi
        test    ebp, 01h
        jnz     @f
        mov     eax, ebx
        and     ebx, ecx
        not     eax
        and     eax, edx
        or      eax, ebx
        jmp     .fghi
    @@: mov     eax, edx
        and     edx, ebx
        not     eax
        and     eax, ecx
        or      eax, edx
        jmp     .fghi
   .hi: test    ebp, 01h
        jnz     @f
        mov     eax, ebx
        xor     eax, ecx
        xor     eax, edx
        jmp     .fghi
    @@: mov     eax, edx
        not     eax
        or      eax, ebx
        xor     eax, ecx
 .fghi: pop     ebx
        pop     ecx
        pop     edx
        add     eax, dword [esp+12]
        mov     esi, dword [esp+56]
        movzx   edi, dl
        add     eax, dword [esi+edi*4]
        movzx   esi, ch
        add     eax, dword [___MD5SineTable+esi*4]
        rol     eax, cl
        add     eax, dword [esp+8]
        mov     dword [esp+12], eax
        mov     esi, esp
        mov     edi, esp
        lodsd
        movsd
        movsd
        movsd
        stosd
        inc     ch
        test    ch, 40h
        jz      .mn
        mov     eax, dword [esp+52]
        xor     ecx, ecx
        mov     cl, 4
        sub     eax, ecx
    @@: pop     edx
        add     dword [eax+ecx*4], edx
        loop    @b
        popad
        ret     8
endp



; ADLER32 algorithm.
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


iAdlerBase = 65521

if used DataAdler32

DataAdler32:        ;, .pBuffer, .length

        pop     eax     ; return address
        push    1       ; one more argument
        push    eax

end if

if used DataAdler32 | used adler32_Update

adler32_Update:          ;, .adler, .pBuffer, .length

virtual at esp+4+32
  .adler   dd ?
  .pBuffer dd ?
  .length  dd ?
end virtual

        pushad

        mov     ebx, [.adler]
        mov     eax, ebx

        and     ebx, $ffff      ; ebx = s1
        shr     eax, 16         ; eax = s2

        mov     esi, [.pBuffer]
        mov     edi, [.length]
        add     edi, esi

        mov     ecx, iAdlerBase

.loop:
        cmp     esi, edi
        jae     .mod           ; last mod

        test    eax, eax
        jns     .not_yet       ; there is still not overflow.

.mod:
        xor     edx, edx
        div     ecx
        mov     eax, ebx
        mov     ebx, edx        ; ebx is s2 now
        xor    edx, edx
        div     ecx             ; edx is s1 now

        cmp     esi, edi
        jae     .end_loop

        mov     eax, ebx    ; eax = s2
        mov     ebx, edx    ; ebx = s1

.not_yet:
        movzx   edx, byte [esi]
        add     ebx, edx
        add     eax, ebx
        inc     esi
        jmp     .loop

.end_loop:
        shl     ebx, 16
        or      ebx, edx
        mov     [esp+4*regEAX], ebx

        popad
        retn    3*4

end if



; FNV-1b algorithm
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


proc DataFNV1b, .ptrData, .len
begin
        push    ecx edx esi

        mov     esi, [.ptrData]
        mov     ecx, [.len]
        mov     eax, $811C9DC5                  ; 2166136261              ; FNV offset basis
        inc     ecx

.hashloop:
        dec     ecx
        jz      .exit
        movzx   edx, byte [esi]
        xor     eax, edx
        inc     esi
        imul    eax, $01000193    ;              ;   16777619              ; FNV prime
        jmp     .hashloop

.exit:
        pop     esi edx ecx
        return
endp


; CRC32B algorithm, as needed for PNG handling.
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


uglobal
  if used __CRC32Table
    __CRC32Table rd 256
  end if
endg


if used crc32_Update
initialize InitCRC32Table
begin
        mov     edi, __CRC32Table
        xor     ecx, ecx

.outer:
        movzx   eax, cl
        mov     ch, 8

.inner:
        shr     eax, 1
        jnc     @f
        xor     eax, $edb88320
@@:
        dec     ch
        jnz     .inner

        mov     [__CRC32Table+4*ecx], eax

        dec     cl
        jnz     .outer

        return
endp
end if



proc crc32_Update, .crc, .pBuffer, .length
begin
        push    esi edx

        mov     esi, [.pBuffer]
        add     [.length], esi
        mov     eax, [.crc]

.loop:
        cmp     esi, [.length]
        jae     .finish

        movzx   edx, byte [esi]
        inc     esi
        xor     dl, al
        shr     eax, 8
        mov     edx, [__CRC32Table+4*edx]
        xor     eax, edx
        jmp     .loop

.finish:
        pop     edx esi
        return
endp



proc DataCRC32, .pBuffer, .length
begin
        xor     eax, eax
        dec     eax
        stdcall crc32_Update, eax, [.pBuffer], [.length]
        not     eax
        return
endp




; Pearson hash function.





proc PearsonHash, .pData, .DataSize, .pFuncTable, .pResult, .ResultSize
begin
        pushad

        mov     ebx, [.pFuncTable]
        mov     esi, [.pData]
        mov     edi, [.pResult]
        mov     edx, [.ResultSize]

        xor     eax, eax

.outer_loop:
        dec     edx
        js      .finish

        mov     ecx, [.DataSize]
        jecxz   .byte_ok

        add     al, dl
        xor     al, [esi]
        mov     al, [ebx+eax]

.inner_loop:
        dec     ecx
        jz      .byte_ok

        xor     al, byte [esi+ecx]
        mov     al, [ebx+eax]
        jmp     .inner_loop

.byte_ok:
        mov     [edi+edx], al
        jmp     .outer_loop

.finish:
        popad
        return
endp



proc StrPearsonHash, .hString, .pFuncTable
begin
        pushad

        mov     ebx, [.pFuncTable]
        xor     edx, edx

        stdcall StrLen, [.hString]
        mov     ecx, eax
        jecxz   .byte_ok

        stdcall StrPtr, [.hString]
        mov     esi, eax

.loop:
        lodsb
        xor     dl, al
        mov     dl, [ebx+edx]
        loop    .loop

.byte_ok:
        mov     [esp+4*regEAX], edx
        popad
        return
endp



;
;
; Gets the array of strings and generates a table for PersonHash, that
; allows non-collision hash of the given set.
;
; Arguments:
;
;    .pStringArray - TArray of dword containing the strings of the set.
;
; Returns:
;
;    eax: pointer to a 256 byte table fill of values for using as a
;    .pFuncTable parameter in PearsonHash procedure.
;
;


proc GeneratePerfectPearsonFunction, .pStringArray
begin









        int3
        return
endp



if used test_func

test_func db 141, 227, 251,   2, 201, 179,  30,  63,  93, 145,  92,  46,   6,  95, 105,   1
          db  90, 112,  60,  84, 110, 205,   0, 253, 215, 118, 244, 218, 231,  31, 192,  67
          db 189,  23,  66, 144,  59, 115, 248, 237, 216,  82, 217,  72, 147, 143, 125, 170
          db 152, 154,  57,   4,  44, 131, 157, 111, 209, 185,  35,  81,  41, 182, 202, 176
          db 113, 193, 114, 254,  39, 194,  94, 190,  37,  42,  15, 195, 188, 169,  12,   7
          db 175,  88, 245, 127, 203, 135, 181, 178,  99, 164,  76, 235,  21,  86, 160, 243
          db 223, 126, 136, 129,  77, 239, 132, 174, 122, 233,  87, 108,  47, 146, 158, 128
          db  97, 162, 219,  91, 229, 222, 104,  71, 150,  55, 242,  75, 151, 206, 119,  36
          db  58, 236, 117,  43,  74, 155, 246, 116, 153, 148,  68, 159, 210, 161,  19,  64
          db 247, 186,  83,  29,   5, 249, 177, 196, 250, 197, 167, 230,  26, 134, 124, 240
          db  69, 149,  65,  62, 101,  38, 183,  45,  24, 166,  33, 123, 207, 107, 241, 191
          db 208,  85,  78, 184,  32,  89,  20, 165,  27,  22,  11, 130,  98,  80,  17, 198
          db 200, 211,  16, 100,  51, 232,   3,  96,  73, 187,  14,  53, 121, 199,  18, 103
          db 228, 180, 156, 252, 168,  49,   8, 171,  79, 204,  10, 139,  40,  61, 220, 212
          db  13, 221, 109,  25, 255, 120,  70,  28,  48, 213, 234,  50, 138,   9,  52, 142
          db 225, 172, 106,  54, 214, 163, 140,  34, 238, 224,  56, 226, 102, 137, 133, 173

end if




endmodule

Added freshlib/data/hashtree.asm.





















































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
module "Hash tree"

; The hash tree is a TArray of THashTreeNode elements.
; .bit0 and .bit1 elements contain the offset to the next element of the array
; for the hash bit respectively 0 and 1.
;
; The procedure of searching in the tree is by separating the every next bit of the
; hash and jumping to the offset written in the [.bit0] or [.bit1] of the current node.
;
; if on some loop, the [.bitX] is 0 then, the string is not inside the tree.
;
; The offset on the 32th bit points to the THashTreeLeaf element (it takes 2 elements of
; the array). Here, direct comparison with [THashTreeLeaf.hString] element has to be done
;
; If the strings match, then the element has been found. If not, then a hash collision occured.
; In this case, the strings with equal hashes are added in a linear list linked through the
; [THashTreeLeaf.next] field. Follow the links and compare the strings until 0 (string not found)
; or string match.
;
; The searching in the tree is slower than the classic hash table, but is still O(1)
; and has the great advantage, that allows using of 32 bit hashes where the collisions
; are very rare, and still keeps the hash tree pretty small. Something like O(n.log n)
;
; This structure worth to be used when very big amount of strings need to be searched.


struct THashTreeNode
  .bit0 dd ?
  .bit1 dd ?
ends

struct THashTreeLeaf
  .hString dd ?         ; a handle of the string stored.
  .next    dd ?         ; the next element in the cases of collisions. (well, it is very case, but still happens sometimes).
  .lparam  dd ?         ; user defined parameter.
  .wparam  dd ?         ; user defined parameter.
ends


; Searches the hash tree for the given string.
; if [.fAdd] is TRUE and if the string is not in the tree it will be added.
;
; Arguments:
;   .pHashTree - pointer to TArray with elements size sizeof.THashTreeNode (8 bytes)
;   .hString - handle/pointer to the string to be searched/added. Notice, that exactly this
;              string will be added to the THashTreeLeaf element. The caller is responsible
;              to not free this string until the hash tree is needed.
;   .fAdd - flag indicating whether to add the string to the tree if is not included.
;
; Returns:
;   edx - pointer to the array. Can be reallocated!
;   eax - index in the TArray of the THashTreeLeaf of the string.
;   CF = 1: the string is already in the tree.
;   CF = 0: the string is not in the tree.
;     [.fAdd] <> 0: eax contains a pointer to the new added leaf.
;                   eax == 0 means there is an out of memory error on
;                   the attempt to add the string.
;     [.fAdd] = 0: eax == 0

proc SearchHashTree, .pHashTree, .hString, .fAdd
.hash dd ?
begin
        pushad

        mov     edx, [.pHashTree]

        stdcall StrHash, [.hString]
        mov     [.hash], eax

        mov     ecx, 32                          ; the depth of the tree
        mov     ebx, TArray.array

        cmp     [edx+TArray.count], 0
        jne     .treeseek

        stdcall AddArrayItems, edx, 1
        and     dword [eax+THashTreeNode.bit0], 0
        and     dword [eax+THashTreeNode.bit1], 0

.treeseek:
        xor     edi, edi
        ror     [.hash], 1
        adc     edi, edi
        lea     edi, [ebx+4*edi]

        cmp     dword [edx + edi], 0             ; edi is offset from the begining of the array.
        je      .notfound

        mov     ebx, [edx + edi]
        loop    .treeseek

; The hash exists in the hash tree. Process the possible collisions.
; here ebx is the offset to the THashTreeLeaf !

.cmp_loop:
        stdcall StrCompCase, [.hString], [edx+ebx+THashTreeLeaf.hString]
        jc      .finish      ; the string is already in the hash tree!!!

;        OutputValue "Collision at offset:", ebx, 10, -1

        lea     edi, [ebx + THashTreeLeaf.next]

        cmp     dword [edx + edi], 0
        je      .add_in_list

        mov     ebx, [edx + edi]
        jmp     .cmp_loop

.add_in_list:
        cmp     [.fAdd], 0
        je      .finish_zero

        stdcall AddArrayItems, edx, 2
        jc      .finish_zero

        sub     eax, edx
        jmp     .do_add


.notfound:
        cmp     [.fAdd], 0
        je      .finish_zero

; edx - pointer to the tree array,  ebx - offset of the last found element.
; eax - 0 or 1 depending of the last bit checked. ecx - remaining bits count.
; edi - the offset to the [.bitX] field of the last node.

.add_remaining:

        lea     eax, [ecx+1]
        stdcall AddArrayItems, edx, eax  ; add all needed (THashTreeNode) + THashTreeLeaf
        jc      .finish_zero

        sub     eax, edx

        dec     ecx
        jz      .do_add

.addloop:
        mov     [edx + edi], eax
        and     dword [edx + eax + THashTreeNode.bit0], 0
        and     dword [edx + eax + THashTreeNode.bit1], 0

        xor     edi, edi
        ror     [.hash], 1
        adc     edi, edi

        lea     edi, [eax + 4*edi]
        add     eax, sizeof.THashTreeNode
        loop    .addloop

.do_add:
        mov     [edx + edi], eax
        lea     ebx, [edx+eax]

        mov     ecx, [.hString]
        xor     eax, eax

        mov     [ebx+THashTreeLeaf.hString], ecx
        mov     [ebx+THashTreeLeaf.next], eax
        mov     [ebx+THashTreeLeaf.lparam], eax
        mov     [ebx+THashTreeLeaf.wparam], eax

        clc

.finish:
        mov     [esp+4*regEAX], ebx
        mov     [esp+4*regEDX], edx
        popad
        return


.finish_zero:
        xor     ebx, ebx
        clc
        jmp     .finish
endp




proc FreeHashTree, .pHashTree
begin
        pushad

        mov     edx, [.pHashTree]
        cmp     [edx+TArray.count], 32
        jb      .free_array

        pushd   0 0

        mov     ebx, TArray.array
        mov     ecx, 32

.scan:
        dec     ecx
        js      .free_leaf

        mov     esi, [edx+ebx+THashTreeNode.bit0]
        mov     ebx, [edx+ebx+THashTreeNode.bit1]

        test    ebx, ebx
        jz      .bit0

        test    esi, esi
        jz      .scan

        push    esi ecx
        jmp     .scan

.bit0:
        mov     ebx, esi
        jmp     .scan

.free_leaf:

.free_loop:

        mov     eax, [edx+ebx+THashTreeLeaf.hString]
        cmp     eax, [StrHandleOffs]
        jb      .free_ok
        cmp     eax, [StrHandleEnd]
        jae     .free_ok
        stdcall StrDel, eax
.free_ok:
        mov     ebx, [edx+ebx+THashTreeLeaf.next]
        test    ebx, ebx
        jnz     .free_loop

        pop     ecx ebx
        test    ebx, ebx
        jnz     .scan

.free_array:
        stdcall FreeMem, edx

        popad
        return
endp










endmodule

Added freshlib/data/i18n.asm.

























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;   Description: Internationalization strings library.
;
;   Target OS: Any
;
;   Dependencies: None
;
;   Notes:
;_________________________________________________________________________________________


; Switches the itext strings array to some language.
; Arguments:
;   .lang - dword containing the language name in human readable char form. For example: "EN", "BG", etc.
;           The names of the languages are defined by the user, when creating internationalized strings with
;           "itext" macro.
; Returns:
;    CF = 0 - the language is switched successfuly.
;    CF = 1 - unknown language.
;

proc SetLanguage, .lang
begin
        pushad
        mov     esi, I18nLanguages

; search for the language strings set address.
.loop:
        lodsd
        test    eax, eax
        jz      .language_not_found

        cmp     eax, [.lang]
        je      .found

        lea     esi, [esi+4]
        jmp     .loop

; copy the language strings set to the itext placeholder array.
.found:
        lodsd
        mov     esi, eax
        mov     edi, I18nStrings
        mov     ecx, I18nStrings.length

        rep movsb

        clc
        popad
        return

.language_not_found:
        stc
        popad
        return
endp

Added freshlib/data/markdown.asm.































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
module "MiniMagAsm markdown dialect parser"

struct TMarkdownResults
  .hContent     dd ?
  .hIndex       dd ?
  .hKeywords    dd ?
  .hDescription dd ?
ends

fcloseLink              = 1
fcloseImage             = 2
fcloseInlineImage       = 3
fcloseObject            = 4


fblkQuote       = 1
fblkTable       = 2
fblkUList       = 3
fblkOLIst       = 4
fblkSpoiler     = 5

fstateHeader    = $01
fstatePara      = $02
fstateWhite     = $04
fstateBold      = $08
fstateUnderline = $20
fstateStrikeout = $40
fstateItalic    = $80

fstateTextNow  = $200         ; don't use the second byte for any other flags.
fstateTextPrev = $100

fstateInlineSource    =  $10000
fstateBlockSource     =  $20000
fstateTable           = $100000


; Translates some markdown text to HTML
; Arguments:
;     .markdown - pointer or handler of the markdown text.
;     .procFixLink - [proc .ptrLink] procedure that process the link address and returns
;                    handle to the processed link address. if [.procFixLink]=NULL, the links
;                    are inserted as they are in the HTML.
;     .fBacklinks - flag, that defines whether to insert after the headers back links to the
;                   table of contents item.
;     .pResult - pointer to TMarkdownResults structure where the result strings are returned.
;     .lParam - caller supplied parameter that is passed to procFixLink.
;
; Returns:
;   The procedure returns  4 string handles in the TMarkdownResults structure pointed by
;   .pResult argument.

proc TranslateMarkdown2, .markdown, .procFixLink, .fBacklinks, .pResult, .lParam

.result      dd ?
.index       dd ?
.keywords    dd ?
.description dd ?

  ; first and second pass local variables
  .IdString        rb  256
  .IdLen           dd  ?

  .cntH2           dd  ?
  .cntH3           dd  ?
  .cntH4           dd  ?
  .cntH5           dd  ?
  .cntH6           dd  ?

.pHashTable dd ?
.pHTML      dd ?
.limit      dd ?

  .blocks rb 1024
  .pblock dd ?

begin
        pushad

        stdcall GetMem, 4*65536
        mov     [.pHashTable], eax
        stdcall GetMem, 16384
        mov     [.pHTML], eax
        add     eax, 8192
        mov     [.limit], eax

        stdcall StrNew
        mov     [.result], eax

        stdcall StrNew
        mov     [.index], eax

        stdcall StrNew
        mov     [.keywords], eax

        stdcall StrNew
        mov     [.description], eax

        stdcall StrPtr, [.markdown]
        mov     esi, eax

        call    .FirstPass

        stdcall StrPtr, [.markdown]
        mov     esi, eax
        call    .SecondPass

        stdcall FreeMem, [.pHTML]
        stdcall FreeMem, [.pHashTable]

        mov     edi, [.pResult]

        mov     eax, [.result]
        mov     edx, [.index]
        mov     ebx, [.keywords]
        mov     ecx, [.description]

        mov     [edi+TMarkdownResults.hContent], eax
        mov     [edi+TMarkdownResults.hIndex], edx
        mov     [edi+TMarkdownResults.hKeywords], ebx
        mov     [edi+TMarkdownResults.hDescription], ecx

        popad
        return

;.... start of .FirstPass ..........................................

.FirstPass:
        mov     edi, [.pHTML]
        mov     [.cntH2], 0
        mov     [.cntH3], 0
        mov     [.cntH4], 0
        mov     [.cntH5], 0
        mov     [.cntH6], 0

.line_start:
        cmp     edi, [.limit]
        jb      @f

        mov     dword [edi], 0
        stdcall StrCat, [.index], [.pHTML]
        mov     edi, [.pHTML]

@@:
        cmp     byte [esi], '#'
        je      .header

        cmp     byte [esi], '['
        je      .link

.skip_to_eol:
        mov     al, [esi]
        lea     esi, [esi+1]
        cmp     al, $0d
        je      .line_start
        cmp     al, $0a
        je      .line_start
        test    al, al
        jnz     .skip_to_eol

.end_of_file:
        mov     dword [edi], 0
        stdcall StrCat, [.index], [.pHTML]

        retn

; ----- return from .FirstPass -------------------

; create table of contents item.
.header:
        xor     ecx, ecx

.scan_level:
        inc     ecx
.scan_space:
        lea     esi, [esi+1]
        mov     al, [esi]
        cmp     al, '#'
        je      .scan_level
        cmp     al, ' '
        je      .scan_space
        cmp     al, $09
        je      .scan_space

        cmp     al, $0d
        je      .line_start
        cmp     al, $0a
        je      .line_start

        cmp     ecx, 6
        jbe     @f
        mov     ecx, 6
@@:
        call    .BuildID

        mov     dword [edi], '<a i'
        lea     edi, [edi+4]
        mov     dword [edi], 'd="B'
        lea     edi, [edi+4]

        call    .InsertID

        mov     dword [edi], '" hr'
        mov     dword [edi+4], 'ef="'
        mov     word  [edi+8], '#H'
        lea     edi, [edi+10]

        call    .InsertID

        mov     dword [edi],    '" st'
        mov     dword [edi+4],  'yle='
        mov     dword [edi+8],  '"pad'
        mov     dword [edi+12], 'ding'
        mov     dword [edi+16], '-lef'
        mov     word [edi+20],  't:'
        lea     edi, [edi+22]

        push    ecx
        mov     eax, ecx
        mov     ecx, 10
        sub     eax, 2
        jns     @f
        xor     eax, eax
@@:
        call    _NumToStrU
        pop     ecx

        mov     dword [edi], 'em">'
        lea     edi, [edi+4]

        cmp     ecx, 1
        je      @f
        call    .InsertID
@@:
; copy the header text

.copy_loop:
        mov     al, [esi]
        lea     esi, [esi+1]
        cmp     al, $0d
        je      .end_header
        cmp     al, $0a
        je      .end_header
        test    al, al
        jz      .end_header

        mov     [edi], al
        lea     edi, [edi+1]
        jmp     .copy_loop

.end_header:
        dec     esi
        mov     dword [edi],   '</a>'
        mov     dword [edi+4], '<br '
        mov     word [edi+8], '/>'
        lea     edi, [edi+10]
        jmp     .line_start

;link processing
.link:
        cmp     byte [esi+1], '#'
        je      .skip_to_eol

        mov     edx, $811C9DC5   ; 2166136261 ; FNV offset basis
        mov     ecx, esi
        and     [.link_level], 0

.label_loop:
        mov     al, [esi]
        lea     esi, [esi+1]

        cmp     al, $20
        je      .label_loop
        cmp     al, $09
        je      .label_loop

        cmp     al, $0d
        je      .line_start
        cmp     al, $0a
        je      .line_start

        cmp     al, "["
        jne     @f
        inc     [.link_level]
@@:
        test    al, al
        jz      .end_of_file

        xor     dl, al
        imul    edx, $01000193                  ;   16777619              ; FNV prime
        cmp     al, ']'
        jne     .label_loop

        dec     [.link_level]
        jnz     .label_loop


; fold the hash to 16 bit value...
        mov     ebx, edx
        shr     ebx, 16
        xor     ebx, edx
        and     ebx, $ffff
        mov     edx, ebx

; search free slot
.search_slot:
        mov     eax, [.pHashTable]
        xchg    ecx, [eax+4*ebx]
        test    ecx, ecx
        jz      .skip_to_eol

; conflict...
; compare the labels on ecx (the old content of the slot) with [HashTable+4*ebx] (the new pointer)
        push    edi ecx

        mov     edi, [eax+4*ebx]
        and     [.link_level], 0

.first:
        mov     al, [ecx]
        lea     ecx, [ecx+1]

        cmp     al, $20
        je      .first
        cmp     al, $09
        je      .first

.second:
        mov     ah, [edi]
        lea     edi, [edi+1]
        cmp     ah, $20
        je      .second
        cmp     ah, $09
        je      .second

        cmp     al, ah
        jne     .add_not_equal

        cmp     ah, '['
        jne     @f
        inc     [.link_level]
@@:
        cmp     ah, ']'
        jne     .first

        dec     [.link_level]
        jnz     .first

        pop     ecx edi
        jmp     .skip_to_eol

; save it to the next slot
.add_not_equal:
        pop     ecx edi

        inc     ebx
        and     ebx, $ffff
        cmp     ebx, edx
        jne     .search_slot

        int3    ; full hash table -> to be implemented error processing

;---- End of .FirstPass --------------------------------


;.... Start of .SecondPass .............................

locals
  ; .SecondPass only local variables
  .state        dd ?
  .last_header  dd ?
  .linkID_end   dd ?
  .link_level   dd ?

  .close_now    dd ?
  .close_index  dd ?
  .close_stack  rb 256           ; 256 levels of nested links.
endl

.SecondPass:
        mov     edi, [.pHTML]

        xor     eax, eax
        mov     [.state], eax
        mov     [.close_index], eax
        mov     [.cntH2], eax
        mov     [.cntH3], eax
        mov     [.cntH4], eax
        mov     [.cntH5], eax
        mov     [.cntH6], eax
        mov     [.pblock], eax


.line_start2:
        shr     byte [.state+1], 1   ; fstateTextPrev = fstateTextNow; fStateTextNow = 0

        cmp     edi, [.limit]
        jb      @f
        mov     dword [edi], 0
        stdcall StrCat, [.result], [.pHTML]
        mov     edi, [.pHTML]
@@:

        test    [.state], fstateBlockSource
        jnz     .copy_source

        cmp     byte [esi], '['
        je      .link_definition

        cmp     byte [esi], '#'
        je      .header2

        cmp     byte [esi], ';'
        je      .block_element

        cmp     dword [esi], '----'
        je      .horiz_rule


.scan_line2:
        lodsb

        cmp     al, ' '
        je      .white_space
        cmp     al, $09         ; tab
        je      .white_space

        cmp     al, $0d
        je      .end_of_line
        cmp     al, $0a
        je      .end_of_line
        test    al, al
        jz      .end_of_line

; it is not white space character...
        test    [.state], fstateTextPrev or fstateTextNow or fstateHeader
        jz      .start_para

.process_char:
        or      [.state], fstateTextNow

        test    [.state], fstateInlineSource
        jnz     .inline_source

        cmp     al, '*'
        je      .process_bold

        cmp     al, '_'
        je      .process_underline

        cmp     al, '-'
        je      .process_strikeout

        cmp     al, '/'
        je      .process_italic

        cmp     al, '['
        je      .is_link_begin

        cmp     al, ']'
        je      .is_link_end

        cmp     al, '\'
        je      .escape_next

.inline_source:
        cmp     al, '`'
        je      .process_inline_code


.normal_char:
        and     [.state], not fstateWhite

.markup_ok:

        call    .store_char
        jmp     .scan_line2


.escape_next:

        cmp     byte [esi], $20
        jbe     .normal_char

        lodsb
        jmp     .normal_char


; stores the char from al in [edi], and
; replaces the invalid HTML characters
; with their &name; representation.

.store_char:
        cmp     al, 'A'
        jb      @f

        mov     [edi], al
        inc     edi
        retn

@@:
        cmp     al, '<'
        je      .char_less_then
        cmp     al, '>'
        je      .char_greater_then
        cmp     al, '"'
        je      .char_quote
        cmp     al, '&'
        je      .char_amp
;        cmp     al, "'"
;        je      .char_apos

        mov     [edi], al
        lea     edi, [edi+1]
        retn

.char_less_then:
        mov     dword [edi], '&lt;'
        lea     edi, [edi+4]
        retn

.char_greater_then:
        mov     dword [edi], '&gt;'
        lea     edi, [edi+4]
        retn

.char_quote:
        mov     dword [edi], '&quo'
        mov     word [edi+4], 't;'
        lea     edi, [edi+6]
        retn

;.char_apos:
;        mov     dword [edi], '&apo'
;        mov     word [edi+4], 's;'
;        lea     edi, [edi+6]
;        retn

.char_amp:
        mov     dword [edi], '&amp'
        mov     byte [edi+4], ';'
        lea     edi, [edi+5]
        retn


.start_para:
        test    [.state], fstateTable
        jz      .not_td_open

        mov     dword [edi], '<td>'
        lea     edi, [edi+4]

        cmp     al, '('         ; col, row span
        jne     .td_ok

        dec     edi

        mov     dword [edi], ' col'
        mov     dword [edi+4], 'span'
        mov     word  [edi+8], '="'
        lea     edi, [edi+10]

.copy_span:
        mov     al, [esi]
        lea     esi, [esi+1]
        cmp     al, ','
        je      .row_span
        cmp     al, ')'
        je      .end_span

        call    .store_char
        jmp     .copy_span

.row_span:
        mov     dword [edi],    '" ro'
        mov     dword [edi+4],  'wspa'
        mov     dword [edi+8],  'n="'
        lea     edi, [edi+11]
        jmp     .copy_span

.end_span:
        mov     word [edi], '">'
        lea     edi, [edi+2]

        mov     al, [esi]
        lea     esi, [esi+1]

.td_ok:
        or      [.state], fstatePara
        jmp     .process_char

.not_td_open:
        cmp     al, '*'
        jne     .simple_p_tag

        cmp     byte [esi], ' '
        jne     .simple_p_tag

        mov     dword [edi], '<li>'
        add     edi, 4
        or      [.state], fstatePara

        inc     esi
        mov     al, [esi]
        inc     esi
        jmp     .process_char

.simple_p_tag:
        mov     dword [edi], '<p>'
        add     edi, 3
        jmp     .process_char

.process_inline_code:
        mov     ecx, fstateInlineSource
        mov     ebx, cInlineCodeTag
        jmp     .ProcessTag

cInlineCodeTag text "code"

.process_bold:
        mov     ecx, fstateBold
        mov     ebx, cBoldTag
        jmp     .ProcessTag

cBoldTag text "strong"

.process_italic:
        mov     ecx, fstateItalic
        mov     ebx, cItalicTag
        jmp     .ProcessTag

cItalicTag text "em"

.process_underline:
        mov     ecx, fstateUnderline
        mov     ebx, cUnderlinedTag
        jmp     .ProcessTag

cUnderlinedTag text 'span class="underlined"'

.process_strikeout:
        mov     ecx, fstateStrikeout
        mov     ebx, cStrikedTag

cStrikedTag text "del"

; ecx = state mask
; ebx = pointer to html tag string
.ProcessTag:
        mov     dl, al

        test    [.state], ecx
        jz      .start_tag

; close tag
        not     ecx
        and     [.state], ecx

        mov     word [edi], '</'
        lea     edi, [edi+2]
        jmp     .finish_tag

.start_tag:
        test    [.state], fstateWhite
        jz      .normal_char
        cmp     byte [esi], $20
        je      .normal_char
        cmp     byte [esi], $09
        je      .normal_char
        cmp     byte [esi], $0d
        je      .normal_char
        cmp     byte [esi], $0a
        je      .normal_char

        or      [.state], ecx

; open tag
        mov     byte [edi], '<'
        lea     edi, [edi+1]

.copy_start:
        mov     al, [ebx]
        inc     ebx
        test    al, al
        jz      .end_tag

        stosb
        jmp     .copy_start


.finish_tag:
        mov     al, [ebx]
        lea     ebx, [ebx+1]
        cmp     al, " "
        jbe     .end_tag

        stosb
        jmp     .finish_tag

.end_tag:
        mov     byte [edi], '>'
        lea     edi, [edi+1]

        jmp     .scan_line2


.white_space:
        test    [.state], fstateWhite
        jnz     .scan_line2

        or      [.state], fstateWhite
        mov     [edi], al
        lea     edi, [edi+1]
        jmp     .scan_line2

; end of line and end of file processing
.end_of_line:
        test    al, al
        jz      @f

        xor     al, $0d xor $0a
        cmp     [esi], al
        jne     @f
        inc     esi

@@:
        or      [.state], fstateWhite

        test    al, al
        jz      .close_p_eof

        test    [.state], fstateTextNow
        jnz     .para_ok

.close_p_eof:
        call    .close_paragraph

.para_ok:
        test    [.state], fstateHeader
        jz      .crlf

; insert back link
        cmp     [.fBacklinks], 0
        je      .backlink_ok

        mov     dword [edi],    '<a c'
        mov     dword [edi+4],  'lass'
        mov     dword [edi+8],  '="ba'
        mov     dword [edi+12], 'ck" '
        lea     edi, [edi+16]

        mov     dword [edi],   'href'
        mov     dword [edi+4], '="#B'
        lea     edi, [edi+8]

        call    .InsertID

        mov     word  [edi], '">'
        mov     dword [edi+2], '</a>'
        lea     edi, [edi+6]

.backlink_ok:
        mov     byte [edi], '<'
        lea     edi, [edi+1]

        mov     ecx, [.last_header]
        add     ecx, '/h0>'
        mov     [edi], ecx
        lea     edi, [edi+4]

        and     [.state], not (fstateHeader or fstateTextNow)   ; For the paragraph flow, the header loops like empty line.

.crlf:
        test    [.state], fstateTextPrev or fstateTextNow
        jz     @f
        mov     word [edi], $0a0d
        lea     edi, [edi+2]
@@:
        test    al, al
        jnz     .line_start2

.finish:
        mov     dword [edi], 0
        stdcall StrCat, [.result], [.pHTML]
        retn


.is_link_begin:
;        test    [.state], fstateWhite
;        jz      .normal_char

.searchID:
        dec     esi

;.SearchLink:
        push    edi
        push    esi

; first compute the hash for the link label
        mov     edx, $811C9DC5                  ; 2166136261              ; FNV offset basis
        and     [.link_level], 0

.hashloop:
        mov     al, [esi]
        lea     esi, [esi+1]

        cmp     al, $20
        je      .hashloop
        cmp     al, $09
        je      .hashloop

        cmp     al, $0d
        je      .not_a_link
        cmp     al, $0a
        je      .not_a_link
        test    al, al
        je      .not_a_link

        cmp     al, '['
        jne     @f
        inc     [.link_level]
@@:

        xor     dl, al
        imul    edx, $01000193                  ;   16777619              ; FNV prime
        cmp     al, ']'
        jne     .hashloop

        dec     [.link_level]
        jnz     .hashloop

; fold the hash to 16 bit value...
        mov     [.linkID_end], esi

        mov     ebx, edx
        shr     ebx, 16
        xor     ebx, edx
        dec     ebx

.hash_table_loop:
        lea     ebx, [ebx+1]
        and     ebx, $ffff

        mov     eax, [.pHashTable]
        mov     edi, [eax+4*ebx]
        mov     esi, [esp]

        test    edi, edi
        jnz     .cmp_labels

;.inline_link:                   ; the linkID was not found in the hash table. So, it should be inline link address.

        mov     edi, esi           ; the address of the link is in esi
        mov     esi, [.linkID_end] ; the address of the end of the linkID.
        jmp     .create_link

.not_a_link:
        pop     esi edi
        mov     al, [esi]
        lea     esi, [esi+1]
        jmp     .normal_char    ; the link address was not found, so it is not link at all.

.cmp_labels:

        and     [.link_level], 0

.cmp_labels_loop:
        mov     al, [esi]
        lea     esi, [esi+1]

        cmp     al, ' '
        je      .cmp_labels_loop
        cmp     al, $09
        je      .cmp_labels_loop

.target:
        mov     ah, [edi]
        lea     edi, [edi+1]

        cmp     ah, ' '
        je      .target
        cmp     ah, $09
        je      .target

        cmp     al, ah
        jne     .hash_table_loop      ; it is not the same label - try again.

        cmp     ah, '['
        jne     @f

        inc     [.link_level]
        jmp     .cmp_labels_loop
@@:
        cmp     ah, ']'
        jne     .cmp_labels_loop

        dec     [.link_level]
        jnz     .cmp_labels_loop

; the labels are equal, so search the address.

.create_link:
        mov     [.close_now], fcloseLink

        mov     edx, [esp]              ; the start of the linkID.

        cmp     byte [esi], '['         ; is the link has separate ID and text?
        jne     @f
        mov     [esp], esi              ; replace the source address.
@@:
        inc     edx
        cmp     byte [edx], '#'       ; is it internal link?
        je      .firstnw

; inline image?
        cmp     byte [edx], '?'       ; is it inline image?
        jne     .maybe_block_image

        mov     [.close_now], fcloseInlineImage
        jmp     .firstnw

.maybe_block_image:
        cmp     byte [edx], '!'       ; is it an image?
        jne     .maybe_object

        mov     [.close_now], fcloseImage
        jmp     .firstnw

.maybe_object:
        cmp     byte [edx], '$'
        jne     .firstnw

        mov     [.close_now], fcloseObject

.firstnw:
        and     [.link_level], 0
        cmp     byte [edi], '['         ; inline address.
        jne     .firstnw_loop

        inc     edi

.firstnw_loop:
        mov     al, [edi]
        inc     edi

        cmp     al, ' '
        je      .firstnw_loop
        cmp     al, $09
        je      .firstnw_loop

        dec     edi
        mov     edx, edi

.internal_link_address:
        pop     esi edi

        cmp     [.close_now], fcloseLink
        je      .it_is_link

        cmp     [.close_now], fcloseObject
        je      .it_is_object

; it is image.
        mov     dword [edi],    '<img'
        mov     dword [edi+4],  ' cla'
        mov     dword [edi+8],  'ss="'

        cmp     [.close_now], fcloseImage
        je      .block_image

        mov     dword [edi+12], 'ico'
        jmp     .check_style

.block_image:
        mov     dword [edi+12], 'txt'

; copy the style number if any:
.check_style:
        lea     edi, [edi+15]

        push    esi
        mov     esi, edx

        lodsb

        cmp     al, '!'
        je      .copy_style
        cmp     al, '?'
        je      .copy_style

        dec     esi

.copy_style:
        lodsb
        cmp     al, '0'
        jb      .style_ok
        cmp     al, '9'
        ja      .style_ok

        stosb
        jmp     .copy_style


.style_ok:
        lea     edx, [esi-1]
        pop     esi

.img_tag_end:
        mov     dword [edi], '" sr'
        mov     dword [edi+4],  'c="'
        lea     edi, [edi+7]
        jmp     .link_tag_ok

.it_is_object:
        push    esi

        mov     esi, edx
        cmp     byte [edx], '$'
        jne     @f
        inc     esi
@@:
        mov     dword [edi],   '<vid'
        mov     dword [edi+4], 'eo c'
        mov     dword [edi+8], 'ontr'
        mov     dword [edi+12],'ols '
        add     edi, 16

        cmp     byte [esi], '0'
        jb      .par_data
        cmp     byte [esi], '9'
        ja      .par_data

        mov     dword [edi],  ' wid'
        mov     dword [edi+4],'th="'
        add     edi, 8

.copy_width:
        lodsb
        cmp     al, 'x'
        je      .width_ok
        cmp     al, ' '
        jb      .height_ok
        cmp     al, ']'
        je      .height_ok
        cmp     al, '0'
        jb      .height_ok
        cmp     al, '9'
        ja      .height_ok

        stosb
        jmp     .copy_width

.width_ok:
        mov     dword [edi],   '" he'
        mov     dword [edi+4], 'ight'
        mov     word [edi+8],  '="'
        add     edi, 10

.copy_height:
        lodsb
        cmp     al, ':'
        je      .height_ok
        cmp     al, ' '
        jb      .height_ok
        cmp     al, ']'
        je      .height_ok
        cmp     al, '0'
        jb      .height_ok
        cmp     al, '9'
        ja      .height_ok

        stosb
        jmp     .copy_height

.height_ok:
        mov     word [edi], '" '
        add     edi, 2

.par_data:
        mov     dword [edi],   '><so'
        mov     dword [edi+4], 'urce'
        mov     dword [edi+8], ' src'
        mov     word [edi+12], '="'
        add     edi, 14

        lea     edx, [esi-1]
        pop     esi
        jmp     .link_tag_ok


; yes the link was found.
.it_is_link:
        mov     dword [edi],   '<a h'
        mov     dword [edi+4], 'ref='
        mov     byte [edi+8], '"'
        lea     edi, [edi+9]

.link_tag_ok:
        push    ecx esi

; push the close flag:

        mov     esi, [.close_index]
        mov     ecx, [.close_now]
        mov     [.close_stack+esi], cl
        inc     [.close_index]

; copy link address

        mov     esi, edx

        cmp     byte [esi], '?'
        je      .skip_img_char

        cmp     byte [esi], ':'
        je      .skip_img_char
        cmp     byte [esi], '$'
        je      .skip_img_char

        cmp     byte [esi], '!'
        jne     .copy_link_prefix

.skip_img_char:

        inc     esi

.copy_link_prefix:
        cmp     [.procFixLink], 0
        je      .copy_link_proc

        stdcall [.procFixLink], esi, edi, [.lParam]
        mov     edi, eax
        mov     esi, edx

.copy_link_proc:

        call    .CopyToEndOfLink
        pop     esi ecx

        cmp     [.close_now], fcloseImage
        je      .finalize_image
        cmp     [.close_now], fcloseInlineImage
        je      .finalize_image

; finalize link and object tags.

        mov     word [edi], '">'
        add     edi, 2

.go_link_text:
        and     [.state], not fstateWhite

        inc     esi                     ; skip the leading "["
        cmp     byte [esi], '#'
        jne     .scan_line2
        inc     esi
        jmp     .scan_line2

.finalize_image:

        mov     dword [edi],   '" al'
        mov     dword [edi+4], 't="'
        lea     edi, [edi+7]

        inc     esi
        call    .CopyToEndOfLink

        dec     esi
        jmp     .scan_line2


.CopyToEndOfLink:

.copy_eol:
        lodsb

        cmp     al, $0d
        je      .end_link
        cmp     al, $0a
        je      .end_link

        cmp     al, '['
        jne     @f
        inc     [.link_level]
@@:
        cmp     al, ']'
        je      .end_link_check

        test    al, al
        jz      .end_link

.store_link_char:
        call    .store_char
        jmp     .copy_eol

.end_link_check:
        cmp     [.link_level], 0
        je      .end_link

        dec     [.link_level]
        jmp     .store_link_char
;        jnz     .store_link_char

.end_link:
        retn

;....................................................................

.is_link_end:
        call    .close_one_link
        jc      .normal_char

        jmp     .scan_line2


.close_all_links:
        call    .close_one_link
        jnc     .close_all_links
        retn

; closes one link from the stack.
; returns CF=1 on empty stack.

.close_one_link:

        mov     ecx, [.close_index]
        sub     ecx, 1
        jnc     .close_pop

        retn

.close_pop:
        mov     [.close_index], ecx
        mov     al, [.close_stack+ecx]

        cmp     al, fcloseObject
        je      .close_object_tag

        cmp     al, fcloseLink
        je      .close_link_tag

; close the image tag

        mov     dword [edi], '" />'
        add     edi, 4

.close_end:
        retn


.close_link_tag:

        mov     dword [edi], '</a>'
        add     edi, 4
        retn

.close_object_tag:
        mov     dword [edi],   '</vi'
        mov     dword [edi+4], 'deo>'
        add     edi, 8
        retn

;....................................................................
; Processing of block source code
.copy_source:

.source_line:

        cmp     edi, [.limit]
        jb      @f
        mov     dword [edi], 0
        stdcall StrCat, [.result], [.pHTML]
        mov     edi, [.pHTML]
@@:

        cmp     dword [esi], ';end'
        je      .end_source_block

.copy_source_line:
        mov     al, [esi]
        lea     esi, [esi+1]

        call    .store_char

        test    al, al
        jz      .end_source_block2

        cmp     al, $0d
        je      .end_source_line
        cmp     al, $0a
        jne     .copy_source_line

.end_source_line:
        xor     al, $0d xor $0a
        cmp     [esi], al
        jne     .source_line

        inc     esi
        mov     [edi], al
        lea     edi, [edi+1]
        jmp     .source_line

.end_source_block2:
        dec     esi

.end_source_block:
        mov     dword [edi],   '</pr'
        mov      word [edi+4], 'e>'
        mov     word  [edi+6], $0a0d
        lea     edi, [edi+8]

        and     [.state], not fstateBlockSource
        jmp     .skip2

;....................................................................

.close_paragraph:       ; the <p> and <li> tags are not closed actually. Only the <td> tags.
;        test    [.state], fstatePara
;        jz      .close_para_ok

        call    .close_inlines
        call    .close_all_links

        test    [.state], fstateTable
        jnz     .close_td

        jmp     .close_para_ok

.close_td:
        mov     dword [edi], '</td'
        mov     dword [edi+4], '>'+($0a0d shl 8)
        lea     edi, [edi+7]

.close_para_ok:
        and     [.state], not fstatePara
        retn

;....................................................................
; closes all open inline tags.

.close_inlines:
        push    esi

        test    [.state], fstateBold
        jz      .bold_ok

        mov     esi, cBoldTag
        call    .copy_one_close_tag

.bold_ok:
        test    [.state], fstateItalic
        jz      .italic_ok

        mov     esi, cItalicTag
        call    .copy_one_close_tag

.italic_ok:
        test    [.state], fstateUnderline
        jz      .underline_ok

        mov     esi, cUnderlinedTag
        call    .copy_one_close_tag

.underline_ok:
        test    [.state], fstateStrikeout
        jz      .strike_ok

        mov     esi, cStrikedTag
        call    .copy_one_close_tag

.strike_ok:
        test    [.state], fstateInlineSource
        jz      .inline_source_ok

        mov     esi, cInlineCodeTag
        call    .copy_one_close_tag

.inline_source_ok:
        and     [.state], not (fstateBold or fstateItalic or fstateUnderline or fstateStrikeout or fstateInlineSource)
        pop     esi
        retn

.copy_one_close_tag:
        mov     ax, '</'
        stosw

.coct_loop:
        lodsb
        cmp     al, " "
        jbe     .end_coct
        stosb
        jmp     .coct_loop

.end_coct:
        mov     al, '>'
        stosb
        retn


;....................................................................
; horizontal rule element

.horiz_rule:
        call    .close_paragraph

        mov     dword [edi], '<hr '
        mov     dword [edi+4], '/>'+($0a0d shl 16)
        lea     edi, [edi+8]
        jmp     .skip2

;....................................................................
; Processing of the block elements.

.block_element:
        cmp     dword [esi], ';end'
        je      .end_block

        cmp     dword [esi], ';kil'
        jne     .not_kill
        cmp     byte [esi+4], 'l'
        je      .end_all_blocks


.not_kill:
        cmp     dword [esi], ';beg'
        jne     .not_code
        cmp     word [esi+4], 'in'
        jne     .not_code

; code block
        call    .close_paragraph

        mov     dword [edi],    '<pre'
        mov     dword [edi+4],  ' cla'
        mov     dword [edi+8],  'ss="'
        lea     edi, [edi+12]

        push    esi
        add     esi, 6
        call    .CopyName
        pop     esi

        mov     word [edi],     '">'
        lea     edi, [edi+2]

        or      [.state], fstateBlockSource
        jmp     .skip2


.not_code:
        cmp     dword [esi], ';tab'
        jne     .not_table
        cmp     word [esi+4], 'le'
        jne     .not_table

; table block;
        call    .close_paragraph

        mov     al, fblkTable
        call    .PushBlock

        mov     dword [edi], '<tab'
        mov     dword [edi+4], 'le>'
        add     edi, 7

        or      [.state], fstateTable
        jmp     .skip2


.not_table:
        cmp     dword [esi], ';---'
        jne     .not_row

.table_row:
        call    .close_paragraph

        mov     dword [edi],   '</tr'
        mov     dword [edi+4], '><tr'
        mov     byte  [edi+8], '>'
        lea     edi, [edi+9]
        jmp     .skip2


.not_row:
        cmp     dword [esi], ';quo'
        jne     .not_quote
        cmp     word [esi+4], 'te'
        jne     .not_quote

; block quote
        call    .close_paragraph

        mov     al, fblkQuote
        call    .PushBlock

        mov     dword [edi],    '<blo'
        mov     dword [edi+4],  'ckqu'
        mov     dword [edi+8],  'ote>'
        mov     dword [edi+12], '<hea'
        mov     dword [edi+16], 'der>'
        lea     edi, [edi+20]

        push    esi
        add     esi, 6

        call    .CopyName

        mov     dword [edi],   '</he'
        mov     dword [edi+4], 'ader'
        mov     byte  [edi+8], '>'
        lea     edi, [edi+9]

        pop     esi
        jmp     .skip2


.not_quote:
        cmp     dword [esi], ';uli'
        jne     .not_ulist
        cmp     word [esi+4], 'st'
        jne     .not_ulist

; unnumbered list
        call    .close_paragraph

        mov     al, fblkUList
        call    .PushBlock

        mov     dword [edi], '<ul>'
        add     edi, 4
        jmp     .skip2

.not_ulist:
        cmp     dword [esi], ';oli'
        jne     .not_olist
        cmp     word [esi+4], 'st'
        jne     .not_olist

; numbered list
        call    .close_paragraph

        mov     al, fblkOLIst
        call    .PushBlock

        mov     dword [edi], '<ol>'
        add     edi, 4
        jmp     .skip2

.not_olist:
        cmp     dword [esi],   ';spo'
        jne     .not_spoiler
        cmp     dword [esi+4], 'iler'
        jne     .not_spoiler

; spoiler
        call    .close_paragraph

        mov     al, fblkSpoiler
        call    .PushBlock

        mov     dword [edi],    '<det'    ;<details><summary>Spoiler</summary>
        mov     dword [edi+4],  'ails'
        mov     dword [edi+8],  '><su'
        mov     dword [edi+12], 'mmar'
        mov     word [edi+16],  'y>'
        add     edi, 18

        push    esi
        add     esi, 8
        call    .CopyName

        mov     dword [edi],   '</su'
        mov     dword [edi+4], 'mmar'
        mov     word  [edi+8], 'y>'
        add     edi, 10

        pop     esi
        jmp     .skip2

.not_spoiler:
        cmp     dword [esi], ';key'
        jne     .not_keywords
        cmp     dword [esi+4], 'word'
        jne     .not_keywords
        cmp     byte [esi+8], 's'
        jne     .not_keywords

        add     esi, 9
        mov     ecx, [.keywords]
        jmp     .append_line_to_string

.not_keywords:
        cmp     dword [esi], ';des'
        jne     .not_desc
        cmp     dword [esi+4], 'crip'
        jne     .not_desc
        cmp     dword [esi+8], 'tion'
        jne     .not_desc

        add     esi, 12
        mov     ecx, [.description]

.append_line_to_string:


        push    esi     ; first argument of

        nop

.seek_eoa:
        mov     al, [esi]
        lea     esi, [esi+1]

        test    al, al
        jz      .end_of_appended

        cmp     al, $0d
        je      .end_of_appended

        cmp     al, $0a
        jne     .seek_eoa

.end_of_appended:
        dec     esi
        mov     byte [esi], 0

        stdcall StrCat, ecx ; start address from the stack
        mov     [esi], al   ; restore the text
        jmp     .skip2


.not_desc:
        jmp     .skip2          ; ";" at the begining without keyword is comment. The line is ignored.


.end_block:
        call    .close_paragraph
        call    .do_end_block
        jmp     .skip2

.end_all_blocks:
        call    .close_paragraph

.end_all_loop:
        call    .do_end_block
        jnc     .end_all_loop
        jmp     .skip2


.do_end_block:
        call    .PopBlock
        test    eax, eax
        jnz     .what_block
        stc
        retn

.what_block:
        cmp     eax, fblkQuote
        je      .end_quote
        cmp     eax, fblkTable
        je      .end_table
        cmp     eax, fblkUList
        je      .end_ulist
        cmp     eax, fblkOLIst
        je      .end_olist
        cmp     eax, fblkSpoiler
        je      .end_spoiler

        clc
        retn

.end_quote:
        mov     dword [edi],   '</bl'
        mov     dword [edi+4], 'ockq'
        mov     dword [edi+8], 'uote'
        mov     byte [edi+12], '>'
        lea     edi, [edi+13]
        clc
        retn

.end_table:
        mov     dword [edi], '</tr'
        mov     dword [edi+4], '>'+($0a0d shl 8)
        mov     dword [edi+7], '</ta'
        mov     dword [edi+11],'ble>'
        mov     word  [edi+15], $0a0d
        lea     edi, [edi+17]
        and     [.state], not fstateTable
        clc
        retn

.end_olist:
        mov     dword [edi], '</ol'
        jmp     .end_list

.end_ulist:
        mov     dword [edi], '</ul'
.end_list:
        mov     dword [edi+4], '>' + ($0a0d shl 8)
        add     edi, 7
        clc
        retn

.end_spoiler:
        mov     dword [edi],   '</de'
        mov     dword [edi+4], 'tail'
        mov     word  [edi+8], 's>'
        add     edi, 10
        clc
        retn

;....................................................................
.PushBlock:
        push    ecx
        mov     ecx, [.pblock]
        mov     [.blocks+ecx], al
        inc     ecx
        cmp     ecx, 1024
        jb      @f
        dec     ecx
@@:
        mov     [.pblock], ecx
        pop     ecx
        retn

.PopBlock:
        mov     eax, [.pblock]
        dec     eax
        jns     @f
        xor     eax, eax
        mov     [.pblock], eax
        retn
@@:
        mov     [.pblock], eax
        movzx   eax, [.blocks+eax]
        retn

;....................................................................
; processing link definitions in the second pass.
.link_definition:

        mov     al, [esi+1]
        cmp     al, '#'
        je      .define_anchor

        cmp     al, '^'
        jne     .skip2


;.define_footnote:

        jmp     .skip2                  ; any other variant should be
                                        ; stripped from the text.

.define_anchor:
        add     esi, 2
        mov     dword [edi], '<p>'
        lea     edi, [edi+3]
        or      [.state], fstatePara or fstateTextNow

        mov     dword [edi],    '<a c'
        mov     dword [edi+4],  'lass'
        mov     dword [edi+8],  '="a"'
        mov     dword [edi+12], ' id='
        mov     byte [edi+16],  '"'
        add     edi, 17

        push    esi
        call    .copy_id

        mov     dword [edi],   '" hr'
        mov     dword [edi+4], 'ef="'
        mov     byte [edi+8], '#'
        lea     edi, [edi+9]

        pop     esi
        call    .copy_id

        mov     word [edi], '">'
        lea     edi, [edi+2]

        mov     dword [edi], '</a>'
        lea     edi, [edi+4]

        mov     al, [esi]
        jmp     .normal_char

.copy_id:
        mov     [.link_level], 1

.copy_id_loop:
        mov     al, [esi]
        lea     esi, [esi+1]

        cmp     al, '['
        jne     @f
        inc     [.link_level]
@@:
        cmp     al, ']'
        je      .cpid_ok
        cmp     al, $0d
        je      .cpid_ok
        cmp     al, $0a
        je      .cpid_ok
        test    al, al
        jz      .cpid_ok

.store:
        mov     [edi], al
        lea     edi, [edi+1]
        jmp     .copy_id_loop

.cpid_ok:
        dec     [.link_level]
        jnz     .store

        retn

;....................................................................

; processing header items and building of the table of contents.

.header2:
        xor     ecx, ecx

.scan_level2:
        inc     ecx
.scan_space2:
        lea     esi, [esi+1]
        mov     al, [esi]
        cmp     al, '#'
        je      .scan_level2
        cmp     al, ' '
        je      .scan_space2
        cmp     al, $09
        je      .scan_space2

        cmp     al, $0d
        je      .end_of_line
        cmp     al, $0a
        je      .end_of_line

        cmp     ecx, 6
        jbe     @f
        mov     ecx, 6
@@:

; create ID
        call    .BuildID

        shl     ecx, 16
        mov     [.last_header], ecx

        add     ecx, '<h0 '
        mov     [edi], ecx
        mov     dword [edi+4], 'id="'
        mov     byte [edi+8], 'H'
        lea     edi, [edi+9]

; insert the id here.

        call    .InsertID

        mov     word [edi], '">'
        lea     edi, [edi+2]

        cmp     [.last_header], 1 shl 16
        je      @f
        call    .InsertID
        mov     dword [edi], '&nbs'
        mov     word [edi+4], 'p;'
        lea     edi, [edi+6]
@@:
        or      [.state], fstateHeader
        jmp     .scan_line2

.skip2:
        mov     al, [esi]
        lea     esi, [esi+1]

        test    al, al
        jz      .finish
        cmp     al, $0d
        je      .skip_eol
        cmp     al, $0a
        jne     .skip2

.skip_eol:
        xor     al, $0d xor $0a
        cmp     [esi], al
        jne     .line_start2
        inc     esi
        jmp     .line_start2

;----- End of .SecondPass ------------------------------


; ecx - level of the header 1..6
.BuildID:
        push    eax ebx ecx edx edi

        lea     edi, [.IdString]
        cmp     ecx, 1
        jbe     .main

        sub     ecx, 2
        push    ecx

        inc     [.cntH2+4*ecx]

.zero:
        inc     ecx
        cmp     ecx, 5
        je      .end_zero
        mov     [.cntH2+4*ecx], 0
        jmp     .zero

.end_zero:
        xor     ebx, ebx
        mov     ecx, 10

.loop_numbers:
        mov     eax, [.cntH2+4*ebx]
        call    _NumToStrU
        mov     al, '.'
        stosb
        inc     ebx
        cmp     ebx, [esp]
        jbe     .loop_numbers

        dec     edi
        pop     ecx
        jmp     .finID

.main:
        mov     eax, 'main'
        stosd

.finID:
        lea     eax, [.IdString]
        sub     edi, eax
        mov     [.IdLen], edi

        pop     edi edx ecx ebx eax
        retn

.InsertID:
        push    ecx esi

        lea     esi, [.IdString]
        mov     ecx, [.IdLen]

        rep movsb

        pop     esi ecx
        retn



.CopyName:
        push    ecx edx

.sp_loop:
        lodsb
        cmp     al, $0a
        je      .end_cp_name
        cmp     al, $0d
        je      .end_cp_name

        cmp     al, ' '
        jbe     .sp_loop

        dec     esi

.found:
        mov     ecx, esi
        mov     edx, esi

.name_eof:
        lodsb

        test    al, al
        jz      .eol
        cmp     al, $0a
        je      .eol
        cmp     al, $0d
        je      .eol
        cmp     al, ' '
        jbe     .name_eof

        lea     ecx, [esi]
        jmp     .name_eof

.eol:
        sub     ecx, edx
        jz      .end_cp_name

        xchg    esi, edx

.copy_name_loop:
        lodsb
        call    .store_char
        loop    .copy_name_loop

        mov     esi, edx

.end_cp_name:
        pop     edx ecx
        retn
endp




endmodule

Changes to freshlib/data/memstream.asm.

20
21
22
23
24
25
26
27
28







29
30
31
32
33
34
35
        mov     eax, [ebx+TMemoryStream.size]
        sub     eax, edi
        cmp     eax, [.room]      ; check for enough room
        jge     .sizeok

        mov     ecx, [ebx+TMemoryStream.size]
        call    [ResizeIt]
        push    ecx








        stdcall ResizeMem, ebx, ecx
        mov     ebx, eax
        mov     [esi], eax  ; new pointer
        jc      .exit

        mov     [ebx+TMemoryStream.size], ecx   ; new size.








<

>
>
>
>
>
>
>







20
21
22
23
24
25
26

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        mov     eax, [ebx+TMemoryStream.size]
        sub     eax, edi
        cmp     eax, [.room]      ; check for enough room
        jge     .sizeok

        mov     ecx, [ebx+TMemoryStream.size]
        call    [ResizeIt]


        mov     eax, [ebx+TMemoryStream.offset]
        add     eax, [.room]
        add     eax, 1024       ; 1k more...
        cmp     eax, ecx
        jbe     @f
        mov     ecx, eax
@@:
        stdcall ResizeMem, ebx, ecx
        mov     ebx, eax
        mov     [esi], eax  ; new pointer
        jc      .exit

        mov     [ebx+TMemoryStream.size], ecx   ; new size.

Added freshlib/data/minimag.asm.

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
module "MiniMag translator"


struct TMDItem
  .type   dd ?
  .indent dd ?
ends


;--------------------------------------------------------------
; Converts MiniMag code into HTML. Starts from the position [.from]
; and ends at the end of the text or at first NULL character.
;
; Arguments:
;    .pMiniMag - pointer to the TText structure with the BBCode
;               formatted text.
;    .from    - the position where to start.
;
; Returns:
;    edx - The same structure (possibly reallocated) with
;    the translated to html code text.
;

mmfDontFormat = $80000000
mmfNoInline   = $40000000
mmfNoHTML     = $20000000

proc TranslateMiniMag, .pText, .from, .procSanitizeURL
.pStack dd ?

.whspc  dd ?    ; whitespace symbols count;
.flags  dd ?
.hdr    dd ?    ; header level

.pLinks dd ?

.lbl_hash dd ?
.tmp_link dd ?

.emoj = emoJ    ; use this label.

begin
        pushad

        xor     eax, eax
        mov     [.flags], eax

        stdcall GetMem, 256*4
        mov     [.pLinks], eax

        stdcall CreateArray, sizeof.TMDItem
        mov     [.pStack], eax

        mov     edx, [.pText]
        stdcall TextMoveGap, edx, [.from]

        mov     ecx, [.from]
        add     ecx, [edx+TText.GapEnd]
        sub     ecx, [edx+TText.GapBegin]
        dec     ecx

.fp_new_line:
        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .second_pass

        mov     al, [edx+ecx]
        test    al, al
        jz      .second_pass

        cmp     al, '['
        je      .link_def_found
        jmp     .fp_check_eol

.fp_skip_eol:
        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .second_pass

        mov     al, [edx+ecx]
        test    al, al
        jz      .second_pass

.fp_check_eol:
        cmp     al, $0d
        je      .fp_new_line

        cmp     al, $0a
        je      .fp_new_line

; encode HTML.

        test    al, al
        js      .fp_skip_eol

        and     eax, $ff
        movzx   eax, byte [tbl_html+eax]

        test    al, al
        jns     .fp_skip_eol

.do_encode:
        lea     esi, [eax+tbl_html]
        lodsb

        stdcall TextSetGapSize, edx, eax

        xchg    eax, ecx
        sub     eax, [edx+TText.GapEnd]
        add     eax, [edx+TText.GapBegin]
        stdcall TextMoveGap, edx, eax
        inc     [edx+TText.GapEnd]      ; delete the replaced char.

        mov     edi, [edx+TText.GapBegin]
        add     edi, edx
        add     [edx+TText.GapBegin], ecx
        rep movsb

        mov     ecx, [edx+TText.GapEnd]
        dec     ecx
        jmp     .fp_skip_eol


.link_def_found:
        mov     eax, ecx
        sub     eax, [edx+TText.GapEnd]
        add     eax, [edx+TText.GapBegin]

        stdcall TextMoveGap, edx, eax   ; move the gap to the beginning of the link.

        lea     edi, [ecx+1]  ; the start of the label.
        xor     esi, esi
        xor     eax, eax

.hash_loop:
        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .end_of_lbl ;.second_pass

        mov     al, [edx+ecx]
        test    al, al
        jz      .end_of_lbl ;.second_pass

        cmp     al, ']'
        je      .end_of_lbl

        test    al, al
        js      .add_hash

        mov     al, [tbl_html+eax]
        test    al, al
        jz      .fp_skip_eol    ;????????????
        jns     .add_hash

        push    ecx edx

        mov     edx, esi
        mov     esi, eax
        add     esi, tbl_html

        lodsb
        mov     ecx, eax

.html_hash:
        lodsb
        xor     edx, eax
        mov     dl, [tpl_func + edx]
        loop    .html_hash

        mov     esi, edx
        pop     edx ecx
        jmp     .hash_loop

.add_hash:
        xor     esi, eax
        movzx   esi, byte [tpl_func + esi]
        jmp     .hash_loop

.end_of_lbl:
        mov     [.lbl_hash], esi

        mov     esi, ecx

        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .second_pass

        mov     al, [edx+ecx]
        cmp     al, ' '
        jne     .fp_invalid_link

; valid label has been found...
; first: extract the label.

        sub     esi, edi
        jz      .fp_invalid_link

        cmp     esi, $ff
        ja      .fp_invalid_link

        lea     edi, [edx+edi]

        stdcall StrNew
        stdcall StrCharCat, eax, esi
        stdcall StrCatMemHTML, eax, edi, esi
        mov     [.tmp_link], eax

; fix the label length.
        stdcall StrPtr, eax
        mov     esi, eax
        mov     eax, [esi+string.len]
        dec     eax
        cmp     eax, $ff
        ja      .free_link
        mov     byte [esi], al

.link_url_start:
        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .free_link

        mov     al, [edx+ecx]
        test    al, al
        jz      .free_link

        cmp     al, $0d
        je      .free_link
        cmp     al, $0a
        je      .free_link

        cmp     al, ' '
        jbe     .link_url_start

        mov     edi, ecx
        mov     esi, ecx

.loop_to_end_of_link:
        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .free_link

        mov     al, [edx+ecx]
        test    al, al
        jz      .end_found

        cmp     al, $0d
        je      .end_of_link
        cmp     al, $0a
        je      .end_of_link

        cmp     al, ' '
        jbe     .loop_to_end_of_link

        lea     esi, [ecx+1]
        jmp     .loop_to_end_of_link


.end_of_link:
        xor     al, $0d xor $0a

        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .end_found

        cmp     al, [edx+ecx]
        jne     .end_found

        inc     ecx

.end_found:
        sub     esi, edi
        jz      .free_link

        lea     edi, [edx+edi]
        stdcall StrCatMemHTML, [.tmp_link], edi, esi

; for debugging links handing;
;        stdcall FileWriteString, [STDERR], [.tmp_link]
;        stdcall FileWriteString, [STDERR], <txt 13, 10>

        mov     eax, [.lbl_hash]
        mov     edi, [.pLinks]
        mov     esi, [.tmp_link]

.hash_search_slot:                      ; resolve possible hash collisions.
        xchg    esi, [edi+4*eax]
        test    esi, esi
        jz      .end_link

        inc     al
        cmp     eax, [.lbl_hash]
        jne     .hash_search_slot

        stdcall StrDel, esi     ; the hash table is full, so simply delete the remaining link.

.end_link:
        mov     [edx+TText.GapEnd], ecx         ; delete the entire line of the link definition.
        dec     ecx
        jmp     .fp_new_line

.free_link:
        stdcall StrDel, [.tmp_link]

.fp_invalid_link:
        mov     ecx, [edx+TText.GapEnd]
        jmp     .fp_skip_eol


; Second processing pass. It will format all the tags.

.second_pass:

        mov     ebx, [.from]
;        int3

.start_of_line:

        xor     eax, eax
        mov     [.hdr], eax
        mov     byte [.flags], al
        and     [.flags], not mmfNoInline

        stdcall TextMoveGap, edx, ebx

        xor     eax, eax
        mov     [.whspc], eax

.loop:
        mov     ecx, ebx
        add     ecx, [edx+TText.GapEnd]
        sub     ecx, [edx+TText.GapBegin]
        cmp     ecx, [edx+TText.Length]
        jae     .empty_line_found

        mov     al, [edx+ecx]

        test    al, al
        jz      .empty_line_found

        cmp     al, ';'
        je      .command_found

        test    [.flags], mmfDontFormat
        jnz     .non_empty_line_found

        cmp     al, '#'
        je      .header_found

        cmp     al, '*'
        je      .list_item_found

        cmp     al, $0d
        je      .empty_line_found
        cmp     al, $0a
        je      .empty_line_found

        cmp     al, ' '
        ja      .non_empty_line_found

        inc     [.whspc]
        inc     [edx+TText.GapEnd]
        jmp     .loop


.command_found:

        cmp     [.whspc], 0
        jne     .non_empty_line_found

        test    [.flags], mmfDontFormat
        jnz     .check_for_end

        lea     eax, [ecx+8]             ; spoiler
        cmp     eax, [edx+TText.Length]
        jae     .less_than_8

        cmp     dword [edx+ecx], ';spo'
        jne     .not_spoiler
        cmp     dword [edx+ecx+4], 'iler'
        jne     .not_spoiler
        cmp     byte [edx+ecx+8], ' '
        ja      .not_spoiler

        call    .close_all_non_minimag

        push    ecx
        mov     eax, tagSpoiler
        call    .add_to_stack
        pop     ecx

        mov     eax, tagSpoiler
        call    .prefix_tag

        add     ecx, 8
        add     [edx+TText.GapEnd], 8

        push    ebx
        call    .skip_tag_arg
        pop     eax
        cmp     eax, ebx
        jne     .sum_ok

        mov     ecx, [edx+TText.GapBegin]
        mov     dword [edx+ecx], 'Spoi'
        mov     dword [edx+ecx+4], 'ler '
        add     [edx+TText.GapBegin], 7
        add     ebx, 7

.sum_ok:
        mov     eax, tagSpoiler
        call    .suffix_tag

        jmp     .start_of_line


.not_spoiler:
.less_than_8:
        lea     eax, [ecx+6]
        cmp     eax, [edx+TText.Length]
        jae     .less_than_6

        cmp     dword [edx+ecx], ';quo'
        jne     .not_quote
        cmp     word [edx+ecx+4], 'te'
        jne     .not_quote
        cmp     byte [edx+ecx+6], ' '
        ja      .not_quote

; quote command here

        call    .close_all_non_minimag

        push    ecx
        mov     eax, tagQuote
        call    .add_to_stack
        pop     ecx

        mov     eax, tagQuote
        call    .prefix_tag

        add     ecx, 6
        add     [edx+TText.GapEnd], 6

        call    .skip_tag_arg_quote

        mov     eax, tagQuote
        call    .suffix_tag

        jmp     .start_of_line


.not_quote:

        cmp     dword [edx+ecx], ';tab'
        jne     .not_table
        cmp     word [edx+ecx+4], 'le'
        jne     .not_table
        cmp     byte [edx+ecx+6], ' '
        ja      .not_table

; table command here

        call    .close_all_non_minimag

        mov     eax, tagTable
        call    .open_tag

        jmp     .delete_to_eol


.not_table:
        cmp     dword [edx+ecx], ';beg'
        jne     .not_begin
        cmp     word [edx+ecx+4], 'in'
        jne     .not_begin
        cmp     byte [edx+ecx+6], ' '
        ja      .not_begin

        or      [.flags], mmfDontFormat

        call    .close_all_non_minimag

        push    ecx
        mov     eax, tagCode
        call    .add_to_stack
        pop     ecx

        mov     eax, tagCode
        call    .prefix_tag

        add     ecx, 6
        add     [edx+TText.GapEnd], 6

        call    .skip_tag_arg

        mov     eax, tagCode
        call    .suffix_tag

        jmp     .start_of_line


.not_begin:

        cmp     dword [edx+ecx], ';uli'
        jne     .not_ulist
        cmp     word [edx+ecx+4], 'st'
        jne     .not_ulist
        cmp     byte [edx+ecx+6], ' '
        ja      .not_ulist

        call    .close_all_non_minimag

        mov     eax, tagUL
        call    .open_tag

        jmp     .delete_to_eol


.not_ulist:
        cmp     dword [edx+ecx], ';oli'
        jne     .not_olist
        cmp     word [edx+ecx+4], 'st'
        jne     .not_olist
        cmp     byte [edx+ecx+6], ' '
        ja      .not_olist

        call    .close_all_non_minimag

        mov     eax, tagOL
        call    .open_tag

        jmp     .delete_to_eol


.not_olist:

.less_than_6:
.less_than_5:

.check_for_end:

        lea     eax, [ecx+4]
        cmp     eax, [edx+TText.Length]
        jae     .less_than_4

        cmp     dword [edx+ecx], ';end'
        jne     .not_end

        cmp     byte [edx+ecx+4], ' '
        ja      .not_end

; end command here

        call    .close_all_non_minimag
        call    .pop_one_tag

        and     [.flags], not mmfDontFormat

        jmp     .delete_to_eol


.not_end:
        test    [.flags], mmfDontFormat
        jnz     .non_empty_line_found

        cmp     dword [edx+ecx], ';---'
        jne     .not_ruler

; it is a horizontal ruller command. It can separate paragraphs by <hr> tag, or the table rows by <tr> tags.

        push    ecx
        mov     esi, [.pStack]


.row_close:
        mov     ecx, [esi+TArray.count]
        dec     ecx
        js      .put_hr ; empty stack!

        mov     eax, [esi+TArray.array + sizeof.TMDItem * ecx + TMDItem.type]

        cmp     eax, tagTD
        je      .close_this
        cmp     eax, tagTH
        je      .close_this
        cmp     eax, tagTR
        je      .close_this

        cmp     eax, tagTable
        je      .open_tr

.put_hr:
        mov     eax, tagHR
        call    .prefix_tag
        jmp     .end_hr

.close_this:
        mov     [esi+TArray.count], ecx
        call    .close_tag
        jmp     .row_close

.open_tr:
        mov     eax, tagTR
        call    .open_tag

.end_hr:
        pop     ecx
        jmp     .delete_to_eol


.less_than_4:
.not_ruler:

; it is simply a comment. Delete it up to the end of the line.

.delete_to_eol:
        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .eol_ok

        mov     al, [edx+ecx]
        test    al, al
        jz      .eol_ok
        cmp     al, $0d
        je      .eol_found2

        cmp     al, $0a
        jne     .delete_to_eol

.eol_found2:
        inc     ecx
        xor     al, $0d xor $0a
        cmp     al, [edx+ecx]
        jne     .eol_ok
        inc     ecx
.eol_ok:
        mov     [edx+TText.GapEnd], ecx
        jmp     .start_of_line


.list_item_found:

        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .non_empty_line_found

        cmp     byte [edx+ecx], ' '
        ja      .non_empty_line_found

        add     [edx+TText.GapEnd], 2

; here list item begins:

        mov     esi, [.pStack]
        mov     ecx, [esi+TArray.count]
        dec     ecx
        js      .add_leaf

        mov     eax, [esi + TArray.array + sizeof.TMDItem * ecx + TMDItem.type]
        cmp     eax, tagUL
        je      .open_li
        cmp     eax, tagOL
        jne     .add_leaf

.open_li:
        mov     eax, tagListItem
        call    .open_tag
        jmp     .add_leaf


.headers dd tagH1, tagH2, tagH3, tagH4, tagH5, tagH6

.header_found:
        xor     eax, eax

.hcnt:
        inc     eax
        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .non_empty_line_found           ; not a header?

        cmp     byte [edx+ecx], '#'
        je      .hcnt

        cmp     eax, 6
        ja      .non_empty_line_found

        cmp     byte [edx+ecx], ' '
        jne     .non_empty_line_found           ; not a header?

        stc
        adc     [edx+TText.GapEnd], eax

        mov     [.hdr], eax


.non_empty_line_found:
        mov     esi, [.pStack]
        mov     ecx, [esi+TArray.count]
        dec     ecx
        js      .add_leaf

        mov     eax, [esi + TArray.array + sizeof.TMDItem * ecx + TMDItem.type] ; don't add paragraphs inside elements that can handle text by themselves.
        test    [eax+TOneTag.flags], fLines
        jnz     .skip_to_eol

        cmp     eax, tagCode
        je      .skip_to_eol

        cmp     eax, tagTable
        jne     .check_for_row

        mov     eax, tagTR
        call    .open_tag
        jmp     .open_td_th

.check_for_row:
        cmp     eax, tagTR
        jne     .add_leaf

.open_td_th:
        mov     eax, tagTD
        cmp     [.hdr], 0
        je      .open_td
        mov     eax, tagTH
        and     [.hdr], 0
.open_td:
        call    .open_tag

.add_leaf:
        mov     eax, tagPara

        mov     ecx, [.hdr]
        dec     ecx
        js      .do_add_leaf
        mov     eax, [.headers + 4*ecx]

.do_add_leaf:
        call    .open_tag
        jmp     .skip_to_eol


.empty_line_found:

        mov     esi, [.pStack]
        mov     ecx, [esi+TArray.count]

.loop_empty_line:
        dec     ecx
        js      .skip_to_eol   ; the empty line is not inside code block because there is no blocks at all.

        mov     eax, [esi + TArray.array + sizeof.TMDItem*ecx + TMDItem.type]
        test    [eax+TOneTag.flags], fLines or fInlineTag
        jz      .check_wrap

        cmp     eax, tagInlineCode
        jne     .inline_code_ok
        and     [.flags], not mmfDontFormat
.inline_code_ok:

        mov     [esi+TArray.count], ecx ; close text leaf blocks.
        call    .close_tag
        jmp     .loop_empty_line

        dec     ecx
        js      .skip_to_eol   ; the empty line is not inside code block because there is no blocks at all.

.check_wrap:
        cmp     eax, tagTD
        je      .close_wrap
        cmp     eax, tagTH
        je      .close_wrap
        cmp     eax, tagListItem
        jne     .skip_to_eol

.close_wrap:
        mov     [esi+TArray.count], ecx
        call    .close_tag
        jmp     .skip_to_eol

; Here seems to be a good place for processing the inline formatting elements, together with the HTML encoding.

.skip_to_eol:

        xor     eax, eax
        mov     ecx, ebx
        add     ecx, [edx+TText.GapEnd]
        sub     ecx, [edx+TText.GapBegin]
        cmp     ecx, [edx+TText.Length]
        jae     .end_of_text

        mov     al, [edx+ecx]
        test    al, al
        jz      .end_of_text
        cmp     al, $0d
        je      .eol_found
        cmp     al, $0a
        je      .eol_found

        test    [.flags], mmfDontFormat
        jnz     .next

        cmp     al, '>'
        je      .end_int_html

        test    [.flags], mmfNoHTML
        jnz     .next

        cmp     al, '<'
        je      .internal_html

        cmp     al, '`'
        je      .code

        test    [.flags], mmfNoInline
        jnz     .next

        cmp     al, '*'
        je      .bold
        cmp     al, '/'
        je      .italic
        cmp     al, '_'
        je      .underline
        cmp     al, '-'
        je      .del

        cmp     al, $f0         ; emoji?
        jb      .inline_ok

        stdcall TextMoveGap, edx, ebx

        mov     ecx, [edx+TText.GapEnd]
        mov     esi, ecx        ; the start of thet emoji

.loop_emoji:
        stdcall IsEmoji, [edx+ecx]
        jnc     .end_emoji

        add     ecx, eax
        cmp     ecx, [edx+TText.Length]
        jb      .loop_emoji

.end_emoji:
        sub     ecx, esi
        jz      .next           ; no emoji here...

        add     ebx, ecx

        mov     eax, [emoJ.lOpenP]
        add     eax, [emoJ.lClose]
        stdcall TextSetGapSize, edx, eax

        mov     edi, [edx+TText.GapBegin]
        add     edi, edx

        mov     esi, [emoJ.pOpenP]
        mov     ecx, [emoJ.lOpenP]
        add     ebx, ecx
        add     [edx+TText.GapBegin], ecx

        rep movsb

        stdcall TextMoveGap, edx, ebx

        mov     edi, [edx+TText.GapBegin]
        add     edi, edx

        mov     esi, [emoJ.pClose]
        mov     ecx, [emoJ.lClose]
        add     ebx, ecx
        add     [edx+TText.GapBegin], ecx

        rep movsb

        jmp     .skip_to_eol


.inline_ok:
        cmp     al, '['
        je      .link

        mov     byte [.flags], al       ; the previous character.

.next:
        inc     ebx
        jmp     .skip_to_eol

.internal_html:
        or      [.flags], mmfNoHTML
        jmp     .next

.end_int_html:
        and     [.flags], not mmfNoHTML
        jmp     .next


.eol_found:
        mov     ah, al
        xor     ah, $0d xor $0a

        inc     ecx
        inc     ebx
        cmp     [edx+ecx], ah
        jne     .start_of_line
        inc     ebx
        jmp     .start_of_line


.link:
locals
  .linkT dd ?
  .imgW  dd ?
  .imgH  dd ?
  .linkStart dd ?
  .lblStart dd ?
  .lblLen   dd ?
  .urlLen   dd ?
  .level    dd ?
endl
        mov     ebx, ecx
        sub     ebx, [edx+TText.GapEnd]
        add     ebx, [edx+TText.GapBegin]
        stdcall TextMoveGap, edx, ebx

        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .next

        xor     eax, eax
        mov     [.linkT], eax

        mov     al, [edx+ecx]
        test    al, al
        jz      .next

        cmp     al, '!'
        je      .block_image

        cmp     al, '?'
        je      .inline_image

        cmp     al, '$'
        je      .video

        cmp     al, '#'
        je      .anchor

        mov     [.linkT], tagURL
        jmp     .image_ok

.anchor:
        mov     [.linkT], tagAnchor
        jmp     .image_ok

.video:
        mov     [.linkT], tagVideoMM
        jmp     .image

.block_image:
        mov     [.linkT], tagImgMM
        jmp     .image

.inline_image:

        mov     [.linkT], tagInlineImgMM

.image:
        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .next

        mov     al, [edx+ecx]
        test    al, al
        jz      .next

        cmp     al, '0'
        jb      .image_ok
        cmp     al, '9'
        ja      .image_ok

; For now...
.ignore_size:
        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .next

        mov     al, [edx+ecx]
        test    al, al
        jz      .next

        cmp     al, ':'
        jne     .ignore_size

        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .next

        mov     al, [edx+ecx]
        test    al, al
        jz      .next

.image_ok:
; here eax contains the current byte of the address label.
; The first value of the hash is computed outside the hash loop.

        mov     edi, ecx  ; the start of the label.
        movzx   esi, byte [tpl_func + eax]    ; the initial value of the hash.

.hash_loop2:
        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .next

        mov     al, [edx+ecx]
        test    al, al
        jz      .next

        cmp     al, ']'
        je      .end_of_link_lbl

        xor     esi, eax
        movzx   esi, byte [tpl_func + esi]
        jmp     .hash_loop2

.end_of_link_lbl:
        mov     [.lbl_hash], esi

        mov     eax, ecx
        sub     eax, edi

        mov     [.lblStart], edi
        mov     [.lblLen], eax

; search the label in the hash table.

        push    ebx ecx

        mov     ebx, [.lbl_hash]

.lbl_search:
        mov     edi, [.pLinks]
        mov     eax, [edi+4*ebx]
        test    eax, eax
        jz      .hash_not_found

        stdcall StrPtr, eax
        mov     esi, eax
        mov     edi, edx
        add     edi, [.lblStart]
        mov     ecx, [.lblLen]

        mov     eax, [esi+string.len]
        mov     [.urlLen], eax

        movzx   eax, byte [esi] ; the first byte is the length of the label part.
        inc     esi

        sub     [.urlLen], eax
        dec     [.urlLen]

        cmp     ecx, eax
        jne     .not_this_hash

        repe cmpsb
        je      .insert_link

.not_this_hash:
        inc     bl
        cmp     ebx, [.lbl_hash]
        jne     .lbl_search

.hash_not_found:
; the link is not in the hash table, so it is a inline link.

        mov     esi, [.lblStart]
        add     esi, edx

        mov     eax, [.lblLen]
        mov     [.urlLen], eax

; here esi point to the URL. [.urlLen] contains the length of the url.

.insert_link:
; the label matches! Insert the tag prefix.

        pop     ecx ebx

        mov     eax, [.lblStart]
        mov     [edx+TText.GapEnd], eax ; delete the start "["

        mov     eax, [.linkT]
        call    .prefix_tag

; copy the URL here

        stdcall [.procSanitizeURL], esi, [.urlLen]
        push    eax

        stdcall StrPtr, eax
        mov     esi, eax
        mov     ecx, [eax+string.len]

        stdcall TextSetGapSize, edx, ecx

        mov     edi, [edx+TText.GapBegin]
        add     edi, edx

        add     ebx, ecx
        add     [edx+TText.GapBegin], ecx

        rep movsb

        stdcall StrDel ; from the stack

        mov     eax, [.linkT]
        call    .suffix_tag

; Here check for additional link content/alt content.

        mov     ecx, [edx+TText.GapEnd]
        add     ecx, [.lblLen]

        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .skip_link_content

        mov     al, [edx+ecx]
        cmp     al, '['
        jne     .skip_link_content

        lea     eax, [ecx+1]
        mov     [.lblStart], eax

        and     [.level], 0

.search_second_end:
        inc     ecx                             ; How about [] empty label?
        cmp     ecx, [edx+TText.Length]
        jae     .skip_link_content

        mov     al, [edx+ecx]
        test    al, al
        jz      .skip_link_content

        cmp     al, $0d
        je      .skip_link_content
        cmp     al, $0a
        je      .skip_link_content

        cmp     al, '['         ; nested link
        jne     .nested_ok
        inc     [.level]

.nested_ok:
        cmp     al, ']'
        jne     .search_second_end

        cmp     [.level], 0
        je      .second_end

        dec     [.level]
        jmp     .search_second_end


.second_end:
        sub     ecx, [.lblStart]
        mov     [.lblLen], ecx

        mov     ecx, [.lblStart]
        mov     [edx+TText.GapEnd], ecx ; delete the link URL/label part, because there is second one.

        push    ebx                     ; save ebx, because the link text should be processed again for nested structures.

        add     ebx, [.lblLen]
        stdcall TextMoveGap, edx, ebx
        inc     [edx+TText.GapEnd]

        mov     eax, [.linkT]
        call    .close_tag

        pop     ebx
        stdcall TextMoveGap, edx, ebx

        mov     eax, [.linkT]
        test    [eax+TOneTag.flags], fDisableTags
        jz      .skip_to_eol

        or      [.flags], mmfNoHTML
        jmp     .skip_to_eol


.skip_link_content:
        cmp     [.linkT], tagAnchor
        jne     @f
        inc     [edx+TText.GapEnd]
        dec     [.lblLen]
@@:


        add     ebx, [.lblLen]
        stdcall TextMoveGap, edx, ebx
        inc     [edx+TText.GapEnd]

        mov     eax, [.linkT]
        call    .close_tag

        and     [.flags], not mmfNoInline
        jmp     .skip_to_eol



.bold:
        mov     eax, tagStrong
        jmp     .inline_tag

.italic:
        mov     eax, tagEm
        jmp     .inline_tag

.underline:
        mov     eax, tagUnderlined
        jmp     .inline_tag

.del:
        mov     eax, tagDel
        jmp     .inline_tag

.code:
        mov     eax, tagInlineCode

.inline_tag:

        stdcall TextMoveGap, edx, ebx

        mov     esi, [.pStack]
        mov     ecx, [esi+TArray.count]
        dec     ecx
        js      .open_inline

        cmp     eax, [esi+TArray.array + sizeof.TMDItem*ecx + TMDItem.type]
        jne     .open_inline

        mov     [esi+TArray.count], ecx
        cmp     eax, tagInlineCode
        jne     @f
        and     [.flags], not mmfNoInline
@@:
        call    .close_tag
        jmp     .end_inline

.open_inline:
        cmp     byte [.flags], ' '      ; the previous character.
        ja      .next

        mov     ecx, ebx
        add     ecx, [edx+TText.GapEnd]
        sub     ecx, [edx+TText.GapBegin]
        cmp     byte [edx+ecx+1], ' '
        jbe     .next

        cmp     eax, tagInlineCode
        jne     @f
        or      [.flags], mmfNoInline
@@:
        call    .open_tag

.end_inline:
        inc     [edx+TText.GapEnd]
        jmp     .skip_to_eol


.end_of_text:

; Close all not closed tags:

        stdcall TextMoveGap, edx, ebx
        mov     edi, [.pStack]
        mov     ecx, [edi+TArray.count]

.close_all:
        dec     ecx
        js      .finalize

        mov     eax, [edi + TArray.array + sizeof.TMDItem*ecx + TMDItem.type]
        call    .close_tag
        jmp     .close_all

.finalize:
        mov     esi, [.pLinks]
        mov     ecx, $ff

.freelinks:
        stdcall StrDel, [esi+4*ecx]
        dec     ecx
        jns     .freelinks

        stdcall FreeMem, esi
        stdcall FreeMem, [.pStack]

        mov     [esp + 4*regEDX], edx
        popad
        return



.close_all_non_minimag:
        push    ecx esi

        mov     esi, [.pStack]
        mov     ecx, [esi+TArray.count]

.close_loop:
        dec     ecx
        js      .end_close

        mov     eax, [esi+TArray.array + sizeof.TMDItem*ecx + TMDItem.type]
        test    [eax+TOneTag.flags], fMinimagBlock
        jnz     .end_close

        mov     [esi+TArray.count], ecx
        call    .close_tag
        jmp     .close_loop

.end_close:
        pop     esi ecx
        retn


.pop_one_tag:
        push    ecx esi

        mov     esi, [.pStack]
        mov     ecx, [esi+TArray.count]
        dec     ecx
        js      .end_pop_one

        mov     [esi+TArray.count], ecx
        mov     eax, [esi+TArray.array + sizeof.TMDItem*ecx + TMDItem.type]
        call    .close_tag

.end_pop_one:
        pop     esi ecx
        retn


.open_tag:
        push    ecx esi edi
        push    eax eax
        call    .add_to_stack
        pop     eax
        call    .prefix_tag
        pop     eax
        call    .suffix_tag
        pop     edi esi ecx
        retn


.suffix_tag:
        lea     eax, [eax+TOneTag.pOpenS]
        jmp     .copy_tag

.close_tag:
        lea     eax, [eax+TOneTag.pClose]

.prefix_tag:
.copy_tag:
        push    ecx esi edi

        mov     esi, [eax]
        mov     ecx, [eax+4]
        test    esi, esi
        jz      .tag_copy_end

        add     ebx, ecx

        stdcall TextSetGapSize, edx, ecx
        mov     edi, [edx+TText.GapBegin]
        add     edi, edx
        add     [edx+TText.GapBegin], ecx

        rep movsb

.tag_copy_end:
        pop     edi esi ecx
        retn


.add_to_stack:
        push    edx eax
        stdcall AddArrayItems, [.pStack], 1
        mov     [.pStack], edx
        pop     [eax + TMDItem.type]
        pop     edx
        retn


.skip_tag_arg:
        push    eax ecx esi

.skip_tag_loop:
        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .end_arg

        mov     al, [edx+ecx]
        test    al, al
        jz      .end_arg

        cmp     al, $0a
        je      .eol1
        cmp     al, $0d
        je      .eol1

        cmp     al, ' '
        jbe     .skip_tag_loop

        mov     [edx+TText.GapEnd], ecx

        mov     esi, ebx
        dec     ecx

.search_eol:
        inc     ecx
        inc     esi
        cmp     ecx, [edx+TText.Length]
        jae     .end_arg

        movzx   eax, byte [edx+ecx]
        test    al, al
        jz      .end_arg

        cmp     al, $0a
        je      .eol1

        cmp     al, $0d
        je      .eol1

        cmp     al, ' '
        cmova   ebx, esi
        jmp     .search_eol

.eol1:
        inc     ecx
        xor     al, $0d xor $0a
        cmp     al, [edx+ecx]
        jne     .end_arg
        inc     ecx

.end_arg:
        stdcall TextMoveGap, edx, ebx
        mov     [edx+TText.GapEnd], ecx

        pop     esi ecx eax
        retn



.skip_tag_arg_quote:

        stdcall TextSetGapSize, edx, 16
        mov     edi, [edx+TText.GapBegin]
        mov     esi, [edx+TText.GapEnd]
        mov     ebx, edi

        mov     ecx, '<u >'
        dec     esi

.skip_tag_loop2:
        inc     esi
        cmp     esi, [edx+TText.Length]
        jae     .end_arg2

        mov     al, [edx+esi]
        test    al, al
        jz      .end_arg2

        cmp     al, $0a
        je      .eol2
        cmp     al, $0d
        je      .eol2

        cmp     al, ' '
        jbe     .skip_tag_loop2

        mov     [edx+TText.GapEnd], esi         ; delete the spaces on the begining of the arguments.

        mov     ah, al
        dec     esi

.search_eol2:
        inc     esi
        cmp     esi, [edx+TText.Length]
        jae     .end_arg2

        mov     ah, al
        mov     al, [edx+esi]
        test    al, al
        jz      .end_arg2

        cmp     al, $0a
        je      .eol2
        cmp     al, $0d
        je      .eol2

        xor     ah, al
        jns     .store

        mov     [edx+TText.GapBegin], ebx
        mov     [edx+TText.GapEnd], esi
        stdcall TextSetGapSize, edx, 4
        mov     esi, [edx+TText.GapEnd]
        mov     [edx+edi], ecx
        add     edi, 4
        mov     ebx, edi
        xor     ecx, '<u >' xor '</u>'

.store:
        mov     [edx+edi], al
        inc     [edx+TText.GapEnd]
        inc     edi

        cmp     al, ' '
        cmova   ebx, edi                ; the last non-space character.
        jmp     .search_eol2

.eol2:
        inc     esi
        xor     al, $0d xor $0a
        cmp     al, [edx+esi]
        jne     .end_arg2
        inc     esi

.end_arg2:
        cmp     ecx, '</u>'
        jne     .fin_arg2

        mov     [edx+TText.GapBegin], ebx
        mov     [edx+TText.GapEnd], esi
        stdcall TextSetGapSize, edx, 4
        mov     esi, [edx+TText.GapEnd]
        mov     [edx+edi], ecx
        add     edi, 4
        mov     ebx, edi

.fin_arg2:
        mov     [edx+TText.GapBegin], ebx       ; delete the final whitespace chars.
        mov     [edx+TText.GapEnd], esi         ; delete up to the end of the line.

        retn

endp



; Debug procedure. Not used in production.

proc DumpStack, .pStack
begin
        pushad

        mov     esi, [.pStack]
        xor     ecx, ecx

.loop:
        cmp     ecx, [esi+TArray.count]
        jae     .finish

        mov     edi, [esi+TArray.array + sizeof.TMDItem*ecx + TMDItem.type]

        stdcall FileWrite, [STDERR], [edi+TOneTag.pOpenP], [edi+TOneTag.lOpenP]
        stdcall FileWrite, [STDERR], [edi+TOneTag.pOpenS], [edi+TOneTag.lOpenS]

        stdcall FileWriteString, [STDERR], txt ": "

        stdcall NumToStr, [esi+TArray.array + sizeof.TMDItem*ecx + TMDItem.indent], ntsDec
        push    eax
        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel ; from the stack

        stdcall FileWriteString, [STDERR], <txt 13, 10>

        inc     ecx
        jmp     .loop

.finish:
        popad
        return

endp



proc StrCatMemHTML, .dest, .psource, .length
begin
        pushad

        mov     esi, [.psource]
        mov     ecx, [.length]

        stdcall StrLen, [.dest]
        lea     edx, [eax+8*ecx+4]

        stdcall StrSetCapacity, [.dest], edx
        mov     edi, eax
        mov     ebx, eax
        add     edi, [edi+string.len]

        xor     eax, eax

.loop:
        dec     ecx
        js      .finish

        lodsb
        test    al, al
        js      .store

        mov     al, [tbl_html+eax]
        test    al, al
        jz      .loop
        js      .encode

.store:
        stosb
        jmp     .loop

.encode:
        push    esi ecx

        lea     esi, [eax+tbl_html]
        movzx   ecx, byte [esi]
        inc     esi

        rep movsb
        pop     ecx esi
        jmp     .loop

.finish:
        mov     ecx, edi
        xor     eax, eax
        sub     ecx, ebx
        stosd
        mov     [ebx+string.len], ecx

        popad
        return
endp





proc IsEmoji, .chars
begin
        push    edx

        stdcall DecodeUtf8, [.chars]
        xchg    eax, edx
        jc      .no

        cmp     edx, $200d
        je      .yes

        cmp     edx, $1f300
        jb      .no

        cmp     edx, $1fae0
        ja      .no

.yes:
        stc
        pop     edx
        return

.no:
        clc
        pop     edx
        return
endp




































; Not finished, not working!!!

proc TranslateMarkdown, .pText, .from
.pStack dd ?

.qlvl   dd ?    ; quote level.
.whspc  dd ?    ; whitespace symbols count;
.flags  dd ?
.hdr    dd ?    ; header level

.q_from dd ?

.prev   dd ?

begin
        pushad

        stdcall CreateArray, sizeof.TMDItem
        mov     [.pStack], eax

        mov     edx, [.pText]
        mov     ebx, [.from]

.start_of_line:

        xor     eax, eax
        mov     [.qlvl], eax
        mov     [.flags], eax
        mov     [.hdr], eax

        dec     eax
        mov     [.q_from], eax          ; start from -1 on every line.

        stdcall TextMoveGap, edx, ebx

.zerospc:
        xor     eax, eax
        mov     [.whspc], eax

.loop:
        mov     ecx, ebx
        add     ecx, [edx+TText.GapEnd]
        sub     ecx, [edx+TText.GapBegin]

        mov     al, [edx+ecx]

        test    al, al
        jz      .empty_line_found

        cmp     al, '>'
        je      .quote_found

        cmp     al, '-'
        je      .ul_found
        cmp     al, '*'
        je      .ul_found
        cmp     al, '+'
        je      .ul_found

        cmp     al, '#'
        je      .header_found

        cmp     al, $0d
        je      .empty_line_found
        cmp     al, $0a
        je      .empty_line_found

        cmp     al, ' '
        ja      .non_empty_line_found

        inc     [.whspc]
        inc     [edx+TText.GapEnd]
        jmp     .loop


; closes all tags up to position ecx (excluding the tag on ecx)
.close_to_ecx:
        push    eax

.ecx_loop:
        mov     eax, [esi+TArray.count]
        dec     eax
        cmp     eax, ecx
        je      .end_close_ecx

        mov     [esi+TArray.count], eax
        mov     eax, [esi+TArray.array + sizeof.TMDItem*eax + TMDItem.type]
        call    .close_tag
        jmp     .ecx_loop

.end_close_ecx:
        pop     eax
        retn


; closes all tags up to position ecx (includig the tag on ecx)
.close_to_ecx_inc:
        push    eax

.ecx_loop2:
        mov     eax, [esi+TArray.count]
        dec     eax
        cmp     eax, ecx
        jl      .end_close_ecx

        mov     [esi+TArray.count], eax
        mov     eax, [esi+TArray.array + sizeof.TMDItem*eax + TMDItem.type]
        call    .close_tag
        jmp     .ecx_loop2


; Searches the tags stack for listitem and returns it's index in the stack.
; Arguments:
;   esi - pointer to the stack array.
; Returns:
;   esi - pointer to the tag stack.
;   If the list item has been found: CF = 0; ecx = index in the array;
;   If the list item has not been found: CF = 1
; Modifies eax

.search_for_li:

        mov     esi, [.pStack]
        mov     ecx, [esi+TArray.count]

.search_li:
        dec     ecx
        cmp     ecx, [.q_from]
        jle     .li_not_found

        mov     eax, [esi+TArray.array + sizeof.TMDItem*ecx + TMDItem.type]

        cmp     eax, tagListItem
        je      .li_found

        cmp     eax, tagQuote
        jne     .search_li

.li_not_found:
        stc
        retn

.li_found:
        clc
        retn


.search_for_bq:

        mov     esi, [.pStack]
        mov     ecx, [.q_from]

.search_bq:
        inc     ecx
        cmp     ecx, [esi+TArray.count]
        jae     .bq_not_found

        cmp     [esi+TArray.array + sizeof.TMDItem*ecx + TMDItem.type], tagQuote
        jne     .search_bq

        clc
        retn

.bq_not_found:
        stc
        retn


.ul_found:
        call    .check_for_code_block
        jc      .skip_to_eol

        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .empty_line_found

        cmp     byte [edx+ecx], ' '     ; mandatory space
        ja      .non_empty_line_found

        add     [edx+TText.GapEnd], 2   ; remove the marker.

.search_list:

        call    .search_for_li
        jnc     .list_found

        call    .close_to_ecx
        jmp     .create_new_ul


.list_found:

        OutputValue "List found at: ", [.whspc], 10, -1

        mov     edi, [.whspc]
        sub     edi, [esi + TArray.array + sizeof.TMDItem*ecx + TMDItem.indent]

        call    .close_to_ecx

        cmp     edi, 4
        jge     .create_new_ul  ; create list one level of nesting up.

        mov     [esi + TArray.count], ecx  ; close the current listitem.
        call    .close_tag

        cmp     edi, -4
        jg      .create_new_li

        dec     ecx

        mov     eax, [esi+TArray.array + sizeof.TMDItem*ecx + TMDItem.type]             ; eax should be tagUL or tagOL and nothing else!
        mov     [esi+TArray.count], ecx
        call    .close_tag             ; close the list as well. (can be UL or OL!)

        jmp     .search_list           ; and then search back for the list on the previous level.


.create_new_ul:

        mov     eax, tagUL
        call    .open_tag

.create_new_li:
        OutputValue "List item created on:", [.whspc], 10, -1

        mov     eax, tagListItem
        call    .open_tag
        jmp     .loop           ; after creating list items, the whitespace for the current line should not be reset.


.check_for_code_block:

        mov     esi, [.pStack]
        mov     eax, [esi+TArray.count]
        dec     eax
        js      .not_a_code_block

        cmp     [esi+TArray.array + sizeof.TMDItem*eax + TMDItem.type], tagCode
        jne     .not_a_code_block

; there is open code block
        cmp     [.whspc], 4
        jb      .close_code_block

        stc
        retn

.close_code_block:

        mov     eax, tagCode
        call    .close_tag

.not_a_code_block:
        clc
        retn


.quote_found:

        DebugMsg "Quote found"

        mov     eax, [.q_from]
        OutputValue "Search quote from: ", eax, 10, -1

.quote_search:
        inc     eax
        mov     [.q_from], eax
        cmp     eax, [esi+TArray.count]
        jae     .create_new_quote

        cmp     [esi+TArray.array+sizeof.TMDItem*eax+TMDItem.type], tagQuote
        je      .del_marker
        jmp     .quote_search

.create_new_quote:

        DebugMsg "New quote created"

        call    .check_for_code_block
        jc      .skip_to_eol

        mov     eax, tagQuote
        call    .open_tag

        mov     eax, [esi+TArray.count]
        dec     eax
        mov     [.q_from], eax


.del_marker:

        DebugMsg "Delete quote marker."
        inc     [edx+TText.GapEnd]

        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .empty_line_found

        cmp     byte [edx+ecx], ' '     ; optional space.
        jne     .zerospc

        inc     [edx+TText.GapEnd]
        jmp     .zerospc




.headers dd tagH1, tagH2, tagH3, tagH4, tagH5, tagH6

.header_found:

        cmp     [.whspc], 4
        jae     .code_block

        xor     eax, eax

.hcnt:
        inc     eax
        inc     ecx
        cmp     ecx, [edx+TText.Length]
        jae     .non_empty_line_found           ; not a header?

        cmp     byte [edx+ecx], '#'
        je      .hcnt

        cmp     eax, 6
        ja      .non_empty_line_found

        cmp     byte [edx+ecx], ' '
        jne     .non_empty_line_found           ; not a header?

        stc
        adc     [edx+TText.GapEnd], eax

        mov     [.hdr], eax

.non_empty_line_found:

        OutputValue "Non empty line indent: ", [.whspc], 10, -1

        mov     esi, [.pStack]
        mov     ecx, [esi+TArray.count]
        dec     ecx
        js      .add_leaf

        mov     ecx, [esi + TArray.array + sizeof.TMDItem * ecx + TMDItem.type] ; don't add paragraphs inside elements that can handle text by themselves.
        test    [ecx+TOneTag.flags], fLines
        jnz     .skip_to_eol

.add_leaf:
        call    .search_for_bq
        jc      .quote_ok

        call    .close_to_ecx_inc

.quote_ok:

        call    .search_for_li
        mov     eax, [.whspc]

        jc      .indent_ok
        sub     eax, [esi + TArray.array + sizeof.TMDItem*ecx+TMDItem.indent]
.indent_ok:

        cmp     eax, 4
        jge     .code_block

        cmp     eax, -4
        jg      .para

        call    .close_to_ecx_inc

        dec     ecx
        mov     eax, [esi+TArray.array + sizeof.TMDItem*ecx + TMDItem.type]
        mov     [esi+TArray.count], ecx
        call    .close_tag

        jmp     .add_leaf

.para:
        mov     eax, tagPara
        mov     ecx, [.hdr]
        dec     ecx
        js      .do_add_leaf
        mov     eax, [.headers + 4*ecx]

.do_add_leaf:
        call    .open_tag
        jmp     .skip_to_eol


.empty_line_found:

        call    .search_for_bq
        jc      .quote_ok2

        call    .close_to_ecx_inc

.quote_ok2:

        mov     esi, [.pStack]
        mov     ecx, [esi+TArray.count]
        dec     ecx
        js      .skip_to_eol   ; the empty line is not inside code block because there is no blocks at all.

        mov     eax, [esi + TArray.array + sizeof.TMDItem*ecx + TMDItem.type]
        test    [eax+TOneTag.flags], fLines
        jz      .close_list

        mov     [esi+TArray.count], ecx ; close text leaf blocks.
        call    .close_tag
        jmp     .skip_to_eol

.close_list:
        DebugMsg "Close list on second empty line."

        cmp     eax, tagListItem
        jne     .skip_to_eol

        call    .close_tag

        mov     [esi+TArray.count], ecx
        dec     ecx
        js      .skip_to_eol

        mov     eax, [esi + TArray.array + sizeof.TMDItem*ecx + TMDItem.type]
        cmp     eax, tagUL
        jne     .skip_to_eol

        call    .close_tag
        mov     [esi+TArray.count], ecx
        jmp     .skip_to_eol


.code_block:

        DebugMsg "Code block detected!"

        mov     esi, [.pStack]
        mov     ecx, [esi+TArray.count]
        dec     ecx
        js      .add_new_code_block

        cmp     [esi+TArray.array + sizeof.TMDItem*ecx + TMDItem.type], tagCode
        je      .skip_to_eol

.add_new_code_block:

        mov     eax, tagCode
        call    .open_tag

;        add     [edx+TText.GapEnd], 4   ; the gap should be properly positioned here!
        jmp     .skip_to_eol


.open_new:
        cmp     ecx, [esi + TArray.count]       ; esi = indicators list
        jae     .skip_to_eol

        mov     eax, [esi + TArray.array + sizeof.TMDItem*ecx + TMDItem.indent]
        mov     [.whspc], eax
        mov     eax, [esi + TArray.array + sizeof.TMDItem*ecx + TMDItem.type]
        call    .open_tag

        inc     ecx
        jmp     .open_new

; Here seems to be a good place for processing the inline formatting elements, together with the HTML encoding.

.skip_to_eol:

        xor     eax, eax
        mov     ecx, ebx
        add     ecx, [edx+TText.GapEnd]
        sub     ecx, [edx+TText.GapBegin]
        cmp     ecx, [edx+TText.Length]
        jae     .end_of_text

        mov     al, [edx+ecx]
        test    al, al
        jz      .end_of_text
        cmp     al, $0d
        je      .eol_found
        cmp     al, $0a
        je      .eol_found

; html encoding from here

        test    al, al          ; all values > 127 are unicode and should not be encoded.
        js      .next

        movzx   eax, byte [tbl_html+eax]
        test    al, al
        jns     .next           ; the same as above

        lea     esi, [eax+tbl_html]     ; the address of the replacement string.
        lodsb
        movzx   ecx, al         ; length

; insert the replacement html encoding from esi

        stdcall TextSetGapSize, edx, ecx
        stdcall TextMoveGap, edx, ebx
        inc     [edx+TText.GapEnd]      ; delete the previous char.

        mov     edi, [edx+TText.GapBegin]
        add     edi, edx
        add     [edx+TText.GapBegin], ecx
        add     ebx, ecx

        rep movsb

.next:
        inc     ebx
        jmp     .skip_to_eol


.eol_found:
        mov     ah, al
        xor     ah, $0d xor $0a

        inc     ecx
        inc     ebx
        cmp     [edx+ecx], ah
        jne     .start_of_line
        inc     ebx
        jmp     .start_of_line

.end_of_text:

; Close all not closed tags:

        stdcall TextMoveGap, edx, ebx
        mov     edi, [.pStack]
        mov     ecx, [edi+TArray.count]

.close_all:
        dec     ecx
        js      .finalize

        mov     eax, [edi + TArray.array + sizeof.TMDItem*ecx + TMDItem.type]
        call    .close_tag
        jmp     .close_all

.finalize:
        stdcall FreeMem, [.pStack]
;        stdcall FreeMem, [.pIList]

        mov     [esp + 4*regEDX], edx
        popad
        return


.open_tag:
        push    ecx esi edi
        push    eax eax
        call    .add_to_stack
        pop     eax
        call    .prefix_tag
        pop     eax
        call    .suffix_tag
        pop     edi esi ecx
        retn


.suffix_tag:
        lea     eax, [eax+TOneTag.pOpenS]
        jmp     .copy_tag

.close_tag:
        lea     eax, [eax+TOneTag.pClose]

.prefix_tag:
.copy_tag:
        push    ecx esi edi

        mov     esi, [eax]
        mov     ecx, [eax+4]
        test    esi, esi
        jz      .tag_copy_end

        add     ebx, ecx

        stdcall TextSetGapSize, edx, ecx
        mov     edi, [edx+TText.GapBegin]
        add     edi, edx
        add     [edx+TText.GapBegin], ecx

        rep movsb

.tag_copy_end:
        pop     edi esi ecx
        retn


.add_to_stack:
        push    edx eax [.whspc]
        stdcall AddArrayItems, [.pStack], 1
        mov     [.pStack], edx
        pop     [eax+TMDItem.indent]
        pop     [eax + TMDItem.type]
        pop     edx
        retn

endp






endmodule





Added freshlib/data/named_array.asm.

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Macros and code for support of NamedArray data structure.
;               This is a data array, that contains named fields and can be serialized
;               into a text string/file in run-time.
;               This structure is aimed to be used in the user settings and interfaces
;               that need to be easy for changing by the user, by using GUI interfaces or
;               human readable text config files.
;
;  Target OS: Any
;
;  Dependencies: StrLib, GUI library.
;
;_________________________________________________________________________________________


struct TMetaHeader
  .pData dd ?           ; pointer to the NamedArray data fields.
  .length dd ?          ; total length of the NamedArray structure: fields+static data+meta data.
  .count dd ?           ; count of the TMetaFields following.
ends

struct TMetaField
  .pName  dd  ?
  .type   dw  ?
  .len    dw  ?         ; length of the field in dwords
  .offset dd  ?         ; offset of the field, relative to the start of the array.
ends


;
; The NamedArray is a type of structure that contains
; the fields names together with the field values.
; This way, the values of the array can be write to
; text files and then restored in runtime, based not
; on the fields offsets (that can differ) but based on
; field names.
;


___natNUM     = 0          ; NUM,  Stored as decimal, signed.
___natHEX     = 1          ; HEX,  Stored as hex, unsigned.
___natTXT     = 2          ; TXT,  Stored as string. Needs postprocessing.
___natFONT    = 3          ; FONT, Stored as multivalue: face, size, flags, etc.
___natPNG     = 4          ; PNG,  Stored as a hex array. Need postprocessing.
___natFILE    = 5          ; FILE, Stored as a hex array.


macro NamedArray lbl, [name, type, value] {
common
  local ..fake_lbl

  label ..fake_lbl dword
  label lbl dword

; data fields

forward
  local ..len, ..fake_name

    ..len = 0

    label ..fake_name dword

    if used lbl#.#name | (defined options.WholeTheme & options.WholeTheme)
      label lbl#.#name dword
      irp val, value \{

        ..len = ..len + 1

        if (type eq NUM)|(type eq HEX)
          dd val
        else
          if type eq TXT
            if val eqtype 1
              dd val
            else
              dd 0        ; will be changed later in the macro
            end if
          else
            if (type eq FONT) | (type eq PNG)
              dd 0        ; will be changed later in the macro.
              dd 0
            else
              if type eq FILE
                dd 0          ; pointer to data
              else
                Error! Unknown `type type.
              end if
            end if
          end if
        end if
      \}
    end if

; data for the strings, images, files, etc.
forward
local ..index

    ..index = 0

    irp val, value \{
    \local ..dta, ..len

      if used lbl\#.\#name | (defined options.WholeTheme & options.WholeTheme)
        if type eq TXT
          if ~ val eqtype 1
              ..dta db val
                    db 0
          end if
        end if

        if type eq FONT
          match face : size : weight : flags, val \\{         ; For the Linux port, this structure is enough and not need FontCreate call.
            \\local ..font_face

            ..dta dd  ..font_face   ; font face string
                  dd  size          ; NUM
                  dd  weight        ; NUM
                  dd  flags         ; HEX

            ..font_face db face, 0
          \\}

          ..index = ..index + 4
        end if

        if type eq PNG
                dd ..len
          ..dta file val
          ..len = $ - ..dta

          ..index = ..index + 4
        end if

        if type eq FILE
                dd ..len
          ..dta file val
          ..len = $ - ..dta
        end if

        if defined ..dta
          store dword ..dta at ..fake_name + ..index
        end if
      end if

      ..index = ..index + 4
    \}

; Header of the meta data.
common
  local ..cnt, ..total, ..fake_meta
  ..cnt = 0

  if used lbl#.#meta | (defined options.WholeTheme & options.WholeTheme)

    label lbl#.#meta dword
    label ..fake_meta  dword

    dd ..fake_lbl
    dd lbl#.#size
    dd ..total

; metadata
forward
  local ..namestr

; array with the fields names and offsets.
    if defined lbl#.#name

      dd  ..namestr
      dw  ___nat#type
      dw  ..len     ; dwords
      dd  ..fake_name - ..fake_lbl

      ..cnt = ..cnt + 1

    end if

; field names
forward

    if used ..namestr | (defined options.WholeTheme & options.WholeTheme)
      ..namestr db `name, 0
    end if

; Initialization code
common
  end if

    if used lbl#.#Init | (defined options.WholeTheme & options.WholeTheme)
      lbl#.#Init:

forward

local ..index

      ..index = 0

      irp val, value \{
        if used lbl\#.\#name | (defined options.WholeTheme & options.WholeTheme)
          if type eq FONT
            mov     eax, [..fake_name+..index+4]
            stdcall  FontCreate, [eax+__TFont.hFontFace], [eax+__TFont.height], [eax+__TFont.weight], [eax+__TFont.flags]
            mov      [..fake_name+..index], eax

            ..index = ..index + 4
          end if

          if (type eq PNG)
            mov     eax, [..fake_name+..index+4]
            stdcall  CreateImagePNG, eax, [eax-4]
            mov      [..fake_name+..index], eax

            ..index = ..index + 4
          end if
        end if

        ..index = ..index + 4
      \}

common
          retn
    end if

; Finalization code
common
    if used lbl#.#Finalize | (defined options.WholeTheme & options.WholeTheme)
      lbl#.#Finalize:

forward

local ..index

      ..index = 0

      irp val, value \{
        if used lbl\#.\#name | (defined options.WholeTheme & options.WholeTheme)
          if type eq FONT
            stdcall  __metaFontDestroy, ..fake_name+..index
            ..index = ..index + 4
          end if

          if (type eq PNG)
            stdcall  DestroyImage, [..fake_name+..index]
            ..index = ..index + 4
          end if
        end if

        ..index = ..index + 4
      \}

common
          retn
    end if

common
  lbl#.#size = $ - ..fake_lbl

  ..total = ..cnt
}



proc __metaFontDestroy, .pFontRec
begin
        push    eax

        mov     eax, [.pFontRec]
        stdcall FontDestroy, [eax]      ; the font handle.
        mov     eax, [eax+4]
        stdcall StrDel, [eax+__TFont.hFontFace]

        pop     eax
        return
endp



; Serializes the NamedArray to a string.
; .pMeta - poitner to the meta data of the named array structure.

proc NamedArrayToString, .pMeta
.array dd ?
.data2string dd ?
.datalen     dd ?
begin
        pushad

        mov     esi, [.pMeta]
        stdcall StrNew
        mov     edi, eax

        lodsd
        mov     [.array], eax

        lodsd   ; TMetaHeader.length

        lodsd
        mov     ecx, eax        ; count of the meta records.

.loop:
        dec     ecx
        js      .end_loop

        lodsd                   ; pointer to the field name.

        stdcall StrCat, edi, eax
        stdcall StrCharCat, edi, " = "

        lodsw                   ; data type
        movzx   eax, ax
        push    [.data_handlers+4*eax]
        push    [.data_len+4*eax]

        pop     [.datalen]
        pop     [.data2string]

        lodsw
        movzx   edx, ax         ; number of sub values

        lodsd                   ; offset, relative to [.array]
        mov     ebx, eax
        add     ebx, [.array]   ; pointer to the values

.loop2:
        dec     edx
        js      .end_loop2

        stdcall [.data2string], ebx
        push    eax

        stdcall StrCat, edi, eax
        stdcall StrDel ; from the stack

        add     ebx, [.datalen]

        test    edx, edx
        jz      .loop2

        stdcall StrCharCat, edi, ", "
        jmp     .loop2

.end_loop2:
        stdcall StrCharCat, edi, $0a0d
        jmp     .loop

.end_loop:
        mov     [esp+regEAX*4], edi
        popad
        return


.data_handlers dd __DataToNum, __DataToHex, __DataToTxt, __DataToFont, __DataToPng, __DataToFile
.data_len      dd 4,           4,           4,           8,            8,            4

endp


proc __DataToNum, .pData
begin
        mov     eax, [.pData]
        stdcall NumToStr, [eax], ntsDec or ntsSigned
        return
endp



proc __DataToHex, .pData
begin
        mov     eax, [.pData]
        stdcall NumToStr, [eax], ntsHex or ntsUnsigned
        stdcall StrCharInsert, eax, '$', 0
        return
endp



proc __DataToTxt, .pData
begin
        mov     eax, [.pData]
        stdcall StrDupMem, [eax]
        stdcall StrSetQuotes, eax, 0
        return
endp



proc __DataToFont, .pData
begin
        push    esi ebx

        mov     esi, [.pData]
        mov     esi, [esi+4]

        stdcall StrDup, [esi+__TFont.hFontFace]    ; face name
        stdcall StrSetQuotes, eax, 0
        mov     ebx, eax

        stdcall StrCharCat, ebx, " : "

        stdcall NumToStr, [esi+__TFont.height], ntsDec or ntsUnsigned    ; size
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax

        stdcall StrCharCat, ebx, " : "

        stdcall NumToStr, [esi+__TFont.weight], ntsDec or ntsUnsigned    ; weight
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax

        stdcall StrCharCat, ebx, " : $"

        stdcall NumToStr, [esi+__TFont.flags], ntsHex or ntsUnsigned    ; flags
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax

        mov     eax, ebx

        pop     ebx esi
        return
endp



proc __DataToPng, .pData
begin
        pushad

        mov     esi, [.pData]
        mov     esi, [esi+4]            ; pointer to the compressed file.
        mov     ecx, [esi-4]            ; length
        jmp     __DataToFile.convert_file
endp



proc __DataToFile, .pData
begin
        pushad

        mov     esi, [.pData]
        mov     esi, [esi]              ; pointer to the compressed file.
        mov     ecx, [esi-4]            ; length

.convert_file:
        stdcall NumToStr, ecx, ntsDec or ntsUnsigned
        mov     ebx, eax

        stdcall StrCharCat, ebx, ":"

        stdcall EncodeBase64, esi, ecx
        push    eax

        stdcall StrCat, ebx, eax
        stdcall StrDel ; from the stack

        mov     [esp+regEAX*4], ebx
        popad
        return
endp


proc StringToNamedArray, .pMeta, .hString
.string2data dd ?
.free_data   dd ?
.data_start  dd ?
.data_end    dd ?
begin
        pushad

        mov     esi, [.pMeta]
        mov     eax, [esi+TMetaHeader.pData]
        mov     [.data_start], eax
        add     eax, [esi+TMetaHeader.length]
        mov     [.data_end], eax

        stdcall StrSplitList, [.hString], $0a, FALSE
        mov     esi, eax

        xor     ecx, ecx

.loop:
        cmp     ecx, [esi+TArray.count]
        jae     .end_loop

        stdcall StrSplitList, [esi+TArray.array+4*ecx], "=", TRUE
        mov     edi, eax

        cmp     [edi+TArray.count], 2
        je      .value_ok

; join the strings

        mov     ebx, 2

.join:
        cmp     ebx, [edi+TArray.count]
        jae     .value_ok

        stdcall StrCat, [edi+TArray.array+4], txt "="
        xor     eax, eax
        xchg    eax, [edi+TArray.array+4*ebx]
        stdcall StrCat, [edi+TArray.array+4], eax
        stdcall StrDel, eax

        inc     ebx
        jmp     .join


.value_ok:
        stdcall __SearchName, [.pMeta], [edi+TArray.array]
        test    eax, eax
        jz      .free1

        push    esi ecx

        mov     ebx, eax

        stdcall StrSplitList, [edi+TArray.array+4], ',', FALSE
        mov     edx, eax

        movzx   ecx, [ebx+TMetaField.len]
        cmp     ecx, [edx+TArray.count]
        jb      .free2                          ; there is no place to restore this parameter.

        movzx   eax, [ebx+TMetaField.type]
        push    [.data_handlers+4*eax]
        push    [.free_handlers+4*eax]

        pop     [.free_data]
        pop     [.string2data]

        mov     esi, [ebx+TMetaField.offset]
        add     esi, [.data_start]      ; pointer to the data field.

        xor     ecx, ecx

.loop2:
        cmp     ecx, [edx+TArray.count]
        jae     .free2

        call    [.free_data]
        stdcall [.string2data], [edx+TArray.array+4*ecx]

        inc     ecx
        jmp     .loop2


.free2:
        stdcall ListFree, edx, StrDel

        pop     ecx esi

.free1:
        stdcall ListFree, edi, StrDel

.next_line:
        inc     ecx
        jmp     .loop

.end_loop:
        stdcall ListFree, esi, StrDel
        popad
        return

.data_handlers dd __NumToData, __NumToData, __TxtToData, __FontToData, __PngToData, __FileToData
.free_handlers dd .end_free,   .end_free,   .free_txt,   .free_font,   .free_png,   .free_file


.check_ptr:
        test    eax, eax
        jz      .out

        cmp     eax, [.data_start]
        jb      .out
        cmp     eax, [.data_end]
        ja      .out
;in
        stc
        retn

.out:
        clc
        retn

.free_txt:
        stdcall StrDel, [esi]
        retn

.free_font:
        cmp     dword [esi], 0
        je      .end_free

        stdcall FontDestroy, [esi]
        mov     eax, [esi+4]
        call    .check_ptr
        jnc     .end_free       ;

        stdcall StrDel, [eax+__TFont.hFontFace]
        mov     [eax+__TFont.hFontFace], 0
        retn

.free_png:
        stdcall DestroyImage, [esi]
        mov     eax, [esi+4]

.free_ptr:
        sub     eax, 4
        call    .check_ptr
        jc      .end_free ; don't free structure internal memory

        stdcall FreeMem, eax

.end_free:
        retn


.free_file:
        mov     eax, [esi]
        jmp     .free_ptr

endp




proc __NumToData, .hString
begin
        stdcall StrToNumEx, [.hString]
        mov     [esi], eax
        add     esi, 4
        return
endp


proc __TxtToData, .hString
begin
        stdcall StrDup, [.hString]
        stdcall StrClipQuotes, eax
        mov     [esi], eax
        add     esi, 4
        return
endp



proc __FontToData, .hString
begin
        push    ebx ecx edx edi

        xor     eax, eax
        mov     [esi], eax

        mov     edi, [esi+4]    ; pointer to the font parameters.

        stdcall StrSplitList, [.hString], ":", FALSE
        mov     edx, eax

        cmp     [edx+TArray.count], 4
        jne     .finish

        stdcall StrClipQuotes, [edx+TArray.array]
        stdcall StrDup, [edx+TArray.array]

        xchg    eax, [edi+__TFont.hFontFace]
        stdcall StrDel, eax

        stdcall StrToNumEx, [edx+TArray.array+4]        ; size
        mov     [edi+__TFont.height], eax
        mov     ebx, eax

        stdcall StrToNumEx, [edx+TArray.array+8]        ; weight
        mov     [edi+__TFont.weight], eax
        mov     ecx, eax

        stdcall StrToNumEx, [edx+TArray.array+12]       ; flags
        mov     [edi+__TFont.flags], eax
        mov     edi, eax

        stdcall StrPtr, [edx+TArray.array]
        stdcall FontCreate, eax, ebx, ecx, edi

        stdcall ListFree, edx, StrDel

        mov     [esi], eax
        add     esi, 8

.finish:
        pop     edi edx ecx ebx
        return
endp



proc __PngToData, .hString
begin
        push    edx

        stdcall StrSplitList, [.hString], ":", FALSE
        mov     edx, eax

        cmp     [edx+TArray.count], 2
        jne     .finish

        stdcall DecodeBase64, [edx+TArray.array+4]
        mov     [esi+4], eax

        stdcall CreateImagePNG, eax, [eax-4]
        mov     [esi], eax

.finish:
        stdcall ListFree, edx, StrDel
        add     esi, 8
        pop     edx
        return
endp



proc __FileToData, .hString
begin
        push    edx

        stdcall StrSplitList, [.hString], ":", FALSE
        mov     edx, eax

        cmp     [edx+TArray.count], 2
        jne     .finish

        stdcall DecodeBase64, [edx+TArray.array+4]
        mov     [esi], eax

.finish:
        stdcall ListFree, edx, StrDel
        add     esi, 4
        pop     edx
        return
endp



; returns a pointer to the parameter description block: name, count, offset.

proc __SearchName, .pMeta, .hName
begin
        push    esi ecx

        mov     esi, [.pMeta]

        mov     ecx, [esi+TMetaHeader.count]
        add     esi, sizeof.TMetaHeader

.search:
        dec     ecx
        js      .not_found

        stdcall StrCompCase, [esi+TMetaField.pName], [.hName]
        jc      .found

        add     esi, sizeof.TMetaField
        jmp     .search

.not_found:
        xor     esi, esi

.found:
        mov     eax, esi
        pop     ecx esi
        return
endp


Added freshlib/data/random.asm.





































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS independent part of different random number generators.
;
;  Target OS: Any
;
;  Dependencies: memory.asm, strlib.asm
;
;  Notes:
;
;_________________________________________________________________________________________

module "Random library"


; Cryptographically strong random generator. Possibly slow. OS dependent implementation.
; Returns:
;   eax - pointer to memory block of random bytes.

interface GetRandomBytes, .count




proc GetRandomString, .size
begin
        pushad

        mov     eax, [.size]
        shr     eax, 1
        adc     eax, 0
        jz      .error

        stdcall GetRandomBytes, eax
        jc      .error

        mov     esi, eax
        mov     ebx, eax

        stdcall StrNew
        mov     [esp+4*regEAX], eax

        stdcall StrSetCapacity, eax, [.size]
        mov     edi, eax
        mov     ecx, [.size]
        mov     [edi+string.len], ecx

        xor     eax, eax

.loop:
        lodsb
        mov     dl, al
        and     al, $0f
        shr     dl, 4

        cmp     al,$0a
        sbb     al,$69
        das

        stosb

        dec     ecx
        jz      .string_ok

        mov     al, dl
        cmp     al,$0a
        sbb     al,$69
        das

        stosb
        dec     ecx
        jnz     .loop

.string_ok:
        xor     eax, eax
        stosd
        stdcall FreeMem, ebx

        clc
        popad
        return

.error:
        stc
        popad
        return
endp



include '%TargetOS%/random.asm'



endmodule

Added freshlib/data/sha1.asm.































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255



; Computes the SHA-1 hash for the data in [.pData] with length in  [.len]
; The memory buffer in [.pData] must have size higher than [.len] and multiply of 64 bytes (512 bits)
;
;

proc DataSHA1, .pData, .len
.hash  rd 5     ; the h[0]..h[4] accumulators
.abcde rd 5     ; the chunk hashes
.words rd 80    ; the 80 dword chunks.
begin
        pushad

; init the accumulators
        mov     ecx, 4

.init_acc:
        mov     eax, [.sha1_h + 4*ecx]
        mov     [.hash+4*ecx], eax
        mov     [.abcde+4*ecx], eax
        dec     ecx
        jns     .init_acc

; pad the data

        mov     edx, [.len]

        mov     edi, [.pData]
        add     edi, edx
        lea     ecx, [edx+1]
        mov     al, $80
        stosb

        add     edx, $40
        and     edx, not $3f
        sub     ecx, edx
        neg     ecx

        sub     ecx, 8
        jge     @f
        add     ecx, $40
        add     edx, $40
@@:
        xor     eax, eax
        rep stosb
        stosd

        mov     eax, [.len]
        shl     eax, 3          ; in bits!!!
        bswap   eax
        stosd

; edx contains the padded length of the block. multiply of 64

        shr     edx, 2  ; the size in dwords
        mov     esi, [.pData]

.chunk_loop:

        xor     ebx, ebx

.get16dw:
        lodsd
        bswap   eax
        mov     [.words + 4*ebx], eax

        inc     ebx
        cmp     ebx, 16
        jne     .get16dw

.fill80:
        mov     eax, [.words + 4*ebx - 3*4]
        xor     eax, [.words + 4*ebx - 8*4]
        xor     eax, [.words + 4*ebx - 14*4]
        xor     eax, [.words + 4*ebx - 16*4]
        rol     eax, 1
        mov     [.words + 4*ebx], eax

        inc     ebx
        cmp     ebx, 80
        jne     .fill80

; process one chunk.

        xor     ebx, ebx

.process0_19:
        mov     ecx, [.abcde + 1*4]       ; b
        mov     eax, ecx
        not     ecx                     ; not b

        and     eax, [.abcde + 2*4]       ; c
        and     ecx, [.abcde + 3*4]       ; d
        or      ecx, eax                ; f

        mov     eax, [.abcde + 0*4]
        rol     eax, 5                  ; a rol 5
        lea     eax, [eax + ecx + $5A827999]; f + k
        add     eax, [.abcde + 4*4]       ; e
        add     eax, [.words + 4*ebx]     ; temp

        mov     ecx, [.abcde + 1*4]
        rol     ecx, 30
        push    eax            [.abcde + 0*4] ecx            [.abcde + 2*4] [.abcde + 3*4]
        pop     [.abcde + 4*4] [.abcde + 3*4] [.abcde + 2*4] [.abcde + 1*4] [.abcde + 0*4]

        inc     ebx
        cmp     ebx, 20
        jne     .process0_19

.process20_39:

        mov     ecx, [.abcde + 1*4]
        xor     ecx, [.abcde + 2*4]
        xor     ecx, [.abcde + 3*4]       ; f

        mov     eax, [.abcde + 0*4]
        rol     eax, 5
        lea     eax, [eax + ecx + $6ED9EBA1]
        add     eax, [.abcde + 4*4]
        add     eax, [.words + 4*ebx]     ; temp

        mov     ecx, [.abcde + 1*4]
        rol     ecx, 30
        push    eax [.abcde + 0*4] ecx [.abcde + 2*4] [.abcde + 3*4]
        pop     [.abcde + 4*4] [.abcde + 3*4] [.abcde + 2*4] [.abcde + 1*4] [.abcde + 0*4]

        inc     ebx
        cmp     ebx, 40
        jne     .process20_39


.process40_59:

        mov     ecx, [.abcde+1*4]       ; b
        mov     eax, ecx                ; b
        mov     edi, [.abcde+2*4]       ; c

        and     ecx, edi                ; b and c
        and     eax, [.abcde+3*4]       ; b and d
        and     edi, [.abcde+3*4]       ; c and d

        or      ecx, eax
        or      ecx, edi                ; f

        mov     eax, [.abcde+0*4]
        rol     eax, 5
        lea     eax, [eax+ecx+$8F1BBCDC]
        add     eax, [.abcde+4*4]
        add     eax, [.words+4*ebx]     ; temp

        mov     ecx, [.abcde+1*4]
        rol     ecx, 30
        push    eax [.abcde+0*4] ecx [.abcde+2*4] [.abcde+3*4]
        pop     [.abcde+4*4] [.abcde+3*4] [.abcde+2*4] [.abcde+1*4] [.abcde+0*4]

        inc     ebx
        cmp     ebx, 60
        jne     .process40_59

.process60_79:
        mov     ecx, [.abcde+1*4]
        xor     ecx, [.abcde+2*4]
        xor     ecx, [.abcde+3*4]       ; f

        mov     eax, [.abcde+0*4]
        rol     eax, 5
        lea     eax, [eax+ecx+$CA62C1D6]
        add     eax, [.abcde+4*4]
        add     eax, [.words+4*ebx]     ; temp

        mov     ecx, [.abcde+1*4]
        rol     ecx, 30
        push    eax [.abcde+0*4] ecx [.abcde+2*4] [.abcde+3*4]
        pop     [.abcde+4*4] [.abcde+3*4] [.abcde+2*4] [.abcde+1*4] [.abcde+0*4]

        inc     ebx
        cmp     ebx, 80
        jne     .process60_79

; the word array is processed

        mov     ecx, 4

.add_loop:
        mov     eax, [.abcde+4*ecx]
        add     eax, [.hash+4*ecx]
        mov     [.abcde+4*ecx], eax
        mov     [.hash+4*ecx], eax
        dec     ecx
        jns     .add_loop

        sub     edx, 16
        jnz     .chunk_loop


        stdcall GetMem, 20
        mov     edi, eax

        mov     eax, [.hash+0*4]
        mov     ebx, [.hash+1*4]
        mov     ecx, [.hash+2*4]
        mov     edx, [.hash+3*4]
        mov     esi, [.hash+4*4]

        bswap   eax
        bswap   ebx
        bswap   ecx
        bswap   edx
        bswap   esi

        mov     [edi], eax
        mov     [edi+4], ebx
        mov     [edi+8], ecx
        mov     [edi+12], edx
        mov     [edi+16], esi

        mov     [esp+4*regEAX], edi
        popad
        return

.sha1_h dd 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0

endp



proc StrSHA1, .pSha1
begin
        push    ebx ecx esi

        mov     esi, [.pSha1]
        stdcall StrNew
        mov     ebx, eax
        mov     ecx, 20

.loop:
        movzx   eax, byte [esi]
        inc     esi

        stdcall NumToStr, eax, ntsHex or ntsFixedWidth or ntsUnsigned + 2
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax
        dec     ecx
        jnz     .loop

        mov     eax, ebx

        pop     esi ecx ebx
        return
endp


Changes to freshlib/data/strlib.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241




242
243
244

245
246
247
248
249
250
251
252
253
254
255






256
257
258
259
260
261
262
263

264


265

266

267
268
269
270
271
272
273
274
275




276
277
278

279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300

301
302
303
304
305
306
307
308
309
310
311
312




313
314
315
316
317
318
319
320

321
322
323





324
325





326
327
328
329
330

331
332
333

334
335
336
337
338
339
340
341




342




343
344
345
346

347
348
349
350
351
352
353
;___| StrLib |________________________________________________________________________
;
; FASM dynamic string library.
;
; (c)2003, 2010 John Found
; (c)2003 Mateusz Tymek (aka decard)
; (c)2003 Victor Loh (aka roticv)
;
; You can use and modify this library, as long as modifyed
; versions are clearly marked (author of the modification
; and what is changed), copyright notice is not
; removed and the library remains free.
; Copyright for the library concept and parts written by
; me, remains to me, John Found
; Copyright for the modifyed/new parts remains to their
; authors.
;
; Versions:
;   dd.mm.yyyy  version   author of modification
;     - description
;_____________________________________________________________________________________
;
;   09.07.2003  v1.0    John Found
;     - the first public version.
;   15.07.2003  v1.0.1  John Found
;     - minor bug with string table expand. Look in NewStr
;   17.09.2003  v1.1.0  Mateusz Tymek
;     - made all functions stdcall
;     - added StrCat and StrPos, and modified StrLen
;   25.09.2003  v1.1.2  Mateusz Tymek, Victor Loh
;     - added StrLCase, StrUCase, StrCopyMMX, StrInsert
;     - added new NumToStr, old version renamed to _NumStr
;     - some small optimizations & bugfixes
;   26.09.2003 v1.1.3  JohnFound
;     - some bug fixes and style corections.
;   29.09.2003 v1.1.4  John Found, Mateusz Tymek
;     - library rewtiten to use John Found's stdcall macros
;     - added two new low-level NumToStr routines: NumToStrF and NumToStrUF
;     - NumToStr rewriten
;     - some small bugfixes & modifications
;     - added StrExtract
;   01.11.2003 v1.1.4.1 Mateusz Tymek
;     - preserved ecx in StrDel (it was destroyed by API calls)
;   21.11.2003 v1.1.5 John Found
;     - StrComp splitted to 2 functions: StrCompCase and StrCompNoCase
;       IMPORTANT: inversed return result: CARRY = 1 mean strings equal.
;       This is because the using is more natural this way:
;            stdcall  StrCompCase, str1, str2
;            jc       .equal
;   27.11.2003 v1.2 John Found
;     - Added function StrHash, that produces 32bit hash value of the string.
;       The hash function is based on FASM hash function and have to be compatible.
;   03.12.2003 v1.2.3 Mateusz Tymek
;     - Added StrCharPos and StrToNum
;   13.12.2003 v1.2.4 Materusz Tymek
;     - added StrCharCat and StrInsertChar
;   04.01.2005 v1.2.5 John Found
;     - Fixed bug in StrSetLength
;     - Added function StrURLEncode
;
;   xx.12.2010 v2.0 John Found
;     - StrLib was almost completely rewrote in order to be integrated in FreshLib.
;     - The source code was changed in order to allow more than 65536 strings
;       in the list.
;     - Introduced new format for strings with precomputed length field.
;     - Most of the procedures was optimized for speed.
;     - StrLib is fully portable now. Uses memory.asm for memory allocations
;       and arrays.asm to manage the list of strings.
;     - NumToStr is changed to always create new string. Now it have only 2
;       arguments: .number and .flags
;_____________________________________________________________________________________

;___| How to use it |_________________________________________________________________
;
; 1. StrLib is part of FreshLib - portable library for Win32 and Linux.
; 2. StrLib needs some other parts of FreshLib:
;    - "macros/allmacros.inc"
;    - "data/memory.asm"
;    - "data/arrays.asm"
;    These files have to be included before StrLib.asm itself.
;    Here is an example of the include statements needed:
;
;       include '%lib%/macros/allmacros.inc'
;       include '%lib%/system/memory.asm'
;       include '%lib%/data/arrays.asm'
;       include '%lib%/data/strlib.asm'
;
; 3. You should call "InitStrings" procedure, before using any procedure
;    from StrLib.
;    The best way to do it, is to use macro "InitializeAll", that will
;    automatically initialize all libraries, that needs initialization.
; 4. You should call "FreeStrings" when don't need StrLib anymore.
;    Again, the best way to do this is to use macro "FinalizeAll", just before
;    termination of your application.
;
; NOTE: You can use StrLib for every OS you want. You only have to provide suitable
; library for memory.asm, because it is the only OS dependent library needed.
; FreshLib itself contains memory.asm for Win32 and Linux.
;_____________________________________________________________________________________

;___|Internals|_______________________________________________________________________
;
; New format for string handles:
;
;   As a common between Win32 and Linux, the handle have set bits 30 and 31.
;   That means all handles are above $C0000000.
;   To check whether some 32bit integer is a handle or direct pointer, the library uses:
;
;   xor  [handle], $c0000000
;   test [handle], $c0000000
;   jnz  .pointer
;
;
; New format for dynamic strings:
;
; The string format supports additional fields, besides string data in order to
; allow fast processing. Here is the format:
;
;+-----------+--------+--------+--------------------------------------------------------------------------------+
;|      Name | Offset | Len    |  Description                                                                   |
;+-----------+--------+--------+--------------------------------------------------------------------------------+
;|  capacity |  -8    |dword   |  Capacity of the string - it is the maximal possible length that               |
;|           |        |        |  the string can accommodate without reallocation of the memory.                |
;|           |        |        |  Note: the capaciry is related only to bytes as elements of the string.        |
;|           |        |        |  the additional fields (capacity, len and zero terminators) are not included   |
;|           |        |        |  in this number.                                                               |
;+-----------+--------+--------+--------------------------------------------------------------------------------+
;|  len      |  -4    |dword   |  Length - the actuall length of the string in bytes.                           |
;+-----------+--------+--------+--------------------------------------------------------------------------------+
;|           |  0     |N bytes |  The string data.                                                              |
;+-----------+--------+--------+--------------------------------------------------------------------------------+
;|           |  N     | 1..4   |  NULL termination characters. At the end of the string NULL characters         |
;|           |        |        |  are appended to align the buffer to dword.                                    |
;|           |        |        |  The string is always terminated with at least one byte of zero.               |
;+-----------+--------+--------+--------------------------------------------------------------------------------+
;
;

STR_MINSTRLEN = 15      ; must be N*8-1


struc string {
  .capacity dd ?
  .len      dd ?

  label .data byte
}

virtual at -(sizeof.string)
  string string
  sizeof.string = $-string
end virtual


; NumToStr flags
ntsSigned       = $00000
ntsUnsigned     = $10000
ntsFixedWidth   = $20000


ntsBin  = $0200
ntsQuad = $0400
ntsOct  = $0800
ntsDec  = $0a00
ntsHex  = $1000


; Global variable, storing parameters of dynamic strings list.
uglobal

  ptrStrTable       dd  ?      ; StrLib strings arrray. Contains pointers to the memory allocated for strings.





  flagStringFastAdd dd  ?      ; Flag: when TRUE, enables "Fast addition mode" where new strings are allocated
                               ; without searching the ptrStrTable array for empty slots.
                               ; This can increase allocation speed, but at the expense of more memory allocated




                               ; in the array and not using possibly free handles. This mode should to be used
                               ; carefully and set to FALSE after the end of mass allocations.
endg



; < OS independent library functions >



;************************************************************************************
; Allocates memory for string table and allocates memory for strings.
; Start it before any work with strings. (Or better use InitializeAll macro)
; Returns 0 if failed to allocate needed memory.
;************************************************************************************

initialize InitStrings
begin
        StrLib = 1











































        stdcall CreateArray, 4
        jc      .finish

        mov     [ptrStrTable], eax
        or      [eax+TArray.lparam], -1     ; lParam is the last allocated handle number

.finish:





        return
endp


;**************************************************************************************
; Frees all memory used for strings library
; Call it before exit of the program or use FinalizeAll macro.
;**************************************************************************************


finalize FreeStrings



begin






        mov     esi, [ptrStrTable]
        mov     ecx, [esi+TArray.count]
        xor     ebx,ebx





.freeloop:
        dec     ecx
        js      .endloop

        cmp     [esi+TArray.array+4*ecx], ebx
        je      .freeloop
















        stdcall FreeMem, [esi+TArray.array+4*ecx]
        jmp     .freeloop

.endloop:
        stdcall FreeMem, esi
        mov     [ptrStrTable], ebx




























        return
endp





;**************************************************************************************
;  Returns:
;    CF=0 no error; eax = pointer in memory of the hString
;    CF=1 on error - hString is handle, but is not in the table.*
;**************************************************************************************
proc StrPtr, .hString
begin
        mov     eax, [.hString]

        xor     eax, $c0000000
        test    eax, $c0000000
        jnz     .pointer





        push    ebx


        mov     ebx, [ptrStrTable]
        cmp     eax, [ebx+TArray.count]
        jae     .notfound

        mov     eax, [ebx+TArray.array+4*eax]
        test    eax, eax
        jz      .notfound

        add     eax, sizeof.string
        pop     ebx
        clc






        return

.pointer:
        xor     eax, $c0000000
        clc
        return

.notfound:

        stc


        pop     ebx

        return

endp

;**************************************************************************************
;  Creates new empty string and returns handle
;  Return: handle of the new created string.
;**************************************************************************************
proc StrNew
begin
        push    ecx edx esi





; Search for first empty place.
        mov     edx, [ptrStrTable]

        mov     ecx, [edx+TArray.count]

        cmp     [flagStringFastAdd], 0
        jne     .notfound

        mov     esi,[edx+TArray.lparam]
        xor     eax,eax

.search:
        dec     ecx
        js      .notfound

        inc     esi
        cmp     esi, [edx+TArray.count]
        jne     @f
        xor     esi,esi
@@:
        cmp     [edx+TArray.array+4*esi],eax
        je      .found
        jmp     .search

.notfound:

        mov     esi, [edx+TArray.count]
        stdcall AddArrayItem, edx
        mov     [ptrStrTable], edx

.found:
        mov     [edx+TArray.lparam], esi
        stdcall GetMem, STR_MINSTRLEN + sizeof.string + 1
        mov     [edx+TArray.array+4*esi], eax
        mov     [eax+sizeof.string+string.capacity], STR_MINSTRLEN

        mov     eax, esi
        or      eax, $c0000000





        pop     esi edx ecx
        return
endp


;**************************************************************************
; Deletes the string if it is possible.

;**************************************************************************
proc StrDel, .hString
begin





        push    eax ecx esi






        mov     esi, [ptrStrTable]
        mov     ecx, [.hString]
        jecxz   .finish

        xor     ecx, $c0000000

        test    ecx, $c0000000
        jnz     .pointer


        cmp     ecx, [esi+TArray.count]
        jae     .finish

.free:
        stdcall FreeMem, [esi+TArray.array+4*ecx]
        mov     [esi+TArray.array+4*ecx], 0

.finish:




        pop     esi ecx eax




        return

.pointer:
        xor     ecx, $c0000000


; search the pointer in the table.
        lea     eax, [ecx-sizeof.string]
        mov     ecx, [esi+TArray.count]

.search:
        dec     ecx
|
|
|
|
<
<
<

<
<
<
<
<
<
<
<
<
<
<
|
<

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

<
<
<
<
<
<
|
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<

<
<
<
|

<
<
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|


|


>
|
|
|
<
<
<
<

















>
|
>
>
>

>
|
|
|
>
>
>
>
|
|





>
>






>




>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>




|


>
>
>
>
>


>





>
>

>
>
>

>
>
>
>
>
>



>
>
>
>







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


>
>











|
|
|
|
>
>
>
>



>











>
>
>
>
>
>



<




>

>
>
|
>

>









>
>
>
>



>
|
|
<
|
|









|


|




>

|




|




|
>
>
>
>








>



>
>
>
>
>
|

>
>
>
>
>

<
<

|
>
|
|

>





|


>
>
>
>
|
>
>
>
>



|
>







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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265

266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296

297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357


358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|



;











;  Description: OS independent string manipulation library.

;


















;  Target OS: Any


















;






;  Dependencies: memory.asm; arrays.asm




;
















;  Notes:





;



;_________________________________________________________________________________________



module "String library"


































STR_MINSTRLEN = 127      ; must be N*8-1
STR_SEARCH_ONE_ATEMPT = 100


rstruct string
  .capacity dd ?
  .len      dd ?
  .         rb 0
ends

cNewLine text bNEWLINE






; NumToStr flags
ntsSigned       = $00000
ntsUnsigned     = $10000
ntsFixedWidth   = $20000


ntsBin  = $0200
ntsQuad = $0400
ntsOct  = $0800
ntsDec  = $0a00
ntsHex  = $1000


; Global variable, storing parameters of dynamic strings list.
uglobal
  if used InitStrings

    StrHandleOffs     dd  ?
    StrHandleCnt      dd  ?
    StrHandleEnd      dd  ?

    ptrStrHandleSpace dd ?
    
    ptrStrTable       dd  ?      ; StrLib strings arrray. Contains pointers to the memory allocated for strings.

    if options.Threads
      align 4
      StrMutex         TMutex      ; mutex that allows thread safety of StrLib
    end if

  end if
endg



; < OS independent library functions >

STR_HANDLE_CNT = 32*1024*1024

;************************************************************************************
; Allocates memory for string table and allocates memory for strings.
; Start it before any work with strings. (Or better use InitializeAll macro)
; Returns 0 if failed to allocate needed memory.
;************************************************************************************
if used ptrStrTable
initialize InitStrings
begin
        StrLib = 1

        mov     [StrHandleOffs], $c0000000
        mov     [StrHandleCnt], STR_HANDLE_CNT
        mov     [ptrStrHandleSpace], 0

  if TargetOS eq Linux

        mov     eax, sys_personality
        xor     ebx, ebx
        dec     ebx
        int     $80

        test    eax, ADDR_LIMIT_3GB
        jnz     .space_ok

        mov     eax, sys_mmap2
        xor     ebx, ebx
        mov     ecx, STR_HANDLE_CNT     ; 32M size of the address space for string handles. this memory will never be allocated.

        mov     edx, PROT_NONE
        mov     esi, MAP_ANONYMOUS or MAP_PRIVATE
        xor     edi, edi
        dec     edi
        xor     ebp, ebp
        int     $80

        mov     [StrHandleOffs], eax
        mov     [ptrStrHandleSpace], eax

.space_ok:
  end if

        mov     eax, [StrHandleOffs]
        add     eax, [StrHandleCnt]
        mov     [StrHandleEnd], eax

        OutputValue "String handles start from: ", [StrHandleOffs], 16, 8
        OutputValue "String handles ends on: ", [StrHandleEnd], 16, 8

  if options.Threads
        stdcall MutexCreate, 0, StrMutex
  end if

        stdcall CreateArray, 4
        jc      .finish

        mov     [ptrStrTable], eax
        mov     [eax+TArray.lparam], 0     ; lParam is the last allocated handle number

.finish:

  if options.Threads
        stdcall MutexRelease, StrMutex
  end if

        return
endp
end if

;**************************************************************************************
; Frees all memory used for strings library
; Call it before exit of the program or use FinalizeAll macro.
;**************************************************************************************
if used InitStrings

finalize FreeStrings
if defined options.DebugMode & options.DebugMode
  .allocated dd ?
end if
begin
        DebugMsg "Strings finalizing."

  if options.Threads
        stdcall WaitForMutex, StrMutex, -1
  end if

        mov     esi, [ptrStrTable]
        mov     ecx, [esi+TArray.count]
        xor     ebx,ebx

if defined options.DebugMode & options.DebugMode
        mov     [.allocated], ebx
end if

.freeloop:
        dec     ecx
        js      .endloop

        cmp     [esi+TArray.array+4*ecx], ebx
        je      .freeloop

if defined options.DebugMode & options.DebugMode
        inc     [.allocated]

        mov     eax, ecx
        add     eax, [StrHandleOffs]

        OutputNumber eax, 16, 8

        stdcall FileWriteString, [STDERR], txt " >>>"
        mov     eax, [esi+TArray.array+4*ecx]
        add     eax, sizeof.string
        stdcall FileWriteString, [STDERR], eax
        stdcall FileWriteString, [STDERR], <txt "<<<", 13, 10>
end if

        stdcall FreeMem, [esi+TArray.array+4*ecx]
        jmp     .freeloop

.endloop:
        stdcall FreeMem, esi
        mov     [ptrStrTable], ebx

        OutputValue "Not deleted strings: ", [.allocated], 10, -1
        DebugMsg "Strings mutex destroy."

  if options.Threads
        stdcall MutexDestroy, StrMutex
  end if


  if TargetOS eq Linux

        cmp     [ptrStrHandleSpace], 0
        je      .space_ok

        mov     eax, sys_munmap
        mov     ebx, [StrHandleOffs]
        mov     ecx, [StrHandleCnt]
        int     $80

        mov     [StrHandleOffs], 0
        mov     [ptrStrHandleSpace], 0

.space_ok:


  end if

        DebugMsg "Strings finalized."
        return
endp

end if



;**************************************************************************************
;  Returns:
;    CF=0 no error; eax = pointer in memory of the hString
;    CF=1 on error - hString is handle, but is not in the table.*
;**************************************************************************************
proc StrPtr, .hString
begin
        mov     eax, [.hString]
        cmp     eax, [StrHandleOffs]
        jb      .pointer
        cmp     eax, [StrHandleEnd]
        jae     .pointer

  if options.Threads
        stdcall WaitForMutex, StrMutex, -1
  end if

        push    ebx

        sub     eax, [StrHandleOffs]
        mov     ebx, [ptrStrTable]
        cmp     eax, [ebx+TArray.count]
        jae     .notfound

        mov     eax, [ebx+TArray.array+4*eax]
        test    eax, eax
        jz      .notfound

        add     eax, sizeof.string
        pop     ebx
        clc

.finish:
  if options.Threads
        stdcall MutexRelease, StrMutex
  end if

        return

.pointer:

        clc
        return

.notfound:
        pop     ebx
        stc

  if options.Threads
        jmp     .finish
  else
        return
  end if
endp

;**************************************************************************************
;  Creates new empty string and returns handle
;  Return: handle of the new created string.
;**************************************************************************************
proc StrNew
begin
        push    ecx edx esi

  if options.Threads
        stdcall WaitForMutex, StrMutex, -1
  end if

; Search for first empty place.
        mov     edx, [ptrStrTable]
        mov     ecx, STR_SEARCH_ONE_ATEMPT       ; search only limited count of items
        cmp     ecx, [edx+TArray.count]
        jb      @f

        mov     ecx, [edx+TArray.count]
@@:
        mov     esi,[edx+TArray.lparam]
        xor     eax,eax

.search:
        dec     ecx
        js      .notfound

        inc     esi
        cmp     esi, [edx+TArray.count]
        jb      @f
        xor     esi,esi
@@:
        cmp     [edx+TArray.array+4*esi], eax
        je      .found
        jmp     .search

.notfound:
        mov     [edx+TArray.lparam], esi        ; store the place where the search ends this time.
        mov     esi, [edx+TArray.count]
        stdcall AddArrayItems, edx, 1
        mov     [ptrStrTable], edx

.found:
        mov     [edx+TArray.lparam], esi
        stdcall GetMem, STR_MINSTRLEN + sizeof.string + 4 + 1
        mov     [edx+TArray.array+4*esi], eax
        mov     [eax+sizeof.string+string.capacity], STR_MINSTRLEN

        mov     eax, esi
        add     eax, [StrHandleOffs]

  if options.Threads
        stdcall MutexRelease, StrMutex
  end if

        pop     esi edx ecx
        return
endp


;**************************************************************************
; Deletes the string if it is possible.
; Preserves EFLAGS. Allows .hString == 0
;**************************************************************************
proc StrDel, .hString
begin
        push    ecx
        mov     ecx, [.hString]
        jecxz   .end                    ; must be jecxz! Because StrDel preserves FLAGS!

        pushf
        push    eax esi


  if options.Threads
        stdcall WaitForMutex, StrMutex, -1
  end if

        mov     esi, [ptrStrTable]



        cmp     ecx, [StrHandleOffs]
        jb      .pointer
        cmp     ecx, [StrHandleEnd]
        jae     .pointer

        sub     ecx, [StrHandleOffs]
        cmp     ecx, [esi+TArray.count]
        jae     .finish

.free:
        stdcall FreeMem, [esi+TArray.array+4*ecx]
        and     [esi+TArray.array+4*ecx], 0

.finish:
  if options.Threads
        stdcall MutexRelease, StrMutex
  end if

        pop     esi eax
        popf

.end:
        pop     ecx
        return

.pointer:
        OutputValue "WARNING: StrDel on pointer: ", ecx, 16, 8
        OutputValue "                 call from: ", [ebp+4], 16, 8

; search the pointer in the table.
        lea     eax, [ecx-sizeof.string]
        mov     ecx, [esi+TArray.count]

.search:
        dec     ecx
364
365
366
367
368
369
370



































371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386



387
388
389

390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419

420


421


422
423
424
425
426


427




428
429
430
431




432
433





434




















435
436
437



438
439

440




441

442

443


444
445

446
447
448
449
450
451
452
453
454


455
456


457



458
459
460
461
462
463
464
465

466
467


468

469
470
471
472
473
474
475
proc StrDup, .hSource
begin
        stdcall StrNew
        stdcall StrCopy, eax, [.hSource]
        return
endp





































;**************************************************************************
; Arguments:
;  hString - handle or pointer to the string (static or dynamic)
; Returns:
;   CF=0; eax = length of the string in bytes.
;   CF=1; eax = 0 in case, the handle of the string can't be found in the
;               string table or the pointer is NULL.
;
; If pointer is passed the the procedure, it should be dword aligned and
; all bytes of the string including zero terminator to be accessed on
; qword boundary. Although, the zero terminator can be single byte zero.
;
; The performance of the procedure is high for pointers and
; instant for handles (the StrLib created string doesn't need any
; search, because the length is precomputed)



;**************************************************************************

proc StrLen, .hString    ; proc StrLen [hString]

begin
        push    esi

        mov     esi, [ptrStrTable]
        mov     eax, [.hString]

        xor     eax, $c0000000
        test    eax, $c0000000
        jnz     .pointer

        cmp     eax, [esi+TArray.count]
        jae     .error

        mov     eax, [esi+TArray.array+4*eax]
        test    eax, eax
        jz      .error

        mov     eax, [eax+sizeof.string+string.len]
        clc
        pop     esi
        return

.error:
        xor     eax, eax
        stc
        pop     esi
        return

.pointer:
        push    ecx edx edi




        xor     eax, $c0000000



; align on dword
.byte1:
        test    eax, 3
        jz      .scan







        cmp     byte [eax], 0
        je      .found

        inc     eax




        jmp     .byte1






.scan:




















        mov     ecx, [eax]
        mov     edx, [eax+4]




        lea     eax, [eax+8]


        lea     esi, [ecx-$01010101]




        lea     edi, [edx-$01010101]



        not     ecx


        not     edx


        and     esi, ecx
        and     edi, edx

        and     esi, $80808080
        and     edi, $80808080

        or      esi, edi
        jz      .scan



        sub     eax, 9



; byte 0 was found: so search by bytes.



.byteloop:
        lea     eax, [eax+1]
        cmp     byte [eax], 0
        jne     .byteloop

.found:
        sub     eax, [.hString]
        clc

        pop     edi edx ecx esi
        return


endp






; This procedure calculates the length of zero terminated string and "fixes" [string.len] field.
; StrFixLen should be call when the content of the string is created by call to external to StrLib







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>













|


>
>
>



>

<
<
<

<
|
<
|
<
|
|

<
|
|

|
<
<




<
<



|
>

>
>
|
>
>

|
|
|
|
>
>

>
>
>
>
|
|

|
>
>
>
>
|

>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
<

>
>
>
|

>
|
>
>
>
>
|
>

>
|
>
>
|

>
|
|

|
|

|
|

>
>
|

>
>
|
>
>
>
|
|
|
|

|
|
|
>
|
|
>
>

>







404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469



470

471

472

473
474
475

476
477
478
479


480
481
482
483


484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543

544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
proc StrDup, .hSource
begin
        stdcall StrNew
        stdcall StrCopy, eax, [.hSource]
        return
endp


proc StrDupMem, .ptrSource
begin
        pushf
        push    ecx edx esi edi
        cld

        mov     esi, [.ptrSource]

        stdcall StrNew
        mov     edx, eax

        mov     ecx, [.ptrSource]

.len:
        cmp     byte [ecx], 0
        lea     ecx, [ecx+1]
        jne     .len
        sub     ecx, esi
        dec     ecx

        lea     eax, [ecx+4]
        stdcall StrSetCapacity, edx, eax
        mov     edi, eax
        mov     [edi+string.len], ecx

        rep movsb
        xor     eax, eax
        stosd

        mov     eax, edx
        pop     edi esi edx ecx
        popf
        return
endp

;**************************************************************************
; Arguments:
;  hString - handle or pointer to the string (static or dynamic)
; Returns:
;   CF=0; eax = length of the string in bytes.
;   CF=1; eax = 0 in case, the handle of the string can't be found in the
;               string table or the pointer is NULL.
;
; If pointer is passed the the procedure, it should be dword aligned and
; all bytes of the string including zero terminator to be accessed on
; qword boundary. Although, the zero terminator can be single byte zero.
;
; The performance of the procedure is very high for pointers and
; instant for handles (the StrLib created string doesn't need any
; search, because the length is precomputed)
; The code depends on the options.DisableMMX option. If set to 1
; regular x86 code is generated, if not set ot set to 0, MMX code is generated.
; The MMX code is faster and smaller, so it is recommended.
;**************************************************************************

proc StrLen, .hString    ; proc StrLen [hString]
;.__info.codesize
begin



        mov     eax, [.hString]

        cmp     eax, [StrHandleOffs]

        jb      .pointer

        cmp     eax, [StrHandleEnd]
        jae     .pointer


        stdcall StrPtr, eax
        jc      .error

        mov     eax, [eax+string.len]


        return

.error:
        xor     eax, eax


        return

.pointer:

if defined options.DisableMMX & options.DisableMMX

; Regular x86 implementation, optimized by Alexander Yefremov and R22 (FASM forum)
            push    ebx ecx edx esi edi ebp

            mov     ebx, -01010101h
            mov     ebp, $80808080

    ; align on dword
    .byte1:
            test    eax, 3
            jz      .start_scan
            cmp     byte [eax], 0
            je      .found

            inc     eax

            test    eax, 3
            jz      .start_scan
            cmp     byte [eax], 0
            je      .found

            inc     eax

            test    eax, 3
            jz      .start_scan
            cmp     byte [eax], 0
            je      .found

            inc     eax

    .start_scan:
            lea     eax, [eax-8]

    .scan:
            lea     eax, [eax+8]

            mov     esi, [eax]
            mov     edi, [eax+4]

            lea     ecx, [esi+ebx]
            lea     edx, [edi+ebx]

            not     esi
            not     edi

            and     ecx, esi
            and     edx, edi

            and     ecx, ebp
            jnz     .bytesearch                   ; zero in the first dword
            and     edx, ebp
            jz      .scan

            lea     eax, [eax+4]
            mov     ecx, edx


    .bytesearch:
            bsf     ecx, ecx
            shr     ecx, 3
            add     eax, ecx

      .found:
            pop     ebp
            sub     eax, [.hString]
            clc
            pop     edi esi edx ecx ebx
            return

else    ; if MMX is not disabled by an explicit option.

; MMX implementation
            push    ecx

            pxor    mm1, mm1
            mov     ecx, eax

    .byte_loop:
            test    eax, $07
            jz      .inner

            cmp     byte [eax], 0
            je      .finish

            inc     eax
            jmp     .byte_loop

    .inner:
            movq    mm0, [ecx]
            add      ecx, 8

            pcmpeqb  mm0, mm1
            packsswb mm0, mm0

            movd     eax, mm0
            test     eax, eax
            jz       .inner

            bsf      eax, eax
            shr      eax, 2
            lea      eax, [ecx+eax-8]

    .finish:
            sub      eax, [.hString]

            emms
            pop     ecx
            return
end if

endp






; This procedure calculates the length of zero terminated string and "fixes" [string.len] field.
; StrFixLen should be call when the content of the string is created by call to external to StrLib
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511

512
513
514


515





516
517
518
519
520
521
522
523



524
525
526

527
528
529
530
531
532
533
534
535
536
537
538








539
540
541
542

543


544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568

569
570


571
572
573
574
575
576
577
578
579
580
581
582

583

584
585
586




















































































































































































































































































































































587
588
589
590
591
592
593
;***************************************************************************
; If the hString is larger than length - do nothing
; If the hString is smaller than length -> set the length of string to length
; returns pointer to the new (old) string
;
; Arguments:
;   hString - string handle. /not pointer!/
;   length - new string length.
; Returns:
;   eax: pointer to the string.
;   CF: error flag. If 1 the pointer to the string is returned, but
;       the capacity is not changed.
;***************************************************************************
proc StrSetCapacity, .hString, .capacity
begin
        push    ebx ecx esi

        mov     eax, [.hString]

        xor     eax, $c0000000

        test    eax, $c0000000
        jnz     .pointer



        mov     esi, eax






        mov     ebx, [ptrStrTable]
        cmp     esi, [ebx+TArray.count]
        jae     .pointer

        mov     eax, [ebx+TArray.array+4*esi]   ; pointer to the string.
        mov     ecx, [.capacity]




        cmp     [eax+sizeof.string+string.capacity], ecx
        jae     .sizeok


        add     ecx, sizeof.string+8
        and     cl,  $f8                ; align the size to 8 bytes

        stdcall ResizeMem, eax, ecx
        jc      .error

        lea     ecx, [ecx-(sizeof.string+1)]
        mov     [ebx+TArray.array+4*esi], eax
        mov     [eax+sizeof.string+string.capacity], ecx

.sizeok:
        add     eax, sizeof.string








        pop     esi ecx ebx
        return

.error:

        add     eax, sizeof.string


        stc
        pop     esi ecx ebx
        return

.pointer:
        xor     eax, $c0000000
        stc
        pop     esi ecx ebx
        return
endp


;***************************************************************************************
;  Copyes source to destination string.
;  Arguments:
;     source - destination string (handle only)
;     dest -  source string (handle or pointer)
;  Returs: nothing
;***************************************************************************************
proc StrCopy, .dest, .source
begin
        push    esi edi eax ecx

        stdcall StrLen, [.source]
        mov     ecx, eax

        stdcall StrSetCapacity, [.dest], ecx
        mov     edi, eax


        stdcall StrPtr, [.source]
        mov     esi, eax

        mov     [edi+string.len], ecx

        inc     ecx
        mov     eax, ecx
        shr     ecx, 2
        rep movsd
        mov     ecx, eax
        and     ecx, 3
        rep movsb



        pop     ecx eax edi esi
        return
endp























































































































































































































































































































































;***************************************************************************************
; Compares two strings - case sensitive.
; Returns CARRY = 1 if the strings are equal.
; Returns CARRY = 0 if the strings are different.







|







<
<


|
>
|
|

>
>

>
>
>
>
>







|
>
>
>



>
|





|





>
>
>
>
>
>
>
>




>

>
>

|
<

|
<

<





|

|
|
|







>


>
>












>

>



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







623
624
625
626
627
628
629
630
631
632
633
634
635
636
637


638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697

698
699

700

701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
;***************************************************************************
; If the hString is larger than length - do nothing
; If the hString is smaller than length -> set the length of string to length
; returns pointer to the new (old) string
;
; Arguments:
;   hString - string handle. /not pointer!/
;   capacity - new string length.
; Returns:
;   eax: pointer to the string.
;   CF: error flag. If 1 the pointer to the string is returned, but
;       the capacity is not changed.
;***************************************************************************
proc StrSetCapacity, .hString, .capacity
begin


        mov     eax, [.hString]

        cmp     eax, [StrHandleOffs]
        jb      .error0
        cmp     eax, [StrHandleEnd]
        jae     .error0

        push    ebx ecx esi

        mov     esi, eax
        sub     esi, [StrHandleOffs]

  if options.Threads
        stdcall WaitForMutex, StrMutex, -1
  end if

        mov     ebx, [ptrStrTable]
        cmp     esi, [ebx+TArray.count]
        jae     .pointer

        mov     eax, [ebx+TArray.array+4*esi]   ; pointer to the string.
        mov     ecx, [.capacity]
        cmp     ecx, STR_MINSTRLEN
        jge     @f
        mov     ecx, STR_MINSTRLEN
@@:
        cmp     [eax+sizeof.string+string.capacity], ecx
        jae     .sizeok

        shl     ecx, 1
        add     ecx, sizeof.string+4+7
        and     cl,  $f8                ; align the size to 8 bytes

        stdcall ResizeMem, eax, ecx
        jc      .error

        lea     ecx, [ecx-(sizeof.string+4)]
        mov     [ebx+TArray.array+4*esi], eax
        mov     [eax+sizeof.string+string.capacity], ecx

.sizeok:
        add     eax, sizeof.string
        clc

.finish:

  if options.Threads
        stdcall MutexRelease, StrMutex
  end if

        pop     esi ecx ebx
        return

.error:
        int3
        add     eax, sizeof.string

.pointer:
        stc
        jmp     .finish


.error0:

        stc

        return
endp


;***************************************************************************************
;  Copies source to destination string.
;  Arguments:
;     dest - destination string (handle only)
;     source -  source string (handle or pointer)
;  Returns: nothing
;***************************************************************************************
proc StrCopy, .dest, .source
begin
        push    esi edi eax ecx

        stdcall StrLen, [.source]
        mov     ecx, eax

        stdcall StrSetCapacity, [.dest], ecx
        mov     edi, eax
        jc      .finish

        stdcall StrPtr, [.source]
        mov     esi, eax

        mov     [edi+string.len], ecx

        inc     ecx
        mov     eax, ecx
        shr     ecx, 2
        rep movsd
        mov     ecx, eax
        and     ecx, 3
        rep movsb
        clc

.finish:
        pop     ecx eax edi esi
        return
endp



proc CharLCase, .char
begin
        mov     eax, [.char]
        cmp     eax, 'A'
        jb      .end
        cmp     eax, 'Z'
        ja      .end

        add     eax, 'a'-'A'
.end:
        return
endp


;***************************************************************************************
; proc StrMatchPattern
;
; Provides pattern matching of the [.pattern] in the [.string].
; Returns CF=1 if the pattern MATCH
;         CF=0 if the pattern DOES NOT MATCH
;
; In the pattern, "*" char match 0 or more characters and "?" char match
; exactly 1 character. If the characters "*" and "?" have to be directly matched
; they can be escaped with "\". "\\" escapes the backslash itself. If the backslash
; is located at the end of the pattern, it is treated as a normal character.
;
; If a character between "@" and "_" is escaped, a controll code is generated equal
; to the ascii code of the char - $40.
;
;***************************************************************************************
; StrMatchPattern.__info.codesize

proc StrMatchPattern, .pattern, .string
begin
        pushad

        stdcall StrPtr, [.pattern]
        mov     esi, eax

        stdcall StrPtr, [.string]
        mov     edi, eax

        xor     ecx, ecx

.main_loop:
        mov     ah, [edi]       ; from the string
        inc     edi

.main_loop2:
        mov     al, [esi]       ; from the pattern
        inc     esi

        test    al, al
        jz      .eo_pattern

        cmp     al, '*'
        jne     .not_star

        mov     ecx, esi        ; the address after the star.
        mov     ebx, edi
        jmp     .main_loop2

.not_star:
        test    ah, ah
        jz      .not_match    ; the string ended, but the pattern not.

        cmp     al, '?'
        je      .main_loop

        cmp     al, '\'
        jne     .compare

        cmp     byte [esi], 0
        je      .compare

        mov     al, [esi]
        inc     esi

        cmp     al, $40
        jb      .compare
        cmp     al, $60
        jae     .compare

        sub     al, $40         ; the control codes escaped.

.compare:
        cmp     al, ah
        je      .main_loop

        jecxz   .not_match

.char_ne:
        mov     edi, ebx
        mov     esi, ecx
        inc     ebx
        jmp     .main_loop

.eo_pattern:
        test    ah, ah
        jz      .match

        jecxz   .not_match

        cmp     byte [ecx], 0
        jne     .char_ne

.match:
        stc
        popad
        return

.not_match:
        stdcall StrPtr, [.string]
        sub     edi, eax
        dec     edi
        mov     [esp+4*regEAX], edi     ; where not matches...

        clc
        popad
        return
endp



;***************************************************************************************
; proc StrMatchPattern
;
; Provides pattern matching of the [.pattern] in the [.string].
; Returns CF=1 if the pattern MATCH
;         CF=0 if the pattern DOES NOT MATCH
;
; In the pattern, "*" char match 0 or more characters and "?" char match
; exactly 1 character. If the characters "*" and "?" have to be directly matched
; they can be escaped with "\". "\\" escapes the backslash itself. If the backslash
; is located at the end of the pattern, it is treated as a normal character.
;
; If a character between "@" and "_" is escaped, a controll code is generated equal
; to the ascii code of the char - $40.
;
;***************************************************************************************
; StrMatchPattern.__info.codesize

proc StrMatchPatternNoCase, .pattern, .string
begin
        pushad

        stdcall StrPtr, [.pattern]
        mov     esi, eax

        stdcall StrPtr, [.string]
        mov     edi, eax

        xor     ecx, ecx

.main_loop:
        mov     ah, [edi]       ; from the string
        inc     edi

.main_loop2:
        mov     al, [esi]       ; from the pattern
        inc     esi

        test    al, al
        jz      .eo_pattern

        cmp     al, '*'
        jne     .not_star

        mov     ecx, esi        ; the address after the star.
        mov     ebx, edi
        jmp     .main_loop2

.not_star:
        test    ah, ah
        jz      .not_match    ; the string ended, but the pattern not.

        cmp     al, '?'
        je      .main_loop

        cmp     al, '\'
        jne     .compare

        cmp     byte [esi], 0
        je      .compare

        mov     al, [esi]
        inc     esi

        cmp     al, $40
        jb      .compare
        cmp     al, $60
        jae     .compare

        sub     al, $40         ; the control codes escaped.

.compare:
        cmp     al, 'A'
        jb      .compare2
        cmp     al, 'Z'
        ja      .compare2

        or      al, $20

.compare2:
        cmp     ah, 'A'
        jb      .compare3
        cmp     ah, 'Z'
        ja      .compare3

        or      ah, $20

.compare3:
        cmp     al, ah
        je      .main_loop

        jecxz   .not_match

.char_ne:
        mov     edi, ebx
        mov     esi, ecx
        inc     ebx
        jmp     .main_loop

.eo_pattern:
        test    ah, ah
        jz      .match

        jecxz   .not_match

        cmp     byte [ecx], 0
        jne     .char_ne

.match:
        stc
        popad
        return

.not_match:
        stdcall StrPtr, [.string]
        sub     edi, eax
        dec     edi
        mov     [esp+4*regEAX], edi     ; where not matches...

        clc
        popad
        return
endp



; Use this procedure as callback for SortArray procedure for arrays of strings.

proc StrCompSort, .ppStr1, .ppStr2, .fCaseSensitive
begin
        push    eax edx

        mov     eax, [.ppStr1]
        mov     edx, [.ppStr2]

        stdcall StrCompSort2, [eax], [edx], [.fCaseSensitive]
        shl     eax, 1

        pop     edx eax
        return
endp


;***************************************************************************************
; Compares two strings for greater, equal or less.
; Returns eax = 0 if the strings are equal.
;         eax = 1 if .str1 is grater than .str2
;         eax = -1 if .str1 is less than .str2
;***************************************************************************************
proc StrCompSort2, .str1, .str2, .fCaseSensitive
begin
        push    ebx ecx edx esi edi

        mov     eax, [.str1]
        mov     ecx, [.str2]

        cmp     eax, ecx
        je      .equal

        stdcall StrPtr, [.str1]
        mov     esi,eax
        stdcall StrPtr, [.str2]
        mov     edi,eax


.cmp_loop:
        stdcall DecodeUtf8, [esi]
        add     esi, edx
        cmp     [.fCaseSensitive], 0
        jne     @f
        stdcall CharLCase, eax
@@:
        mov     ecx, eax

        stdcall DecodeUtf8, [edi]
        add     edi, edx
        cmp     [.fCaseSensitive], 0
        jne     @f
        stdcall CharLCase, eax
@@:
        test    ecx, ecx
        jz      .endstr
        test    eax, eax
        jz      .endstr

        cmp     ecx, eax
        je      .cmp_loop

        ja      .greater
        jmp     .less

.endstr:
        cmp     ecx, eax
        ja      .greater
        jb      .less

.equal:
        xor     eax, eax

.finish:
        pop     edi esi edx ecx ebx
        return

.greater:
        mov     eax, 1
        jmp     .finish

.less:
        mov     eax, -1
        jmp     .finish
endp





;***************************************************************************************
; Compares two strings - case sensitive.
; Returns CARRY = 1 if the strings are equal.
; Returns CARRY = 0 if the strings are different.
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635

        stdcall StrPtr, [.str1]
        mov     esi,eax
        stdcall StrPtr, [.str2]
        mov     edi,eax

        mov     eax, ecx
        and     cl, $fc
        repe cmpsd
        jne     .noteq
        mov     ecx, eax
        and     ecx, 3
        repe cmpsb
        jne     .noteq








|







1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129

        stdcall StrPtr, [.str1]
        mov     esi,eax
        stdcall StrPtr, [.str2]
        mov     edi,eax

        mov     eax, ecx
        shr     ecx, 2
        repe cmpsd
        jne     .noteq
        mov     ecx, eax
        and     ecx, 3
        repe cmpsb
        jne     .noteq

756
757
758
759
760
761
762
763









764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791






































792







793
794
795
796
797
798
799
800
801


802

803
804




805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837

        mov     eax, [esi]
        test    eax, eax
        jnz     @f
        stdcall StrNew
@@:
        mov     [esi], eax
        stdcall StrCopy, eax, [.ptrSource]









        pop     esi eax
        return
endp


;**********************************************************************************
; StrCat appends one string to another
; Arguments:
;   dest - destination string (handle only)
;   source - source string
;**********************************************************************************
proc StrCat, .dest, .source
begin
        push    eax ebx ecx esi edi

        stdcall StrLen, [.dest]
        mov     ebx,eax                 ; store dest length in ebx

        stdcall StrLen, [.source]
        mov     esi, eax
        lea     ecx, [eax+ebx]

        stdcall StrSetCapacity, [.dest], ecx

        mov     [eax+string.len], ecx
        lea     edi, [eax+ebx]

        stdcall StrPtr, [.source]






































        lea     ecx, [esi+1]







        mov     esi, eax

        mov     ebx, ecx
        shr     ecx, 2
        rep movsd
        mov     ecx, ebx
        and     ecx, 3
        rep movsb



        pop     edi esi ecx ebx eax

        return
endp






;**********************************************************************************
; StrCharPos returns a pointer to the first occurence of a given char
;   in specified string
; Arguments:
;   Char - char to look for
;   hString -  string to search
; Returns: a pointer to the char in source, or NULL if char doesn't occur
;   in given string
;**********************************************************************************
proc StrCharPos, .hString, .char
begin
        push    esi

        stdcall StrPtr, [.hString]
        mov     esi,eax

        mov     eax, [.char]
        xchg    al,ah

.search:
        mov     al,[esi]
        inc     esi
        or      al,al
        je      .not_found
        cmp     al,ah
        jne     .search

        mov     eax, esi
        dec     eax
        pop     esi
        return







|
>
>
>
>
>
>
>
>
>













|














>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
|








>
>
|
>


>
>
>
>


















|
|





|







1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392

        mov     eax, [esi]
        test    eax, eax
        jnz     @f
        stdcall StrNew
@@:
        mov     [esi], eax
        stdcall StrPtr, eax
        mov     dword [eax], 0
        mov     [eax+string.len], 0

        cmp     [.ptrSource], 0
        je      .finish

        stdcall StrCopy, [esi], [.ptrSource]

.finish:
        pop     esi eax
        return
endp


;**********************************************************************************
; StrCat appends one string to another
; Arguments:
;   dest - destination string (handle only)
;   source - source string
;**********************************************************************************
proc StrCat, .dest, .source
begin
        pushad

        stdcall StrLen, [.dest]
        mov     ebx,eax                 ; store dest length in ebx

        stdcall StrLen, [.source]
        mov     esi, eax
        lea     ecx, [eax+ebx]

        stdcall StrSetCapacity, [.dest], ecx

        mov     [eax+string.len], ecx
        lea     edi, [eax+ebx]

        stdcall StrPtr, [.source]
        mov     ecx, esi
        mov     esi, eax

        mov     ebx, ecx
        shr     ecx, 2
        rep movsd
        mov     ecx, ebx
        and     ecx, 3
        rep movsb

        xor     eax, eax
        stosd

        popad
        return
endp



;**********************************************************************************
; StrCat appends string from memory buffer, specified by its address and length to
; destination string (handle)
;
; Arguments:
;   dest - destination string (handle only)
;   psource - source memory buffer
;   length  - the length in bytes of the source string.
;
;**********************************************************************************

proc StrCatMem, .dest, .psource, .length
begin
        pushad

        stdcall StrLen, [.dest]
        mov     ebx,eax                 ; store dest length in ebx

        mov     esi, [.length]
        lea     ecx, [esi+ebx]

        stdcall StrSetCapacity, [.dest], ecx

        mov     [eax+string.len], ecx
        lea     edi, [eax+ebx]

        mov     ecx, esi
        mov     esi, [.psource]

        mov     ebx, ecx
        shr     ecx, 2
        rep movsd
        mov     ecx, ebx
        and     ecx, 3
        rep movsb

        xor     eax, eax
        stosd

        popad
        return
endp






;**********************************************************************************
; StrCharPos returns a pointer to the first occurence of a given char
;   in specified string
; Arguments:
;   Char - char to look for
;   hString -  string to search
; Returns: a pointer to the char in source, or NULL if char doesn't occur
;   in given string
;**********************************************************************************
proc StrCharPos, .hString, .char
begin
        push    esi

        stdcall StrPtr, [.hString]
        mov     esi,eax

        mov     ah, byte [.char]
;        xchg    al,ah

.search:
        mov     al,[esi]
        inc     esi
        or      al,al
        jz      .not_found
        cmp     al,ah
        jne     .search

        mov     eax, esi
        dec     eax
        pop     esi
        return
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
        mov     ebx,edx                 ; put str_len(pattern)-1 in ebx
        dec     ebx                     ;
        sub     ecx, ebx                ; there is no need to search to the end, but only to len(string)-len(pattern)-1

.search:
        repne   scasb
        jne     .not_found
        cmp     ecx,ebx
        jb      .not_found
        push    edi esi ecx
        or      ebx,ebx                 ; ebx==0 means that we were searching for one
        jz      .got_it                 ; character. We found it, so we stop.
        mov     ecx,ebx
        repe    cmpsb
        jne     .not_match








|
|







1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
        mov     ebx,edx                 ; put str_len(pattern)-1 in ebx
        dec     ebx                     ;
        sub     ecx, ebx                ; there is no need to search to the end, but only to len(string)-len(pattern)-1

.search:
        repne   scasb
        jne     .not_found
;        cmp     ecx,ebx
;        jb      .not_found
        push    edi esi ecx
        or      ebx,ebx                 ; ebx==0 means that we were searching for one
        jz      .got_it                 ; character. We found it, so we stop.
        mov     ecx,ebx
        repe    cmpsb
        jne     .not_match

907
908
909
910
911
912
913
914
915
916
917

918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944

945
946
947
948
949
950
951
952
953
954


955


956






957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975















976
977
978
979
980
981
982
983
984
985
986
987
988
989




990
991
992










993
994


995
996


997
998
999
1000
1001
1002
1003
1004
1005



1006

1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029

1030
1031

1032
1033
1034

1035
1036
1037
1038
1039









































































1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055

1056
1057

1058

1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082





proc StrCopyPart, .dest, .source, .pos, .len
begin
        push    eax ecx esi edi

        stdcall StrPtr, [.source]
        mov     esi, eax

        stdcall StrLen, [.source]
        mov     ecx, eax

        mov     eax, [.pos]
        cmp     eax, ecx
        jae     .finish

        sub     ecx, [.pos]
        mov     eax, [.len]

; ecx = min(ecx, eax)
        sub     eax, ecx
        sbb     edi, edi
        and     edi, eax
        add     ecx, edi

        add     esi, [.pos]

        stdcall StrSetCapacity, [.dest], ecx
        jc      .finish

        mov     edi, eax
        mov     [edi+string.len], ecx

        push    ecx
        shr     ecx, 2
        rep movsd

        pop     ecx
        and     ecx, 3
        rep movsb

        lea     ecx, [edi+3]
        and     cl, $fc
        sub     ecx, edi
        xor     eax, eax
        rep stosb



.finish:


        pop     edi esi ecx eax






        return
endp




;**********************************************************************************
; StrExtract copies the part of [string] from [index] with lenght in [len]
; Returns handle to new created string.
;**********************************************************************************
proc StrExtract, .string, .pos, .len
begin
        stdcall StrNew
        stdcall StrCopyPart, eax, [.string], [.pos], [.len]
        return
endp



















;__________________________________________________________________________________
; Splits the string on two strings, at position [.pos]
; Arguments:
;   .pString - pointer to string to be splitted.
;   .pos     - position where to split the string.
; Returns:
;   eax - handle to the new created string with second part of the string.
;         the original string does not reallocate memory and it's capacity
;         and the pointer will remains the same.
;__________________________________________________________________________________

proc StrSplit, .hString, .pos
begin




        push    ecx edi

        stdcall StrExtract, [.hString], [.pos], -1










        push    eax



        stdcall StrLen, eax
        mov     ecx, eax


        stdcall StrPtr, [.hString]

        sub     [eax+string.len], ecx   ; new length of the source string.
        add     eax, [eax+string.len]
        mov     edi, eax

        lea     ecx, [eax+3]
        and     cl, $fc
        sub     ecx, eax



        xor     eax, eax

        rep stosb

        pop     eax
        pop     edi ecx
        return
endp





;__________________________________________________________________________________
; StrInsert inserts one string into another at specified pos
; Arguments:
;   dest - destination where the source will be inserted.
;   source -  string to insert
;   pos    - where to insert.
; Returns:
;   nothing.
;__________________________________________________________________________________
proc StrInsert, .dest, .source, .pos
begin
        push    eax

        stdcall StrSplit, [.dest], [.pos]
        push    eax eax

        stdcall StrCat, [.dest], [.source]
        stdcall StrCat, [.dest] ; source from the stack.
        stdcall StrDel; from the stack.

        pop     eax
        return
endp













































































;**********************************************************************************
; Converts strings to Lower Case
;**********************************************************************************
proc StrLCase, .hString
begin
        push    eax ebx ecx edx edi

        stdcall StrPtr, [.hString]
        mov     edi, eax

        stdcall StrLen, [.hString]
        mov     ecx, eax
        mov     ebx, edi


        and     ebx, 3
        sub     ecx, ebx

        jbe     .byte2          ; the string is small enough, so process it by bytes.


.byte1:
        test    edi, 3
        jz      .ddword

        mov     al, [edi]
        and     al, $40
        shr     al, 1
        or      byte [edi], al

        inc     edi
        jmp     .byte1

.ddword:
        mov     ebx, ecx
        and     ebx, 3
        shr     ecx, 2
        jecxz   .byte

.qword:
        mov     eax, [edi]
        mov     edx, [edi+4]

        and     eax, $40404040







|



>



<
<
<
<

|

|
|
<
<
|












>




<
<
<

|

>
>

>
>
|
>
>
>
>
>
>



















>
>
>
>
>
>
>
>
>
>
>
>
>
>
>














>
>
>
>
|

|
>
>
>
>
>
>
>
>
>
>
|

>
>
|
|
>
>


|
|





>
>
>

>


|
|


<
<















>


>



>





>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
















>
|
|
>
|
>


|












|
|







1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476




1477
1478
1479
1480
1481


1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499



1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607


1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754





proc StrCopyPart, .dest, .source, .pos, .len
begin
        pushad

        stdcall StrPtr, [.source]
        mov     esi, eax

        stdcall StrLen, [.source]
        mov     ecx, eax





        sub     ecx, [.pos]
        jc      .cleardest

; ecx = min(ecx, [.len])
        cmp     ecx, [.len]


        cmova   ecx, [.len]

        add     esi, [.pos]

        stdcall StrSetCapacity, [.dest], ecx
        jc      .finish

        mov     edi, eax
        mov     [edi+string.len], ecx

        push    ecx
        shr     ecx, 2
        rep movsd

        pop     ecx
        and     ecx, 3
        rep movsb




        xor     eax, eax
        stosd

        clc

.finish:
        popad
        return

.cleardest:
        stdcall StrSetCapacity, [.dest], STR_MINSTRLEN
        mov     [eax+string.len], 0
        mov     dword [eax], 0
        clc
        popad
        return
endp




;**********************************************************************************
; StrExtract copies the part of [string] from [index] with lenght in [len]
; Returns handle to new created string.
;**********************************************************************************
proc StrExtract, .string, .pos, .len
begin
        stdcall StrNew
        stdcall StrCopyPart, eax, [.string], [.pos], [.len]
        return
endp




proc StrExtractMem, .pMem, .ofs, .len
begin
        push    [.len]
        mov     eax, [.pMem]
        add     eax, [.ofs]
        push    eax

        stdcall StrNew
        stdcall StrCatMem, eax ; remaining arguments from the stack.
        return
endp




;__________________________________________________________________________________
; Splits the string on two strings, at position [.pos]
; Arguments:
;   .pString - pointer to string to be splitted.
;   .pos     - position where to split the string.
; Returns:
;   eax - handle to the new created string with second part of the string.
;         the original string does not reallocate memory and it's capacity
;         and the pointer will remains the same.
;__________________________________________________________________________________

proc StrSplit, .hString, .pos
begin
        stdcall StrExtract, [.hString], [.pos], -1
        stdcall StrTrim, [.hString], [.pos]
        return
endp




;__________________________________________________________________________________
; Trims the string at position [.pos]
; Arguments:
;   .pString - pointer to string to be splitted.
;   .pos     - position where to split the string.
; Returns:   nothing.
;__________________________________________________________________________________
proc StrTrim, .hString, .pos
begin
        push    eax ecx edi

        mov     ecx, [.pos]

        stdcall StrLen, [.hString]
        cmp     eax, ecx
        jbe     .endtrim

        stdcall StrPtr, [.hString]

        mov     [eax+string.len], ecx   ; new length of the source string.
        add     eax, ecx
        mov     edi, eax

        lea     ecx, [eax+3]
        and     cl, $fc
        sub     ecx, eax
        jnz     @f
        inc     ecx
@@:
        xor     eax, eax
        cld
        rep stosb

.endtrim:
        pop     edi ecx eax
        return
endp





;__________________________________________________________________________________
; StrInsert inserts one string into another at specified pos
; Arguments:
;   dest - destination where the source will be inserted.
;   source -  string to insert
;   pos    - where to insert.
; Returns:
;   nothing.
;__________________________________________________________________________________
proc StrInsert, .dest, .source, .pos
begin
        push    eax

        stdcall StrSplit, [.dest], [.pos]
        push    eax eax

        stdcall StrCat, [.dest], [.source]
        stdcall StrCat, [.dest] ; source from the stack.
        stdcall StrDel; from the stack.

        pop     eax
        return
endp


; TODO:
; String case functions are giving weird results in linux, so
; here are two functons I wrote some time ago.
; I have tested the following functions in win32 and worked well
; Perhaps it is time to fully support UTF encoded strings.
; These functions here are faster (20-25%), but the results are
; exactly the same as the strlib ones.
;                                    pelaillo

; -----------------------------------------------
; str_ucase:
;         Author: pelaillo
;           Date: Jan. 16, 2002
;    Converts also accented characters: ÑÚ <--> ñú
; -----------------------------------------------

proc StrUCase2, .hString
begin
        push    eax edx edi

        stdcall StrPtr, [.hString]
        mov     edi, eax
.str_ucase:
                mov     eax, [edi]
                mov     edx, eax
                and     edx, 40404040h
                ror     edx, 1
                xor     edx, -1
                and     eax, edx
                mov     [edi], eax
                add     edi, 4
                lea     edx, [eax-01010101h]
                xor     eax, edx
                and     eax, 80808080h
                jz      .str_ucase
                and     eax, edx
                jz      .str_ucase

        pop     edi edx eax
        return
endp

; -----------------------------------------------
; str_lcase:
;         Author: pelaillo
;           Date: Jan. 16, 2002
;    Converts also accented characters: ÑÚ <--> ñú
; -----------------------------------------------

proc StrLCase2, .hString
begin
        push    eax edx edi

        stdcall StrPtr, [.hString]
        mov     edi, eax
.str_lcase:
        mov     eax, [edi]
        mov     edx, eax
        and     edx, 40404040h
        ror     edx, 1
        or      eax, edx
        mov     [edi], eax
        add     edi, 4
        lea     edx, [eax-01010101h]
        xor     eax, edx
        and     eax, 80808080h
        jz      .str_lcase
        and     eax, edx
        jz      .str_lcase

        pop     edi edx eax
        return
endp


;**********************************************************************************
; Converts strings to Lower Case
;**********************************************************************************
proc StrLCase, .hString
begin
        push    eax ebx ecx edx edi

        stdcall StrPtr, [.hString]
        mov     edi, eax

        stdcall StrLen, [.hString]
        mov     ecx, eax
        mov     ebx, edi

        add     ebx, 7
        and     ebx, $fffffff8
        sub     ebx, edi
        jz      .ddword

        sub     ecx, ebx

.byte1:
        test    edi, 7
        jz      .ddword

        mov     al, [edi]
        and     al, $40
        shr     al, 1
        or      byte [edi], al

        inc     edi
        jmp     .byte1

.ddword:
        mov     ebx, ecx
        and     ebx, 7
        shr     ecx, 3
        jecxz   .byte

.qword:
        mov     eax, [edi]
        mov     edx, [edi+4]

        and     eax, $40404040
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
; index - Offset in string where to put converted number.
; flags:
;   byte 0 - number of digits if ntsFixedWidth is set.
;   byte 1 - contains radix for the convertion.
;   byte 2,3 - flags.
; Returns:
;   eax - handle of the string.
;   edx - pointer to the string.
;***********************************************************
proc NumToStr, .num, .flags
begin
        push    ebx ecx edx esi edi

        stdcall StrNew
        push    eax







<







1965
1966
1967
1968
1969
1970
1971

1972
1973
1974
1975
1976
1977
1978
; index - Offset in string where to put converted number.
; flags:
;   byte 0 - number of digits if ntsFixedWidth is set.
;   byte 1 - contains radix for the convertion.
;   byte 2,3 - flags.
; Returns:
;   eax - handle of the string.

;***********************************************************
proc NumToStr, .num, .flags
begin
        push    ebx ecx edx esi edi

        stdcall StrNew
        push    eax
1331
1332
1333
1334
1335
1336
1337







































































































































































































1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350

1351
1352
1353
1354
1355
1356
1357
1358
1359
1360

1361
1362
1363
1364
1365
1366
1367

.NumToStrFunc dd _NumToStr, _NumToStrU, _NumToStrF, _NumToStrUF

endp











































































































































































































;-------------------------------------------------------
; function StrToNum
;   Converts specified string into a number
;
; Arguments:
;   hString - handle/pointer of the string containing
;     number to convert. It doesn't have to be ended by
;     NULL, any other character will stop conversion.
;     Number to convert must be decimal.
;
; Return:
;   eax - converted number

;
; Note: in case of failture (first char of given pointer
;   isn't a number) function returns -1.
;-------------------------------------------------------
proc StrToNum, .hString
begin
        push    ebx edx esi
        xor     ebx,ebx         ; ebx will store our number

        stdcall StrPtr, [.hString]

        mov     esi,eax
        xor     eax,eax
        mov     al,[esi]
        cmp     al,'0'
        jb      .error
        cmp     al,'9'
        jbe     .digit







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>













>






|



>







2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239

.NumToStrFunc dd _NumToStr, _NumToStrU, _NumToStrF, _NumToStrUF

endp




;**********************************************************************************
; _NumToStr64 converts the number in esi:ebx to the string in any radix approx. [2..26]
; Arguments:
;   [edi] - pointer to the string buffer
;   ecx - radix
;   esi:ebx - number to convert.
; There is no parameter check, so be careful.
; returns: edi points to the end of a converted number
;**********************************************************************************
proc _NumToStr64
begin
    test  esi, esi
    jns   _NumToStrU64
    not   ebx
    not   esi
    add   ebx, 1
    adc   esi, 0
    mov   byte [edi],"-"
    inc   edi
endp

proc _NumToStrU64
begin
    xor   edx,edx
    test  esi, esi
    jz    .low
    mov   eax, esi      ; high order
    div   ecx
    mov   esi, eax
.low:
    mov   eax, ebx      ; low order
    test  edx, edx
    jnz   .cont
    cmp   eax, ecx
    jb    .lessA
.cont:
    div   ecx
    mov   ebx, eax
    push  edx
    call  _NumToStrU64
    pop   eax
.lessA:
    cmp   al, 10
    sbb   al, 69h
    das
    stosb
    return
endp



;*****************************************************
; NumToStrF64:
;   Converts signed integer value to string.
; NumToStrUF64:
;   Converts unsigned integer value to string.
;
; edi - pointer to string buffer
; esi:ebx - Number to convert
; ecx - radix from 2 to $ff
; edx - length of the number in chars
;
; returns: edi - pointer to the end of converted num
;
; Note: Don't use 1 as radix.
;*****************************************************
proc _NumToStrF64
begin
        test    esi,esi
        jns     _NumToStrUF64
        not     ebx
        not     esi
        add     ebx, 1
        adc     esi, 0
        mov     byte [edi],'-'
        inc     edi
endp


proc _NumToStrUF64
begin
        dec     edi
        push    edi
        add     edi, edx
        push    edi

.loopc:
        xor     edx,edx
        mov     eax, esi
        div     ecx
        mov     esi, eax
        mov     eax, ebx
        div     ecx
        mov     ebx, eax

        mov     al, dl
        cmp     al,$0a
        sbb     al,$69
        das
        mov     [edi],al
        dec     edi
        cmp     edi, [esp+4]
        jne     .loopc
        pop     edi
        pop     edx
        sub     edx, edi
        inc     edi
        neg     edx
        return
endp



proc NumToStr64, .low, .high, .flags
begin
        pushad

        stdcall StrNew
        mov     [esp+4*regEAX], eax

        stdcall StrSetCapacity, eax, 80
        mov     edi, eax
        push    eax             ; pointer for the length.

; determine which conversion func to use
        movzx   eax, byte [.flags+2]    ; signed/fixed
        and     eax, (ntsUnsigned or ntsFixedWidth) shr 16
        mov     eax, [.NumToStrFunc+4*eax]

        movzx   ecx, byte [.flags+1]       ; load radix into ecx
        movzx   edx, byte [.flags]         ; digit number
        mov     ebx, [.low]
        mov     esi, [.high]

        call    eax                        ; call low-level convertion routine
        mov     dword [edi], 0

        pop     eax
        sub     edi, eax
        mov     [eax+string.len], edi

        popad
        return

.NumToStrFunc dd _NumToStr64, _NumToStrU64, _NumToStrF64, _NumToStrUF64

endp



proc StrInsertDecimalPoint, .hString, .digits
begin
        pushad

        stdcall StrNew
        mov     ebx, eax

        stdcall StrLen, [.hString]
        mov     ecx, eax

        stdcall StrPtr, [.hString]
        mov     esi, eax
        cmp     byte [esi], '-'
        jne     .sign_ok

        stdcall StrCharCat, ebx, '-'
        dec     ecx
        inc     esi

.sign_ok:
        sub     ecx, [.digits]
        jg      .len_ok

        neg     ecx
        inc     ecx

.zero_loop:
        stdcall StrCharCat, ebx, '0'
        dec     ecx
        jnz     .zero_loop

.len_ok:
        stdcall StrCat, ebx, esi

        stdcall StrLen, ebx
        sub     eax, [.digits]
        cmp     [.digits], 0
        je      @f
        stdcall StrCharInsert, ebx, '.', eax
@@:
        stdcall StrCopy, [.hString], ebx
        stdcall StrDel, ebx

        popad
        return
endp



;-------------------------------------------------------
; function StrToNum
;   Converts specified string into a number
;
; Arguments:
;   hString - handle/pointer of the string containing
;     number to convert. It doesn't have to be ended by
;     NULL, any other character will stop conversion.
;     Number to convert must be decimal.
;
; Return:
;   eax - converted number
;   edx - offset to the byte where convertion ended.
;
; Note: in case of failture (first char of given pointer
;   isn't a number) function returns -1.
;-------------------------------------------------------
proc StrToNum, .hString
begin
        push    ebx esi edi
        xor     ebx,ebx         ; ebx will store our number

        stdcall StrPtr, [.hString]
        mov     edi, eax
        mov     esi,eax
        xor     eax,eax
        mov     al,[esi]
        cmp     al,'0'
        jb      .error
        cmp     al,'9'
        jbe     .digit
1377
1378
1379
1380
1381
1382
1383

1384



1385
1386
1387
1388






























































































1389























1390





1391


















1392
1393







1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413



1414
1415
1416
1417
1418
1419
1420
        ja      .finish
        mov     edx,ebx         ; multiply ebx by 10
        shl     ebx,3
        add     ebx,edx
        add     ebx,edx
        jmp     .digit
     .finish:

        mov     eax,ebx



        pop     esi edx ebx
        return

     .error:






























































































        xor     eax,eax























        dec     eax





        pop     esi edx ebx


















        return
endp








;-------------------------------------------------------
; function StrCharCat
;   Appends up to 4 chard at the end of the string.
;
; Arguments:
;   hString - string to append
;   char - char(s) to add
; Returns:
;   nothing
;-------------------------------------------------------
proc StrCharCat, .hString, .char
begin
        push    eax ecx

        stdcall StrLen, [.hString]
        mov     ecx, eax
        add     eax, 8

        stdcall StrSetCapacity, [.hString], eax




        pushd   [.char]
        popd    [eax+ecx]
        mov     dword [eax+ecx+4], 0
        dec     ecx
.goend:
        inc     ecx







>
|
>
>
>
|



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


>
>
>
>
>
>
>




















>
>
>







2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
        ja      .finish
        mov     edx,ebx         ; multiply ebx by 10
        shl     ebx,3
        add     ebx,edx
        add     ebx,edx
        jmp     .digit
     .finish:

        mov     eax, ebx
        mov     edx, esi
        sub     edx, edi
        clc
        pop     edi esi ebx
        return

     .error:
        mov     eax, -1
        stc
        pop     edi esi ebx
        return
endp



; Converts a string to dword integer, using FASM number formats.
; Return:
;   CF=0; eax = converted number
;   CF=1; eax = 0 on invalid number

proc StrToNumEx, .hstring
.sign dd ?
begin
        push    ebx edx esi edi

        stdcall StrPtr, [.hstring]
        test    eax, eax
        jz      .finish

        mov     esi, eax
        mov     edi, eax

; search the end:
.end_loop:
        lodsb
        test    al, al
        jz      .end_found

        cmp     al, '$'
        je      .end_loop
        cmp     al, '-'
        je      .end_loop

        cmp     al, '0'
        jb      .end_found
        cmp     al, '9'
        jbe     .end_loop
        cmp     al, '@'
        ja      .end_loop

.end_found:
        dec     esi
        xchg    esi, edi
        cmp     esi, edi
        je      .invalid_number

; sign?
        mov     [.sign], 0
        cmp     byte [esi], '-'
        jne     .radix

        mov     [.sign], -1
        inc     esi

; determine what is the radix.
.radix:
        cmp     byte [esi], '$'
        je      .hex
        cmp     word [esi], '0x'
        jne     .postfix
        inc     esi
.hex:
        inc     esi
        mov     edx, 16
        jmp     .decode

.postfix:
; search for 'h' or 'b' or 'o'
        mov     al, [edi-1]
        or      al, $20

        mov     edx, 16
        cmp     al, 'h'
        je      .postok

        mov     edx, 8
        cmp     al, 'o'
        je      .postok

        mov     edx, 2
        cmp     al, 'b'
        je      .postok

        mov     edx, 10
        inc     edi

.postok:
        dec     edi

; here, edx contains the radix, esi - begin of the number; edi - end of the number.
.decode:
        xor     ebx, ebx
        cmp     esi, edi
        jae     .invalid_number

.decode_loop:
        lodsb

        cmp     al, '0'
        jb      .invalid_number
        cmp     al, '9'
        jbe     .digit

        or      al, $20
        cmp     al, 'z'         ; common
        ja      .invalid_number
        cmp     al, 'a'
        jb      .invalid_number

        sub     al, 'a'-'0'-10

.digit:
        sub     al, '0'
        movzx   eax, al

        cmp     eax, edx
        jae     .invalid_number

        imul    ebx, edx
        add     ebx, eax

        cmp     esi, edi
        jne     .decode_loop

; set the sign:
        xor     ebx, [.sign]
        sub     ebx, [.sign]

        clc
        mov     eax, ebx

        pop     edi esi edx ebx
        return

.invalid_number:
        xor     eax, eax

.finish:
        stc
        pop     edi esi edx ebx
        return
endp








;-------------------------------------------------------
; function StrCharCat
;   Appends up to 4 chard at the end of the string.
;
; Arguments:
;   hString - string to append
;   char - char(s) to add
; Returns:
;   nothing
;-------------------------------------------------------
proc StrCharCat, .hString, .char
begin
        push    eax ecx

        stdcall StrLen, [.hString]
        mov     ecx, eax
        add     eax, 8

        stdcall StrSetCapacity, [.hString], eax
        jnc     @f
        int3
@@:

        pushd   [.char]
        popd    [eax+ecx]
        mov     dword [eax+ecx+4], 0
        dec     ecx
.goend:
        inc     ecx
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443



1444
1445
1446

1447
1448
1449


1450
1451
1452
1453































































































































































































































































































































































































1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475

1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497

1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534

1535
1536
1537
1538
1539
1540
1541
;
; Arguments:
;   hString - string to append
;   char    - char to add
;   pos     - position where to add the char
;-------------------------------------------------------------
proc StrCharInsert, .hString, .char, .pos
.str rd 2
begin
        push    eax



        push    [.char]
        pop     [.str]
        mov     [.str+4], 0


        lea     eax, [.str]
        stdcall StrInsert, [.hString], eax, [.pos]


        pop     eax
        return
endp





































































































































































































































































































































































































;_______________________________________________________________________
;
; proc StrHash
;   Computes 32 bit hash value from the string.
;   This procedure implements the hash algoritm: FNV-1b
;
; Arguments:
;   ptrString - pointer to PASCAL string with dword length at [ptr-4]
;
; Return:
;   eax - 32bit hash value.
;
; Changes:
;   eax
;_______________________________________________________________________
proc StrHash, .hString
begin

        push    edx ecx esi

        stdcall StrPtr, [.hString]
        mov     esi, eax
        stdcall StrLen, [.hString]
        mov     ecx, eax
        mov     eax, $811C9DC5                  ; 2166136261              ; FNV offset basis

        jecxz   .exit

.hashloop:
        movzx   edx, byte [esi]
        xor     eax, edx
        inc     esi
        imul    eax, $01000193                  ;   16777619              ; FNV prime
        dec     ecx
        jnz     .hashloop

.exit:
        pop     esi ecx edx
        return
endp





proc StrURLEncode, .hstr
.res dd ?
begin
        push    ebx ecx edx esi edi
        stdcall StrPtr, [.hstr]
        mov     esi, eax

        stdcall StrLen, esi
        mov     ecx, eax
        lea     edx, [2*eax+eax]        ; the encoded string can be max 3x long as original string.

        stdcall StrNew
        mov     [.res], eax
        jecxz   .finish

        stdcall StrSetCapacity, eax, edx
        mov     edi, eax
        xor     edx, edx
        xor     ebx, ebx

        push    eax
.encode:
        lodsb
        cmp     al, $80
        jae     .store          ; it is a hack, but I hope save enough.

        mov     dl, al
        mov     bl, al
        shr     edx, 5
        and     ebx, $1f
        bt      dword [URLCharTable+4*edx], ebx
        jnc     .store


        mov     ah, al
        mov     al, '%'
        stosb
        mov     al, ah
        shr     al, 4
        cmp     al, $0a
        sbb     al, $69







<


>
>
>
|
|
|
>

<

>
>




>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>












|









>
|
<

<
<
<
<
<
<
<
<
<
|
<
<
<
<
|
<
<


>













|














|








>







2460
2461
2462
2463
2464
2465
2466

2467
2468
2469
2470
2471
2472
2473
2474
2475
2476

2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890

2891









2892




2893


2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
;
; Arguments:
;   hString - string to append
;   char    - char to add
;   pos     - position where to add the char
;-------------------------------------------------------------
proc StrCharInsert, .hString, .char, .pos

begin
        push    eax

        stdcall GetMem, 16

        pushd   [.char]
        popd    [eax]
        mov     dword [eax+4], 0
        mov     dword [eax+8], 0


        stdcall StrInsert, [.hString], eax, [.pos]
        stdcall FreeMem, eax

        pop     eax
        return
endp



;_______________________________________________________________________
; proc StrClipSpacesR
;   Removes the spaces and control chars from the right of the string.
; Arguments:
;   hString - string to be processed
; Returns:
;   CF=1 - invalid string handle.
;_______________________________________________________________________
proc StrClipSpacesR, .hString
begin
        pushad

        stdcall StrPtr, [.hString]
        jc      .exit

        mov     ebx, eax
        mov     esi, eax
        add     esi, [eax+string.len]

.loop:
        cmp     esi, ebx
        je      .finish

        dec     esi
        call    ScanBackUtf8
        stdcall DecodeUtf8, [esi]

        cmp     eax, ' '
        jbe     .loop

        cmp     eax, $85
        je      .loop

        cmp     eax, $a0
        je      .loop

        cmp     eax, $180e
        je      .loop

        cmp     eax, $feff
        je      .loop

        cmp     eax, $2000
        jb      .non_space

        cmp     eax, $200f
        jbe     .loop

        cmp     eax, $2028
        jb      .non_space

        cmp     eax, $202f
        jbe     .loop

        cmp     eax, $205f
        jb      .non_space

        cmp     eax, $206f
        jbe     .loop

.non_space:
        add     esi, edx

.finish:
        xor     eax, eax
        mov     dword [esi], eax

        sub     esi, ebx
        mov     [ebx+string.len], esi

.exit:
        popad
        return
endp


;_______________________________________________________________________
; proc StrClipSpacesL
;   Removes the spaces from the left of the string.
; Arguments:
;   hString - string to be processed
; Returns:
;   CF=1 - invalid string handle.
;_______________________________________________________________________
;proc StrClipSpacesL, .hString
;begin
;        push    esi edi eax ecx
;
;        stdcall StrPtr, [.hString]
;        jc      .finish
;
;        mov     ecx, [eax+string.len]
;        mov     esi, eax
;        mov     edi, eax
;
;.loop:
;        jecxz   .copy
;        cmp     byte [esi], ' '
;        ja      .copy
;
;        inc     esi
;        dec     ecx
;        jmp     .loop
;
;.copy:
;        mov     [edi+string.len], ecx
;        jecxz   .finish
;        cmp     esi, edi
;        je      .finish
;
;        add     ecx, 4
;        rep movsb
;
;.finish:
;        pop     ecx eax edi esi
;        return
;endp

proc StrClipSpacesL, .hString
begin
        pushad

        stdcall StrPtr, [.hString]
        jc      .finish

        mov     ecx, [eax+string.len]
        mov     esi, eax
        mov     edi, eax

; search first non whitespace...

        xor     edx, edx

.loop:
        sub     ecx, edx
        ja      .decode

        xor     ecx, ecx
        jmp     .copy

.decode:
        add     esi, edx
        stdcall DecodeUtf8, [esi]

        cmp     eax, ' '
        jbe     .loop

        cmp     eax, $85
        je      .loop

        cmp     eax, $a0
        je      .loop

        cmp     eax, $180e
        je      .loop

        cmp     eax, $feff
        je      .loop

        cmp     eax, $2000
        jb      .copy

        cmp     eax, $200f
        jbe     .loop

        cmp     eax, $2028
        jb      .copy

        cmp     eax, $202f
        jbe     .loop

        cmp     eax, $205f
        jb      .copy

        cmp     eax, $206f
        jbe     .loop

.copy:
        mov     [edi+string.len], ecx
        jecxz   .finish
        cmp     esi, edi
        je      .finish

        add     ecx, 4
        rep movsb

.finish:
        popad
        return
endp



;_______________________________________________________________________
; proc StrClipQuotes
;   First removes the spaced from the beginning and from the end of the
;   string. Then chech whether the string is quoted string - i.e. starts
;   and ends with equal characters single or double quote. If so, removes
;   them as well.
;
; Arguments:
;   hString - string to be processed
; Returns:
;   CF=1 - invalid string handle.
;_______________________________________________________________________


proc StrClipQuotes, .hString
begin
        pushad

        stdcall StrClipSpacesR, [.hString]
        jc      .finish
        stdcall StrClipSpacesL, [.hString]
        jc      .finish

        stdcall StrPtr, [.hString]
        jc      .finish
        mov     ecx, [eax+string.len]
        mov     esi, eax
        mov     edi, eax

        cmp     ecx, 2
        jl      .finish

        sub     ecx, 2

        lodsb
        cmp     al, [esi+ecx]
        jne     .finish

        cmp     al, '"'
        je      .clip

        cmp     al, "'"
        jne     .finish

.clip:
        mov [edi+string.len], ecx
        rep movsb
        mov [edi], ecx
        clc

.finish:
        popad
        return
endp


;_______________________________________________________________________
; proc SetQuotes, .hString, .char
;
; Encloses the string in quotes marks, if it is necessary, i.e. if the
; string contains spaces, tabs or any other of the provided characters.
; If the string contains single quote, double quote is used. If the
; string contains double quote, single quote is used.
; If the string contains all: single quote, double quote and spaces, the error
; is returned.
;_______________________________________________________________________
proc StrSetQuotes, .hString, .char
begin
        pushad

        stdcall StrLen, [.hString]
        jc      .error

        mov     ecx, eax
        jecxz   .error

        stdcall StrPtr, [.hString]
        mov     esi, eax
        xor     edx, edx        ; quote flag
        xor     ebx, ebx        ; space flag

.loop:
        lodsb

        cmp     al, "'"
        jne     @f
        mov     dl, al
@@:
        cmp     al, '"'
        jne     @f
        mov     dh, al
@@:
        cmp     al, ' '
        jne     @f
        mov     bl, al
@@:
        cmp     al, $09 ; tab
        jne     @f
        mov     bl, al
@@:
        cmp     al, byte [.char]
        jne     @f
        mov     bl, al
@@:
        loop    .loop

        test    ebx, ebx
        jz      .finish         ; no quotes are necessary.

; do quote
        test    dl, dl
        jnz     @f
        shr     edx, 8
@@:
        test    dh, dh
        jnz     .error          ; both dh and dl <> 0

        test    dl, dl          ; both are 0, so set "'"
        jnz     @f
        mov     dl, '"'
@@:
        xor     dl, '"' xor "'" ; turn the quote to the other.

        stdcall StrCharInsert, [.hString], edx, 0
        stdcall StrCharCat, [.hString], edx

.finish:
        clc
        popad
        return

.error:
        stc
        popad
        return
endp




;_______________________________________________________________________
; proc StrCleanDupSpaces
;   Removes duplicating spaces from the string.
; Arguments:
;   hString - string to be processed
; Returns:
;   CF=1 - invalid string handle.
;_______________________________________________________________________
proc StrCleanDupSpaces, .hString
begin
        push    esi edi eax ecx edx

        stdcall StrPtr, [.hString]
        jc      .finish

        mov     ecx, [eax+string.len]
        lea     edx, [eax+string.len]
        mov     esi, eax
        mov     edi, eax

        jecxz   .endcopy

.loop:
        lodsb
        cmp     al, ' '
        jne     .store
        cmp     byte [esi], ' '
        jne     .store
; skip
        dec     dword [edx]
        jmp     .next

.store:
        stosb

.next:
        dec     ecx
        jnz     .loop

.endcopy:
        xor     eax, eax
        stosd

.finish:
        pop     edx ecx eax edi esi
        return
endp






;_______________________________________________________________________
;
; proc StrHash
;   Computes 32 bit hash value from the string.
;   This procedure implements the hash algoritm: FNV-1b
;
; Arguments:
;   .hString - handle of string.
;
; Return:
;   eax - 32bit hash value.
;
; Changes:
;   eax
;_______________________________________________________________________
proc StrHash, .hString
begin
        stdcall StrLen, [.hString]
        push    eax

        stdcall StrPtr, [.hString]









        push    eax




        call    DataFNV1b


        return
endp





proc StrURLEncode, .hstr
.res dd ?
begin
        push    ebx ecx edx esi edi
        stdcall StrPtr, [.hstr]
        mov     esi, eax

        stdcall StrLen, esi
        mov     ecx, eax
        lea     edx, [3*eax]        ; the encoded string can be max 3x long as original string.

        stdcall StrNew
        mov     [.res], eax
        jecxz   .finish

        stdcall StrSetCapacity, eax, edx
        mov     edi, eax
        xor     edx, edx
        xor     ebx, ebx

        push    eax
.encode:
        lodsb
        cmp     al, $80
        jae     .do_encode      ; encode all above $7f

        mov     dl, al
        mov     bl, al
        shr     edx, 5
        and     ebx, $1f
        bt      dword [URLCharTable+4*edx], ebx
        jnc     .store

.do_encode:
        mov     ah, al
        mov     al, '%'
        stosb
        mov     al, ah
        shr     al, 4
        cmp     al, $0a
        sbb     al, $69
1559
1560
1561
1562
1563
1564
1565
1566

1567

1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582









































































































































































































































































































































































































































































































































































































































































































































1583




































































































































































































































































































































































































































































































































































































































































































































        mov     [eax+string.len], edi

.finish:
        mov     eax, [.res]
        pop     edi esi edx ecx ebx
        return
endp


; Contains 1 where the character must be % encoded and 0 where it is save to pass it directly

URLCharTable db 11111111b       ;
             db 11111111b       ;
             db 11111111b       ;
             db 11111111b       ; 0..31 -control chars | encoded
             db 11111111b       ; $27 - $20: '&%$#"!   | encoded
             db 11111111b       ; $2f - $28: /.-,+*)(  | encoded
             db 00000000b       ; $37 - $30: 76543210  | not encoded
             db 11111100b       ; $3f - $38: ?>=<;:98  | partially
             db 00000001b       ; $47 - $40: GFEDCBA@  | partially
             db 00000000b       ; $4f - $48: ONMLKJIH  | not encoded
             db 00000000b       ; $57 - $50: WVUTSRQP  | not encoded
             db 11111000b       ; $5f - $58: _^]\[ZYX  | partially
             db 00000001b       ; $67 - $60: gfedcba`  | partially
             db 00000000b       ; $6f - $68: onmlkjih  | not encoded
             db 00000000b       ; $77 - $70: wvutsrqp  | not encoded









































































































































































































































































































































































































































































































































































































































































































































             db 11111000b       ; $7f - $78:  ~}|{zyx  | partially












































































































































































































































































































































































































































































































































































































































































































































>

>





|





|



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
        mov     [eax+string.len], edi

.finish:
        mov     eax, [.res]
        pop     edi esi edx ecx ebx
        return
endp


; Contains 1 where the character must be % encoded and 0 where it is save to pass it directly
if used URLCharTable
URLCharTable db 11111111b       ;
             db 11111111b       ;
             db 11111111b       ;
             db 11111111b       ; 0..31 -control chars | encoded
             db 11111111b       ; $27 - $20: '&%$#"!   | encoded
             db 10011111b       ; $2f - $28: /.-,+*)(  | encoded
             db 00000000b       ; $37 - $30: 76543210  | not encoded
             db 11111100b       ; $3f - $38: ?>=<;:98  | partially
             db 00000001b       ; $47 - $40: GFEDCBA@  | partially
             db 00000000b       ; $4f - $48: ONMLKJIH  | not encoded
             db 00000000b       ; $57 - $50: WVUTSRQP  | not encoded
             db 01111000b       ; $5f - $58: _^]\[ZYX  | partially
             db 00000001b       ; $67 - $60: gfedcba`  | partially
             db 00000000b       ; $6f - $68: onmlkjih  | not encoded
             db 00000000b       ; $77 - $70: wvutsrqp  | not encoded
             db 10111000b       ; $7f - $78:  ~}|{zyx  | partially
end if


;_______________________________________________________________________
;
; proc StrURLDecode
;   Decodes URL encoded string. Does not change registers.
;   Notice, that the string is decoded in place.
;
; Arguments:
;   .hString - handle or pointer of string.
;
; Return:
;   nothing
;
; Changes:
;   flags
;_______________________________________________________________________

proc StrURLDecode, .hstring
begin
        pushad

        stdcall StrLen, [.hstring]
        mov     ecx, eax
        jecxz   .finish

        stdcall StrPtr, [.hstring]
        mov     esi, eax
        mov     edi, eax
        mov     ebx, eax

.loop:
        lodsb

        test    al, al
        jz      .end_of_string

        cmp     al, '+'
        je      .space

        cmp     al, '%'
        jne     .store

        lodsb
        cmp     al, '9'
        jbe     @f
        add     al, $09
@@:
        shl     al, 4
        mov     ah, al

        lodsb
        cmp     al, '9'
        jbe     @f
        add     al, $09
@@:
        and     al, $0f
        or      al, ah
        jmp     .store

.space:
        mov     al, ' '

.store:
        stosb
        loop    .loop

.end_of_string:
        mov     ecx, edi
        sub     ecx, ebx
        xor     eax, eax
        stosd

        mov     [ebx+string.len], ecx

.finish:
        popad
        return

endp


; UTF-8 support functions.
; Some of the above functions also need some revision in order to support
; utf-8 strings properly.
;  Bug - on [.len]=-1 sometimes in Linux returns error on normal strings.

proc StrLenUtf8, .hString, .len
begin
        push    ebx ecx edx esi

        stdcall StrPtr, [.hString]
        mov     esi, eax

        mov     ebx, [.len]
        test    ebx, ebx
        js      @f
        add     ebx, esi
@@:
        xor     ecx, ecx

.loop:
        cmp     esi, ebx
        jae     .endofstring

        stdcall DecodeUtf8, [esi]
        jc      .error

        test    eax, eax
        jz      .endofstring

        add     esi, edx
        inc     ecx
        jmp     .loop

.endofstring:
        mov     eax, ecx
        pop     esi edx ecx ebx
        clc
        return

.error:
        xor     eax, eax
        stc
        pop     esi edx ecx ebx
        return
endp



proc StrOffsUtf8, .hString, .pos
begin
        push    edx esi

        stdcall StrPtr, [.hString]
        mov     esi, eax

.loop:
        dec     [.pos]
        js      .finish

        stdcall DecodeUtf8, [esi]
        jc      .error

        test    eax, eax
        jz      .finish

        add     esi, edx
        jmp     .loop

.finish:
        clc
        mov     eax, esi
        pop     esi edx
        return

.error:
        xor     eax, eax
        pop     esi edx
        return
endp



proc StrByteUtf8, .hString, .pos
begin
        push    edx esi edi

        stdcall StrPtr, [.hString]
        mov     esi, eax
        mov     edi, eax

.loop:
        dec     [.pos]
        js      .finish

        stdcall DecodeUtf8, [esi]
        jc      .error

        test    eax, eax
        jz      .finish

        add     esi, edx
        jmp     .loop

.finish:
        clc
        sub     esi, edi
        mov     eax, esi
        pop     edi esi edx
        return

.error:
        xor     eax, eax
        pop     edi esi edx
        return
endp





proc ScanForwardUtf8
begin
        push    eax

        mov     al, [esi]
        test    al, al
        jns     .finish

        and     al, 11000000b
        cmp     al, 11000000b
        je      .finish

; inc forward
.loopf:
        inc     esi
        mov     al, [esi]
        and     al, 11000000b
        cmp     al, 10000000b
        je      .loopf

.finish:
        pop     eax
        return
endp



proc ScanBackUtf8
begin
        push    eax

        mov     al, [esi]
        test    al, al
        jns     .finish

        and     al, 11000000b
        cmp     al, 11000000b
        je      .finish

; inc back
.loopf:
        dec     esi
        mov     al, [esi]
        and     al, 11000000b
        cmp     al, 10000000b
        je      .loopf

.finish:
        pop     eax
        return
endp



proc ExpandTabs, .hstring, .tabstop
.start dd ?
.count dd ?
.correction dd ?
begin
        pushad

        mov     [.count], 0
        mov     [.correction], 0

        stdcall StrLen, [.hstring]
        mov     ecx, eax
        stdcall StrPtr, [.hstring]
        mov     [.start], eax
        mov     esi, eax
        add     ecx, eax
        xor     ebx, ebx

        jecxz   .end_scan

.scan_loop:
        stdcall DecodeUtf8, [esi]
        cmp     eax, $09
        jne     .next

        mov     byte [esi], $20

        push    edx
        mov     eax, ebx
        cdq
        div     [.tabstop]
        imul    eax, [.tabstop]
        pop     edx
        add     eax, [.tabstop]
        sub     eax, ebx
        dec     eax
        jz      .next

        add     ebx, eax
        add     [.correction], eax
        push    eax             ; space count

        mov     eax, esi
        sub     eax, [.start]
        push    eax             ; offset

        inc     [.count]

.next:
        inc     ebx
        add     esi, edx
        cmp     esi, ecx
        jb      .scan_loop

.end_scan:
        cmp     [.count], 0
        je      .finish

.expand:
        pop     ebx             ; offset
        pop     eax             ; count

.ins_spc:
        stdcall StrCharInsert, [.hstring], ' ', ebx
        dec     eax
        jnz     .ins_spc

.next_tab:
        dec     [.count]
        jnz     .expand

.finish:
        popad
        mov     eax, [.correction]
        return
endp



proc StrIP2Num, .hString
begin
        push    ebx edx esi

        xor     ebx, ebx
        stdcall StrPtr, [.hString]
        mov     esi, eax

; string to IP
.iploop:
        stdcall StrToNum, esi
        cmp     eax, $100
        jae     .invalid_ip

        cmp     ebx, $1000000
        jae     .invalid_ip

        shl     ebx, 8
        or      bl, al

        cmp     byte [esi+edx], 0
        je      .end_of_ip

        cmp     byte [esi+edx], '.'
        jne     .invalid_ip

        lea     esi, [esi+edx+1]
        jmp     .iploop

.invalid_ip:
        stc
        mov     eax, ebx
        pop     esi edx ebx
        return

.end_of_ip:
        clc
        mov     eax, ebx
        pop     esi edx ebx
        return
endp



proc IP2Str, .ip
begin
        push    ebx

        movzx   eax, byte [.ip+3]
        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        mov     ebx, eax
        stdcall StrCat, ebx, txt '.'

        movzx   eax, byte [.ip+2]
        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax
        stdcall StrCat, ebx, txt '.'

        movzx   eax, byte [.ip+1]
        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax
        stdcall StrCat, ebx, txt '.'

        movzx   eax, byte [.ip]
        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax

        mov     eax, ebx
        pop     ebx
        return
endp


proc StrEncodeHTML, .hString
begin
        pushad

        stdcall StrLen, [.hString]
        mov     ecx, eax

        stdcall StrNew
        mov     [esp+4*regEAX], eax

        shl     ecx, 3                  ; memory x8

        stdcall StrSetCapacity, eax, ecx
        mov     edi, eax
        mov     ebx, eax

        stdcall StrPtr, [.hString]
        mov     esi, eax

        xor     eax, eax

.loop:
        lodsb

        test    al, al
        jz      .end_of_string

        cmp     al, '<'
        je      .char_less_then
        cmp     al, '>'
        je      .char_greater_then
        cmp     al, '"'
        je      .char_quote
        cmp     al, '&'
        je      .char_amp

        stosb
        jmp     .loop

.end_of_string:
        mov     [edi], eax
        sub     edi, ebx
        mov     [ebx+string.len], edi

        popad
        return


.char_less_then:
        mov     dword [edi], '&lt;'
        add     edi, 4
        jmp     .loop

.char_greater_then:
        mov     dword [edi], '&gt;'
        add     edi, 4
        jmp     .loop


.char_quote:
        mov     dword [edi], '&quo'
        mov     word [edi+4],'t;'
        add     edi, 6
        jmp     .loop

.char_amp:
        mov     dword [edi], '&amp'
        mov     byte [edi+4], ';'
        add     edi, 5
        jmp     .loop

endp




proc StrDecodeHTML, .hString
begin
        pushad

        stdcall StrPtr, [.hString]
        mov     esi, eax
        mov     edi, eax
        mov     ebx, eax

.loop:
        lodsb

        test    al, al
        jz      .end_of_string

        cmp     al, '&'
        je      .collapse

.store:
        stosb
        jmp     .loop

.collapse:
        cmp     dword [esi], 'nbsp'
        jne     .not_nbsp
        cmp     byte [esi+4], ';'
        jne     .not_nbsp

        add     esi, 5
        mov     al, ' '
        jmp     .store

.not_nbsp:
        mov     ecx, [esi]
        and     ecx, $ffffff

        cmp     ecx, 'lt;'
        je      .lessthen
        cmp     ecx, 'gt;'
        jne     .not_gt

        add     esi, 3
        mov     al, '>'
        jmp     .store

.lessthen:
        add     esi, 3
        mov     al, '<'
        jmp     .store

.not_gt:
        cmp     dword [esi], 'quot'
        jne     .not_quote
        cmp     byte [esi+4], ';'
        jne     .not_quote

        add     esi, 5
        mov     al, '"'
        jmp     .store

.not_quote:
        cmp     dword [esi], 'apos'
        jne     .not_apos
        cmp     byte [esi+4], ';'
        jne     .not_apos

        add     esi, 5
        mov     al, "'"
        jmp     .store

.not_apos:
        cmp     dword [esi], 'amp;'
        jne     .store

        add     esi, 4
        mov     al, '&'
        jmp     .store


.end_of_string:
        mov     dword [edi], 0
        sub     edi, ebx
        mov     [ebx+string.len], edi

        popad
        return
endp




proc DateTimeToStr, .pDateTime, .format
begin
        push    ebx esi

        mov     esi, [.pDateTime]

; date
        stdcall NumToStr, [esi+TDateTime.date], ntsUnsigned or ntsFixedWidth or ntsDec + 2
        mov     ebx, eax
        stdcall StrCharCat, ebx, '.'
        stdcall NumToStr, [esi+TDateTime.month], ntsUnsigned or ntsFixedWidth or ntsDec + 2
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax
        stdcall StrCharCat, ebx, '.'
        stdcall NumToStr, [esi+TDateTime.year], ntsSigned or ntsFixedWidth or ntsDec + 4
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax
        stdcall StrCharCat, ebx, '  '

; time
        stdcall NumToStr, [esi+TDateTime.hour], ntsUnsigned or ntsFixedWidth or ntsDec + 2
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax
        stdcall StrCharCat, ebx, ':'
        stdcall NumToStr, [esi+TDateTime.minute], ntsUnsigned or ntsFixedWidth or ntsDec + 2
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax
        stdcall StrCharCat, ebx, ':'
        stdcall NumToStr, [esi+TDateTime.second], ntsUnsigned or ntsFixedWidth or ntsDec + 2
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax

        mov     eax, ebx
        pop     esi ebx
        return
endp



proc StrExtractFilename, .hFilename
begin
        push    ebx ecx esi

        stdcall StrLen, [.hFilename]
        mov     ecx, eax

        stdcall StrPtr, [.hFilename]
        lea     esi, [eax+ecx]
        mov     ebx, eax

.loop:
        cmp     esi, ebx
        je      .found2

        dec     esi
        mov     al, [esi]

        cmp     al, '/'
        je      .found
        cmp     al, '\'
        je      .found
        jmp     .loop

.found:
        inc     esi

.found2:
        stdcall StrExtract, esi, 0, $7fffffff

        pop     esi ecx ebx
        return
endp


; Splits the given [.hFullPath] into path and filename.
; The path remains in the input string, and the filename is returned in eax.
proc StrSplitFilename, .hFullPath
begin
        push    ebx ecx esi

        stdcall StrLen, [.hFullPath]
        mov     ecx, eax

        stdcall StrPtr, [.hFullPath]
        lea     esi, [eax+ecx]
        mov     ebx, eax

.loop:
        cmp     esi, ebx
        je      .found2

        dec     esi
        mov     al, [esi]

        cmp     al, '/'
        je      .found
        cmp     al, '\'
        je      .found
        jmp     .loop

.found:
        inc     esi

.found2:
        sub     esi, ebx

        stdcall StrSplit, [.hFullPath], esi
        pop     esi ecx ebx
        return
endp



proc StrExtractExt, .hFilename
begin
        pushad

        stdcall StrLen, [.hFilename]
        mov     ecx, eax
        mov     edx, eax

        stdcall StrPtr, [.hFilename]
        mov     esi, eax

.search:
        dec     ecx
        jz      .no_ext

        cmp     byte [esi+ecx], '/'
        je      .no_ext

        cmp     byte [esi+ecx], '\'
        je      .no_ext

        cmp     byte [esi+ecx], '.'
        jne     .search

; found:
        sub     edx, ecx
        stdcall StrExtract, [.hFilename], ecx, edx
        mov     [esp+4*regEAX], eax

        clc
        popad
        return

.no_ext:
        stc
        popad
        return
endp



proc StrChangeExt, .hFilename, .hNewExt
begin
        push    ecx edx esi

        stdcall StrDup, [.hFilename]
        mov     edx, eax

        stdcall StrLen, edx
        mov     ecx, eax

        stdcall StrPtr, edx
        mov     esi, eax

.search:
        test    ecx, ecx
        jz      .append

        dec     ecx

        cmp     byte [esi+ecx], '/'
        je      .append
        cmp     byte [esi+ecx], '\'
        je      .append

        cmp     byte [esi+ecx], '.'
        jne     .search

        mov     dword [esi+ecx], 0
        mov     [esi+string.len], ecx

.append:
        stdcall StrCat, edx, [.hNewExt]
        mov     eax, edx
        pop     esi edx ecx
        return
endp


; Normalizes some path to the minimal possible path. If the path contains ".." removes the
; previous directory and ".." directory if possible. If not possible converts until it is
; possible and returns CF=1
;
; Arguments:
;   .hPath - handle of string with the path. As long as the string will be changed, it must
;            be a handle or static string but in the same format. At least the previous
;            dword should contain the length of the string.
;   .separators - the first two bytes of this argument specifies two possible directory
;            separators. For example "/\" will accept both slashes as a valid separators.
;            all separators in the result string will be converted to the first of them.
;            These two characters should be equal if only one separator is to be used.
; Returns:
;   CF=0 if the path was normalized without errors.
;   CF=1 if the path can not be normalized to not contain ".." directory.

proc StrNormalizePath, .hPath, .separators
begin
        pushad

        stdcall StrPtr, [.hPath]
        mov     edx, eax

.outer:
        mov     esi, edx
        mov     edi, edx


        mov     eax, [.separators]

        cmp     word [esi], '..'
        jne     .loop

        add     esi, 2
        cmp     [esi], al
        je      .error
        cmp     [esi], ah
        je      .error

.loop:
        cmp     [esi],  al
        je      .found
        cmp     [esi], ah
        je      .found
        cmp     byte [esi], 0
        je      .end_ok

        inc     esi
        jmp     .loop

.found:
        mov     [esi], al
        inc     esi

        cmp     word [esi], '..'
        jne     .cont

        cmp     byte [esi+2], al
        je      .back
        cmp     byte [esi+2], ah
        je      .back

.cont:
        mov     edi, esi
        inc     esi
        jmp     .loop

.back:
        cmp     [edi], al
        je      .inc
        cmp     [edi], ah
        jne     .do_copy

.inc:
        inc     edi

.do_copy:
        cmp     edi, esi
        jz      .error

        add     esi, 3

.copy:
        lodsb
        stosb
        test    al, al
        jnz     .copy

        dec     edi
        xor     eax, eax
        mov     [edi], eax
        sub     edi, edx
        mov     [edx+string.len], edi

        jmp     .outer

.error:
        stc
        popad
        return

.end_ok:
        clc

.finish:
;        pushf
;        mov     edi, esi
;        sub     esi, edx
;        xor     eax, eax
;        stosd
;        mov     [edx+string.len], esi
;        popf
        popad
        return

endp




; Normalizes some path to the minimal possible path.
; Removes ".." and "." from the path in all cases. In the incorrect cases the result path
;         is of course not equivalent to the beginning.
;
; Arguments:
;   .hPath - handle or pointer of string with the path. The processing is in-place and
;            the result string is always shorter or equal to the input string.
;            If the string is in memory, it MUST be in the format of FreshLib string
;            (i.e. on the offset -4 to be placed the length of the string and the
;             string to be terminated at least with dword of 0) The length of the string
;             is not used, but is updated with the result string length.
;
;   .separators - the first two bytes of this argument specifies two possible directory
;            separators. For example "/\" will accept both slashes as a valid separators.
;            all separators in the result string will be converted to the first of them.
;            These two characters should be equal if only one separator is to be used.
; Returns:
;    Nothing. Preserves all registers.
;
; Note: StrNormalizePath2 is more "paranoid" about the invalid paths than StrNormalizePath
;       it removes ".." and "." even if the result path is not equivalent.

proc StrNormalizePath2, .hPath, .separators
.back dd ?
begin
        pushad

        mov     ebx, esp

        stdcall StrPtr, [.hPath]
        mov     esi, eax
        mov     edi, eax
        mov     edx, eax
        xor     eax, eax
        mov     [.back], eax

        mov     cl, byte [.separators]
        mov     ch, cl
        mov     byte [.back], cl
        mov     byte [.back+2], cl
        mov     al, cl
        rol     ecx, 16
        mov     cx, '..'
        mov     byte [.back+1], cl
        rol     ecx, 8

.loop:
        shl     eax, 8
        lodsb
        stosb

        test    al, al
        jz      .end_of_string

        cmp     al, byte [.separators]
        je      .separator1
        cmp     al, byte [.separators+1]
        jne     .loop

.separator2:
        mov     al, byte [.separators]
        mov     [edi-1], al

.separator1:
        cmp     eax, ecx        ;ecx == '/../'
        je      .dir_back

        and     eax, $ffffff
        cmp     eax, [.back]    ; [.back] == '/./'
        je      .dir_remove

        push    edi
        jmp     .loop

.dir_remove:
        sub     edi, 2
        cmp     edi, edx
        cmovb   edi, edx
        jmp     .loop

.dir_back:
        cmp     esp, ebx
        cmove   edi, edx
        je      .loop

        add     esp, 4
        cmp     esp, ebx
        cmove   edi, edx
        je      .loop

        mov     edi, [esp]
        jmp     .loop

.end_of_string:
        dec     edi
        and     dword [edi], 0
        sub     edi, edx
        mov     [edx+string.len], edi
        mov     esp, ebx

        popad
        return
endp






;******************************************************
; Computes MD5 hash of the string .hString and returns
; new string handle in eax containing the hash of the
; string.
;******************************************************
proc StrMD5, .hString
begin
        stdcall StrLen, [.hString]
        push    eax
        stdcall StrPtr, [.hString]
        stdcall DataMD5, eax ; length from the stack.
        return
endp





; Splits the string .hString on multiply items, separated by [.separator] char.
;
; Arguments:
;   .hString - handle or pointer to the string that have to be split.
;   .Separator - contains UNICODE separator character.
;   .fAllowEmpty - if TRUE, empty strings are allowed. if FALSE, the empty strings are not
;                  included in the list.
;
; Returns:
;   EAX: TArray of dword containing the parts of the string.
;        If the string does not contains any items, returns empty TArray
;
; The returned array should be freed when not needed with:
;    stdcall  ListFree, [RetPtr], StrDel
; where [RetPtr] is the pointer, returned by StrSplitList

proc StrSplitList, .hString, .Separator, .fAllowEmpty
begin
        pushad

        stdcall CreateArray, 4
        mov     edi, eax

        stdcall StrPtr, [.hString]
        jc      .finish

        mov     esi, eax

.outer:
        mov     ebx, esi
        xor     ecx, ecx

.loop:
        stdcall DecodeUtf8, [esi]
        jc      .finish

        add     esi, edx

        test    eax, eax
        jz      .split_here

        test    ecx, ecx
        jz      .not_in_quote

        cmp     eax, ecx
        jne     .loop

        xor     ecx, ecx
        jmp     .loop

.not_in_quote:
        cmp     eax, '"'
        je      .quote_start
        cmp     eax, "'"
        jne     .continue

.quote_start:
        mov     ecx, eax
        jmp     .loop

.continue:
        cmp     eax, [.Separator]
        jne     .loop

.split_here:
        push    eax

        mov     edx, esi
        sub     edx, ebx
        dec     edx

        stdcall StrNew
        stdcall StrCatMem, eax, ebx, edx
        mov     ebx, eax

        stdcall StrClipSpacesR, ebx
        stdcall StrClipSpacesL, ebx

        cmp     [.fAllowEmpty], 0
        jne     .add_it

        stdcall StrLen, ebx
        test    eax, eax
        jnz     .add_it

        stdcall StrDel, ebx
        jmp     .next

.add_it:
        stdcall AddArrayItems, edi, 1
        mov     edi, edx
        mov     [eax], ebx

.next:
        pop     eax
        test    eax, eax
        jnz     .outer

        clc

.finish:
        mov     [esp+4*regEAX], edi
        popad
        return
endp



struct TSplitURL
  .scheme   dd ?
  .host     dd ?
  .port     dd ?
  .path     dd ?
  .query    dd ?
  .fragment dd ?
ends


proc StrSplitURL, .hURL, .pResult
begin
        push    eax
        push    [.pResult]
        stdcall StrLen, [.hURL]
        push    eax
        stdcall StrPtr, [.hURL]
        stdcall StrSplitURLMem, eax ; remaining arguments from the stack.
        pop     eax
        return
endp

debug_split_url = 1

proc StrSplitURLMem, .pString, .len, .pResult
begin
        pushad

        mov     edi, [.pResult]
        xor     eax, eax
        mov     ecx, sizeof.TSplitURL/4
        rep stosd

        mov     edi, [.pResult]

        mov     ecx, [.len]
        mov     esi, [.pString]

        test    ecx, ecx
        jz      .end_of_url

        mov     ebx, esi        ; start of the substring.

; scan for scheme...
.parse1:
        cmp     byte [esi], ':'
        jne     .not_scheme

        cmp     byte [esi+1], '0'
        jb      .scheme_here
        cmp     byte [esi+1], '9'
        ja      .scheme_here
        jmp     .host_here

.not_scheme:
        cmp     byte [esi], '/'
        je      .host_here

        cmp     byte [esi], '?'
        je      .path_here

        cmp     byte [esi], '#'
        je      .path_here

        cmp     byte [esi], '.'
        je      .parse4

        inc     esi
        dec     ecx
        jnz     .parse1

        jmp     .host_here

.scheme_here:
        call    .extract
        mov     [edi + TSplitURL.scheme], eax

        inc     esi
        inc     ebx
        dec     ecx
        jz      .end_of_url

        cmp     word [esi], '//'
        jne     .parse4

        add     esi, 2
        add     ebx, 2
        sub     ecx, 2
        jle     .end_of_url

.parse2:
        cmp     byte [esi], '/'
        je      .host_here

        cmp     byte [esi], ':'
        jne     .next

        cmp     byte [esi+1], '0'
        jb      .next

        cmp     byte [esi+1], '9'
        jbe     .host_here

.next:
        inc     esi
        dec     ecx
        jnz     .parse2

.host_here:
        call    .extract
        mov     [edi + TSplitURL.host], eax

        test    ecx, ecx
        jz      .end_of_url

        cmp     byte [esi], '/'
        je      .parse4         ; scan for path

;scan for port

        inc     esi
        inc     ebx
        dec     ecx

.parse3:
        cmp     byte [esi], '/'
        je      .port_here

        cmp     byte [esi], '?'
        je      .port_here

        cmp     byte [esi], '#'
        je      .port_here

        inc     esi
        dec     ecx
        jnz     .parse3

.port_here:
        call    .extract
        mov     [edi + TSplitURL.port], eax

        test    ecx, ecx
        jz      .end_of_url

;        inc     esi
;        inc     ebx
;        dec     ecx
;        jz      .end_of_url

        cmp     byte [esi], '?'
        je      .parse5       ; scan for query
        cmp     byte [esi], '#'
        je      .fragment_here

; scan for path

.parse4:
        cmp     byte [esi], '?'
        je      .path_here

        cmp     byte [esi], '#'
        je      .path_here

        inc     esi
        dec     ecx
        jnz     .parse4

;        cmp     byte [esi-1], '/'
;        jne     .parse4

.path_here:
        call    .extract
        mov     [edi + TSplitURL.path], eax

        test    ecx, ecx
        jz      .end_of_url

        inc     esi
        inc     ebx
        dec     ecx
        jz      .end_of_url

        cmp     byte [esi-1], '#'
        je      .fragment_here

; scan for query

.parse5:
        cmp     byte [esi], '#'
        je      .query_here

        inc     esi
        dec     ecx
        jnz     .parse5

.query_here:

        call    .extract
        mov     [edi + TSplitURL.query], eax

        test    ecx, ecx
        jz      .end_of_url

        inc     esi
        inc     ebx
        dec     ecx
        jz      .end_of_url

; extract the fragment.

.fragment_here:

        add     esi, ecx
        call    .extract
        mov     [edi + TSplitURL.fragment], eax

.end_of_url:
        cmp     [edi + TSplitURL.path], 0
        je      @f
        stdcall StrNormalizePath2, [edi + TSplitURL.path], '/\'
@@:

if debug_split_url
        stdcall FileWriteString, [STDERR], 'Scheme: '
        cmp     [edi+TSplitURL.scheme], 0
        je      @f
        stdcall FileWriteString, [STDERR], [edi+TSplitURL.scheme]
@@:
        stdcall FileWriteString, [STDERR], <txt 13,  10>


        stdcall FileWriteString, [STDERR], 'Host: '
        cmp     [edi+TSplitURL.host], 0
        je      @f
        stdcall FileWriteString, [STDERR], [edi+TSplitURL.host]
@@:
        stdcall FileWriteString, [STDERR], <txt 13,  10>


        stdcall FileWriteString, [STDERR], 'Port: '
        cmp     [edi+TSplitURL.port], 0
        je      @f
        stdcall FileWriteString, [STDERR], [edi+TSplitURL.port]
@@:
        stdcall FileWriteString, [STDERR], <txt 13,  10>


        stdcall FileWriteString, [STDERR], 'Path: '
        cmp     [edi+TSplitURL.path], 0
        je      @f
        stdcall FileWriteString, [STDERR], [edi+TSplitURL.path]
@@:
        stdcall FileWriteString, [STDERR], <txt 13,  10>


        stdcall FileWriteString, [STDERR], 'Query: '
        cmp     [edi+TSplitURL.query], 0
        je      @f
        stdcall FileWriteString, [STDERR], [edi+TSplitURL.query]
@@:
        stdcall FileWriteString, [STDERR], <txt 13,  10>


        stdcall FileWriteString, [STDERR], 'Fragment: '
        cmp     [edi+TSplitURL.fragment], 0
        je      @f
        stdcall FileWriteString, [STDERR], [edi+TSplitURL.fragment]
@@:
        stdcall FileWriteString, [STDERR], <txt 13,  10, 13, 10, 13, 10>

end if



        popad
        return

.extract:
        mov     eax, esi
        sub     eax, ebx
        jz      .end_extr
        stdcall StrExtract, ebx, 0, eax
        mov     ebx, esi
.end_extr:
        retn
endp

include 'encodings.asm'

include '%TargetOS%/utf8.asm'



endmodule

Added freshlib/data/trees.asm.







































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS independent tree library.
;
;  Target OS: Any
;
;  Dependencies: memory.asm
;
;  Notes:
;_________________________________________________________________________________________

module "Tree library"

struct TTItem
  .prev        dd ?            ; 0 if first.
  .next        dd ?            ; 0 if last.
  .parent      dd ?            ; 0 if root

  .firstChild  dd ?
  .lastChild   dd ?
ends



; Inserts TTItem after the specified TTItem
;  .item - pointer to the inserted item.
;  .after - pointer to the item after which to insert .item
; Returns:
;  Nothing

proc TreeInsAfter, .item, .after
begin
        push    eax esi edi

        mov     esi, [.item]
        mov     edi, [.after]

        test    edi, edi
        jz      .finish

        mov     eax, [edi+TTItem.next]
        mov     [esi+TTItem.prev], edi
        mov     [esi+TTItem.next], eax
        mov     [edi+TTItem.next], esi

        test    eax, eax
        jz      .next_ok

        mov     [eax+TTItem.prev], esi

.next_ok:
        mov     eax, [edi+TTItem.parent]
        mov     [esi+TTItem.parent], eax

        test    eax, eax
        jz      .finish

        cmp     [eax+TTItem.lastChild], edi
        jne     .finish

        mov     [eax+TTItem.lastChild], esi

.finish:
        pop     edi esi eax
        return
endp


; Inserts TTItem before the specified TTItem
;  .item - pointer to the inserted item.
;  .before - pointer to the item after which to insert .item
; Returns:
;  Nothing

proc TreeInsBefore, .item, .before
begin
        push    eax esi edi

        mov     esi, [.item]
        mov     edi, [.before]
        mov     eax, [edi+TTItem.prev]

        mov     [esi+TTItem.prev], eax
        mov     [esi+TTItem.next], edi
        mov     [edi+TTItem.prev], esi

        test    eax, eax
        jz      .prev_ok

        mov     [eax+TTItem.next], esi

.prev_ok:
        mov     eax, [edi+TTItem.parent]
        mov     [esi+TTItem.parent], eax

        test    eax, eax
        jz      .finish

        cmp     [eax+TTItem.firstChild], edi
        jne     .finish

        mov     [eax+TTItem.firstChild], esi

.finish:
        pop     edi esi eax
        return
endp

; Appends .item as a last child of the .parent element.

proc TreeAppendChild, .item, .parent
begin
        push    edx esi edi
        mov     edi, [.parent]
        test    edi, edi
        jz      .finish

        mov     esi, [.item]
        mov     edx, [edi+TTItem.lastChild]

        test    edx, edx
        jnz     .insert_after

        mov     [edi+TTItem.firstChild], esi
        mov     [edi+TTItem.lastChild], esi
        mov     [esi+TTItem.parent], edi
        jmp     .finish

.insert_after:
        stdcall TreeInsAfter, esi, edx

.finish:
        pop     edi esi edx
        return
endp


; Adds .item as a first child of the .parent element.

proc TreePushChild, .item, .parent
begin
        push    edx esi edi

        mov     esi, [.item]
        mov     edi, [.parent]
        mov     edx, [edi+TTItem.firstChild]

        test    edx, edx
        jnz     .insert_before

        mov     [edi+TTItem.firstChild], esi
        mov     [edi+TTItem.lastChild], esi
        mov     [esi+TTItem.parent], edi
        jmp     .finish

.insert_before:
        stdcall TreeInsBefore, esi, edx

.finish:
        pop     edi esi edx
        return
endp


; Tears the specified item from the tree it belongs to.
; Does not free the memory.
; The specified item becomes root element of its own tree,
; with all its children.
; Returns:
;   eax = pointer to the next item after the teared item.
;         or if it is NULL, the pointer to the previous
;         item.

proc TreeTearItem, .item
begin
        pushad

        mov     ecx, [.item]
        mov     esi, [ecx + TTItem.prev]
        mov     edi, [ecx + TTItem.next]
        mov     edx, [ecx + TTItem.parent]

; remove the item from the list.

        test    esi, esi
        jz      @f
        mov     [esi + TTItem.next], edi
@@:
        test    edi, edi
        jz      @f
        mov     [edi + TTItem.prev], esi
@@:

; fix the first/last children links of the parent if needed.
        test    edx, edx
        jz      .parent_ok

        mov     eax, [edx + TTItem.firstChild]
        mov     ebx, [edx + TTItem.lastChild]

        cmp     eax, ecx
        cmove   eax, edi

        cmp     ebx, ecx
        cmove   ebx, esi

        mov     [edx + TTItem.firstChild], eax
        mov     [edx + TTItem.lastChild], ebx

.parent_ok:

; fix the item fields.

        xor     eax, eax
        mov     [ecx + TTItem.prev], eax
        mov     [ecx + TTItem.next], eax
        mov     [ecx + TTItem.parent], eax

        test    edi, edi
        cmovz   edi, esi
        mov     [esp+4*regEAX], edi

        popad
        return
endp


; Recursively frees all the memory of the item and all its children.

interface TreeNodeFree, .item

proc TreeFree, .item, .FreeProc
begin
        push    eax

        mov     eax, [.item]
        mov     eax, [eax+TTItem.firstChild]

.loop:
        test    eax, eax
        jz      .children_ok

        push    [eax+TTItem.next]
        stdcall TreeFree, eax, [.FreeProc]
        pop     eax
        jmp     .loop

.children_ok:
        pop     eax
        pushad
        stdcall [.FreeProc], [.item]
        popad
        return
endp



; Combines TreeTearItem and TreeFree in one procedure.
; Notice that free without first tearing will break the remaining tree.
; Returns the value from TreeTearItem.
proc TreeTearAndFree, .item, .FreeProc
begin
        stdcall TreeTearItem, [.item]
        stdcall TreeFree, [.item], [.FreeProc]
        return
endp


; Destroys the whole root list of the tree and recursively all its children.
proc TreeTearAndFreeAll, .item, .FreeProc
begin
        push    eax
        mov     eax, [.item]

.loop:
        test    eax, eax
        jz      .finish
        stdcall TreeTearAndFree, eax, [.FreeProc]
        jmp     .loop

.finish:
        pop     eax
        return
endp


; Returns the next item in the tree. If there is no such item,
; traces back to the parent and their next item and so on to the root.
; Arguments:
;    .item - pointer to TTItem
; Returns:
;    CF = 0, eax = pointer to the next TTItem
;    CF = 1, eax = 0 - next TTItem does not exists.

proc GetNextItem, .item
begin
        push    esi
        mov     esi, [.item]

.loop:
        mov     eax, [esi+TTItem.next]
        test    eax, eax
        jnz     .exit_ok

        mov     esi, [esi+TTItem.parent]
        test    esi, esi
        jnz     .loop

        stc
        pop     esi
        return

.exit_ok:
        clc
        pop     esi
        return
endp


endmodule

Added freshlib/data/uconfig.asm.















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS independent micro configuration files library.
;
;  Target OS: Any
;
;  Dependencies: strlib.asm; arrays.asm;
;
;  Notes:
;
;_________________________________________________________________________________________
module "uConfig library"

struct TCfgRecord
  .key   dd ?
  .value dd ?
ends

iglobal
  var procCfgMatchPattern = StrMatchPattern ; StrMatchPattern or StrMatchPatternNoCase
endg


proc CfgFreeSection, .ptrRecordArray
begin
        push    eax
        mov     eax, [.ptrRecordArray]

        cmp     [eax+TArray.itemsize], sizeof.TCfgRecord
        jne     .error

        shl     [eax+TArray.count], 1   ; make
        stdcall ListFree, eax, StrDel
        clc
        pop     eax
        return

.error:
        stc
        pop     eax
        return
endp


;******************************************************************
; Returns CF=0 and eax=pointer to TArray with TCfgRecord elements.
;         CF=1 only if the file does not exists.
;
; Notse:
;   1. if the section does not exists, empty array will be returned.
;   2. The user must free the array after use passing the pointer
;      to CfgFreeSection - it will free the array and the contained
;      strings as well.
;
;******************************************************************

proc CfgGetSection, .cfgFile, .section
begin
        pushad

        mov     eax, [.cfgFile]
        test    eax, $ffff0000
        jz      .file_ok

        stdcall FileOpenAccess, eax, faReadOnly
        jc      .finish

.file_ok:
        mov     ebx, eax
        stdcall FileSeek, ebx, 0, fsFromBegin

        stdcall CreateArray, 8  ; TCfgSectionRecord
        jc      .finish

        mov     edi, eax

        stdcall StrDup, [.section]
        mov     esi, eax
        stdcall StrCharCat, esi, '.*'

.loop:
        stdcall _CfgScanForKey, ebx, esi
        jc      .end_of_file

        push    eax
        push    ecx

        stdcall AddArrayItems, edi, 1
        mov     edi, edx
        mov     edx, eax
        pop     [edx+TCfgRecord.key]
        pop     [edx+TCfgRecord.value]

        stdcall [procCfgMatchPattern], [.section], [edx+TCfgRecord.key]
        jc      .loop   ;???
        inc     eax
        stdcall StrSplit, [edx+TCfgRecord.key], eax
        xchg    [edx+TCfgRecord.key], eax
        stdcall StrDel, eax
        jmp     .loop

.end_of_file:
        stdcall StrDel, esi

        test    [.cfgFile], $ffff0000
        jz      .close_ok

        stdcall FileClose, ebx

.close_ok:
        mov     [esp+4*regEAX], edi
        clc

.finish:
        popad
        return

endp



proc CfgSaveSection, .cfgFile, .section, .ptr_array
begin
        pushad

; first clean the whole section:

        stdcall CfgGetSection, [.cfgFile], [.section]
        jc      .error

        mov     esi, eax

; clean all items:

        mov     ecx, [esi+TArray.count]

.clean:
        dec     ecx
        js      .end_clean

        stdcall CfgSetStr, [.cfgFile], [.section], [esi+TArray.array+8*ecx+TCfgRecord.key], 0
        jmp     .clean

.end_clean:
        mov     esi, [.ptr_array]
        test    esi, esi
        jz      .end_loop

        cmp     [esi+TArray.itemsize], 8        ; two dwords TArray
        jne     .error
        xor     ecx, ecx

.loop:
        cmp     ecx, [esi+TArray.count]
        je      .end_loop

        stdcall CfgSetStr, [.cfgFile], [.section], [esi+8*ecx+TArray.array+TCfgRecord.key], [esi+8*ecx+TArray.array+TCfgRecord.value]
        inc     ecx
        jmp     .loop

.end_loop:
        clc
        popad
        return

.error:
        stc
        popad
        return
endp




;_________________________________________________________________
; proc CfgGetInt
;
; Reads an integer number from the config file.
;
; If the key is missing, the value is not a number or some
; other error occurs, returns [.default] and CF=1
;
; If the value has been found and contains a number
; encoded in FASM format, this number is returned and CF=0
;_________________________________________________________________

proc CfgGetInt, .cfgFile, .section, .key, .default
begin
        stdcall CfgGetStr, [.cfgFile], [.section], [.key]
        jc      .get_default

        push    eax
        stdcall StrToNumEx, eax
        stdcall StrDel ; from the stack
        jc      .get_default

        clc
        return

.get_default:
        mov     eax, [.default]
        return
endp



proc CfgSetInt, .cfgFile, .section, .key, .value
begin
        push    eax
        stdcall NumToStr, [.value], ntsDec or ntsSigned
        push    eax
        stdcall CfgSetStr, [.cfgFile], [.section], [.key], eax
        stdcall StrDel ; from the stack
        pop     eax
        return
endp


;___________________________________________________________________
; proc CfgGetStr
;
; Reads a string value from the config file.
;
; Arguments:
;   .cfgFile - handle of an open file, or string of filename string.
;   .section - string with the section of the value
;   .key     - string with the key of the value.
;
; Returns:
;   CF=0; eax - string with the value of the key.
;   CF=1; eax=0 - The key is missing or something is wrong with the file,
;___________________________________________________________________

proc CfgGetStr, .cfgFile, .section, .key
begin
        push    ebx ecx edx

        mov     eax, [.cfgFile]         ; name or handle
        test    eax, $ffff0000
        jz      .file_ok

;        if defined options.DebugMode & options.DebugMode
;           pushad
;           stdcall StrPtr, eax
;           stdcall Output, "Config file path: "
;           stdcall Output, eax
;           stdcall Output, cDbgNewLine
;           popad
;        end if

        stdcall FileOpenAccess, eax, faReadOnly
        jc      .error

;        OutputValue "CfgGetStr file open success. Handle = ", eax, 16, 8

.file_ok:
        mov     ebx, eax

        stdcall FileSeek, ebx, 0, fsFromBegin

        stdcall StrDup, [.section]
        stdcall StrCharCat, eax, '.'
        stdcall StrCat, eax, [.key]
        push    eax

        stdcall _CfgScanForKey, ebx, eax
        stdcall StrDel ; from the stack
        pushf

        test    [.cfgFile], $ffff0000
        jz      .close_ok

        push    eax
        stdcall FileClose, ebx
        pop     eax

.close_ok:
        popf
        jc      .finish

        stdcall StrDel, ecx

.finish:
        pop     edx ecx ebx
        return

.error:
        DebugMsg "CfgGetStr open file error!"
        stc
        jmp      .finish

endp



;___________________________________________________________________
; proc CfgSetStr
;
; If the specified key exists in the config file, its value is
; replaced with [.value].
;
; If the key does not exists, it is appended at the end of the file.
;
; If some error occurs - CF=1;
;___________________________________________________________________

proc CfgSetStr, .cfgFile, .section, .key, .value
begin
        push    ebx ecx edx edi

        mov     eax, [.cfgFile]
        test    eax, $ffff0000
        jz      .file_ok

        stdcall FileOpenAccess, eax, faReadWrite + faOpenAlways
        jc      .exit

.file_ok:
        mov     ebx, eax

        stdcall FileSeek, ebx, 0, fsFromBegin

        xor     edi, edi

        stdcall StrDup, [.section]
        stdcall StrCharCat, eax, '.'
        stdcall StrCat, eax, [.key]
        push    eax

        stdcall _CfgScanForKey, ebx, eax
        jnc     .read_remaining

        pop     ecx
        jmp     .append

.read_remaining:
        stdcall StrDel, eax
        stdcall StrDel ; from the stack

        stdcall StrNew
        mov     edi, eax

.loop:
        stdcall FileReadLine, ebx
        jc      .end_read
        test    eax, eax
        jz      .end_read

        stdcall StrCat, edi, eax
        stdcall StrCharCat, edi, $0a0d  ;???
        stdcall StrDel, eax
        jmp     .loop

.end_read:
        stdcall FileSeek, ebx, edx, fsFromBegin

.append:
        cmp     [.value], 0
        je      .end_append     ; if [.value]==0 then the key is simply deleted.

        stdcall StrSetQuotes, ecx, '='
        stdcall StrCharCat, ecx, ' = '

        stdcall StrDup, [.value]
        stdcall StrSetQuotes, eax, '='
        stdcall StrCat, ecx, eax
        stdcall StrDel, eax

        stdcall StrCharCat, ecx, $0a0d
        stdcall FileWriteString, ebx, ecx

.end_append:
        test    edi, edi
        jz      .finish

        stdcall FileWriteString, ebx, edi       ; remaining part of the file...
        stdcall StrDel, edi

.finish:
        stdcall FileTruncate, ebx
        stdcall StrDel, ecx

        test    [.cfgFile], $ffff0000
        jz      .close_ok

        stdcall FileClose, ebx

.close_ok:
        clc
.exit:
        pop     edi edx ecx ebx
        return
endp




proc CfgDelKey, .cfgFile, .section, .key
begin
        stdcall CfgSetStr, [.cfgFile], [.section], [.key], 0
        return
endp



;___________________________________________________________________________________
; proc CfgScanForKey
;
; This is "low-level" procedure that searches already open file for
; a key with the given name.
;
; if the line has been found, returns:
;  eax - string handle of the value of the line (the right part of key=value pair).
;  ecx - string handle of the key of the line (the left part of key=value pair).
;  edx - position in the file where the key/value are located.
;  the file is positioned on the start of the next line in the file.
;
; The returned string handle has to be free when not needed.
;___________________________________________________________________________________

proc _CfgScanForKey, .hFile, .fullkey
begin
.loop:
        stdcall FileSeek, [.hFile], 0, fsFromCurrent
        mov     edx, eax ; the current possition.

        stdcall FileReadLine, [.hFile]
        jc      .not_found
        test    eax, eax
        jz      .not_found

        mov     ecx, eax

        stdcall StrClipSpacesR, ecx
        stdcall StrClipSpacesL, ecx

        stdcall StrPtr, ecx
        cmp     byte [eax], ';'
        jne     .not_comment

        stdcall StrDel, ecx
        jmp     .loop

.not_comment:
        stdcall StrSplitList, ecx, '=', TRUE
        stdcall StrDel, ecx

        mov     ecx, eax
        cmp     [ecx+TArray.count], 2
        jne     .next

        stdcall StrClipQuotes, [ecx+TArray.array]

        stdcall [procCfgMatchPattern], [.fullkey], [ecx+TArray.array]
        jc      .found

.next:
        stdcall ListFree, ecx, StrDel
        jmp     .loop

; found, eax is a hangle of the value.
.found:
        push    dword [ecx+TArray.array+4]
        push    dword [ecx+TArray.array]
        stdcall FreeMem, ecx
        pop     ecx
        pop     eax
        stdcall StrClipQuotes, eax
        clc
        return

.not_found:
        xor     eax, eax
        stc
        return
endp







endmodule

Added freshlib/equates/Dummy/allequates.inc.































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Combined include of all equate files.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


Added freshlib/equates/KolibriOS/_geometry.inc.







































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Different geometry structures.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


struct RECT
  .left   dd ?
  .top    dd ?
  .right  dd ?
  .bottom dd ?
ends

struct POINT
  .x  dd ?
  .y  dd ?
ends


struct TBounds
  .x      dd ?
  .y      dd ?
  .width  dd ?
  .height dd ?
ends

Added freshlib/equates/KolibriOS/_libFT.inc.



































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: FreeType library constants and structures.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


FT_FACE_FLAG_SCALABLE           = $0001
FT_FACE_FLAG_FIXED_SIZES        = $0002
FT_FACE_FLAG_FIXED_WIDTH        = $0004
FT_FACE_FLAG_SFNT               = $0008
FT_FACE_FLAG_HORIZONTAL         = $0010
FT_FACE_FLAG_VERTICAL           = $0020
FT_FACE_FLAG_KERNING            = $0040
FT_FACE_FLAG_FAST_GLYPHS        = $0080
FT_FACE_FLAG_MULTIPLE_MASTERS   = $0100
FT_FACE_FLAG_GLYPH_NAMES        = $0200
FT_FACE_FLAG_EXTERNAL_STREAM    = $0400
FT_FACE_FLAG_HINTER             = $0800
FT_FACE_FLAG_CID_KEYED          = $1000
FT_FACE_FLAG_TRICKY             = $2000


FT_LOAD_DEFAULT                         =  $0
FT_LOAD_NO_SCALE                        =  $1
FT_LOAD_NO_HINTING                      =  $2
FT_LOAD_RENDER                          =  $4
FT_LOAD_NO_BITMAP                       =  $8
FT_LOAD_VERTICAL_LAYOUT                 =  $10
FT_LOAD_FORCE_AUTOHINT                  =  $20
FT_LOAD_CROP_BITMAP                     =  $40          ; deprecated, ignored
FT_LOAD_PEDANTIC                        =  $80
FT_LOAD_ADVANCE_ONLY                    =  $100
FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH     =  $200         ; deprecated, ignored
FT_LOAD_NO_RECURSE                      =  $400
FT_LOAD_IGNORE_TRANSFORM                =  $800
FT_LOAD_MONOCHROME                      =  $1000
FT_LOAD_LINEAR_DESIGN                   =  $2000
FT_LOAD_SBITS_ONLY                      =  $4000
FT_LOAD_NO_AUTOHINT                     =  $8000
FT_LOAD_COLOR                           =  $100000

FT_ADVANCE_FLAG_FAST_ONLY               =  $20000000


FT_RENDER_MODE_NORMAL = 0
FT_RENDER_MODE_LIGHT  = 1
FT_RENDER_MODE_MONO   = 2
FT_RENDER_MODE_LCD    = 3
FT_RENDER_MODE_LCD_V  = 4
FT_RENDER_MODE_MAX    = 5

struc FT_LOAD_TARGET x {
  . = (x and 15) shl 16
}

FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET  FT_RENDER_MODE_NORMAL
FT_LOAD_TARGET_LIGHT  FT_LOAD_TARGET  FT_RENDER_MODE_LIGHT
FT_LOAD_TARGET_MONO   FT_LOAD_TARGET  FT_RENDER_MODE_MONO
FT_LOAD_TARGET_LCD    FT_LOAD_TARGET  FT_RENDER_MODE_LCD
FT_LOAD_TARGET_LCD_V  FT_LOAD_TARGET  FT_RENDER_MODE_LCD_V



FT_PIXEL_MODE_NONE  = 0
FT_PIXEL_MODE_MONO  = 1
FT_PIXEL_MODE_GRAY  = 2
FT_PIXEL_MODE_GRAY2 = 3
FT_PIXEL_MODE_GRAY4 = 4
FT_PIXEL_MODE_LCD   = 5
FT_PIXEL_MODE_LCD_V = 6
FT_PIXEL_MODE_BGRA  = 7


struct FT_Generic
  .data         dd ?
  .finalizer    dd ?    ; pointer to procedure with one argument.
ends

struct FT_BBox
  .xMin         dd ?
  .yMin         dd ?
  .xMax         dd ?
  .yMax         dd ?
ends

struct FT_Vector
  .x dd ?
  .y dd ?
ends

struct FT_Bitmap
  .rows         dd ?
  .width        dd ?
  .pitch        dd ?
  .buffer       dd ?    ; pointer to the buffer.
  .num_grays    dw ?
  .pixel_mode   db ?
  .palette_mode db ?
  .palette      dd ?    ; pointer to the palette.
ends




struct FT_Outline
  .n_contours  dw  ?
  .n_points    dw  ?
  .points      dd  ?    ; pointer to array of FT_Vector elements.
  .tags        dd  ?    ; pointer to byte array.
  .contours    dd  ?    ; pointer to word array.
  .flags       dd  ?
ends



struct  FT_Glyph_Metrics
  .width        dd ?
  .height       dd ?
  .horiBearingX dd ?
  .horiBearingY dd ?
  .horiAdvance  dd ?

  .vertBearingX dd ?
  .vertBearingY dd ?
  .vertAdvance  dd ?
ends



struct FT_GlyphSlot
  .library      dd ?
  .face         dd ?    ; parent FT_Face object
  .next         dd ?    ; pointer tp FT_GlyphSlot
  .reserved     dd ?
  .generic      FT_Generic

  .metrics      FT_Glyph_Metrics
  .linearHoriAdvance dd ?
  .linearVertAdvance dd ?

  .advance      FT_Vector

  .format       dd ?

  .bitmap       FT_Bitmap
  .bitmap_left  dd ?
  .bitmap_top   dd ?

  .outline      FT_Outline

  .num_subglyphs dd ?
  .subglyphs     dd ?   ; pointer to array of FT_SubGlyphRec elements.

  .control_data  dd ?
  .control_len   dd ?

  .lsb_delta     dd ?
  .rsb_delta     dd ?

  .other         dd ?
  .internal      dd ?   ; pointer to FT_Slot_InternalRec
ends


struct FT_FaceRec
  .num_faces    dd ?
  .face_index   dd ?
  .face_flags   dd ?
  .style_flags  dd ?
  .num_glyphs   dd ?
  .family_name  dd ?
  .style_name   dd ?

  .num_fixed_sizes dd ?
  .available_sizes dd ?

  .num_charmaps dd ?
  .charmaps     dd ?
  .generic      FT_Generic

; scalable fonts members down to .underline_thickness

  .bbpx                 FT_BBox

  .units_per_EM         dw ?
  .ascender             dw ?
  .descender            dw ?
  .height               dw ?

  .max_advance_width    dw ?
  .max_advance_height   dw ?

  .underline_position   dw ?
  .underline_thickness  dw ?


  .glyph        dd  ?   ; pointer to FT_GlyphSlot
  .size         dd  ?   ; pointer to FT_Size
  .charmap      dd  ?   ; pointer to FT_CharMap

; down is the private part.

ends


struct FT_GlyphRec
  .library      dd      ?
  .clazz        dd      ?
  .format       dd      ?
  .advance      FT_Vector
ends


struct FT_BitmapGlyphRec
  .root         FT_GlyphRec
  .left         dd ?
  .top          dd ?
  .bitmap       FT_Bitmap
ends


FT_SIZE_REQUEST_TYPE_NOMINAL    = 0
FT_SIZE_REQUEST_TYPE_REAL_DIM   = 1
FT_SIZE_REQUEST_TYPE_BBOX       = 2
FT_SIZE_REQUEST_TYPE_CELL       = 3
FT_SIZE_REQUEST_TYPE_SCALES     = 4


struct FT_Size_RequestRec
  .type            dd  ?
  .width           dd  ?
  .height          dd  ?
  .horiResolution  dd  ?
  .vertResolution  dd  ?
ends


struct FT_Size_Metrics
  .x_ppem       dw      ?       ; horizontal pixels per EM
  .y_ppem       dw      ?       ; vertical pixels per EM

  .x_scale      dd      ?       ; scaling values used to convert font
  .y_scale      dd      ?       ; units to 26.6 fractional pixels

  .ascender     dd      ?       ; ascender in 26.6 frac. pixels
  .descender    dd      ?       ; descender in 26.6 frac. pixels
  .height       dd      ?       ; text height in 26.6 frac. pixels
  .max_advance  dd      ?       ; max horizontal advance, in 26.6 pixels
ends


struct FT_SizeRec
  .face         dd  ?           ; parent face object
  .generic      FT_Generic      ; generic pointer for client uses
  .metrics      FT_Size_Metrics ; size metrics
  .internal:
ends


struct FTC_ScalerRec
  .face_id dd ?
  .width   dd ?
  .height  dd ?
  .pixel   dd ?
  .x_res   dd ?
  .y_res   dd ?
ends


struct FTC_ImageType
  .face_id  dd  ?
  .width    dd  ?
  .height   dd  ?
  .flags    dd  ?
ends




interface FT_Face_Requester, .face_id, .library, .request_data, .pFace

Added freshlib/equates/KolibriOS/_network.inc.



























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
UNIX_PATH_MAX = 108


;Protocol family
AF_UNSPEC               = 0
AF_LOCAL                = 1
AF_INET4                = 2
AF_INET6                = 10
AF_PPP                  = 777           ; FIXME

AF_INET = AF_INET4

PF_UNSPEC  =  AF_UNSPEC
PF_LOCAL   =  AF_LOCAL
PF_INET4   =  AF_INET4
PF_INET6   =  AF_INET6
PF_PPP     =  AF_PPP

PF_INET    =  AF_INET

; Socket types
SOCK_STREAM             = 1
SOCK_DGRAM              = 2
SOCK_RAW                = 3

; Socket level
SOL_SOCKET              = 0xffff

; Socket options
SO_ACCEPTCON            = 1 shl 0
SO_BROADCAST            = 1 shl 1
SO_DEBUG                = 1 shl 2
SO_DONTROUTE            = 1 shl 3
SO_KEEPALIVE            = 1 shl 4
SO_OOBINLINE            = 1 shl 5
SO_REUSEADDR            = 1 shl 6
SO_REUSEPORT            = 1 shl 7
SO_USELOOPBACK          = 1 shl 8
SO_BINDTODEVICE         = 1 shl 9

SO_NONBLOCK             = 1 shl 31

SO_RCVBUF = 0
SO_SNDBUF = 0
SO_RCVTIMEO = 0
SO_SNDTIMEO = 0
SO_LINGER = 0

SO_RCVBUF       = 0
SO_SNDBUF       = 0
SO_RCVTIMEO     = 0
SO_SNDTIMEO     = 0
SO_LINGER       = 0


; Socket States
SS_NOFDREF              = 0x0001        ; no file table ref any more
SS_ISCONNECTED          = 0x0002        ; socket connected to a peer
SS_ISCONNECTING         = 0x0004        ; in process of connecting to peer
SS_ISDISCONNECTING      = 0x0008        ; in process of disconnecting
SS_CANTSENDMORE         = 0x0010        ; can't send more data to peer
SS_CANTRCVMORE          = 0x0020        ; can't receive more data from peer
SS_RCVATMARK            = 0x0040        ; at mark on input
SS_ISABORTING           = 0x0080        ; aborting fd references - close()
SS_RESTARTSYS           = 0x0100        ; restart blocked system calls
SS_ISDISCONNECTED       = 0x0800        ; socket disconnected from peer

SS_ASYNC                = 0x1000        ; async i/o notify
SS_ISCONFIRMING         = 0x2000        ; deciding to accept connection req
SS_MORETOCOME           = 0x4000

SS_BLOCKED              = 0x8000


SOCKET_MAXDATA          = 4096*64     ; must be 4096*(power of 2) where 'power of 2' is at least 8


; Error Codes
ENOBUFS                 = 1
EINPROGRESS             = 2
EOPNOTSUPP              = 4
EWOULDBLOCK             = 6
ENOTCONN                = 9
EALREADY                = 10
EINVAL                  = 11
EMSGSIZE                = 12
ENOMEM                  = 18
EADDRINUSE              = 20
ECONNREFUSED            = 61
ECONNRESET              = 52
EISCONN                 = 56
ETIMEDOUT               = 60
ECONNABORTED            = 53

Added freshlib/equates/KolibriOS/_syscalls.inc.













































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license.           |
;|_______________________________________________________________________________________|
;
;  Description: KolibriOS system functions and related constants.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


sys_drawwindow          =   0     ;  DrawWindow
syscall_setpixel        =   1     ;  SetPixel
sys_getkey              =   2     ;  GetKey
sys_clock               =   3     ;  GetTime
sys_writetext           =   4     ;  WriteText
sys_delay_hs            =   5     ;  DelayHs
sys_openramdiskfile     =   6     ;  OpenRamdiskFile
sys_putimage            =   7     ;  PutImage
sys_button              =   8     ;  DefineButton
sys_cpuusage            =   9     ;  GetProcessInfo
sys_waitforevent        =   10    ;  WaitForEvent
sys_getevent            =   11    ;  CheckForEvent
sys_redrawstat          =   12    ;  BeginDraw and EndDraw
sys_drawrect            =   13    ;  DrawRect
sys_getscreensize       =   14    ;  GetScreenSize
sys_background          =   15    ;  bgr
sys_cachetodiskette     =   16    ;  FlushFloppyCache
sys_getbutton           =   17    ;  GetButton
sys_system              =   18    ;  System Services
sys_midi                =   20    ;  ResetMidi and OutputMidi
sys_setup               =   21    ;  SetMidiBase,SetKeymap,SetShiftKeymap,.
sys_settime             =   22    ;  setting date,time,clock and alarm    ;  clock
sys_wait_event_timeout  =   23    ;  TimeOutWaitForEvent
sys_cdaudio             =   24    ;  PlayCdTrack,StopCd and GetCdPlaylist
sys_getsetup            =   26    ;  GetMidiBase,GetKeymap,GetShiftKeymap,.
sys_date                =   29    ;  GetDate
sys_current_directory   =   30    ;  Get/SetCurrentDirectory
sys_getpixel            =   35    ;  GetPixel
sys_getarea             =   36    ;  GetArea
sys_readmousepos        =   37    ;  GetMousePosition_ScreenRelative,.
syscall_drawline        =   38    ;  DrawLine
sys_getbackground       =   39    ;  GetBackgroundSize,ReadBgrData,.
sys_set_app_param       =   40    ;  WantEvents
sys_get_irq_owner       =   41    ;  GetIrqOwner
sys_get_irq_data        =   42    ;  ReadIrqData
sys_outport             =   43    ;  SendDeviceData
sys_program_irq         =   44    ;  ProgramIrqs
sys_reserve_free_irq    =   45    ;  ReserveIrq and FreeIrq
sys_reserveportarea     =   46    ;  ReservePortArea and FreePortArea
sys_display_number      =   47    ;  WriteNum
sys_display_settings    =   48    ;  SetRedrawType and SetButtonType
sys_apm                 =   49    ;  Advanced Power Management (APM)
sys_random_shaped_window=   50    ;  Window shape & scale
sys_threads             =   51    ;  Threads
sys_stack_driver_stat   =   52    ;  Stack driver status
sys_socket_old          =   53    ;  Socket interface

sys_sound_interface     =   55    ;  Sound interface
sys_pcibios             =   57    ;  PCI BIOS32
sys_file_system         =   58    ;  Common file system interface
sys_IPC                 =   60    ;  Inter Process Communication
sys_gs                  =   61    ;  Direct graphics access
sys_pci                 =   62    ;  PCI functions
sys_msg_board           =   63    ;  System message board
sys_resize_app_memory   =   64    ;  Resize application memory usage
sys_putimage_palette    =   65    ;  PutImagePalette
sys_process_def         =   66    ;  Process definitions - keyboard
sys_window_move         =   67    ;  Window move or resize
sys_f68                 =   68    ;  Some internal services
sys_debug_services      =   69    ;  Debug
sys_file_system_lfn     =   70    ;  Common file system interface, version 2
sys_windowsettings      =   71    ;  Window settings
sys_sendwindowmsg       =   72    ;  Send window message
sys_socket              =   75    ;  http://wiki.kolibrios.org/wiki/New_network_api
sys_end                 =   -1    ;  end application




; sys_socket subfunctions

sockOpen        = 0
sockClose       = 1
sockBind        = 2
sockListen      = 3
sockConnect     = 4
sockAccept      = 5
sockSend        = 6
sockReceive     = 7
sockSetOptions  = 8
sockGetOptions  = 9
sockPair        = 10


; sys_file_system_lfn subfunctions

fsfRead        = 0
fsfReadDir     = 1
fsfCreate      = 2
fsfWrite       = 3
fsfSetSize     = 4
fsfFileInfo    = 5
fsfSetAttr     = 6
fsfExec        = 7
fsfDel         = 8      ; for files and directories
fsfCreateDir   = 9






; windows/thread events

eventRedraw             = 1
eventKeyboard           = 2
eventGUIButton          = 3
eventReserved           = 4     ; reserved, not used
eventDesktopRepainted   = 5
eventMouse              = 6     ; move or key pressed
eventIPC                = 7
eventNetwork            = 8
eventDebug              = 9
eventIRQ0               = 16
eventIRQ1               = 17
eventIRQ2               = 18
eventIRQ3               = 19
eventIRQ4               = 20
eventIRQ5               = 21
eventIRQ6               = 22
eventIRQ7               = 23
eventIRQ8               = 24
eventIRQ9               = 25
eventIRQ10              = 26
eventIRQ11              = 27
eventIRQ12              = 28
eventIRQ13              = 29
eventIRQ14              = 30
eventIRQ15              = 31

emaskRedraw             = 1
emaskKeyboard           = 2
emaskGUIButton          = 4
emaskReserved           = 8
emaskDesktopRedraw      = 16
emaskMouse              = 32
emaskIPCEvent           = 64
emaskNetwork            = 128
emaskDebug              = 256


struct __TThreadInfo
  .cpu_usage   dd ?
  .zposWindow  dw ?
  .nWindowSlot dw ?
  .reserve1    dw ?
  .ProcessName rb 11
  .reserve2    db ?
  .processAddr dd ?
  .processSize dd ?
  .TID         dd ?
  .wndPosX     dd ?
  .wndPosY     dd ?
  .wndSizeX    dd ?
  .wndSizeY    dd ?
  .ThreadState dw ?
  .reserve3    dw ?
  .ClientPosX  dd ?
  .ClientPosY  dd ?
  .ClientWidth dd ?
  .ClientHeight dd ?
  .WindowState  db ?
  .EventMask    dd ?
  .min_size = $$ - $
                rb 1024 - .min_size
ends


accessRead  = 1
accessWrite = 2



; Error codes

errSuccess              = 0

errBaseNotDefined       = 1   ; base and/or partition of a hard disk is not defined
                              ; (by subfunctions 7, 8 of function 21)

errFunctionNotSupported = 2   ; function is not supported for the given file system
errUnknownFileSystem    = 3   ; unknown file system
;errReserved             = 4   ; reserved, is never returned in the current implementation
errFileNotFound         = 5   ; file not found
errEndOfFile            = 6   ; end of file, EOF
errBadPointer           = 7   ; pointer lies outside of application memory
errDiskFull             = 8   ; disk is full
errBadFat               = 9   ; FAT table is destroyed
errAccessDenied         = 10  ; access denied
errDeviceError          = 11  ; device error


errFileAlreadyExists    = 100   ; FreshLib error code on faCreateOnly

; Application start functions can return also following errors:

errNotEnoughMemory      = 30  ; not enough memory
errNotExecutable        = 31  ; file is not executable
errTooManyProcesses     = 32  ; too many processes

Added freshlib/equates/KolibriOS/allequates.inc.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Combined include of all KolibriOS equate files.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


include '_syscalls.inc'
include '_geometry.inc'
include '_network.inc'
include '_libFT.inc'

Changes to freshlib/equates/Linux/XftCompat.inc.

1
2
3
4
5
6
7
8
; 
;  * $Id: XftCompat.h,v 1.4 2005/07/03 07:00:57 daniels Exp $
;  *
;  * Copyright © 2001 Keith Packard
;  *
;  * Permission to use, copy, modify, distribute, and sell this software and its
;  * documentation for any purpose is hereby granted without fee, provided that
;  * the above copyright notice appear in all copies and that both that
|







1
2
3
4
5
6
7
8
;
;  * $Id: XftCompat.h,v 1.4 2005/07/03 07:00:57 daniels Exp $
;  *
;  * Copyright © 2001 Keith Packard
;  *
;  * Permission to use, copy, modify, distribute, and sell this software and its
;  * documentation for any purpose is hereby granted without fee, provided that
;  * the above copyright notice appear in all copies and that both that
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
;  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
;  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
;  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
;  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
;  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
;  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
;  * PERFORMANCE OF THIS SOFTWARE.
;  

if ~defined  _XFTCOMPAT_H_ | defined @f
@@:
_XFTCOMPAT_H_	=	1
include	"X11/Xfuncproto.h"  


; 
;  * Compatibility definitions -- map Fc names to Xft names
;  

XftChar8	equ	 FcChar8	   
XftChar16	equ	 FcChar16   
XftChar32	equ	 FcChar32   

XFT_FAMILY	equ	FC_FAMILY
XFT_STYLE	equ	FC_STYLE
XFT_SLANT	equ	FC_SLANT
XFT_WEIGHT	equ	FC_WEIGHT
XFT_SIZE	equ	FC_SIZE
XFT_PIXEL_SIZE	equ	FC_PIXEL_SIZE
XFT_SPACING	equ	FC_SPACING
XFT_FOUNDRY	equ	FC_FOUNDRY
XFT_ANTIALIAS	equ	FC_ANTIALIAS
XFT_FILE	equ	FC_FILE
XFT_INDEX	equ	FC_INDEX
XFT_RASTERIZER	equ	FC_RASTERIZER
XFT_OUTLINE	equ	FC_OUTLINE
XFT_SCALABLE	equ	FC_SCALABLE
XFT_RGBA	equ	FC_RGBA

;  defaults from resources 
XFT_SCALE	equ	FC_SCALE
XFT_MINSPACE	equ	FC_MINSPACE
XFT_DPI	equ	FC_DPI

;  specific to FreeType rasterizer 
XFT_CHAR_WIDTH	equ	FC_CHAR_WIDTH
XFT_CHAR_HEIGHT	equ	FC_CHAR_HEIGHT
XFT_MATRIX	equ	FC_MATRIX

XFT_WEIGHT_LIGHT	equ	FC_WEIGHT_LIGHT
XFT_WEIGHT_MEDIUM	equ	FC_WEIGHT_MEDIUM
XFT_WEIGHT_DEMIBOLD	equ	FC_WEIGHT_DEMIBOLD
XFT_WEIGHT_BOLD	equ	FC_WEIGHT_BOLD
XFT_WEIGHT_BLACK	equ	FC_WEIGHT_BLACK

XFT_SLANT_ROMAN	equ	FC_SLANT_ROMAN
XFT_SLANT_ITALIC	equ	FC_SLANT_ITALIC
XFT_SLANT_OBLIQUE	equ	FC_SLANT_OBLIQUE

XFT_PROPORTIONAL	equ	FC_PROPORTIONAL
XFT_MONO	equ	FC_MONO
XFT_CHARCELL	equ	FC_CHARCELL

XFT_RGBA_UNKNOWN	equ	FC_RGBA_UNKNOWN
XFT_RGBA_RGB	equ	FC_RGBA_RGB
XFT_RGBA_BGR	equ	FC_RGBA_BGR
XFT_RGBA_VRGB	equ	FC_RGBA_VRGB
XFT_RGBA_VBGR	equ	FC_RGBA_VBGR
XFT_RGBA_NONE	equ	FC_RGBA_NONE

; 
;  * Old constants
;  
XFT_ENCODING	equ	"encoding"

XftType	equ	 FcType

XftMatrix	equ	 FcMatrix


XftResult	equ	 FcResult   

XftResultMatch	equ	FcResultMatch
XftResultNoMatch	equ	FcResultNoMatch
XftResultTypeMismatch	equ	FcResultTypeMismatch
XftResultNoId	equ	FcResultNoId

XftValue	equ	 FcValue	
XftPattern	equ	 FcPattern
XftFontSet	equ	 FcFontSet
XftObjectSet	equ	 FcObjectSet

XftGlyphExists	equ	XftCharExists

XftObjectSetCreate	equ	FcObjectSetCreate
XftObjectSetAdd	equ	FcObjectSetAdd
XftObjectSetDestroy	equ	FcObjectSetDestroy
XftObjectSetVaBuild	equ	FcObjectSetVaBuild
XftObjectSetBuild	equ	FcObjectSetBuild

XftFontSetMatch	equ	FcFontSetMatch
XftFontSetDestroy	equ	FcFontSetDestroy

XftMatrixEqual	equ	FcMatrixEqual
XftMatrixMultiply	equ	FcMatrixMultiply
XftMatrixRotate	equ	FcMatrixRotate
XftMatrixScale	equ	FcMatrixScale
XftMatrixShear	equ	FcMatrixShear

XftPatternCreate	equ	FcPatternCreate
XftPatternDuplicate	equ	FcPatternDuplicate
XftValueDestroy	equ	FcValueDestroy
XftValueListDestroy	equ	FcValueListDestroy
XftPatternDestroy	equ	FcPatternDestroy
XftPatternFind	equ	FcPatternFind
XftPatternAdd	equ	FcPatternAdd
XftPatternGet	equ	FcPatternGet
XftPatternDel	equ	FcPatternDel
XftPatternAddInteger	equ	FcPatternAddInteger
XftPatternAddDouble	equ	FcPatternAddDouble
XftPatternAddMatrix	equ	FcPatternAddMatrix
XftPatternAddBool	equ	FcPatternAddBool
XftPatternGetInteger	equ	FcPatternGetInteger
XftPatternGetDouble	equ	FcPatternGetDouble
XftPatternGetMatrix	equ	FcPatternGetMatrix
XftPatternGetBool	equ	FcPatternGetBool
XftPatternVaBuild	equ	FcPatternVaBuild
XftPatternBuild	equ	FcPatternBuild

XftUtf8ToUcs	=	4
		FcUtf8ToUcs4
XftUtf	=	8
Len		FcUtf8Len

XftTypeVoid	equ	FcTypeVoid
XftTypeInteger	equ	FcTypeInteger
XftTypeDouble	equ	FcTypeDouble
XftTypeString	equ	FcTypeString
XftTypeBool	equ	FcTypeBool
XftTypeMatrix	equ	FcTypeMatrix





end if







|



|
|


|

|

|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|

|
|
|
|
|

|
|
|

|
|
|

|
|
|
|
|
|

|

|
|

|

|


|

|
|
|
|

|
|
|
|

|

|
|
|
|
|

|
|

|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|






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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
;  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
;  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
;  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
;  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
;  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
;  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
;  * PERFORMANCE OF THIS SOFTWARE.
;

if ~defined  _XFTCOMPAT_H_ | defined @f
@@:
_XFTCOMPAT_H_   =       1
include "X11/Xfuncproto.h"


;
;  * Compatibility definitions -- map Fc names to Xft names
;

XftChar8        equ      FcChar8
XftChar16       equ      FcChar16
XftChar32       equ      FcChar32

XFT_FAMILY      equ     FC_FAMILY
XFT_STYLE       equ     FC_STYLE
XFT_SLANT       equ     FC_SLANT
XFT_WEIGHT      equ     FC_WEIGHT
XFT_SIZE        equ     FC_SIZE
XFT_PIXEL_SIZE  equ     FC_PIXEL_SIZE
XFT_SPACING     equ     FC_SPACING
XFT_FOUNDRY     equ     FC_FOUNDRY
XFT_ANTIALIAS   equ     FC_ANTIALIAS
XFT_FILE        equ     FC_FILE
XFT_INDEX       equ     FC_INDEX
XFT_RASTERIZER  equ     FC_RASTERIZER
XFT_OUTLINE     equ     FC_OUTLINE
XFT_SCALABLE    equ     FC_SCALABLE
XFT_RGBA        equ     FC_RGBA

;  defaults from resources
XFT_SCALE       equ     FC_SCALE
XFT_MINSPACE    equ     FC_MINSPACE
XFT_DPI equ     FC_DPI

;  specific to FreeType rasterizer
XFT_CHAR_WIDTH  equ     FC_CHAR_WIDTH
XFT_CHAR_HEIGHT equ     FC_CHAR_HEIGHT
XFT_MATRIX      equ     FC_MATRIX

XFT_WEIGHT_LIGHT        equ     FC_WEIGHT_LIGHT
XFT_WEIGHT_MEDIUM       equ     FC_WEIGHT_MEDIUM
XFT_WEIGHT_DEMIBOLD     equ     FC_WEIGHT_DEMIBOLD
XFT_WEIGHT_BOLD equ     FC_WEIGHT_BOLD
XFT_WEIGHT_BLACK        equ     FC_WEIGHT_BLACK

XFT_SLANT_ROMAN equ     FC_SLANT_ROMAN
XFT_SLANT_ITALIC        equ     FC_SLANT_ITALIC
XFT_SLANT_OBLIQUE       equ     FC_SLANT_OBLIQUE

XFT_PROPORTIONAL        equ     FC_PROPORTIONAL
XFT_MONO        equ     FC_MONO
XFT_CHARCELL    equ     FC_CHARCELL

XFT_RGBA_UNKNOWN        equ     FC_RGBA_UNKNOWN
XFT_RGBA_RGB    equ     FC_RGBA_RGB
XFT_RGBA_BGR    equ     FC_RGBA_BGR
XFT_RGBA_VRGB   equ     FC_RGBA_VRGB
XFT_RGBA_VBGR   equ     FC_RGBA_VBGR
XFT_RGBA_NONE   equ     FC_RGBA_NONE

;
;  * Old constants
;
XFT_ENCODING    equ     "encoding"

XftType equ      FcType

XftMatrix       equ      FcMatrix


XftResult       equ      FcResult

XftResultMatch  equ     FcResultMatch
XftResultNoMatch        equ     FcResultNoMatch
XftResultTypeMismatch   equ     FcResultTypeMismatch
XftResultNoId   equ     FcResultNoId

XftValue        equ      FcValue
XftPattern      equ      FcPattern
XftFontSet      equ      FcFontSet
XftObjectSet    equ      FcObjectSet

XftGlyphExists  equ     XftCharExists

XftObjectSetCreate      equ     FcObjectSetCreate
XftObjectSetAdd equ     FcObjectSetAdd
XftObjectSetDestroy     equ     FcObjectSetDestroy
XftObjectSetVaBuild     equ     FcObjectSetVaBuild
XftObjectSetBuild       equ     FcObjectSetBuild

XftFontSetMatch equ     FcFontSetMatch
XftFontSetDestroy       equ     FcFontSetDestroy

XftMatrixEqual  equ     FcMatrixEqual
XftMatrixMultiply       equ     FcMatrixMultiply
XftMatrixRotate equ     FcMatrixRotate
XftMatrixScale  equ     FcMatrixScale
XftMatrixShear  equ     FcMatrixShear

XftPatternCreate        equ     FcPatternCreate
XftPatternDuplicate     equ     FcPatternDuplicate
XftValueDestroy equ     FcValueDestroy
XftValueListDestroy     equ     FcValueListDestroy
XftPatternDestroy       equ     FcPatternDestroy
XftPatternFind  equ     FcPatternFind
XftPatternAdd   equ     FcPatternAdd
XftPatternGet   equ     FcPatternGet
XftPatternDel   equ     FcPatternDel
XftPatternAddInteger    equ     FcPatternAddInteger
XftPatternAddDouble     equ     FcPatternAddDouble
XftPatternAddMatrix     equ     FcPatternAddMatrix
XftPatternAddBool       equ     FcPatternAddBool
XftPatternGetInteger    equ     FcPatternGetInteger
XftPatternGetDouble     equ     FcPatternGetDouble
XftPatternGetMatrix     equ     FcPatternGetMatrix
XftPatternGetBool       equ     FcPatternGetBool
XftPatternVaBuild       equ     FcPatternVaBuild
XftPatternBuild equ     FcPatternBuild

XftUtf8ToUcs    =       4
                FcUtf8ToUcs4
XftUtf  =       8
Len             FcUtf8Len

XftTypeVoid     equ     FcTypeVoid
XftTypeInteger  equ     FcTypeInteger
XftTypeDouble   equ     FcTypeDouble
XftTypeString   equ     FcTypeString
XftTypeBool     equ     FcTypeBool
XftTypeMatrix   equ     FcTypeMatrix





end if

Added freshlib/equates/Linux/_XLib.inc.

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: XLib specific constants and structures.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


; X Protocol
 X_PROTOCOL              =       11
 X_PROTOCOL_REVISION     =       0

;X Constants

None            =       0
ParentRelative  =       1
CopyFromParent  =       0
PointerWindow   =       0
InputFocus      =       1
PointerRoot     =       1
AnyPropertyType =       0
AnyKey          =       0
AnyButton       =       0
AllTemporary    =       0
CurrentTime     =       0
NoSymbol        =       0

;Event Masks

NoEventMask              =       0h
KeyPressMask             =       1h
KeyReleaseMask           =       2h
ButtonPressMask          =       4h
ButtonReleaseMask        =       8h
EnterWindowMask          =      10h
LeaveWindowMask          =      20h
PointerMotionMask        =      40h
PointerMotionHintMask    =      80h
Button1MotionMask        =     100h
Button2MotionMask        =     200h
Button3MotionMask        =     400h
Button4MotionMask        =     800h
Button5MotionMask        =    1000h
ButtonMotionMask         =    2000h
KeymapStateMask          =    4000h
ExposureMask             =    8000h
VisibilityChangeMask     =   10000h
StructureNotifyMask      =   20000h
ResizeRedirectMask       =   40000h
SubstructureNotifyMask   =   80000h
SubstructureRedirectMask =  100000h
FocusChangeMask          =  200000h
PropertyChangeMask       =  400000h
ColormapChangeMask       =  800000h
OwnerGrabButtonMask      = 1000000h

AllEventsMask            = 1fbff7fh   ;1ffffffh


QueuedAlready           = 0
QueuedAfterReading      = 1
QueuedAfterFlush        = 2


;Event           Names

KeyPress                =       2
KeyRelease              =       3
ButtonPress             =       4
ButtonRelease           =       5
MotionNotify            =       6
EnterNotify             =       7
LeaveNotify             =       8
FocusIn                 =       9
FocusOut                =       10
KeymapNotify            =       11
Expose                  =       12
GraphicsExpose          =       13
NoExpose                =       14
VisibilityNotify        =       15
CreateNotify            =       16
DestroyNotify           =       17
UnmapNotify             =       18
MapNotify               =       19
MapRequest              =       20
ReparentNotify          =       21
ConfigureNotify         =       22
ConfigureRequest        =       23
GravityNotify           =       24
ResizeRequest           =       25
CirculateNotify         =       26
CirculateRequest        =       27
PropertyNotify          =       28
SelectionClear          =       29
SelectionRequest        =       30
SelectionNotify         =       31
ColormapNotify          =       32
ClientMessage           =       33
MappingNotify           =       34
LASTEvent               =       35

;Key             Masks

ShiftMask       =       1h
LockMask        =       2h
ControlMask     =       4h
Mod1Mask        =       8h
Mod2Mask        =       10h
Mod3Mask        =       20h
Mod4Mask        =       40h
Mod5Mask        =       80h

;Modifier                Names

ShiftMapIndex   =       0
LockMapIndex    =       1
ControlMapIndex =       2
Mod1MapIndex    =       3
Mod2MapIndex    =       4
Mod3MapIndex    =       5
Mod4MapIndex    =       6
Mod5MapIndex    =       7

;Button          Masks

Button1Mask     =       100h
Button2Mask     =       200h
Button3Mask     =       400h
Button4Mask     =       800h
Button5Mask     =       1000h
AnyModifier     =       10000h

;Button          Names

Button1         =       1
Button2         =       2
Button3         =       3
Button4         =       4
Button5         =       5

;Notify          Modes
NotifyNormal    =       0
NotifyGrab      =       1
NotifyUngrab    =       2
NotifyWhileGrabbed      =       3
NotifyHint      =       1

;Notify          Detail

NotifyAncestor  =       0
NotifyVirtual   =       1
NotifyInferior  =       2
NotifyNonlinear =       3
NotifyNonlinearVirtual  =       4
NotifyPointer   =       5
NotifyPointerRoot       =       6
NotifyDetailNone        =       7

;Visibility              Notify

VisibilityUnobscured    =       0
VisibilityPartiallyObscured     =       1
VisibilityFullyObscured =       2

;Circulation             request

PlaceOnTop      =       0
PlaceOnBottom   =       1

;Protocol                Families

FamilyInternet  =       0
FamilyDECnet    =       1
FamilyChaos     =       2
FamilyInternet6 =       6

;Unspecific              authentication  families

FamilyServerInterpreted =       5

;Property       Notification

PropertyNewValue        =       0
PropertyDelete  =       1

;Color           Map     notification

ColormapUninstalled     =       0
ColormapInstalled       =       1

;Grab            Modes
GrabModeSync    =       0
GrabModeAsync   =       1

;Grab            reply   status
GrabSuccess     =       0
AlreadyGrabbed  =       1
GrabInvalidTime =       2
GrabNotViewable =       3
GrabFrozen      =       4

;AllowEvents             modes
AsyncPointer    =       0
SyncPointer     =       1
ReplayPointer   =       2
AsyncKeyboard   =       3
SyncKeyboard    =       4
ReplayKeyboard  =       5
AsyncBoth       =       6
SyncBoth        =       7

;InputFocus              specific

RevertToNone    =       None
RevertToPointerRoot     =       PointerRoot
RevertToParent  =       2

;Error           Codes
Success                 =       0
BadRequest              =       1
BadValue                =       2
BadWindow               =       3
BadPixmap               =       4
BadAtom                 =       5
BadCursor               =       6
BadFont                 =       7
BadMatch                =       8
BadDrawable             =       9
BadAccess               =       10
BadAlloc                =       11
BadColor                =       12
BadGC                   =       13
BadIDChoice             =       14
BadName                 =       15
BadLength               =       16
BadImplementation       =       17
FirstExtensionError     =       128
LastExtensionError      =       255

;Window          Classes

InputOutput     =       1
InputOnly       =       2

;Window          Attributes
CWBackPixmap    =       1h
CWBackPixel     =       2h
CWBorderPixmap  =       4h
CWBorderPixel   =       8h
CWBitGravity    =       10h
CWWinGravity    =       20h
CWBackingStore  =       40h
CWBackingPlanes =       80h
CWBackingPixel  =       100h
CWOverrideRedirect =    200h
CWSaveUnder     =       400h
CWEventMask     =       800h
CWDontPropagate =       1000h
CWColormap      =       2000h
CWCursor        =       4000h

;ConfigureWindow         Structure
CWX             =       1h
CWY             =       2h
CWWidth         =       4h
CWHeight        =       8h
CWBorderWidth   =       10h
CWSibling       =       20h
CWStackMode     =       40h

;Bit             Gravity
ForgetGravity           =       0
NorthWestGravity        =       1
NorthGravity            =       2
NorthEastGravity        =       3
WestGravity             =       4
CenterGravity           =       5
EastGravity             =       6
SouthWestGravity        =       7
SouthGravity            =       8
SouthEastGravity        =       9
StaticGravity           =       10

;Window          Gravity
UnmapGravity    =       0

;CreateWindow            backing-store   hint
NotUseful       =       0
WhenMapped      =       1
Always  =       2

;GetWindowAttributes             reply
IsUnmapped      =       0
IsUnviewable    =       1
IsViewable      =       2

;Used            in      ChangeSaveSet
SetModeInsert   =       0
SetModeDelete   =       1

;Used            in      ChangeCloseDownMode
DestroyAll      =       0
RetainPermanent =       1
RetainTemporary =       2

;Window          stacking        method  (in     configureWindow)
Above   =       0
Below   =       1
TopIf   =       2
BottomIf        =       3
Opposite        =       4

;Circulation             direction
RaiseLowest     =       0
LowerHighest    =       1

;Property                modes
PropModeReplace =       0
PropModePrepend =       1
PropModeAppend  =       2

;Graphics Functions
GXclear         =       0
GXand           =       1
GXandReverse    =       2
GXcopy          =       3
GXandInverted   =       4
GXnoop          =       5
GXxor           =       6
GXor            =       7
GXnor           =       8
GXequiv         =       9
GXinvert        =       10
GXorReverse     =       11
GXcopyInverted  =       12
GXorInverted    =       13
GXnand          =       14
GXset           =       15

;LineStyle
LineSolid       =       0
LineOnOffDash   =       1
LineDoubleDash  =       2

;capStyle
CapNotLast      =       0
CapButt         =       1
CapRound        =       2
CapProjecting   =       3

;joinStyle
JoinMiter       =       0
JoinRound       =       1
JoinBevel       =       2

;fillStyle
FillSolid       =       0
FillTiled       =       1
FillStippled    =       2
FillOpaqueStippled      =       3

;fillRule

EvenOddRule     =       0
WindingRule     =       1

;subwindow               mode

ClipByChildren  =       0
IncludeInferiors        =       1

;SetClipRectangles               ordering

Unsorted        =       0
YSorted =       1
YXSorted        =       2
YXBanded        =       3

;CoordinateMode          for     drawing routines

CoordModeOrigin =       0
CoordModePrevious       =       1

;Polygon         shapes

Complex =       0
Nonconvex       =       1
Convex  =       2

;Arc             modes   for     PolyFillArc

ArcChord        =       0
ArcPieSlice     =       1

;GC              components

GCFunction      =       1h
GCPlaneMask     =       2h
GCForeground    =       4h
GCBackground    =       8h
GCLineWidth     =       10h
GCLineStyle     =       20h
GCCapStyle      =       40h
GCJoinStyle     =       80h
GCFillStyle     =       100h
GCFillRule      =       200h
GCTile  =       400h
GCStipple       =       800h
GCTileStipXOrigin       =       1000h
GCTileStipYOrigin       =       2000h
GCFont  =       4000h
GCSubwindowMode =       8000h
GCGraphicsExposures     =       10000h
GCClipXOrigin   =       20000h
GCClipYOrigin   =       40000h
GCClipMask      =       80000h
GCDashOffset    =       100000h
GCDashList      =       200000h
GCArcMode       =       400000h

GCLastBit       =       22

struct XRectangle
  .x       dw  ?
  .y       dw  ?
  .width   dw  ?
  .height  dw  ?
ends


GCAll = (1 shl (GCLastBit+1)) -1

struct XGCValues
  .function    dd ?                     ;  logical operation
  .plane_mask  dd ?                     ;  plane mask
  .foreground  dd ?                     ;  foreground pixel
  .background  dd ?                     ;  background pixel
  .line_width  dd ?                     ;  line width (in pixels)
  .line_style  dd ?                     ;  LineSolid, LineOnOffDash, LineDoubleDash
  .cap_style   dd ?                     ;  CapNotLast, CapButt, CapRound, CapProjecting
  .join_style  dd ?                     ;  JoinMiter, JoinRound, JoinBevel
  .fill_style  dd ?                     ;  FillSolid, FillTiled, FillStippled FillOpaqueStippled
  .fill_rule   dd ?                     ;  EvenOddRule, WindingRule
  .arc_mode    dd ?                     ;  ArcChord, ArcPieSlice
  .tile        dd ?                     ;  tile pixmap for tiling operations
  .stipple     dd ?                     ;  stipple 1 plane pixmap for stippling
  .ts_x_origin dd ?                     ;  offset for tile or stipple operations
  .ts_y_origin dd ?
  .font        dd ?                     ;  default text font for text operations
  .subwindow_mode dd ?                  ;  ClipByChildren, IncludeInferiors
  .fraphics_exposures dd ?              ;  boolean, should exposures be generated
  .clip_x_origin dd ?                   ;  origin for clipping
  .clip_y_origin dd ?
  .clip_mask   dd ?                     ;  bitmap clipping; other calls for rects
  .dash_offset dd ?                     ;  patterned/dashed line information
  .dashes      dd ?
ends


;used            in      QueryFont       --      draw    direction

FontLeftToRight =       0
FontRightToLeft =       1

FontChange      =       255

;ImageFormat             --      PutImage,       GetImage

XYBitmap        =       0
XYPixmap        =       1
ZPixmap =       2

;For             CreateColormap

AllocNone       =       0
AllocAll        =       1


;Flags           used    in      StoreNamedColor,        StoreColors

DoRed   =       1h
DoGreen =       2h
DoBlue  =       4h

;QueryBestSize           Class

CursorShape     =       0
TileShape       =       1
StippleShape    =       2

;Keyboard                pointer stuff

AutoRepeatModeOff       =       0
AutoRepeatModeOn        =       1
AutoRepeatModeDefault   =       2

LedModeOff      =       0
LedModeOn       =       1

;masks           for     ChangeKeyboardControl

KBKeyClickPercent       =       1h
KBBellPercent   =       2h
KBBellPitch     =       4h
KBBellDuration  =       8h
KBLed   =       10h
KBLedMode       =       20h
KBKey   =       40h
KBAutoRepeatMode        =       80h

MappingSuccess  =       0
MappingBusy     =       1
MappingFailed   =       2

MappingModifier =       0
MappingKeyboard =       1
MappingPointer  =       2

;Screensaver             stuff

DontPreferBlanking      =       0
PreferBlanking  =       1
DefaultBlanking =       2

DisableScreenSaver      =       0
DisableScreenInterval   =       0

DontAllowExposures      =       0
AllowExposures  =       1
DefaultExposures        =       2

;for             ForceScreenSaver

ScreenSaverReset        =       0
ScreenSaverActive       =       1

;for             ChangeHosts

HostInsert      =       0
HostDelete      =       1

;for             ChangeAccessControl

EnableAccess    =       1
DisableAccess   =       0

;display         classes

StaticGray      =       0
GrayScale       =       1
StaticColor     =       2
PseudoColor     =       3
TrueColor       =       4
DirectColor     =       5


;Byte            order           used    in      imageByteOrder  and     bitmapBitOrder

LSBFirst        =       0
MSBFirst        =       1

;Keyboard and Pointer Event Structures

struct   XButtonEvent
  .type         rd    1
  .serial       rd    1
  .send_event   rd    1
  .display      rd    1
  .window       rd    1
  .root         rd    1
  .subwindow    rd    1
  .time         rd    1
  .x            rd    1
  .y            rd    1
  .x_root       rd    1
  .y_root       rd    1
  .state        rd    1
  .button       rd    1
  .same_screen  rd    1
ends


struct XButtonPressedEvent
  . XButtonEvent
ends

struct XButtonReleasedEvent
  . XButtonEvent
ends

struct   XKeyEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .root                           rd    1
        .subwindow                      rd    1
        .time                           rd    1
        .x                              rd    1
        .y                              rd    1
        .x_root                         rd    1
        .y_root                         rd    1
        .state                          rd    1
        .keycode                        rd    1
        .same_screen                    rd    1
ends


struct XKeyPressedEvent
  . XKeyEvent
ends

struct XKeyReleasedEvent
  . XKeyEvent
ends


struct   XMotionEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .root                           rd    1
        .subwindow                      rd    1
        .time                           rd    1
        .x                              rd    1
        .y                              rd    1
        .x_root                         rd    1
        .y_root                         rd    1
        .state                          rd    1
        .is_hint                        rb    1
        .same_screen                    rd    1
ends


struct XPointerMovedEvent
  . XMotionEvent
ends

;Window Entry/Exit Events

struct   XCrossingEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .root                           rd    1
        .subwindow                      rd    1
        .time                           rd    1
        .x                              rd    1
        .y                              rd    1
        .x_root                         rd    1
        .y_root                         rd    1
        .mode                           rd    1
        .detail                         rd    1
        .same_screen                    rd    1
        .focus                          rd    1
        .state                          rd    1
ends

struct XEnterWindowEvent
  . XCrossingEvent
ends

struct XLeaveWindowEvent
  . XCrossingEvent
ends

;       Input           Focus   Events

struct   XFocusChangeEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .mode                           rd    1
        .detail                         rd    1
ends



struct XFocusInEvent
  . XFocusChangeEvent
ends

struct XFocusOutEvent
  . XFocusChangeEvent
ends

;       Keymap          Notification    Events

struct   XKeymapEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .key_vector                     rb    32
ends

;       Exposure/Update         Events

struct   XExposeEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .x                              rd    1
        .y                              rd    1
        .width                          rd    1
        .height                         rd    1
        .count                          rd    1
ends


struct   XGraphicsExposeEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .drawable                       rd    1
        .x                              rd    1
        .y                              rd    1
        .width                          rd    1
        .height                         rd    1
        .count                          rd    1
        .major_code                     rd    1
        .minor_code                     rd    1
ends


struct   XNoExposeEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .drawable                       rd    1
        .major_code                     rd    1
        .minor_code                     rd    1
ends


;       CirculateNotify         Events

struct   XCirculateEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1
        .window                         rd    1
        .place                          rd    1
ends


struct   XCirculateRequestEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .parent                         rd    1
        .window                         rd    1
        .place                          rd    1
ends

;       Configuration           Change  Events

struct   XConfigureEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1
        .window                         rd    1
        .x                              rd    1
        .y                              rd    1
        .width                          rd    1
        .height                         rd    1
        .border_width                   rd    1
        .above                          rd    1
        .override_redirect              rd    1
ends

struct   XConfigureRequestEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .parent                         rd    1
        .window                         rd    1
        .x                              rd    1
        .y                              rd    1
        .width                          rd    1
        .height                         rd    1
        .border_width                   rd    1
        .above                          rd    1
        .detail                         rd    1
        .value_mask                     rd    1
ends

struct   XPropertyEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .atom                           rd    1
        .time                           rd    1
        .state                          rd    1
ends

struct   XResizeEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .width                          rd    1
        .height                         rd    1
ends

struct   XColormapEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .colormap                       rd    1
        .new                            rd    1
        .state                          rd    1
ends

;       Creation/Destruction            Notifications

struct   XCreateWindowEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .parent                         rd    1
        .window                         rd    1
        .x                              rd    1
        .y                              rd    1
        .width                          rd    1
        .heigth                         rd    1
        .border_width                   rd    1
        .override_redirect              rd    1
ends


struct   XDestroyWindowEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1
        .window                         rd    1
ends

;       Parent          Movement        Events

struct   XGravityEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1
        .window                         rd    1
        .x                              rd    1
        .y                              rd    1
ends

;       Mapping         Events

struct   XMapEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1
        .window                         rd    1
        .override_redirect              rd    1
ends

struct   XMappingEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .request                        rd    1
        .first_keycode                  rd    1
        .count                          rd    1
ends


struct   XMapRequestEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .parent                         rd    1
        .window                         rd    1
ends

;       Parent          Change  Events

struct   XReparentEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1
        .window                         rd    1
        .parent                         rd    1
        .x                              rd    1
        .y                              rd    1
        .override_redirect              rd    1
ends

struct   XSelectionClearEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .selection                      rd    1
        .time                           rd    1
ends

struct   XSelectionRequestEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .owner                          rd    1
        .requestor                      rd    1
        .selection                      rd    1
        .target                         rd    1
        .property                       rd    1
        .time                           rd    1
ends

struct   XSelectionEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .requestor                      rd    1
        .selection                      rd    1
        .target                         rd    1
        .property                       rd    1
        .time                           rd    1
ends

;       Hidden          Window  Events

struct   XUnmapEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1
        .window                         rd    1
        .from_configure                 rd    1
ends

struct   XVisibilityEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .state                          rd    1
ends

;       Client          Messages        (XSendEvent)

struct   XClientMessageEvent
  .type                           rd    1
  .serial                         rd    1
  .send_event                     rd    1
  .display                        rd    1
  .window                         rd    1
  .message_type                   rd    1
  .format                         rd    1
  .data                           rb    20
ends


struct   XErrorEvent
  .type         dd    ?
  .display      dd    ?
  .resourceid   dd    ?
  .serial       dd    ?
  .error_code   db    ?
  .request_code db    ?
  .minor_code   db    ?
ends



struct XAnyEvent
  .type         rd    1
  .serial       rd    1
  .send_event   rd    1
  .display      rd    1
  .window       rd    1
ends


struct XEvent
  .xany XAnyEvent
  .pad  rb 24*4 - sizeof.XAnyEvent

  virtual at .xany
  . XAnyEvent
  end virtual
;
;
;  virtual at .xany
;  .xkey XKeyEvent
;  end virtual
;
;  virtual at .xany
;  .xbutton XButtonEvent
;  end virtual
;
;  virtual at .xany
;  .xmotion XMotionEvent
;  end virtual
;
;  virtual at .xany
;  .xcrossing XCrossingEvent
;  end virtual
;
;  virtual at .xany
;  .xfocus XFocusChangeEvent
;  end virtual
;
;  virtual at .xany
;  .xexpose XExposeEvent
;  end virtual
;
;  virtual at .xany
;  .xgraphicsexpose XGraphicsExposeEvent
;  end virtual
;
;  virtual at .xany
;  .xnoexpose XNoExposeEvent
;  end virtual
;
;  virtual at .xany
;  .xvisibility XVisibilityEvent
;  end virtual
;
;  virtual at .xany
;  .xcreatewindow XCreateWindowEvent
;  end virtual
;
;  virtual at .xany
;  .xdestroywindow XDestroyWindowEvent
;  end virtual
;
;  virtual at .xany
;  .xunmap XUnmapEvent
;  end virtual
;
;  virtual at .xany
;  .xmap XMapEvent
;  end virtual
;
;  virtual at .xany
;  .xmaprequest XMapRequestEvent
;  end virtual
;
;  virtual at .xany
;  .xreparent XReparentEvent
;  end virtual
;
;  virtual at .xany
;  .xconfigure XConfigureEvent
;  end virtual
;
;  virtual at .xany
;  .xgravity XGravityEvent
;  end virtual
;
;  virtual at .xany
;  .xresizerequest XResizeEvent
;  end virtual
;
;  virtual at .xany
;  .xconfigurerequest XConfigureRequestEvent
;  end virtual
;
;  virtual at .xany
;  .xcirculate XCirculateEvent
;  end virtual
;
;  virtual at .xany
;  .xcirculaterequest XCirculateRequestEvent
;  end virtual
;
;  virtual at .xany
;  .xproperty XPropertyEvent
;  end virtual
;
;  virtual at .xany
;  .xselectionclear XSelectionClearEvent
;  end virtual
;
;  virtual at .xany
;  .xselectionrequest XSelectionRequestEvent
;  end virtual
;
;  virtual at .xany
;  .xselection XSelectionEvent
;  end virtual
;
;  virtual at .xany
;  .xcolormap XColormapEvent
;  end virtual
;
;  virtual at .xany
;  .xclient XClientMessageEvent
;  end virtual
;
;  virtual at .xany
;  .xmapping XMappingEvent
;  end virtual
;
;  virtual at .xany
;  .xerror XErrorEvent
;  end virtual
;
;  virtual at .xany
;  .xkeymap XKeymapEvent
;  end virtual
ends


;       Misc.           Structures

struct   XKeyboardControl
        .key_click_percent              rd    1
        .bell_percent                   rd    1
        .bell_pitch                     rd    1
        .bell_duration                  rd    1
        .led                            rd    1
        .led_mode                       rd    1
        .key                            rd    1
        .auto_repeat_mode               rd    1
ends



struct   XModifierKeymap
        .max_keypermod                  rd    1
        .modifiermap                    rd    1
ends


struct XVisualInfo
  .Visual     dd ?
  .VisualID   dd ?
  .screen     dd ?
  .depth      dd ?
  .class      dd ?
  .red_mask   dd ?
  .green_mask dd ?
  .blue_mask  dd ?
  .colormap_size dd ?
  .bits_per_rgb  dd ?
ends




struct XWindowAttributes
  .x                     dd  ?     ; location of window
  .y                     dd  ?     ;
  .width                 dd  ?     ; width and height of window
  .height                dd  ?     ;
  .border_width          dd  ?     ; border width of window
  .depth                 dd  ?     ; depth of window
  .pVisual               dd  ?     ; the associated visual structure
  .root                  dd  ?     ; root of screen containing window
  .class                 dd  ?     ; InputOutput, InputOnly

  .bit_gravity           dd  ?     ; one of the bit gravity values
  .win_gravity           dd  ?     ; one of the window gravity values
  .backing_store         dd  ?     ; NotUseful, WhenMapped, Always
  .backing_planes        dd  ?     ; planes to be preserved if possible
  .backing_pixel         dd  ?     ; value to be used when restoring planes
  .save_under            dd  ?     ; boolean, should bits under be saved?
  .colormap              dd  ?     ; color map to be associated with window
  .map_installed         dd  ?     ; boolean, is color map currently installed
  .map_state             dd  ?     ; IsUnmapped, IsUnviewable, IsViewable
  .all_event_masks       dd  ?    ; set of events all people have interest in
  .your_event_mask       dd  ?          ; my event mask
  .do_not_propagate_mask dd  ?    ; set of events that should not propagate
  .override_redirect     dd  ?    ; boolean value for override-redirect
  .pScreen               dd  ?  ; back pointer to correct screen
ends


struct XSetWindowAttributes
  .background_pixmap    dd  ?           ; background, None, or ParentRelative
  .background_pixel     dd  ?           ; background pixel
  .border_pixmap        dd  ?           ; border of the window or CopyFromParent
  .border_pixel         dd  ?           ; border pixel value
  .bit_gravity          dd  ?           ; one of bit gravity values
  .win_gravity          dd  ?           ; one of the window gravity values
  .backing_store        dd  ?           ; NotUseful, WhenMapped, Always
  .backing_planes       dd  ?           ; planes to be preserved if possible
  .backing_pixel        dd  ?           ; value to use in restoring planes
  .save_under           dd  ?           ; should bits under be saved? (popups)
  .event_mask           dd  ?           ; set of events that should be saved
  .do_not_propagate_mask dd ?           ; set of events that should not propagate
  .override_redirect    dd  ?           ; boolean value for override_redirect
  .colormap             dd  ?           ; color map to be associated with window
  .cursor               dd  ?           ; cursor to be displayed (or None)
ends



struct XCharStruct
  .lbearing   dw ?       ; origin to left edge of raster
  .rbearing   dw ?       ; origin to right edge of raster
  .width      dw ?       ; advance to next char's origin
  .ascent     dw ?       ; baseline to top edge of raster
  .descent    dw ?       ; baseline to bottom edge of raster
  .attributes dw ?       ; per char flags (not predefined)
ends


struct XFontStruct
  .ext_data          dd   ?       ; hook for extension to hang data
  .fid               dd   ?       ; Font id for this font
  .direction         dd   ?       ; hint about the direction font is painted
  .min_char_or_byte2 dd   ?       ; first character
  .max_char_or_byte2 dd   ?       ; last character
  .min_byte1         dd   ?       ; first row that exists
  .max_byte1         dd   ?       ; last row that exists
  .all_chars_exist   dd   ?       ; flag if all characters have nonzero size
  .default_char      dd   ?       ; char to print for undefined character
  .n_properties      dd   ?       ; how many properties there are
  .properties        dd   ?       ; pointer to array of additional properties
  .min_bounds        XCharStruct  ; minimum bounds over all existing char
  .max_bounds        XCharStruct  ; maximum bounds over all existing char
  .per_char          dd   ?       ; first_char to last_char information
  .ascent            dd   ?       ; logical extent above baseline for spacing
  .descent           dd   ?       ; logical decent below baseline for spacing
ends


struct XWindowChanges
  .x            dd ?
  .y            dd ?
  .width        dd ?
  .height       dd ?
  .border_width dd ?
  .sibling      dd ?
  .stack_mode   dd ?
ends


struct XImage
  .width        dd ?                         ; size of image
  .height       dd ?
  .xoffset      dd ?                         ; number of pixels offset in X direction
  .format       dd ?                         ; XYBitmap, XYPixmap, ZPixmap
  .pData        dd ?                         ; pointer to image data
  .byte_order   dd ?                         ; data byte order, LSBFirst=0, MSBFirst=1
  .bitmap_unit  dd ?                         ; quantity of scan line 8, 16, 32
  .bitmap_bit_order dd ?                     ; LSBFirst, MSBFirst
  .bitmap_pad   dd ?                         ; 8, 16, 32 either XY or ZPixmap
  .depth        dd ?                         ; depth of image
  .bytes_per_line dd ?                       ; accelerator to next line
  .bits_per_pixel dd ?                       ; bits per pixel (ZPixmap)
  .red_mask       dd ?                       ; bits in z arrangment
  .green_mask     dd ?                       ; bits in z arrangment
  .blue_mask      dd ?                       ; bits in z arrangment
  .ptrObData      dd ?                       ; hook for object routines to hang on

  .funcCreateImage dd ?                      ; image manipulation routines
  .funcDestroyImage dd ?                     ;
  .funcGetPixel     dd ?
  .funcPutPixel     dd ?
  .funcSubImage     dd ?
  .funcAddPixel     dd ?
ends


struct XWMHints
  .flags dd ?
  .input dd ?
  .initial_state dd ?
  .icon_pixmap   dd ?
  .icon_window   dd ?
  .icon_x        dd ?
  .icon_y        dd ?
  .icon_mask     dd ?
  .window_group  dd ?
ends


InputHint       =       1
StateHint       =       2
IconPixmapHint  =       4
IconWindowHint  =       8
IconPositionHint=       16
IconMaskHint    =       32
WindowGroupHint =       64
UrgencyHint     =       128
AllHints = InputHint or StateHint or IconPixmapHint or IconWindowHint or IconPositionHint or IconMaskHint or WindowGroupHint or UrgencyHint


WithdrawnState  = 0
NormalState = 1
IconicState = 3


; RequestCodes
Xrequests = 0
.CreateWindow            =1
.ChangeWindowAttributes  =2
.GetWindowAttributes     =3
.DestroyWindow           =4
.DestroySubwindows       =5
.ChangeSaveSet           =6
.ReparentWindow          =7
.MapWindow               =8
.MapSubwindows           =9
.UnmapWindow             =10
.UnmapSubwindows         =11
.ConfigureWindow         =12
.CirculateWindow         =13
.GetGeometry             =14
.QueryTree               =15
.InternAtom              =16
.GetAtomName             =17
.ChangeProperty          =18
.DeleteProperty          =19
.GetProperty             =20
.ListProperties          =21
.SetSelectionOwner       =22
.GetSelectionOwner       =23
.ConvertSelection        =24
.SendEvent               =25
.GrabPointer             =26
.UngrabPointer           =27
.GrabButton              =28
.UngrabButton            =29
.ChangeActivePointerGrab =30
.GrabKeyboard            =31
.UngrabKeyboard          =32
.GrabKey                 =33
.UngrabKey               =34
.AllowEvents             =35
.GrabServer              =36
.UngrabServer            =37
.QueryPointer            =38
.GetMotionEvents         =39
.TranslateCoords         =40
.WarpPointer             =41
.SetInputFocus           =42
.GetInputFocus           =43
.QueryKeymap             =44
.OpenFont                =45
.CloseFont               =46
.QueryFont               =47
.QueryTextExtents        =48
.ListFonts               =49
.ListFontsWithInfo       =50
.SetFontPath             =51
.GetFontPath             =52
.CreatePixmap            =53
.FreePixmap              =54
.CreateGC                =55
.ChangeGC                =56
.CopyGC                  =57
.SetDashes               =58
.SetClipRectangles       =59
.FreeGC                  =60
.ClearArea               =61
.CopyArea                =62
.CopyPlane               =63
.PolyPoint               =64
.PolyLine                =65
.PolySegment             =66
.PolyRectangle           =67
.PolyArc                 =68
.FillPoly                =69
.PolyFillRectangle       =70
.PolyFillArc             =71
.PutImage                =72
.GetImage                =73
.PolyText8               =74
.PolyText16              =75
.ImageText8              =76
.ImageText16             =77
.CreateColormap          =78
.FreeColormap            =79
.CopyColormapAndFree     =80
.InstallColormap         =81
.UninstallColormap       =82
.ListInstalledColormaps  =83
.AllocColor              =84
.AllocNamedColor         =85
.AllocColorCells         =86
.AllocColorPlanes        =87
.FreeColors              =88
.StoreColors             =89
.StoreNamedColor         =90
.QueryColors             =91
.LookupColor             =92
.CreateCursor            =93
.CreateGlyphCursor       =94
.FreeCursor              =95
.RecolorCursor           =96
.QueryBestSize           =97
.QueryExtension          =98
.ListExtensions          =99
.ChangeKeyboardMapping   =100
.GetKeyboardMapping      =101
.ChangeKeyboardControl   =102
.GetKeyboardControl      =103
.Bell                    =104
.ChangePointerControl    =105
.GetPointerControl       =106
.SetScreenSaver          =107
.GetScreenSaver          =108
.ChangeHosts             =109
.ListHosts               =110
.SetAccessControl        =111
.SetCloseDownMode        =112
.KillClient              =113
.RotateProperties        =114
.ForceScreenSaver        =115
.SetPointerMapping       =116
.GetPointerMapping       =117
.SetModifierMapping      =118
.GetModifierMapping      =119
.NoOperation             =127


; Predefined atoms from the X server.

XA_PRIMARY      = 1
XA_SECONDARY    = 2
XA_ARC          = 3
XA_ATOM         = 4
XA_BITMAP       = 5
XA_CARDINAL     = 6
XA_COLORMAP     = 7
XA_CURSOR       = 8
XA_CUT_BUFFER0  = 9
XA_CUT_BUFFER1  = 10
XA_CUT_BUFFER2  = 11
XA_CUT_BUFFER3  = 12
XA_CUT_BUFFER4  = 13
XA_CUT_BUFFER5  = 14
XA_CUT_BUFFER6  = 15
XA_CUT_BUFFER7  = 16
XA_DRAWABLE     = 17
XA_FONT         = 18
XA_INTEGER      = 19
XA_PIXMAP       = 20
XA_POINT        = 21
XA_RECTANGLE    = 22
XA_RESOURCE_MANAGER = 23
XA_RGB_COLOR_MAP = 24
XA_RGB_BEST_MAP  = 25
XA_RGB_BLUE_MAP = 26
XA_RGB_DEFAULT_MAP = 27
XA_RGB_GRAY_MAP = 28
XA_RGB_GREEN_MAP = 29
XA_RGB_RED_MAP  = 30
XA_STRING       = 31
XA_VISUALID     = 32
XA_WINDOW       = 33
XA_WM_COMMAND   = 34
XA_WM_HINTS     = 35
XA_WM_CLIENT_MACHINE = 36
XA_WM_ICON_NAME = 37
XA_WM_ICON_SIZE = 38
XA_WM_NAME      = 39
XA_WM_NORMAL_HINTS = 40
XA_WM_SIZE_HINTS = 41
XA_WM_ZOOM_HINTS = 42
XA_MIN_SPACE     = 43
XA_NORM_SPACE    = 44
XA_MAX_SPACE     = 45
XA_END_SPACE     = 46
XA_SUPERSCRIPT_X = 47
XA_SUPERSCRIPT_Y = 48
XA_SUBSCRIPT_X   = 49
XA_SUBSCRIPT_Y   = 50
XA_UNDERLINE_POSITION = 51
XA_UNDERLINE_THICKNESS = 52
XA_STRIKEOUT_ASCENT = 53
XA_STRIKEOUT_DESCENT = 54
XA_ITALIC_ANGLE  = 55
XA_X_HEIGHT      = 56
XA_QUAD_WIDTH    = 57
XA_WEIGHT        = 58
XA_POINT_SIZE    = 59
XA_RESOLUTION    = 60
XA_COPYRIGHT     = 61
XA_NOTICE        = 62
XA_FONT_NAME     = 63
XA_FAMILY_NAME   = 64
XA_FULL_NAME     = 65
XA_CAP_HEIGHT    = 66
XA_WM_CLASS      = 67
XA_WM_TRANSIENT_FOR = 68

XA_LAST_PREDEFINED = 68

Changes to freshlib/equates/Linux/_geometry.inc.

























1
2
3
4
5
6
7
8
9
10
11


























struct RECT
  .left   dd ?
  .top    dd ?
  .right  dd ?
  .bottom dd ?
ends

struct POINT
  .x  dd ?
  .y  dd ?
ends


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>











>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Different geometry structures.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


struct TBounds
  .x      dd ?
  .y      dd ?
  .width  dd ?
  .height dd ?
ends



struct RECT
  .left   dd ?
  .top    dd ?
  .right  dd ?
  .bottom dd ?
ends

struct POINT
  .x  dd ?
  .y  dd ?
ends


Added freshlib/equates/Linux/_ipc.inc.



































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: IPC constants for libC functions.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


IPC_PRIVATE = 0

IPC_W       = $080
IPC_R       = $100
IPC_CREAT   = $200
IPC_EXCL    = $400
IPC_NOWAIT  = $800

IPC_RMID     =   0       ; remove identifier
IPC_SET      =   1       ; set options
IPC_STAT     =   2       ; get options
IPC_INFO     =   3

IPC_64 = $100

struct ipc_perm
  .key          dd ?
  .uid          dw ?      ;   owner euid and egid
  .gid          dw ?      ;
  .cuid         dw ?      ;   creator euid and egid
  .cgid         dw ?      ;
  .mode         dw ?      ;   access modes see mode flags below
  .seq          dw ?      ;   slot usage sequence number
ends


struct shmid_ds
  .shm_perm    ipc_perm ; Ownership and permissions
  .shm_segsz   dd ? ; Size of segment (bytes)
  .shm_atime   dd ? ; Last attach time
  .shm_dtime   dd ? ; Last detach time
  .shm_ctime   dd ? ; Last change time
  .shm_cpid    dw ? ; PID of creator
  .shm_lpid    dw ? ; PID of last SHMAT/SHMDT
  .shm_nattch  dw ? ; Number of current attaches
  .shm_unused  dw ? ; Not used
  .shm_unused2 dd ? ; Not used
  .shm_unused3 dd ? ; Not used
ends


struct ipc64_perm
  .key          dd ?
  .uid          dd ?      ;   owner euid and egid
  .gid          dd ?      ;
  .cuid         dd ?      ;   creator euid and egid
  .cgid         dd ?      ;
  .mode         dd ?      ;   access modes see mode flags below (only lower 16 bit are used)
  .seq          dd ?      ;   slot usage sequence number (only lower 16 bit are used)
                dd ?
                dd ?
ends


struct shmid64_ds
  .shm_perm    ipc64_perm ; Ownership and permissions
  .shm_segsz   dd ? ; Size of segment (bytes)
  .shm_atime   dq ? ; Last attach time
  .shm_dtime   dq ? ; Last detach time
  .shm_ctime   dq ? ; Last change time
  .shm_cpid    dd ? ; PID of creator
  .shm_lpid    dd ? ; PID of last SHMAT/SHMDT
  .shm_nattch  dd ? ; Number of current attaches
               dd ? ; Not used
               dd ? ; Not used
ends

Added freshlib/equates/Linux/_libFT.inc.



















































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: FreeType library constants and structures.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


FT_FACE_FLAG_SCALABLE           = $0001
FT_FACE_FLAG_FIXED_SIZES        = $0002
FT_FACE_FLAG_FIXED_WIDTH        = $0004
FT_FACE_FLAG_SFNT               = $0008
FT_FACE_FLAG_HORIZONTAL         = $0010
FT_FACE_FLAG_VERTICAL           = $0020
FT_FACE_FLAG_KERNING            = $0040
FT_FACE_FLAG_FAST_GLYPHS        = $0080
FT_FACE_FLAG_MULTIPLE_MASTERS   = $0100
FT_FACE_FLAG_GLYPH_NAMES        = $0200
FT_FACE_FLAG_EXTERNAL_STREAM    = $0400
FT_FACE_FLAG_HINTER             = $0800
FT_FACE_FLAG_CID_KEYED          = $1000
FT_FACE_FLAG_TRICKY             = $2000


FT_LOAD_DEFAULT                         =  $0
FT_LOAD_NO_SCALE                        =  $1
FT_LOAD_NO_HINTING                      =  $2
FT_LOAD_RENDER                          =  $4
FT_LOAD_NO_BITMAP                       =  $8
FT_LOAD_VERTICAL_LAYOUT                 =  $10
FT_LOAD_FORCE_AUTOHINT                  =  $20
FT_LOAD_CROP_BITMAP                     =  $40          ; deprecated, ignored
FT_LOAD_PEDANTIC                        =  $80
FT_LOAD_ADVANCE_ONLY                    =  $100
FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH     =  $200         ; deprecated, ignored
FT_LOAD_NO_RECURSE                      =  $400
FT_LOAD_IGNORE_TRANSFORM                =  $800
FT_LOAD_MONOCHROME                      =  $1000
FT_LOAD_LINEAR_DESIGN                   =  $2000
FT_LOAD_SBITS_ONLY                      =  $4000
FT_LOAD_NO_AUTOHINT                     =  $8000
FT_LOAD_COLOR                           =  $100000

FT_ADVANCE_FLAG_FAST_ONLY               =  $20000000


FT_RENDER_MODE_NORMAL = 0
FT_RENDER_MODE_LIGHT  = 1
FT_RENDER_MODE_MONO   = 2
FT_RENDER_MODE_LCD    = 3
FT_RENDER_MODE_LCD_V  = 4
FT_RENDER_MODE_MAX    = 5

struc FT_LOAD_TARGET x {
  . = (x and 15) shl 16
}

FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET  FT_RENDER_MODE_NORMAL
FT_LOAD_TARGET_LIGHT  FT_LOAD_TARGET  FT_RENDER_MODE_LIGHT
FT_LOAD_TARGET_MONO   FT_LOAD_TARGET  FT_RENDER_MODE_MONO
FT_LOAD_TARGET_LCD    FT_LOAD_TARGET  FT_RENDER_MODE_LCD
FT_LOAD_TARGET_LCD_V  FT_LOAD_TARGET  FT_RENDER_MODE_LCD_V



FT_PIXEL_MODE_NONE  = 0
FT_PIXEL_MODE_MONO  = 1
FT_PIXEL_MODE_GRAY  = 2
FT_PIXEL_MODE_GRAY2 = 3
FT_PIXEL_MODE_GRAY4 = 4
FT_PIXEL_MODE_LCD   = 5
FT_PIXEL_MODE_LCD_V = 6
FT_PIXEL_MODE_BGRA  = 7


struct FT_Generic
  .data         dd ?
  .finalizer    dd ?    ; pointer to procedure with one argument.
ends

struct FT_BBox
  .xMin         dd ?
  .yMin         dd ?
  .xMax         dd ?
  .yMax         dd ?
ends

struct FT_Vector
  .x dd ?
  .y dd ?
ends

struct FT_Bitmap
  .rows         dd ?
  .width        dd ?
  .pitch        dd ?
  .buffer       dd ?    ; pointer to the buffer.
  .num_grays    dw ?
  .pixel_mode   db ?
  .palette_mode db ?
  .palette      dd ?    ; pointer to the palette.
ends


struct FT_Bitmap_Size
  .height dw ?
  .width  dw ?
  .size   dd ?  ; 26.6 fixed size format.
  .x_ppem dd ?  ; 26.6 fixed size format.
  .y_ppem dd ?  ; 26.6 fixed size format.
ends



struct FT_Outline
  .n_contours  dw  ?
  .n_points    dw  ?
  .points      dd  ?    ; pointer to array of FT_Vector elements.
  .tags        dd  ?    ; pointer to byte array.
  .contours    dd  ?    ; pointer to word array.
  .flags       dd  ?
ends



struct  FT_Glyph_Metrics
  .width        dd ?
  .height       dd ?
  .horiBearingX dd ?
  .horiBearingY dd ?
  .horiAdvance  dd ?

  .vertBearingX dd ?
  .vertBearingY dd ?
  .vertAdvance  dd ?
ends



struct FT_GlyphSlot
  .library      dd ?
  .face         dd ?    ; parent FT_Face object
  .next         dd ?    ; pointer tp FT_GlyphSlot
  .reserved     dd ?
  .generic      FT_Generic

  .metrics      FT_Glyph_Metrics
  .linearHoriAdvance dd ?
  .linearVertAdvance dd ?

  .advance      FT_Vector

  .format       dd ?

  .bitmap       FT_Bitmap
  .bitmap_left  dd ?
  .bitmap_top   dd ?

  .outline      FT_Outline

  .num_subglyphs dd ?
  .subglyphs     dd ?   ; pointer to array of FT_SubGlyphRec elements.

  .control_data  dd ?
  .control_len   dd ?

  .lsb_delta     dd ?
  .rsb_delta     dd ?

  .other         dd ?
  .internal      dd ?   ; pointer to FT_Slot_InternalRec
ends


struct FT_FaceRec
  .num_faces    dd ?
  .face_index   dd ?
  .face_flags   dd ?
  .style_flags  dd ?
  .num_glyphs   dd ?
  .family_name  dd ?
  .style_name   dd ?

  .num_fixed_sizes dd ?
  .available_sizes dd ?

  .num_charmaps dd ?
  .charmaps     dd ?
  .generic      FT_Generic

; scalable fonts members down to .underline_thickness

  .bbpx                 FT_BBox

  .units_per_EM         dw ?
  .ascender             dw ?
  .descender            dw ?
  .height               dw ?

  .max_advance_width    dw ?
  .max_advance_height   dw ?

  .underline_position   dw ?
  .underline_thickness  dw ?


  .glyph        dd  ?   ; pointer to FT_GlyphSlot
  .size         dd  ?   ; pointer to FT_Size
  .charmap      dd  ?   ; pointer to FT_CharMap

; down is the private part.

ends


struct FT_GlyphRec
  .library      dd      ?
  .clazz        dd      ?
  .format       dd      ?
  .advance      FT_Vector
ends


struct FT_BitmapGlyphRec
  .root         FT_GlyphRec
  .left         dd ?
  .top          dd ?
  .bitmap       FT_Bitmap
ends


FT_SIZE_REQUEST_TYPE_NOMINAL    = 0
FT_SIZE_REQUEST_TYPE_REAL_DIM   = 1
FT_SIZE_REQUEST_TYPE_BBOX       = 2
FT_SIZE_REQUEST_TYPE_CELL       = 3
FT_SIZE_REQUEST_TYPE_SCALES     = 4


struct FT_Size_RequestRec
  .type            dd  ?
  .width           dd  ?
  .height          dd  ?
  .horiResolution  dd  ?
  .vertResolution  dd  ?
ends


struct FT_Size_Metrics
  .x_ppem       dw      ?       ; horizontal pixels per EM
  .y_ppem       dw      ?       ; vertical pixels per EM

  .x_scale      dd      ?       ; scaling values used to convert font
  .y_scale      dd      ?       ; units to 26.6 fractional pixels

  .ascender     dd      ?       ; ascender in 26.6 frac. pixels
  .descender    dd      ?       ; descender in 26.6 frac. pixels
  .height       dd      ?       ; text height in 26.6 frac. pixels
  .max_advance  dd      ?       ; max horizontal advance, in 26.6 pixels
ends


struct FT_SizeRec
  .face         dd  ?           ; parent face object
  .generic      FT_Generic      ; generic pointer for client uses
  .metrics      FT_Size_Metrics ; size metrics
  .internal:
ends


struct FTC_ScalerRec
  .face_id dd ?
  .width   dd ?
  .height  dd ?
  .pixel   dd ?
  .x_res   dd ?
  .y_res   dd ?
ends


struct FTC_ImageType
  .face_id  dd  ?
  .width    dd  ?
  .height   dd  ?
  .flags    dd  ?
ends




interface FT_Face_Requester, .face_id, .library, .request_data, .pFace

Added freshlib/equates/Linux/_libXrender.inc.











































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: libXrender constants and structures.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


struct XRenderDirectFormat
  .red        dw  ?
  .redMask    dw  ?
  .green      dw  ?
  .greenMask  dw  ?
  .blue       dw  ?
  .blueMask   dw  ?
  .alpha      dw  ?
  .alphaMask  dw  ?
ends


struct XRenderPictFormat
  .id       dd ?
  .type     dd ?
  .depth    dd ?
  .direct   XRenderDirectFormat
  .colormap dd ?
ends

PictFormatID        =  (1 shl 0)
PictFormatType      =  (1 shl 1)
PictFormatDepth     =  (1 shl 2)
PictFormatRed       =  (1 shl 3)
PictFormatRedMask   =  (1 shl 4)
PictFormatGreen     =  (1 shl 5)
PictFormatGreenMask =  (1 shl 6)
PictFormatBlue      =  (1 shl 7)
PictFormatBlueMask  =  (1 shl 8)
PictFormatAlpha     =  (1 shl 9)
PictFormatAlphaMask =  (1 shl 10)
PictFormatColormap  =  (1 shl 11)

struct XRenderPictureAttributes
  .repeat          dd ?
  .alpha_map       dd ?
  .alpha_x_origin  dd ?
  .alpha_y_origin  dd ?
  .clip_x_origin   dd ?
  .clip_y_origin   dd ?
  .clip_mask       dd ?
  .graphics_exposures dd ?
  .subwindow_mode  dd ?
  .poly_edge       dd ?
  .poly_mode       dd ?
  .dither          dd ?
  .component_alpha dd ?
ends


struct XRenderColor
  .red    dw ?
  .green  dw ?
  .blue   dw ?
  .alpha  dw ?
ends


struct XGlyphInfo
  .width  dw  ?
  .height dw  ?
  .x      dw  ?
  .y      dw  ?
  .xOff   dw  ?
  .yOff   dw  ?
ends


struct XGlyphElt
  .glyphset dd ?
  .chars    dd ?        ; pointer to an array of bytes
  .nchars   dd ?
  .xOff     dd ?
  .yOff     dd ?
ends

struct XPointDouble
  .x  dq ?              ; double floating point
  .y  dq ?
ends

struct XPointFixed      ; the coordinate multiplied by 65536.
  .x dd ?
  .y dd ?
ends

struct XLineFixed
  .p1 XPointFixed
  .p2 XPointFixed
ends


struct XTriangle
  .p1 XPointFixed
  .p2 XPointFixed
  .p3 XPointFixed
ends


struct XCircle
  .x      dd ?
  .y      dd ?
  .radius dd ?
ends


struct XTrapezoid
  .top    dd  ?
  .bottom dd  ?
  .left   XLineFixed
  .right  XLineFixed
ends

struct XTransform
  .matrix rd 9
ends

struct XFilters
  .nfilter dd ?
  .filter  dd ?         ; **char
  .nalias  dd ?
  .alias   dd ?         ; pointer to an array of word
ends

struct XIndexValue
  .pixel dd  ?
  .red   dw  ?
  .green dw  ?
  .blue  dw  ?
  .alpha dw  ?
ends


struct XAnimCursor
  .cursor dd ?
  .delay  dd ?
ends

struct XSpanFix
  .left   dd  ?
  .right  dd  ?
  .y      dd  ?
ends

struct XTrap
  .top    XSpanFix
  .botton XSpanFix
ends

struct XLinearGradient
  .p1 XPointFixed
  .p2 XPointFixed
ends

struct XRadialGradient
  .inner XCircle
  .outer XCircle
ends

struct XConicalGradient
  .center XPointFixed
  .angle  dd ?          ; in degrees
ends


PictStandardARGB32 = 0
PictStandardRGB24  = 1
PictStandardA8     = 2
PictStandardA4     = 3
PictStandardA1     = 4
PictStandardNUM    = 5


X_RenderQueryVersion                = 0
X_RenderQueryPictFormats            = 1
X_RenderQueryPictIndexValues        = 2   ; 0.7
X_RenderQueryDithers                = 3
X_RenderCreatePicture               = 4
X_RenderChangePicture               = 5
X_RenderSetPictureClipRectangles    = 6
X_RenderFreePicture                 = 7
X_RenderComposite                   = 8
X_RenderScale                       = 9
X_RenderTrapezoids                  = 10
X_RenderTriangles                   = 11
X_RenderTriStrip                    = 12
X_RenderTriFan                      = 13
X_RenderColorTrapezoids             = 14
X_RenderColorTriangles              = 15
; X_RenderTransform          = 16
X_RenderCreateGlyphSet              = 17
X_RenderReferenceGlyphSet           = 18
X_RenderFreeGlyphSet                = 19
X_RenderAddGlyphs                   = 20
X_RenderAddGlyphsFromPicture        = 21
X_RenderFreeGlyphs                  = 22
X_RenderCompositeGlyphs8            = 23
X_RenderCompositeGlyphs16           = 24
X_RenderCompositeGlyphs32           = 25
X_RenderFillRectangles              = 26
; 0.5
X_RenderCreateCursor                = 27
; 0.6
X_RenderSetPictureTransform         = 28
X_RenderQueryFilters                = 29
X_RenderSetPictureFilter            = 30
; 0.8
X_RenderCreateAnimCursor            = 31
; 0.9
X_RenderAddTraps                    = 32
; 0.10
X_RenderCreateSolidFill             = 33
X_RenderCreateLinearGradient        = 34
X_RenderCreateRadialGradient        = 35
X_RenderCreateConicalGradient       = 36
RenderNumberRequests                = (X_RenderCreateConicalGradient+1)

BadPictFormat                       = 0
BadPicture                          = 1
BadPictOp                           = 2
BadGlyphSet                         = 3
BadGlyph                            = 4
RenderNumberErrors                  = (BadGlyph+1)

PictTypeIndexed                     = 0
PictTypeDirect                      = 1

PictOpMinimum                       = 0
PictOpClear                         = 0
PictOpSrc                           = 1
PictOpDst                           = 2
PictOpOver                          = 3
PictOpOverReverse                   = 4
PictOpIn                            = 5
PictOpInReverse                     = 6
PictOpOut                           = 7
PictOpOutReverse                    = 8
PictOpAtop                          = 9
PictOpAtopReverse                   = 10
PictOpXor                           = 11
PictOpAdd                           = 12
PictOpSaturate                      = 13
PictOpMaximum                       = 13

; Operators only available in version 0.2

PictOpDisjointMinimum      =  $10
PictOpDisjointClear        =  $10
PictOpDisjointSrc          =  $11
PictOpDisjointDst          =  $12
PictOpDisjointOver         =  $13
PictOpDisjointOverReverse  =  $14
PictOpDisjointIn           =  $15
PictOpDisjointInReverse    =  $16
PictOpDisjointOut          =  $17
PictOpDisjointOutReverse   =  $18
PictOpDisjointAtop         =  $19
PictOpDisjointAtopReverse  =  $1a
PictOpDisjointXor          =  $1b
PictOpDisjointMaximum      =  $1b

PictOpConjointMinimum      =  $20
PictOpConjointClear        =  $20
PictOpConjointSrc          =  $21
PictOpConjointDst          =  $22
PictOpConjointOver         =  $23
PictOpConjointOverReverse  =  $24
PictOpConjointIn           =  $25
PictOpConjointInReverse    =  $26
PictOpConjointOut          =  $27
PictOpConjointOutReverse   =  $28
PictOpConjointAtop         =  $29
PictOpConjointAtopReverse  =  $2a
PictOpConjointXor          =  $2b
PictOpConjointMaximum      =  $2b

; Operators only available in version 0.11

PictOpBlendMinimum         =  $30
PictOpMultiply             =  $30
PictOpScreen               =  $31
PictOpOverlay              =  $32
PictOpDarken               =  $33
PictOpLighten              =  $34
PictOpColorDodge           =  $35
PictOpColorBurn            =  $36
PictOpHardLight            =  $37
PictOpSoftLight            =  $38
PictOpDifference           =  $39
PictOpExclusion            =  $3a
PictOpHSLHue               =  $3b
PictOpHSLSaturation        =  $3c
PictOpHSLColor             =  $3d
PictOpHSLLuminosity        =  $3e
PictOpBlendMaximum         =  $3e

PolyEdgeSharp              =  0
PolyEdgeSmooth             =  1

PolyModePrecise            =  0
PolyModeImprecise          =  1

CPRepeat                   =  (1 shl 0)
CPAlphaMap                 =  (1 shl 1)
CPAlphaXOrigin             =  (1 shl 2)
CPAlphaYOrigin             =  (1 shl 3)
CPClipXOrigin              =  (1 shl 4)
CPClipYOrigin              =  (1 shl 5)
CPClipMask                 =  (1 shl 6)
CPGraphicsExposure         =  (1 shl 7)
CPSubwindowMode            =  (1 shl 8)
CPPolyEdge                 =  (1 shl 9)
CPPolyMode                 =  (1 shl 10)
CPDither                   =  (1 shl 11)
CPComponentAlpha           =  (1 shl 12)
CPLastBit                  =  12

; Filters included in 0.6
FilterNearest    text  "nearest"
FilterBilinear   text  "bilinear"
; Filters included in 0.10
FilterConvolution  text  "convolution"

FilterFast  text  "fast"
FilterGood  text  "good"
FilterBest  text  "best"

FilterAliasNone = -1

; Subpixel orders included in 0.6
SubPixelUnknown                =     0
SubPixelHorizontalRGB          =     1
SubPixelHorizontalBGR          =     2
SubPixelVerticalRGB            =     3
SubPixelVerticalBGR            =     4
SubPixelNone                   =     5

; Extended repeat attributes included in 0.10
RepeatNone                     =     0
RepeatNormal                   =     1
RepeatPad                      =     2
RepeatReflect                  =     3

Added freshlib/equates/Linux/_libdl.inc.





































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Common LibDL constants and definitions.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


; constants for runtime dynamic linking functions.

RTLD_LAZY = 1
RTLD_NOW = 2

RTLD_BINDING_MASK = 3

RTLD_NOLOAD = 4
RTLD_DEEPBIND = 8

RTLD_LOCAL  = 0
RTLD_GLOBAL = $100
RTLD_NODELETE = $1000


; pseudo-handles for dlsym()

RTLD_DEFAULT = 0
RTLD_NEXT = -1

Added freshlib/equates/Linux/_linux.inc.





































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Common Linux equates.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


UNIX_PATH_MAX = 108


; Error numbers from the kernel

EPERM       =     1      ; Operation not permitted
ENOENT      =     2      ; No such file or directory
ESRCH       =     3      ; No such process
EINTR       =     4      ; Interrupted system call
EIO         =     5      ; I/O error
ENXIO       =     6      ; No such device or address
E2BIG       =     7      ; Argument list too long
ENOEXEC     =     8      ; Exec format error
EBADF       =     9      ; Bad file number
ECHILD      =    10      ; No child processes
EAGAIN      =    11      ; Try again
ENOMEM      =    12      ; Out of memory
EACCES      =    13      ; Permission denied
EFAULT      =    14      ; Bad address
ENOTBLK     =    15      ; Block device required
EBUSY       =    16      ; Device or resource busy
EEXIST      =    17      ; File exists
EXDEV       =    18      ; Cross-device link
ENODEV      =    19      ; No such device
ENOTDIR     =    20      ; Not a directory
EISDIR      =    21      ; Is a directory
EINVAL      =    22      ; Invalid argument
ENFILE      =    23      ; File table overflow
EMFILE      =    24      ; Too many open files
ENOTTY      =    25      ; Not a typewriter
ETXTBSY     =    26      ; Text file busy
EFBIG       =    27      ; File too large
ENOSPC      =    28      ; No space left on device
ESPIPE      =    29      ; Illegal seek
EROFS       =    30      ; Read-only file system
EMLINK      =    31      ; Too many links
EPIPE       =    32      ; Broken pipe
EDOM        =    33      ; Math argument out of domain of func
ERANGE      =    34      ; Math result not representable

EDEADLK       =  35      ; Resource deadlock would occur
ENAMETOOLONG  =  36      ; File name too long
ENOLCK        =  37      ; No record locks available
ENOSYS        =  38      ; Function not implemented
ENOTEMPTY     =  39      ; Directory not empty
ELOOP         =  40      ; Too many symbolic links encountered
EWOULDBLOCK   =  EAGAIN  ; Operation would block
ENOMSG        =  42      ; No message of desired type
EIDRM         =  43      ; Identifier removed
ECHRNG        =  44      ; Channel number out of range
EL2NSYNC      =  45      ; Level 2 not synchronized
EL3HLT        =  46      ; Level 3 halted
EL3RST        =  47      ; Level 3 reset
ELNRNG        =  48      ; Link number out of range
EUNATCH       =  49      ; Protocol driver not attached
ENOCSI        =  50      ; No CSI structure available
EL2HLT        =  51      ; Level 2 halted
EBADE         =  52      ; Invalid exchange
EBADR         =  53      ; Invalid request descriptor
EXFULL        =  54      ; Exchange full
ENOANO        =  55      ; No anode
EBADRQC       =  56      ; Invalid request code
EBADSLT       =  57      ; Invalid slot

EDEADLOCK     =  EDEADLK

EBFONT        =  59      ; Bad font file format
ENOSTR        =  60      ; Device not a stream
ENODATA       =  61      ; No data available
ETIME         =  62      ; Timer expired
ENOSR         =  63      ; Out of streams resources
ENONET        =  64      ; Machine is not on the network
ENOPKG        =  65      ; Package not installed
EREMOTE       =  66      ; Object is remote
ENOLINK       =  67      ; Link has been severed
EADV          =  68      ; Advertise error
ESRMNT        =  69      ; Srmount error
ECOMM         =  70      ; Communication error on send
EPROTO        =  71      ; Protocol error
EMULTIHOP     =  72      ; Multihop attempted
EDOTDOT       =  73      ; RFS specific error
EBADMSG       =  74      ; Not a data message
EOVERFLOW     =  75      ; Value too large for defined data type
ENOTUNIQ      =  76      ; Name not unique on network
EBADFD        =  77      ; File descriptor in bad state
EREMCHG       =  78      ; Remote address changed
ELIBACC       =  79      ; Can not access a needed shared library
ELIBBAD       =  80      ; Accessing a corrupted shared library
ELIBSCN       =  81      ; .lib section in a.out corrupted
ELIBMAX       =  82      ; Attempting to link in too many shared libraries
ELIBEXEC      =  83      ; Cannot exec a shared library directly
EILSEQ        =  84      ; Illegal byte sequence
ERESTART      =  85      ; Interrupted system call should be restarted
ESTRPIPE      =  86      ; Streams pipe error
EUSERS        =  87      ; Too many users
ENOTSOCK      =  88      ; Socket operation on non-socket
EDESTADDRREQ  =  89      ; Destination address required
EMSGSIZE      =  90      ; Message too long
EPROTOTYPE    =  91      ; Protocol wrong type for socket
ENOPROTOOPT   =  92      ; Protocol not available
EPROTONOSUPPORT =93      ; Protocol not supported
ESOCKTNOSUPPORT =94      ; Socket type not supported
EOPNOTSUPP      =95      ; Operation not supported on transport endpoint
EPFNOSUPPORT  =  96      ; Protocol family not supported
EAFNOSUPPORT  =  97      ; Address family not supported by protocol
EADDRINUSE    =  98      ; Address already in use
EADDRNOTAVAIL =  99      ; Cannot assign requested address
ENETDOWN      =  100     ; Network is down
ENETUNREACH   =  101     ; Network is unreachable
ENETRESET     =  102     ; Network dropped connection because of reset
ECONNABORTED  =  103     ; Software caused connection abort
ECONNRESET    =  104     ; Connection reset by peer
ENOBUFS       =  105     ; No buffer space available
EISCONN       =  106     ; Transport endpoint is already connected
ENOTCONN      =  107     ; Transport endpoint is not connected
ESHUTDOWN     =  108     ; Cannot send after transport endpoint shutdown
ETOOMANYREFS  =  109     ; Too many references: cannot splice
ETIMEDOUT     =  110     ; Connection timed out
ECONNREFUSED  =  111     ; Connection refused
EHOSTDOWN     =  112     ; Host is down
EHOSTUNREACH  =  113     ; No route to host
EALREADY      =  114     ; Operation already in progress
EINPROGRESS   =  115     ; Operation now in progress
ESTALE        =  116     ; Stale NFS file handle
EUCLEAN       =  117     ; Structure needs cleaning
ENOTNAM       =  118     ; Not a XENIX named type file
ENAVAIL       =  119     ; No XENIX semaphores available
EISNAM        =  120     ; Is a named type file
EREMOTEIO     =  121     ; Remote I/O error
EDQUOT        =  122     ; Quota exceeded

ENOMEDIUM     =  123     ; No medium found
EMEDIUMTYPE   =  124     ; Wrong medium type
ECANCELED     =  125     ; Operation Canceled
ENOKEY        =  126     ; Required key not available
EKEYEXPIRED   =  127     ; Key has expired
EKEYREVOKED   =  128     ; Key has been revoked
EKEYREJECTED  =  129     ; Key was rejected by service

; for robust mutexes
EOWNERDEAD     = 130     ; Owner died
ENOTRECOVERABLE= 131     ; State not recoverable





; System functions ( int $80 )

;         Name              EAX

sys_restart_syscall      =  $00
sys_exit                 =  $01
sys_fork                 =  $02
sys_read                 =  $03
sys_write                =  $04
sys_open                 =  $05
sys_close                =  $06
sys_waitpid              =  $07
sys_creat                =  $08
sys_link                 =  $09
sys_unlink               =  $0a
sys_execve               =  $0b
sys_chdir                =  $0c
sys_time                 =  $0d
sys_mknod                =  $0e
sys_chmod                =  $0f
sys_lchown16             =  $10
sys_stat                 =  $12
sys_lseek                =  $13
sys_getpid               =  $14
sys_mount                =  $15
sys_oldumount            =  $16
sys_setuid16             =  $17
sys_getuid16             =  $18
sys_stime                =  $19
sys_ptrace               =  $1a
sys_alarm                =  $1b
sys_fstat                =  $1c
sys_pause                =  $1d
sys_utime                =  $1e
sys_access               =  $21
sys_nice                 =  $22
sys_sync                 =  $24
sys_kill                 =  $25
sys_rename               =  $26
sys_mkdir                =  $27
sys_rmdir                =  $28
sys_dup                  =  $29
sys_pipe                 =  $2a
sys_times                =  $2b
sys_brk                  =  $2d
sys_setgid16             =  $2e
sys_getgid16             =  $2f
sys_signal               =  $30
sys_geteuid16            =  $31
sys_getegid16            =  $32
sys_acct                 =  $33
sys_umount               =  $34
sys_ioctl                =  $36
sys_fcntl                =  $37
sys_setpgid              =  $39
sys_olduname             =  $3b
sys_umask                =  $3c
sys_chroot               =  $3d
sys_ustat                =  $3e
sys_dup2                 =  $3f
sys_getppid              =  $40
sys_getpgrp              =  $41
sys_setsid               =  $42
sys_sigaction            =  $43
sys_sgetmask             =  $44
sys_ssetmask             =  $45
sys_setreuid16           =  $46
sys_setregid16           =  $47
sys_sigsuspend           =  $48
sys_sigpending           =  $49
sys_sethostname          =  $4a
sys_setrlimit            =  $4b
sys_old_getrlimit        =  $4c
sys_getrusage            =  $4d
sys_gettimeofday         =  $4e
sys_settimeofday         =  $4f
sys_getgroups16          =  $50
sys_setgroups16          =  $51
sys_old_select           =  $52
sys_symlink              =  $53
sys_lstat                =  $54
sys_readlink             =  $55
sys_uselib               =  $56
sys_swapon               =  $57
sys_reboot               =  $58
sys_old_readdir          =  $59
sys_old_mmap             =  $5a
sys_munmap               =  $5b
sys_truncate             =  $5c
sys_ftruncate            =  $5d
sys_fchmod               =  $5e
sys_fchown16             =  $5f
sys_getpriority          =  $60
sys_setpriority          =  $61
sys_statfs               =  $63
sys_fstatfs              =  $64
sys_ioperm               =  $65
sys_socketcall           =  $66
sys_syslog               =  $67
sys_setitimer            =  $68
sys_getitimer            =  $69
sys_newstat              =  $6a
sys_newlstat             =  $6b
sys_newfstat             =  $6c
sys_uname                =  $6d
sys_iopl                 =  $6e
sys_vhangup              =  $6f
sys_vm86old              =  $71
sys_wait4                =  $72
sys_swapoff              =  $73
sys_sysinfo              =  $74
sys_ipc                  =  $75
sys_fsync                =  $76
sys_sigreturn            =  $77
sys_clone                =  $78
sys_setdomainname        =  $79
sys_newuname             =  $7a
sys_modify_ldt           =  $7b
sys_adjtimex             =  $7c
sys_mprotect             =  $7d
sys_sigprocmask          =  $7e
sys_init_module          =  $80
sys_delete_module        =  $81
sys_quotactl             =  $83
sys_getpgid              =  $84
sys_fchdir               =  $85
sys_bdflush              =  $86
sys_sysfs                =  $87
sys_personality          =  $88
sys_setfsuid16           =  $8a
sys_setfsgid16           =  $8b
sys_llseek               =  $8c
sys_getdents             =  $8d
sys_select               =  $8e
sys_flock                =  $8f
sys_msync                =  $90
sys_readv                =  $91
sys_writev               =  $92
sys_getsid               =  $93
sys_fdatasync            =  $94
sys_sysctl               =  $95
sys_mlock                =  $96
sys_munlock              =  $97
sys_mlockall             =  $98
sys_munlockall           =  $99
sys_sched_setparam       =  $9a
sys_sched_getparam       =  $9b
sys_sched_setscheduler   =  $9c
sys_sched_getscheduler   =  $9d
sys_sched_yield          =  $9e
sys_sched_get_priority_m =  $9f
sys_sched_get_priority_m =  $a0
sys_sched_rr_get_interva =  $a1
sys_nanosleep            =  $a2
sys_mremap               =  $a3
sys_setresuid16          =  $a4
sys_getresuid16          =  $a5
sys_vm86                 =  $a6
sys_poll                 =  $a8
sys_nfsservctl           =  $a9
sys_setresgid16          =  $aa
sys_getresgid16          =  $ab
sys_prctl                =  $ac
sys_rt_sigreturn         =  $ad
sys_rt_sigaction         =  $ae
sys_rt_sigprocmask       =  $af
sys_rt_sigpending        =  $b0
sys_rt_sigtimedwait      =  $b1
sys_rt_sigqueueinfo      =  $b2
sys_rt_sigsuspend        =  $b3
sys_pread64              =  $b4
sys_pwrite64             =  $b5
sys_chown16              =  $b6
sys_getcwd               =  $b7
sys_capget               =  $b8
sys_capset               =  $b9
sys_sigaltstack          =  $ba
sys_sendfile             =  $bb
sys_vfork                =  $be
sys_getrlimit            =  $bf
sys_mmap2                =  $c0
sys_truncate64           =  $c1
sys_ftruncate64          =  $c2
sys_stat64               =  $c3
sys_lstat64              =  $c4
sys_fstat64              =  $c5
sys_lchown               =  $c6
sys_getuid               =  $c7
sys_getgid               =  $c8
sys_geteuid              =  $c9
sys_getegid              =  $ca
sys_setreuid             =  $cb
sys_setregid             =  $cc
sys_getgroups            =  $cd
sys_setgroups            =  $ce
sys_fchown               =  $cf
sys_setresuid            =  $d0
sys_getresuid            =  $d1
sys_setresgid            =  $d2
sys_getresgid            =  $d3
sys_chown                =  $d4
sys_setuid               =  $d5
sys_setgid               =  $d6
sys_setfsuid             =  $d7
sys_setfsgid             =  $d8
sys_pivot_root           =  $d9
sys_mincore              =  $da
sys_madvise              =  $db
sys_getdents64           =  $dc
sys_fcntl64              =  $dd
sys_gettid               =  $e0
sys_readahead            =  $e1
sys_setxattr             =  $e2
sys_lsetxattr            =  $e3
sys_fsetxattr            =  $e4
sys_getxattr             =  $e5
sys_lgetxattr            =  $e6
sys_fgetxattr            =  $e7
sys_listxattr            =  $e8
sys_llistxattr           =  $e9
sys_flistxattr           =  $ea
sys_removexattr          =  $eb
sys_lremovexattr         =  $ec
sys_fremovexattr         =  $ed
sys_tkill                =  $ee
sys_sendfile64           =  $ef
sys_futex                =  $f0
sys_sched_setaffinity    =  $f1
sys_sched_getaffinity    =  $f2
sys_set_thread_area      =  $f3
sys_get_thread_area      =  $f4
sys_io_setup             =  $f5
sys_io_destroy           =  $f6
sys_io_getevents         =  $f7
sys_io_submit            =  $f8
sys_io_cancel            =  $f9
sys_fadvise64            =  $fa
sys_exit_group           =  $fc
sys_lookup_dcookie       =  $fd
sys_epoll_create         =  $fe
sys_epoll_ctl            =  $ff
sys_epoll_wait           =  $100
sys_remap_file_pages     =  $101
sys_set_tid_address      =  $102
sys_timer_create         =  $103
sys_timer_settime        =  $104
sys_timer_gettime        =  $105
sys_timer_getoverrun     =  $106
sys_timer_delete         =  $107
sys_clock_settime        =  $108
sys_clock_gettime        =  $109
sys_clock_getres         =  $10a
sys_clock_nanosleep      =  $10b
sys_statfs64             =  $10c
sys_fstatfs64            =  $10d
sys_tgkill               =  $10e
sys_utimes               =  $10f
sys_fadvise64_64         =  $110
sys_mbind                =  $112
sys_get_mempolicy        =  $113
sys_set_mempolicy        =  $114
sys_mq_open              =  $115
sys_mq_unlink            =  $116
sys_mq_timedsend         =  $117
sys_mq_timedreceive      =  $118
sys_mq_notify            =  $119
sys_mq_getsetattr        =  $11a
sys_kexec_load           =  $11b
sys_waitid               =  $11c
sys_add_key              =  $11e
sys_request_key          =  $11f
sys_keyctl               =  $120
sys_ioprio_set           =  $121
sys_ioprio_get           =  $122
sys_inotify_init         =  $123
sys_inotify_add_watch    =  $124
sys_inotify_rm_watch     =  $125
sys_migrate_pages        =  $126
sys_openat               =  $127
sys_mkdirat              =  $128
sys_mknodat              =  $129
sys_fchownat             =  $12a
sys_futimesat            =  $12b
sys_fstatat64            =  $12c
sys_unlinkat             =  $12d
sys_renameat             =  $12e
sys_linkat               =  $12f
sys_symlinkat            =  $130
sys_readlinkat           =  $131
sys_fchmodat             =  $132
sys_faccessat            =  $133
sys_pselect6             =  $134
sys_ppoll                =  $135
sys_unshare              =  $136
sys_set_robust_list      =  $137
sys_get_robust_list      =  $138
sys_splice               =  $139
sys_sync_file_range      =  $13a
sys_tee                  =  $13b
sys_vmsplice             =  $13c
sys_move_pages           =  $13d
sys_getcpu               =  $13e
sys_epoll_pwait          =  $13f
sys_utimensat            =  $140
sys_signalfd             =  $141
sys_timerfd_create       =  $142
sys_eventfd              =  $143
sys_fallocate            =  $144
sys_timerfd_settime      =  $145
sys_timerfd_gettime      =  $146
sys_signalfd4            =  $147
sys_eventfd2             =  $148
sys_epoll_create1        =  $149
sys_dup3                 =  $14a
sys_pipe2                =  $14b
sys_inotify_init1        =  $14c
sys_preadv               =  $14d
sys_pwritev              =  $14e
sys_rt_tgsigqueueinfo    =  $14f
sys_perf_event_open      =  $150
sys_recvmmsg             =  $151


; file open access flags to be used with sys_open and other file functions.
O_ACCMODE       =     0003o
O_RDONLY        =       00o
O_WRONLY        =       01o
O_RDWR          =       02o
O_CREAT         =     0100o
O_EXCL          =     0200o
O_NOCTTY        =     0400o
O_TRUNC         =    01000o
O_APPEND        =    02000o
O_NONBLOCK      =    04000o
O_NDELAY        =   O_NONBLOCK
O_SYNC          =   010000o ;specific to ext2 fs and block devices
FASYNC          =   020000o ;fcntl, for BSD compatibility
O_DIRECT        =   040000o ;direct disk access hint - currently ignored
O_LARGEFILE     =  0100000o
O_DIRECTORY     =  0200000o ;must be a directory
O_NOFOLLOW      =  0400000o ;don't follow links
O_NOATIME       = 01000000o

;   file permissions flags
S_ISUID         = 04000o ;set user ID on execution
S_ISGID         = 02000o ;set group ID on execution
S_ISVTX         = 01000o ;sticky bit
S_IRUSR         = 00400o ;read by owner (S_IREAD)
S_IWUSR         = 00200o ;write by owner (S_IWRITE)
S_IXUSR         = 00100o ;execute/search by owner (S_IEXEC)
S_IRGRP         = 00040o ;read by group
S_IWGRP         = 00020o ;write by group
S_IXGRP         = 00010o ;execute/search by group
S_IROTH         = 00004o ;read by others (R_OK)
S_IWOTH         = 00002o ;write by others (W_OK)
S_IXOTH         = 00001o ;execute/search by others (X_OK)



;socket commands

SYS_SOCKET      = 1
SYS_BIND        = 2
SYS_CONNECT     = 3
SYS_LISTEN      = 4
SYS_ACCEPT      = 5
SYS_GETSOCKNAME = 6
SYS_GETPEERNAME = 7
SYS_SOCKETPAIR  = 8
SYS_SEND        = 9
SYS_RECV        = 10
SYS_SENDTO      = 11
SYS_RECVFROM    = 12
SYS_SHUTDOWN    = 13
SYS_SETSOCKOPT  = 14
SYS_GETSOCKOPT  = 15
SYS_SENDMSG     = 16
SYS_RECVMSG     = 17

;socket constants

; SYS_SHUTDOWN argument:

SHUT_RD = 0
SHUT_WR = 1
SHUT_RDWR = 2

;

AF_UNSPEC       = 0
AF_UNIX         = 1
AF_LOCAL        = 1
AF_INET         = 2
AF_AX25         = 3
AF_IPX          = 4
AF_APPLETALK    = 5
AF_NETROM       = 6
AF_BRIDGE       = 7
AF_ATMPVC       = 8
AF_X25          = 9
AF_INET6        = 10
AF_ROSE         = 11
AF_DECnet       = 12
AF_NETBEUI      = 13
AF_SECURITY     = 14
AF_KEY          = 15
AF_NETLINK      = 16
AF_ROUTE        = AF_NETLINK
AF_PACKET       = 17
AF_ASH          = 18
AF_ECONET       = 19
AF_ATMSVC       = 20
AF_SNA          = 22
AF_IRDA         = 23
AF_PPPOX        = 24
AF_WANPIPE      = 25
AF_LLC          = 26
AF_TIPC         = 30
AF_BLUETOOTH    = 31
AF_MAX          = 32

PF_UNSPEC       = AF_UNSPEC
PF_UNIX         = AF_UNIX
PF_LOCAL        = AF_LOCAL
PF_INET         = AF_INET
PF_AX25         = AF_AX25
PF_IPX          = AF_IPX
PF_APPLETALK    = AF_APPLETALK
PF_NETROM       = AF_NETROM
PF_BRIDGE       = AF_BRIDGE
PF_ATMPVC       = AF_ATMPVC
PF_X25          = AF_X25
PF_INET6        = AF_INET6
PF_ROSE         = AF_ROSE
PF_DECnet       = AF_DECnet
PF_NETBEUI      = AF_NETBEUI
PF_SECURITY     = AF_SECURITY
PF_KEY          = AF_KEY
PF_NETLINK      = AF_NETLINK
PF_ROUTE        = AF_ROUTE
PF_PACKET       = AF_PACKET
PF_ASH          = AF_ASH
PF_ECONET       = AF_ECONET
PF_ATMSVC       = AF_ATMSVC
PF_SNA          = AF_SNA
PF_IRDA         = AF_IRDA
PF_PPPOX        = AF_PPPOX
PF_WANPIPE      = AF_WANPIPE
PF_LLC          = AF_LLC
PF_TIPC         = AF_TIPC
PF_BLUETOOTH    = AF_BLUETOOTH
PF_MAX          = AF_MAX

SOCK_STREAM     = 1
SOCK_DGRAM      = 2
SOCK_RAW        = 3
SOCK_RDM        = 4
SOCK_SEQPACKET  = 5
SOCK_DCCP       = 6
SOCK_PACKET     = 10


; socket flags
MSG_OOB         = 1
MSG_PEEK        = 2
MSG_DONTROUTE   = 4
MSG_TRYHARD     = 4
MSG_CTRUNC      = 8
MSG_PROBE       = 0x10
MSG_TRUNC       = 0x20
MSG_DONTWAIT    = 0x40
MSG_EOR         = 0x80
MSG_WAITALL     = 0x100
MSG_FIN         = 0x200
MSG_SYN         = 0x400
MSG_CONFIRM     = 0x800
MSG_RST         = 0x1000
MSG_ERRQUEUE    = 0x2000
MSG_NOSIGNAL    = 0x4000
MSG_MORE        = 0x8000


SOL_SOCKET      = 1

SO_DEBUG        = 1
SO_REUSEADDR    = 2
SO_TYPE         = 3
SO_ERROR        = 4
SO_DONTROUTE    = 5
SO_BROADCAST    = 6
SO_SNDBUF       = 7
SO_RCVBUF       = 8
SO_SNDBUFFORCE  = 32
SO_RCVBUFFORCE  = 33
SO_KEEPALIVE    = 9
SO_OOBINLINE    = 10
SO_NO_CHECK     = 11
SO_PRIORITY     = 12
SO_LINGER       = 13
SO_BSDCOMPAT    = 14
SO_PASSCRED     = 16
SO_PEERCRED     = 17
SO_RCVLOWAT     = 18
SO_SNDLOWAT     = 19
SO_RCVTIMEO     = 20
SO_SNDTIMEO     = 21


IPPROTO_IP              =  0               ;  dummy for IP
IPPROTO_HOPOPTS         =  0               ;  IPv6 hop-by-hop options
IPPROTO_ICMP            =  1               ;  control message protocol
IPPROTO_IGMP            =  2               ;  group mgmt protocol
IPPROTO_IPV4            =  4
IPPROTO_TCP             =  6               ;  tcp
IPPROTO_EGP             =  8               ;  exterior gateway protocol
IPPROTO_PIGP            =  9
IPPROTO_UDP             =  17              ;  user datagram protocol
IPPROTO_DCCP            =  33              ;  datagram congestion control protocol
IPPROTO_IPV6            =  41
IPPROTO_ROUTING         =  43              ;  IPv6 routing header
IPPROTO_FRAGMENT        =  44              ;  IPv6 fragmentation header
IPPROTO_RSVP            =  46              ;  resource reservation
IPPROTO_GRE             =  47              ;  General Routing Encap.
IPPROTO_ESP             =  50              ;  SIPP Encap Sec. Payload
IPPROTO_AH              =  51              ;  SIPP Auth Header
IPPROTO_MOBILE          =  55
IPPROTO_ICMPV6          =  58              ;  ICMPv6
IPPROTO_NONE            =  59              ;  IPv6 no next header
IPPROTO_DSTOPTS         =  60              ;  IPv6 destination options
IPPROTO_MOBILITY_OLD    =  62
IPPROTO_ND              =  77              ;  Sun net disk proto (temp.)
IPPROTO_EIGRP           =  88              ;  Cisco/GXS IGRP
IPPROTO_OSPF            =  89
IPPROTO_PIM             =  103
IPPROTO_IPCOMP          =  108
IPPROTO_VRRP            =  112
IPPROTO_PGM             =  113
IPPROTO_SCTP            =  132
IPPROTO_MOBILITY        =  135



; sys_ipc commands and constants


SEMOP        =    1
SEMGET       =    2
SEMCTL       =    3
SEMTIMEDOP   =    4

MSGSND       =   11
MSGRCV       =   12
MSGGET       =   13
MSGCTL       =   14

SHMAT        =   21
SHMDT        =   22
SHMGET       =   23
SHMCTL       =   24

; shm_mode upper byte flags

SHM_DEST = $200         ;  segment will be destroyed on last detach
SHM_LOCKED = $400       ;  segment will not be swapped
SHM_HUGETLB = $800      ;  segment is mapped via hugetlb
SHM_NORESERVE = $1000   ;  don't check for reservations






; Signal values
; default action is: "Term" - terminate; "Core" - terminate with core dump; "Ign" - ignore; "Stop" - stop the process; "Cont" - continue the process.

macro signal name, value {
  name = value
  name#.mask = 1 shl value
}

signal SIGHUP   ,  1    ; Term    Hangup detected on controlling terminal or death of controlling process
signal SIGINT   ,  2    ; Term    Interrupt from keyboard
signal SIGQUIT  ,  3    ; Core    Quit from keyboard
signal SIGILL   ,  4    ; Core    Illegal Instruction
signal SIGTRAP  ,  5    ; Core    Trace/breakpoint trap
signal SIGABRT  ,  6    ; Core    Abort signal from abort(3)
signal SIGIOT   ,  6    ; Core    IOT trap. A synonym for SIGABRT
signal SIGBUS   ,  7    ; Core    Bus error (bad memory access)
signal SIGFPE   ,  8    ; Core    Floating point exception
signal SIGKILL  ,  9    ; Term    Kill signal
signal SIGUSR1  , 10    ; Term    User-defined signal 1
signal SIGSEGV  , 11    ; Core    Invalid memory reference
signal SIGUSR2  , 12    ; Term    User-defined signal 2
signal SIGPIPE  , 13    ; Term    Broken pipe: write to pipe with no readers
signal SIGALRM  , 14    ; Term    Timer signal from alarm(2)
signal SIGTERM  , 15    ; Term    Termination signal
signal SIGSTKFLT, 16    ; Term    Stack fault on coprocessor (unused)
signal SIGCHLD  , 17    ; Ign     Child stopped or terminated
signal SIGCONT  , 18    ; Cont    Continue if stopped
signal SIGSTOP  , 19    ; Stop    Stop process
signal SIGTSTP  , 20    ; Stop    Stop typed at tty
signal SIGTTIN  , 21    ; Stop    tty input for background process
signal SIGTTOU  , 22    ; Stop    tty output for background process
signal SIGURG   , 23    ; Ign     Urgent condition on socket (4.2BSD)
signal SIGXCPU  , 24    ; Core    CPU time limit exceeded (4.2BSD)
signal SIGXFSZ  , 25    ; Core    File size limit exceeded (4.2BSD)
signal SIGVTALRM, 26    ; Term    Virtual alarm clock (4.2BSD)
signal SIGPROF  , 27    ; Term    Profiling timer expired
signal SIGWINCH , 28    ; Ign     Window resize signal (4.3BSD, Sun)
signal SIGIO    , 29    ; Term    I/O now possible (4.2BSD)
signal SIGPWR   , 30    ; Term    Power failure (System V)
signal SIGSYS   , 31    ; Core    Bad argument to routine (SVr4)
signal SIGUNUSED, 31    ; Core    Synonymous with SIGSYS

SIGRTMIN = 34
SIGRTMAX = 64

; signal flags

SA_ONSTACK    =  $00000001      ;  Call the signal handler on an alternate signal stack provided by
                                ;  sigaltstack(2).  If an alternate stack is not available, the
                                ;  default stack will be used.  This flag is only meaningful when
                                ;  establishing a signal handler.



SA_RESETHAND  =  $00000004      ;  Restore the signal action to the default state once the signal
                                ;  handler has been called.  This flag is only meaningful when
                                ;  establishing a signal handler.  SA_ONESHOT is an obsolete,
                                ;  nonstandard synonym for this flag.


SA_NOCLDSTOP  =  $00000008      ; If signum is SIGCHLD, do not receive notification when child
                                ; processes stop (i.e., when they receive one of SIGSTOP, SIGTSTP,
                                ; SIGTTIN or SIGTTOU) or resume (i.e., they receive SIGCONT) (see
                                ; wait(2)).  This flag is only meaningful when establishing a handler
                                ; for SIGCHLD.


SA_SIGINFO    =  $00000010      ;  The signal handler takes 3 arguments, not one.  In this case,
                                ;  sa_sigaction should be set instead of sa_handler.  This flag is
                                ;  only meaningful when establishing a signal handler.


SA_NODEFER    =  $00000020      ; Do not prevent the signal from being received from within its own
                                ; signal handler.  This flag is only meaningful when establishing a
                                ; signal handler.  SA_NOMASK is an obsolete, nonstandard synonym for
                                ; this flag.


SA_RESTART    =  $00000040      ;  Provide behavior compatible with BSD signal semantics by making
                                ;  certain system calls restartable across signals.  This flag is only
                                ;  meaningful when establishing a signal handler.  See signal(7) for a
                                ;  discussion of system call restarting.


SA_NOCLDWAIT  =  $00000080      ; If signum is SIGCHLD, do not transform children into zombies when
                                ; they terminate.  See also waitpid(2).  This flag is only meaningful
                                ; when establishing a handler for SIGCHLD, or when setting that
                                ; signal's disposition to SIG_DFL.
                                ;
                                ; If the SA_NOCLDWAIT flag is set when establishing a handler for
                                ; SIGCHLD, POSIX.1 leaves it unspecified whether a SIGCHLD signal is
                                ; generated when a child process terminates.  On Linux, a SIGCHLD
                                ; signal is generated in this case; on some other implementations, it
                                ; is not.


SA_NOMASK     =  SA_NODEFER
SA_ONESHOT    =  SA_RESETHAND
SA_INTERRUPT  =  $20000000      ; dummy -- ignored
SA_RESTORER   =  $04000000      ; obsolete -- ignored

; Signals hanlers constants

SIG_DFL = 0     ; default signal handling
SIG_IGN = 1     ; ignore signal
SIG_ERR = -1    ; error return from signal


; Interval timers structures

ITIMER_REAL    = 0
ITIMER_VIRTUAL = 1
ITIMER_PROF    = 2


struct lnx_sigaction
  .sa_handler   dd ?      ; SIG_DFL, SIG_IGN or ptr proc Handler, .signal
  .sa_sigaction dd ?      ; ptr proc SigAction, .signal, .ptrSignalInfo, .ptr
  .sa_mask      dd ?      ; mask of the signals
  .sa_flags     dd ?      ;
  .sa_restorer  dd ?      ; obsolete, don't use
ends


struct sig_context
  .gs            dd  ?
  .fs            dd  ?
  .es            dd  ?
  .ds            dd  ?

  .edi           dd  ?
  .esi           dd  ?
  .ebp           dd  ?
  .esp           dd  ?
  .ebx           dd  ?
  .edx           dd  ?
  .ecx           dd  ?
  .eax           dd  ?

  .trapno        dd  ?
  .err           dd  ?
  .eip           dd  ?
  .cs            dd  ?
  .eflags        dd  ?
  .esp_at_signal dd  ?
  .ss            dd  ?
  .fpstate       dd  ?
  .oldmask       dd  ?
  .cr2           dd  ?
ends



struct lnx_timeval
  .tv_sec  dd ?
  .tv_usec dd ?
ends

struct lnx_timezone
  .tz_minuteswest dd ?
  .tz_dsttime     dd ?
ends



struct lnx_itimerval
  .it_interval lnx_timeval
  .it_value    lnx_timeval
ends


; structures and equates for timer_xxxx POSIX functions


CLOCK_REALTIME            =  0 ; Identifier for system-wide realtime clock.
CLOCK_MONOTONIC           =  1 ; Monotonic system-wide clock.
CLOCK_PROCESS_CPUTIME_ID  =  2 ; High-resolution timer from the CPU.
CLOCK_THREAD_CPUTIME_ID   =  3 ; Thread-specific CPU-time clock.

SIGEV_SIGNAL = 0     ; Notify via signal.
SIGEV_NONE   = 1     ; Other notification: meaningless.
SIGEV_THREAD = 2     ; Deliver via thread creation.
SIGEV_THREAD_ID = 4  ; Send signal to specific thread.


struct lnx_sigval
  .sival_int dd ?
  virtual at .sival_int
    .sival_ptr dd ?
  end virtual
ends

struct lnx_sigev_thread
  .function  dd ?
  .attribute dd ?
ends


struct lnx_sigevent
  .value      lnx_sigval
  .signo      dd ?
  .notify     dd ?
  ._pad       rd 13

  virtual at ._pad
    ._tid     dd ?
  end virtual

  virtual at ._pad
    .thread   lnx_sigev_thread
  end virtual
ends


struct lnx_timespec
  .tv_sec  dd ?   ; time in seconds
  .tv_nsec dd ?   ; time is nano seconds
ends


struct lnx_itimerspec
  .it_interval lnx_timespec
  .it_value    lnx_timespec
ends


; sys_clone function flags

CLONE_VM                =  $00000100      ; set if VM shared between processes
CLONE_FS                =  $00000200      ; set if fs info shared between processes
CLONE_FILES             =  $00000400      ; set if open files shared between processes
CLONE_SIGHAND           =  $00000800      ; set if signal handlers and blocked signals shared
CLONE_PTRACE            =  $00002000      ; set if we want to let tracing continue on the child too
CLONE_VFORK             =  $00004000      ; set if the parent wants the child to wake it up on mm_release
CLONE_PARENT            =  $00008000      ; set if we want to have the same parent as the cloner
CLONE_THREAD            =  $00010000      ; Same thread group?
CLONE_NEWNS             =  $00020000      ; New namespace group?
CLONE_SYSVSEM           =  $00040000      ; share system V SEM_UNDO semantics
CLONE_SETTLS            =  $00080000      ; create a new TLS for the child
CLONE_PARENT_SETTID     =  $00100000      ; set the TID in the parent
CLONE_CHILD_CLEARTID    =  $00200000      ; clear the TID in the child
CLONE_DETACHED          =  $00400000      ; Unused, ignored
CLONE_UNTRACED          =  $00800000      ; set if the tracing process can't force CLONE_PTRACE on this clone
CLONE_CHILD_SETTID      =  $01000000      ; set the TID in the child
CLONE_STOPPED           =  $02000000      ; Start in stopped state
CLONE_NEWUTS            =  $04000000      ; New utsname group?
CLONE_NEWIPC            =  $08000000      ; New ipcs
CLONE_NEWUSER           =  $10000000      ; New user namespace
CLONE_NEWPID            =  $20000000      ; New pid namespace
CLONE_NEWNET            =  $40000000      ; New network namespace
CLONE_IO                =  $80000000      ; Clone io context


; Memory constants

; Protections are chosen from these bits, OR'd together.  The
;   implementation does not necessarily support PROT_EXEC or PROT_WRITE
;   without PROT_READ.  The only guarantees are that no writing will be
;   allowed without PROT_WRITE and no access will be allowed for PROT_NONE.

PROT_READ       =  $1             ; Page can be read.
PROT_WRITE      =  $2             ; Page can be written.
PROT_EXEC       =  $4             ; Page can be executed.
PROT_NONE       =  $0             ; Page can not be accessed.
PROT_GROWSDOWN  =  $01000000      ; Extend change to start of
                                        ; growsdown vma (mprotect only).
PROT_GROWSUP    =  $02000000      ; Extend change to start of
                                        ; growsup vma (mprotect only).

; Sharing types (must choose one and only one of these).
MAP_SHARED      =  $01            ; Share changes.
MAP_PRIVATE     =  $02            ; Changes are private.
MAP_TYPE        =  $0f            ; Mask for type of mapping.


; Other flags.
MAP_FIXED       =  $10            ; Interpret addr exactly.
MAP_ANONYMOUS   =  $20            ; Don't use a file.
MAP_32BIT       =  $40            ; Only give out 32-bit addresses.


; These are Linux-specific.
MAP_GROWSDOWN  =  $00100          ; Stack-like segment.
MAP_DENYWRITE  =  $00800          ; ETXTBSY
MAP_EXECUTABLE =  $01000          ; Mark it as an executable.
MAP_LOCKED     =  $02000          ; Lock the mapping.
MAP_NORESERVE  =  $04000          ; Don't check for reservations.
MAP_POPULATE   =  $08000          ; Populate (prefault) pagetables.
MAP_NONBLOCK   =  $10000          ; Do not block on IO.
MAP_STACK      =  $20000          ; Allocation is for a stack.


; Flags to `msync'.
MS_ASYNC       = 1                ; Sync memory asynchronously.
MS_SYNC        = 4                ; Synchronous memory sync.
MS_INVALIDATE  = 2                ; Invalidate the caches.


; Flags for `mlockall'.
MCL_CURRENT    = 1                ; Lock all currently mapped pages.
MCL_FUTURE     = 2                ; Lock all additions to address space.

; Flags for `mremap'.
MREMAP_MAYMOVE = 1
MREMAP_FIXED   = 2

; Advice to `madvise'.
MADV_NORMAL     = 0      ; No further special treatment.
MADV_RANDOM     = 1      ; Expect random page references.
MADV_SEQUENTIAL = 2      ; Expect sequential page references.
MADV_WILLNEED   = 3      ; Will need these pages.
MADV_DONTNEED   = 4      ; Don't need these pages.
MADV_REMOVE     = 9      ; Remove these pages and resources.
MADV_DONTFORK   = 10     ; Do not inherit across fork.
MADV_DOFORK     = 11     ; Do inherit across fork.


; The POSIX people had to invent similar names for the same things.
POSIX_MADV_NORMAL      = 0 ; No further special treatment.
POSIX_MADV_RANDOM      = 1 ; Expect random page references.
POSIX_MADV_SEQUENTIAL  = 2 ; Expect sequential page references.
POSIX_MADV_WILLNEED    = 3 ; Will need these pages.
POSIX_MADV_DONTNEED    = 4 ; Don't need these pages.



; sys_futex constants


FUTEX_WAIT             = 0
FUTEX_WAKE             = 1
FUTEX_FD               = 2
FUTEX_REQUEUE          = 3
FUTEX_CMP_REQUEUE      = 4
FUTEX_WAKE_OP          = 5
FUTEX_LOCK_PI          = 6
FUTEX_UNLOCK_PI        = 7
FUTEX_TRYLOCK_PI       = 8
FUTEX_WAIT_BITSET      = 9
FUTEX_WAKE_BITSET      = 10

FUTEX_PRIVATE_FLAG  = $80

; sys_fstat and similar structures

struct STAT
  .st_dev     dw  ?     ; ID of device containing file
  .pad1       dw  ?
  .st_ino     dd  ?     ; inode number
  .st_mode    dw  ?     ; protection
  .st_nlink   dw  ?     ; number of hard links
  .st_uid     dw  ?     ; user ID of owner
  .st_gid     dw  ?     ; group ID of owner
  .st_rdev    dw  ?     ; device ID (if special file)
  .pad2       dw  ?
  .st_size    dd  ?     ; total size, in bytes
  .st_blksize dd  ?     ; block size
  .st_blocks  dd  ?

  .st_atime   dd  ?     ; time of last access
  .unused1    dd  ?

  .st_mtime   dd  ?     ; time of last modification
  .unused2    dd  ?

  .st_ctime   dd  ?     ; time of last status change
  .unused3    dd  ?
  .unused4    dd  ?
  .unused5    dd  ?
ends


struct STAT64
  .st_dev        rq 1
  .__pad0        rb 4
  .__st_ino      rd 1
  .st_mode       rd 1
  .st_nlink      rd 1
  .st_uid        rd 1
  .st_gid        rd 1
  .st_rdev       rq 1
  .__pad3        rb 4
  .st_size       rq 1
  .st_blksize    rd 1
  .st_blocks     rq 1
  .st_atime      rd 1
  .st_atime_nsec rd 1
  .st_mtime      rd 1
  .st_mtime_nsec rd 1
  .st_ctime      rd 1
  .st_ctime_nsec rd 1
  .st_ino        rq 1
ends

; sys_getdents

; it is variable length structure.
struct linux_dirent
  .d_ino dd ?
  .d_off dd ?
  .d_reclen dw ?
  label .d_name byte
ends

struct linux_dirent64
  .d_ino        dq ?
  .d_off        dq ?
  .d_reclen     dw ?
  .d_type       db ?
  label .d_name byte
ends


; file types for the above structure.
; this value is written at the last byte of the structure. (linux_dirent.d_reclen-1)

DT_UNKNOWN   =   0
DT_FIFO      =   1
DT_CHR       =   2
DT_DIR       =   4
DT_BLK       =   6
DT_REG       =   8      ; regular file
DT_LNK       =   10
DT_SOCK      =   12
DT_WHT       =   14


; sys_ioctl constants and structures.

_IOC_NONE       = 0
_IOC_WRITE      = 1
_IOC_READ       = 2
_IOC_NRBITS     = 8
_IOC_TYPEBITS   = 8
_IOC_SIZEBITS   = 14
_IOC_DIRBITS    = 2
_IOC_NRSHIFT    = 0
_IOC_TYPESHIFT  = (_IOC_NRSHIFT+_IOC_NRBITS)
_IOC_SIZESHIFT  = (_IOC_TYPESHIFT+_IOC_TYPEBITS)
_IOC_DIRSHIFT   = (_IOC_SIZESHIFT+_IOC_SIZEBITS)


TCGETS          = 0x5401
TCSETS          = 0x5402
TCSETSW         = 0x5403
TCSETSF         = 0x5404
TCGETA          = 0x5405
TCSETA          = 0x5406
TCSETAW         = 0x5407
TCSETAF         = 0x5408
TCSBRK          = 0x5409
TCXONC          = 0x540A
TCFLSH          = 0x540B
TIOCEXCL        = 0x540C
TIOCNXCL        = 0x540D
TIOCSCTTY       = 0x540E
TIOCGPGRP       = 0x540F
TIOCSPGRP       = 0x5410
TIOCOUTQ        = 0x5411
TIOCSTI         = 0x5412
TIOCGWINSZ      = 0x5413
TIOCSWINSZ      = 0x5414
TIOCMGET        = 0x5415
TIOCMBIS        = 0x5416
TIOCMBIC        = 0x5417
TIOCMSET        = 0x5418
TIOCGSOFTCAR    = 0x5419
TIOCSSOFTCAR    = 0x541A
FIONREAD        = 0x541B
TIOCINQ         = FIONREAD
TIOCLINUX       = 0x541C
TIOCCONS        = 0x541D
TIOCGSERIAL     = 0x541E
TIOCSSERIAL     = 0x541F
TIOCPKT         = 0x5420
FIONBIO         = 0x5421
TIOCNOTTY       = 0x5422
TIOCSETD        = 0x5423
TIOCGETD        = 0x5424
TCSBRKP         = 0x542
TIOCSBRK        = 0x5427
TIOCCBRK        = 0x5428
TIOCGSID        = 0x5429
TIOCGPTN        = ((_IOC_READ shl _IOC_DIRSHIFT) or ("T" shl _IOC_TYPESHIFT) or (0x30 shl _IOC_NRSHIFT) or (4 shl _IOC_SIZESHIFT))
TIOCSPTLCK      = ((_IOC_WRITE shl _IOC_DIRSHIFT) or ("T" shl _IOC_TYPESHIFT) or (0x31 shl _IOC_NRSHIFT) or (4 shl _IOC_SIZESHIFT))
FIONCLEX        = 0x5450
FIOCLEX         = 0x5451
FIOASYNC        = 0x5452
TIOCSERCONFIG   = 0x5453
TIOCSERGWILD    = 0x5454
TIOCSERSWILD    = 0x5455
TIOCGLCKTRMIOS  = 0x5456
TIOCSLCKTRMIOS  = 0x5457
TIOCSERGSTRUCT  = 0x5458
TIOCSERGETLSR   = 0x5459
TIOCSERGETMULTI = 0x545A
TIOCSERSETMULTI = 0x545B
TIOCMIWAIT      = 0x545C
TIOCGICOUNT     = 0x545D
TIOCGHAYESESP   = 0x545E
TIOCSHAYESESP   = 0x545F
FIOQSIZE        = 0x5460


NCCS = 19

struct termios
.c_iflag rd 1 ; input mode flags
.c_oflag rd 1 ; output mode flags
.c_cflag rd 1 ; control mode flags
.c_lflag rd 1 ; local mode flags
.c_line  rb 1 ; line discipline
.c_cc    rb NCCS ; control characters
ends


;termios entries.

; c_cc characters
VINTR   = 0
VQUIT   = 1
VERASE  = 2
VKILL   = 3
VEOF    = 4
VTIME   = 5
VMIN    = 6
VSWTC   = 7
VSTART  = 8
VSTOP   = 9
VSUSP   = 10
VEOL    = 11
VREPRINT = 12
VDISCARD = 13
VWERASE = 14
VLNEXT  = 15
VEOL2   = 16

; c_iflag bits
IGNBRK  = 0000001o
BRKINT  = 0000002o
IGNPAR  = 0000004o
PARMRK  = 0000010o
INPCK   = 0000020o
ISTRIP  = 0000040o
INLCR   = 0000100o
IGNCR   = 0000200o
ICRNL   = 0000400o
IUCLC   = 0001000o
IXON    = 0002000o
IXANY   = 0004000o
IXOFF   = 0010000o
IMAXBEL = 0020000o
IUTF8   = 0040000o

; c_oflag bits
OPOST   = 0000001o
OLCUC   = 0000002o
ONLCR   = 0000004o
OCRNL   = 0000010o
ONOCR   = 0000020o
ONLRET  = 0000040o
OFILL   = 0000100o
OFDEL   = 0000200o
NLDLY   = 0000400o
NL0     = 0000000o
NL1     = 0000400o
CRDLY   = 0003000o
cCR0     = 0000000o
cCR1     = 0001000o
cCR2     = 0002000o
cCR3     = 0003000o
TABDLY  = 0014000o
TAB0    = 0000000o
TAB1    = 0004000o
TAB2    = 0010000o
TAB3    = 0014000o
XTABS   = 0014000o
BSDLY   = 0020000o
BS0     = 0000000o
BS1     = 0020000o
VTDLY   = 0040000o
VT0     = 0000000o
VT1     = 0040000o
FFDLY   = 0100000o
FF0     = 0000000o
FF1     = 0100000o

; c_cflag bit meaning
CBAUD   = 0010017o
B0      = 0000000o
B50     = 0000001o
B75     = 0000002o
B110    = 0000003o
B134    = 0000004o
B150    = 0000005o
B200    = 0000006o
B300    = 0000007o
B600    = 0000010o
B1200   = 0000011o
B1800   = 0000012o
B2400   = 0000013o
B4800   = 0000014o
B9600   = 0000015o
B19200  = 0000016o
B38400  = 0000017o
EXTA    = B19200
EXTB    = B38400
CSIZE    = 0000060o
CS5      = 0000000o
CS6      = 0000020o
CS7      = 0000040o
CS8      = 0000060o
CSTOPB   = 0000100o
CREAD    = 0000200o
PARENB   = 0000400o
PARODD   = 0001000o
HUPCL    = 0002000o
CLOCAL   = 0004000o
CBAUDEX  = 0010000o
B57600   = 0010001o
B115200  = 0010002o
B230400  = 0010003o
B460800  = 0010004o
B500000  = 0010005o
B576000  = 0010006o
B921600  = 0010007o
B1000000 = 0010010o
B1152000 = 0010011o
B1500000 = 0010012o
B2000000 = 0010013o
B2500000 = 0010014o
B3000000 = 0010015o
B3500000 = 0010016o
B4000000 = 0010017o
CIBAUD   = 002003600000o
CMSPAR   = 010000000000o
CRTSCTS  = 020000000000o

; c_lflag bits
ISIG    = 0000001o
ICANON  = 0000002o
XCASE   = 0000004o
ECHO    = 0000010o
ECHOE   = 0000020o
ECHOK   = 0000040o
ECHONL  = 0000100o
NOFLSH  = 0000200o
TOSTOP  = 0000400o
ECHOCTL = 0001000o
ECHOPRT = 0002000o
ECHOKE  = 0004000o
FLUSHO  = 0010000o
PENDIN  = 0040000o
IEXTEN  = 0100000o

;end of termios entries.



; Constants for sys_personality


ADDR_NO_RANDOMIZE   = $00040000
MMAP_PAGE_ZERO      = $00100000
ADDR_COMPAT_LAYOUT  = $00200000
READ_IMPLIES_EXEC   = $00400000
ADDR_LIMIT_32BIT    = $00800000
SHORT_INODE         = $01000000
WHOLE_SECONDS       = $02000000
STICKY_TIMEOUTS     = $04000000
ADDR_LIMIT_3GB      = $08000000


; Personality types.

;   These go in the low byte.  Avoid using the top bit, it will conflict with error returns.

PER_LINUX       = $0000
PER_LINUX_32BIT = $0000 or ADDR_LIMIT_32BIT
PER_SVR4        = $0001 or STICKY_TIMEOUTS or MMAP_PAGE_ZERO
PER_SVR3        = $0002 or STICKY_TIMEOUTS or SHORT_INODE
PER_SCOSVR3     = $0003 or STICKY_TIMEOUTS or WHOLE_SECONDS or SHORT_INODE
PER_OSR5        = $0003 or STICKY_TIMEOUTS or WHOLE_SECONDS
PER_WYSEV386    = $0004 or STICKY_TIMEOUTS or SHORT_INODE
PER_ISCR4       = $0005 or STICKY_TIMEOUTS
PER_BSD         = $0006
PER_SUNOS       = $0006 or STICKY_TIMEOUTS
PER_XENIX       = $0007 or STICKY_TIMEOUTS or SHORT_INODE
PER_LINUX32     = $0008
PER_LINUX32_3GB = $0008 or ADDR_LIMIT_3GB
PER_IRIX32      = $0009 or STICKY_TIMEOUTS      ; IRIX5 32-bit
PER_IRIXN32     = $000a or STICKY_TIMEOUTS      ; IRIX6 new 32-bit
PER_IRIX64      = $000b or STICKY_TIMEOUTS      ; IRIX6 64-bit
PER_RISCOS      = $000c
PER_SOLARIS     = $000d or STICKY_TIMEOUTS
PER_UW7         = $000e or STICKY_TIMEOUTS or MMAP_PAGE_ZERO
PER_OSF4        = $000f
PER_HPUX        = $0010
PER_MASK        = $00ff



; sys_flock operations

LOCK_SH    =     $01    ; shared file lock
LOCK_EX    =     $02    ; exclusive file lock
LOCK_NB    =     $04    ; don't block when locking
LOCK_UN    =     $08    ; unlock file

Added freshlib/equates/Linux/_pthreads.inc.















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Equates for pthread library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

; mutex types.

PTHREAD_MUTEX_NORMAL        = 0
PTHREAD_MUTEX_RECURSIVE     = 1
PTHREAD_MUTEX_ERRORCHECK    = 2
PTHREAD_MUTEX_ERRORCHECK_NP = PTHREAD_MUTEX_ERRORCHECK
PTHREAD_MUTEX_RECURSIVE_NP  = PTHREAD_MUTEX_RECURSIVE
PTHREAD_MUTEX_DEFAULT       = PTHREAD_MUTEX_NORMAL

Changes to freshlib/equates/Linux/_x.inc.

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


; X Protocol


 X_PROTOCOL              =       11
 X_PROTOCOL_REVISION     =       0










































;X Constants










None            =       0
ParentRelative  =       1
CopyFromParent  =       0
PointerWindow   =       0
InputFocus      =       1
PointerRoot     =       1





AnyPropertyType =       0


AnyKey          =       0
AnyButton       =       0
AllTemporary    =       0
CurrentTime     =       0





























NoSymbol        =       0

;Event Masks




























































NoEventMask              =       0h
KeyPressMask             =       1h
KeyReleaseMask           =       2h

ButtonPressMask          =       4h
ButtonReleaseMask        =       8h
EnterWindowMask          =      10h





LeaveWindowMask          =      20h




PointerMotionMask        =      40h





PointerMotionHintMask    =      80h
Button1MotionMask        =     100h

Button2MotionMask        =     200h




Button3MotionMask        =     400h
Button4MotionMask        =     800h





Button5MotionMask        =    1000h
ButtonMotionMask         =    2000h
KeymapStateMask          =    4000h


























































ExposureMask             =    8000h
VisibilityChangeMask     =   10000h
StructureNotifyMask      =   20000h
ResizeRedirectMask       =   40000h
SubstructureNotifyMask   =   80000h
SubstructureRedirectMask =  100000h
FocusChangeMask          =  200000h
PropertyChangeMask       =  400000h
ColormapChangeMask       =  800000h
OwnerGrabButtonMask      = 1000000h

AllEventsMask            = 1fbff7fh   ;1ffffffh






;Event           Names

KeyPress                =       2
KeyRelease              =       3
ButtonPress             =       4
ButtonRelease           =       5
MotionNotify            =       6
EnterNotify             =       7

>
|
>
>
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
>
>
>
>
>
|
>
>
|
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|

|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
>
|
|
|
>
>
>
>
>
|
>
>
>
>
|
>
>
>
>
>
|
|
>
|
>
>
>
>
|
|
>
>
>
>
>
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
|
|
|
|

<

|
|
>
>

|







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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280

281
282
283
284
285
286
287
288
289
290
291
292
293
294

; Predefined atoms

atomPRIMARY            = 1
atomSECONDARY          = 2
atomARC                = 3
atomATOM               = 4
atomBITMAP             = 5
atomCARDINAL           = 6
atomCOLORMAP           = 7
atomCURSOR             = 8
atomCUT_BUFFER0        = 9
atomCUT_BUFFER1        = 10
atomCUT_BUFFER2        = 11
atomCUT_BUFFER3        = 12
atomCUT_BUFFER4        = 13
atomCUT_BUFFER5        = 14
atomCUT_BUFFER6        = 15
atomCUT_BUFFER7        = 16
atomDRAWABLE           = 17
atomFONT               = 18
atomINTEGER            = 19
atomPIXMAP             = 20
atomPOINT              = 21
atomRECTANGLE          = 22
atomRESOURCE_MANAGER   = 23
atomRGB_COLOR_MAP      = 24
atomRGB_BEST_MAP       = 25
atomRGB_BLUE_MAP       = 26
atomRGB_DEFAULT_MAP    = 27
atomRGB_GRAY_MAP       = 28
atomRGB_GREEN_MAP      = 29
atomRGB_RED_MAP        = 30
atomSTRING             = 31
atomVISUALID           = 32
atomWINDOW             = 33
atomWM_COMMAND         = 34
atomWM_HINTS           = 35
atomWM_CLIENT_MACHINE  = 36
atomWM_ICON_NAME       = 37
atomWM_ICON_SIZE       = 38
atomWM_NAME            = 39
atomWM_NORMAL_HINTS    = 40
atomWM_SIZE_HINTS      = 41
atomWM_ZOOM_HINTS      = 42
atomMIN_SPACE          = 43
atomNORM_SPACE         = 44
atomMAX_SPACE          = 45
atomEND_SPACE          = 46
atomSUPERSCRIPT_X      = 47
atomSUPERSCRIPT_Y      = 48
atomSUBSCRIPT_X        = 49
atomSUBSCRIPT_Y        = 50
atomUNDERLINE_POSITION = 51
atomUNDERLINE_THICKNESS= 52
atomSTRIKEOUT_ASCENT   = 53
atomSTRIKEOUT_DESCENT  = 54
atomITALIC_ANGLE       = 55
atomX_HEIGHT           = 56
atomQUAD_WIDTH         = 57
atomWEIGHT             = 58
atomPOINT_SIZE         = 59
atomRESOLUTION         = 60
atomCOPYRIGHT          = 61
atomNOTICE             = 62
atomFONT_NAME          = 63
atomFAMILY_NAME        = 64
atomFULL_NAME          = 65
atomCAP_HEIGHT         = 66
atomWM_CLASS           = 67
atomWM_TRANSIENT_FOR   = 68

;display         classes

StaticGray      =       0
GrayScale       =       1
StaticColor     =       2
PseudoColor     =       3
TrueColor       =       4
DirectColor     =       5


; Window classes.

CopyFromParent = 0
InputOutput    = 1
InputOnly      = 2

; Image byte order

LSBFirst = 0
MSBFirst = 1

; Bitmap format bit order

LeastSignificant = 0
MostSignificant = 1

;ImageFormat             --      PutImage,       GetImage

XYBitmap = 0
XYPixmap = 1
ZPixmap  = 2

;For CreateColormap

AllocNone       =       0
AllocAll        =       1


; X major opcodes

opCreateWindow          = 1
opChangeWindowAttributes= 2
opDestroyWindow         = 4
opMapWindow             = 8
opConfigureRequest      = 12
opInternAtom            = 16
opChangeProperty        = 18
opDeleteProperty        = 19
opGetProperty           = 20
opSetSelectionOwner     = 22
opGetSelectionOwner     = 23
opConvertSelection      = 24
opSendEvent             = 25
opWarpPointer           = 41
opSetInputFocus         = 42
opOpenFont              = 45
opCloseFont             = 46
opCreatePixmap          = 53
opFreePixmap            = 54
opCreateGC              = 55
opFreeGC                = 60
opClearArea             = 61
opPutImage              = 72
opCreateColorMap        = 78
opCreateCursor          = 93
opCreateGlyphCursor     = 94
opFreeCursor            = 95
opQueryExtension        = 98
opGetKeyboardMapping    = 101

; XFIXES minor opcodes

opfixQueryVersion = 0


; SYNC minor opcodes

opCreateCounter = 2
opDestroyCounter = 6
opSetCounter     = 3

; XKB minor opcodes
opXkbUseExtension = 0
opXkbSelectEvents = 1
opXkbGetMap       = 8

; Xkb KB_DEVICESPEC values

xkbUseCoreKbd = $100
xkbUseCorePtr = $200
xkbDfltXIClass = $300
xkbDfltXIId = $400
xkbAllXIClass = $500
xkbAllXIId = $600
xkbXINone = $ff00

; Xkb map parts

mxkbKeyTypes            = 1
mxkbKeySyms             = 2
mxkbModifierMap         = 4
mxkbExplicitComponents  = 8
mxkbKeyActions          = 16
mxkbKeyBehaviors        = 32
mxkbVirtualMods         = 64
mxkbVirtualModMap       = 128

; Xkb EventType mask

mxkbNewKeyboardNotify = 1
mxkbMapNotify         = 2
mxkbStateNotify       = 4
mxkbControlsNotify    = 8
mxkbIndicatorStateNotify = 16
mxkbIndicatorMapNotify = 32
mxkbNamesNotify        = 64
mxkbCompatMapNotify    = 128
mxkbBellNotify         = 256
mxkbActionMessage      = 512
mxkbAccessXNotify      = 1024
mxkbExtensionDeviceNotify = 2048


; XKB map structure

; treatment of the out-of-range groups.
xkbWrapIntoRange = 0
xkbClampIntoRange = $40
xkbRedirectIntoRange = $80


; These values represents the standard key types, written in the xkbKeysymMapItem.ktIndex array
; separately for every key group. The group count is (.nSyms div .width)
xkbOneLevelIndex   =     0
xkbTwoLevelIndex   =     1
xkbAlphabeticIndex =     2
xkbKeypadIndex     =     3


struct xkbKeysymMapItem
  .ktIndex    rb 4      ; array[0..3] the keytype for every of up to 4 groups.
  .groupInfo  db ?      ; how to treat out-of-range groups.
  .width      db ?      ; count of the keysyms in a group.
  .nSyms      dw ?      ; count of the dword keysyms in the array
  .keysyms:
ends




; ID identifiers for xGetID if there is no pointer associated

objColorMap = 1
objCounter  = 2
objContext  = 3
objCursor   = 4
objXFont    = 5
objPixmap   = 6

objMax = 6

; bit masks for window attributes

maskBkPixmap           = $0001
maskBkPixel            = $0002
maskBorderPixmap       = $0004
maskBorderPixel        = $0008
maskBitGravity         = $0010
maskWinGravity         = $0020
maskBackingStore       = $0040
maskBackingPlains      = $0080
maskBackingPixel       = $0100
maskOverrideRedirect   = $0200
maskSaveUnder          = $0400
maskEventMask          = $0800
maskDontPropagateMask  = $1000
maskColorMap           = $2000
maskCursor             = $4000

; event masks

maskNoEvent              =       0h
maskKeyPress             =       1h
maskKeyRelease           =       2h
maskButtonPress          =       4h
maskButtonRelease        =       8h
maskEnterWindow          =      10h
maskLeaveWindow          =      20h
maskPointerMotion        =      40h
maskPointerMotionHint    =      80h
maskButton1Motion        =     100h
maskButton2Motion        =     200h
maskButton3Motion        =     400h
maskButton4Motion        =     800h
maskButton5Motion        =    1000h
maskButtonMotion         =    2000h
maskKeymapState          =    4000h
maskExposure             =    8000h
maskVisibilityChange     =   10000h
maskStructureNotify      =   20000h
maskResizeRedirect       =   40000h
maskSubstructureNotify   =   80000h
maskSubstructureRedirect =  100000h
maskFocusChange          =  200000h
maskPropertyChange       =  400000h
maskColormapChange       =  800000h
maskOwnerGrabButton      = 1000000h



;Property                modes
PropModeReplace =       0
PropModePrepend =       1
PropModeAppend  =       2

; Event codes

KeyPress                =       2
KeyRelease              =       3
ButtonPress             =       4
ButtonRelease           =       5
MotionNotify            =       6
EnterNotify             =       7
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

109
110



111
112
113


114
115
116
117
118
119
120
121
122
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
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

235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279

280
281
282
283
284
285
286
287
288
289


290
291
292
293
294
295
296
297
298
299
300
301

302
303
304
305
306

307

308
309
310
311

312

313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333

334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365


366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381

382


383




384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418

419

420
421
422

423
424

425

426
427
428
429
430
431
432
433
434
435
436
437

438
439
440
441
442
443
444
445
446
447
448
449
450
451
452

453
454
455
456
457
458
459
460
461
462

463
464
465
466
467


468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496

497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535









536
537

538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587

588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634

635
636
637
638
639







640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655

656
657
658
659
660
661

662
663
664
665
666
667
668
669
670

671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700

701
702
703
704
705
706
707
708
709
710
711
712
713
714
715

716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744

745
746
747
748
749
750
751
752
753
754
755

756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772

773
774

775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792

793
794
795
796
797
798
799
800
801
802


803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824

825
826
827
828
829

830
831
832
833
834
835
836
837
838
839

840
841
842
843
844
845
846
847
848
849
850

851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890

891
892
893
894
895
896
897
898

899
900
901
902
903

904
905
906
907
908
909
910

911
912
913





914
915


916
917
918

919


920
921


922
923
924
925
926
927
928
929
930
931

932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959


960
961
962
963
964

965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990


991
992

993


994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010

1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029

1030
1031
1032

1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045

1046
1047
1048

1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061

1062


1063
1064
1065
1066
1067
1068


1069


1070

1071
1072
1073
1074
1075
1076
1077
1078
1079
1080


1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098

1099
1100
1101

1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114

1115

1116


1117
1118
1119
1120
1121
1122
1123

1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145

1146
1147
1148



1149
1150
1151
1152
1153

1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170

1171
1172
1173

1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188

SelectionRequest        =       30
SelectionNotify         =       31
ColormapNotify          =       32
ClientMessage           =       33
MappingNotify           =       34
LASTEvent               =       35

;Key             Masks

ShiftMask       =       1h
LockMask        =       2h
ControlMask     =       4h
Mod1Mask        =       8h
Mod2Mask        =       10h
Mod3Mask        =       20h
Mod4Mask        =       40h
Mod5Mask        =       80h

;Modifier                Names

ShiftMapIndex   =       0
LockMapIndex    =       1
ControlMapIndex =       2
Mod1MapIndex    =       3

Mod2MapIndex    =       4
Mod3MapIndex    =       5



Mod4MapIndex    =       6
Mod5MapIndex    =       7



;Button          Masks

Button1Mask     =       100h
Button2Mask     =       200h
Button3Mask     =       400h
Button4Mask     =       800h
Button5Mask     =       1000h
AnyModifier     =       10000h

;Button          Names



Button1         =       1

Button2         =       2
Button3         =       3
Button4         =       4
Button5         =       5

;Notify          Modes
NotifyNormal    =       0
NotifyGrab      =       1
NotifyUngrab    =       2
NotifyWhileGrabbed      =       3
NotifyHint      =       1

;Notify          Detail

NotifyAncestor  =       0
NotifyVirtual   =       1
NotifyInferior  =       2
NotifyNonlinear =       3
NotifyNonlinearVirtual  =       4
NotifyPointer   =       5
NotifyPointerRoot       =       6
NotifyDetailNone        =       7


;Visibility              Notify



VisibilityUnobscured    =       0
VisibilityPartiallyObscured     =       1
VisibilityFullyObscured =       2



;Circulation             request

PlaceOnTop      =       0
PlaceOnBottom   =       1

;Protocol                Families

FamilyInternet  =       0
FamilyDECnet    =       1
FamilyChaos     =       2
FamilyInternet6 =       6

;Unspecific              authentication  families

FamilyServerInterpreted =       5


;Property       Notification

PropertyNewValue        =       0
PropertyDelete  =       1

;Color           Map     notification

ColormapUninstalled     =       0
ColormapInstalled       =       1

;Grab            Modes
GrabModeSync    =       0
GrabModeAsync   =       1

;Grab            reply   status
GrabSuccess     =       0
AlreadyGrabbed  =       1
GrabInvalidTime =       2
GrabNotViewable =       3
GrabFrozen      =       4

;AllowEvents             modes
AsyncPointer    =       0
SyncPointer     =       1
ReplayPointer   =       2
AsyncKeyboard   =       3
SyncKeyboard    =       4
ReplayKeyboard  =       5
AsyncBoth       =       6
SyncBoth        =       7

;InputFocus              specific

RevertToNone    =       None
RevertToPointerRoot     =       PointerRoot
RevertToParent  =       2


;Error           Codes


Success =       0
BadRequest      =       1
BadValue        =       2

BadWindow       =       3
BadPixmap       =       4
BadAtom =       5
BadCursor       =       6
BadFont =       7
BadMatch        =       8
BadDrawable     =       9
BadAccess       =       10
BadAlloc        =       11
BadColor        =       12

BadGC   =       13

BadIDChoice     =       14
BadName =       15
BadLength       =       16
BadImplementation       =       17
FirstExtensionError     =       128
LastExtensionError      =       255


;Window          Classes

InputOutput     =       1
InputOnly       =       2






;Window          Attributes
CWBackPixmap    =       1h
CWBackPixel     =       2h
CWBorderPixmap  =       4h
CWBorderPixel   =       8h
CWBitGravity    =       10h
CWWinGravity    =       20h
CWBackingStore  =       40h
CWBackingPlanes =       80h
CWBackingPixel  =       100h
CWOverrideRedirect      =       200h
CWSaveUnder     =       400h
CWEventMask     =       800h
CWDontPropagate =       1000h
CWColormap      =       2000h
CWCursor        =       4000h

;ConfigureWindow         Structure
CWX             =       1h
CWY             =       2h
CWWidth         =       4h
CWHeight        =       8h
CWBorderWidth   =       10h
CWSibling       =       20h
CWStackMode     =       40h

;Bit             Gravity
ForgetGravity           =       0
NorthWestGravity        =       1
NorthGravity            =       2
NorthEastGravity        =       3
WestGravity             =       4
CenterGravity           =       5
EastGravity             =       6
SouthWestGravity        =       7
SouthGravity            =       8
SouthEastGravity        =       9
StaticGravity           =       10

;Window          Gravity
UnmapGravity    =       0

;CreateWindow            backing-store   hint
NotUseful       =       0
WhenMapped      =       1

Always  =       2

;GetWindowAttributes             reply
IsUnmapped      =       0
IsUnviewable    =       1
IsViewable      =       2

;Used            in      ChangeSaveSet
SetModeInsert   =       0
SetModeDelete   =       1



;Used            in      ChangeCloseDownMode
DestroyAll      =       0
RetainPermanent =       1
RetainTemporary =       2

;Window          stacking        method  (in     configureWindow)
Above   =       0
Below   =       1
TopIf   =       2
BottomIf        =       3
Opposite        =       4


;Circulation             direction
RaiseLowest     =       0
LowerHighest    =       1


;Property                modes

PropModeReplace =       0
PropModePrepend =       1
PropModeAppend  =       2


;Graphics                Functions

GXclear =       0h
GXand   =       1h
GXandReverse    =       2h
GXcopy  =       3h
GXandInverted   =       4h
GXnoop  =       5h
GXxor   =       6h
GXor    =       7h
GXnor   =       8h
GXequiv =       9h
GXinvert        =       10h
GXorReverse     =       11h
GXcopyInverted  =       12h
GXorInverted    =       13h
GXnand  =       14h
GXset   =       15h

;LineStyle
LineSolid       =       0
LineOnOffDash   =       1
LineDoubleDash  =       2


;capStyle
CapNotLast      =       0
CapButt         =       1
CapRound        =       2
CapProjecting   =       3

;joinStyle
JoinMiter       =       0
JoinRound       =       1
JoinBevel       =       2

;fillStyle
FillSolid       =       0
FillTiled       =       1
FillStippled    =       2
FillOpaqueStippled      =       3

;fillRule

EvenOddRule     =       0
WindingRule     =       1

;subwindow               mode

ClipByChildren  =       0
IncludeInferiors        =       1

;SetClipRectangles               ordering

Unsorted        =       0
YSorted =       1


YXSorted        =       2
YXBanded        =       3

;CoordinateMode          for     drawing routines

CoordModeOrigin =       0
CoordModePrevious       =       1

;Polygon         shapes

Complex =       0
Nonconvex       =       1
Convex  =       2

;Arc             modes   for     PolyFillArc


ArcChord        =       0


ArcPieSlice     =       1





;GC              components

GCFunction      =       1h
GCPlaneMask     =       2h
GCForeground    =       4h
GCBackground    =       8h
GCLineWidth     =       10h
GCLineStyle     =       20h
GCCapStyle      =       40h
GCJoinStyle     =       80h
GCFillStyle     =       100h
GCFillRule      =       200h
GCTile  =       400h
GCStipple       =       800h
GCTileStipXOrigin       =       1000h
GCTileStipYOrigin       =       2000h
GCFont  =       4000h
GCSubwindowMode =       8000h
GCGraphicsExposures     =       10000h
GCClipXOrigin   =       20000h
GCClipYOrigin   =       40000h
GCClipMask      =       80000h
GCDashOffset    =       100000h
GCDashList      =       200000h
GCArcMode       =       400000h

GCLastBit       =       22

;used            in      QueryFont       --      draw    direction

FontLeftToRight =       0
FontRightToLeft =       1

FontChange      =       255



;ImageFormat             --      PutImage,       GetImage

XYBitmap        =       0

XYPixmap        =       1
ZPixmap =       2



;For             CreateColormap

AllocNone       =       0
AllocAll        =       1


;Flags           used    in      StoreNamedColor,        StoreColors

DoRed   =       1h
DoGreen =       2h
DoBlue  =       4h


;QueryBestSize           Class

CursorShape     =       0
TileShape       =       1
StippleShape    =       2

;Keyboard                pointer stuff

AutoRepeatModeOff       =       0
AutoRepeatModeOn        =       1
AutoRepeatModeDefault   =       2

LedModeOff      =       0
LedModeOn       =       1


;masks           for     ChangeKeyboardControl

KBKeyClickPercent       =       1h
KBBellPercent   =       2h
KBBellPitch     =       4h
KBBellDuration  =       8h
KBLed   =       10h
KBLedMode       =       20h
KBKey   =       40h
KBAutoRepeatMode        =       80h


MappingSuccess  =       0
MappingBusy     =       1
MappingFailed   =       2



MappingModifier =       0
MappingKeyboard =       1
MappingPointer  =       2

;Screensaver             stuff

DontPreferBlanking      =       0
PreferBlanking  =       1
DefaultBlanking =       2

DisableScreenSaver      =       0
DisableScreenInterval   =       0

DontAllowExposures      =       0
AllowExposures  =       1
DefaultExposures        =       2

;for             ForceScreenSaver

ScreenSaverReset        =       0
ScreenSaverActive       =       1

;for             ChangeHosts

HostInsert      =       0
HostDelete      =       1

;for             ChangeAccessControl


EnableAccess    =       1
DisableAccess   =       0

;display         classes

StaticGray      =       0
GrayScale       =       1
StaticColor     =       2
PseudoColor     =       3
TrueColor       =       4
DirectColor     =       5


;Byte            order           used    in      imageByteOrder  and     bitmapBitOrder

LSBFirst        =       0
MSBFirst        =       1

;Keyboard and Pointer Event Structures

struct   XButtonEvent
  .type         rd    1
  .serial       rd    1
  .send_event   rd    1
  .display      rd    1
  .window       rd    1
  .root         rd    1
  .subwindow    rd    1
  .time         rd    1
  .x            rd    1
  .y            rd    1
  .x_root       rd    1
  .y_root       rd    1
  .state        rd    1
  .button       rd    1
  .same_screen  rd    1
ends











virtual at 0
XButtonPressedEvent  XButtonEvent

end virtual

virtual at 0
XButtonReleasedEvent XButtonEvent
end virtual

struct   XKeyEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .root                           rd    1
        .subwindow                      rd    1
        .time                           rd    1
        .x                              rd    1
        .y                              rd    1
        .x_root                         rd    1
        .y_root                         rd    1
        .state                          rd    1
        .keycode                        rd    1
        .same_screen                    rd    1
ends


virtual at 0
XKeyPressedEvent   XKeyEvent
end virtual

virtual at 0
XKeyReleasedEvent  XKeyEvent
end virtual


struct   XMotionEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .root                           rd    1
        .subwindow                      rd    1
        .time                           rd    1
        .x                              rd    1
        .y                              rd    1
        .x_root                         rd    1
        .y_root                         rd    1
        .state                          rd    1
        .is_hint                        rb    1
        .same_screen                    rd    1

ends


virtual at 0
XPointerMovedEvent  XMotionEvent
end virtual

;Window Entry/Exit Events

struct   XCrossingEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .root                           rd    1
        .subwindow                      rd    1
        .time                           rd    1
        .x                              rd    1
        .y                              rd    1
        .x_root                         rd    1
        .y_root                         rd    1
        .mode                           rd    1
        .detail                         rd    1
        .same_screen                    rd    1
        .focus                          rd    1
        .state                          rd    1
ends

virtual at 0
XEnterWindowEvent  XCrossingEvent
end virtual

virtual at 0
XLeaveWindowEvent  XCrossingEvent
end virtual

;       Input           Focus   Events

struct   XFocusChangeEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .mode                           rd    1
        .detail                         rd    1

ends



virtual at 0







XFocusInEvent  XFocusChangeEvent
end virtual

virtual at 0
XFocusOutEvent  XFocusChangeEvent
end virtual

;       Keymap          Notification    Events

struct   XKeymapEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .key_vector                     rb    32

ends

;       Exposure/Update         Events

struct   XExposeEvent
        .type                           rd    1

        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .x                              rd    1
        .y                              rd    1
        .width                          rd    1
        .height                         rd    1
        .count                          rd    1

ends


struct   XGraphicsExposeEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .drawable                       rd    1
        .x                              rd    1
        .y                              rd    1
        .width                          rd    1
        .height                         rd    1
        .count                          rd    1
        .major_code                     rd    1
        .minor_code                     rd    1
ends


struct   XNoExposeEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .drawable                       rd    1
        .major_code                     rd    1
        .minor_code                     rd    1
ends



;       CirculateNotify         Events

struct   XCirculateEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1
        .window                         rd    1
        .place                          rd    1
ends


struct   XCirculateRequestEvent
        .type                           rd    1

        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .parent                         rd    1
        .window                         rd    1
        .place                          rd    1
ends

;       Configuration           Change  Events

struct   XConfigureEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1
        .window                         rd    1
        .x                              rd    1
        .y                              rd    1
        .width                          rd    1
        .height                         rd    1
        .border_width                   rd    1
        .above                          rd    1
        .override_redirect              rd    1
ends

struct   XConfigureRequestEvent
        .type                           rd    1
        .serial                         rd    1

        .send_event                     rd    1
        .display                        rd    1
        .parent                         rd    1
        .window                         rd    1
        .x                              rd    1
        .y                              rd    1
        .width                          rd    1
        .height                         rd    1
        .border_width                   rd    1
        .above                          rd    1
        .detail                         rd    1

        .value_mask                     rd    1
ends

struct   XPropertyEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .atom                           rd    1
        .time                           rd    1
        .state                          rd    1
ends

struct   XResizeEvent
        .type                           rd    1
        .serial                         rd    1

        .display                        rd    1
        .window                         rd    1

        .width                          rd    1
        .height                         rd    1
ends

struct   XColormapEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .colormap                       rd    1
        .new                            rd    1
        .state                          rd    1
ends

;       Creation/Destruction            Notifications

struct   XCreateWindowEvent

        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .parent                         rd    1
        .window                         rd    1
        .x                              rd    1
        .y                              rd    1
        .width                          rd    1
        .heigth                         rd    1


        .border_width                   rd    1
        .override_redirect              rd    1
ends


struct   XDestroyWindowEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1
        .window                         rd    1
ends

;       Parent          Movement        Events

struct   XGravityEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1

        .window                         rd    1
        .x                              rd    1
        .y                              rd    1
ends


;       Mapping         Events

struct   XMapEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1
        .window                         rd    1
        .override_redirect              rd    1

ends

struct   XMappingEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .request                        rd    1
        .first_keycode                  rd    1
        .count                          rd    1

ends


struct   XMapRequestEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .parent                         rd    1
        .window                         rd    1
ends

;       Parent          Change  Events

struct   XReparentEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .event                          rd    1
        .window                         rd    1
        .parent                         rd    1
        .x                              rd    1
        .y                              rd    1
        .override_redirect              rd    1
ends

struct   XSelectionClearEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .selection                      rd    1
        .time                           rd    1
ends

struct   XSelectionRequestEvent
        .type                           rd    1
        .serial                         rd    1

        .send_event                     rd    1
        .display                        rd    1
        .owner                          rd    1
        .requestor                      rd    1
        .selection                      rd    1
        .target                         rd    1
        .property                       rd    1
        .time                           rd    1

ends

struct   XSelectionEvent
        .type                           rd    1
        .serial                         rd    1

        .send_event                     rd    1
        .display                        rd    1
        .requestor                      rd    1
        .selection                      rd    1
        .target                         rd    1
        .property                       rd    1
        .time                           rd    1

ends

;       Hidden          Window  Events






struct   XUnmapEvent


        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1

        .display                        rd    1


        .event                          rd    1
        .window                         rd    1


        .from_configure                 rd    1
ends

struct   XVisibilityEvent
        .type                           rd    1
        .serial                         rd    1
        .send_event                     rd    1
        .display                        rd    1
        .window                         rd    1
        .state                          rd    1

ends

;       Client          Messages        (XSendEvent)

struct   XClientMessageEvent
  .type                           rd    1
  .serial                         rd    1
  .send_event                     rd    1
  .display                        rd    1
  .window                         rd    1
  .message_type                   rd    1
  .format                         rd    1
  .data                           rb    20
ends


struct   XErrorEvent
        .type                           rd    1
        .serial                         rd    1
        .error_code                     rd    1
        .request_code                   rd    1
        .minor_code                     rd    1
        .resourceid                     rd    1
ends



struct XAnyEvent


  .type         rd    1
  .serial       rd    1
  .send_event   rd    1
  .display      rd    1
  .window       rd    1

ends


struct XEvent
  .xany XAnyEvent
  .pad  rb 24*4 - sizeof.XAnyEvent

  virtual at .xany
  . XAnyEvent
  end virtual


  virtual at .xany
  .xkey XKeyEvent
  end virtual

  virtual at .xany
  .xbutton XButtonEvent
  end virtual

  virtual at .xany
  .xmotion XMotionEvent
  end virtual

  virtual at .xany
  .xcrossing XCrossingEvent


  end virtual


  virtual at .xany


  .xfocus XFocusChangeEvent
  end virtual

  virtual at .xany
  .xexpose XExposeEvent
  end virtual

  virtual at .xany
  .xgraphicsexpose XGraphicsExposeEvent
  end virtual

  virtual at .xany
  .xnoexpose XNoExposeEvent
  end virtual

  virtual at .xany
  .xvisibility XVisibilityEvent

  end virtual

  virtual at .xany
  .xcreatewindow XCreateWindowEvent
  end virtual

  virtual at .xany
  .xdestroywindow XDestroyWindowEvent
  end virtual

  virtual at .xany
  .xunmap XUnmapEvent
  end virtual

  virtual at .xany
  .xmap XMapEvent
  end virtual

  virtual at .xany

  .xmaprequest XMapRequestEvent
  end virtual


  virtual at .xany
  .xreparent XReparentEvent
  end virtual

  virtual at .xany
  .xconfigure XConfigureEvent
  end virtual

  virtual at .xany
  .xgravity XGravityEvent
  end virtual

  virtual at .xany

  .xresizerequest XResizeEvent
  end virtual


  virtual at .xany
  .xconfigurerequest XConfigureRequestEvent
  end virtual

  virtual at .xany
  .xcirculate XCirculateEvent
  end virtual

  virtual at .xany
  .xcirculaterequest XCirculateRequestEvent
  end virtual

  virtual at .xany

  .xproperty XPropertyEvent


  end virtual

  virtual at .xany
  .xselectionclear XSelectionClearEvent
  end virtual



  virtual at .xany


  .xselectionrequest XSelectionRequestEvent

  end virtual

  virtual at .xany
  .xselection XSelectionEvent
  end virtual

  virtual at .xany
  .xcolormap XColormapEvent
  end virtual



  virtual at .xany
  .xclient XClientMessageEvent
  end virtual

  virtual at .xany
  .xmapping XMappingEvent
  end virtual

  virtual at .xany
  .xerror XErrorEvent
  end virtual

  virtual at .xany
  .xkeymap XKeymapEvent
  end virtual
ends



;       Misc.           Structures

struct   XKeyboardControl

        .key_click_percent              rd    1
        .bell_percent                   rd    1
        .bell_pitch                     rd    1
        .bell_duration                  rd    1
        .led                            rd    1
        .led_mode                       rd    1
        .key                            rd    1
        .auto_repeat_mode               rd    1
ends



struct   XModifierKeymap

        .max_keypermod                  rd    1

        .modifiermap                    rd    1


ends




struct XWindowAttributes
  .x                     dd  ?     ; location of window

  .y                     dd  ?     ;
  .width                 dd  ?     ; width and height of window
  .height                dd  ?     ;
  .border_width          dd  ?     ; border width of window
  .depth                 dd  ?     ; depth of window
  .pVisual               dd  ?     ; the associated visual structure
  .root                  dd  ?     ; root of screen containing window
  .class                 dd  ?     ; InputOutput, InputOnly
  .bit_gravity           dd  ?     ; one of the bit gravity values
  .win_gravity           dd  ?     ; one of the window gravity values
  .backing_store         dd  ?     ; NotUseful, WhenMapped, Always
  .backing_planes        dd  ?     ; planes to be preserved if possible
  .backing_pixel         dd  ?     ; value to be used when restoring planes
  .save_under            dd  ?     ; boolean, should bits under be saved?
  .colormap              dd  ?     ; color map to be associated with window
  .map_installed         dd  ?     ; boolean, is color map currently installed
  .map_state             dd  ?     ; IsUnmapped, IsUnviewable, IsViewable
  .all_event_masks       dd  ?    ; set of events all people have interest in
  .your_event_mask       dd  ?          ; my event mask
  .do_not_propagate_mask dd  ?    ; set of events that should not propagate
  .override_redirect     dd  ?    ; boolean value for override-redirect
  .pScreen               dd  ?  ; back pointer to correct screen

ends






struct XCharStruct
  .lbearing   dw ?       ; origin to left edge of raster
  .rbearing   dw ?       ; origin to right edge of raster
  .width      dw ?       ; advance to next char's origin

  .ascent     dw ?       ; baseline to top edge of raster
  .descent    dw ?       ; baseline to bottom edge of raster
  .attributes dw ?       ; per char flags (not predefined)
ends


struct XFontStruct
  .ext_data          dd   ?       ; hook for extension to hang data
  .fid               dd   ?       ; Font id for this font
  .direction         dd   ?       ; hint about the direction font is painted
  .min_char_or_byte2 dd   ?       ; first character
  .max_char_or_byte2 dd   ?       ; last character
  .min_byte1         dd   ?       ; first row that exists
  .max_byte1         dd   ?       ; last row that exists
  .all_chars_exist   dd   ?       ; flag if all characters have nonzero size
  .default_char      dd   ?       ; char to print for undefined character
  .n_properties      dd   ?       ; how many properties there are

  .properties        dd   ?       ; pointer to array of additional properties
  .min_bounds        XCharStruct  ; minimum bounds over all existing char
  .max_bounds        XCharStruct  ; maximum bounds over all existing char

  .per_char          dd   ?       ; first_char to last_char information
  .ascent            dd   ?       ; logical extent above baseline for spacing
  .descent           dd   ?       ; logical decent below baseline for spacing
ends


struct XWindowChanges
  .x            dd ?
  .y            dd ?
  .width        dd ?
  .height       dd ?
  .border_width dd ?
  .sibling      dd ?
  .stack_mode   dd ?
ends








|

<
<
<
<
<
<
<
<

<

<
<
|
|
>
|
|
>
>
>
|
<

>
>
|

|
|
<
<
<
<

|
>

>
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|

|
<
<
<
<
<
<
<
>

<

>
>
|
<
<
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|

<

>
|
|
|
|
|
|

<
<
|
|
|
<
|
<
|
|
|
|
<
|
|
<
|
<
<
<
<
<
<

<

<
<
<

>
|
>
>
|
|
|
>
|
|
|
|
|
|
|
<
|
|
>
|
>
|
|
|
|
|
<

>
|
|
|
|
>
>
>
>

>
|
|
|
|
<
<
<
<
<
<
<
|
<
<
<
<

|
|
|
|
<
<
<
<
|
|
<
<
|
|
|
|
|
<
<
<
<

<
<

|
|
|
>
|
|
|
|
|
|
|
|
|
|
>
>

|
|
<
<
|
|
|
|
|
<
<
>

<
<
<

>
|
>
|
|
|

>
|
>
|
|
|
|
|
|
|
|
|
|
<
<
<
<
|
|
|
<
|
|
|
>

<
<
<
<
<

|
|
|
<
|
<
|
|
|
|
|
|

<
<
|
|
|
|
<
|
|
|
|
|
>
>
<
<

<
|
|
|
|
<
|
|
<
|

<

>
|
>
>
|
>
>
>
>

<

|
|
|
|
|
|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

<
|
<
|
|
|
|
<
>

>
|
|
|
>
|
|
>

>
|
|
|
|
|
|
<
|
<
<
<

>
|
|
|
|
|
|
<

<
<
<

<
<

>
|
|
|
|
|
|
|
|
|
|
>

<
<
<

>
>
|
|
|
|
|
|
|
|
|
|
|
<
|
<
|
|
|
|
|
|
<
|
|
|
<
<
|
<

>
|
|
|
|
|
<
|
<
<
<
<
|
|
<
|
|
|
|
<
|
<
|
|
<
<
|
|
<
|
|
|
|
|
|
|
<


|
>
>
>
>
>
>
>
>
>
|
|
>
|

|
|
<

|
|
|
|
|
|
|
|
|
|
|
<
<
<
<
<
<
|
|
<
<
|
|
<
<
|
<

|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
<
>



|
<
<
|
<
|
|
|
<
<
|
|
<
|
|
|
|
|
|
|
<
<
<
<


<
<
<
|
<
<
<
|
<
|
<
|
|
<
<
|
<
<
>


|
|
|
>
>
>
>
>
>
>
<
<

<
<
<
|
|
|
<
|
|
<
<
<
<
>


|

|
|
>
|
|
|
<
<
<
<
<
<
>


<
|
|
|
|
|
|
|
|
|
|
|
|
|



|
|
|
|
|
|
|
|


|
>
|
|
|
|
<
|
<
<
<
<
<


|
|
>
|
|
|
|
|
<
|
|
|
|
|
<
<
<
<
<
<
|
|
<
<
<
<
<


|
|
|
>
|
|
|
<
|
|
|
|
|
|
|
>
|


|
|
<
|
|
|
<
<
<


|
|
|
>
|
|
>
|
|


|
|
|
|
|
|
|
|
|
|

<

|
>
|
|
|
|
|
|
|
|
|
|
>
>
|
<
|
|
<
<
<
<
<
<
<
<
<

<
<
|
<
<
<
|
<
>
|
|
|


>
|
|
<
|
|
|
|
|
<
|
>

<
<
<
<
|
|
|
<
|
|
>



|
|
|
|
|
|
|
<

|

|
|
|
|
|
|
|
|
|
<
<
<
|
<
|
|
|
|
|
<
<


|
<
<
>
|
|
<
<
<
|
<
<
>


|
<
<
>
|
|
<
|
<
<
<
>


<
>
>
>
>
>

|
>
>
|
|
|
>
|
>
>
|
|
>
>
|


|
<
<
<
<
<
<
>


<
|
|
<
|
|
<
|
|
<
|


<
|
|
<
<
<
<
<


|
|
|
>
>
|
|
|
|
|
>



|
|
|
|
<
<
|
|
|
<
<
|
<
<
<
<

<
<
<

|
|
>
>
|
|
>
|
>
>
|
|
|
|
<
|

<
<
<

|
|
|
|
<
<
>
|
|
|
<
|

<
<
<

|
|
|
|
<
<
<
|
<
>
|
|
|
>
|
<
|

<
<
<

|
|
|
|
<
>
|
|
|
>
|
<
|

<
<
<

|
|
|
|
<
>
|
>
>
|

<
<
<

>
>
|
>
>
|
>
|

<
<
<

|
|
|
|
>
>
|
|
|
<
<
<
<

<
<
<

|
|
<
<
|
|
>
|
|
<
>
|
|
|
|
|
|
|
|
<
|
|
|
|
>
|
>
|
>
>

<
<


|
|
>
|
<
|
|
|
|
|
|
|
|
|
<
<
<
<
<
<
<
|
<
|
|
>



>
>
>

|
|
|
<
>
<
<
<
<


|
|
|
<
|
<
|
|
<
|
|
>
|
|
|
>
|
|
|


<
|
|
|
|
|
<
<
<

>
317
318
319
320
321
322
323
324
325








326

327


328
329
330
331
332
333
334
335
336

337
338
339
340
341
342
343




344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365







366
367

368
369
370
371


372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388

389
390
391
392
393
394
395
396
397


398
399
400

401

402
403
404
405

406
407

408






409

410



411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426

427
428
429
430
431
432
433
434
435
436

437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452







453




454
455
456
457
458




459
460


461
462
463
464
465




466


467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486


487
488
489
490
491


492
493



494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514




515
516
517

518
519
520
521
522





523
524
525
526

527

528
529
530
531
532
533
534


535
536
537
538

539
540
541
542
543
544
545


546

547
548
549
550

551
552

553
554

555
556
557
558
559
560
561
562
563
564
565

566
567
568
569
570
571
572
573
574















575

576

577
578
579
580

581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598

599



600
601
602
603
604
605
606
607

608



609


610
611
612
613
614
615
616
617
618
619
620
621
622
623



624
625
626
627
628
629
630
631
632
633
634
635
636
637

638

639
640
641
642
643
644

645
646
647


648

649
650
651
652
653
654
655

656




657
658

659
660
661
662

663

664
665


666
667

668
669
670
671
672
673
674

675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693

694
695
696
697
698
699
700
701
702
703
704
705






706
707


708
709


710

711
712
713
714
715
716
717
718
719
720
721
722
723
724

725

726
727
728
729
730


731

732
733
734


735
736

737
738
739
740
741
742
743




744
745



746



747

748

749
750


751


752
753
754
755
756
757
758
759
760
761
762
763
764


765



766
767
768

769
770




771
772
773
774
775
776
777
778
779
780
781






782
783
784

785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816

817





818
819
820
821
822
823
824
825
826
827

828
829
830
831
832






833
834





835
836
837
838
839
840
841
842
843

844
845
846
847
848
849
850
851
852
853
854
855
856

857
858
859



860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883

884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899

900
901









902


903



904

905
906
907
908
909
910
911
912
913

914
915
916
917
918

919
920
921




922
923
924

925
926
927
928
929
930
931
932
933
934
935
936
937

938
939
940
941
942
943
944
945
946
947
948
949



950

951
952
953
954
955


956
957
958


959
960
961



962


963
964
965
966


967
968
969

970



971
972
973

974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997






998
999
1000

1001
1002

1003
1004

1005
1006

1007
1008
1009

1010
1011





1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031


1032
1033
1034


1035




1036



1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051

1052
1053



1054
1055
1056
1057
1058


1059
1060
1061
1062

1063
1064



1065
1066
1067
1068
1069



1070

1071
1072
1073
1074
1075
1076

1077
1078



1079
1080
1081
1082
1083

1084
1085
1086
1087
1088
1089

1090
1091



1092
1093
1094
1095
1096

1097
1098
1099
1100
1101
1102



1103
1104
1105
1106
1107
1108
1109
1110
1111
1112



1113
1114
1115
1116
1117
1118
1119
1120
1121
1122




1123



1124
1125
1126


1127
1128
1129
1130
1131

1132
1133
1134
1135
1136
1137
1138
1139
1140

1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151


1152
1153
1154
1155
1156
1157

1158
1159
1160
1161
1162
1163
1164
1165
1166







1167

1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180

1181




1182
1183
1184
1185
1186

1187

1188
1189

1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201

1202
1203
1204
1205
1206



1207
1208
SelectionRequest        =       30
SelectionNotify         =       31
ColormapNotify          =       32
ClientMessage           =       33
MappingNotify           =       34
LASTEvent               =       35
















struct __xBeginReq
  .byte_order     db ?
                  db ?
  .ver_major      dw ?
  .ver_minor      dw ?
  .auth_proto_len dw ?
  .auth_data_len  dw ?
                  dw ?
ends


struct __xConnectServerInfo
  .resp                 db ?           ; 1 == Success.
  .not_used1            db ?

  .major_ver            dw ?
  .minor_ver            dw ?





  .data_length          dw ?           ; additional data length in dword units.
ends

struct __xConnectAdditionalInfo
  .release_num          dd ?
  .res_id_base          dd ?
  .res_id_mask          dd ?
  .motion_buffer_size   dd ?
  .len_vendor           dw ?
  .max_request_len      dw ?
  .screen_num           db ?
  .format_num           db ?
  .img_byte_order       db ?
  .bmp_format_bit_order db ?
  .bmp_scanline_unit    db ?
  .bmp_scanline_pad     db ?
  .min_keycode          db ?
  .max_keycode          db ?
  .not_used2            dd ?

  .stream_data:







ends



struct __xscreen
  .root_window dd ?
  .colormap    dd ?


  .white_pixel dd ?
  .black_pixel dd ?
  .event_mask  dd ?
  .width_px    dw ?
  .height_px   dw ?
  .width_mm    dw ?
  .height_mm   dw ?
  .min_maps    dw ?
  .max_maps    dw ?
  .root_visual dd ?
  .back_store  db ?
  .save_under  db ?
  .root_depth  db ?
  .num_depths  db ?
  .depths:
ends



struct __xdepth
  .depth        db ?
                db ?
  .num_visual   dw ?
                dd ?
  .visual_types:
ends



struct __xvisualtype
  .id           dd ?
  .class        db ?

  .bits_per_rgb db ?

  .map_entries  dw ?
  .red_mask     dd ?
  .green_mask   dd ?
  .blue_mask    dd ?

                dd ?
ends















struct __xCreateColorMapReq
  .op           db  ?           ; must be 78 = opCreateColorMap
  .alloc        db  ?           ; AllocNone = 0, AllocAll = 1
  .length       dw  ?           ; must be 4
  .map_id       dd  ?           ; map id
  .win_id       dd  ?           ; window id
  .vis_id       dd  ?           ; visual id
ends

struct __xCreatePixmapReq
  .op           db  ?           ; opCreatePixmap == 53
  .depth        db  ?           ;
  .length       dw  ?           ; == 4
  .pid          dd  ?           ; Pixmap ID
  .drawable     dd  ?           ;

  .width        dw  ?
  .height       dw  ?
ends

struct __xFreePixmapReq
  .op           db  ?           ; opFreePixmap == 54
                db  ?
  .length       dw  ?           ; == 2
  .pid          dd  ?           ; Pixmap ID
ends


struct __xCreateContextReq
  .op           db  ?           ; opCreateGC == 55
                db  ?
  .length       dw  ?           ; 4 + n
  .gcID         dd  ?           ;
  .drawable     dd  ?           ; ?
  .value_mask   dd  ?           ; can be 0?
  label .data dword
ends

struct __xFreeContextReq
  .op           db  ?           ; op
                db  ?
  .length       dw  ?           ; = 2
  .gcID         dd  ?







ends





struct __xClearAreaReq
  .op           db  ?           ; opClearArea == 61
  .exposures    db  ?           ;
  .length       dw  ?           ; == 4




  .window       dd  ?
  .x            dw  ?


  .y            dw  ?
  .width        dw  ?
  .height       dw  ?
ends









struct __xCreateWindowReq
  .op         db ?     ;opCreateWindow
  .depth      db ?     ; 32
  .length     dw ?     ; 8 + N ; length in dword
  .wid        dd ?     ; window ID
  .parent     dd ?     ; parent window ID
  .x          dw ?
  .y          dw ?
  .w          dw ?
  .h          dw ?
  .border     dw ?     ; 0 usually
  .class      dw ?     ; 1 = InputOutput
  .visid      dd ?     ; visual ID
  .attr_mask  dd ?
  .values:
ends

struct __xChangeWindowAttributesReq
  .op           db  ?           ; opChangeWindowAttributes


                db  ?
  .length       dw  ?
  .window       dd  ?
  .mask         dd  ?           ; maskXXXX as in CreateWindow
  label .values dword


ends





struct __xDestroyWindowReq
  .op         db ?      ; opDestroyWindow
              db ?
  .length     dw ?      ; == 2
  .wid        dd ?
ends

struct __xMapWindowReq
  .op         db ?     ; opMapWindow
              db ?
  .length     dw ?      ; == 2
  .wid        dd ?      ; window ID
ends


struct __xChangePropertyReq
  .op         db ?      ; opChangeProperty
  .mode       db ?      ; PropModeXXXXX
  .length     dw ?      ; length in dword
  .wid        dd ?      ; window ID




  .prop       dd ?      ; atom
  .type       dd ?      ; atom
  .format     db ?      ; 8, 16, 32

              rb 3      ;
  .datalen    dd ?      ; In format units
  .data:
ends







struct __xGetPropertyReq
  .op         db ?      ; opGetProperty == 20
  .delete     db ?      ; BOOL

  .length     dw ?      ; 6

  .window     dd ?
  .property   dd ?      ; ATOM
  .type       dd ?      ; ATOM 0 == AnyPropertyType
  .data_ofs   dd ?      ;
  .data_len   dd ?      ;
ends



struct __xGetPropertyRep
  .reply      db ?      ; == 1
  .format     db ?      ; 0, 8, 16, 32
  .seq        dw ?

  .length     dd ?      ; (n+p)/4
  .type       dd ?      ; ATOM 0 == None
  .bytesafter dd ?
  .datalen    dd ?      ; in format units!
              rb 12
  .data:
ends




cwmX = $01
cwmY = $02
cwmWidth = $04
cwmHeight = $08

cwmBorderWidth = $10
cwmSibling = $20

cwmStackMode = $40



struct __xConfigureWindowReq
  .op         db ?      ; opConfigureRequest
              db ?
  .length     dw ?      ; 3 + n depending of the set bits in the value_mask
  .window     dd ?
  .value_mask dw ?      ; 1=x, 2=y,
              dw ?
  .params:
ends



struct __xCreateCounterReq
  .op         db ?      ; Sync extension major opcode
  .minor      db ?      ; = opCreateCounter = 2
  .length     dw ?      ; = 4
  .counterID  dd ?      ; ID
  .valueHi    dd ?
  .valueLo    dd ?
ends

















struct __xDestroyCounterReq

  .op         db ?      ; Sync extension major opcode
  .minor      db ?      ; = opDestroyCounter = 6
  .length     dw ?      ; = 2
  .counterID  dd ?      ; ID

ends

struct __xSetCounterReq
  .op         db ?      ; Sync extension major opcode
  .minor      db ?      ; = opSetCounter = 3
  .length     dw ?      ; = 4
  .counterID  dd ?      ; ID
  .valueHi    dd ?
  .valueLo    dd ?
ends

struct __xGetKeyboardMappingReq
  .op         db ?      ; opGetKeyboardMapping
              db ?
  .length     dw ?      ; = 2 in dword
  .first      db ?
  .count      db ?
              rb 2

ends




struct __xGetKeyboardMappingRep
  .op         db ?      ; = 1 Replay
  .row_len    db ?      ; keysyms per keycode
  .seq        dw ?      ;
  .length     dd ?      ; in dwords
              rb 24
ends









struct __xXkbSelectEventsReq
  .op           db ?
  .minor        db ?            ; = opXkbSelectEvents
  .length       dw ?            ; 4 + (V+p)/4
  .deviceSpec   dw ?
  .affectWhich  dw ?
  .clear        dw ?
  .selectAll    dw ?
  .affectMap    dw ?
  .map          dw ?
  .details:                     ; V bytes and p pad
ends





struct __xXkbGetMapReq
  .op                   db ?
  .minor                db ?
  .length               dw ?      ; == 7
  .deviceSpec           dw ?
  .full                 dw ?      ; what full maps to be returned.
  .partial              dw ?      ; what partial maps to be returned.
  .firstType            db ?
  .nTypes               db ?
  .firstKeySym          db ?
  .nKeySyms             db ?
  .firstKeyAction       db ?
  .nKeyActions          db ?

  .firstKeyBehavior     db ?

  .nKeyBehaviors        db ?
  .virtualMods          dw ?
  .firstKeyExplicit     db ?
  .nKeyExplicit         db ?
  .firstModMapKey       db ?
  .nModMapKeys          db ?

  .firstVModMapKey      db ?
  .nVModMapKeys         db ?
                        rb 2


ends


struct __xXkbGetMapRep
  .op                   db ?    ; = 1 Reply
  .deviceID             db ?
  .seq                  dw ?
  .length               dd ?    ; in dwords
                        rb 2

  .minKeyCode           db ?




  .maxKeyCode           db ?
  .present              dw ?

  .firstType            db ?
  .nTypes               db ?
  .totalTypes           db ?
  .firstKeySym          db ?

  .totalSyms            dw ?

  .nKeySyms             db ?
  .firstKeyAction       db ?


  .totalActions         dw ?
  .nKeyActions          db ?

  .firstKeyBehavior     db ?
  .nKeyBehaviors        db ?
  .totalKeyBehaviors    db ?
  .firstKeyExplicit     db ?
  .nKeyExplicit         db ?
  .totalKeyExplicit     db ?
  .firstModMapKey       db ?

ends

; this is the header of the remaining part of the reply,
; transmitted with the [__xXkbGetMapRep.length] long extra
; part of the reply.
struct __xXkbGetMapRep2
  .nModMapKeys          db ?
  .totalModMapKeys      db ?
  .firstVModMapKey      db ?
  .nVModMapKeys         db ?
  .totalVModMapKeys     db ?
                        rb 1
  .virtualMods          dw ?

  .map:
ends





struct __xPutImageReq
  .op        db ?       ; = opPutImage
  .format    db ?       ; 0 bitmap, 1 XYpixmap, 2 Zpixmap
  .length    dw ?       ; 0 == BIG_REQUEST
  .long_len  dd ?       ; BIG REQUEST Length
  .drawable  dd ?       ; where to draw the image
  .gc        dd ?
  .width     dw ?
  .height    dw ?
  .dst_x     dw ?
  .dst_y     dw ?






  .left_pad  db ?
  .depth     db ?


             rb 2
  label .data dword


ends



struct __xPutImageShortReq
  .op        db ?       ; = opPutImage
  .format    db ?       ; 0 bitmap, 1 XYpixmap, 2 Zpixmap
  .length    dw ?       ; 6 + datalen
  .drawable  dd ?       ; where to draw the image
  .gc        dd ?
  .width     dw ?
  .height    dw ?
  .dst_x     dw ?
  .dst_y     dw ?
  .left_pad  db ?
  .depth     db ?

             rb 2

  label .data dword
ends


struct __xSetSelectionOwnerReq


  .op        db ?       ; opSetSelectionOwner == 22

             db ?
  .length    dw ?       ; == 4
  .owner     dd ?       ; 0 == None


  .selection dd ?       ; ATOM
  .time      dd ?       ; 0 == CurrentTime (server time)

ends

struct __xGetSelectionOwnerReq
  .op        db ?       ; opGetSelectionOwner == 23
             db ?
  .length    dw ?       ; ==2
  .selection dd ?       ; ATOM




ends




struct __xGetSelectionOwnerRep



  .reply     db ?       ; == 1

             db ?

  .seq       dw ?
  .length    dd ?       ; == 0


  .owner     dd ?       ; Window ID, 0 == None


             rb 20
ends

struct __xConvertSelectionReq
  .op        db ?       ; opConvertSelection == 24
             db ?
  .length    dw ?       ; 6
  .requestor dd ?       ; Window, requestor
  .selection dd ?       ; ATOM, usually "Clipboard"
  .target    dd ?       ; ATOM, requested data type. For example "UTF8_STRING"
  .property  dd ?       ; ATOM, where to put the data. 0 == None
  .time      dd ?       ; timestamp. 0 == current server time.
ends






struct __xSetInputFocus
  .op         db ?        ; opSetInputFocus
  .revert_to  db ?        ; 0 - None, 1 - PointerRoot, 2 - Parent

  .length     dw ?        ; == 3
  .wid        dd ?        ; Window ID; 0 - None, 1 - PointerRoot




  .timestamp  dd ?        ; timestamp; 0 = CurrentTime
ends



struct __xSendEventReq
  .op         db ?
  .propagate  db ?
  .length     dw ?       ; == 11
  .dest       dd ?       ; window ID
  .event_mask dd ?       ; ?






  .event:
ends



struct __xWarpPointerReq
  .op        db ?
             db ?
  .length    dw ?     ; == 6
  .srcWin    dd ?     ; 0 == none
  .dstWin    dd ?     ; 0 == none
  .srcX      dw ?
  .srcY      dw ?
  .srcW      dw ?
  .srcH      dw ?
  .dstX      dw ?
  .dstY      dw ?
ends


struct __xOpenFontReq
  .op       db ?      ; == opOpenFont == 45
            db ?
  .length   dw ?      ; 3 + namelen/4 + pad
  .fontid   dd ?      ; client allocates it.
  .namelen  dw ?
            dw ?
  label .name byte
ends

; notice, that __xCloseFontReq is the same as __xOpenFontReq in the first 2 dwords.
struct __xCloseFontReq
  .op       db ?      ; == opCloseFont == 46
            db ?
  .length   dw ?      ; 2
  .fontid   dd ?

ends







struct __xCreateCursorReq
  .op        db ?      ; == opCreateCursor == 93
             db ?
  .length    dw ?      ; 8
  .cursorid  dd ?
  .source    dd ?      ; pixmap
  .mask      dd ?      ; 0 == none
  .fg_red    dw ?

  .fg_green  dw ?
  .fg_blue   dw ?
  .bg_red    dw ?
  .bg_green  dw ?
  .bg_blue   dw ?






  .x         dw ?
  .y         dw ?





ends


struct __xCreateGlyphCursorReq
  .op        db ?      ; == opCreateGlyphCursor == 94
             db ?
  .length    dw ?      ; 8
  .cursorid  dd ?
  .src_font  dd ?

  .mask_font dd ?
  .src_char  dw ?
  .mask_char dw ?
  .fg_red    dw ?
  .fg_green  dw ?
  .fg_blue   dw ?
  .bg_red    dw ?
  .bg_green  dw ?
  .bg_blue   dw ?
ends

struct __xFreeCursorReq
  .op        db ?      ; == opFreeCursor == 95

             db ?
  .length    dw ?      ; 2
  .cursor    dd ?



ends


; Structure for _MOTIF_WM_HINTS type of window property.

struct __MwmHints
  .flags        dd ?
  .functions    dd ?
  .decorations  dd ?
  .input_mode   dd ?
  .status       dd ?
ends

MWM_HINTS_FUNCTIONS = 1
MWM_HINTS_DECORATIONS = 2

MWM_FUNC_ALL      = $01
MWM_FUNC_RESIZE   = $02
MWM_FUNC_MOVE     = $04
MWM_FUNC_MINIMIZE = $08
MWM_FUNC_MAXIMIZE = $10
MWM_FUNC_CLOSE    = $20




struc xQueryExtension name {
.@here = 1
if used .
label . byte
local ..n, ..p
  .op        db opQueryExtension       ; opQueryExtension
             db 0
  .req_len   dw 2 + ..p
  .name_len  dw ..n       ; N in chars
             dw ?
  .name      db name
  ..n = $ - .name
             rb ((..n + 3) and $fffffffc) - ..n
  ..p = ($ - .name)/4
  .length = $ - .op

end if
}












struct xReply



  .reply    db  ?       ; 1 = Success, 0 = Error

            db  ?
  .sequence dw  ?
  .length   dd  ?
  .data     rb  24
ends

struct xRespQueryExt
  .reply        db  ?       ; 1 = Success, 0 = Error, 2 =
                db  ?

  .sequence     dw  ?
  .length       dd  ?
  .present      db  ?       ; bool.
  .OpCode       db  ?
  .first_event  db  ?

  .first_error  db  ?
                rb  20
ends





struct xExtension
  .Active       dd  ?   ; boolean

  .OpCode       dd  ?   ; Major OpCode
  .FirstEvent   dd  ?   ; First event number
  .FirstError   dd  ?   ; First error number
ends











; X events structures

struct evKeyPress
  .event    db ?           ; = 2, 3, 4, 5 or 6
  .detail   db ?
  .seq      dw ?
  .time     dd ?
  .root     dd ?         ; the root window.
  .window   dd ?         ; the event window ID
  .child    dd ?         ; ???
  .root_x   dw ?         ;



  .root_y   dw ?         ;

  .x        dw ?
  .y        dw ?
  .state    dw ?         ; bitmask
  .same_scr db ?
            db ?


ends

struct evKeyRelease


  . evKeyPress
ends




struct  evButtonPress


  . evKeyPress
ends

struct evButtonRelease


 . evKeyPress
ends


struct evMotionNotify



  . evKeyPress
ends


enAncestor = 0
enVirtual  = 1
enInferior = 2
enNonlinear = 3
enNonlinearVirtual = 4

struct evEnterNotify
  .event    db ?           ; = 7 or 8
  .detail   db ?           ; enAncestor .. enNonlinearVirtual
  .seq      dw ?
  .time     dd ?
  .root     dd ?         ; the root window.
  .window   dd ?         ; the event window ID
  .child    dd ?         ; ???
  .root_x   dw ?         ;
  .root_y   dw ?         ;
  .x        dw ?
  .y        dw ?
  .state    dw ?         ; bitmask
  .mode     db ?         ; Normal, Grab, Ungrab
  .same_scr db ?         ; ?
ends

struct evLeaveNotify






  . evEnterNotify
ends


struct evFocusIn
  .event    db ?

  .detail   db ?
  .seq      dw ?

  .window   dd ?
  .mode     db ?

            rb 23
ends


struct evFocusOut
  . evFocusIn





ends

struct evExpose
  .event    db ?
            db ?
  .seq      dw ?
  .window   dd ?
  .x        dw ?
  .y        dw ?
  .width    dw ?
  .height   dw ?
  .count    dw ?
            rb 14
ends


struct evDestroyNotify
  .event   db ?
           db ?
  .seq     dw ?


  .window  dd ?
  .dst_win dd ?
           rb 20


ends









struct evConfigureNotify
  .event    db ?        ; == 22
            db ?
  .seq      dw ?
  .window   dd ?
  .conf_win dd ?
  .above    dd ?
  .x        dw ?
  .y        dw ?
  .width    dw ?
  .height   dw ?
  .border   dw ?
  .ovr_red  db ?
            rb 5

ends





struct evSelectionClear
  .event    db ?        ; == 29
            db ?
  .seq      dw ?


  .time     dd ?        ; TIMESTAMP
  .owner    dd ?        ; WINDOW
  .selection dd ?       ; ATOM
            rb 16

ends





struct evSelectionRequest
  .event    db ?        ; == 30
            db ?
  .seq      dw ?



  .time     dd ?        ; TIMESTAMP  0 == CurrentTime

  .owner    dd ?        ; WINDOW
  .requestor dd ?       ; WINDOW
  .selection dd ?       ; ATOM
  .target    dd ?       ; ATOM (the type of the data)
  .property  dd ?       ; ATOM (where to place the data) 0 == None
             dd ?

ends





struct evSelectionNotify
  .event    db ?        ; == 31
            db ?
  .seq      dw ?

  .time     dd ?        ; TIMESTAMP  0 == CurrentTime
  .requestor dd ?       ; WINDOW
  .selection dd ?       ; ATOM
  .target    dd ?       ; ATOM (the type of the data)
  .property  dd ?       ; ATOM (where to place the data) 0 == None
             rd 2

ends





struct evPropertyChanged
  .event     db ?       ; PropertyNotify  = 28
             db ?
  .seq       dw ?

  .window    dd ?
  .property  dd ?       ; atom of the property changed.
  .timestamp dd ?
  .state     db ?       ; 0 == NewValue, 1 == Deleted
ends





struct evClientMessage
  .event   db ?         ; == 33
  .format  db ?
  .seq     dw ?
  .window  dd ?
  .type    dd ?         ; ATOM
  .data    rd 5
ends





struct evMappingNotify
  .event   db ?         ; == 34
           db ?
  .seq     dw ?
  .request db ? ; Modifier, Keyboard, Pointer
  .keycode db ?
  .count   db ?
           rb 25
ends









struct evXkbMapNotify
  .event                db ?


  .detail               db ?         ; == 1
  .seq                  dw ?
  .time                 dd ?         ; timestamp.
  .deviceID             db ?
  .btnAction            db ?         ; mask of BUTMASK

  .changed              dw ?         ; set of KB_MAPPART - what is changed
  .minkeycode           db ?
  .maxkeycode           db ?
  .firstType            db ?
  .nTypes               db ?
  .firstKeySym          db ?
  .nKeySyms             db ?
  .firstKeyAct          db ?
  .nKeyActs             db ?

  .firstKeyBehavior     db ?
  .nKeyBehavior         db ?
  .firstKeyExplicit     db ?
  .nKeyExplicit         db ?
  .firstModMapKey       db ?
  .nModMapKeys          db ?
  .firstVModMapKey       db ?
  .nVModMapKeys          db ?
  .virtualMods          dw ?         ; set of KB_VMOD
                        dw ?
ends




; Common X structures.

struct xRequest
  .op          db ?          ; X operation code (major part)

  .minor       db ?          ; minor X operation code.
  .length      dw ?          ; length of the request in dword units.

  label .data dword
ends

struct xBigRequest
  .op          db ?          ; X operation code (major part)
  .minor       db ?          ; minor X operation code.







  .length      dw ?          ; must be 0 for BIG_REQUEST request.

  .biglen      dd ?          ; length of the request in dword units.

  label .data dword
ends


rspError = 0
rspReply = 1
rspFirstEvent = 2

struct xResponse
  .code      db ?
  .data      rb 31

ends






struct xAnyError
  .code      db ?  ; 0 == error
  .error     db ?  ; the error code

  .seq       dw ?  ; sequence number

  .bad_num   dd ?  ; the value that causes the problem. Not on all errors.
  .minor     dw ?  ; minor opcode of the operation

  .major     db ?  ; major opcode of the operation
  .data      rb 21
ends

struct xAnyReply
  .code      db ?   ; 1 == reply
  .detail    db ?
  .seq       dw ?
  .length    dd ?   ; in dwords
  .data      rb 24
ends


struct xAnyEvent
  .event     db ?       ; >= 2
  .detail    db ?
  .seq       dw ?
  .data      rb 28



ends

Added freshlib/equates/Linux/_xcb.inc.







































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; Pre-defined constants

; Current protocol version
X_PROTOCOL = 11

; Current minor version
X_PROTOCOL_REVISION = 0

; X_TCP_PORT + display number = server port for TCP transport
X_TCP_PORT = 6000

; xcb connection errors because of socket, pipe and other stream errors.
XCB_CONN_ERROR = 1

; xcb connection shutdown because of extension not supported
XCB_CONN_CLOSED_EXT_NOTSUPPORTED = 2

; malloc(), calloc() and realloc() error upon failure, for eg ENOMEM
XCB_CONN_CLOSED_MEM_INSUFFICIENT = 3

; Connection closed, exceeding request length that server accepts.
XCB_CONN_CLOSED_REQ_LEN_EXCEED = 4

; Connection closed, error during parsing display string.
XCB_CONN_CLOSED_PARSE_ERR = 5

; Connection closed because the server does not have a screen matching the display.
XCB_CONN_CLOSED_INVALID_SCREEN = 6

; Connection closed because some FD passing operation failed
XCB_CONN_CLOSED_FDPASSING_FAILED = 7

; Opaque structures

; XCB Connection structure.
; A structure that contain all data that  XCB needs to communicate with an X server.

; Other types

; Generic iterator.
; A generic iterator structure.

struct xcb_generic_iterator_t
    .p_data    dd  ?   ; Data of the current iterator
    .rem       dd  ?   ; remaining elements
    .index     dd  ?   ; index of the current iterator
ends


; Generic reply.
; A generic reply structure.

struct xcb_generic_reply_t
  .response_type  db  ?  ; Type of the response
  .pad0           db  ?  ; Padding
  .sequence       dw  ?  ; Sequence number
  .length         dd  ?  ; Length of the response
ends


; Generic event.
; A generic event structure.

struct xcb_generic_event_t
    .response_type  db ?        ; Type of the response
    .pad0           db ?        ; Padding
    .sequence       dw ?        ; Sequence number
    .pad            rd 7        ; Padding
    .full_sequence  dd ?        ; full sequence
ends


; Raw Generic event.
; A generic event structure as used on the wire, i.e., without the full_sequence field

struct xcb_raw_generic_event_t
    .response_type  db ?        ; Type of the response
    .pad0           db ?        ; Padding
    .sequence       dw ?        ; Sequence number
    .pad            rd 7        ; Padding
ends


; GE event
;
; An event as sent by the XGE extension. The length field specifies the
; number of 4-byte blocks trailing the struct.
;
; DEPRECATED: Since some fields in this struct have unfortunate names, it is
; recommended to use xcb_ge_generic_event_t instead.

struct xcb_ge_event_t
  .response_type  db ?        ; Type of the response
  .pad0           db ?        ; Padding
  .sequence       dw ?        ; Sequence number
  .length         dd ?
  .event_type     dw ?
  .pad1           dw ?
  .pad            rd 5        ; Padding
  .full_sequence  dd ?        ; full sequence
ends


; Generic error.
; A generic error structure.

struct xcb_generic_error_t
  .response_type   db ?         ; Type of the response
  .error_code      db ?         ; Error code
  .sequence        dw ?         ; Sequence number
  .resource_id     dd ?         ; Resource ID for requests with side effects only
  .minor_code      dw ?         ; Minor opcode of the failed request
  .major_code      db ?         ; Major opcode of the failed request
  .pad0            db ?         ;
  .pad             rd 5         ; Padding
  .full_sequence   dd ?         ; full sequence
ends


; XCB_NONE is the universal null resource or null atom parameter value for many core X requests
XCB_NONE = 0

; XCB_COPY_FROM_PARENT can be used for many xcb_create_window parameters
XCB_COPY_FROM_PARENT = 0

; XCB_CURRENT_TIME can be used in most requests that take an xcb_timestamp_t
XCB_CURRENT_TIME = 0

; XCB_NO_SYMBOL fills in unused entries in xcb_keysym_t tables
XCB_NO_SYMBOL = 0


; Container for authorization information.
; A container for authorization information to be sent to the X server.

struct xcb_auth_info_t
  .namelen      dd ?    ; Length of the string name (as returned by strlen).
  .p_name       dd ?    ; String containing the authentication protocol name, such as "MIT-MAGIC-COOKIE-1" or "XDM-AUTHORIZATION-1".
  .datalen      dd ?    ; Length of the data member.
  .p_data       dd ?    ; Data interpreted in a protocol-specific manner.
ends




struct xcb_screen_t
  .root                         dd ?      ;  Window ID
  .default_colormap             dd ?
  .white_pixel                  dd ?
  .black_pixel                  dd ?
  .current_input_masks          dd ?
  .width_in_pixels              dw ?
  .height_in_pixels             dw ?
  .width_in_millimeters         dw ?
  .height_in_millimeters        dw ?
  .min_installed_maps           dw ?
  .max_installed_maps           dw ?
  .root_visual                  dd ?
  .backing_stores               db ?
  .save_unders                  db ?
  .root_depth                   db ?
  .allowed_depths_len           db ?
ends


struct xcb_screen_iterator_t
    .p_data     dd  ?          ; xcb_screen_t record pointer.
    .rem        dd  ?
    .index      dd  ?
ends



















; XCB extensions const and structures.

struct xcb_extension_t
  .p_name       dd ?
  .global_id    dd ?
ends


struct xcb_protocol_request_t
  .count        dd ?
  .ext          dd ?
  .opcode       db ?
  .isvoid       db ?
ends


XCB_REQUEST_CHECKED       = 1
XCB_REQUEST_RAW           = 2
XCB_REQUEST_DISCARD_REPLY = 4
XCB_REQUEST_REPLY_FDS     = 8


struct xcb_query_extension_reply_t
  .response_type        db ?
  .pad0                 db ?
  .sesequence           dw ?
  .length               dd ?
  .present              db ?
  .major_opcode         db ?
  .first_event          db ?
  .first_error          db ?
ends



; XCB SHM extensions.

XCB_SHM_COMPLETION = 0

Added freshlib/equates/Linux/_xfixes.inc.































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: MIT_SHM extension equates.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

; XFIXES minor opcodes

; ver 1

opFixQueryVersion = 0
opFixChangeSaveSet = 1
opFixSelectSelectionInput = 2
opFixSelectCursorInput = 3
opFixGetCursorImage = 4

; ver 2

opFixCreateRegion = 5
opFixCreateRegionFromBitmap = 6
opFixCreateRegionFromWindow = 7
opFixCreateRegionFromGC = 8
opFixCreateRegionFromPicture = 9
opFixDestroyRegion = 10
opFixSetRegion = 11
opFixCopyRegion = 12
opFixUnionRegion = 13
opFixIntersectRegion = 14
opFixSubtractRegion = 15
opFixInvertRegion = 16
opFixTranslateRegion = 17
opFixRegionExtents = 18
opFixFetchRegion = 19
opFixSetGCClipRegion = 20
opFixSetWindowShapeRegion = 21
opFixSetPictureClipRegion = 22
opFixSetCursorName = 23
opFixGetCursorName = 24
opFixGetCursorImageAndName = 25
opFixChangeCursor = 26
opFixChangeCursorByName = 27

; ver 3

opFixExpandRegion = 28
opFixHideCursor = 29
opFixShowCursor = 30


; Event subcodes

evFixSetSelectionOwner = 0
evFixSelectionWindowDestroy = 1
evFixSelectionClientClose = 2

; Event selection mask

maskFixSetSelectionOwner = 1 shl evFixSetSelectionOwner
maskFixSelectionWindowDestroy = 1 shl evFixSelectionWindowDestroy
maskFixSelectionClientClose = 1 shl evFixSelectionClientClose

; Structures

struct __xfixQueryVersionReq
  .op                   db ?
  .minor                db ?
  .length               dw ?
  .client_major_version dd ?
  .client_minor_version dd ?
ends


struct __xfixQueryVersionRep
  .code          db ?   ; 1 == reply
  .detail        db ?
  .seq           dw ?
  .length        dd ?   ; in dwords == 0
  .major_version dd ?
  .minor_version dd ?
                 rb 16
ends


struct __xfixSelectSelectionInputReq
  .op                   db ?
  .minor                db ?    ; == opFixSelectSelectionInput == 2
  .length               dw ?    ; == 4
  .window               dd ?    ; Window ID
  .selection            dd ?    ; ATOM
  .event_mask           dd ?    ; set of maskFixXXXXXXXXXXXX masks
ends


struct evFixSelectionNotify
  .event                db ?       ;
  .subtype              db ?       ;
  .seq                  dw ?
  .window               dd ?       ; window ID
  .owner                dd ?       ; window ID or None
  .selection            dd ?       ; ATOM
  .timestamp            dd ?
  .sel_timestamp        dd ?
ends

Changes to freshlib/equates/Linux/_xft.inc.

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
struct XRenderColor






  .red   dw ?

  .green dw ?

  .blue  dw ?

  .alpha dw ?
ends


XFT_MAJOR       =       2
XFT_MINOR       =       1
XFT_REVISION    =       8
XftVersion      equ     XFT_VERSION

XFT_CORE                equ     "core"
XFT_RENDER              equ     "render"
XFT_XLFD                equ     "xlfd"
XFT_MAX_GLYPH_MEMORY    equ     "maxglyphmemory"
XFT_MAX_UNREF_FONTS     equ     "maxunreffonts"









































struct   _XftFont
  .ascent                dd ?
  .descent               dd ?
  .height                dd ?
  .max_advance_width     dd ?
  .charset               dd ?
|
>
>
>
>
>
>
|
>
|
>
|
>
|
<














>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: XFT library constants and structures.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________




XFT_MAJOR       =       2
XFT_MINOR       =       1
XFT_REVISION    =       8
XftVersion      equ     XFT_VERSION

XFT_CORE                equ     "core"
XFT_RENDER              equ     "render"
XFT_XLFD                equ     "xlfd"
XFT_MAX_GLYPH_MEMORY    equ     "maxglyphmemory"
XFT_MAX_UNREF_FONTS     equ     "maxunreffonts"


FcTypeVoid      = 0
FcTypeInteger   = 1
FcTypeDouble    = 2
FcTypeString    = 3
FcTypeBool      = 4
FcTypeMatrix    = 5
FcTypeCharSet   = 6
FcTypeFTFace    = 7
FcTypeLangSet   = 8

XftTypeVoid      =  FcTypeVoid
XftTypeInteger   =  FcTypeInteger
XftTypeDouble    =  FcTypeDouble
XftTypeString    =  FcTypeString
XftTypeBool      =  FcTypeBool
XftTypeMatrix    =  FcTypeMatrix
XftTypeCharSet   =  FcTypeCharSet
XftTypeFTFace    =  FcTypeFTFace
XftTypeLangSet   =  FcTypeLangSet

FC_SLANT_ROMAN   = 0
FC_SLANT_ITALIC  = 100
FC_SLANT_OBLIQUE = 110

XFT_SLANT_ROMAN   =  FC_SLANT_ROMAN
XFT_SLANT_ITALIC  =  FC_SLANT_ITALIC
XFT_SLANT_OBLIQUE =  FC_SLANT_OBLIQUE

FC_PROPORTIONAL         =  0
FC_DUAL                 =  90
FC_MONO                 =  100
FC_CHARCELL             =  110

XFT_PROPORTIONAL         =  FC_PROPORTIONAL
XFT_DUAL                 =  FC_DUAL
XFT_MONO                 =  FC_MONO
XFT_CHARCELL             =  FC_CHARCELL


struct   _XftFont
  .ascent                dd ?
  .descent               dd ?
  .height                dd ?
  .max_advance_width     dd ?
  .charset               dd ?

Added freshlib/equates/Linux/_xshm.inc.



































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: MIT_SHM extension equates.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


; MIT-SHM minor opcodes

opShmEnable = 0
opShmAttach = 1
opShmDetach = 2
opShmPutImage = 3



struct evShmCompletion
  .event        db    ?
                db    ?
  .seq          dw    ?
  .drawable     dd    ?
  .minor_event  dw    ?
  .major_event  db    ?
                db    ?
  .segID        dd    ?
  .offset       dd    ?
                rd    3
ends


struct __xShmAttachReq
  .op         db ?      ; SHM extension major opcode.
  .minor      db ?      ; = opShmAttach
  .length     dw ?      ; = 4
  .shmSeg     dd ?      ; X ID of the segment.
  .shmID      dd ?      ;
  .read_only  dd ?
ends


struct __xShmDetachReq
  .op         db ?      ; SHM extension major opcode.
  .minor      db ?      ; = opShmDetach
  .length     dw ?      ; = 2
  .shmSeg     dd ?
ends


struct __xShmPutImageReq
  .op         db ?      ; SHM extension major opcode.
  .minor      db ?      ; = opShmAttach = 1
  .length     dw ?      ; = 10
  .drawable   dd ?      ; where to draw
  .context    dd ?
  .total_w    dw ?
  .total_h    dw ?
  .src_x      dw ?
  .src_y      dw ?
  .src_w      dw ?
  .src_h      dw ?
  .dst_x      dw ?
  .dst_y      dw ?
  .depth      db ?
  .format     db ?
  .send_event db ?
              db ?
  .shmSeg     dd ?
  .offset     dd ?
ends



ShmCompletion = 0

Changes to freshlib/equates/Linux/allequates.inc.





















1

2








3
4





















; Linux programming constants

include '_geometry.inc'








include '_x.inc'
include '_xft.inc'

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>

>
>
>
>
>
>
>
>

|
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Combined include of all Linux equates.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

; New line symbol

bNEWLINE equ $0a
wNEWLINE equ $000a
dNEWLINE equ $0000000a

; Linux programming constants
include '_libdl.inc'
include '_geometry.inc'
include '_linux.inc'
include '_ipc.inc'
include '_libXrender.inc'
include '_xft.inc'
include '_libFT.inc'

include '_pthreads.inc'

include '_x.inc'
include '_xshm.inc'
include '_xfixes.inc'

Changes to freshlib/equates/Win32/_COMCTL32.INC.





1
2







3
4
5
6
7
8
9





; COMCTL32.DLL structures and constants








struct PROPSHEETPAGE
  .dwSize      dd ?
  .dwFlags     dd ?
  .hInstance   dd ?
  .pszTemplate dd ?
  .pszIcon     dd ?
>
>
>
>
|
|
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: COMCTL32.DLL structures and constants
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

struct PROPSHEETPAGE
  .dwSize      dd ?
  .dwFlags     dd ?
  .hInstance   dd ?
  .pszTemplate dd ?
  .pszIcon     dd ?
1052
1053
1054
1055
1056
1057
1058







1059
1060
1061
1062
1063
1064
1065
  .lpszText dd ?
  .char     rb 80
  .hinst    dd ?
  .uFlags   dd ?
ends












; Status bar styles

SBARS_SIZEGRIP = 100h








>
>
>
>
>
>
>







1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
  .lpszText dd ?
  .char     rb 80
  .hinst    dd ?
  .uFlags   dd ?
ends


struct TOOLTIPTEXTW
  .hdr      NMHDR
  .lpszText dd  ?
  .char     rw  80
  .hinst    dd  ?
  .uFlags   dd  ?
ends



; Status bar styles

SBARS_SIZEGRIP = 100h

Changes to freshlib/equates/Win32/_COMDLG32.INC.





1
2









3
4
5
6
7
8
9





; COMDLG32.DLL structures and constants










struct OPENFILENAME
  .lStructSize       dd ?
  .hwndOwner         dd ?
  .hInstance         dd ?
  .lpstrFilter       dd ?
  .lpstrCustomFilter dd ?
>
>
>
>
|
|
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: COMDLG32.DLL structures and constants
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________



struct OPENFILENAME
  .lStructSize       dd ?
  .hwndOwner         dd ?
  .hInstance         dd ?
  .lpstrFilter       dd ?
  .lpstrCustomFilter dd ?

Changes to freshlib/equates/Win32/_GDI32.INC.





1
2







3
4
5
6
7
8
9





; GDI32.DLL structures and constants








struct SIZE
  .cx dd ?
  .cy dd ?
ends

struct BITMAP
>
>
>
>
|
|
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: GDI32.DLL structures and constants
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

struct SIZE
  .cx dd ?
  .cy dd ?
ends

struct BITMAP
33
34
35
36
37
38
39










































40
41
42
43
44
45
46
47

48
49
50
51
52
53
54
  .biCompression   dd ?
  .biSizeImage     dd ?
  .biXPelsPerMeter dd ?
  .biYPelsPerMeter dd ?
  .biClrUsed       dd ?
  .biClrImportant  dd ?
ends











































struct BITMAPFILEHEADER
  .bfType      dw ?
  .bfSize      dd ?
  .bfReserved1 dw ?
  .bfReserved2 dw ?
  .bfOffBits   dd ?
ends


struct TEXTMETRIC
  .tmHeight           dd ?
  .tmAscent           dd ?
  .tmDescent          dd ?
  .tmInternalLeading  dd ?
  .tmExternalLeading  dd ?







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>








>







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
97
98
99
100
101
102
103
104
105
106
107
108
  .biCompression   dd ?
  .biSizeImage     dd ?
  .biXPelsPerMeter dd ?
  .biYPelsPerMeter dd ?
  .biClrUsed       dd ?
  .biClrImportant  dd ?
ends


struct CIEXYZ
  .ciexyzX      dd ?
  .ciexyzY      dd ?
  .ciexyzZ      dd ?
ends


struct CIEXYZTRIPLE
  .ciexyzRed   CIEXYZ
  .ciexyzGreen CIEXYZ
  .ciexyzBlue  CIEXYZ
ends


struct BITMAPV4HEADER
  .biSize          dd ?
  .biWidth         dd ?
  .biHeight        dd ?
  .biPlanes        dw ?
  .biBitCount      dw ?
  .biCompression   dd ?
  .biSizeImage     dd ?
  .biXPelsPerMeter dd ?
  .biYPelsPerMeter dd ?
  .biClrUsed       dd ?
  .biClrImportant  dd ?

  .RedMask         dd ?
  .GreenMask       dd ?
  .BlueMask        dd ?
  .AlphaMask       dd ?
  .CSType          dd ?
  .Endpoints       CIEXYZTRIPLE
  .GamaRed         dd ?
  .GammaGreen      dd ?
  .GammaBlue       dd ?
ends




struct BITMAPFILEHEADER
  .bfType      dw ?
  .bfSize      dd ?
  .bfReserved1 dw ?
  .bfReserved2 dw ?
  .bfOffBits   dd ?
ends


struct TEXTMETRIC
  .tmHeight           dd ?
  .tmAscent           dd ?
  .tmDescent          dd ?
  .tmInternalLeading  dd ?
  .tmExternalLeading  dd ?
63
64
65
66
67
68
69

70


71
72
73
74
75
76


77
78
79
80
81
82
83
  .tmDefaultChar      db ?
  .tmBreakChar        db ?
  .tmItalic           db ?
  .tmUnderlined       db ?
  .tmStruckOut        db ?
  .tmPitchAndFamily   db ?
  .tmCharSet          db ?

ends



struct LOGBRUSH
  .lbStyle dd ?
  .lbColor dd ?
  .lbHatch dd ?
ends



struct LOGPEN
  .lopnStyle dd ?
  .lopnWidth POINT
  .lopnColor dd ?
ends








>

>
>






>
>







117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  .tmDefaultChar      db ?
  .tmBreakChar        db ?
  .tmItalic           db ?
  .tmUnderlined       db ?
  .tmStruckOut        db ?
  .tmPitchAndFamily   db ?
  .tmCharSet          db ?
  .__align            rb 7
ends



struct LOGBRUSH
  .lbStyle dd ?
  .lbColor dd ?
  .lbHatch dd ?
ends



struct LOGPEN
  .lopnStyle dd ?
  .lopnWidth POINT
  .lopnColor dd ?
ends

103
104
105
106
107
108
109



















110
111
112
113
114
115
116
  .lfCharSet        db ?
  .lfOutPrecision   db ?
  .lfClipPrecision  db ?
  .lfQuality        db ?
  .lfPitchAndFamily db ?
  .lfFaceName       rb 32
ends




















struct ENUMLOGFONT
  .elfLogFont  LOGFONT
  .elfFullName rb 64
  .elfStyle    rb 32
ends








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
  .lfCharSet        db ?
  .lfOutPrecision   db ?
  .lfClipPrecision  db ?
  .lfQuality        db ?
  .lfPitchAndFamily db ?
  .lfFaceName       rb 32
ends


struct LOGFONTW
  .lfHeight         dd ?
  .lfWidth          dd ?
  .lfEscapement     dd ?
  .lfOrientation    dd ?
  .lfWeight         dd ?
  .lfItalic         db ?
  .lfUnderline      db ?
  .lfStrikeOut      db ?
  .lfCharSet        db ?
  .lfOutPrecision   db ?
  .lfClipPrecision  db ?
  .lfQuality        db ?
  .lfPitchAndFamily db ?
  .lfFaceName       rw 32
ends


struct ENUMLOGFONT
  .elfLogFont  LOGFONT
  .elfFullName rb 64
  .elfStyle    rb 32
ends

145
146
147
148
149
150
151








































152
153
154
155
156
157
158
  .cAuxBuffers     db ?
  .iLayerType      db ?
  .bReserved       db ?
  .dwLayerMask     dd ?
  .dwVisibleMask   dd ?
  .dwDamageMask    dd ?
ends









































; General constants

GDI_ERROR  = 0FFFFFFFFh
HGDI_ERROR = 0FFFFFFFFh

; Binary raster operations







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
  .cAuxBuffers     db ?
  .iLayerType      db ?
  .bReserved       db ?
  .dwLayerMask     dd ?
  .dwVisibleMask   dd ?
  .dwDamageMask    dd ?
ends


; This must be in _USER32.INC, but it uses LOGFONT and this caused circular dependencies.
struct NONCLIENTMETRICS
  .cbSize               dd ?
  .iBorderWidth         dd ?
  .iScrollWidth         dd ?
  .iScrollHeight        dd ?
  .iCaptionWidth        dd ?
  .iCaptionHeight       dd ?
  .lfCaptionFont        LOGFONT
  .iSmCaptionWidth      dd ?
  .iSmCaptionHeight     dd ?
  .lfSmCaptionFont      LOGFONT
  .iMenuWidth           dd ?
  .iMenuHeight          dd ?
  .lfMenuFont           LOGFONT
  .lfStatusFont         LOGFONT
  .lfMessageFont        LOGFONT
ends


struct NONCLIENTMETRICSW
  .cbSize               dd ?
  .iBorderWidth         dd ?
  .iScrollWidth         dd ?
  .iScrollHeight        dd ?
  .iCaptionWidth        dd ?
  .iCaptionHeight       dd ?
  .lfCaptionFont        LOGFONTW
  .iSmCaptionWidth      dd ?
  .iSmCaptionHeight     dd ?
  .lfSmCaptionFont      LOGFONTW
  .iMenuWidth           dd ?
  .iMenuHeight          dd ?
  .lfMenuFont           LOGFONTW
  .lfStatusFont         LOGFONTW
  .lfMessageFont        LOGFONTW
ends


; General constants

GDI_ERROR  = 0FFFFFFFFh
HGDI_ERROR = 0FFFFFFFFh

; Binary raster operations
476
477
478
479
480
481
482




; Object types for GetCurrentObject

OBJ_PEN     = 1
OBJ_BRUSH   = 2
OBJ_PAL     = 5
OBJ_FONT    = 6
OBJ_BITMAP  = 7











>
>
>
>
594
595
596
597
598
599
600
601
602
603
604
; Object types for GetCurrentObject

OBJ_PEN     = 1
OBJ_BRUSH   = 2
OBJ_PAL     = 5
OBJ_FONT    = 6
OBJ_BITMAP  = 7

; Additional constants for GetObjectType
OBJ_DC      = $03
OBJ_MEMDC   = $0a

Changes to freshlib/equates/Win32/_HTMLHELP.INC.






1
2



3
4


5
6
7
8
9
10
11





; HtmlHelp.h
; Copyright (c) 1996-1997, Microsoft Corp. All rights reserved.



; converted to fasm format




; Commands to pass to HtmlHelp()

HH_DISPLAY_TOPIC        = 0x0000
HH_HELP_FINDER          = 0x0000  ; WinHelp equivalent
HH_DISPLAY_TOC          = 0x0001
HH_DISPLAY_INDEX        = 0x0002
>
>
>
>
>
|
<
>
>
>
|
|
>
>







1
2
3
4
5
6

7
8
9
10
11
12
13
14
15
16
17
18
19
20
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: HtmlHelp constants and structures.

;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

; Commands to pass to HtmlHelp()

HH_DISPLAY_TOPIC        = 0x0000
HH_HELP_FINDER          = 0x0000  ; WinHelp equivalent
HH_DISPLAY_TOC          = 0x0001
HH_DISPLAY_INDEX        = 0x0002

Changes to freshlib/equates/Win32/_KERNEL32.INC.





1
2








3
4
5
6
7
8
9





; KERNEL32.DLL structures and constants









struct SYSTEM_INFO
  .wProcessorArchitecture      dw ?
  .wReserved                   dw ?
  .dwPageSize                  dd ?
  .lpMinimumApplicationAddress dd ?
  .lpMaximumApplicationAddress dd ?
>
>
>
>
|
|
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: KERNEL32.DLL structures and constants
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


struct SYSTEM_INFO
  .wProcessorArchitecture      dw ?
  .wReserved                   dw ?
  .dwPageSize                  dd ?
  .lpMinimumApplicationAddress dd ?
  .lpMaximumApplicationAddress dd ?
101
102
103
104
105
106
107

















108
109
110
111
112
113
114

















115
116
117
118
119
120
121
  .nFileSizeLow       dd ?
  .dwReserved0        dd ?
  .dwReserved1        dd ?
  .cFileName          rb 260
  .cAlternateFileName rb 14
ends



















struct PROCESSINFO
   .hProcess    dd ?
   .hThread     dd ?
   .dwProcessId dd ?
   .dwThreadId  dd ?
ends


















; General constants

NULL  = 0
TRUE  = 1
FALSE = 0








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







113
114
115
116
117
118
119
120
121
122
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
  .nFileSizeLow       dd ?
  .dwReserved0        dd ?
  .dwReserved1        dd ?
  .cFileName          rb 260
  .cAlternateFileName rb 14
ends

struct FINDDATAW
  .dwFileAttributes   dd ?
  .ftCreationTime     FILETIME
  .ftLastAccessTime   FILETIME
  .ftLastWriteTime    FILETIME
  .nFileSizeHigh      dd ?
  .nFileSizeLow       dd ?
  .dwReserved0        dd ?
  .dwReserved1        dd ?
  .cFileName          rw 260
  .cAlternateFileName rw 14
ends

; findnext error

ERROR_NO_MORE_FILES = 18


struct PROCESSINFO
   .hProcess    dd ?
   .hThread     dd ?
   .dwProcessId dd ?
   .dwThreadId  dd ?
ends



struct TIME_ZONE_INFORMATION
  .bias         dd ?
  .StandardName rw 32
  .StandardDate SYSTEMTIME
  .StandardBias dd ?
  .DaylightName rw 32
  .DaylightDate SYSTEMTIME
  .DaylightBias dd ?
ends

TIME_ZODE_ID_UNKNOWN  = 0
TIME_ZONE_ID_STANDARD = 1
TIME_ZONE_ID_DAYLIGHT = 2


; General constants

NULL  = 0
TRUE  = 1
FALSE = 0

305
306
307
308
309
310
311


312
313
314
315
316
317
318
PIPE_READMODE_MESSAGE    = 2
PIPE_TYPE_BYTE           = 0
PIPE_TYPE_MESSAGE        = 4
PIPE_UNLIMITED_INSTANCES = 255

; file/pipe error codes



ERROR_MORE_DATA = 234

; Global memory flags

GMEM_FIXED             = 0000h
GMEM_MOVEABLE          = 0002h
GMEM_NOCOMPACT         = 0010h







>
>







351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
PIPE_READMODE_MESSAGE    = 2
PIPE_TYPE_BYTE           = 0
PIPE_TYPE_MESSAGE        = 4
PIPE_UNLIMITED_INSTANCES = 255

; file/pipe error codes

ERROR_FILE_NOT_FOUND = 2
ERROR_PATH_NOT_FOUND = 3
ERROR_MORE_DATA = 234

; Global memory flags

GMEM_FIXED             = 0000h
GMEM_MOVEABLE          = 0002h
GMEM_NOCOMPACT         = 0010h
747
748
749
750
751
752
753


























































































VFT2_DRV_SOUND             = 00000009h
VFT2_DRV_COMM              = 0000000Ah
VFT2_DRV_INPUTMETHOD       = 0000000Bh
VFT2_DRV_VERSIONED_PRINTER = 0000000Ch
VFT2_FONT_RASTER           = 00000001h
VFT2_FONT_VECTOR           = 00000002h
VFT2_FONT_TRUETYPE         = 00000003h

































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
VFT2_DRV_SOUND             = 00000009h
VFT2_DRV_COMM              = 0000000Ah
VFT2_DRV_INPUTMETHOD       = 0000000Bh
VFT2_DRV_VERSIONED_PRINTER = 0000000Ch
VFT2_FONT_RASTER           = 00000001h
VFT2_FONT_VECTOR           = 00000002h
VFT2_FONT_TRUETYPE         = 00000003h


; MultiByteToWideChar constants

CP_ACP = 0
CP_OEMCP = 1
CP_MACCP = 2
CP_THREAD_ACP = 3
CP_SYMBOL = 42
CP_UTF7 = 65000
CP_UTF8 = 65001

; .flags:
MB_PRECOMPOSED       = $00000001     ; use precomposed chars
MB_COMPOSITE         = $00000002     ; use composite chars
MB_USEGLYPHCHARS     = $00000004     ; use glyph chars, not ctrl chars
MB_ERR_INVALID_CHARS = $00000008     ; error for invalid chars


struct DCB
  .DCBlength            dd ?       ;      // sizeof(DCB)
  .BaudRate             dd ?       ;      // current baud rate
  .fBinary              dd ?       ;      // binary mode, no EOF check
  .fParity              dd ?       ;      // enable parity checking
  .fOutxCtsFlow         dd ?       ;      // CTS output flow control
  .fOutxDsrFlow         dd ?       ;      // DSR output flow control
  .fDtrControl          dd ?       ;:2;   // DTR flow control type
  .fDsrSensitivity      dd ?       ;:1;   // DSR sensitivity

  .fTXContinueOnXoff    dd ?       ;:1;   // XOFF continues Tx
  .fOutX                dd ?       ;: 1;  // XON/XOFF out flow control
  .fInX                 dd ?       ;: 1;  // XON/XOFF in flow control
  .fErrorChar           dd ?       ;: 1;  // enable error replacement
  .fNull                dd ?       ;: 1;  // enable null stripping
  .fRtsControl          dd ?       ;:2;   // RTS flow control
  .fAbortOnError        dd ?       ;:1;   // abort reads/writes on error
  .fDummy2              dd ?       ;:17;  // reserved
  .wReserved            dw ?       ;      // not currently used

  .XonLim               dw ?       ;      // transmit XON threshold
  .XoffLim              dw ?       ;      // transmit XOFF threshold
  .ByteSize             db ?       ;      // number of bits/byte, 4-8
  .Parity               db ?       ;      // 0-4=no,odd,even,mark,space
  .StopBits             db ?       ;      // 0,1,2 = 1, 1.5, 2
  .XonChar              db ?       ;      // Tx and Rx XON character
  .XoffChar             db ?       ;      // Tx and Rx XOFF character
  .ErrorChar            db ?       ;      // error replacement character

  .EofChar              db ?       ;      // end of input character
  .EvtChar              db ?       ;      // received event character
  .wReserved1           dw ?       ;      // reserved; do not use
ends


struct smallDCB
  .DCBLength     dd ?
  .BaudRate      dd ?
  .fBinary       dd ?
  .fReserved1    dd ?
  .wReserved1    dw ?
  .XonLim        dw ?
  .XoffLim       dw ?
  .ByteSize      db ?
  .Parity        db ?
  .EoffChar      db ?
  .EvtChar       db ?
  .wReserved2    dw ?
ends



struct COMMTIMEOUTS
    .ReadIntervalTimeout          dd    ?
    .ReadTotalTimeoutMultiplier   dd    ?
    .ReadTotalTimeoutConstant     dd    ?
    .WriteTotalTimeoutMultiplier  dd    ?
    .WriteTotalTimeoutConstant    dd    ?
ends


struct CRITICAL_SECTION
  .DebugInfo dd ?
  .LockCount dd ?
  .RecursionCount dd ?
  .OwningThread dd ?
  .LockSemaphore dd ?
  .SpinCount dd ?
ends


Changes to freshlib/equates/Win32/_ODBC32.INC.















1
2
3
4
5
6
7














SQL_NULL_DATA                   =  -1
SQL_DATA_AT_EXEC                =  -2
SQL_SUCCESS                     =  0
SQL_SUCCESS_WITH_INFO           =  1
SQL_NODATA                      =  100
SQL_ERROR                       =  -1
SQL_INVALID_HANDLE              =  -2
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: ODBC constants and structures.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

SQL_NULL_DATA                   =  -1
SQL_DATA_AT_EXEC                =  -2
SQL_SUCCESS                     =  0
SQL_SUCCESS_WITH_INFO           =  1
SQL_NODATA                      =  100
SQL_ERROR                       =  -1
SQL_INVALID_HANDLE              =  -2

Changes to freshlib/equates/Win32/_RichEdit32.inc.
















1
2
3
4
5
6
7















MAX_TAB_STOPS = 32


struct CHARFORMAT
  .cbSize          dd ?
  .dwMask          dd ?
  .dwEffects       dd ?
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: RichEdit32.dll constants and structures.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


MAX_TAB_STOPS = 32


struct CHARFORMAT
  .cbSize          dd ?
  .dwMask          dd ?
  .dwEffects       dd ?

Changes to freshlib/equates/Win32/_SHELL32.INC.





1
2








3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18





; SHELL32.DLL structures and constants









struct NOTIFYICONDATA
   .cbSize           dd ?
   .hWnd             dd ?
   .uID              dd ?
   .uFlags           dd ?
   .uCallbackMessage dd ?
   .hIcon            dd ?
   .szTip            CHAR 64
ends

; Taskbar icon messages

NIM_ADD        = 0
NIM_MODIFY     = 1
NIM_DELETE     = 2
>
>
>
>
|
|
>
>
>
>
>
>
>
>








|







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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: SHELL32.DLL structures and constants
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


struct NOTIFYICONDATA
   .cbSize           dd ?
   .hWnd             dd ?
   .uID              dd ?
   .uFlags           dd ?
   .uCallbackMessage dd ?
   .hIcon            dd ?
   .szTip            du 64
ends

; Taskbar icon messages

NIM_ADD        = 0
NIM_MODIFY     = 1
NIM_DELETE     = 2

Changes to freshlib/equates/Win32/_USER32.INC.





1
2








3
4
5
6
7
8
9





; USER32.DLL structures and constants









struct POINT
   .x dd ?
   .y dd ?
ends

struct RECT
>
>
>
>
|
|
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: USER32.DLL structures and constants
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


struct POINT
   .x dd ?
   .y dd ?
ends

struct RECT
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
struct COPYDATASTRUCT
   .dwData dd ?
   .cbData dd ?
   .lpData dd ?
ends

struct ACCEL
    fVirt dw ?
    key   dw ?
    cmd   dw ?
ends

struct PAINTSTRUCT
   .hdc         dd ?
   .fErase      dd ?
   .rcPaint     RECT
   .fRestore    dd ?







|
|
|







140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
struct COPYDATASTRUCT
   .dwData dd ?
   .cbData dd ?
   .lpData dd ?
ends

struct ACCEL
    .fVirt dw ?
    .key   dw ?
    .cmd   dw ?
ends

struct PAINTSTRUCT
   .hdc         dd ?
   .fErase      dd ?
   .rcPaint     RECT
   .fRestore    dd ?
197
198
199
200
201
202
203









204
205
206
207
208
209
210
  .lpszCaption        dd ?
  .dwStyle            dd ?
  .lpszIcon           dd ?
  .dwContextHelpId    dd ?
  .lpfnMsgBoxCallback dd ?
  .dwLanguageId       dd ?
ends










; MessageBox type flags

MB_OK                   = 000000h
MB_OKCANCEL             = 000001h
MB_ABORTRETRYIGNORE     = 000002h
MB_YESNOCANCEL          = 000003h







>
>
>
>
>
>
>
>
>







209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
  .lpszCaption        dd ?
  .dwStyle            dd ?
  .lpszIcon           dd ?
  .dwContextHelpId    dd ?
  .lpfnMsgBoxCallback dd ?
  .dwLanguageId       dd ?
ends


struct MONITORINFO
  .cbSize    dd ?
  .rcMonitor RECT
  .rcWork    RECT
  .dwFlags   dd ?
ends


; MessageBox type flags

MB_OK                   = 000000h
MB_OKCANCEL             = 000001h
MB_ABORTRETRYIGNORE     = 000002h
MB_YESNOCANCEL          = 000003h
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326

327
328
329
330
331
332
333
WS_TILEDWINDOW      = WS_OVERLAPPEDWINDOW
WS_TILED            = WS_OVERLAPPED
WS_ICONIC           = WS_MINIMIZE
WS_SIZEBOX          = WS_THICKFRAME

; Extended Window Styles

WS_EX_DLGMODALFRAME    = 00001h
WS_EX_DRAGOBJECT       = 00002h
WS_EX_NOPARENTNOTIFY   = 00004h
WS_EX_TOPMOST          = 00008h
WS_EX_ACCEPTFILES      = 00010h
WS_EX_TRANSPARENT      = 00020h
WS_EX_MDICHILD         = 00040h
WS_EX_TOOLWINDOW       = 00080h
WS_EX_WINDOWEDGE       = 00100h
WS_EX_CLIENTEDGE       = 00200h
WS_EX_CONTEXTHELP      = 00400h
WS_EX_RIGHT            = 01000h
WS_EX_LEFT             = 00000h
WS_EX_RTLREADING       = 02000h
WS_EX_LTRREADING       = 00000h
WS_EX_LEFTSCROLLBAR    = 04000h
WS_EX_RIGHTSCROLLBAR   = 00000h
WS_EX_CONTROLPARENT    = 10000h
WS_EX_STATICEDGE       = 20000h
WS_EX_APPWINDOW        = 40000h
WS_EX_LAYERED          = 80000h

WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE or WS_EX_CLIENTEDGE
WS_EX_PALETTEWINDOW    = WS_EX_WINDOWEDGE or WS_EX_TOOLWINDOW or WS_EX_TOPMOST

; MDI client style bits

MDIS_ALLCHILDSTYLES = 1








|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>







320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
WS_TILEDWINDOW      = WS_OVERLAPPEDWINDOW
WS_TILED            = WS_OVERLAPPED
WS_ICONIC           = WS_MINIMIZE
WS_SIZEBOX          = WS_THICKFRAME

; Extended Window Styles

WS_EX_DLGMODALFRAME    = 00000001h
WS_EX_DRAGOBJECT       = 00000002h
WS_EX_NOPARENTNOTIFY   = 00000004h
WS_EX_TOPMOST          = 00000008h
WS_EX_ACCEPTFILES      = 00000010h
WS_EX_TRANSPARENT      = 00000020h
WS_EX_MDICHILD         = 00000040h
WS_EX_TOOLWINDOW       = 00000080h
WS_EX_WINDOWEDGE       = 00000100h
WS_EX_CLIENTEDGE       = 00000200h
WS_EX_CONTEXTHELP      = 00000400h
WS_EX_RIGHT            = 00001000h
WS_EX_LEFT             = 00000000h
WS_EX_RTLREADING       = 00002000h
WS_EX_LTRREADING       = 00000000h
WS_EX_LEFTSCROLLBAR    = 00004000h
WS_EX_RIGHTSCROLLBAR   = 00000000h
WS_EX_CONTROLPARENT    = 00010000h
WS_EX_STATICEDGE       = 00020000h
WS_EX_APPWINDOW        = 00040000h
WS_EX_LAYERED          = 00080000h
WS_EX_NOACTIVATE       = 08000000h
WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE or WS_EX_CLIENTEDGE
WS_EX_PALETTEWINDOW    = WS_EX_WINDOWEDGE or WS_EX_TOOLWINDOW or WS_EX_TOPMOST

; MDI client style bits

MDIS_ALLCHILDSTYLES = 1

382
383
384
385
386
387
388






389
390
391
392
393
394
395

GW_HWNDFIRST = 0
GW_HWNDLAST  = 1
GW_HWNDNEXT  = 2
GW_HWNDPREV  = 3
GW_OWNER     = 4
GW_CHILD     = 5







; RedrawWindow flags

RDW_INVALIDATE      = 0001h
RDW_INTERNALPAINT   = 0002h
RDW_ERASE           = 0004h
RDW_VALIDATE        = 0008h







>
>
>
>
>
>







404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423

GW_HWNDFIRST = 0
GW_HWNDLAST  = 1
GW_HWNDNEXT  = 2
GW_HWNDPREV  = 3
GW_OWNER     = 4
GW_CHILD     = 5

; GetAncestor constants

GA_PARENT       = 1
GA_ROOT         = 2
GA_ROOTOWNER    = 3

; RedrawWindow flags

RDW_INVALIDATE      = 0001h
RDW_INTERNALPAINT   = 0002h
RDW_ERASE           = 0004h
RDW_VALIDATE        = 0008h
403
404
405
406
407
408
409













































410
411
412
413
414
415
416
RDW_NOFRAME         = 0800h

; PeekMessage Options

PM_NOREMOVE = 0000h
PM_REMOVE   = 0001h
PM_NOYIELD  = 0002h














































; Window state messages

WM_STATE                  = 0000h
WM_NULL                   = 0000h
WM_CREATE                 = 0001h
WM_DESTROY                = 0002h







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
RDW_NOFRAME         = 0800h

; PeekMessage Options

PM_NOREMOVE = 0000h
PM_REMOVE   = 0001h
PM_NOYIELD  = 0002h

; MsgWaitForMultipleObjectsEx for .dwFlags:

MWMO_ALERTABLE = 0x0002         ; The function also returns if an APC has been queued to the thread with QueueUserAPC while the thread is in the waiting state.
MWMO_INPUTAVAILABLE = 0x0004    ; The function returns if input exists for the queue, even if the input has been seen (but not removed) using a call to another function, such as PeekMessage.
MWMO_WAITALL = 0x0001           ; The function returns when all objects in the pHandles array are signaled and an input event has been received, all at the same time.

; MsgWaitForMultipleObjectsEx for .dwWakeMask:

QS_ALLEVENTS            =       0x04BF          ; An input, WM_TIMER, WM_PAINT, WM_HOTKEY, or posted message is in the queue.
                                                ; This value is a combination of QS_INPUT, QS_POSTMESSAGE, QS_TIMER, QS_PAINT, and QS_HOTKEY.

QS_ALLINPUT             =       0x04FF          ; Any message is in the queue.
                                                ; This value is a combination of QS_INPUT, QS_POSTMESSAGE, QS_TIMER, QS_PAINT, QS_HOTKEY, and QS_SENDMESSAGE.

QS_ALLPOSTMESSAGE       =       0x0100          ; A posted message is in the queue.
                                                ; This value is cleared when you call GetMessage or PeekMessage without filtering messages.

QS_HOTKEY               =       0x0080          ; A WM_HOTKEY message is in the queue.

QS_INPUT                =       0x0407          ; An input message is in the queue.
                                                ; This value is a combination of QS_MOUSE, QS_KEY, and QS_RAWINPUT.

QS_KEY                  =       0x0001          ; A WM_KEYUP, WM_KEYDOWN, WM_SYSKEYUP, or WM_SYSKEYDOWN message is in the queue.

QS_MOUSE                =       0x0006          ; A WM_MOUSEMOVE message or mouse-button message (WM_LBUTTONUP, WM_RBUTTONDOWN, and so on).
                                                ; This value is a combination of QS_MOUSEMOVE and QS_MOUSEBUTTON.

QS_MOUSEBUTTON          =       0x0004          ; A mouse-button message (WM_LBUTTONUP, WM_RBUTTONDOWN, and so on).

QS_MOUSEMOVE            =       0x0002          ; A WM_MOUSEMOVE message is in the queue.

QS_PAINT                =       0x0020          ; A WM_PAINT message is in the queue.

QS_POSTMESSAGE          =       0x0008          ; A posted message is in the queue.
                                                ; This value is cleared when you call GetMessage or PeekMessage, whether or not you are filtering messages.

QS_RAWINPUT             =       0x0400          ; A raw input message is in the queue.

QS_SENDMESSAGE          =       0x0040          ; A message sent by another thread or application is in the queue.

QS_TIMER                =       0x0010          ; A WM_TIMER message is in the queue.




; Window state messages

WM_STATE                  = 0000h
WM_NULL                   = 0000h
WM_CREATE                 = 0001h
WM_DESTROY                = 0002h
736
737
738
739
740
741
742
743
744

745
746
747
748
749
750
751
PRF_ERASEBKGND   = 08h
PRF_CHILDREN     = 10h
PRF_OWNED        = 20h

; Virtual key codes

VK_LBUTTON   = 001h
VK_CANCEL    = 003h
VK_RBUTTON   = 002h

VK_MBUTTON   = 004h
VK_BACK      = 008h
VK_TAB       = 009h
VK_CLEAR     = 00Ch
VK_RETURN    = 00Dh
VK_SHIFT     = 010h
VK_CONTROL   = 011h







<

>







809
810
811
812
813
814
815

816
817
818
819
820
821
822
823
824
PRF_ERASEBKGND   = 08h
PRF_CHILDREN     = 10h
PRF_OWNED        = 20h

; Virtual key codes

VK_LBUTTON   = 001h

VK_RBUTTON   = 002h
VK_CANCEL    = 003h
VK_MBUTTON   = 004h
VK_BACK      = 008h
VK_TAB       = 009h
VK_CLEAR     = 00Ch
VK_RETURN    = 00Dh
VK_SHIFT     = 010h
VK_CONTROL   = 011h

Changes to freshlib/equates/Win32/_WSOCK32.INC.





1
2








3
4
5
6
7
8
9





; WSOCK32.DLL structures and constants









struct WSADATA
  .wVersion       dw ?
  .wHighVersion   dw ?
  .szDescription  rb 256+1
  .szSystemStatus rb 128+1
  .iMaxSockets    dw ?
>
>
>
>
|
|
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: WSOCK32.DLL structures and constants
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


struct WSADATA
  .wVersion       dw ?
  .wHighVersion   dw ?
  .szDescription  rb 256+1
  .szSystemStatus rb 128+1
  .iMaxSockets    dw ?
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
  .sin_zero   rb 8
ends

struct sockaddr
   .sa_family dw ?
   .sa_data rb 14
ends









; Socket types

SOCK_STREAM    = 1
SOCK_DGRAM     = 2
SOCK_RAW       = 3
SOCK_RDM       = 4
SOCK_SEQPACKET = 5

; Address formats

AF_UNSPEC    = 0
AF_UNIX      = 1
AF_INET      = 2
AF_IMPLINK   = 3
AF_PUP       = 4
AF_CHAOS     = 5
AF_NS        = 6
AF_IPX       = 6
AF_ISO       = 7
AF_OSI       = AF_ISO
AF_ECMA      = 8
AF_DATAKIT   = 9
AF_CCITT     = 10
AF_SNA       = 11
AF_DECnet    = 12
AF_DLI       = 13
AF_LAT       = 14
AF_HYLINK    = 15
AF_APPLETALK = 16
AF_NETBIOS   = 17











; Protocol formats

PF_UNSPEC    = 0
PF_UNIX      = 1
PF_INET      = 2
PF_IMPLINK   = 3







>
>
>
>
>
>
>
>


















|












>
>
>
>
>
>
>
>
>
>







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
97
98
99
100
  .sin_zero   rb 8
ends

struct sockaddr
   .sa_family dw ?
   .sa_data rb 14
ends

; Socket error

SOCKET_ERROR = -1
INVALID_SOCKET = -1

UNIX_PATH_MAX = 108


; Socket types

SOCK_STREAM    = 1
SOCK_DGRAM     = 2
SOCK_RAW       = 3
SOCK_RDM       = 4
SOCK_SEQPACKET = 5

; Address formats

AF_UNSPEC    = 0
AF_UNIX      = 1
AF_INET      = 2
AF_IMPLINK   = 3
AF_PUP       = 4
AF_CHAOS     = 5
AF_NS        = 6
AF_IPX       = AF_NS
AF_ISO       = 7
AF_OSI       = AF_ISO
AF_ECMA      = 8
AF_DATAKIT   = 9
AF_CCITT     = 10
AF_SNA       = 11
AF_DECnet    = 12
AF_DLI       = 13
AF_LAT       = 14
AF_HYLINK    = 15
AF_APPLETALK = 16
AF_NETBIOS   = 17
AF_VOICEVIEW = 18    ; VoiceView
AF_FIREFOX   = 19              ; Protocols from Firefox
AF_UNKNOWN1  = 20              ; Somebody is using this!
AF_BAN       = 21              ; Banyan
AF_ATM       = 22              ; Native ATM Services
AF_INET6     = 23              ; Internetwork Version 6
AF_CLUSTER   = 24              ; Microsoft Wolfpack
AF_12844     = 25              ; IEEE 1284.4 WG AF

AF_MAX       = 26

; Protocol formats

PF_UNSPEC    = 0
PF_UNIX      = 1
PF_INET      = 2
PF_IMPLINK   = 3
80
81
82
83
84
85
86


















87
88
89
90
91
92
93
PF_SNA       = 11
PF_DECnet    = 12
PF_DLI       = 13
PF_LAT       = 14
PF_HYLINK    = 15
PF_APPLETALK = 16
PF_NETBIOS   = 17



















; IP Ports

IPPORT_ECHO        = 7
IPPORT_DISCARD     = 9
IPPORT_SYSTAT      = 11
IPPORT_DAYTIME     = 13







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
PF_SNA       = 11
PF_DECnet    = 12
PF_DLI       = 13
PF_LAT       = 14
PF_HYLINK    = 15
PF_APPLETALK = 16
PF_NETBIOS   = 17


; IPPROTO_ constants
; Protocols

IPPROTO_IP       =       0               ; dummy for IP
IPPROTO_ICMP     =       1               ; control message protocol
IPPROTO_IGMP     =       2               ; internet group management protocol
IPPROTO_GGP      =       3               ; gateway^2 (deprecated)
IPPROTO_TCP      =       6               ; tcp
IPPROTO_PUP      =       12              ; pup
IPPROTO_UDP      =       17              ; user datagram protocol
IPPROTO_IDP      =       22              ; xns idp
IPPROTO_ND       =       77              ; UNOFFICIAL net disk proto

IPPROTO_RAW      =       255             ; raw IP packet
IPPROTO_MAX      =       256


; IP Ports

IPPORT_ECHO        = 7
IPPORT_DISCARD     = 9
IPPORT_SYSTAT      = 11
IPPORT_DAYTIME     = 13
123
124
125
126
127
128
129















































































































FD_CLOSE        = 20h

; commands for ioctlsocket

FIONBIO         = 8004667Eh
FIONSYNC        = 8004667Dh
FIONREAD        = 4004667Fh






















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
FD_CLOSE        = 20h

; commands for ioctlsocket

FIONBIO         = 8004667Eh
FIONSYNC        = 8004667Dh
FIONREAD        = 4004667Fh

; Commands for shutdown

SD_RECEIVE = 0
SD_SEND    = 1
SD_BOTH    = 2


; flags

MSG_OOB       = 1
MSG_PEEK      = 2
MSG_DONTROUTE = 4
MSG_MAXIOVLEN = 16
MSG_PARTIAL   = 0x8000

; options

SOL_SOCKET = $FFFF

SO_DEBUG       = $01
SO_ACCEPTCONN  = $02
SO_REUSEADDR   = $04
SO_KEEPALIVE   = $08
SO_DONTROUTE   = $10
SO_BROADCAST   = $20
SO_USELOOPBACK = $40
SO_LINGER      = $80
SO_OOBINLINE   = $100
SO_SNDBUF      = $1001
SO_RCVBUF      = $1002
SO_SNDTIMEO    = $1005
SO_RCVTIMEO    = $1006


WSA_INVALID_HANDLE = 6
WSA_NOT_ENOUGH_MEMORY = 8
WSA_INVALID_PARAMETER = 87
WSA_OPERATION_ABORTED = 995
WSA_IO_INCOMPLETE = 996
WSA_IO_PENDING = 997

WSABASEERR              =  10000

WSAEINTR                =  WSABASEERR+4
WSAEBADF                =  WSABASEERR+9
WSAEACCES               =  WSABASEERR+13
WSAEFAULT               =  WSABASEERR+14
WSAEINVAL               =  WSABASEERR+22
WSAEMFILE               =  WSABASEERR+24

WSAEWOULDBLOCK          =  WSABASEERR+35
WSAEINPROGRESS          =  WSABASEERR+36
WSAEALREADY             =  WSABASEERR+37
WSAENOTSOCK             =  WSABASEERR+38
WSAEDESTADDRREQ         =  WSABASEERR+39
WSAEMSGSIZE             =  WSABASEERR+40
WSAEPROTOTYPE           =  WSABASEERR+41
WSAENOPROTOOPT          =  WSABASEERR+42
WSAEPROTONOSUPPORT      =  WSABASEERR+43
WSAESOCKTNOSUPPORT      =  WSABASEERR+44
WSAEOPNOTSUPP           =  WSABASEERR+45
WSAEPFNOSUPPORT         =  WSABASEERR+46
WSAEAFNOSUPPORT         =  WSABASEERR+47
WSAEADDRINUSE           =  WSABASEERR+48
WSAEADDRNOTAVAIL        =  WSABASEERR+49
WSAENETDOWN             =  WSABASEERR+50
WSAENETUNREACH          =  WSABASEERR+51
WSAENETRESET            =  WSABASEERR+52
WSAECONNABORTED         =  WSABASEERR+53
WSAECONNRESET           =  WSABASEERR+54
WSAENOBUFS              =  WSABASEERR+55
WSAEISCONN              =  WSABASEERR+56
WSAENOTCONN             =  WSABASEERR+57
WSAESHUTDOWN            =  WSABASEERR+58
WSAETOOMANYREFS         =  WSABASEERR+59
WSAETIMEDOUT            =  WSABASEERR+60
WSAECONNREFUSED         =  WSABASEERR+61
WSAELOOP                =  WSABASEERR+62
WSAENAMETOOLONG         =  WSABASEERR+63
WSAEHOSTDOWN            =  WSABASEERR+64
WSAEHOSTUNREACH         =  WSABASEERR+65
WSAENOTEMPTY            =  WSABASEERR+66
WSAEUSERS               =  WSABASEERR+68
WSAEDQUOT               =  WSABASEERR+69
WSAESTALE               =  WSABASEERR+70
WSAEREMOTE              =  WSABASEERR+71

; Extended Windows Sockets error codes

WSASYSNOTREADY          =  WSABASEERR+91
WSAVERNOTSUPPORTED      =  WSABASEERR+92
WSANOTINITIALISED       =  WSABASEERR+93
WSAEDISCON              =  WSABASEERR+101
WSAENOMORE              =  WSABASEERR+102
WSAECANCELLED           =  WSABASEERR+103
WSAEINVALIDPROCTABLE    =  WSABASEERR+104
WSAEINVALIDPROVIDER     =  WSABASEERR+105
WSAEPROVIDERFAILEDINIT  =  WSABASEERR+106
WSASYSCALLFAILURE       =  WSABASEERR+107
WSASERVICE_NOT_FOUND    =  WSABASEERR+108
WSATYPE_NOT_FOUND       =  WSABASEERR+109
WSA_E_NO_MORE           =  WSABASEERR+110
WSA_E_CANCELLED         =  WSABASEERR+111
WSAEREFUSED             =  WSABASEERR+112

WSAHOST_NOT_FOUND       =  WSABASEERR+1001
WSATRY_AGAIN            =  WSABASEERR+1002
WSANO_RECOVERY          =  WSABASEERR+1003
WSANO_DATA              =  WSABASEERR+1004
WSANO_ADDRESS           =  WSANO_DATA

Added freshlib/equates/Win32/_com32.inc.





















































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: COM interfaces.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

; error codes
S_OK = 0
S_FALSE = 1
E_NOTIMPL      = $80004001 ; Not implemented
E_NOINTERFACE  = $80004002 ; No such interface supported
E_ABORT        = $80004004 ; Operation aborted
E_ACCESSDENIED = $80070005 ; General access denied error
E_FAIL         = $80004005 ; Unspecified failure
E_HANDLE       = $80070006 ; Handle that is not valid
E_INVALIDARG   = $80070057 ; One or more arguments are not valid
E_OUTOFMEMORY  = $8007000E ; Failed to allocate necessary memory
E_POINTER      = $80004003 ; Pointer that is not valid
E_UNEXPECTED   = $8000FFFF ; Unexpected failure

OLECLOSE_SAVEIFDIRTY = 0
OLECLOSE_NOSAVE      = 1
OLECLOSE_PROMPTSAVE  = 2

CLSCTX_INPROC_SERVER = 1
CLSCTX_INPROC_HANDLER = 2
CLSCTX_INPROC = CLSCTX_INPROC_SERVER or CLSCTX_INPROC_HANDLER

OLEIVERB_SHOW             = -1
OLEIVERB_OPEN             = -2
OLEIVERB_HIDE             = -3
OLEIVERB_UIACTIVATE       = -4
OLEIVERB_INPLACEACTIVATE  = -5
OLEIVERB_DISCARDUNDOSTATE = -6

; VARIANT TYPE

VT_EMPTY             = 0
VT_NULL              = 1
VT_I2                = 2
VT_I4                = 3
VT_R4                = 4
VT_R8                = 5
VT_CY                = 6
VT_DATE              = 7
VT_BSTR              = 8
VT_DISPATCH          = 9
VT_ERROR             = 10
VT_BOOL              = 11
VT_VARIANT           = 12
VT_UNKNOWN           = 13
VT_DECIMAL           = 14
VT_I1                = 16
VT_UI1               = 17
VT_UI2               = 18
VT_UI4               = 19
VT_I8                = 20
VT_UI8               = 21
VT_INT               = 22
VT_UINT              = 23
VT_VOID              = 24
VT_HRESULT           = 25
VT_PTR               = 26
VT_SAFEARRAY         = 27
VT_CARRAY            = 28
VT_USERDEFINED       = 29
VT_LPSTR             = 30
VT_LPWSTR            = 31
VT_RECORD            = 36
VT_INT_PTR           = 37
VT_UINT_PTR          = 38
VT_FILETIME          = 64
VT_BLOB              = 65
VT_STREAM            = 66
VT_STORAGE           = 67
VT_STREAMED_OBJECT   = 68
VT_STORED_OBJECT     = 69
VT_BLOB_OBJECT       = 70
VT_CF                = 71
VT_CLSID             = 72
VT_VERSIONED_STREAM  = 73
VT_BSTR_BLOB         = $fff
VT_VECTOR            = $1000
VT_ARRAY             = $2000
VT_BYREF             = $4000


struct VARIANT
  .vType        dw ?
  .res_zero     rb 6
  .Data0        dd ?
  .Data1        dd ?
ends




com_interface IWebBrowser2, \
        QueryInterface,\
        AddRef,\
        Release,\
\
        GetTypeInfoCount, \
        GetTypeInfo, \
        GetIDsOfNames, \
        xInvoke, \
        GoBack, \
        GoForward, \
        GoHome, \
        GoSearch, \
        Navigate, \
        Refresh, \
        Refresh2, \
        Stop, \
        get_Application, \
        get_Parent, \
        get_Container, \
        get_Document, \
        get_TopLevelContainer, \
        get_Type, \
        get_Left, \
        put_Left, \
        get_Top, \
        put_Top, \
        get_Width, \
        put_Width, \
        get_Height, \
        put_Height, \
        get_LocationName, \
        get_LocationURL, \
        get_Busy, \
        Quit, \
        ClientToWindow, \
        PutProperty, \
        GetProperty, \
        get_Name, \
        get_HWND, \
        get_FullName, \
        get_Path, \
        get_Visible, \
        put_Visible, \
        get_StatusBar, \
        put_StatusBar, \
        get_StatusText, \
        put_StatusText, \
        get_ToolBar, \
        put_ToolBar, \
        get_MenuBar, \
        put_MenuBar, \
        get_FullScreen, \
        put_FullScreen, \
        Navigate2, \
        QueryStatusWB, \
        ExecWB, \
        ShowBrowserBar, \
        get_ReadyState, \
        get_Offline, \
        put_Offline, \
        get_Silent, \
        put_Silent, \
        get_RegisterAsBrowser, \
        put_RegisterAsBrowser, \
        get_RegisterAsDropTarget, \
        put_RegisterAsDropTarget, \
        get_TheaterMode, \
        put_TheaterMode, \
        get_AddressBar, \
        put_AddressBar, \
        get_Resizable, \
        put_Resizable



; IWebBrowser2 ready states:

READYSTATE_UNINITIALIZED = 0
READYSTATE_LOADING = 1
READYSTATE_LOADED = 2
READYSTATE_INTERACTIVE = 3
READYSTATE_COMPLETE = 4



com_interface IOleObject, \
        QueryInterface, \
        AddRef, \
        Release, \
\
        SetClientSite, \
        GetClientSite, \
        SetHostNames, \
        Close, \
        SetMoniker, \
        GetMoniker, \
        InitFromData, \
        GetClipboardData, \
        DoVerb, \
        EnumVerbs, \
        Update, \
        IsUpToDate, \
        GetUserClassID, \
        GetUserType, \
        SetExtent, \
        GetExtent, \
        Advise, \
        Unadvise, \
        EnumAdvise, \
        GetMiscStatus, \
        SetColorScheme


struct OLEINPLACEFRAMEINFO
  .cb            dd ?
  .fMDIApp       dd ?
  .hwndFrame     dd ?
  .haccel        dd ?
  .cAccelEntries dd ?
ends



com_interface IOleInPlaceObject,        \
        QueryInterface,                 \
        AddRef,                         \
        Release,                        \
\
        GetWindow,                      \
        ContextSensitiveHelp,           \
        InPlaceDeactivate,              \
        UIDeactivate,                   \
        SetObjectRects,                 \
        ReactivateAndUndo



com_interface IHTMLDocument2,           \
        QueryInterface,                 \
        AddRef,                         \
        Release,                        \
\
        GetTypeInfoCount,               \
        GetTypeInfo,                    \
        GetIDsOfNames,                  \
        Invoke,                         \
\
        get_Script,                     \
\
        get_all,                        \
        get_body,                       \
        get_activeElement,              \
        get_images,                     \
        get_applets,                    \
        get_links,                      \
        get_forms,                      \
        get_anchors,                    \
        put_title,                      \
        get_title,                      \
        get_scripts,                    \
        put_designMode,                 \
        get_designMode,                 \
        get_selection,                  \
        get_readyState,                 \
        get_frames,                     \
        get_embeds,                     \
        get_plugins,                    \
        put_alinkColor,                 \
        get_alinkColor,                 \
        put_bgColor,                    \
        get_bgColor,                    \
        put_fgColor,                    \
        get_fgColor,                    \
        put_linkColor,                  \
        get_linkColor,                  \
        put_vlinkColor,                 \
        get_vlinkColor,                 \
        get_referrer,                   \
        get_location,                   \
        get_lastModified,               \
        put_URL,                        \
        get_URL,                        \
        put_domain,                     \
        get_domain,                     \
        put_cookie,                     \
        get_cookie,                     \
        put_expands,                    \
        get_expands,                    \
        put_charset,                    \
        get_charset,                    \
        put_defaultCharset,             \
        get_defaultCharset,             \
        get_mimeType,                   \
        get_fileSize,                   \
        get_fileCreatedDate,            \
        get_fileModifiedDate,           \
        get_fileUpdatedDate,            \
        get_security,                   \
        get_protocol,                   \
        get_nameProp,                   \
        write,                          \
        writeln,                        \
        open,                           \
        close,                          \
        clear,                          \
        queryCommandSupported,          \
        queryCommandEnabled,            \
        queryCommandState,              \
        queryCommandIndeterm,           \
        queryCommandText,               \
        queryCommandValue,              \
        execCommand,                    \
        execCommandShowHelp,            \
        createElement,                  \
        put_onhelp,                     \
        get_onhelp,                     \
        put_onclick,                    \
        get_onclick,                    \
        put_ondblclick,                 \
        get_ondblclick,                 \
        put_onkeyup,                    \
        get_onkeyup,                    \
        put_onkeydown,                  \
        get_onkeydown,                  \
        put_onkeypress,                 \
        get_onkeypress,                 \
        put_onmouseup,                  \
        get_onmouseup,                  \
        put_onmousedown,                \
        get_onmousedown,                \
        put_onmousemove,                \
        get_onmousemove,                \
        put_onmouseout,                 \
        get_onmouseout,                 \
        put_onmouseover,                \
        get_onmouseover,                \
        put_onreadystatechange,         \
        get_onreadystatechange,         \
        put_onafterupdate,              \
        get_onafterupdate,              \
        put_onrowexit,                  \
        get_onrowexit,                  \
        put_onrowenter,                 \
        get_onrowenter,                 \
        put_ondragstart,                \
        get_ondragstart,                \
        put_onselectstart,              \
        get_onselectstart,              \
        elementFromPoint,               \
        get_parentWindow,               \
        get_styleSheets,                \
        put_onbeforeupdate,             \
        get_onbeforeupdate,             \
        put_onerrorupdate,              \
        get_onerrorupdate,              \
        toString,                       \
        createStyleSheet



struct SAFEARRAYBOUND
  .cElements    dd  ?
  .lLbound      dd  ?
ends


struct SAFEARRAY
  .fFeatures  dw ?
  .cbElements dd ?
  .cLocks     dd ?
  .pvData     dd ?
  .rgsabound0 SAFEARRAYBOUND
  .rgsabound1 SAFEARRAYBOUND
ends




com_interface IDispatch,              \
        QueryInterface,               \
        AddRef,                       \
        Release,                      \
\
        .GetTypeInfoCount,            \
        .GetTypeInfo,                 \
        .GetIDsOfNames,               \
        .Invoke


com_interface IClassFactory,          \
        QueryInterface,               \
        AddRef,                       \
        Release,                      \
\
        CreateInstance,               \
        LockServer


;com_interface IHTMLElement,           \
;        QueryInterface,               \
;        AddRef,                       \
;        Release,                      \
;\

Changes to freshlib/equates/Win32/_exceptions.inc.
















1
2
3
4
5
6
7















EXCEPTION_MAXIMUM_PARAMETERS = 15

DBG_CONTINUE                         = 00010002h
DBG_TERMINATE_THREAD                 = 40010003h
DBG_TERMINATE_PROCESS                = 40010004h
DBG_CONTROL_C                        = 40010005h
DBG_CONTROL_BREAK                    = 40010008h
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Exception handling constants and structures.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


EXCEPTION_MAXIMUM_PARAMETERS = 15

DBG_CONTINUE                         = 00010002h
DBG_TERMINATE_THREAD                 = 40010003h
DBG_TERMINATE_PROCESS                = 40010004h
DBG_CONTROL_C                        = 40010005h
DBG_CONTROL_BREAK                    = 40010008h

Added freshlib/equates/Win32/_geometry.inc.













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Different geometry structures.
;
;  Target OS: Windows
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


struct TBounds
  .x      dd ?
  .y      dd ?
  .width  dd ?
  .height dd ?
ends

Added freshlib/equates/Win32/_mshtmhst.inc.

























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Some equates for HTML control COM interfaces.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


DOCHOSTUIFLAG_DIALOG = $00000001
DOCHOSTUIFLAG_DISABLE_HELP_MENU = $00000002
DOCHOSTUIFLAG_NO3DBORDER = $00000004
DOCHOSTUIFLAG_SCROLL_NO = $00000008
DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE = $00000010
DOCHOSTUIFLAG_OPENNEWWIN = $00000020
DOCHOSTUIFLAG_DISABLE_OFFSCREEN = $00000040
DOCHOSTUIFLAG_FLAT_SCROLLBAR = $00000080
DOCHOSTUIFLAG_DIV_BLOCKDEFAULT = $00000100
DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY = $00000200
DOCHOSTUIFLAG_OVERRIDEBEHAVIORFACTORY = $00000400
DOCHOSTUIFLAG_CODEPAGELINKEDFONTS = $00000800
DOCHOSTUIFLAG_URL_ENCODING_DISABLE_UTF8 = $00001000
DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8 = $00002000
DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE = $00004000
DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION = $00010000
DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION = $00020000
DOCHOSTUIFLAG_THEME = $00040000
DOCHOSTUIFLAG_NOTHEME = $00080000
DOCHOSTUIFLAG_NOPICS = $00100000
DOCHOSTUIFLAG_NO3DOUTERBORDER = $00200000
DOCHOSTUIFLAG_DISABLE_EDIT_NS_FIXUP = $00400000
DOCHOSTUIFLAG_LOCAL_MACHINE_ACCESS_CHECK = $00800000
DOCHOSTUIFLAG_DISABLE_UNTRUSTEDPROTOCOL = $01000000
DOCHOSTUIFLAG_HOST_NAVIGATES = $02000000
DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION = $04000000
DOCHOSTUIFLAG_USE_WINDOWLESS_SELECTCONTROL = $08000000
DOCHOSTUIFLAG_USE_WINDOWED_SELECTCONTROL = $10000000
DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE = $20000000
DOCHOSTUIFLAG_DPI_AWARE = $40000000

DOCHOSTUIDBLCLK_DEFAULT = 0
DOCHOSTUIDBLCLK_SHOWPROPERTIES = 1
DOCHOSTUIDBLCLK_SHOWCODE = 2




struct DOCHOSTUIINFO
  .cbSize dd ?
  .dwFlags  dd ?
  .dwDoubleClick dd ?
  .pchHostCss  dd ?
  .pchHostNS   dd ?
ends

Deleted freshlib/equates/Win32/_string_apia.inc.

1
2
3
4
5
struc CHAR count { rb count }

;macro TEXT lbl,[txt] {
;  lbl  db  txt
;}
<
<
<
<
<










Deleted freshlib/equates/Win32/_string_apiw.inc.

1
2
3
4
5
struc CHAR count { rw count }

macro TEXT lbl, [txt] {
  lbl  du  txt
}
<
<
<
<
<










Changes to freshlib/equates/Win32/allequates.inc.








1





2



3
4
5
6
7
8
9
10

11
12
13
14









; Win32 programming constants





include '_string_apia.inc'




include '_kernel32.inc'
include '_user32.inc'
include '_gdi32.inc'
include '_comctl32.inc'
include '_comdlg32.inc'
include '_shell32.inc'
include '_wsock32.inc'

include '_RichEdit32.inc'
include '_ODBC32.inc'
include '_HTMLHelp.inc'
include '_exceptions.inc'


>
>
>
>
>
>
>
|
>
>
>
>
>
|
>
>
>

|
|
|
|
|
|
|
>

|
|

>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Combined include of all Win32 equate files.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

bNEWLINE  equ $0d, $0a
wNEWLINE  equ $0a0d
dNEWLINE  equ $00000a0d

include '_geometry.inc'
include '_KERNEL32.INC'
include '_USER32.INC'
include '_GDI32.INC'
include '_COMCTL32.INC'
include '_COMDLG32.INC'
include '_SHELL32.INC'
include '_WSOCK32.INC'
include '_RichEdit32.inc'
include '_ODBC32.INC'
include '_HTMLHELP.INC'
include '_exceptions.inc'
include '_com32.inc'
include '_mshtmhst.inc'

Added freshlib/equates/_sdl.inc.









































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: SDL v1.2.11 equates definitions.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;
; SDL 1.2.11 includes written by Raedwulf
; a.k.a. Tai Chi Minh Ralph Eastwood
;
; There's no warranty for the correctness nor completeness of this file
; However, please mail me at tcmreastwood@ntlworld.com if you spot
; any errors in here.
;
; Version Date: 07/11/2006 (dd/mm/yyyy)
;
; Note: Thanks to gunblade about the padding ;)
;
;_________________________________________________________________________________________

SDL_INIT_TIMER      =   00000001h
SDL_INIT_AUDIO      =   00000010h
SDL_INIT_VIDEO      =   00000020h
SDL_INIT_CDROM      =   00000100h
SDL_INIT_JOYSTICK   =   00000200h
SDL_INIT_NOPARACHUTE    =   00100000h
SDL_INIT_EVENTTHREAD    =   01000000h
SDL_INIT_EVERYTHING =   0000FFFFh
SDL_APPMOUSEFOCUS   =   01h
SDL_APPINPUTFOCUS   =   02h
SDL_APPACTIVE       =   04h


struct SDL_AudioSpec
  .freq      rd      1
  .format    rw      1
  .channels  rb      1
  .silence   rb      1
  .samples   rw      1
  .padding   rw      1
  .size      rd      1
  .callback  rd      1
  .userdata  rd      1
ends

AUDIO_U8    =   0008h
AUDIO_S8    =   8008h
AUDIO_U16LSB    =   0010h
AUDIO_S16LSB    =   8010h
AUDIO_U16MSB    =   1010h
AUDIO_S16MSB    =   9010h
AUDIO_U16   =   AUDIO_U16LSB
AUDIO_S16   =   AUDIO_S16LSB
AUDIO_U16SYS    =   AUDIO_U16LSB
AUDIO_S16SYS    =   AUDIO_S16LSB


struct  SDL_AudioCVT
    .needed            rd 1
    .src_format        rw 1
    .dst_format        rw 1
    .rate_incr         rq 1
    .buf               rd 1
    .len               rd 1
    .len_cvt           rd 1
    .len_mult          rd 1
    .len_ratio         rq 1
    .filters           rd 10
    .filter_index      rd 1
ends


SDL_MIX_MAXVOLUME   =   128
SDL_MAX_TRACKS  =   99
SDL_AUDIO_TRACK =   00h
SDL_DATA_TRACK  =   04h

CD_TRAYEMPTY    =   0
CD_STOPPED  =   1
CD_PLAYING  =   2
CD_PAUSED   =   3
CD_ERROR = -1

struct   SDL_CDtrack
    .id              rb 1
    .type            rb 1
    .unused          rw 1
    .length          rd 1
    .offset          rd 1
ends

TRACK_COUNT  = (SDL_MAX_TRACKS+1)

struct   SDL_CD
  .id          rd 1
  .status          rd 1
  .numtracks       rd 1
  .cur_track       rd 1
  .cur_frame       rd 1
  .track           SDL_CDtrack
                   rb sizeof.SDL_CDtrack * SDL_MAX_TRACKS
ends

SDL_LIL_ENDIAN  =   1234
SDL_BIG_ENDIAN  =   4321

SDL_BYTEORDER   equ SDL_LIL_ENDIAN
SDL_ENOMEM  =   0
SDL_EFREAD  =   1
SDL_EFWRITE =   2
SDL_EFSEEK  =   3
SDL_UNSUPPORTED =   4
SDL_LASTERROR   =   5
SDL_RELEASED    =   0
SDL_PRESSED =   1

SDL_NOEVENT     =   0
SDL_ACTIVEEVENT     =   1
SDL_KEYDOWN     =   2
SDL_KEYUP       =   3
SDL_MOUSEMOTION     =   4
SDL_MOUSEBUTTONDOWN =   5
SDL_MOUSEBUTTONUP   =   6
SDL_JOYAXISMOTION   =   7
SDL_JOYBALLMOTION   =   8
SDL_JOYHATMOTION    =   9
SDL_JOYBUTTONDOWN   =   10
SDL_JOYBUTTONUP     =   11
SDL_QUIT        =   12
SDL_SYSWMEVENT      =   13
SDL_EVENT_RESERVEDA =   14
SDL_EVENT_RESERVEDB =   15
SDL_VIDEORESIZE     =   16
SDL_VIDEOEXPOSE     =   17
SDL_EVENT_RESERVED2 =   18
SDL_EVENT_RESERVED3 =   19
SDL_EVENT_RESERVED4 =   20
SDL_EVENT_RESERVED5 =   21
SDL_EVENT_RESERVED6 =   22
SDL_EVENT_RESERVED7 =   23

SDL_USEREVENT   =   24
SDL_NUMEVENTS   =   32

SDL_ACTIVEEVENTMASK =   2
SDL_KEYDOWNMASK     =   4
SDL_KEYUPMASK       =   8
SDL_KEYEVENTMASK    =   12
SDL_MOUSEMOTIONMASK =   16
SDL_MOUSEBUTTONDOWNMASK =   32
SDL_MOUSEBUTTONUPMASK   =   64
SDL_MOUSEEVENTMASK  =   102
SDL_JOYAXISMOTIONMASK   =   128
SDL_JOYBALLMOTIONMASK   =   256
SDL_JOYHATMOTIONMASK    =   512
SDL_JOYBUTTONDOWNMASK   =   1024
SDL_JOYBUTTONUPMASK =   2048
SDL_JOYEVENTMASK    =   3968
SDL_VIDEORESIZEMASK =   65536
SDL_VIDEOEXPOSEMASK =   131072
SDL_QUITMASK        =   4096
SDL_SYSWMEVENTMASK  =   8192
SDL_ALLEVENTS       =   0FFFFFFFFh

struct   SDL_keysym
    .scancode          rb 1
    .pad0              rb 3
    .sym           rd 1
    .mod           rd 1
    .unicode           rw 1
ends

struct   SDL_ActiveEvent
    .type          rb 1
    .gain          rb 1
    .state         rb 1
    .pad0          rb 1
ends


struct   SDL_KeyboardEvent
    .type          rb 1
    .which         rb 1
    .state         rb 1
    .pad0          rb 1
    .keysym        SDL_keysym
ends


struct   SDL_MouseMotionEvent
    .type          rb 1
    .which         rb 1
    .state         rb 1
    .pad0          rb 1
    .x         rw 1
    .y         rw 1
    .xrel          rw 1
    .yrel          rw 1
ends


struct   SDL_MouseButtonEvent
    .type          rb 1
    .which         rb 1
    .button        rb 1
    .state         rb 1
    .x         rw 1
    .y         rw 1
ends


struct   SDL_JoyAxisEvent
    .type          rb 1
    .which         rb 1
    .axis          rb 1
    .pad0          rb 1
    .value         rw 1
ends


struct   SDL_JoyBallEvent
    .type          rb 1
    .which         rb 1
    .ball          rb 1
    .pad0          rb 1
    .xrel          rw 1
    .yrel          rw 1
ends


struct   SDL_JoyHatEvent
    .type          rb 1
    .which         rb 1
    .hat       rb 1
    .value         rb 1
ends


struct   SDL_JoyButtonEvent
    .type          rb 1
    .which         rb 1
    .button        rb 1
    .state         rb 1
ends


struct   SDL_ResizeEvent
    .type          rb 1
    .pad0          rb 3
    .w         rd 1
    .h         rd 1
ends


struct   SDL_ExposeEvent
    .type          rb 1
ends


struct   SDL_QuitEvent
    .type          rb 1
ends


struct   SDL_UserEvent
    .type          rb 1
    .pad0          rb 3
    .code          rd 1
    .data1         rd 1
    .data2         rd 1
ends


SDL_SysWMmsg equ SDL_SysWMmsg

struct   SDL_SysWMEvent
    .type          rb 1
    .pad0          rb 3
    .msg       rd 1
ends


struc   SDL_Event
{
        virtual
        .type          rb 1
        end virtual
        virtual
        .active        SDL_ActiveEvent
        end virtual
        virtual
        .key       SDL_KeyboardEvent
        end virtual
        virtual
       .motion        SDL_MouseMotionEvent
        end virtual
        virtual
        .button        SDL_MouseButtonEvent
        end virtual
        virtual
        .jaxis         SDL_JoyAxisEvent
        end virtual
        virtual
        .jball         SDL_JoyBallEvent
        end virtual
        virtual
        .jhat          SDL_JoyHatEvent
        end virtual
        virtual
        .jbutton       SDL_JoyButtonEvent
        end virtual
        virtual
        .resize        SDL_ResizeEvent
        end virtual
        virtual
        .expose        SDL_ExposeEvent
        end virtual
        virtual
        .quit          SDL_QuitEvent
        end virtual
        virtual
        .user          SDL_UserEvent
        end virtual
        .syswm         SDL_SysWMEvent
}

SDL_ADDEVENT        =   0
SDL_PEEKEVENT       =   1
SDL_GETEVENT        =   2
SDL_QUERY       =   -1
SDL_IGNORE      =   0
SDL_DISABLE     =   0
SDL_ENABLE      =   1
SDL_HAT_CENTERED    =   00h
SDL_HAT_UP      =   01h
SDL_HAT_RIGHT       =   02h
SDL_HAT_DOWN        =   04h
SDL_HAT_LEFT        =   08h




SDL_ALL_HOTKEYS =   0FFFFFFFFh
SDL_DEFAULT_REPEAT_DELAY    =   500
SDL_DEFAULT_REPEAT_INTERVAL =   30


SDLK_UNKNOWN    =   0
SDLK_FIRST  =   0
SDLK_BACKSPACE  =   8
SDLK_TAB    =   9
SDLK_CLEAR  =   12
SDLK_RETURN =   13
SDLK_PAUSE  =   19
SDLK_ESCAPE =   27
SDLK_SPACE  =   32
SDLK_EXCLAIM    =   33
SDLK_QUOTEDBL   =   34
SDLK_HASH   =   35
SDLK_DOLLAR =   36
SDLK_AMPERSAND  =   38
SDLK_QUOTE  =   39
SDLK_LEFTPAREN  =   40
SDLK_RIGHTPAREN =   41
SDLK_ASTERISK   =   42
SDLK_PLUS   =   43
SDLK_COMMA  =   44
SDLK_MINUS  =   45
SDLK_PERIOD =   46
SDLK_SLASH  =   47
SDLK_0  =   48
SDLK_1  =   49
SDLK_2  =   50
SDLK_3  =   51
SDLK_4  =   52
SDLK_5  =   53
SDLK_6  =   54
SDLK_7  =   55
SDLK_8  =   56
SDLK_9  =   57
SDLK_COLON  =   58
SDLK_SEMICOLON  =   59
SDLK_LESS   =   60
SDLK_EQUALS =   61
SDLK_GREATER    =   62
SDLK_QUESTION   =   63
SDLK_AT =   64
SDLK_LEFTBRACKET    =   91
SDLK_BACKSLASH  =   92
SDLK_RIGHTBRACKET   =   93
SDLK_CARET  =   94
SDLK_UNDERSCORE =   95
SDLK_BACKQUOTE  =   96
SDLK_a  =   97
SDLK_b  =   98
SDLK_c  =   99
SDLK_d  =   100
SDLK_e  =   101
SDLK_f  =   102
SDLK_g  =   103
SDLK_h  =   104
SDLK_i  =   105
SDLK_j  =   106
SDLK_k  =   107
SDLK_l  =   108
SDLK_m  =   109
SDLK_n  =   110
SDLK_o  =   111
SDLK_p  =   112
SDLK_q  =   113
SDLK_r  =   114
SDLK_s  =   115
SDLK_t  =   116
SDLK_u  =   117
SDLK_v  =   118
SDLK_w  =   119
SDLK_x  =   120
SDLK_y  =   121
SDLK_z  =   122
SDLK_DELETE =   127

SDLK_WORLD_0    =   160
SDLK_WORLD_1    =   161
SDLK_WORLD_2    =   162
SDLK_WORLD_3    =   163
SDLK_WORLD_4    =   164
SDLK_WORLD_5    =   165
SDLK_WORLD_6    =   166
SDLK_WORLD_7    =   167
SDLK_WORLD_8    =   168
SDLK_WORLD_9    =   169
SDLK_WORLD_10   =   170
SDLK_WORLD_11   =   171
SDLK_WORLD_12   =   172
SDLK_WORLD_13   =   173
SDLK_WORLD_14   =   174
SDLK_WORLD_15   =   175
SDLK_WORLD_16   =   176
SDLK_WORLD_17   =   177
SDLK_WORLD_18   =   178
SDLK_WORLD_19   =   179
SDLK_WORLD_20   =   180
SDLK_WORLD_21   =   181
SDLK_WORLD_22   =   182
SDLK_WORLD_23   =   183
SDLK_WORLD_24   =   184
SDLK_WORLD_25   =   185
SDLK_WORLD_26   =   186
SDLK_WORLD_27   =   187
SDLK_WORLD_28   =   188
SDLK_WORLD_29   =   189
SDLK_WORLD_30   =   190
SDLK_WORLD_31   =   191
SDLK_WORLD_32   =   192
SDLK_WORLD_33   =   193
SDLK_WORLD_34   =   194
SDLK_WORLD_35   =   195
SDLK_WORLD_36   =   196
SDLK_WORLD_37   =   197
SDLK_WORLD_38   =   198
SDLK_WORLD_39   =   199
SDLK_WORLD_40   =   200
SDLK_WORLD_41   =   201
SDLK_WORLD_42   =   202
SDLK_WORLD_43   =   203
SDLK_WORLD_44   =   204
SDLK_WORLD_45   =   205
SDLK_WORLD_46   =   206
SDLK_WORLD_47   =   207
SDLK_WORLD_48   =   208
SDLK_WORLD_49   =   209
SDLK_WORLD_50   =   210
SDLK_WORLD_51   =   211
SDLK_WORLD_52   =   212
SDLK_WORLD_53   =   213
SDLK_WORLD_54   =   214
SDLK_WORLD_55   =   215
SDLK_WORLD_56   =   216
SDLK_WORLD_57   =   217
SDLK_WORLD_58   =   218
SDLK_WORLD_59   =   219
SDLK_WORLD_60   =   220
SDLK_WORLD_61   =   221
SDLK_WORLD_62   =   222
SDLK_WORLD_63   =   223
SDLK_WORLD_64   =   224
SDLK_WORLD_65   =   225
SDLK_WORLD_66   =   226
SDLK_WORLD_67   =   227
SDLK_WORLD_68   =   228
SDLK_WORLD_69   =   229
SDLK_WORLD_70   =   230
SDLK_WORLD_71   =   231
SDLK_WORLD_72   =   232
SDLK_WORLD_73   =   233
SDLK_WORLD_74   =   234
SDLK_WORLD_75   =   235
SDLK_WORLD_76   =   236
SDLK_WORLD_77   =   237
SDLK_WORLD_78   =   238
SDLK_WORLD_79   =   239
SDLK_WORLD_80   =   240
SDLK_WORLD_81   =   241
SDLK_WORLD_82   =   242
SDLK_WORLD_83   =   243
SDLK_WORLD_84   =   244
SDLK_WORLD_85   =   245
SDLK_WORLD_86   =   246
SDLK_WORLD_87   =   247
SDLK_WORLD_88   =   248
SDLK_WORLD_89   =   249
SDLK_WORLD_90   =   250
SDLK_WORLD_91   =   251
SDLK_WORLD_92   =   252
SDLK_WORLD_93   =   253
SDLK_WORLD_94   =   254
SDLK_WORLD_95   =   255
SDLK_KP0    =   256
SDLK_KP1    =   257
SDLK_KP2    =   258
SDLK_KP3    =   259
SDLK_KP4    =   260
SDLK_KP5    =   261
SDLK_KP6    =   262
SDLK_KP7    =   263
SDLK_KP8    =   264
SDLK_KP9    =   265
SDLK_KP_PERIOD  =   266
SDLK_KP_DIVIDE  =   267
SDLK_KP_MULTIPLY    =   268
SDLK_KP_MINUS   =   269
SDLK_KP_PLUS    =   270
SDLK_KP_ENTER   =   271
SDLK_KP_EQUALS  =   272
SDLK_UP =   273
SDLK_DOWN   =   274
SDLK_RIGHT  =   275
SDLK_LEFT   =   276
SDLK_INSERT =   277
SDLK_HOME   =   278
SDLK_END    =   279
SDLK_PAGEUP =   280
SDLK_PAGEDOWN   =   281
SDLK_F1 =   282
SDLK_F2 =   283
SDLK_F3 =   284
SDLK_F4 =   285
SDLK_F5 =   286
SDLK_F6 =   287
SDLK_F7 =   288
SDLK_F8 =   289
SDLK_F9 =   290
SDLK_F10    =   291
SDLK_F11    =   292
SDLK_F12    =   293
SDLK_F13    =   294
SDLK_F14    =   295
SDLK_F15    =   296
SDLK_NUMLOCK    =   300
SDLK_CAPSLOCK   =   301
SDLK_SCROLLOCK  =   302
SDLK_RSHIFT =   303
SDLK_LSHIFT =   304
SDLK_RCTRL  =   305
SDLK_LCTRL  =   306
SDLK_RALT   =   307
SDLK_LALT   =   308
SDLK_RMETA  =   309
SDLK_LMETA  =   310
SDLK_LSUPER =   311
SDLK_RSUPER =   312
SDLK_MODE   =   313
SDLK_COMPOSE    =   314
SDLK_HELP   =   315
SDLK_PRINT  =   316
SDLK_SYSREQ =   317
SDLK_BREAK  =   318
SDLK_MENU   =   319
SDLK_POWER  =   320
SDLK_EURO   =   321
SDLK_UNDO   =   322
SDLK_LAST   =   324
KMOD_NONE   =   0000h
KMOD_LSHIFT =   0001h
KMOD_RSHIFT =   0002h
KMOD_LCTRL  =   0040h
KMOD_RCTRL  =   0080h
KMOD_LALT   =   0100h
KMOD_RALT   =   0200h
KMOD_LMETA  =   0400h
KMOD_RMETA  =   0800h
KMOD_NUM    =   1000h
KMOD_CAPS   =   2000h
KMOD_MODE   =   4000h
KMOD_RESERVED   =   8000h

KMOD_CTRL   =   00C0h
KMOD_SHIFT  =   0003h
KMOD_ALT    =   0300h
KMOD_META   =   0C00h

WMcursor equ WMcursor

struct   SDL_Rect
    .x       rw 1
    .y       rw 1
    .w       rw 1
    .h       rw 1
ends

struct   SDL_Cursor
    .area        SDL_Rect
    .hot_x       rw 1
    .hot_y       rw 1
    .data        rd 1
    .mask        rd 1
    .save        rd 2
    .wm_cursor   rd 1
ends

SDL_BUTTON_LEFT     =   1
SDL_BUTTON_MIDDLE   =   2
SDL_BUTTON_RIGHT    =   3
SDL_BUTTON_WHEELUP  =   4
SDL_BUTTON_WHEELDOWN    =   5

SDL_BUTTON_LMASK    =   1
SDL_BUTTON_MMASK    =   2
SDL_BUTTON_RMASK    =   4

SDL_MUTEX_TIMEDOUT  =   1


RW_SEEK_SET =   0
RW_SEEK_CUR =   1
RW_SEEK_END =   2


struct   SDL_RWops
    .seek              rd 1
    .read              rd 1
    .write             rd 1
    .close             rd 1
    .type              rd 1
    .append            rd 1
    .h             rd 1
ends

SDL_MAJOR_VERSION   =   1
SDL_MINOR_VERSION   =   2
SDL_PATCHLEVEL  =   11

struct   SDL_version
    .major             rb 1
    .minor             rb 1
    .patch             rb 1
    .pad0              rb 1
ends


SDL_ALPHA_OPAQUE    =   255
SDL_ALPHA_TRANSPARENT   =   0

struct   SDL_Color
    .r           rb 1
    .g           rb 1
    .b           rb 1
    .unused          rb 1
ends

SDL_Colour  equ SDL_Color
struct   SDL_Palette
    .ncolors           rd 1
    .colors            rd 1
ends


struct   SDL_PixelFormat
    .palette           rd 1
    .BitsPerPixel          rb 1
    .BytesPerPixel         rb 1
    .Rloss             rb 1
    .Gloss             rb 1
    .Bloss             rb 1
    .Aloss             rb 1
    .Rshift            rb 1
    .Gshift            rb 1
    .Bshift            rb 1
    .Ashift            rb 1
    .pad0              rb 2
    .Rmask             rd 1
    .Gmask             rd 1
    .Bmask             rd 1
    .Amask             rd 1
    .colorkey          rd 1
    .alpha             rb 1
    .pad1              rb 3
ends

struct   SDL_Surface
    .flags             rd 1
    .format            rd 1
    .w             rd 1
    .h             rd 1
    .pitch             rw 1
    .pad0              rb 2
    .pixels            rd 1
    .offset            rd 1
    .hwdata            rd 1
    .clip_rect         SDL_Rect
    .unused1           rd 1
    .locked            rd 1
    .map           rd 1
    .format_version        rd 1
    .refcount          rd 1
ends


SDL_SWSURFACE   =   00000000h
SDL_HWSURFACE   =   00000001h
SDL_ASYNCBLIT   =   00000004h
SDL_ANYFORMAT   =   10000000h
SDL_HWPALETTE   =   20000000h
SDL_DOUBLEBUF   =   40000000h
SDL_FULLSCREEN  =   80000000h
SDL_OPENGL  =   00000002h
SDL_OPENGLBLIT  =   0000000Ah
SDL_RESIZABLE   =   00000010h
SDL_NOFRAME =   00000020h
SDL_HWACCEL =   00000100h
SDL_SRCCOLORKEY =   00001000h
SDL_RLEACCELOK  =   00002000h
SDL_RLEACCEL    =   00004000h
SDL_SRCALPHA    =   00010000h
SDL_PREALLOC    =   01000000h
SDL_YV12_OVERLAY    =   32315659h
SDL_IYUV_OVERLAY    =   56555949h
SDL_YUY2_OVERLAY    =   32595559h
SDL_UYVY_OVERLAY    =   59565955h
SDL_YVYU_OVERLAY    =   55595659h

struct   SDL_Overlay
    .format            rd 1
    .w             rd 1
    .h             rd 1
    .planes            rd 1
    .pitches           rd 1
    .pixels            rd 1
    .hwfuncs           rd 1
    .hwdata            rd 1
    .hw_overlay        rd 1
    .UnusedBits        rd 1
ends


SDL_GL_RED_SIZE         =   0
SDL_GL_GREEN_SIZE       =   1
SDL_GL_BLUE_SIZE        =   2
SDL_GL_ALPHA_SIZE       =   3
SDL_GL_BUFFER_SIZE      =   4
SDL_GL_DOUBLEBUFFER     =   5
SDL_GL_DEPTH_SIZE       =   6
SDL_GL_STENCIL_SIZE     =   7
SDL_GL_ACCUM_RED_SIZE       =   8
SDL_GL_ACCUM_GREEN_SIZE     =   9
SDL_GL_ACCUM_BLUE_SIZE      =   10
SDL_GL_ACCUM_ALPHA_SIZE     =   11
SDL_GL_STEREO           =   12
SDL_GL_MULTISAMPLEBUFFERS   =   13
SDL_GL_MULTISAMPLESAMPLES   =   14
SDL_GL_ACCELERATED_VISUAL   =   15
SDL_GL_SWAP_CONTROL     =   16
SDL_LOGPAL          =   01h
SDL_PHYSPAL         =   02h

SDL_GRAB_QUERY          =   -1
SDL_GRAB_OFF            =   0
SDL_GRAB_ON         =   1
SDL_GRAB_FULLSCREEN     =   2

macro SDL_MUSTLOCK reg, surfaceptr
{
    local surface

    if reg in <eax,ebx,ecx,edx,esi,edi>
       virtual at surfaceptr
           surface SDL_Surface
       end virtual
       mov  reg, [surface.flags]
       and  reg, SDL_HWSURFACE or SDL_ASYNCBLIT or SDL_RLEACCEL
       or   reg, [surface.offset]
       test reg, reg
    else
       display 'SDL_MUSTLOCK error'
       error
    end if

}

Changes to freshlib/equates/_sqlite3.inc.















1
2
3
4
5
6
7














; SQLite result codes

SQLITE_OK         =  0   ; Successful result
SQLITE_ERROR      =  1   ; SQL error or missing database
SQLITE_INTERNAL   =  2   ; An internal logic error in SQLite
SQLITE_PERM       =  3   ; Access permission denied
SQLITE_ABORT      =  4   ; Callback routine requested an abort
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: SQLite equates definitions.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

; SQLite result codes

SQLITE_OK         =  0   ; Successful result
SQLITE_ERROR      =  1   ; SQL error or missing database
SQLITE_INTERNAL   =  2   ; An internal logic error in SQLite
SQLITE_PERM       =  3   ; Access permission denied
SQLITE_ABORT      =  4   ; Callback routine requested an abort
20
21
22
23
24
25
26





27
28





























































29
30
31
32
33
34
35
SQLITE_SCHEMA     = 17   ; The database schema changed
SQLITE_TOOBIG     = 18   ; Too much data for one row of a table
SQLITE_CONSTRAINT = 19   ; Abort due to constraint violation
SQLITE_MISMATCH   = 20   ; Data type mismatch
SQLITE_MISUSE     = 21   ; Library used incorrectly
SQLITE_NOLFS      = 22   ; Uses OS features not supported on host
SQLITE_AUTH       = 23   ; Authorization denied





SQLITE_ROW        = 100  ; sqlite_step() has another row ready
SQLITE_DONE       = 101  ; sqlite_step() has finished executing































































SQLITE_CREATE_INDEX        =  1 ;   // Index Name      Table Name      */
SQLITE_CREATE_TABLE        =  2 ;   // Table Name      NULL            */
SQLITE_CREATE_TEMP_INDEX   =  3 ;   // Index Name      Table Name      */
SQLITE_CREATE_TEMP_TABLE   =  4 ;   // Table Name      NULL            */
SQLITE_CREATE_TEMP_TRIGGER =  5 ;   // Trigger Name    Table Name      */







>
>
>
>
>


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
SQLITE_SCHEMA     = 17   ; The database schema changed
SQLITE_TOOBIG     = 18   ; Too much data for one row of a table
SQLITE_CONSTRAINT = 19   ; Abort due to constraint violation
SQLITE_MISMATCH   = 20   ; Data type mismatch
SQLITE_MISUSE     = 21   ; Library used incorrectly
SQLITE_NOLFS      = 22   ; Uses OS features not supported on host
SQLITE_AUTH       = 23   ; Authorization denied
SQLITE_FORMAT     = 24   ; Auxiliary database format error
SQLITE_RANGE      = 25   ; 2nd parameter to sqlite3_bind out of range
SQLITE_NOTADB     = 26   ; File opened that is not a database file
SQLITE_NOTICE     = 27   ; Notifications from sqlite3_log()
SQLITE_WARNING    = 28   ; Warnings from sqlite3_log()
SQLITE_ROW        = 100  ; sqlite_step() has another row ready
SQLITE_DONE       = 101  ; sqlite_step() has finished executing


; SQLite extended result codes.

SQLITE_IOERR_READ              = SQLITE_IOERR or (1 shl 8)
SQLITE_IOERR_SHORT_READ        = SQLITE_IOERR or (2 shl 8)
SQLITE_IOERR_WRITE             = SQLITE_IOERR or (3 shl 8)
SQLITE_IOERR_FSYNC             = SQLITE_IOERR or (4 shl 8)
SQLITE_IOERR_DIR_FSYNC         = SQLITE_IOERR or (5 shl 8)
SQLITE_IOERR_TRUNCATE          = SQLITE_IOERR or (6 shl 8)
SQLITE_IOERR_FSTAT             = SQLITE_IOERR or (7 shl 8)
SQLITE_IOERR_UNLOCK            = SQLITE_IOERR or (8 shl 8)
SQLITE_IOERR_RDLOCK            = SQLITE_IOERR or (9 shl 8)
SQLITE_IOERR_DELETE            = SQLITE_IOERR or (10 shl 8)
SQLITE_IOERR_BLOCKED           = SQLITE_IOERR or (11 shl 8)
SQLITE_IOERR_NOMEM             = SQLITE_IOERR or (12 shl 8)
SQLITE_IOERR_ACCESS            = SQLITE_IOERR or (13 shl 8)
SQLITE_IOERR_CHECKRESERVEDLOCK = SQLITE_IOERR or (14 shl 8)
SQLITE_IOERR_LOCK              = SQLITE_IOERR or (15 shl 8)
SQLITE_IOERR_CLOSE             = SQLITE_IOERR or (16 shl 8)
SQLITE_IOERR_DIR_CLOSE         = SQLITE_IOERR or (17 shl 8)
SQLITE_IOERR_SHMOPEN           = SQLITE_IOERR or (18 shl 8)
SQLITE_IOERR_SHMSIZE           = SQLITE_IOERR or (19 shl 8)
SQLITE_IOERR_SHMLOCK           = SQLITE_IOERR or (20 shl 8)
SQLITE_IOERR_SHMMAP            = SQLITE_IOERR or (21 shl 8)
SQLITE_IOERR_SEEK              = SQLITE_IOERR or (22 shl 8)
SQLITE_IOERR_DELETE_NOENT      = SQLITE_IOERR or (23 shl 8)
SQLITE_IOERR_MMAP              = SQLITE_IOERR or (24 shl 8)
SQLITE_IOERR_GETTEMPPATH       = SQLITE_IOERR or (25 shl 8)
SQLITE_IOERR_CONVPATH          = SQLITE_IOERR or (26 shl 8)
SQLITE_IOERR_VNODE             = SQLITE_IOERR or (27 shl 8)
SQLITE_IOERR_AUTH              = SQLITE_IOERR or (28 shl 8)
SQLITE_LOCKED_SHAREDCACHE      = SQLITE_LOCKED or  (1 shl 8)
SQLITE_BUSY_RECOVERY           = SQLITE_BUSY   or  (1 shl 8)
SQLITE_BUSY_SNAPSHOT           = SQLITE_BUSY   or  (2 shl 8)
SQLITE_CANTOPEN_NOTEMPDIR      = SQLITE_CANTOPEN or (1 shl 8)
SQLITE_CANTOPEN_ISDIR          = SQLITE_CANTOPEN or (2 shl 8)
SQLITE_CANTOPEN_FULLPATH       = SQLITE_CANTOPEN or (3 shl 8)
SQLITE_CANTOPEN_CONVPATH       = SQLITE_CANTOPEN or (4 shl 8)
SQLITE_CORRUPT_VTAB            = SQLITE_CORRUPT or (1 shl 8)
SQLITE_READONLY_RECOVERY       = SQLITE_READONLY or (1 shl 8)
SQLITE_READONLY_CANTLOCK       = SQLITE_READONLY or (2 shl 8)
SQLITE_READONLY_ROLLBACK       = SQLITE_READONLY or (3 shl 8)
SQLITE_READONLY_DBMOVED        = SQLITE_READONLY or (4 shl 8)
SQLITE_ABORT_ROLLBACK          = SQLITE_ABORT or (2 shl 8)
SQLITE_CONSTRAINT_CHECK        = SQLITE_CONSTRAINT or (1 shl 8)
SQLITE_CONSTRAINT_COMMITHOOK   = SQLITE_CONSTRAINT or (2 shl 8)
SQLITE_CONSTRAINT_FOREIGNKEY   = SQLITE_CONSTRAINT or (3 shl 8)
SQLITE_CONSTRAINT_FUNCTION     = SQLITE_CONSTRAINT or (4 shl 8)
SQLITE_CONSTRAINT_NOTNULL      = SQLITE_CONSTRAINT or (5 shl 8)
SQLITE_CONSTRAINT_PRIMARYKEY   = SQLITE_CONSTRAINT or (6 shl 8)
SQLITE_CONSTRAINT_TRIGGER      = SQLITE_CONSTRAINT or (7 shl 8)
SQLITE_CONSTRAINT_UNIQUE       = SQLITE_CONSTRAINT or (8 shl 8)
SQLITE_CONSTRAINT_VTAB         = SQLITE_CONSTRAINT or (9 shl 8)
SQLITE_CONSTRAINT_ROWID        = SQLITE_CONSTRAINT or (10 shl 8)
SQLITE_NOTICE_RECOVER_WAL      = SQLITE_NOTICE or (1 shl 8)
SQLITE_NOTICE_RECOVER_ROLLBACK = SQLITE_NOTICE or (2 shl 8)
SQLITE_WARNING_AUTOINDEX       = SQLITE_WARNING or (1 shl 8)
SQLITE_AUTH_USER               = SQLITE_AUTH or (1 shl 8)




SQLITE_CREATE_INDEX        =  1 ;   // Index Name      Table Name      */
SQLITE_CREATE_TABLE        =  2 ;   // Table Name      NULL            */
SQLITE_CREATE_TEMP_INDEX   =  3 ;   // Index Name      Table Name      */
SQLITE_CREATE_TEMP_TABLE   =  4 ;   // Table Name      NULL            */
SQLITE_CREATE_TEMP_TRIGGER =  5 ;   // Trigger Name    Table Name      */
62
63
64
65
66
67
68


69
70
71
72
73
74
75
76
77
78
79



















































; sqliteCreateCollation and sqliteCreateFunction.

SQLITE_UTF8       = 1
SQLITE_UTF16LE    = 2
SQLITE_UTF16BE    = 3
SQLITE_UTF16      = 4   ;   Use native byte order
SQLITE_ANY        = 5



; values returned by sqliteColumnType
SQLITE_INTEGER    = 1
SQLITE_FLOAT      = 2
SQLITE_TEXT       = 3
SQLITE_BLOB       = 4
SQLITE_NULL       = 5


SQLITE_STATIC     = 0
SQLITE_TRANSIENT  = -1


























































>
>











>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
; sqliteCreateCollation and sqliteCreateFunction.

SQLITE_UTF8       = 1
SQLITE_UTF16LE    = 2
SQLITE_UTF16BE    = 3
SQLITE_UTF16      = 4   ;   Use native byte order
SQLITE_ANY        = 5

SQLITE_DETERMINISTIC = $800

; values returned by sqliteColumnType
SQLITE_INTEGER    = 1
SQLITE_FLOAT      = 2
SQLITE_TEXT       = 3
SQLITE_BLOB       = 4
SQLITE_NULL       = 5


SQLITE_STATIC     = 0
SQLITE_TRANSIENT  = -1



; SQLITE configuration parameters

SQLITE_CONFIG_SINGLETHREAD  = 1  ; nil
SQLITE_CONFIG_MULTITHREAD   = 2  ; nil
SQLITE_CONFIG_SERIALIZED    = 3  ; nil
SQLITE_CONFIG_MALLOC        = 4  ; sqlite3_mem_methods*
SQLITE_CONFIG_GETMALLOC     = 5  ; sqlite3_mem_methods*
SQLITE_CONFIG_SCRATCH       = 6  ; void*, int sz, int N
SQLITE_CONFIG_PAGECACHE     = 7  ; void*, int sz, int N
SQLITE_CONFIG_HEAP          = 8  ; void*, int nByte, int min
SQLITE_CONFIG_MEMSTATUS     = 9  ; boolean
SQLITE_CONFIG_MUTEX         = 10 ; sqlite3_mutex_methods*
SQLITE_CONFIG_GETMUTEX      = 11 ; sqlite3_mutex_methods*


; SQLite open_v2 flags:

SQLITE_OPEN_READONLY         = $00000001  ;  Ok for sqlite3_open_v2()
SQLITE_OPEN_READWRITE        = $00000002  ;  Ok for sqlite3_open_v2()
SQLITE_OPEN_CREATE           = $00000004  ;  Ok for sqlite3_open_v2()
SQLITE_OPEN_DELETEONCLOSE    = $00000008  ;  VFS only
SQLITE_OPEN_EXCLUSIVE        = $00000010  ;  VFS only
SQLITE_OPEN_AUTOPROXY        = $00000020  ;  VFS only
SQLITE_OPEN_URI              = $00000040  ;  Ok for sqlite3_open_v2()
SQLITE_OPEN_MEMORY           = $00000080  ;  Ok for sqlite3_open_v2()
SQLITE_OPEN_MAIN_DB          = $00000100  ;  VFS only
SQLITE_OPEN_TEMP_DB          = $00000200  ;  VFS only
SQLITE_OPEN_TRANSIENT_DB     = $00000400  ;  VFS only
SQLITE_OPEN_MAIN_JOURNAL     = $00000800  ;  VFS only
SQLITE_OPEN_TEMP_JOURNAL     = $00001000  ;  VFS only
SQLITE_OPEN_SUBJOURNAL       = $00002000  ;  VFS only
SQLITE_OPEN_MASTER_JOURNAL   = $00004000  ;  VFS only
SQLITE_OPEN_NOMUTEX          = $00008000  ;  Ok for sqlite3_open_v2()
SQLITE_OPEN_FULLMUTEX        = $00010000  ;  Ok for sqlite3_open_v2()
SQLITE_OPEN_SHAREDCACHE      = $00020000  ;  Ok for sqlite3_open_v2()
SQLITE_OPEN_PRIVATECACHE     = $00040000  ;  Ok for sqlite3_open_v2()
SQLITE_OPEN_WAL              = $00080000  ;  VFS only


; These constants define all valid values for the "checkpoint mode" passed
; as the third parameter to the [sqlite3_wal_checkpoint_v2()] interface.
; See the sqlite3_wal_checkpoint_v2() documentation for details on the
; meaning of each of these checkpoint modes.

SQLITE_CHECKPOINT_PASSIVE  =    0  ; Do as much as possible w/o blocking
SQLITE_CHECKPOINT_FULL     =    1  ; Wait for writers, then checkpoint
SQLITE_CHECKPOINT_RESTART  =    2  ; Like FULL but wait for readers
SQLITE_CHECKPOINT_TRUNCATE =    3  ; Like RESTART but also truncate WAL

Changes to freshlib/equates/_zlib1.inc.















1
2
3
4
5
6
7














; zlib.h -- interface of the 'zlib' general purpose compression library
;  version 1.2.3, July 18th, 2005
;
;  Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
;
;  This software is provided 'as-is', without any express or implied
;  warranty.  In no event will the authors be held liable for any damages
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Constants and structures definitions for ZLIB library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

; zlib.h -- interface of the 'zlib' general purpose compression library
;  version 1.2.3, July 18th, 2005
;
;  Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
;
;  This software is provided 'as-is', without any express or implied
;  warranty.  In no event will the authors be held liable for any damages
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

ZLIB_VERSION equ "1.2.3"
ZLIB_VERNUM = $1230


struct z_stream

    ptrNextIn   dd      ?    ;  next input byte
    AvailIn     dd      ?    ;  number of bytes available at next_in
    TotalIn     dd  ?    ;  total nb of input bytes read so far

    ptrNextOut  dd  ?    ;  next output byte should be put there
    AvailOut    dd  ?    ;  remaining free space at next_out
    TotalOut    dd  ?    ;  total nb of bytes output so far

    ptrMsg      dd  ?    ;  last error message, NULL if no error

    ptrState    dd  ?    ;  not visible by applications

    zalloc      dd  ?    ;  used to allocate the internal state
    zfree       dd  ?    ;  used to free the internal state
    opaque      dd  ?    ;  private data object passed to zalloc and zfree

    data_type   dd  ?    ;  best guess about the data type: binary or text
    adler       dd  ?    ;  adler32 value of the uncompressed data
    reserved    dd  ?    ;  reserved for future use
ends


; constants

; Allowed flush values; see deflate() and inflate() below for details
Z_NO_FLUSH      =       0







|
|
|

|
|
|

|

|

|
|
|

|
|
|







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

ZLIB_VERSION equ "1.2.3"
ZLIB_VERNUM = $1230


struct z_stream

    .ptrNextIn   dd      ?    ;  next input byte
    .AvailIn     dd      ?    ;  number of bytes available at next_in
    .TotalIn     dd  ?    ;  total nb of input bytes read so far

    .ptrNextOut  dd  ?    ;  next output byte should be put there
    .AvailOut    dd  ?    ;  remaining free space at next_out
    .TotalOut    dd  ?    ;  total nb of bytes output so far

    .ptrMsg      dd  ?    ;  last error message, NULL if no error

    .ptrState    dd  ?    ;  not visible by applications

    .zalloc      dd  ?    ;  used to allocate the internal state
    .zfree       dd  ?    ;  used to free the internal state
    .opaque      dd  ?    ;  private data object passed to zalloc and zfree

    .data_type   dd  ?    ;  best guess about the data type: binary or text
    .adler       dd  ?    ;  adler32 value of the uncompressed data
    .reserved    dd  ?    ;  reserved for future use
ends


; constants

; Allowed flush values; see deflate() and inflate() below for details
Z_NO_FLUSH      =       0

Changes to freshlib/equates/allequates.inc.














1


2
3
4
5











6
7
8
9
10














; Win32 programming constants


TRUE = 1
FALSE = 0

NULL = 0












include '%TargetOS%/allequates.inc'

include '_sqlite3.inc'
include '_zlib1.inc'

>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>




>
>
>
>
>
>
>
>
>
>
>





>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Combined include of all equates.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

; Very generic constants!

TRUE = 1
FALSE = 0

NULL = 0

regEDI = 0
regESI = 1
regEBP = 2
regESP = 3
regEBX = 4
regEDX = 5
regECX = 6
regEAX = 7



include '%TargetOS%/allequates.inc'

include '_sqlite3.inc'
include '_zlib1.inc'
include '_sdl.inc'

Added freshlib/freshlib.asm.















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib amalgamation include file for the library code.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

include 'simpledebug/debug.asm'

include 'system/all.asm'
include 'data/all.asm'

match =GUI, LIB_MODE {
  include 'graphics/all.asm'
  include 'gui/all.asm'
}

Added freshlib/freshlib.inc.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib amalgamation include file for the non code definitions.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

LIB_MODE equ GUI

include 'macros/allmacros.inc'
include 'equates/allequates.inc'

Added freshlib/graphics/Dummy/draw.asm.





























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Draw library contains procedures for drawing oprtations.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

lsEndCapRound = 0
lsEndCapSquare = 0
lsEndCapFlat   = 0

lsJoinRound = 0
lsJoinBevel = 0
lsJoinMiter = 0



proc DrawLine, .context, .x1, .y1, .x2, .y2
begin
        return
endp




proc DrawFillRect, .context, .x, .y, .width, .height, .color
begin
        return
endp





proc Draw, .raster, .pDrawPoints
begin
        return
endp

Added freshlib/graphics/Dummy/fonts.asm.





















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Fonts managing library.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


proc FontCreate, .fontface, .size, .weight, .flags
begin
        stc
        return
endp


proc FontDestroy, .font
begin
        return
endp

Added freshlib/graphics/Dummy/images.asm.









































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Memory based images manipulation library.
;
;  Target OS: Dummy
;
;  Dependencies: memory.asm
;
;  Notes:
;_________________________________________________________________________________________


; only 16, 24 and 32 bpp are supported.
; It is stupid to support palleted modes and even 24bpp is not good...
body CreateImage
begin
        stc
        return
endp


body DestroyImage
begin
        return
endp



body DrawImage
begin
        return
endp

Added freshlib/graphics/Dummy/text.asm.















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Text drawing library.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________



proc DrawString, .context, .ptrString, .len, .x, .y, .font, .color
begin
        return
endp



proc DrawStringOpaque, .context, .ptrString, .len, .x, .y, .font, .color, .background
begin
        return
endp




proc DrawColoredString, .context, .ptrString, .pCharAttr, .str_len_bytes, .x, .y, .char_offs, .fontwidth, .fontheight
begin
        return
endp






proc GetTextBounds, .context, .ptrString, .len, .font
begin
        return
endp


; returns:
;       eax - x offset of the baseline of the string.
;       edx - y offset of the baseline of the string.

proc GetTextOffset, .context, .ptrString, .len, .font
begin
        return
endp

Added freshlib/graphics/KolibriOS/draw.asm.













































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Draw library contains procedures for drawing oprtations.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

lsEndCapRound = 0
lsEndCapSquare = 0
lsEndCapFlat   = 0

lsJoinRound = 0
lsJoinBevel = 0
lsJoinMiter = 0



proc DrawLine, .context, .x1, .y1, .x2, .y2
begin
        mov     ebx, [.x1]
        mov     ecx, [.y1]
        shl     ebx, 16
        shl     ecx, 16
        mov     bx, word [.x2]
        mov     cx, word [.y2]
        mov     edx, [.context]
        mov     edx, [edx+TContext.drawmode]
        return
endp




proc DrawFillRect, .context, .x, .y, .width, .height, .color
begin
        return
endp





proc Draw, .raster, .pDrawPoints
begin
        return
endp

Added freshlib/graphics/KolibriOS/fonts.asm.













































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Fonts managing library.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________



; needed for FreeType support.

proc FTCRequester as FT_Face_Requester
begin



        return
endp





body FontCreate
begin

        return
endp




body FontDestroy
begin

        return
endp





body GetFontMetrics
begin

        return
endp

Added freshlib/graphics/KolibriOS/images.asm.













































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Memory based images manipulation library.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________




body CreateImage
begin
        pushad

        stdcall GetMem, sizeof.TImage
        jc      .finish
        mov     esi, eax

        xor     eax, eax
        xor     ebx, ebx
        inc     eax

        mov     ecx, [.width]
        mov     edx, [.height]

        cmp     ecx, ebx
        cmovle  ecx, eax

        cmp     edx, ebx
        cmovle  edx, eax

        mov     [esi+TImage.width], ecx
        mov     [esi+TImage.height], edx

        mov     [esi+TImage.orgX], ebx
        mov     [esi+TImage.orgY], ebx
        mov     [esi+TImage.wrapW], ecx
        mov     [esi+TImage.wrapH], edx

        lea     eax, [4*ecx]
        imul    eax, edx

        stdcall GetMem, eax
        jc      .error

        mov     [esi+TImage.pPixels], eax

        mov     [esp+4*regEAX], esi

        lea     esi, [esi+TImage.lock]
        stdcall MutexCreate, 0, esi
        stdcall MutexRelease, esi

        clc

.finish:
        popad
        return

.error:
        stdcall FreeMem, esi
        stc
        jmp     .finish
endp


body DestroyImage
begin
        pushad

        mov     esi, [.ptrImage]
        test    esi, esi
        jz      .finish

        stdcall FreeMem, [esi+TImage.pPixels]

        lea     edi, [esi+TImage.lock]
        stdcall MutexDestroy, edi
        stdcall FreeMem, esi

.finish:
        popad
        return
endp






body DrawImageRect
begin
        return
endp

Added freshlib/graphics/KolibriOS/text.asm.

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Text drawing library.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


iglobal
  var flagFreeTypeLoadFlags = FT_LOAD_RENDER or FT_LOAD_TARGET_LCD or FT_LOAD_NO_AUTOHINT or FT_LOAD_COLOR
endg


uglobal
  var FTC_CMapCache_Lookup = 0
  var FTC_ImageCache_LookupScaler = 0

endg



body DrawDecomposedString      ;, .pImage, .pArray, .x, .y, .font, .color
.scaler  FTC_ScalerRec
.glyph   dd ?

.startX  dd ?
begin
        pushad

        mov     edx, [.font]
        xor     ecx, ecx

        mov     [.scaler.face_id], edx
        mov     [.scaler.width], ecx

        mov     eax, [edx+__TFont.height]
        inc     ecx

        mov     [.scaler.height], eax
        mov     [.scaler.pixel], ecx    ; ecx = 1

        mov     eax, [.x]
        mov     [.startX], eax

        mov     esi, [.pArray]
        xor     edi, edi
        dec     edi

.char_loop:
        inc     edi
        cmp     edi, [esi+TArray.count]
        jae     .finish

        cmp     word [esi+TArray.array+8*edi+TTextChar.width], 0
        je      .char_ok

        cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, [esi+TArray.array+8*edi+TTextChar.code]

        lea     ecx, [.scaler]
        lea     edx, [.glyph]
        cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0

        test    eax, eax
        jnz     .char_ok

        mov     ebx, [.glyph]
        mov     ecx, [.x]
        mov     edx, [.y]

        add     ecx, [ebx+FT_BitmapGlyphRec.left]
        sub     edx, [ebx+FT_BitmapGlyphRec.top]

        lea     eax, [ebx+FT_BitmapGlyphRec.bitmap]
        stdcall __DrawGlyph, [.pImage], eax, ecx, edx, [.color]

        movzx   eax, word [esi+TArray.array+8*edi+TTextChar.width]
        add     [.x], eax

.char_ok:
; check for new line.
        movzx   eax, word [esi+TArray.array+8*edi+TTextChar.height]
        test    eax, eax
        jz      .char_loop

        add     [.y], eax
        mov     eax, [.startX]
        mov     [.x], eax
        jmp     .char_loop


.finish:
        popad
        return
endp




; Draws the string on the image using the specified font and color.
; The string is drawn in one line. The control symbols are not
; processed. The tabs are not expanded or replaced with spaces.
;
; Arguments:
;    .pImage  - pointer to the image where to draw the text.
;    .pString - pointer to a UTF-8 string.
;    .len     - how many bytes from the string to be drawn. If -1, the whole string will be drawn.
;    .x       - X coordinate, where to start drawing.
;    .y       - Y coordinate of the baseline where to draw the string.
;    .font    - the font to be used.
;    .color   - ARGB color to draw the glyphs.
;
;;;;;;;; Returns:
;;;;;;;;    EAX - the width of the string in pixels.
;;;;;;;;    EBX - the ascender of the string. It is negative.
;;;;;;;;    EDX - the height of the string in pixels.


body DrawString ;, .pImage, .pString, .len, .x, .y, .font, .color

.scaler  FTC_ScalerRec
.glyph   dd ?

.miny    dd ?
.maxy    dd ?
.startX  dd ?

begin
        pushad

        mov     edx, [.font]
        xor     ecx, ecx

        mov     [.scaler.face_id], edx
        mov     [.scaler.width], ecx

        mov     eax, [edx+__TFont.height]
        inc     ecx

        mov     [.scaler.height], eax
        mov     [.scaler.pixel], ecx    ; ecx = 1

        ror     ecx, 1                  ; ecx = $80000000
        mov     [.maxy], ecx
        dec     ecx
        mov     [.miny], ecx            ; ecx = $7fffffff

        mov     eax, [.x]
        mov     [.startX], eax

        mov     esi, [.pString]

.char_loop:

        stdcall DecodeUtf8, [esi]
        jc      .finish

        add     esi, edx

        sub     [.len], edx
        jb      .finish

        test    eax, eax
        jz      .finish

        cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax

        lea     ecx, [.scaler]
        lea     edx, [.glyph]
        cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0

        test    eax, eax
        jnz     .char_loop

        mov     ebx, [.glyph]

        mov     ecx, [.x]
        mov     edx, [.y]

        add     ecx, [ebx+FT_BitmapGlyphRec.left]
        sub     edx, [ebx+FT_BitmapGlyphRec.top]

        cmp     edx, [.miny]
        jge     @f
        mov     [.miny], edx
@@:
        mov     eax, edx
        add     eax, [ebx+FT_BitmapGlyphRec.bitmap.rows]
        cmp     eax, [.maxy]
        jle     @f
        mov     [.maxy], eax
@@:
        lea     eax, [ebx+FT_BitmapGlyphRec.bitmap]
        stdcall __DrawGlyph, [.pImage], eax, ecx, edx, [.color]

        mov     eax, [ebx+FT_BitmapGlyphRec.root.advance.x]
        sar     eax, 16        ; format 16.16 fixed decimal point.
        add     [.x], eax

        jmp     .char_loop


.finish:
;        mov     eax, [.x]
;        mov     edx, [.maxy]
;        mov     ebx, [.miny]
;        sub     eax, [.startX]
;        sub     edx, ebx
;        sub     ebx, [.y]

;        mov     [esp+4*regEAX], eax
;        mov     [esp+4*regEBX], ebx
;        mov     [esp+4*regEDX], edx

        popad
        return
endp



; returns:
;   EAX - array with decomposed string.
;   EDX - maximal bearing_Y of the string.
;   ECX - maximal descender of the string.

body TextDecompose      ;, .hString, .font

  .scaler  FTC_ScalerRec
  .glyph   dd ?

  .miny    dd ?
  .maxy    dd ?

begin
        pushad

        mov     edx, [.font]
        xor     ecx, ecx

        mov     [.scaler.face_id], edx
        mov     [.scaler.width], ecx

        mov     eax, [edx+__TFont.height]
        inc     ecx

        mov     [.scaler.height], eax
        mov     [.scaler.pixel], ecx    ; ecx = 1

        ror     ecx, 1                  ; ecx = $80000000
        mov     [.maxy], ecx
        dec     ecx
        mov     [.miny], ecx            ; ecx = $7fffffff

        stdcall StrPtr, [.hString]
        mov     esi, eax

        stdcall CreateArray, sizeof.TTextChar
        mov     edi, eax

.char_loop:
        stdcall DecodeUtf8, [esi]
        jc      .finish

        add     esi, edx
        mov     ebx, eax

        test    eax, eax
        jz      .end

        cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax

        lea     ecx, [.scaler]
        lea     edx, [.glyph]
        cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0

        xor     ecx, ecx

        test    eax, eax
        jnz     .glyph_size_ok  ; zero width glyph ????

        mov     ecx, [.glyph]

        mov     eax, [ecx+FT_BitmapGlyphRec.top]
        neg     eax

        cmp     eax, [.miny]
        jge     @f
        mov     [.miny], eax
@@:

        add     eax, [ecx+FT_BitmapGlyphRec.bitmap.rows]
        cmp     eax, [.maxy]
        jle     @f
        mov     [.maxy], eax
@@:
        mov     ecx, [ecx+FT_BitmapGlyphRec.root.advance.x]  ; format 16.16 fixed decimal point.
        sar     ecx, 16   ; format 16.16


.glyph_size_ok:

        stdcall AddArrayItems, edi, 1
        mov     edi, edx
        mov     dword [eax+TTextChar.width], ecx
        mov     [eax+TTextChar.code],  ebx
        jmp     .char_loop

.end:
        clc

.finish:
        mov     [esp+4*regEAX], edi

        mov     eax, [.miny]
        neg     eax
        mov     ecx, [.maxy]

        mov     [esp+4*regEDX], eax
        mov     [esp+4*regECX], ecx

        add     ecx, eax
        mov     [edi+TArray.lparam], ecx

        popad
        return
endp



; Returns an array with the widths from the begining of the text to the every character inside the string.


proc GetTextWidthsArray, .hString, .font

  .scaler  FTC_ScalerRec
  .glyph   dd ?

  .x       dd ?

begin
        pushad

        mov     edx, [.font]
        xor     ecx, ecx

        mov     [.scaler.face_id], edx
        mov     [.scaler.width], ecx

        mov     eax, [edx+__TFont.height]
        inc     ecx

        mov     [.scaler.height], eax
        mov     [.scaler.pixel], ecx    ; ecx = 1


        stdcall StrPtr, [.hString]
        mov     esi, eax

        stdcall CreateArray, 4
        mov     edi, eax

        xor     ebx, ebx

.char_loop:
        stdcall DecodeUtf8, [esi]
        jc      .finish

        add     esi, edx
        test    eax, eax
        jz      .end

        cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax

        lea     ecx, [.scaler]
        lea     edx, [.glyph]
        cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0

        test    eax, eax
        jnz     .glyph_size_ok  ; zero width glyph ????


        mov     ecx, [.glyph]
        mov     ecx, [ecx+FT_BitmapGlyphRec.root.advance.x]  ; format 16.16 fixed decimal point.

        add     ebx, ecx


.glyph_size_ok:

        stdcall AddArrayItems, edi, 1
        mov     edi, edx

        mov     edx, ebx
        sar     edx, 16         ; format 16.16
        mov     [eax], edx
        jmp     .char_loop

.end:
        clc

.finish:
        mov     [esp+4*regEAX], edi
        popad
        return

.error:
        stc
        popad
        return
endp











; Computes the width and height of the text.
;
; Arguments:
;    .pString - pointer to a UTF-8 string.
;    .len     - how many bytes from the string to be used. If -1 the whole string will be scanned.
;    .font    - the font to be used for the computations.
;
; Returns:
;    EAX - the width of the string in pixels.
;    EBX - the ascender of the string. It is negative.
;    EDX - the height of the string in pixels.


body GetTextBounds      ;, .pString, .len, .font

.scaler  FTC_ScalerRec
.glyph   dd ?

.x       dd ?

.miny    dd ?
.maxy    dd ?

.charlen dd ?

begin
        pushad

        mov     edx, [.font]
        xor     ecx, ecx

        mov     [.scaler.face_id], edx
        mov     [.scaler.width], ecx

        mov     [.x], ecx

        mov     eax, [edx+__TFont.height]
        inc     ecx

        mov     [.scaler.height], eax
        mov     [.scaler.pixel], ecx    ; ecx = 1

        ror     ecx, 1                  ; ecx = $80000000
        mov     [.maxy], ecx
        dec     ecx
        mov     [.miny], ecx            ; ecx = $7fffffff

        mov     esi, [.pString]

.char_loop:
        stdcall DecodeUtf8, [esi]
        jc      .finish

        add     esi, edx
        mov     [.charlen], edx

        test    eax, eax
        jz      .finish

        cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax

        lea     ecx, [.scaler]
        lea     edx, [.glyph]
        cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags],  eax, edx, 0

        test    eax, eax
        jnz     .char_loop

        mov     ebx, [.glyph]

        sub     eax, [ebx+FT_BitmapGlyphRec.top]                ; eax = 0 here
        mov     edx, eax
        add     edx, [ebx+FT_BitmapGlyphRec.bitmap.rows]

        cmp     eax, [.miny]
        jge     @f
        mov     [.miny], eax
@@:
        cmp     edx, [.maxy]
        jle     @f
        mov     [.maxy], edx
@@:

        mov     eax, [ebx+FT_GlyphRec.advance.x]
        sar     eax, 16        ; format 16.16 fixed decimal point.
        add     [.x], eax

        mov     eax, [.charlen]
        sub     [.len], eax
        ja      .char_loop


.finish:
        mov     eax, [.x]
        mov     edx, [.maxy]
        mov     ebx, [.miny]
        sub     edx, ebx

        mov     [esp+4*regEAX], eax
        mov     [esp+4*regEBX], ebx
        mov     [esp+4*regEDX], edx

        popad
        return
endp







proc __DrawGlyph, .pImage, .pFTBitmap, .x, .y, .color
.spitch   dd ?
.dpitch   dd ?

.drect   RECT
.srect   RECT

.pixel_mode dd ?

.sstart dd ?
.dstart dd ?

.xsize  dd ?

.bpp    dd ?
.bit_ofs dd ?

begin
        pushad

        stdcall __fix_color, [.color], regEAX
        mov     [.color], eax

        mov     ebx, [.pImage]
        mov     edi, [.pFTBitmap]

; the glyph pixel mode handling.
        movzx   eax, [edi+FT_Bitmap.pixel_mode]
        cmp     eax, FT_PIXEL_MODE_BGRA
        ja      .finish

        mov     [.pixel_mode], eax
        movzx   eax, [.bpp_const+eax]
        mov     [.bpp], eax

; Clip the glyph to the image surface.

        mov     eax, [ebx+TImage.width]
        mov     ecx, [ebx+TImage.height]
        mov     [.drect.right], eax
        mov     [.drect.bottom], ecx
        xor     eax, eax
        mov     [.drect.left], eax
        mov     [.drect.top], eax

        mov     eax, [.x]
        mov     ecx, [.y]
        mov     [.srect.left], eax
        mov     [.srect.top], ecx

        mov     eax, [edi+FT_Bitmap.width]
        cmp     [.pixel_mode], FT_PIXEL_MODE_LCD
        jne     @f

        cdq
        mov     ecx, 3
        div     ecx

@@:
        add     eax, [.srect.left]
        mov     [.srect.right], eax

        mov     eax, [.srect.top]
        add     eax, [edi+FT_Bitmap.rows]
        mov     [.srect.bottom], eax

        lea     eax, [.srect]
        lea     ecx, [.drect]
        stdcall RectIntersect, ecx, eax, ecx
        jc      .finish                         ; the rectangles does not intersect!

        mov     eax, [.drect.left]
        mov     ecx, [.drect.top]
        sub     eax, [.x]
        sub     ecx, [.y]
        mov     [.srect.left], eax
        mov     [.srect.top], ecx

        mov     eax, [.drect.right]
        mov     ecx, [.drect.bottom]
        sub     eax, [.drect.left]
        sub     ecx, [.drect.top]
        mov     [.srect.right], eax     ; width!
        mov     [.srect.bottom], ecx    ; height!

; End of clipping code - [.srect] contains the rectangle of the glyph that have to be drawn (left, top, width, height).
; [.drect] contains the destination rectangle. Both have the same size.

        mov     ecx, [edi+FT_Bitmap.pitch]
        mov     [.spitch], ecx

; glyph pixel pointer

        mov     esi, [edi+FT_Bitmap.buffer]
        test    esi, esi
        jz      .finish

        mov     eax, [.srect.top]
        mov     ecx, [.srect.left]

        imul    eax, [.spitch]
        imul    ecx, [.bpp]
        mov     [.bit_ofs], ecx
        shr     ecx, 3          ; byte offs
        and     [.bit_ofs], 7          ; bit offs

        add     esi, ecx
        add     esi, eax

; TImage destination pixel pointer

        mov     edi, [ebx+TImage.pPixels]

        mov     ecx, [ebx+TImage.width]
        mov     eax, [.drect.top]
        imul    eax, ecx
        add     eax, [.drect.left]
        lea     edi, [edi+4*eax]    ; in bytes.

        shl     ecx, 2
        mov     [.dpitch], ecx


; prepare MMX constants

        pxor    mm0, mm0        ; mm0 = 0000 0000 0000 0000
        pcmpeqw mm1, mm1                                        ; mm1 = ffff ffff ffff ffff
        psrlw   mm1, 15                                         ; mm1 = 0001 0001 0001 0001
        psllw   mm1, 8          ; mm1 = 0100 0100 0100 0100

        movq    mm2, mm1                                        ; mm2 = 0001 0001 0001 0001
        psllq   mm2, 48         ; mm2 = 0100 0000 0000 0000


.loopy:

        mov     [.sstart], esi
        mov     [.dstart], edi

        mov     eax, [.srect.right]     ; width!
        mov     [.xsize], eax

        cmp     [.pixel_mode], FT_PIXEL_MODE_BGRA
        je      .loopx32

        cmp     [.pixel_mode], FT_PIXEL_MODE_LCD
        je      .loopx24

        cmp     [.pixel_mode], FT_PIXEL_MODE_GRAY
        je      .loopx8

        cmp     [.pixel_mode], FT_PIXEL_MODE_MONO
        jne     .finish

        lodsd
        bswap   eax
        mov     ch, 32
        mov     cl, byte [.bit_ofs]
        shl     eax, cl
        sub     ch, cl

.loopx1:
        shl     eax, 1
        dec     ch
        jnz     @f

        lodsd
        bswap   eax
        mov     ch, 32

@@:
        jnc     .next_x

        movd    mm7, [.color]        ; source pixel.
        movd    mm6, [edi]           ; destination pixel.

        movq    mm5, mm7
        psrlq   mm5, 24                 ; alpha source

        punpckldq mm5, mm5              ;
        punpcklbw mm6, mm0              ; byte to word destination pixel
        packssdw  mm5, mm5              ; mm5 = As, As, As, As
        punpcklbw mm7, mm0              ; byte to word source pixel

        movq    mm4, mm1
        psubw   mm4, mm5                ; mm4 = Bs Bs Bs Bs     (Bs = $100 - As)

        psrlq   mm5, 16                 ; mm5 = 0  As As As
        por     mm5, mm2                ; mm5 = $100 As As As

        pmullw  mm6, mm4                ; mm6 = Cd = Cd * (256-As) = Cd * Bs   (For alpha Ad = Ad*Bs)
        pmullw  mm7, mm5                ; Cs = Cs * As                   (For alpha As = $100*As )

        paddusw mm6, mm7                ; Cd = Cs + Cd                   (For alpha Ad = $100*As + Ad*Bs)
        psrlw   mm6, 8                  ; Cd = Cd/256                    (For alpha Ad = As + Ad*Bs/$100)

        packuswb mm6, mm0               ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
        movd     [edi], mm6

.next_x:
        add     edi, 4
        dec     [.xsize]
        jnz     .loopx1
        jmp     .nexty



.loopx8:
        movzx     eax, byte [esi]         ; intensity
        add       esi, 1

        movd      mm6, [.color]
        movd      mm7, eax

        punpcklbw mm6, mm0              ; byte to word color.
        punpckldq mm7, mm7              ;
        packssdw  mm7, mm7              ; mm7 = I, I, I, I

        pmullw    mm7, mm6              ; mm7 is the color to blend = Cs*256

        movd      mm6, [edi]            ; Destination color
        punpcklbw mm6, mm0              ; byte to word destination pixel

        movq      mm5, mm7
        psrlq     mm5, 56               ; alpha source
        punpckldq mm5, mm5
        packssdw  mm5, mm5              ; mm5 = As, As, As, As

        movq    mm4, mm1
        psubw   mm4, mm5                ; mm4 = Bs Bs Bs Bs     (Bs = $100 - As)

        pmullw  mm6, mm4                ; mm6 = Cd = Cd * (256-As) = Cd * Bs
        paddusw mm6, mm7                ; Cd = 256*Cs + Cd*(256-As)
        psrlw   mm6, 8                  ; Cd = Cd/256

        packuswb mm6, mm0               ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
        movd     [edi], mm6

        add     edi, 4

        dec     [.xsize]
        jnz     .loopx8
        jmp     .nexty


.loopx24:

        movzx   eax, byte [esi]
        movzx   edx, byte [esi+1]

        lea     eax, [eax+2*edx]
        movzx   edx, byte [esi+2]

        add     eax, edx
        shr     eax, 2          ; grayscale.

        movd      mm6, [.color]
        movd      mm7, eax

        punpcklbw mm6, mm0              ; byte to word color.
        punpckldq mm7, mm7              ;
        packssdw  mm7, mm7              ; mm7 = I, I, I, I

        pmullw    mm7, mm6              ; mm7 is the color to blend = Cs*256

        movd      mm6, [edi]            ; Destination color
        punpcklbw mm6, mm0              ; byte to word destination pixel

        movq      mm5, mm7
        psrlq     mm5, 56               ; alpha source
        punpckldq mm5, mm5
        packssdw  mm5, mm5              ; mm5 = As, As, As, As

        movq    mm4, mm1
        psubw   mm4, mm5                ; mm4 = Bs Bs Bs Bs     (Bs = $100 - As)

        pmullw  mm6, mm4                ; mm6 = Cd = Cd * (256-As) = Cd * Bs
        paddusw mm6, mm7                ; Cd = 256*Cs + Cd*(256-As)
        psrlw   mm6, 8                  ; Cd = Cd/256

        packuswb mm6, mm0               ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
        movd     [edi], mm6


        add     esi, 3
        add     edi, 4

        dec     [.xsize]
        jnz     .loopx24
        jmp     .nexty


.loopx32:
        movd    mm7, [esi]              ; source pixel.
        movd    mm6, [edi]              ; destination pixel.

        movq    mm5, mm7
        psrlq   mm5, 24                 ; alpha source

        punpckldq mm5, mm5              ;
        punpcklbw mm6, mm0              ; byte to word destination pixel
        packssdw  mm5, mm5              ; mm5 = As, As, As, As
        punpcklbw mm7, mm0              ; byte to word source pixel

        movq    mm4, mm1
        psubw   mm4, mm5                ; mm4 = Bs Bs Bs Bs     (Bs = $100 - As)

        psrlq   mm5, 16                 ; mm5 = 0  As As As
        por     mm5, mm2                ; mm5 = $100 As As As

        pmullw  mm6, mm4                ; mm6 = Cd = Cd * (256-As) = Cd * Bs   (For alpha Ad = Ad*Bs)
        pmullw  mm7, mm5                ; Cs = Cs * As                   (For alpha As = $100*As )

        paddusw mm6, mm7                ; Cd = Cs + Cd                   (For alpha Ad = $100*As + Ad*Bs)
        psrlw   mm6, 8                  ; Cd = Cd/256                    (For alpha Ad = As + Ad*Bs/$100)

        packuswb mm6, mm0               ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
        movd     [edi], mm6

        add     edi, 4
        add     esi, 4

        dec     [.xsize]
        jnz     .loopx32
        jmp     .nexty


.nexty:
        mov     esi, [.sstart]
        add     esi, [.spitch]

        mov     edi, [.dstart]
        add     edi, [.dpitch]

        dec     [.srect.bottom]         ; height
        jnz     .loopy


.finish:
        emms
        popad
        return

.bpp_const db 0, 1, 8, 2, 4, 24, 8, 32

endp



Deleted freshlib/graphics/Linux/draw.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
uglobal
  _CurrentRaster dd ?
  _CurrentX      dd ?
  _CurrentY      dd ?
  _DefaultGC     dd ?
endg

lsEndCapRound = CapRound
lsEndCapSquare = CapButt
lsEndCapFlat   = CapProjecting

lsJoinRound = JoinRound shl 8
lsJoinBevel = JoinBevel shl 8
lsJoinMiter = JoinMiter shl 8

struct TDashList
  .count dd ?   ; count of the list in dwords
  .dash  dd ?
  .space dd ?
ends



finalize _DestroyDefaultGC
begin
        cinvoke XFreeGC, [hApplicationDisplay], [_DefaultGC]
        return
endp


proc _FixGC
begin

        cmp     [_DefaultGC], 0
        jne     .exit

        cmp     [hApplicationDisplay], 0
        je      .exit

        push    eax
        cinvoke XDefaultRootWindow, [hApplicationDisplay]
        cinvoke XCreateGC, [hApplicationDisplay], eax, 0, 0
        mov     [_DefaultGC], eax
        pop     eax

.exit:
        return
endp


proc _FixCurrentPos, .raster
begin
        push    eax
        mov     eax, [.raster]
        cmp     eax, [_CurrentRaster]
        je      .fixed
        push    eax 0 0
        pop     [_CurrentY] [_CurrentX] [_CurrentRaster]
.fixed:
        pop     eax
        return
endp



proc SetLineStyle, .color, .width, .style, .dashlist
begin
        push    eax ebx ecx edx

        stdcall _FixGC
        mov     eax, [.style]
        mov     ecx, eax
        shr     ecx, 8
        and     eax, $ff        ; cap_style
        and     ecx, $ff        ; join_style
        cinvoke XSetLineAttributes, [hApplicationDisplay], [_DefaultGC], [.width], LineSolid, eax, ecx
        cinvoke XSetForeground,     [hApplicationDisplay], [_DefaultGC], [.color]

        pop     edx ecx ebx eax
        return
endp


proc GetCurrentXY, .raster
begin
        stdcall _FixCurrentPos, [.raster]
        mov     eax, [_CurrentX]
        mov     edx, [_CurrentY]
        return
endp


proc MoveTo, .raster, .x, .y
begin
        push    [.raster] [.x] [.y]
        pop     [_CurrentY] [_CurrentX] [_CurrentRaster]
        return
endp


proc DrawLine, .raster, .x, .y
begin
        push    eax ecx edx
        stdcall _FixGC
        stdcall _FixCurrentPos, [.raster]
        cinvoke XDrawLine, [hApplicationDisplay], [.raster], [_DefaultGC], [_CurrentX], [_CurrentY], [.x], [.y]
        push    [.x] [.y]
        pop     [_CurrentY] [_CurrentX]
        pop     edx ecx eax
        return
endp


proc DrawFillRect, .raster, .x, .y, .width, .height, .color
begin
        push    eax ecx edx
        stdcall _FixGC
        cinvoke XSetForeground, [hApplicationDisplay], [_DefaultGC], [.color]
        cinvoke XFillRectangle, [hApplicationDisplay], [.raster], [_DefaultGC], [.x], [.y], [.width], [.height]
        pop     edx ecx eax
        return
endp



macro Outline [type, x, y] {
  common
local ..types, ..points, ..count
     dd  ..count
     dd  ..types
     dd  ..points
  common
    label ..types byte
  forward
     db type
  common
    label ..points dword
  forward
    dd  x
    dd  y
}



proc Draw, .raster, .pDrawPoints
begin

        return
endp

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































Added freshlib/graphics/Linux/fonts.asm.









































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Fonts managing library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


iglobal
  if used FontAttr.mono | used FontAttr.size | used FontAttr.weight | used FontAttr.italic
    label FontAttr byte
    .mono db ':spacing=mono', 0
    .size db ':pixelsize=', 0
    .weight db ':weight=', 0
    .italic db ':slant=italic', 0
    .regular db ':slant=roman', 0


;fwLight     = 0
;fwDemilight = 1
;fwNormal    = 2
;fwMedium    = 3
;fwDemibold  = 4
;fwBold      = 5
;fwExtraBold = 6
;fwBlack     = 7

    .font_weights db 0, 55, 80, 100, 180, 200, 205, 210
  end if
endg


;initialize InitFonts
;begin
;        cinvoke FcInit
;        return
;endp
;
;
;finalize FinalizeFonts
;begin
;        cinvoke FcFini
;        return
;endp



proc FTCRequester as FT_Face_Requester
.res dd ?
.idx dd ?
.face dd ?
begin
        pushad

        mov     esi, [.face_id]

        stdcall StrDup, [esi+__TFont.hFontFace]
        mov     ebx, eax

        test    [esi+__TFont.flags], ffMonospaced
        jz      @f
        stdcall StrCat, ebx, FontAttr.mono
@@:
        mov     eax, [esi+__TFont.weight]
        and     eax, 7
        movzx   eax, byte [FontAttr.font_weights+eax]

        stdcall StrCat, ebx, FontAttr.weight
        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        push    eax
        stdcall StrCat, ebx, eax
        stdcall StrDel ; from the stack

        mov     eax, FontAttr.regular
        test    [esi+__TFont.flags], ffItalic
        jz      @f
        mov     eax, FontAttr.italic
@@:
        stdcall StrCat, ebx, eax
        stdcall StrPtr, ebx

;        OutputLn eax

        cinvoke FcNameParse, eax
        stdcall StrDel, ebx

        test    eax, eax
        jnz     @f

        cinvoke FcNameParse, txt "Helvetica"
        DebugMsg "Error: Bad pattern fallback."

@@:
        mov     ebx, eax

        cinvoke FcDefaultSubstitute, ebx
        cinvoke FcConfigSubstitute, 0, ebx, 0

        lea     eax, [.res]
        cinvoke FcFontMatch, 0, ebx, eax
        push    eax

        cinvoke FcPatternDestroy, ebx
        pop     ebx

;        if defined options.DebugMode & options.DebugMode
;          cinvoke FcPatternPrint, ebx
;        end if

        lea     eax, [.res]
        cinvoke FcPatternGetString, ebx, FC_FILE, 0, eax

        OutputLn [.res]

        lea     eax, [.idx]
        cinvoke FcPatternGetInteger, ebx, FC_INDEX, 0, eax

        mov     edi, [.pFace]
        mov     eax, [.res]
        cinvoke FT_New_Face, [FTLibrary], eax, [.idx], edi

.finish:
        mov     [esp+4*regEAX], eax
        cinvoke FcPatternDestroy, ebx
        popad
        cret
endp



FC_FILE text 'file'
FC_INDEX text 'index'
FC_PIXEL_SIZE  text 'pixelsize'



body FontCreate
begin
        push    edx

        stdcall GetMem, sizeof.__TFont
        mov     edx, eax

        stdcall StrDup, [.font_name]
        mov     [edx+__TFont.hFontFace], eax

        mov     eax, [.size]
        mov     [edx+__TFont.height], eax
        mov     eax, [.weight]
        mov     [edx+__TFont.weight], eax
        mov     eax, [.flags]
        mov     [edx+__TFont.flags], eax

        mov     eax, edx
        pop     edx
        return
endp



body FontDestroy
begin
        pushad
        mov     edi, [.pFont]

        cinvoke FTC_Manager_RemoveFaceID, [FTCManager], edi
        stdcall StrDel, [edi+__TFont.hFontFace]
        stdcall FreeMem, edi

        popad
        return
endp


; returns some font metrics
;
; Arguments:
;    .font - the font
; Returns:
;    EAX - the line height of the font.
;    EBX - the ascender of the font.
;    EDX - the descender of the font.

body GetFontMetrics
.face    dd ?
.scaler  FTC_ScalerRec
.size    dd ?
begin
        push    esi ecx

        mov     edx, [.font]
        mov     ecx, [edx+__TFont.height]
        xor     eax, eax

        mov     [.scaler.face_id], edx
        mov     [.scaler.width], eax
        mov     [.scaler.height], ecx

        mov     [.scaler.pixel], 1
        mov     [.scaler.x_res], eax
        mov     [.scaler.y_res], eax

        lea     eax, [.scaler]
        lea     edx, [.size]
        cinvoke FTC_Manager_LookupSize, [FTCManager], eax, edx
        test    eax, eax
        jnz     .error

.size_found:
        mov     edx, [.size]
        mov     eax, [edx+FT_SizeRec.metrics.height]
        mov     ebx, [edx+FT_SizeRec.metrics.ascender]
        mov     edx, [edx+FT_SizeRec.metrics.descender]

        sar     eax, 6
        sar     ebx, 6
        sar     edx, 6

.finish:
        clc
        pop     ecx esi
        return

.error:
        OutputValue "FTC_Manager_LookupSize error: $", eax, 16, -1

        lea     eax, [.face]
        cinvoke FTC_Manager_LookupFace, [FTCManager], [.font], eax
        test    eax, eax
        jnz     .fall_back

        mov     edx, [.face]
        mov     esi, [edx+FT_FaceRec.num_fixed_sizes]
        dec     esi
        js      .fall_back

        imul    esi, sizeof.FT_Bitmap_Size
        add     esi, [edx+FT_FaceRec.available_sizes]

        movzx   eax, [esi+FT_Bitmap_Size.height]

        mov     [.scaler.height], eax
        mov     edx, [.font]
        mov     [edx+__TFont.height], eax

        lea     eax, [.scaler]
        lea     edx, [.size]
        cinvoke FTC_Manager_LookupSize, [FTCManager], eax, edx
        test    eax, eax
        jz      .size_found

; Very stupid fallback.
        movzx   eax, [esi+FT_Bitmap_Size.height]
        mov     edx, -2
        lea     ebx, [eax-2]
        jmp     .finish

; Event more stupid fallback...
.fall_back:
        mov     eax, 1
        mov     ebx, 1
        mov     edx, 1
        jmp     .finish
endp



struct _FcFontSet
  .nFont dd ?
  .sFont dd ?
  .pList dd ?
ends


body GetFontList ;, .font
.pPat dd ?   ; pattern
.pOs  dd ?   ; object set
.res  dd ?
begin
        pushad
        stdcall CreateArray, 4
        mov     edi, eax

        mov     esi, [.font]

        cinvoke FcPatternCreate
        mov     [.pPat], eax

        cinvoke FcObjectSetBuild, txt "family", 0
        mov     [.pOs], eax

        cinvoke FcFontList, 0, [.pPat], [.pOs]
        mov     esi, eax
        mov     ebx, [esi+_FcFontSet.pList]
        mov     ecx, [esi+_FcFontSet.nFont]

.loop:
        dec     ecx
        js      .end_loop

        push    ecx

        lea     eax, [.res]
        cinvoke FcPatternGetString, [ebx], txt "family", 0, eax
        pop     ecx

        test    eax, eax
        jnz     .next

        call    .search_list
        jc      .next

        stdcall StrDupMem, [.res]     ; Some font structure???
        push    eax

        stdcall AddArrayItems, edi, 1
        mov     edi, edx
        pop     dword [eax]

.next:
        lea     ebx, [ebx+4]
        jmp     .loop

.end_loop:
        cinvoke FcFontSetDestroy, esi
        cinvoke FcObjectSetDestroy, [.pOs]
        cinvoke FcPatternDestroy, [.pPat]

        stdcall SortArray, edi, StrCompSort, FALSE

        mov     [esp+4*regEAX], edi
        popad
        return

; Returns CF = 1 if the string is already in the list.
.search_list:
        push    ecx
        mov     ecx, [edi+TArray.count]
        clc
.sloop:
        dec     ecx
        js      .ends   ; CF here is always 0

        stdcall StrCompNoCase, [.res], [edi+TArray.array+4*ecx]
        jnc     .sloop
.ends:
        pop     ecx
        retn
endp

Changes to freshlib/graphics/Linux/images.asm.














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


























































































































; only 16, 24 and 32 bpp are supported.
; It is stupid to support palleted modes and even 24bpp is not good...


proc CreateImage, .width, .height, .bpp

.scanline dd ?







begin
        push    ebx ecx edx esi

        stdcall GetMem, sizeof.TImage
        jc      .finish

        mov     esi, eax
        push    [.width] [.height] [.bpp]
        pop     [esi+TImage.bpp] [esi+TImage.height] [esi+TImage.width]



; allocate image data

        mov     ecx, [.bpp]
        mov     eax, [.height]

        shr     ecx, 3
        imul    ecx, [.width]

        add     ecx, 3

        and     ecx, $fffffffc  ; align scanline to dword.














        imul    eax, ecx
        mov     [.scanline], ecx







        stdcall GetMem, eax
        jc      .error_free

        mov     [esi+TImage.pData], eax




        cinvoke XDefaultVisual, [hApplicationDisplay], 1

        cinvoke XCreateImage, [hApplicationDisplay], eax, [.bpp], XYPixmap, 0, [esi+TImage.pData], [.width], [.height], 32, [.scanline]



        mov     [esi+TImage.raster], eax



















        clc
        mov     eax, esi
.finish:
        pop     esi edx ecx ebx
        return

.error_free:

        stdcall FreeMem, esi
        stc
        jmp     .finish







endp




proc DestroyImage, .ptrImage

begin





























































        push    eax ecx edx esi

















































































































        mov     esi, [.ptrImage]


        cinvoke XDestroyImage, [esi+TImage.raster]



;        stdcall FreeMem, [esi+TImage.pData]


        stdcall FreeMem, esi














        pop     esi edx ecx eax















































        return
endp















proc DrawImage, .raster, .pImage, .x, .y



begin

        push    eax ecx edx esi edi



















































































        mov     esi, [.pImage]



































        stdcall _FixGC

;        cinvoke XPutImage, [hApplicationDisplay], [.raster], [_DefaultGC], [esi+TImage.raster], 0, 0, [.x], [.y], [esi+TImage.width], [esi+TImage.height]





        stdcall OutputRegister, regEAX, 16


        stdcall DrawFillRect, [.raster], [.x], [.y], [esi+TImage.width],[esi+TImage.height], $00ff00


        pop     edi esi edx ecx eax


        return
endp














































































































>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
>
>
|
>
|
>
>
>
>
>
>
>

|

|

<

<
<

>
>
|

|
|
>
|
|
>
|
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
>
>
>
>
>

>
|
|
>
|

>
>
>
|
>
|
>
>
>
|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|

|


|
>



>
>
>
>
>
>
>



>
>
|
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|

>
|
>
>
>
|
>
>
|
>
>

>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


>
>
>
>
>
>
>
>
>

>

>
>
>
|
>
>
>
|
>
|
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
>
>

>
>
|
>
>
|
>
>
|
>
>
|


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Memory based images manipulation library.
;
;  Target OS: Linux
;
;  Dependencies: memory.asm
;
;  Notes:
;_________________________________________________________________________________________


struct TLinuxImage
  . TImage

; os dependent data
  .readonly dd ?
  .shmSeg   dd ?
  .shmID    dd ?
ends


body CreateImage2
.atch __xShmAttachReq
begin
        pushad

        stdcall GetMem, sizeof.TLinuxImage
        jc      .finish

        mov     esi, eax



        xor     eax, eax
        xor     ebx, ebx
        inc     eax

        mov     ecx, [.width]
        mov     edx, [.height]

        test    ecx, ecx
        cmovz   ecx, eax

        cmp     edx, ebx
        cmovle  edx, eax

        mov     [esi+TLinuxImage.width], ecx
        mov     [esi+TLinuxImage.height], edx

        mov     [esi+TLinuxImage.orgX], ebx
        mov     [esi+TLinuxImage.orgY], ebx
        mov     [esi+TLinuxImage.wrapW], ecx
        mov     [esi+TLinuxImage.wrapH], edx

        mov     [esi+TLinuxImage.shmSeg], ebx
        mov     [esi+TLinuxImage.shmID], ebx

        mov     [esi+TLinuxImage.readonly], ebx

        lea     eax, [4*ecx]
        imul    eax, edx

        cmp     [flagSharedMemory], 0
        je      .fall_back

        cmp     [.fScreen], 0
        je      .fall_back

        cinvoke shmget, IPC_PRIVATE, eax, IPC_CREAT or 666o
        test    eax, eax
        js      .error

        mov     [esi+TLinuxImage.shmID], eax

        cinvoke shmat, eax, 0, 0
        cmp     eax, -1
        je      .error

        mov     [esi+TLinuxImage.pPixels], eax

        cinvoke shmctl, [esi+TLinuxImage.shmID], IPC_RMID, 0

        stdcall xGetID, appConn, esi
        mov     [esi+TLinuxImage.shmSeg], eax

        mov     ecx, [appConn.exShm.OpCode]
        mov     edx, [esi+TLinuxImage.shmID]
        mov     [.atch.op], cl
        mov     [.atch.minor], opShmAttach
        mov     [.atch.length], sizeof.__xShmAttachReq/4
        mov     [.atch.shmSeg], eax
        mov     [.atch.shmID], edx
        mov     [.atch.read_only], 0

        lea     eax, [.atch]
        stdcall xSend, appConn, eax

.exit_ok:
        mov     [esp+4*regEAX], esi

        lea     esi, [esi+TLinuxImage.lock]
        stdcall MutexCreate, 0, esi
        stdcall MutexRelease, esi
        clc

.finish:
        popad
        return

.error:
;        int3
        stdcall FreeMem, esi
        stc
        jmp     .finish

.fall_back:
        stdcall GetMem, eax
        mov     [esi+TLinuxImage.pPixels], eax
        test    eax, eax
        jz      .error
        jmp     .exit_ok
endp




body DestroyImage
.dtch __xShmDetachReq
begin
        pushad

        mov     esi, [.ptrImage]
        test    esi, esi
        jz      .finish

.lock_wait:
        stdcall LockImg, esi
        jc      .lock_wait     ; possible hang!


        mov     edx, [esi+TLinuxImage.shmSeg]
        test    edx, edx
        jz      .fall_back

        mov     eax, [appConn.exShm.OpCode]
        mov     [.dtch.op], al
        mov     [.dtch.minor], opShmDetach
        mov     [.dtch.length], sizeof.__xShmDetachReq/4
        mov     [.dtch.shmSeg], edx

;        DebugMsg
;        OutputValue "Dettach ShmID: ", [esi+TLinuxImage.shmID], 16, 8
;        OutputValue "  Shm address: ", [esi+TLinuxImage.pPixels], 16, 8

        lea     eax, [.dtch]
        stdcall xSend, appConn, eax

;        OutputValue "DestroyImage Sequence: ", [appConn.Sequence], 10, -1
;        DebugMsg

        xor     eax, eax
        xchg    eax, [esi+TLinuxImage.pPixels]
        cinvoke shmdt, eax
        test    eax, eax
        jz      @f
        int3
@@:
        stdcall xFreeID, appConn, [esi+TLinuxImage.shmSeg]

.exit_ok:
        lea     edi, [esi+TLinuxImage.lock]
        stdcall MutexDestroy, edi
        stdcall FreeMem, esi

.finish:
        popad
        return


.fall_back:
        xor     eax, eax
        xchg    eax, [esi+TLinuxImage.pPixels]
        stdcall FreeMem, eax
        jmp     .exit_ok
endp



body LockImg    ;, .pImage
begin
        push    eax edx

        mov     edx, [.pImage]
        lea     eax, [edx+TLinuxImage.lock]
        stdcall WaitForMutex, eax, -1

        pop     edx eax
        return
endp



body UnlockImg  ;, .pImage
begin
        push    eax
        mov     eax, [.pImage]
        test    eax, eax
        jz      .unlocked

        lea     eax, [eax+TLinuxImage.lock]
        stdcall MutexRelease, eax

.unlocked:
        clc
        pop     eax
        return
endp




body DrawImageRect

.maskUL RECT ; upper left
.maskUR RECT ; upper right
.maskLL RECT ; lower left
.maskLR RECT ; lower right

.sRect  RECT ; the rectangle used for intersecting the source rectangle.

.fDraw   rd 1

begin
        pushad

        mov     esi, [.pImage]
        test    esi, esi
        jz      .finish

        lea     eax, [esi+TImage.lock]
        stdcall WaitForMutex, eax, -1
        jc      .finish


        inc     [esi+TLinuxImage.readonly]

        xor     eax, eax
        mov     [.fDraw], eax

        mov     ecx, [esi+TImage.wrapW]
        mov     edx, [esi+TImage.wrapH]

        mov     [.maskUL.left], eax     ; UL
        mov     [.maskUL.top], eax      ; UL
        mov     [.maskLL.left], eax             ; LL
        mov     [.maskUR.top], eax                      ; UR

        mov     [.maskUL.right], ecx    ; UL
        mov     [.maskUL.bottom], edx   ; UL
        mov     [.maskLR.left], ecx                             ; LR
        mov     [.maskLR.top], edx                              ; LR
        mov     [.maskLL.top], edx              ; LL
        mov     [.maskLL.right], ecx            ; LL
        mov     [.maskUR.left], ecx                     ; UR
        mov     [.maskUR.bottom], edx                   ; UR

        shl     ecx, 1
        shl     edx, 1

        mov     [.maskUR.right], ecx                    ; UR
        mov     [.maskLL.bottom], edx                   ; LL
        mov     [.maskLR.right], ecx                            ; LR
        mov     [.maskLR.bottom], edx                           ; LR

        mov     ecx, [.xSrc]
        mov     edx, [.ySrc]
        mov     [.sRect.left], ecx
        mov     [.sRect.top], edx
        add     ecx, [.width]
        add     edx, [.height]
        mov     [.sRect.right], ecx
        mov     [.sRect.bottom], edx

        lea     eax, [.sRect]
        lea     edx, [.maskUL]
        stdcall RectIntersect2, eax, edx
        jc      .exit

; at least some part of the image, has to be drawn.

        mov     ebx, [esi+TImage.orgX]
        mov     edx, [esi+TImage.orgY]

        add     [.sRect.left], ebx
        add     [.sRect.top], edx
        add     [.sRect.right], ebx
        add     [.sRect.bottom], edx

        mov     ebx, [esi+TImage.wrapW]
        mov     edx, [esi+TImage.wrapH]

        lea     edi, [.maskUL]
        lea     ecx, [.sRect]

        mov     eax, 3

.loop_rect:

        stdcall RectIntersect2, edi, ecx
        cmc
        rcl     [.fDraw], 1

        test    eax, 1  ; horizontal
        jnz     .h_ok

        sub     [edi+RECT.left], ebx
        sub     [edi+RECT.right], ebx

.h_ok:
        test    eax, 2 ; vertical
        jnz     .v_ok

        sub     [edi+RECT.top], edx
        sub     [edi+RECT.bottom], edx

.v_ok:
        stdcall RectToBounds, edi, edi

        add     edi, sizeof.RECT
        dec     eax
        jns     .loop_rect

; Now draw the rectangles.


        lea     ebx, [.maskLR]
        mov     edi, 3

.draw_loop:
        shr     [.fDraw], 1
        jnc     .next

        setz    cl              ; is it the last rectangle to draw?
        movzx   ecx, cl

        mov     eax, [.xDst]
        mov     edx, [.yDst]

        test    edi, 1
        jz      .x_ok
        add     eax, [.maskUL.right]
.x_ok:
        test    edi, 2
        jz      .y_ok
        add     edx, [.maskUR.bottom]
.y_ok:

        stdcall xPutImage, [.where], esi, [ebx+RECT.left], [ebx+RECT.top], eax, edx, [ebx+RECT.right], [ebx+RECT.bottom], ecx

.next:
        cmp     [.fDraw], 0
        je      .end_draw

        sub     ebx, sizeof.RECT
        dec     edi
        jns     .draw_loop

.end_draw:
        cmp     [esi+TLinuxImage.shmSeg], 0      ; The image will be unlocked elsewhere, when the X server finish drawing.
        jne     .finish

.exit:
        mov     [esi+TLinuxImage.readonly], 0

.finish:
        stdcall UnlockImg, esi
        popad
        return
endp


proc xPutImage, .drawable, .image, .srcX, .srcY, .dstX, .dstY, .width, .height, .events
.shm __xShmPutImageReq
.put __xPutImageReq
.gc  __xCreateContextReq
.fc  __xFreeContextReq
begin
        pushad

        mov     esi, [.image]

        mov     ecx, [esi+TLinuxImage.shmSeg]
        test    ecx, ecx
        jz      .fall_back

        mov     ebx, [.drawable]
        stdcall xGetObj, appConn, ebx
        jc      .finish

        mov     edx, [eax+TWindow.context]

        mov     eax, [appConn.exShm.OpCode]

        mov     [.shm.op], al
        mov     [.shm.minor], opShmPutImage
        mov     [.shm.length], sizeof.__xShmPutImageReq/4
        mov     [.shm.drawable], ebx
        mov     [.shm.context], edx
        mov     [.shm.shmSeg], ecx
        mov     [.shm.offset], 0

        mov     eax, [esi+TLinuxImage.width]
        mov     ebx, [esi+TLinuxImage.height]
        mov     [.shm.total_w], ax
        mov     [.shm.total_h], bx

        mov     eax, [.srcX]
        mov     ebx, [.srcY]
        mov     ecx, [.width]
        mov     edx, [.height]
        mov     [.shm.src_x], ax
        mov     [.shm.src_y], bx
        mov     [.shm.src_w], cx
        mov     [.shm.src_h], dx

        mov     eax, [.dstX]
        mov     ebx, [.dstY]
        mov     ecx, [.events]
        mov     [.shm.dst_x], ax
        mov     [.shm.dst_y], bx
        mov     [.shm.depth], $20
        mov     [.shm.format], ZPixmap
        mov     [.shm.send_event], cl

        lea     eax, [.shm]
        stdcall xSend, appConn, eax

.finish:
        popad
        return

.fall_back:
        mov     [.gc.op], 0
        mov     [.fc.op], 0

        mov     [.put.op], opPutImage
        mov     [.put.format], ZPixmap
        mov     [.put.length], 0

        mov     ebx, [.drawable]
        stdcall xGetObj, appConn, ebx
        jc      .finish

        cmp     eax, objPixmap
        jne     .window

        call    .create_context
        jmp     .context_ok

.window:
        mov     eax, [eax+TWindow.context]

.context_ok:
        mov     [.put.drawable], ebx
        mov     [.put.gc], eax

        mov     ecx, [.width]
        mov     edx, [.height]
        mov     eax, [.dstX]
        mov     ebx, [.dstY]

        mov     [.put.width], cx
        mov     [.put.height], dx

        imul    ecx, edx
        add     ecx, sizeof.__xPutImageReq/4
        mov     [.put.long_len], ecx

        mov     [.put.dst_x], ax
        mov     [.put.dst_y], bx
        mov     [.put.left_pad], 0
        mov     [.put.depth], $20

        mov     ebx, [.image]
        mov     esi, [ebx+TImage.pPixels]
        mov     eax, [.srcY]
        mov     edx, [ebx+TImage.width]

        imul    eax, edx
        add     eax, [.srcX]
        lea     esi, [esi+4*eax]

        mov     ecx, [.width]
        shl     ecx, 2

        mov     ebx, [.height]

        stdcall xReqStart, appConn

        lea     eax, [.put]
        stdcall xReqSend, appConn, eax, sizeof.__xPutImageReq

.row_loop:
        stdcall xReqSend, appConn, esi, ecx
        lea     esi, [esi+4*edx]
        dec     ebx
        jnz     .row_loop

        stdcall xReqEnd, appConn

        cmp     [.fc.op], 0
        je      .finish

        lea     eax, [.fc]
        stdcall xSend, appConn, eax
        stdcall xFreeID, appConn, [.fc.gcID]

        jmp     .finish

.create_context:
        stdcall xGetID, appConn, objContext
        mov     edx, [.drawable]

        mov     [.gc.op], opCreateGC
        mov     [.fc.op], opFreeGC

        mov     [.gc.length], sizeof.__xCreateContextReq/4
        mov     [.fc.length], sizeof.__xFreeContextReq/4

        mov     [.gc.gcID], eax
        mov     [.fc.gcID], eax

        mov     [.gc.drawable], edx
        mov     [.gc.value_mask], 0 ; foreground and background

        lea     edx, [.gc]
        stdcall xSend, appConn, edx
        retn
endp




proc __xPutImageToBitmap, .pixmap, .image, .srcX, .srcY, .dstX, .dstY, .width, .height
.gc   __xCreateContextReq
.fc   __xFreeContextReq
.put  __xPutImageShortReq
.data dd ?
begin
        pushad

; create graphic context.

        stdcall xGetID, appConn, objContext
        mov     edx, [.pixmap]

        mov     [.gc.op], opCreateGC
        mov     [.fc.op], opFreeGC

        mov     [.gc.length], sizeof.__xCreateContextReq/4
        mov     [.fc.length], sizeof.__xFreeContextReq/4

        mov     [.gc.gcID], eax
        mov     [.fc.gcID], eax
        mov     [.put.gc], eax

        mov     [.gc.drawable], edx
        mov     [.put.drawable], edx

        mov     [.gc.value_mask], 0 ; foreground and background

        lea     edx, [.gc]
        stdcall xSend, appConn, edx

; put the image

        mov     eax, [.width]
        add     eax, 31
        and     eax, $ffffffe0
        mov     edx, [.height]
        mov     ecx, eax
        imul    ecx, edx
        shr     ecx, 5
        add     ecx, 6

        mov     [.put.op], opPutImage
        mov     [.put.format], 0        ;
        mov     [.put.length], cx
        mov     [.put.width], ax
        mov     [.put.height], dx

        mov     eax, [.dstX]
        mov     edx, [.dstY]

        mov     [.put.dst_x], ax
        mov     [.put.dst_y], dx
        mov     [.put.left_pad], 0
        mov     [.put.depth], 1

        stdcall xReqStart, appConn
        lea     eax, [.put]
        stdcall xReqSend, appConn, eax, sizeof.__xPutImageShortReq

        mov     esi, [.image]
        mov     eax, [.srcY]
        mov     edx, [.srcX]
        imul    eax, [esi+TImage.width]
        add     edx, eax
        lea     edx, [4*edx]
        add     edx, [esi+TImage.pPixels]

        mov     edi, [.height]

.loopy:
        xor     ecx, ecx
        mov     ebx, [.width]

.loopx:
        cmp     byte [edx+4*ecx], $80
        rcr     [.data], 1

        inc     ecx
        dec     ebx

        test   ebx, $1f
        jnz    .loopx

        lea     eax, [.data]
        stdcall xReqSend, appConn, eax, 4

        test    ebx, ebx
        jnz    .loopx

        mov     eax, [esi+TImage.width]
        lea     edx, [edx+4*eax]

        dec     edi
        jnz     .loopy

        stdcall xReqEnd, appConn

; free the context
        lea     eax, [.fc]
        stdcall xSend, appConn, eax
        stdcall xFreeID, appConn, [.fc.gcID]

        popad
        return
endp

Changes to freshlib/graphics/Linux/text.asm.


















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























uglobal







  _TextColor  _XftColor























































































endg





























































initialize InitText


























































































begin

        mov     [_TextColor.color.alpha], $ffff





































































        return
endp




proc DrawString, .raster, .ptrString, .len, .x, .y, .font
  .extents _XGlyphInfo







begin

        push    eax ebx ecx edx esi





        cmp     [.font], 0

        jne     @f


















        mov     eax, [_SystemFont]
        mov     [.font], eax


@@:
        lea     esi, [.extents]


        cinvoke   XftTextExtents8, [hApplicationDisplay], [.font], [.ptrString], [.len], esi



        cinvoke XDefaultVisual, [hApplicationDisplay], 0


        cinvoke XftDrawCreate, [hApplicationDisplay], [.raster], eax, 0
        mov     ebx, eax

        cinvoke XftDrawString8, ebx, _TextColor, [.font], [.x], [.y], [.ptrString], [.len]

        cinvoke XftDrawDestroy, ebx







        pop     esi edx ecx ebx ax











        return
endp























proc GetTextBounds, .raster, .ptrString, .len, .font
.extents _XGlyphInfo












begin
        push    esi ecx















        cmp     [.font], 0



































        jne     @f


















        mov     eax, [_SystemFont]








































        mov     [.font], eax




































@@:















































        lea     esi, [.extents]

        cinvoke   XftTextExtents8, [hApplicationDisplay], [.font], [.ptrString], [.len], esi













        movzx   eax, [esi+_XGlyphInfo.xOff]


        movzx   edx, [esi+_XGlyphInfo.height]























        add     edx, 2


























        pop     ecx esi


        return



endp




























proc GetTextOffset, .raster, .ptrString, .len, .font









.extents _XGlyphInfo
begin



        push    esi ecx




























        cmp     [.font], 0

        jne     @f













        mov     eax, [_SystemFont]



        mov     [.font], eax


































@@:
        lea     esi, [.extents]


        cinvoke   XftTextExtents8, [hApplicationDisplay], [.font], [.ptrString], [.len], esi
















        movzx   eax, [esi+_XGlyphInfo.x]


        movzx   edx, [esi+_XGlyphInfo.y]











        pop     ecx esi

























        return



endp






>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





>
|
|
>
>
>
>
>
>
>

>
|
>
>

>
>
|
>
|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|

>
|
|
>
>
|
>
>

|
>
>
|
|

|
>
|
>
>

>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>





>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
>
>
>
>
>
>
>
>
>
>
>
>

|
>
>
>
>
>

>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
>

>
>
>
>
>
>
>
>
>
>
>
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
|
>
>
>
|
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
|
>
>
>
>
>
>
>
>
>
|
|
>
>
>
|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
>
>
>
>
>
>
>
>
>
>

>
>
|
>
>
>
|
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
|
>
>
|
>
>

>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>

>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Text drawing library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes: Uses XFT library to renter the text.
;_________________________________________________________________________________________

uses libFT, libFC


iglobal
if used FTLoadFlags
  FTLoadFlags   dd FT_LOAD_RENDER or FT_LOAD_COLOR or FT_LOAD_TARGET_LCD or FT_LOAD_TARGET_LIGHT
                dd FT_LOAD_RENDER or FT_LOAD_COLOR or FT_LOAD_TARGET_NORMAL
                dd FT_LOAD_RENDER or FT_LOAD_COLOR or FT_LOAD_TARGET_MONO
                dd FT_LOAD_RENDER or FT_LOAD_COLOR or FT_LOAD_TARGET_LCD_V
end if
endg



body DrawDecomposedString      ;, .pImage, .pArray, .x, .y, .font, .color
.scaler  FTC_ScalerRec
.glyph   dd ?

.startX  dd ?

.flags   dd ?
begin
        pushad

        stdcall LockImg, [.pImage]
        jc      .exit

        mov     eax, [TextRenderOptions]
        and     eax, 3
        mov     eax, [FTLoadFlags+4*eax]
        mov     [.flags], eax

        mov     edx, [.font]
        xor     ecx, ecx

        mov     [.scaler.face_id], edx
        mov     [.scaler.width], ecx

        mov     eax, [edx+__TFont.height]
        inc     ecx

        mov     [.scaler.height], eax
        mov     [.scaler.pixel], ecx    ; ecx = 1

        mov     eax, [.x]
        mov     [.startX], eax

        mov     esi, [.pArray]
        xor     edi, edi
        dec     edi

.char_loop:
        inc     edi
        cmp     edi, [esi+TArray.count]
        jae     .finish

        cmp     word [esi+TArray.array+8*edi+TTextChar.width], 0
        je      .char_ok

        cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, [esi+TArray.array+8*edi+TTextChar.code]

        lea     ecx, [.scaler]
        lea     edx, [.glyph]
        cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [.flags], eax, edx, 0

        test    eax, eax
        jnz     .char_ok

        mov     ebx, [.glyph]
        mov     ecx, [.x]
        mov     edx, [.y]

        add     ecx, [ebx+FT_BitmapGlyphRec.left]
        sub     edx, [ebx+FT_BitmapGlyphRec.top]

        lea     eax, [ebx+FT_BitmapGlyphRec.bitmap]
        stdcall __DrawGlyph, [.pImage], eax, ecx, edx, [.color]

        movzx   eax, word [esi+TArray.array+8*edi+TTextChar.width]
        add     [.x], eax

.char_ok:
; check for new line.
        movzx   eax, word [esi+TArray.array+8*edi+TTextChar.height]
        test    eax, eax
        jz      .char_loop

        add     [.y], eax
        mov     eax, [.startX]
        mov     [.x], eax
        jmp     .char_loop


.finish:
        stdcall UnlockImg, [.pImage]

.exit:
        popad
        return
endp




; Draws the string on the image using the specified font and color.
; The string is drawn in one line. The control symbols are not
; processed. The tabs are not expanded or replaced with spaces.
;
; Arguments:
;    .pImage  - pointer to the image where to draw the text.
;    .pString - pointer to a UTF-8 string.
;    .len     - how many bytes from the string to be drawn. If -1, the whole string will be drawn.
;    .x       - X coordinate, where to start drawing.
;    .y       - Y coordinate of the baseline where to draw the string.
;    .font    - the font to be used.
;    .color   - ARGB color to draw the glyphs.
;
;;;;;;;; Returns:
;;;;;;;;    EAX - the width of the string in pixels.
;;;;;;;;    EBX - the ascender of the string.
;;;;;;;;    EDX - the height of the string in pixels.


body DrawString ;, .pImage, .pString, .len, .x, .y, .font, .color

.scaler  FTC_ScalerRec
.glyph   dd ?

.miny    dd ?
.maxy    dd ?
.startX  dd ?

.flags   dd ?

begin
        pushad

        stdcall LockImg, [.pImage]
        jc      .exit

        mov     eax, [TextRenderOptions]
        and     eax, 3
        mov     eax, [FTLoadFlags+4*eax]
        mov     [.flags], eax

        mov     edx, [.font]
        xor     ecx, ecx

        mov     [.scaler.face_id], edx
        mov     [.scaler.width], ecx

        mov     eax, [edx+__TFont.height]
        inc     ecx

        mov     [.scaler.height], eax
        mov     [.scaler.pixel], ecx    ; ecx = 1

        ror     ecx, 1                  ; ecx = $80000000
        mov     [.maxy], ecx
        dec     ecx
        mov     [.miny], ecx            ; ecx = $7fffffff

        mov     eax, [.x]
        mov     [.startX], eax

        mov     esi, [.pString]

.char_loop:

        stdcall DecodeUtf8, [esi]
        jc      .finish

        add     esi, edx

        sub     [.len], edx
        jc      .finish

        test    eax, eax
        jz      .finish

        cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax

        lea     ecx, [.scaler]
        lea     edx, [.glyph]
        cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [.flags], eax, edx, 0

        test    eax, eax
        jnz     .char_loop

        mov     ebx, [.glyph]

        mov     ecx, [.x]
        mov     edx, [.y]

        add     ecx, [ebx+FT_BitmapGlyphRec.left]
        sub     edx, [ebx+FT_BitmapGlyphRec.top]

        cmp     edx, [.miny]
        jge     @f
        mov     [.miny], edx
@@:
        mov     eax, edx
        add     eax, [ebx+FT_BitmapGlyphRec.bitmap.rows]
        cmp     eax, [.maxy]
        jle     @f
        mov     [.maxy], eax
@@:
        lea     eax, [ebx+FT_BitmapGlyphRec.bitmap]
        stdcall __DrawGlyph, [.pImage], eax, ecx, edx, [.color]

        mov     eax, [ebx+FT_BitmapGlyphRec.root.advance.x]
        sar     eax, 16        ; format 16.16 fixed decimal point.
        add     [.x], eax

        jmp     .char_loop


.finish:
        stdcall UnlockImg, [.pImage]

        mov     eax, [.x]
        mov     ebx, [.miny]
        mov     edx, [.maxy]

        sub     eax, [.startX]
        sub     edx, ebx
        sub     ebx, [.y]

        neg     ebx

        mov     [esp+4*regEAX], eax
        mov     [esp+4*regEBX], ebx
        mov     [esp+4*regEDX], edx

.exit:
        popad
        return
endp



; returns:
;   EAX - TArray of TTextChar with decomposed string.
;   EDX - maximal bearing_Y of the string.
;   ECX - maximal descender of the string.

body TextDecompose      ;, .hString, .font

  .scaler  FTC_ScalerRec
  .glyph   dd ?
  .flags   dd ?

begin
        pushad

        mov     eax, [TextRenderOptions]
        and     eax, 3
        mov     eax, [FTLoadFlags+4*eax]
        mov     [.flags], eax

        mov     edx, [.font]
        xor     ecx, ecx

        mov     [.scaler.face_id], edx
        mov     [.scaler.width], ecx

        mov     eax, [edx+__TFont.height]
        inc     ecx

        mov     [.scaler.height], eax
        mov     [.scaler.pixel], ecx    ; ecx = 1

        stdcall StrPtr, [.hString]
        mov     esi, eax

        stdcall CreateArray, sizeof.TTextChar
        mov     edi, eax

.char_loop:
        stdcall DecodeUtf8, [esi]
        jc      .finish

        add     esi, edx
        mov     ebx, eax

        test    eax, eax
        jz      .end

        cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax

        lea     ecx, [.scaler]
        lea     edx, [.glyph]
        cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [.flags], eax, edx, 0

        xor     ecx, ecx

        test    eax, eax
        jnz     .glyph_size_ok  ; zero width glyph ????

        mov     ecx, [.glyph]

        mov     eax, [ecx+FT_BitmapGlyphRec.top]
        neg     eax

        add     eax, [ecx+FT_BitmapGlyphRec.bitmap.rows]

        mov     ecx, [ecx+FT_BitmapGlyphRec.root.advance.x]  ; format 16.16 fixed decimal point.
        sar     ecx, 16   ; format 16.16


.glyph_size_ok:

        stdcall AddArrayItems, edi, 1
        mov     edi, edx
        mov     dword [eax+TTextChar.width], ecx
        mov     [eax+TTextChar.code],  ebx
        jmp     .char_loop

.end:
        clc

.finish:
        mov     [esp+4*regEAX], edi
        popad
        return
endp



; Returns an array with the widths from the begining of the text to the every character inside the string.


proc GetTextWidthsArray, .hString, .font

  .scaler  FTC_ScalerRec
  .glyph   dd ?

  .x       dd ?

begin
        pushad

        mov     edx, [.font]
        xor     ecx, ecx

        mov     [.scaler.face_id], edx
        mov     [.scaler.width], ecx

        mov     eax, [edx+__TFont.height]
        inc     ecx

        mov     [.scaler.height], eax
        mov     [.scaler.pixel], ecx    ; ecx = 1


        stdcall StrPtr, [.hString]
        mov     esi, eax

        stdcall CreateArray, 4
        mov     edi, eax

        xor     ebx, ebx

.char_loop:
        stdcall DecodeUtf8, [esi]
        jc      .finish

        add     esi, edx
        test    eax, eax
        jz      .end

        cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax

        lea     ecx, [.scaler]
        lea     edx, [.glyph]
        cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0

        test    eax, eax
        jnz     .glyph_size_ok  ; zero width glyph ????


        mov     ecx, [.glyph]
        mov     ecx, [ecx+FT_BitmapGlyphRec.root.advance.x]  ; format 16.16 fixed decimal point.

        add     ebx, ecx


.glyph_size_ok:

        stdcall AddArrayItems, edi, 1
        mov     edi, edx

        mov     edx, ebx
        sar     edx, 16         ; format 16.16
        mov     [eax], edx
        jmp     .char_loop

.end:
        clc

.finish:
        mov     [esp+4*regEAX], edi
        popad
        return

.error:
        stc
        popad
        return
endp











; Computes the width and height of the text.
;
; Arguments:
;    .pString - pointer to a UTF-8 string.
;    .len     - how many bytes from the string to be used. If -1 the whole string will be scanned.
;    .font    - the font to be used for the computations.
;
; Returns:
;    EAX - the width of the string in pixels.
;    EDX - the height of the string in pixels.


body GetTextBounds      ;, .pString, .len, .font

.scaler  FTC_ScalerRec
.glyph   dd ?

.x       dd ?

.miny    dd ?
.maxy    dd ?

.charlen dd ?

.flags   dd ?

begin
        pushad

        mov     eax, [TextRenderOptions]
        and     eax, 3
        mov     eax, [FTLoadFlags+4*eax]
        mov     [.flags], eax

        mov     edx, [.font]
        xor     ecx, ecx
        mov     eax, [edx+__TFont.height]

        mov     [.scaler.face_id], edx
        mov     [.scaler.width], ecx
        mov     [.scaler.height], eax
        mov     [.scaler.pixel], 1

        mov     [.x], ecx

        stc
        rcr     ecx, 1                  ; ecx = $80000000
        mov     [.maxy], ecx
        dec     ecx
        mov     [.miny], ecx            ; ecx = $7fffffff

        mov     esi, [.pString]

.char_loop:
        stdcall DecodeUtf8, [esi]
        jc      .finish

        add     esi, edx
        mov     [.charlen], edx

        test    eax, eax
        jz      .finish

        cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax

        lea     edx, [.glyph]
        lea     ecx, [.scaler]

        cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [.flags], eax, edx, 0
        test    eax, eax
        jnz     .char_loop

        mov     ebx, [.glyph]

        sub     eax, [ebx+FT_BitmapGlyphRec.top]                ; eax = 0 here
        mov     edx, eax
        add     edx, [ebx+FT_BitmapGlyphRec.bitmap.rows]

        cmp     eax, [.miny]
        jge     @f
        mov     [.miny], eax
@@:
        cmp     edx, [.maxy]
        jle     @f
        mov     [.maxy], edx
@@:

        mov     eax, [ebx+FT_GlyphRec.advance.x]
        add     eax, $8000
        sar     eax, 16        ; format 16.16 fixed decimal point.
        add     [.x], eax

        mov     eax, [.charlen]
        sub     [.len], eax
        ja      .char_loop


.finish:
        mov     eax, [.x]
        mov     edx, [.maxy]
        sub     edx, [.miny]

        mov     [esp+4*regEAX], eax
        mov     [esp+4*regEDX], edx

        popad
        return
endp







proc __DrawGlyph, .pImage, .pFTBitmap, .x, .y, .color
.spitch   dd ?
.dpitch   dd ?

.drect   RECT
.srect   RECT

.pixel_mode dd ?

.sstart dd ?
.dstart dd ?

.xsize  dd ?

.bpp    dd ?
.bit_ofs dd ?

.wrapx dd ?
.wrapy dd ?

begin
        pushad

        stdcall __fix_color, [.color], regEAX
        mov     [.color], eax

        mov     ebx, [.pImage]
        mov     edi, [.pFTBitmap]

; the glyph pixel mode handling.
        movzx   eax, [edi+FT_Bitmap.pixel_mode]
        cmp     eax, FT_PIXEL_MODE_BGRA
        ja      .finish

        mov     [.pixel_mode], eax
        movzx   eax, [.bpp_const+eax]
        mov     [.bpp], eax

; Clip the glyph to the image surface.

        mov     eax, [ebx+TImage.wrapW]
        mov     ecx, [ebx+TImage.wrapH]
        mov     [.drect.right], eax
        mov     [.drect.bottom], ecx
        xor     eax, eax
        mov     [.drect.left], eax
        mov     [.drect.top], eax

        mov     eax, [.x]
        mov     ecx, [.y]
        mov     [.srect.left], eax
        mov     [.srect.top], ecx

        mov     eax, [edi+FT_Bitmap.width]
        cmp     [.pixel_mode], FT_PIXEL_MODE_LCD
        jne     @f

        cdq
        mov     ecx, 3
        div     ecx

@@:
        add     eax, [.srect.left]
        mov     [.srect.right], eax

        mov     eax, [.srect.top]
        add     eax, [edi+FT_Bitmap.rows]
        mov     [.srect.bottom], eax

        lea     eax, [.srect]
        lea     ecx, [.drect]
        stdcall RectIntersect, ecx, eax, ecx
        jc      .finish                         ; the rectangles does not intersect!

        mov     eax, [.drect.left]
        mov     ecx, [.drect.top]
        sub     eax, [.x]
        sub     ecx, [.y]
        mov     [.srect.left], eax
        mov     [.srect.top], ecx

        mov     eax, [.drect.right]
        mov     ecx, [.drect.bottom]
        sub     eax, [.drect.left]
        sub     ecx, [.drect.top]
        mov     [.srect.right], eax     ; width!
        mov     [.srect.bottom], ecx    ; height!

; End of clipping code - [.srect] contains the rectangle of the glyph that have to be drawn (left, top, width, height).
; [.drect] contains the destination rectangle. Both have the same size.

        mov     ecx, [edi+FT_Bitmap.pitch]
        mov     [.spitch], ecx

; glyph pixel pointer

        mov     esi, [edi+FT_Bitmap.buffer]
        test    esi, esi
        jz      .finish

        mov     eax, [.srect.top]
        mov     ecx, [.srect.left]

        imul    eax, [.spitch]
        imul    ecx, [.bpp]
        mov     [.bit_ofs], ecx
        shr     ecx, 3          ; byte offs
        and     [.bit_ofs], 7          ; bit offs

        add     esi, ecx
        add     esi, eax

; TImage destination pixel pointer

        mov     edi, [ebx+TImage.pPixels]
        mov     edx, [ebx+TImage.wrapH]
        mov     ecx, [ebx+TImage.width]
        mov     eax, [.drect.top]
        add     eax, [ebx+TImage.orgY]
        cmp     eax, edx
        jb      @f
        sub     eax, edx
@@:
        imul    eax, ecx
        imul    edx, ecx

        lea     edx, [edi+4*edx]    ; pointer to wrapy point.
        lea     edi, [edi+4*eax]    ; pointer to the start of character line.

        shl     ecx, 2
        mov     [.wrapy], edx
        mov     [.dpitch], ecx


; prepare MMX constants

        pxor    mm0, mm0        ; mm0 = 0000 0000 0000 0000
        pcmpeqw mm1, mm1                                        ; mm1 = ffff ffff ffff ffff
        psrlw   mm1, 15                                         ; mm1 = 0001 0001 0001 0001
        psllw   mm1, 8          ; mm1 = 0100 0100 0100 0100

        movq    mm2, mm1                                        ; mm2 = 0001 0001 0001 0001
        psllq   mm2, 48         ; mm2 = 0100 0000 0000 0000


.loopy:
        mov     [.sstart], esi

        mov     edx, [.drect.left]      ; X coordinate
        mov     ecx, [ebx+TImage.wrapW]

        add     edx, [ebx+TImage.orgX]
        cmp     edx, ecx
        jb      @f
        sub     edx, ecx
@@:
        mov     ecx, [.srect.right]     ; width!
        mov     [.xsize], ecx

        cmp     [.pixel_mode], FT_PIXEL_MODE_BGRA
        je      .loopx32

        cmp     [.pixel_mode], FT_PIXEL_MODE_LCD
        je      .loopx24

        cmp     [.pixel_mode], FT_PIXEL_MODE_GRAY
        je      .loopx8

        cmp     [.pixel_mode], FT_PIXEL_MODE_MONO
        jne     .finish

        lodsd
        bswap   eax
        mov     ch, 32
        mov     cl, byte [.bit_ofs]
        shl     eax, cl
        sub     ch, cl

.loopx1:
        shl     eax, 1
        dec     ch
        jnz     @f

        lodsd
        bswap   eax
        mov     ch, 32

@@:
        jnc     .next_x

        movd    mm7, [.color]              ; source pixel.
        movd    mm6, [edi+4*edx]           ; destination pixel.

        movq    mm5, mm7
        psrlq   mm5, 24                 ; alpha source

        punpckldq mm5, mm5              ;
        punpcklbw mm6, mm0              ; byte to word destination pixel
        packssdw  mm5, mm5              ; mm5 = As, As, As, As
        punpcklbw mm7, mm0              ; byte to word source pixel

        movq    mm4, mm1
        psubw   mm4, mm5                ; mm4 = Bs Bs Bs Bs     (Bs = $100 - As)

        psrlq   mm5, 16                 ; mm5 = 0  As As As
        por     mm5, mm2                ; mm5 = $100 As As As

        pmullw  mm6, mm4                ; mm6 = Cd = Cd * (256-As) = Cd * Bs   (For alpha Ad = Ad*Bs)
        pmullw  mm7, mm5                ; Cs = Cs * As                   (For alpha As = $100*As )

        paddusw mm6, mm7                ; Cd = Cs + Cd                   (For alpha Ad = $100*As + Ad*Bs)
        psrlw   mm6, 8                  ; Cd = Cd/256                    (For alpha Ad = As + Ad*Bs/$100)

        packuswb mm6, mm0               ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
        movd     [edi+4*edx], mm6

.next_x:
        inc     edx
        cmp     edx, [ebx+TImage.wrapW]
        jb      @f
        xor     edx, edx
@@:
        dec     [.xsize]
        jnz     .loopx1
        jmp     .nexty



.loopx8:
        movzx     eax, byte [esi]         ; intensity
        add       esi, 1

        movd      mm6, [.color]
        movd      mm7, eax

        punpcklbw mm6, mm0              ; byte to word color.
        punpckldq mm7, mm7              ;
        packssdw  mm7, mm7              ; mm7 = I, I, I, I

        pmullw    mm7, mm6              ; mm7 is the color to blend = Cs*256

        movd      mm6, [edi+4*edx]      ; Destination color
        punpcklbw mm6, mm0              ; byte to word destination pixel

        movq      mm5, mm7
        psrlq     mm5, 56               ; alpha source
        punpckldq mm5, mm5
        packssdw  mm5, mm5              ; mm5 = As, As, As, As

        movq    mm4, mm1
        psubw   mm4, mm5                ; mm4 = Bs Bs Bs Bs     (Bs = $100 - As)

        pmullw  mm6, mm4                ; mm6 = Cd = Cd * (256-As) = Cd * Bs
        paddusw mm6, mm7                ; Cd = 256*Cs + Cd*(256-As)
        psrlw   mm6, 8                  ; Cd = Cd/256

        packuswb mm6, mm0               ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
        movd     [edi+4*edx], mm6

        inc     edx
        cmp     edx, [ebx+TImage.wrapW]
        jb      @f
        xor     edx, edx
@@:
        dec     [.xsize]
        jnz     .loopx8
        jmp     .nexty


.loopx24:
        movzx   eax, byte [.color+3]    ; color alpha.
        movd    mm5, eax                ; mm5 = 00 00 00 00 00 00 00 Ac

        mov     eax, [esi]              ; source alpha Ab, Ag, Ar (for RGB display, for BGR is in reverse order.)
        bswap   eax
        shr     eax, 8
        or      eax, $ff000000          ; eax = $ff Ar Ag Ab
        add     esi, 3
        movd    mm6, eax                ; mm6 = 00 00 00 00 ff Ar Ag Ab

        punpckldq mm5, mm5              ;
        punpcklbw mm6, mm0              ; mm6 = ff Ar Ag Ab  ; byte to word source alpha.
        packssdw  mm5, mm5              ; mm5 = Ac Ac Ac Ac

        pmullw    mm5, mm6
        psrlw     mm5, 8                ; mm5 = Ac, Ac*Ar, Ac*Ag, Ac*Ab  ; total alpha.

        movd    mm6, [edi+4*edx]        ; destination pixel.
        movd    mm7, [.color]           ; source pixel.

        punpcklbw mm6, mm0              ; byte to word destination pixel
        punpcklbw mm7, mm0              ; byte to word source pixel

        movq    mm4, mm1
        psubw   mm4, mm5                ; mm4 = Bs Bs Bs Bs     (Bs = $100 - As)

        psllq   mm5, 16                 ; mm5 = Ac*Ar Ac*Ag Ac*Ab 0
        psrlq   mm5, 16                 ; mm5 = 0  Ac*Ar Ac*Ag Ac*Ab
        por     mm5, mm2                ; mm5 = $100 Ac*Ar Ac*Ag Ac*Ab

        pmullw  mm6, mm4                ; mm6 = Cd = Cd * (256-As) = Cd * Bs   (For alpha Ad = Ad*Bs)
        pmullw  mm7, mm5                ; Cs = Cs * As                   (For alpha As = $100*As )

        paddusw mm6, mm7                ; Cd = Cs + Cd                   (For alpha Ad = $100*As + Ad*Bs)
        psrlw   mm6, 8                  ; Cd = Cd/256                    (For alpha Ad = As + Ad*Bs/$100)

        packuswb mm6, mm0

        movd    [edi+4*edx], mm6

        inc     edx
        cmp     edx, [ebx+TImage.wrapW]
        jb      @f
        xor     edx, edx
@@:
        dec     ecx
        jnz     .loopx24
        jmp     .nexty



.loopx32:
        movd    mm7, [esi]              ; source pixel.
        movd    mm6, [edi+4*edx]        ; destination pixel.

        movq    mm5, mm7
        psrlq   mm5, 24                 ; alpha source

        punpckldq mm5, mm5              ;
        punpcklbw mm6, mm0              ; byte to word destination pixel
        packssdw  mm5, mm5              ; mm5 = As, As, As, As
        punpcklbw mm7, mm0              ; byte to word source pixel

        movq    mm4, mm1
        psubw   mm4, mm5                ; mm4 = Bs Bs Bs Bs     (Bs = $100 - As)

        psrlq   mm5, 16                 ; mm5 = 0  As As As
        por     mm5, mm2                ; mm5 = $100 As As As

        pmullw  mm6, mm4                ; mm6 = Cd = Cd * (256-As) = Cd * Bs   (For alpha Ad = Ad*Bs)
        pmullw  mm7, mm5                ; Cs = Cs * As                   (For alpha As = $100*As )

        paddusw mm6, mm7                ; Cd = Cs + Cd                   (For alpha Ad = $100*As + Ad*Bs)
        psrlw   mm6, 8                  ; Cd = Cd/256                    (For alpha Ad = As + Ad*Bs/$100)

        packuswb mm6, mm0               ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
        movd     [edi], mm6

        add     esi, 4

        inc     edx
        cmp     edx, [ebx+TImage.wrapW]
        jb      @f
        xor     edx, edx
@@:
        dec     [.xsize]
        jnz     .loopx32
        jmp     .nexty


.nexty:
        mov     esi, [.sstart]
        add     esi, [.spitch]

        add     edi, [.dpitch]
        cmp     edi, [.wrapy]
        jne     @f
        mov     edi, [ebx+TImage.pPixels]
@@:
        dec     [.srect.bottom]         ; height
        jnz     .loopy


.finish:
        emms
        popad
        return

.bpp_const db 0, 1, 8, 2, 4, 24, 8, 32

endp






Deleted freshlib/graphics/Win32/draw.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
uglobal
  __Brush  dd ?
  __Pen    dd ?
endg


lsEndCapRound = PS_ENDCAP_ROUND
lsEndCapSquare = PS_ENDCAP_SQUARE
lsEndCapFlat   = PS_ENDCAP_FLAT

lsJoinRound = PS_JOIN_ROUND
lsJoinBevel = PS_JOIN_BEVEL
lsJoinMiter = PS_JOIN_MITER


struct TDashList
  .count dd ?   ; count of the list in dwords
  .dash  dd ?
  .space dd ?
ends


proc SetLineStyle, .color, .width, .style, .dashlist
.brush LOGBRUSH
begin
        push    eax ebx ecx edx
        invoke  DeleteObject, [__Pen]

        mov     [.brush.lbStyle], BS_SOLID
        mov     eax, [.color]
        bswap   eax
        ror     eax, 8
        mov     [.brush.lbColor], eax

        mov     edx, PS_SOLID
        cmp     [.dashlist], 0
        je      @f
        mov     edx, PS_USERSTYLE
@@:
        cmp     [.width], 0
        je      @f
        or      edx, PS_GEOMETRIC
@@:
        or      edx, [.style]

        cmp     [.width], 0
        jne     @f
        inc     [.width]
@@:
        xor     ebx, ebx
        mov     ecx, [.dashlist]
        jecxz   @f
        lea     ebx, [ecx+4]   ; pointer to the dash/space values
        mov     ecx, [ecx]
@@:
        lea     eax, [.brush]
        invoke  ExtCreatePen, edx, [.width], eax, ecx, ebx
        mov     [__Pen], eax
        pop     edx ecx ebx eax
        return
endp


proc GetCurrentXY, .raster
.point POINT
begin
        push    ecx
        lea     eax, [.point]
        invoke  MoveToEx, [.raster], 0, 0, eax
        invoke  MoveToEx, [.raster], [.point.x], [.point.y], 0
        mov     eax, [.point.x]
        mov     edx, [.point.y]
        pop     ecx
        return
endp


proc MoveTo, .raster, .x, .y
begin
        push    eax ecx edx
        invoke  MoveToEx, [.raster], [.x], [.y], 0
        pop     edx ecx eax
        return
endp


proc DrawLine, .raster, .x, .y
begin
        push    eax ecx edx
        invoke  SelectObject, [.raster], [__Pen]
        push    eax
        invoke  LineTo, [.raster], [.x], [.y]
        invoke  SelectObject, [.raster] ; from the stack.
        pop     edx ecx eax
        return
endp


proc DrawFillRect, .raster, .x, .y, .width, .height, .color
begin
        push    eax ecx edx

        mov     eax, [.x]
        mov     ecx, [.y]
        add     [.width], eax
        add     [.height], ecx

        invoke  CreateSolidBrush, [.color]
        push    eax
        lea     ecx, [.x]
        invoke  FillRect, [.raster], ecx, eax

        invoke  DeleteObject ; brush from the stack.
        pop     edx ecx eax
        return
endp


macro Outline [type, x, y] {
  common
local ..types, ..points, ..count
     dd  ..count
     dd  ..types
     dd  ..points
  common
    label ..types byte
  forward
     db type
  common
    label ..points dword
  forward
    dd  x
    dd  y
}



proc Draw, .raster, .pDrawPoints
begin

        return
endp

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























































































































































































































































































Added freshlib/graphics/Win32/fonts.asm.







































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Fonts managing library.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


iglobal
  if used FontAttr.font_weights

;fwLight     = 0
;fwDemilight = 1
;fwNormal    = 2
;fwMedium    = 3
;fwDemibold  = 4
;fwBold      = 5
;fwExtraBold = 6
;fwBlack     = 7

    FontAttr:
      .font_weights dw FW_THIN, FW_EXTRALIGHT, FW_NORMAL, FW_MEDIUM, FW_SEMIBOLD, FW_BOLD, FW_EXTRABOLD, FW_HEAVY
  end if
endg



body FontCreate
.pwc dd ?
begin
        push    ebx ecx edx esi edi

        mov     eax, [.weight]
        and     eax, 7
        movzx   eax, [FontAttr.font_weights+2*eax]

        mov     [.weight], eax

        neg     [.size]

        stdcall StrLen, [.font_name]
        mov     ebx, eax

        stdcall StrPtr, [.font_name]
        mov     [.font_name], eax

        lea     ecx, [8*ebx]
        stdcall GetMem, ecx
        mov     edi, eax

        invoke  MultiByteToWideChar, CP_UTF8, 0, [.font_name], ebx, edi, ecx

        mov     eax, [.flags]
        mov     ebx, eax
        mov     ecx, eax
        mov     edx, eax
        and     ebx, ffItalic
        and     ecx, ffUnderline
        and     edx, ffStrikeOut
        and     eax, ffMonospaced
        jz      @f
        mov     eax, FIXED_PITCH
@@:
        invoke  CreateFontW, [.size], 0, 0, 0, [.weight], ebx, ecx, edx,         \
                                    DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,        \
                                    CLIP_DEFAULT_PRECIS, PROOF_QUALITY, eax,  \
                                    edi

      if defined options.DebugMode & options.DebugMode
        pushad
        mov     esi, eax

        invoke        CreateCompatibleDC, 0
        mov           ebx, eax

        invoke  SelectObject, ebx, esi
        push    eax

        invoke  GetTextFaceA, ebx, 1024, fontName

        OutputLn fontName

        invoke  SelectObject, ebx ; from the stack
        invoke  DeleteObject, ebx

        popad
      end if

        stdcall FreeMem, edi
        pop     edi esi edx ecx ebx
        return
endp

uglobal
  if defined options.DebugMode & options.DebugMode
    fontName rb 1024
  end if
endg

body FontDestroy
begin
        push    eax ecx edx
        invoke  DeleteObject, [.pFont]
        pop     edx ecx eax
        return
endp


; returns some font metrics
;
; Arguments:
;    .font - the font
; Returns:
;    EAX - the line height of the font.
;    EBX - the ascender of the font.
;    EDX - the descender of the font.

body GetFontMetrics
.tm TEXTMETRIC
begin
        push    ecx

        invoke  CreateCompatibleDC, 0
        mov     ebx, eax

        invoke  SelectObject, ebx, [.font]
        push    eax

        lea     eax, [.tm]
        invoke  GetTextMetricsW, ebx, eax

        invoke  SelectObject, ebx ; from the stack

        invoke  DeleteDC, ebx

        mov     eax, [.tm.tmHeight]
        mov     ebx, [.tm.tmAscent]
        mov     edx, [.tm.tmDescent]

        pop     ecx
        return
endp



body GetFontList ;, .font
.list dd ?
begin
        pushad
        
        invoke  CreateCompatibleDC, 0
        mov     ebx, eax

        stdcall CreateArray, 4
        mov     [.list], eax

        lea     eax, [.list]
        invoke  EnumFontFamiliesExW, ebx, 0, __enum_fonts, eax, 0

        mov     eax, [.list]
        mov     [esp+4*regEAX], eax

        invoke  DeleteObject, ebx
        popad
        return
endp


proc __enum_fonts, .pLogFont, .pAttr, .FontType, .lparam
begin
        push    esi edi

        mov     eax, [.pLogFont]
        lea     eax, [eax+LOGFONTW.lfFaceName]

        stdcall WideCharToUtf8, eax
        push    eax

        mov     esi, [.lparam]
        mov     edx, [esi]

        stdcall ListIndexOfStr, edx, eax
        jnc     .exists

        stdcall AddArrayItems, edx, 1
        pop     dword [eax]
        mov     [esi], edx

        or      eax, -1
        pop     edi esi
        return

.exists:
        stdcall StrDel ; from the stack
        or      eax, -1
        pop     edi esi
        return
endp






Changes to freshlib/graphics/Win32/images.asm.














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































; only 16, 24 and 32 bpp are supported.

; It is stupid to support palleted modes and even 24bpp is not good...









proc CreateImage, .width, .height, .bpp
.bmi BITMAPINFOHEADER
begin
        push    ebx ecx edx esi

        stdcall GetMem, sizeof.TImage
        jc      .finish

        mov     esi, eax
        push    [.width] [.height] [.bpp]




        pop     [esi+TImage.bpp] [esi+TImage.height] [esi+TImage.width]










































































        lea     eax, [.bmi]

        mov     [eax+BITMAPINFOHEADER.biSize], sizeof.BITMAPINFOHEADER

        mov     [eax+BITMAPINFOHEADER.biPlanes], 1




        mov     [eax+BITMAPINFOHEADER.biCompression], BI_RGB
        mov     [eax+BITMAPINFOHEADER.biSizeImage], 0
        mov     [eax+BITMAPINFOHEADER.biXPelsPerMeter], 96      ; ???









        mov     [eax+BITMAPINFOHEADER.biYPelsPerMeter], 96      ; ???
        mov     [eax+BITMAPINFOHEADER.biClrUsed], 0
        mov     [eax+BITMAPINFOHEADER.biClrImportant], 0











        mov     ecx, [.bpp]


        mov     [eax+BITMAPINFOHEADER.biBitCount], cx
        push    [.width] [.height]
        neg     dword [esp]
        pop     [eax+BITMAPINFOHEADER.biHeight] [eax+BITMAPINFOHEADER.biWidth]










        lea     ecx, [esi+TImage.pData]
        invoke  CreateDIBSection, 0, eax, DIB_RGB_COLORS, ecx, 0, 0



        mov     ebx, eax






        invoke  CreateCompatibleDC, 0
        mov     [esi+TImage.raster], eax

        invoke  SelectObject, eax, ebx














        clc
















        mov     eax, esi

.finish:
        pop     esi edx ecx ebx


        return



endp
















proc DestroyImage, .ptrImage




begin








        push    eax ecx edx esi








        mov     esi, [.ptrImage]



        invoke  GetCurrentObject, [esi+TImage.raster], OBJ_BITMAP


        invoke  DeleteObject, eax






        invoke  DeleteDC, [esi+TImage.raster]

        stdcall FreeMem, esi





        pop     esi edx ecx eax




        return


endp


































proc DrawImage, .raster, .pImage, .x, .y






begin

        push    esi

        mov     esi, [.pImage]


        invoke  BitBlt, [.raster], [.x], [.y], [esi+TImage.width], [esi+TImage.height], [esi+TImage.raster], 0, 0, SRCCOPY




        pop     esi
        return
endp



















>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
>
>
>
>
>
>
>
>
>
|
|

|

|



|
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
>
|
>
>
>
>
|
|
|
>
>
>
>
>
>
>
>
>
|
|
|
>
>
>
>
>
>

>
>
>
>
|
>
>
|
|
|
|
>
>
>
>
>
>
>
>
>
|
|
<
>
>
>
|
>
>
|
>
>
>
|
|
>
|
>
>
>
|
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
|
>
>
|
>
>
>
|
>
>
>
>

>
>
>
>
>
>
>
>

>
>
|
>
>
>
>
|
>
>
>
>
>
>
>
>
|
>
>
>
>

>
>
>
|

>
>
|
>
>
|
>
>
>
>

>
|
>
|
>
>
>

>
|
>
>
>
>
|
>
>
|
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
|
>
>
>
>
>
>
|
>
|
>
|
>
>
|
>
>
>
>
|

|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Memory based images manipulation library.
;
;  Target OS: Win32
;
;  Dependencies: memory.asm
;
;  Notes:
;_________________________________________________________________________________________

uses msimg32, gdi32


struct TWinImage
  . TImage
; os dependent data
  .hBitmap dd ?
ends



body CreateImage2
  .bmi BITMAPV4HEADER
begin
        pushad

        stdcall GetMem, sizeof.TWinImage
        jc      .finish

        mov     esi, eax

        xor     eax, eax
        lea     edi, [.bmi]
        mov     ecx, sizeof.BITMAPV4HEADER/4
        rep stosd

        inc     eax

        mov     ecx, [.width]
        mov     edx, [.height]

        cmp     ecx, 0
        cmovle  ecx, eax

        cmp     edx, 0
        cmovle  edx, eax

        mov     [esi+TWinImage.width], ecx
        mov     [esi+TWinImage.height], edx
        mov     [esi+TWinImage.wrapW], ecx
        mov     [esi+TWinImage.wrapH], edx

        mov     [.bmi.biSize], sizeof.BITMAPV4HEADER
        mov     [.bmi.biPlanes], 1

; it is already 0
;        mov     [.bmi.biCompression], BI_RGB
;        mov     [.bmi.biSizeImage], 0
;        mov     [.bmi.biClrUsed], 0
;        mov     [.bmi.biClrImportant], 0

        mov     [.bmi.BlueMask],  $000000ff
        mov     [.bmi.GreenMask], $0000ff00
        mov     [.bmi.RedMask],   $00ff0000
        mov     [.bmi.AlphaMask], $ff000000

        mov     [.bmi.biBitCount], 32
        neg     edx
        mov     [.bmi.biWidth], ecx
        mov     [.bmi.biHeight], edx

        lea     eax, [.bmi]
        lea     ecx, [esi+TWinImage.pPixels]
        xor     edx, edx
        invoke  CreateDIBSection, edx, eax, DIB_RGB_COLORS, ecx, edx, edx
        mov     [esi+TWinImage.hBitmap], eax

        mov     [esp+4*regEAX], esi

        lea     esi, [esi+TWinImage.lock]
        stdcall MutexCreate, 0, esi
        stdcall MutexRelease, esi

        clc

.finish:
        popad
        return
endp





body DestroyImage
begin
        pushad

        mov     esi, [.ptrImage]
        test    esi, esi
        jz      .finish

.lock_wait:
        stdcall LockImg, esi
        jc      .lock_wait


        invoke  GdiFlush
        invoke  DeleteObject, [esi+TWinImage.hBitmap]

        lea     edi, [esi+TWinImage.lock]
        stdcall MutexDestroy, edi

        stdcall FreeMem, esi

.finish:
        popad
        return
endp



body LockImg    ;, .pImage
begin
        push    eax
        mov     eax, [.pImage]
        lea     eax, [eax+TImage.lock]
        stdcall WaitForMutex, eax, -1
        pop     eax
        return
endp



body UnlockImg  ;, .pImage
begin
        push    eax
        mov     eax, [.pImage]
        test    eax, eax
        jz      .unlocked

        lea     eax, [eax+TImage.lock]
        stdcall MutexRelease, eax

.unlocked:
        pop     eax
        return
endp




;;AC_SRC_OVER =  $00000000
;;AC_SRC_ALPHA = $01000000
;;
;;struct BLENDFUNCTION
;;  .BlendOp             db ?
;;  .BlendFlags          db ?
;;  .SourceConstantAlpha db ?
;;  .AlphaFormat         db ?
;;ends
;
;body DrawImageRect

;begin
;        push    eax ecx edx esi edi
;
;        mov     esi, [.pImage]
;        test    esi, esi
;        jz      .exit
;
;        stdcall LockImg, esi
;        jc      .exit
;
;        invoke  CreateCompatibleDC, 0
;        mov     ebx, eax
;
;        invoke  SelectObject, ebx, [esi+TWinImage.hBitmap]
;        push    eax
;
;        invoke  BitBlt, [.where], [.xDst], [.yDst], [.width], [.height], ebx, [.xSrc], [.ySrc], SRCCOPY
;
;        invoke  SelectObject, ebx ; from the stack
;        invoke  DeleteDC, ebx
;
;        stdcall UnlockImg, esi
;
;.exit:
;        pop     edi esi edx ecx eax
;        return
;endp
;


body DrawImageRect

.maskUL RECT ; upper left
.maskUR RECT ; upper right
.maskLL RECT ; lower left
.maskLR RECT ; lower right

.sRect  RECT ; the rectangle used for intersecting the source rectangle.

.dc         dd ?
.oldbmp     dd ?

begin
        pushad

        mov     esi, [.pImage]
        test    esi, esi
        jz      .finish

        stdcall LockImg, esi
        jc      .finish

        xor     eax, eax
        mov     ecx, [esi+TImage.wrapW]
        mov     edx, [esi+TImage.wrapH]

        mov     [.maskUL.left], eax     ; UL
        mov     [.maskUL.top], eax      ; UL
        mov     [.maskLL.left], eax             ; LL
        mov     [.maskUR.top], eax                      ; UR

        mov     [.maskUL.right], ecx    ; UL
        mov     [.maskUL.bottom], edx   ; UL
        mov     [.maskLR.left], ecx                             ; LR
        mov     [.maskLR.top], edx                              ; LR
        mov     [.maskLL.top], edx              ; LL
        mov     [.maskLL.right], ecx            ; LL
        mov     [.maskUR.left], ecx                     ; UR
        mov     [.maskUR.bottom], edx                   ; UR

        shl     ecx, 1
        shl     edx, 1

        mov     [.maskUR.right], ecx                    ; UR
        mov     [.maskLL.bottom], edx           ; LL
        mov     [.maskLR.right], ecx                            ; LR
        mov     [.maskLR.bottom], edx                           ; LR

        mov     ecx, [.xSrc]
        mov     edx, [.ySrc]
        mov     [.sRect.left], ecx
        mov     [.sRect.top], edx
        add     ecx, [.width]
        add     edx, [.height]
        mov     [.sRect.right], ecx
        mov     [.sRect.bottom], edx

        lea     eax, [.sRect]
        lea     edx, [.maskUL]
        stdcall RectIntersect, eax, eax, edx
        jc      .exit

; at least some part of the image, has to be drawn.

        invoke  CreateCompatibleDC, 0
        mov     [.dc], eax

        invoke  SelectObject, [.dc], [esi+TWinImage.hBitmap]
        mov     [.oldbmp], eax

        mov     ebx, [esi+TImage.orgX]
        mov     edx, [esi+TImage.orgY]

        add     [.sRect.left], ebx
        add     [.sRect.top], edx
        add     [.sRect.right], ebx
        add     [.sRect.bottom], edx

        mov     ebx, [esi+TImage.wrapW]
        mov     edx, [esi+TImage.wrapH]
        lea     ecx, [.sRect]

        lea     eax, [.maskUL]
        stdcall RectIntersect2, eax, ecx
        jc      .upper_left_ok

        call    .DoDraw                                 ; the upper left rect is always drawn

.upper_left_ok:
        lea     eax, [.maskUR]
        stdcall RectIntersect2, eax, ecx
        jc      .upper_right_ok

        sub     [.maskUR.left], ebx
        sub     [.maskUR.right], ebx

        mov     edi, [.maskUL.right]    ; width
        sub     edi, [.maskUL.left]
        add     [.xDst], edi

        call    .DoDraw

        sub     [.xDst], edi


.upper_right_ok:
        lea     eax, [.maskLL]
        stdcall RectIntersect2, eax, ecx
        jc      .lower_left_ok

        sub     [.maskLL.top], edx
        sub     [.maskLL.bottom], edx

        mov     edi, [.maskUR.bottom]
        sub     edi, [.maskUR.top]
        add     [.yDst], edi

        call    .DoDraw

        sub     [.yDst], edi

.lower_left_ok:
        lea     eax, [.maskLR]
        stdcall RectIntersect2, eax, ecx
        jc      .lower_right_ok

        sub     [.maskLR.left], ebx
        sub     [.maskLR.top], edx
        sub     [.maskLR.right], ebx
        sub     [.maskLR.bottom], edx

        mov     edi, [.maskUL.right]
        sub     edi, [.maskUL.left]
        add     [.xDst], edi
        mov     edi, [.maskUR.bottom]
        sub     edi, [.maskUR.top]
        add     [.yDst], edi

        call    .DoDraw

.lower_right_ok:

        invoke  SelectObject, [.dc], [.oldbmp]
        invoke  DeleteDC, [.dc]

.exit:
        stdcall UnlockImg, esi

.finish:
        popad
        return


; Draws the rectangle pointed by EAX

.DoDraw:
        pushad

; computes in right/bottom, width/height
        mov     ebx, [eax+RECT.bottom]
        mov     edx, [eax+RECT.right]
        sub     ebx, [eax+RECT.top]
        sub     edx, [eax+RECT.left]

; draws
        invoke  BitBlt, [.where], [.xDst], [.yDst], edx, ebx, [.dc], [eax+RECT.left], [eax+RECT.top], SRCCOPY

        popad
        retn

endp

Changes to freshlib/graphics/Win32/text.asm.





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







































































































































































































































































































































































































































































































proc DrawString, .raster, .ptrString, .len, .x, .y, .font



begin
        push    eax ecx edx

        cmp     [.font], 0

        jne     @f









        invoke  GetStockObject, DEFAULT_GUI_FONT
        mov     [.font], eax



@@:

        invoke  SelectObject, [.raster], [.font]
        push    eax



        invoke  SetBkMode, [.raster], TRANSPARENT
        invoke  SetTextAlign, [.raster], TA_NOUPDATECP or TA_LEFT or TA_BASELINE

        invoke  TextOut, [.raster], [.x], [.y], [.ptrString], [.len]


        invoke  SelectObject, [.raster] ; old font from the stack.
        pop     edx ecx eax
        return
endp






proc GetTextBounds, .raster, .ptrString, .len, .font

.size SIZE

begin
        push    ecx












        cmp     [.font], 0
        jne     @f
        invoke  GetStockObject, DEFAULT_GUI_FONT
        mov     [.font], eax

@@:
        invoke  SelectObject, [.raster], [.font]
        push    eax

        lea     eax, [.size]
        invoke  GetTextExtentPoint32, [.raster], [.ptrString], [.len], eax
        invoke  SelectObject, [.raster] ; from the stack.

        mov     eax, [.size.cx]
        mov     edx, [.size.cy]

        pop     ecx
        return
endp


proc GetTextOffset, .raster, .ptrString, .len, .font
.metrics TEXTMETRIC
begin
        push    ecx
        lea     eax, [.metrics]
        invoke  GetTextMetrics, [.raster], eax


        xor     eax, eax
        mov     edx, [.metrics.tmAscent]
        sub     edx, [.metrics.tmInternalLeading]


        pop     ecx
        return
endp
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|
>
>
>

|

<
>
|

>
>
>
>
>
>
>
>
|
|
>
>

<
>
|


>
>
|
|

|
>

|
|




>
>
>

|
>
|
>

|
>
>
>
>
>
>
>
>
>
>
>







|


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|
>




>
>
|


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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494

495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510

511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
















560
561
562
563
564
565
566
567
568
569
570
571
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Text drawing library.
;
;  Target OS: Win32
;
;  Dependencies: memory.asm
;
;  Notes:
;_________________________________________________________________________________________




body DrawDecomposedString      ;, .pImage, .pArray, .x, .y, .font, .color

.startX  dd ?

.old_font    dd ?
.old_bmp     dd ?

.img    dd ?

begin
        pushad

        mov     eax, [.x]
        mov     [.startX], eax

        stdcall GetFontMetrics, [.font]
        sub     [.y], ebx

        mov     ebx, [.pImage]
        stdcall CreateImage2, 100, 100, FALSE
        mov     [.img], eax

        invoke  CreateCompatibleDC, 0
        mov     ebx, eax

        mov     eax, [.img]
        invoke  SelectObject, ebx, [eax+TWinImage.hBitmap]
        mov     [.old_bmp], eax

        invoke  SelectObject, ebx, [.font]
        mov     [.old_font], eax

        invoke  SetBkMode, ebx, TRANSPARENT
        invoke  SelectClipRgn, ebx, 0
        invoke  SetTextColor, ebx, $ffffff
        invoke  SetTextAlign, ebx, TA_TOP or TA_LEFT

        mov     esi, [.pArray]
        xor     edi, edi
        dec     edi

.char_loop:
        inc     edi
        cmp     edi, [esi+TArray.count]
        jae     .finish

        cmp     word [esi+TArray.array+8*edi+TTextChar.width], 0
        je      .char_ok

        movzx   ecx, word [esi+TArray.array+8*edi+TTextChar.width]
        stdcall DrawSolidRect, [.img], 0, 0, ecx, [esi+TArray.lparam], 0

        lea     eax, [esi+TArray.array+8*edi+TTextChar.code]
        movzx   ecx, word [esi+TArray.array+8*edi+TTextChar.width]
        invoke  ExtTextOutW, ebx, 0, 0, 0, 0, eax, 1, 0

        movzx   ecx, word [esi+TArray.array+8*edi+TTextChar.width]
        stdcall __BlendAlphaMask, [.pImage], [.x], [.y], [.img], 0, 0, ecx, [esi+TArray.lparam], [.color]

        movzx   eax, word [esi+TArray.array+8*edi+TTextChar.width]
        add     [.x], eax

.char_ok:
; check for new line.
        movzx   eax, word [esi+TArray.array+8*edi+TTextChar.height]
        test    eax, eax
        jz      .char_loop

        add     [.y], eax
        mov     eax, [.startX]
        mov     [.x], eax
        jmp     .char_loop


.finish:
        invoke  SelectObject, ebx, [.old_font]
        invoke  SelectObject, ebx, [.old_bmp]
        invoke  DeleteDC, ebx

        stdcall DestroyImage, [.img]

        popad
        return
endp




body TextDecompose      ;, .hString, .font

  .miny    dd ?
  .maxy    dd ?

  .more    dd ?
  .string  rd 2
  .code    dd ?

  .size SIZE

  .old_font dd ?

begin
        pushad

        invoke  CreateCompatibleDC, 0
        mov     ebx, eax

        invoke  SelectClipRgn, ebx, 0
        invoke  SelectObject, ebx, [.font]
        mov     [.old_font], eax

        xor     ecx, ecx

        mov     [.string], ecx
        mov     [.string+4], ecx

        inc     ecx

        ror     ecx, 1                  ; ecx = $80000000
        mov     [.maxy], ecx
        dec     ecx
        mov     [.miny], ecx            ; ecx = $7fffffff


        mov     word [.string], '|'
        mov     word [.string+2], '|'

        lea     ecx, [.string]
        lea     eax, [.size]
        invoke  GetTextExtentPoint32W, ebx, ecx, 1, eax

        mov     eax, [.size.cx]
        mov     [.more], eax

        stdcall StrPtr, [.hString]
        mov     esi, eax

        stdcall CreateArray, sizeof.TTextChar
        mov     edi, eax

.char_loop:

        stdcall DecodeUtf8, [esi]
        jc      .finish

        add     esi, edx

        test    eax, eax
        jz      .end

        mov     [.code], eax
        mov     word [.string], ax

        lea     ecx, [.string]
        lea     eax, [.size]
        invoke  GetTextExtentPoint32W, ebx, ecx, 2, eax

        stdcall AddArrayItems, edi, 1
        mov     edi, edx

        mov     ecx, [.size.cx]
        sub     ecx, [.more]

        mov     dword [eax+TTextChar.width], ecx
        mov     ecx, [.code]
        mov     [eax+TTextChar.code],  ecx

        jmp     .char_loop

.end:
        clc

.finish:
        pushf
        invoke  SelectObject, ebx, [.old_font] ; old font from the stack.
        invoke  DeleteDC, ebx

        stdcall GetFontMetrics, [.font]
        popf

        mov     [esp+4*regEDX], ebx             ; font ascent
        mov     [esp+4*regECX], edx             ; font descent
        mov     [edi+TArray.lparam], eax        ; line height

        mov     [esp+4*regEAX], edi

        popad
        return
endp




;interface DrawString, .pImage, .pString, .len, .x, .y, .font, .color

body DrawString ;, .pImage, .pString, .len, .x, .y, .font, .color
.pwc dd ?
.charlen dd ?

.img  dd ?
.size SIZE

.tm TEXTMETRIC

begin
        push    eax ebx ecx edx

        invoke  CreateCompatibleDC, 0
        mov     ebx, eax

        invoke  SelectObject, ebx, [.font]
        push    eax

        invoke  SetBkMode,    ebx, TRANSPARENT
        invoke  SetTextAlign, ebx, TA_TOP or TA_LEFT
        invoke  SelectClipRgn, ebx, 0
        invoke  SetTextColor, ebx, $ffffff

        lea     eax, [.tm]
        invoke  GetTextMetricsW, ebx, eax

        mov     eax, [.tm.tmAscent]
        sub     [.y], eax

; convert the string:

        mov     ecx, [.len]
        shl     ecx, 2
        stdcall GetMem, ecx
        mov     [.pwc], eax
        shr     ecx, 1

        invoke  MultiByteToWideChar, CP_UTF8, 0, [.pString], [.len], [.pwc], ecx
        mov     [.charlen], eax

        lea     eax, [.size]
        invoke  GetTextExtentPoint32W, ebx, [.pwc], [.charlen], eax

        stdcall CreateImage2, [.size.cx], [.size.cy], FALSE
        mov     [.img], eax

        invoke  SelectObject, ebx, [eax+TWinImage.hBitmap]
        push    eax

        xor     eax, eax
        invoke  ExtTextOutW, ebx, eax, eax, eax, eax, [.pwc], [.charlen], eax

        invoke  SelectObject, ebx ; old bitmap from the stack.
        invoke  SelectObject, ebx ; old font from the stack.
        invoke  DeleteDC, ebx

        stdcall __BlendAlphaMask, [.pImage], [.x], [.y], [.img], 0, 0, [.size.cx], [.size.cy], [.color]

        stdcall DestroyImage, [.img]
        stdcall FreeMem, [.pwc]

        pop     edx ecx ebx eax

        mov     eax, [.size.cx]
        mov     ebx, [.tm.tmAscent]
        mov     edx, [.size.cy]

        return
endp





proc __BlendAlphaMask, .pDstImage, .xDst, .yDst, .pSrcImage, .xSrc, .ySrc, .width, .height, .color
.srect RECT
.drect RECT
.rect  RECT

.stepSrc dd ?
.stepDst dd ?
.wrapY   dd ?
begin
        pushad

        stdcall __fix_color, [.color], regEAX
        mov     [.color], eax

        mov     esi, [.pSrcImage]
        mov     edi, [.pDstImage]

        xor     eax, eax
        mov     ecx, [esi+TImage.width]
        mov     edx, [esi+TImage.height]

        mov     [.srect.left], eax
        mov     [.srect.top], eax
        mov     [.srect.right], ecx
        mov     [.srect.bottom], edx

        mov     ecx, [edi+TImage.wrapW]
        mov     edx, [edi+TImage.wrapH]

        mov     [.drect.left], eax
        mov     [.drect.top], eax
        mov     [.drect.right], ecx
        mov     [.drect.bottom], edx

        mov     ecx, [.xSrc]
        mov     edx, [.ySrc]

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        add     ecx, [.width]
        add     edx, [.height]

        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     ecx, [.srect]
        lea     edx, [.rect]
        stdcall RectIntersect, ecx, ecx, edx
        jc      .finish

        mov     ecx, [.xSrc]
        mov     edx, [.ySrc]
        sub     ecx, [.xDst]
        sub     edx, [.yDst]

; convert the rect to the destination coordinates.
        sub     [.srect.left], ecx
        sub     [.srect.top], edx
        sub     [.srect.right], ecx
        sub     [.srect.bottom], edx

        lea     eax, [.srect]
        lea     ebx, [.drect]
        stdcall RectIntersect, ebx, ebx, eax
        jc      .finish

        stdcall RectCopy, eax, ebx      ; srect = drect

;convert back to source coordinates.
        add     [.srect.left], ecx
        add     [.srect.top], edx
        add     [.srect.right], ecx
        add     [.srect.bottom], edx

; here [.srect] contains the source rectange
; [.drect] contains the destination rectangle
; the width and height of the rectangles  is the same.

        mov     ecx, [.srect.left]
        mov     edx, [.srect.top]
        sub     [.srect.right], ecx
        sub     [.srect.bottom], edx

        mov     ecx, [esi+TImage.width]
        mov     edx, [edi+TImage.width]
        shl     ecx, 2
        shl     edx, 2
        mov     [.stepSrc], ecx
        mov     [.stepDst], edx

        mov     ecx, [.srect.top]
        imul    ecx, [esi+TImage.width]
        add     ecx, [.srect.left]
        mov     esi, [esi+TImage.pPixels]
        lea     esi, [esi+4*ecx]

        mov     eax, [edi+TImage.wrapH]
        imul    eax, [.stepDst]
        add     eax, [edi+TImage.pPixels]
        mov     [.wrapY], eax

        mov     edx, [.drect.top]
        add     edx, [edi+TImage.orgY]
        cmp     edx, [edi+TImage.wrapH]
        jb      @f
        sub     edx, [edi+TImage.wrapH]
@@:
        imul    edx, [.stepDst]
        add     edx, [edi+TImage.pPixels]

; prepare MMX constants

        pxor    mm0, mm0        ; mm0 = 0000 0000 0000 0000
        pcmpeqw mm1, mm1        ; mm1 = ffff ffff ffff ffff
        psrlw   mm1, 15         ; mm1 = 0001 0001 0001 0001
        psllw   mm1, 8          ; mm1 = 0100 0100 0100 0100

.loopY:

        xor     ebx, ebx
        mov     ecx, [.drect.left]     ; the width of the source rectangle
        add     ecx, [edi+TImage.orgX]
        cmp     ecx, [edi+TImage.wrapW]
        jb      .loopX
        sub     ecx, [edi+TImage.wrapW]

.loopX:
        push    edx

        movzx   eax, byte [esi+4*ebx]
        movzx   edx, byte [esi+4*ebx+1]

        lea     eax, [eax+2*edx]
        movzx   edx, byte [esi+4*ebx+2]

        add     eax, edx
        shr     eax, 2          ; grayscale.

        pop     edx

        movd      mm6, [.color]
        movd      mm7, eax

        punpcklbw mm6, mm0              ; byte to word color.
        punpckldq mm7, mm7              ;
        packssdw  mm7, mm7              ; mm7 = I, I, I, I

        pmullw    mm7, mm6              ; mm7 is the color to blend = Cs*256

        movd      mm6, [edx+4*ecx]      ; Destination color
        punpcklbw mm6, mm0              ; byte to word destination pixel

        movq      mm5, mm7
        psrlq     mm5, 56               ; alpha source
        punpckldq mm5, mm5
        packssdw  mm5, mm5              ; mm5 = As, As, As, As

        movq    mm4, mm1
        psubw   mm4, mm5                ; mm4 = Bs Bs Bs Bs     (Bs = $100 - As)

        pmullw  mm6, mm4                ; mm6 = Cd = Cd * (256-As) = Cd * Bs
        paddusw mm6, mm7                ; Cd = 256*Cs + Cd*(256-As)
        psrlw   mm6, 8                  ; Cd = Cd/256

        packuswb mm6, mm0               ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
        movd     [edx+4*ecx], mm6

        inc     ecx
        cmp     ecx, [edi+TImage.wrapW]
        jb      @f
        xor     ecx, ecx
@@:

        inc     ebx
        cmp     ebx, [.srect.right]
        jne     .loopX

; next Y
        add     esi, [.stepSrc]
        add     edx, [.stepDst]
        cmp     edx, [.wrapY]
        jb      @f
        mov     edx, [edi+TImage.pPixels]
@@:

        dec     [.srect.bottom]
        jnz     .loopY

.finish:
        emms
        popad
        return
endp





;interface GetTextBounds, .pString, .len, .font

body GetTextBounds      ;, .pString, .len, .font
.size SIZE
.pwc dd ?
.charlen dd ?
begin
        push    ebx ecx


        invoke  CreateCompatibleDC, 0
        mov     ebx, eax

; first convert the string:
        mov     ecx, [.len]
        test    ecx, ecx
        jns     @f
        stdcall StrLen, [.pString]
        mov     ecx, eax
@@:
        shl     ecx, 3
        stdcall GetMem, ecx
        mov     [.pwc], eax
        invoke  MultiByteToWideChar, CP_UTF8, 0, [.pString], [.len], [.pwc], ecx
        mov     [.charlen], eax


        invoke  SelectClipRgn, ebx, 0
        invoke  SelectObject, ebx, [.font]
        push    eax

        lea     eax, [.size]
        invoke  GetTextExtentPoint32W, ebx, [.pwc], [.charlen], eax
        invoke  SelectObject, ebx ; from the stack.
        invoke  DeleteDC, ebx

        mov     eax, [.size.cx]
        mov     edx, [.size.cy]

        stdcall FreeMem, [.pwc]
        pop     ecx ebx
        return
endp


; returns:
;       eax - x offset of the baseline of the string.
;       edx - y offset of the baseline of the string.

proc GetTextOffset, .context, .ptrString, .len, .font
.metrics TEXTMETRIC
.pwc dd ?
.charlen dd ?
begin
        push    ebx ecx

; first convert the string:

        mov     ecx, [.len]
        shl     ecx, 3
        stdcall GetMem, ecx
        mov     [.pwc], eax
        invoke  MultiByteToWideChar, CP_UTF8, 0, [.ptrString], [.len], [.pwc], ecx
        mov     [.charlen], eax

        mov     ebx, [.context]

        cmp     [.font], 0
        jne     @f
        invoke  GetStockObject, DEFAULT_GUI_FONT
        mov     [.font], eax

@@:
        invoke  SelectObject, [ebx+TContext.handle], [.font]
        push    eax

















        lea     eax, [.metrics]
        invoke  GetTextMetricsW, [ebx+TContext.handle], eax
        invoke  SelectObject, [ebx+TContext.handle] ; from the stack.

        xor     eax, eax
        mov     edx, [.metrics.tmAscent]
        sub     edx, [.metrics.tmInternalLeading]

        stdcall FreeMem, [.pwc]
        pop     ecx ebx
        return
endp

Added freshlib/graphics/all.asm.









































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Graphics amalgamation include file.
;               Includes all graphic libraries of FreshLib
;
;  Target OS: Any
;_________________________________________________________________________________________


include 'rectangles.asm'
include 'images.asm'
include 'draw.asm'
include 'giflib.asm'
include 'pnglib.asm'
include 'fonts.asm'
include 'text.asm'
include 'recycler.asm'

Changes to freshlib/graphics/draw.asm.















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

















include "%TargetOS%/draw.asm"



































































































































































































































































struct TBounds















































  .x      dd ?

























  .y      dd ?




  .width  dd ?



  .height dd ?

ends






























































































































































































bxRaised = 1




bxSunken = 2
bxFlat   = 3






















































































proc DrawBox, .raster, .x, .y, .width, .height, .bkground, .border





















































































begin




        push    eax ecx edx



        dec     [.width]
        dec     [.height]
        dec     [.width]
        dec     [.height]



        push    [.bkground]
        push    [.height]
        push    [.width]

        inc     [.width]
        inc     [.height]




        mov     eax, [.x]
        mov     ecx, [.y]
        add     [.width], eax

        add     [.height], ecx



        mov     eax, $ffffff
        mov     ecx, $101010
        mov     edx, [.border]






        cmp     edx, 1

        je      .colorok

        xchg    eax, ecx
        cmp     edx, 2
        je      .colorok


        mov     ecx, eax
































































































.colorok:


        stdcall SetLineStyle, eax, 0, 0, 0






































        stdcall MoveTo, [.raster], 0, [.height]
        stdcall DrawLine, [.raster], 0, 0


        stdcall DrawLine, [.raster], [.width], 0




        stdcall SetLineStyle, ecx, 0, 0, 0
        stdcall DrawLine, [.raster], [.width], [.height]


        stdcall DrawLine, [.raster], 0, [.height]



































        stdcall DrawFillRect, [.raster], 1, 1 ; remaining from the stack



























































        pop     edx ecx eax






















































































































        return
endp



>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
|
>
>
>
|
>
|
>
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
|
>
>
>
>
|
|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
|
>
>

|
|
|
|

>
>
|
|
|

|
|
>
>
>

<
|
|
>
|

>
>
|
|
|
>
>
>
>

>
|
>
|

<
|
|

>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
>
>
|
>
>
>
>
|
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
|
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755

756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775

776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Draw library contains procedures for drawing oprtations.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: This file contains OS independent part and includes OS dependent files.
;_________________________________________________________________________________________
module "Draw library"



proc DrawSolidRect, .pDstImage, .x, .y, .width, .height, .color
.drect RECT
.rect  RECT
.stepy dd ?
begin
        pushad

        mov     esi, [.pDstImage]

        xor     eax, eax
        mov     ecx, [esi+TImage.wrapW]
        mov     edx, [esi+TImage.wrapH]

        mov     [.drect.left], eax
        mov     [.drect.top], eax
        mov     [.drect.right], ecx
        mov     [.drect.bottom], edx

        mov     ecx, [.x]
        mov     edx, [.y]

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        add     ecx, [.width]
        add     edx, [.height]

        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     ecx, [.drect]
        lea     edx, [.rect]
        stdcall RectIntersect, ecx, ecx, edx
        jc      .finish

        stdcall LockImg, esi
        jc      .finish

; [.drect] contains the destination rectangle

        mov     eax, [esi+TImage.width]
        shl     eax, 2
        mov     [.stepy], eax

        mov     edi, [.drect.top]
        add     edi, [esi+TImage.orgY]
        cmp     edi, [esi+TImage.wrapH]
        jb      @f
        sub     edi, [esi+TImage.wrapH]
@@:
        imul    edi, [.stepy]
        add     edi, [esi+TImage.pPixels]       ; the address of the starting line of the rectangle.

        mov     eax, [.drect.left]
        mov     edx, [.drect.right]

        add     eax, [esi+TImage.orgX]
        add     edx, [esi+TImage.orgX]

        cmp     eax, [esi+TImage.wrapW]
        jbe     @f
        sub     eax, [esi+TImage.wrapW]
@@:
        cmp     edx, [esi+TImage.wrapW]
        jbe     @f
        sub     edx, [esi+TImage.wrapW]
@@:
        mov     [.drect.left], eax
        mov     [.drect.right], edx

        mov     ecx, [.drect.bottom]
        add     ecx, [esi+TImage.orgY]
        cmp     ecx, [esi+TImage.wrapH]
        jb      @f
        sub     ecx, [esi+TImage.wrapH]
@@:
        imul    ecx, [.stepy]
        add     ecx, [esi+TImage.pPixels]       ; the address of the end of the rectangle.

        mov     edx, [esi+TImage.wrapH]
        imul    edx, [.stepy]
        add     edx, [esi+TImage.pPixels]       ; the address of the Y wrap

        stdcall __fix_color, [.color], regEAX

.loopY:

        mov     ebx, [.drect.right]      ; the end of the rect.

.loopX:
        dec     ebx
        cmovs   ebx, [esi+TImage.wrapW]

        mov     [edi+4*ebx], eax        ; fill the color, does not affect the flags.

        cmp     ebx, [.drect.left]
        jne     .loopX

        add     edi, [.stepy]

        cmp     edi, edx
        jb      @f
        mov     edi, [esi+TImage.pPixels]
@@:
        cmp     edi, ecx
        jne     .loopY

        stdcall UnlockImg, [.pDstImage]
        clc

.finish:
        popad
        return
endp





proc BlendSolidRect, .pDstImage, .x, .y, .width, .height, .color
.drect RECT
.rect  RECT
.stepY dd ?
.wrapY dd ?
begin
        pushad

        mov     esi, [.pDstImage]

        xor     eax, eax
        mov     ecx, [esi+TImage.wrapW]
        mov     edx, [esi+TImage.wrapH]

        mov     [.drect.left], eax
        mov     [.drect.top], eax
        mov     [.drect.right], ecx
        mov     [.drect.bottom], edx

        mov     ecx, [.x]
        mov     edx, [.y]

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        add     ecx, [.width]
        add     edx, [.height]

        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     ecx, [.drect]
        lea     edx, [.rect]
        stdcall RectIntersect, ecx, ecx, edx
        jc      .finish

        stdcall LockImg, esi
        jc      .finish

; [.drect] contains the destination rectangle

        mov     ecx, [.drect.left]
        mov     edx, [.drect.top]
        sub     [.drect.right], ecx
        sub     [.drect.bottom], edx

        mov     ebx, [esi+TImage.width]
        mov     ecx, [esi+TImage.wrapH]

        shl     ebx, 2
        mov     [.stepY], ebx

        mov     edi, [.drect.top]
        add     edi, [esi+TImage.orgY]
        cmp     edi, ecx
        jb      @f
        sub     edi, ecx
@@:
        imul    edi, ebx
        imul    ecx, ebx
        add     edi, [esi+TImage.pPixels]
        add     ecx, [esi+TImage.pPixels]

        mov     [.wrapY], ecx

        mov     edx, [esi+TImage.wrapW]

        mov     ecx, [.drect.left]
        add     ecx, [esi+TImage.orgX]
        cmp     ecx, edx
        jb      @f
        sub     ecx, edx
@@:
        mov     [.drect.left], ecx

        stdcall __fix_color, [.color], regEAX

; prepare MMX constants

        pxor    mm0, mm0        ; mm0 = 0000 0000 0000 0000
        pcmpeqw mm1, mm1                                        ; mm1 = ffff ffff ffff ffff
        psrlw   mm1, 8                                         ; mm1 = 00ff 00ff 00ff 00ff

; the color
        movd    mm7, eax

        movq    mm5, mm7
        psrlq   mm5, 24                 ; alpha source
        punpckldq mm5, mm5
        packssdw  mm5, mm5              ; mm5 = As, As, As, As

        movq    mm4, mm1
        psubw   mm4, mm5                ; mm4 = Bs Bs Bs Bs     (Bs = $100 - As)

        punpcklbw mm7, mm0              ; byte to word source pixel
        psllw     mm7, 8                ; Cs = Cs*256

        xor     edx, edx

.loopY:
        mov     ecx, [.drect.right]
        mov     ebx, [.drect.left]

.loopX:
        movd    mm6, [edi+4*ebx]        ; destination pixel.
        punpcklbw mm6, mm0              ; byte to word destination pixel
        pmullw  mm6, mm4                ; mm6 = Cd = Cd * (256-As) = Cd * Bs   (For alpha Ad = Ad*Bs)
        paddusw mm6, mm7                ; Cd = Cs + Cd
        psrlw   mm6, 8                  ; Cd = Cd/256

        packuswb mm6, mm0               ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
        movd     [edi+4*ebx], mm6

        inc     ebx
        cmp     ebx, [esi+TImage.wrapW]
        cmove   ebx, edx

        dec     ecx
        jnz     .loopX

; next Y
        add     edi, [.stepY]
        cmp     edi, [.wrapY]
        cmove   edi, [esi+TImage.pPixels]

        dec     [.drect.bottom]
        jnz     .loopY

        emms
        stdcall UnlockImg, [.pDstImage]

.finish:
        popad
        return
endp




proc XorRect, .pDstImage, .x, .y, .width, .height, .mask
.drect RECT
.rect  RECT
.stepy dd ?
begin
        pushad

        mov     esi, [.pDstImage]

        xor     eax, eax
        mov     ecx, [esi+TImage.wrapW]
        mov     edx, [esi+TImage.wrapH]

        mov     [.drect.left], eax
        mov     [.drect.top], eax
        mov     [.drect.right], ecx
        mov     [.drect.bottom], edx

        mov     ecx, [.x]
        mov     edx, [.y]

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        add     ecx, [.width]
        add     edx, [.height]

        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     ecx, [.drect]
        lea     edx, [.rect]
        stdcall RectIntersect, ecx, ecx, edx
        jc      .finish

        stdcall LockImg, esi
        jc      .finish

; [.drect] contains the destination rectangle

        mov     eax, [esi+TImage.width]
        shl     eax, 2
        mov     [.stepy], eax

        mov     edi, [.drect.top]
        add     edi, [esi+TImage.orgY]
        cmp     edi, [esi+TImage.wrapH]
        jb      @f
        sub     edi, [esi+TImage.wrapH]
@@:
        imul    edi, [.stepy]
        add     edi, [esi+TImage.pPixels]       ; the address of the starting line of the rectangle.

        mov     eax, [.drect.left]
        mov     edx, [.drect.right]

        add     eax, [esi+TImage.orgX]
        add     edx, [esi+TImage.orgX]

        cmp     eax, [esi+TImage.wrapW]
        jbe     @f
        sub     eax, [esi+TImage.wrapW]
@@:
        cmp     edx, [esi+TImage.wrapW]
        jbe     @f
        sub     edx, [esi+TImage.wrapW]
@@:
        mov     [.drect.left], eax
        mov     [.drect.right], edx

        mov     ecx, [.drect.bottom]
        add     ecx, [esi+TImage.orgY]
        cmp     ecx, [esi+TImage.wrapH]
        jb      @f
        sub     ecx, [esi+TImage.wrapH]
@@:
        imul    ecx, [.stepy]
        add     ecx, [esi+TImage.pPixels]       ; the address of the end of the rectangle.

        mov     edx, [esi+TImage.wrapH]
        imul    edx, [.stepy]
        add     edx, [esi+TImage.pPixels]       ; the address of the Y wrap

        mov     eax, [.mask]

.loopY:

        mov     ebx, [.drect.right]      ; the end of the rect.

.loopX:
        dec     ebx
        cmovs   ebx, [esi+TImage.wrapW]

        xor     dword [edi+4*ebx], eax  ; fill the color, does not affect the flags.

        cmp     ebx, [.drect.left]
        jne     .loopX

        add     edi, [.stepy]

        cmp     edi, edx
        jb      @f
        mov     edi, [esi+TImage.pPixels]
@@:
        cmp     edi, ecx
        jne     .loopY

        stdcall UnlockImg, [.pDstImage]
        clc

.finish:
        popad
        return
endp





proc __fix_color, .color, .reg
begin
        pushad

        movzx   ebx, byte [.color+3]    ; alpha
        mov     ecx, ebx

        mov     esi, $ff

        movzx   eax, byte [.color+2]    ; red
        mul     ebx
        div     esi

        shl     ecx, 8
        mov     cl, al

        movzx   eax, byte [.color+1]    ; green
        mul     ebx
        div     esi

        shl     ecx, 8
        mov     cl, al

        movzx   eax, byte [.color]      ; blue
        mul     ebx
        div     esi

        shl     ecx, 8
        mov     cl, al

        mov     eax, [.reg]
        lea     eax, [esp+4*eax]

        mov     [eax], ecx
        popad
        return
endp




trtUpper = 0
trtLower = 1
trtLeft  = 0
trtRight = 2


proc BlendTriangle, .pDstImage, .x, .y, .size, .kind, .color
.drect RECT
.rect  RECT
.back  dd ?
begin
        pushad

        mov     esi, [.pDstImage]

        xor     eax, eax
        mov     ecx, [esi+TImage.width]
        mov     edx, [esi+TImage.height]

        mov     [.drect.left], eax
        mov     [.drect.top], eax
        mov     [.drect.right], ecx
        mov     [.drect.bottom], edx

        mov     ecx, [.x]
        mov     edx, [.y]

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        add     ecx, [.size]
        add     edx, [.size]

        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     ecx, [.drect]
        lea     edx, [.rect]
        stdcall RectIntersect, ecx, ecx, edx
        jc      .finish

        stdcall LockImg, esi
        jc      .finish

; [.drect] contains the destination rectangle

        mov     ecx, [.drect.right]
        mov     edx, [.drect.bottom]
        sub     ecx, [.drect.left]
        sub     edx, [.drect.top]

        mov     edi, [.drect.top]
        imul    edi, [esi+TImage.width]
        add     edi, [.drect.left]
        lea     edi, [edi*4]
        add     edi, [esi+TImage.pPixels]

        mov     esi, [esi+TImage.width]
        lea     esi, [4*esi]

        stdcall __fix_color, [.color], regEAX
        mov     [.color], eax
        and     [.back], 0

.loopY:
        mov     ebx, ecx     ; the width of the source rectangle

.loopX:
        dec     ebx
        js      .next_y

        cmp     [.kind], trtUpper or trtLeft    ; 0
        je       .upperleft

        cmp     [.kind], trtLower or trtLeft    ; 1
        je      .lowerleft

        cmp     [.kind], trtUpper or trtRight   ; 2
        je      .upperright

        cmp     [.kind], trtLower or trtRight   ; 3
        je      .lowerright

.put_pixel:
        stdcall _BlendPixel, [edi+4*ebx], [.color]
        mov     [edi+4*ebx], eax
        jmp     .loopX

.upperleft:
        cmp     ebx, edx
        jae     .loopX
        jmp     .put_pixel

.lowerleft:
        cmp     ebx, [.back]
        jae     .loopX
        jmp     .put_pixel

.upperright:
        cmp     ebx, [.back]
        jb      .loopX
        jmp     .put_pixel

.lowerright:
        cmp     ebx, edx
        jb      .loopX
        jmp     .put_pixel

.next_y:
        add     edi, esi
        inc     [.back]
        dec     edx
        jnz     .loopY

        stdcall UnlockImg, [.pDstImage]

.finish:
        popad
        return
endp





; Draws horizontal line from .x1 to .x2 on y with color [.color]
;
;

proc DrawHLine, .pImage, .x1, .x2, .y, .color
begin






        return
endp






proc DrawVLine, .pImage, .y1, .y2, .x, .color
begin


        return
endp




proc ScrollImageH, .pImage, .dist
begin
        pushad

        mov     esi, [.pImage]
        mov     ecx, [esi+TImage.wrapW]

        mov     eax, [esi+TImage.orgX]
        add     eax, [.dist]
        jns     @f
        add     eax, ecx
@@:
        cmp     eax, ecx
        jl      @f
        sub     eax, ecx
@@:
        mov     [esi+TImage.orgX], eax

        popad
        return
endp


proc ScrollImageV, .pImage, .dist
begin
        pushad

        mov     esi, [.pImage]
        mov     ecx, [esi+TImage.wrapH]

        mov     eax, [esi+TImage.orgY]
        add     eax, [.dist]
        jns     @f
        add     eax, ecx
@@:
        cmp     eax, ecx
        jl      @f
        sub     eax, ecx
@@:
        mov     [esi+TImage.orgY], eax
        popad
        return
endp










proc ScrollRectUp2, .pDstImage, .x, .y, .width, .height, .lines
.drect RECT
.rect  RECT
begin
        pushad

        mov     esi, [.pDstImage]

        xor     eax, eax
        mov     ecx, [esi+TImage.width]
        mov     edx, [esi+TImage.height]

        mov     [.drect.left], eax
        mov     [.drect.top], eax
        mov     [.drect.right], ecx
        mov     [.drect.bottom], edx

        mov     ecx, [.x]
        mov     edx, [.y]

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        add     ecx, [.width]
        add     edx, [.height]

        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     ecx, [.drect]
        lea     edx, [.rect]
        stdcall RectIntersect, ecx, ecx, edx
        jc      .finish


        stdcall LockImg, esi
        jc      .finish

; here [.srect] contains the source rectange
; [.drect] contains the destination rectangle
; the width and height of the rectangles  is the same.

        mov     ebx, [.drect.right]
        mov     edx, [.drect.bottom]
        sub     ebx, [.drect.left]      ; width of the rect in pixels.
        sub     edx, [.drect.top]
        sub     edx, [.lines]           ; height of the rect.
        jc      .end_scroll

        mov     edi, [.drect.top]
        imul    edi, [esi+TImage.width]
        add     edi, [.drect.left]
        lea     edi, [edi*4]
        add     edi, [esi+TImage.pPixels]

        mov     eax, [esi+TImage.width]
        mov     ecx, eax
        sub     eax, ebx
        lea     eax, [4*eax]            ; the skip count in bytes.

        imul    ecx, [.lines]
        lea     esi, [edi+4*ecx]        ; the source address.

.loopY:
        mov     ecx, ebx
        rep movsd               ; loop X

        lea     esi, [esi+eax]
        lea     edi, [edi+eax]

        dec     edx
        jnz     .loopY

.end_scroll:
        stdcall UnlockImg, [.pDstImage]

.finish:
        popad
        return
endp



proc ScrollRectDn2, .pDstImage, .x, .y, .width, .height, .lines
.drect RECT
.rect  RECT
begin
        pushad

        mov     esi, [.pDstImage]

        xor     eax, eax
        mov     ecx, [esi+TImage.width]
        mov     edx, [esi+TImage.height]

        mov     [.drect.left], eax
        mov     [.drect.top], eax
        mov     [.drect.right], ecx
        mov     [.drect.bottom], edx

        mov     ecx, [.x]
        mov     edx, [.y]

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        add     ecx, [.width]
        add     edx, [.height]

        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx


        lea     ecx, [.drect]
        lea     edx, [.rect]
        stdcall RectIntersect, ecx, ecx, edx
        jc      .finish

        stdcall LockImg, esi
        jc      .finish

        mov     ebx, [.drect.right]
        mov     edx, [.drect.bottom]
        sub     ebx, [.drect.left]      ; width of the rect in pixels.
        sub     edx, [.drect.top]
        sub     edx, [.lines]           ; height of the rect.
        jc      .end_scroll

        mov     edi, [.drect.bottom]
        dec     edi
        imul    edi, [esi+TImage.width]
        add     edi, [.drect.left]


        lea     edi, [edi*4]
        add     edi, [esi+TImage.pPixels]

        mov     eax, [esi+TImage.width]
        mov     ecx, eax
        add     eax, ebx
        lea     eax, [4*eax]            ; the skip count in bytes.
        neg     eax

        imul    ecx, [.lines]
        neg     ecx
        lea     esi, [edi+4*ecx]        ; the source address.
        neg     ecx

.loopY:
        mov     ecx, ebx
        rep movsd               ; loop X

        lea     esi, [esi+eax]
        lea     edi, [edi+eax]

        dec     edx
        jnz     .loopY

.end_scroll:

        cld
        stdcall UnlockImg, [.pDstImage]

.finish:
        popad
        return
endp






proc ScrollRectLeft2, .pDstImage, .x, .y, .width, .height, .cols
.drect RECT
.rect  RECT
begin
        pushad

        mov     esi, [.pDstImage]

        xor     eax, eax
        mov     ecx, [esi+TImage.width]
        mov     edx, [esi+TImage.height]

        mov     [.drect.left], eax
        mov     [.drect.top], eax
        mov     [.drect.right], ecx
        mov     [.drect.bottom], edx

        mov     ecx, [.x]
        mov     edx, [.y]

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        add     ecx, [.width]
        add     edx, [.height]

        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     ecx, [.drect]
        lea     edx, [.rect]
        stdcall RectIntersect, ecx, ecx, edx
        jc      .finish


        stdcall LockImg, esi
        jc      .finish

; [.drect] contains the destination rectangle

        mov     ebx, [.drect.bottom]
        mov     edx, [.drect.right]
        sub     ebx, [.drect.top]       ; height of the rect.
        sub     edx, [.drect.left]      ; width of the rect in pixels.
        sub     edx, [.cols]
        jc      .end_scroll

        mov     edi, [.drect.top]
        imul    edi, [esi+TImage.width]
        add     edi, [.drect.left]
        lea     edi, [edi*4]
        add     edi, [esi+TImage.pPixels]       ; pointer to the begining of the drect

        mov     eax, [esi+TImage.width]
        mov     ecx, [.cols]
        sub     eax, edx

        lea     esi, [edi+4*ecx]        ; the source address.

.loopY:
        mov     ecx, edx
        rep movsd               ; loop X

        lea     esi, [esi+4*eax]
        lea     edi, [edi+4*eax]

        dec     ebx
        jnz     .loopY

.end_scroll:
        stdcall UnlockImg, [.pDstImage]

.finish:
        popad
        return
endp




proc ScrollRectRight2, .pDstImage, .x, .y, .width, .height, .cols
.drect RECT
.rect  RECT
begin
        pushad

        mov     esi, [.pDstImage]

        xor     eax, eax
        mov     ecx, [esi+TImage.width]
        mov     edx, [esi+TImage.height]

        mov     [.drect.left], eax
        mov     [.drect.top], eax
        mov     [.drect.right], ecx
        mov     [.drect.bottom], edx

        mov     ecx, [.x]
        mov     edx, [.y]

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        add     ecx, [.width]
        add     edx, [.height]

        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     ecx, [.drect]
        lea     edx, [.rect]
        stdcall RectIntersect, ecx, ecx, edx
        jc      .finish


        stdcall LockImg, esi
        jc      .finish

; [.drect] contains the destination rectangle

        mov     ebx, [.drect.bottom]
        mov     edx, [.drect.right]
        sub     ebx, [.drect.top]       ; height of the rect.
        sub     edx, [.drect.left]      ; width of the rect in pixels.
        sub     edx, [.cols]
        jc      .end_scroll

        mov     edi, [.drect.top]
        imul    edi, [esi+TImage.width]
        add     edi, [.drect.left]
        add     edi, edx

        lea     edi, [edi*4-4]
        add     edi, [esi+TImage.pPixels]       ; pointer to the begining of the drect

        mov     eax, [esi+TImage.width]
        mov     ecx, [.cols]
        add     eax, edx

        neg     ecx
        lea     esi, [edi+4*ecx]        ; the source address.

        std

.loopY:
        mov     ecx, edx
        rep movsd               ; loop X

        lea     esi, [esi+4*eax]
        lea     edi, [edi+4*eax]

        dec     ebx
        jnz     .loopY

        cld

.end_scroll:
        stdcall UnlockImg, [.pDstImage]

.finish:
        popad
        return
endp




proc ApplyAlphaRect, .pImage, .x, .y, .width, .height, .alpha
.drect RECT
.rect  RECT
begin
        pushad

        mov     edi, [.pImage]

        xor     eax, eax
        mov     ecx, [edi+TImage.width]
        mov     edx, [edi+TImage.height]

        mov     [.drect.left], eax
        mov     [.drect.top], eax
        mov     [.drect.right], ecx
        mov     [.drect.bottom], edx

        mov     ecx, [.x]
        mov     edx, [.y]

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        add     ecx, [.width]
        add     edx, [.height]

        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     ecx, [.drect]
        lea     edx, [.rect]
        stdcall RectIntersect, ecx, ecx, edx
        jc      .finish


        stdcall LockImg, edi

; here [.drect] contains the destination rectangle

        mov     ecx, [.drect.left]
        mov     edx, [.drect.top]
        sub     [.drect.right], ecx
        sub     [.drect.bottom], edx

        imul    edx, [edi+TImage.width]
        add     edx, [.drect.left]
        shl     edx, 2

        add     edx, [edi+TImage.pPixels]       ; pointer to the upper left corner of the rect.

        mov     edi, [edi+TImage.width]
        lea     edi, [4*edi]


.loopY:
        mov     ebx, [.drect.right]     ; the width of the source rectangle

.loopX:
        dec     ebx                     ; The ZF will not be changed later in the inner loop.
        js      .nextY


        movzx   eax, byte [edx+4*ebx+3]         ; dest alpha.
        movzx   ecx, byte [.alpha]

; Ad = Ad * [.alpha]/256

        imul    eax, ecx
        sar     eax, 8

        mov     [edx+4*ebx+3], al
        jmp     .loopX

.nextY:
        add     edx, edi
        dec     [.drect.bottom]
        jnz     .loopY


        stdcall UnlockImg, [.pImage]

.finish:
        popad
        return
endp




proc FilterDisabled, .pImage, .no_alpha
.gray dd ?
.alpha dd ?
begin
        pushad

        mov     edi, [.pImage]

        stdcall LockImg, edi

        mov     ebx, [edi+TImage.width]
        mov     ecx, [edi+TImage.height]

        mov     edi, [edi+TImage.pPixels]


.outloop:
        dec     ecx
        js      .finish

        mov     esi, ebx      ; Counter from 0 to IconWidth-1
        inc     esi

.inloop:
        dec     esi
        jz      .outloop

        movzx   eax, byte [edi]         ; blue
        movzx   edx, byte [edi+1]       ; green

        lea     edx, [edx+2*eax]        ;  2*Blue + Green

        movzx   eax, byte [edi+2]
        add     edx, eax                ; + Red

        movzx   eax, byte [edi+3]       ; Alpha
        mov     [.alpha], eax

        shr     edx, 2          ; div 4 -> Grayscale pixel.
                                ; This formula gives more realistic view.

        mov     [.gray], edx

; blend alpha

        cmp     [.no_alpha], 0
        jne     .store

        imul    eax, esi
        cdq
        div     ebx
        mov     [.alpha], eax

        mov     eax, [.gray]
        imul    eax, esi
        cdq
        div     ebx
        mov     [.gray], eax

.store:

        mov     al, byte [.alpha]
        shl     eax, 8
        mov     al ,byte [.gray]
        shl     eax, 8
        mov     al ,byte [.gray]
        shl     eax, 8
        mov     al ,byte [.gray]

        stosd
        jmp     .inloop

.finish:
        stdcall UnlockImg, [.pImage]

        popad
        return
endp


endmodule

Added freshlib/graphics/fonts.asm.







































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Fonts managing library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: This file contains OS independent part of the library and includes respective
;         OS dependent files.
;_________________________________________________________________________________________
module "Fonts library"

ffItalic    = 1
ffUnderline = 2
ffStrikeOut = 4

ffMonospaced = $80


fwLight     = 0
fwDemilight = 1
fwNormal    = 2
fwMedium    = 3
fwDemibold  = 4
fwBold      = 5
fwExtraBold = 6
fwBlack     = 7

fwMask = 7


struct __TFont
  .hFontFace      dd ?    ; The name of the font face.
  .height         dd ?    ; The character height in pixels.
  .weight         dd ?    ; The weight of the characters.
  .flags          dd ?    ; ffItalic, ffMonospaced, etc.
ends


interface FontCreate, .font_name, .size, .weight, .flags

interface FontDestroy, .pFont


; returns some font metrics
;
; Arguments:
;    .font - the font
; Returns:
;    EAX - the line height of the font.
;    EBX - the ascender of the font.
;    EDX - the descender of the font.

interface GetFontMetrics, .font


; returns TArray of fontface names.
interface GetFontList, .font


include '%TargetOS%/fonts.asm'

endmodule

Changes to freshlib/graphics/giflib.asm.

1
2

3

4
5

6
7





8
9
10
11
12
13
14
15
16

17
18
19
20
21
22
23
GifLib:
;===============================================================================

;       FreshGif v1.2 - (C) Copyright by Exagone

;===============================================================================
; The included Fresh artistic license (see license.txt) applies to this source

; code. By using this code, you agree to the terms of the license.
;





; Original source code by Exagone
; http://exagone.cjb.net | http://www.exagone.org
; _thomas_@mailroom.com
;===============================================================================
; (c)2004 John Found - Port for FASM/Fresh cleanup and improvements.
; http://flatassembler.net
; http://fresh.flatassembler.net
;===============================================================================



struct TGifInfo
;--- Header ---
  .GIFVersion       rb      3    ; 3 byte string (not 0-terminated) that identifies
                                 ; the GIF Version (like 97a or 98a)
; --- Logical screen descriptor ---
  .dwLSWidth        dd      ?    ; Logical screen width
<
<
>
|
>
|
<
>
|

>
>
>
>
>
|
|
|
<
<
<
<
<
|
>









1
2
3
4

5
6
7
8
9
10
11
12
13
14
15





16
17
18
19
20
21
22
23
24


; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|

;
;  Description: GIF images decoding library.
;
;  Target OS: Any
;
;  Dependencies: memory.asm; files.asm
;
;  Notes:
;         Original source code by Exagone
;         http://exagone.cjb.net | http://www.exagone.org
;         _thomas_@mailroom.com





;_________________________________________________________________________________________
module "GIF library"

struct TGifInfo
;--- Header ---
  .GIFVersion       rb      3    ; 3 byte string (not 0-terminated) that identifies
                                 ; the GIF Version (like 97a or 98a)
; --- Logical screen descriptor ---
  .dwLSWidth        dd      ?    ; Logical screen width
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
        stdcall _GIFInitalizeDecoder, esi
        jz       .quit

        stdcall CreateImage, [esi+TGifInfo.dwImageWidth], [esi+TGifInfo.dwImageHeight], 32
        jc      .error
        mov     edi, eax

        push    [edi+TImage.pData]
        pop     [esi+TGifInfo.lpImageData]

        stdcall _GIFDecompress, esi
        jz      .quit

        stdcall _GIFCleanup, esi








|







102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
        stdcall _GIFInitalizeDecoder, esi
        jz       .quit

        stdcall CreateImage, [esi+TGifInfo.dwImageWidth], [esi+TGifInfo.dwImageHeight], 32
        jc      .error
        mov     edi, eax

        push    [edi+TImage.pPixels]
        pop     [esi+TGifInfo.lpImageData]

        stdcall _GIFDecompress, esi
        jz      .quit

        stdcall _GIFCleanup, esi

123
124
125
126
127
128
129
130
131
132
133
134
135
136
137


;===============================================================================
;       GIFLoadFile
;===============================================================================
; Loads gif data from a file
; returns pointer to TImage
proc ImageGifLoafFromFile, .lpFile
begin
        push    ecx

        stdcall LoadBinaryFile, [.lpFile]
        push    eax

        stdcall CreateImageGIF, eax, ecx







|







124
125
126
127
128
129
130
131
132
133
134
135
136
137
138


;===============================================================================
;       GIFLoadFile
;===============================================================================
; Loads gif data from a file
; returns pointer to TImage
proc ImageGifLoadFromFile, .lpFile
begin
        push    ecx

        stdcall LoadBinaryFile, [.lpFile]
        push    eax

        stdcall CreateImageGIF, eax, ecx
306
307
308
309
310
311
312


313
314
315
316
317
318
319
        push    ebx
        shl     ebx, 2

        ; --- If no space left, make the table bigger:
        cmp     ebx, ecx
        jne     .sizeok



        shl     ecx, 1          ;Table size doubles
        mov     [esi+TGifInfo.dwLZWTableSize], ecx

        ; --- Reallocate memory ---
        stdcall ResizeMem, [esi+TGifInfo.lpLZWTable], ecx
        mov     [esi+TGifInfo.lpLZWTable], eax








>
>







307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
        push    ebx
        shl     ebx, 2

        ; --- If no space left, make the table bigger:
        cmp     ebx, ecx
        jne     .sizeok

;        lea     ecx, [3*ecx]
;        shr     ecx, 1
        shl     ecx, 1          ;Table size doubles
        mov     [esi+TGifInfo.dwLZWTableSize], ecx

        ; --- Reallocate memory ---
        stdcall ResizeMem, [esi+TGifInfo.lpLZWTable], ecx
        mov     [esi+TGifInfo.lpLZWTable], eax

945
946
947
948
949
950
951
952

.endloop:
        inc     eax
        return
endp


DispSize 'GifLib', $ - GifLib







|
948
949
950
951
952
953
954
955

.endloop:
        inc     eax
        return
endp


endmodule

Changes to freshlib/graphics/images.asm.
















1
2
3
4
5




6

7
8





















































































































































































































































































































































































































































































































































































































































































































































































































































































































9
10

















struct TImage
  .width  dd ?  ; width in pixels.
  .height dd ?  ; height in pixels.
  .bpp    dd ?  ; bits per pixel.
  .pData  dd ?  ; pointer to memory buffer with scanlines. all scanlines are aligned on dword.




  .raster dd ?  ; OS handle to be used with procedures from other graphics libraries.

ends























































































































































































































































































































































































































































































































































































































































































































































































































































































































include '%TargetOS%/images.asm'


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|
|
|
|
>
>
>
>
|
>


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Memory based images manipulation library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Include respective OS dependent files.
;_________________________________________________________________________________________
module "Images library"

struct TImage
  .width     dd ?  ; width in pixels.
  .height    dd ?  ; height in pixels.
  .pPixels   dd ?  ; pointer to the pixel memory.

  .orgX      dd ?
  .orgY      dd ?
  .wrapW     dd ?
  .wrapH     dd ?

  .lock      TMutex
ends


; Creates memory image with parameters specified.
interface CreateImage2, .width, .height, .fScreen


interface DestroyImage, .ptrImage


; Draws the image on a OS provided window surface.
interface DrawImageRect, .where, .pImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height


interface LockImg, .pImage
interface UnlockImg, .pImage



; Sets the wrap parameters of the image.
; Arguments:
;    .pImage - pointer to the TImage
;    .newWrapW - new wrap width
;    .newWrapH - new wrap height
;
; After this operation, the orgX and orgY of the image are set both to 0
; without affecting the image itself.
;
; As long as on moving orgX and orgY, the image need to be rearanged,
; the operation is relatively slow.
; So, use it carefully.

proc SetImageWrap, .pImage, .newWrapW, .newWrapH
begin
        pushad
        mov     ebx, [.pImage]
        test    ebx, ebx
        jz      .finish

        stdcall LockImg, ebx
        jc      .finish

        stdcall ZeroOrgImage, ebx

        mov     ecx, [.newWrapW]
        mov     edx, [.newWrapH]
        cmp     ecx, [ebx+TImage.width]
        cmova   ecx, [ebx+TImage.width]
        cmp     edx, [ebx+TImage.height]
        cmova   edx, [ebx+TImage.height]

        mov     eax, 1
        test    ecx, ecx
        cmovz   ecx, eax
        test    edx, edx
        cmovz   edx, eax

        mov     [ebx+TImage.wrapW], ecx
        mov     [ebx+TImage.wrapH], edx

        stdcall UnlockImg, ebx
        clc

.finish:
        popad
        return
endp




proc ZeroOrgImage, .pImage
.imgL dd ?
.imgU dd ?
begin
        pushad

        mov     ebx, [.pImage]

        test    ebx, ebx
        jz      .finish

        xor     edx, edx
        mov     [.imgL], edx
        mov     [.imgU], edx

        cmp     [ebx+TImage.orgX], edx
        je      .imgL_ok

        stdcall CreateImage2, [ebx+TImage.orgX], [ebx+TImage.wrapH], FALSE
        jc      .imgL_ok

        mov     [.imgL], eax
        stdcall CopyImageRect, eax, 0, 0, ebx, 0, 0, [ebx+TImage.orgX], [ebx+TImage.wrapH]

.imgL_ok:
        cmp     [ebx+TImage.orgY], edx
        je      .imgU_ok

        stdcall CreateImage2, [ebx+TImage.wrapW], [ebx+TImage.orgY], FALSE
        jc      .imgU_ok

        mov     [.imgU], eax
        mov     ecx, [ebx+TImage.wrapW]
        sub     ecx, [ebx+TImage.orgX]
        stdcall CopyImageRect, eax, 0, 0, ebx, [ebx+TImage.orgX], 0, ecx, [ebx+TImage.orgY]

.imgU_ok:
        mov     ecx, [ebx+TImage.wrapW]
        mov     edi, [ebx+TImage.wrapH]
        sub     ecx, [ebx+TImage.orgX]
        sub     edi, [ebx+TImage.orgY]
        xor     esi, esi

        cmp     [ebx+TImage.orgX], edx
        je      .scrollx_ok

        inc     esi
        stdcall ScrollRectLeft2, ebx, 0, [ebx+TImage.orgY], [ebx+TImage.wrapW], edi, [ebx+TImage.orgX]
        stdcall CopyImageRect, ebx, ecx, [ebx+TImage.orgY], [.imgL], 0, [ebx+TImage.orgY], [ebx+TImage.orgX], edi

.scrollx_ok:

        cmp     [ebx+TImage.orgY], edx
        je      .scrolly_ok

        inc     esi
        stdcall ScrollRectUp2, ebx, 0, 0, [ebx+TImage.wrapW], [ebx+TImage.wrapH], [ebx+TImage.orgY]
        stdcall CopyImageRect, ebx, 0, edi, [.imgU], 0, 0, ecx, [ebx+TImage.orgY]

.scrolly_ok:
        cmp     esi, 2
        jne     .lower_right_ok

        stdcall CopyImageRect, ebx, ecx, edi, [.imgL], 0, 0, [ebx+TImage.orgX], [ebx+TImage.orgY]

.lower_right_ok:

        mov     [ebx+TImage.orgX], edx
        mov     [ebx+TImage.orgY], edx


        stdcall DestroyImage, [.imgL]
        stdcall DestroyImage, [.imgU]

.finish:
        popad
        return
endp



proc BlendImage, .pDstImage, .xDst, .yDst, .pSrcImage, .xSrc, .ySrc, .width, .height
.srect RECT
.drect RECT
.rect  RECT

.srcYstep dd ?
.dstYstep dd ?

.srcWrapX dd ?
.dstWrapX dd ?

.srcWrapY dd ?
.dstWrapY dd ?

.srcStartX dd ?
.dstStartX dd ?

begin
        pushad

        mov     esi, [.pSrcImage]
        mov     edi, [.pDstImage]

        xor     eax, eax
        mov     ecx, [esi+TImage.wrapW]
        mov     edx, [esi+TImage.wrapH]

        mov     [.srect.left], eax
        mov     [.srect.top], eax
        mov     [.srect.right], ecx
        mov     [.srect.bottom], edx

        mov     ecx, [edi+TImage.wrapW]
        mov     edx, [edi+TImage.wrapH]

        mov     [.drect.left], eax
        mov     [.drect.top], eax
        mov     [.drect.right], ecx
        mov     [.drect.bottom], edx

        mov     ecx, [.xSrc]
        mov     edx, [.ySrc]

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        add     ecx, [.width]
        add     edx, [.height]

        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     ecx, [.srect]
        lea     edx, [.rect]
        stdcall RectIntersect2, ecx, edx
        jc      .finish

        mov     ecx, [.xSrc]
        mov     edx, [.ySrc]
        sub     ecx, [.xDst]
        sub     edx, [.yDst]

; convert the rect to the destination coordinates.
        sub     [.srect.left], ecx
        sub     [.srect.top], edx
        sub     [.srect.right], ecx
        sub     [.srect.bottom], edx

        lea     eax, [.srect]
        lea     ebx, [.drect]
        stdcall RectIntersect2, ebx, eax
        jc      .finish

        stdcall RectCopy, eax, ebx      ; srect = drect

;convert back to source coordinates.
        add     [.srect.left], ecx
        add     [.srect.top], edx
        add     [.srect.right], ecx
        add     [.srect.bottom], edx

; here [.srect] contains the source rectange
; [.drect] contains the destination rectangle
; the width and height of the rectangles  is the same.

        mov     eax, [.srect.top]
        sub     [.srect.bottom], eax    ; only the rect height is important.

        mov     ecx, [esi+TImage.width]
        mov     edx, [edi+TImage.width]
        lea     ecx, [4*ecx]
        lea     edx, [4*edx]

        mov     [.srcYstep], ecx
        mov     [.dstYstep], edx

        mov     ecx, [esi+TImage.wrapH]
        mov     edx, [edi+TImage.wrapH]
        imul    ecx, [.srcYstep]
        imul    edx, [.dstYstep]
        add     ecx, [esi+TImage.pPixels]
        add     edx, [edi+TImage.pPixels]
        mov     [.srcWrapY], ecx
        mov     [.dstWrapY], edx


        mov     eax, [.srect.right]
        mov     ebx, [.drect.right]

        add     eax, [esi+TImage.orgX]
        add     ebx, [edi+TImage.orgY]

        cmp     eax, [esi+TImage.wrapW]
        jb      @f
        sub     eax, [esi+TImage.wrapW]
@@:

        cmp     ebx, [edi+TImage.wrapW]
        jb      @f
        sub     ebx, [edi+TImage.wrapW]
@@:
        mov     [.srcStartX], eax
        mov     [.dstStartX], ebx

        mov     eax, [esi+TImage.wrapW]
        mov     ebx, [edi+TImage.wrapW]
        dec     eax
        dec     ebx
        mov     [.srcWrapX], eax
        mov     [.dstWrapX], ebx

        mov     ecx, [.srect.top]
        mov     edx, [.drect.top]
        add     ecx, [esi+TImage.orgY]
        add     edx, [edi+TImage.orgY]

        cmp     ecx, [esi+TImage.wrapH]
        jb      @f
        sub     ecx, [esi+TImage.wrapH]
@@:

        cmp     edx, [edi+TImage.wrapH]
        jb      @f
        sub     edx, [edi+TImage.wrapH]
@@:
        imul    ecx, [.srcYstep]
        imul    edx, [.dstYstep]
        add     ecx, [esi+TImage.pPixels]
        add     edx, [edi+TImage.pPixels]

; lock the images.
        stdcall LockImg, esi
        jc      .finish

        stdcall LockImg, edi
        jc      .finish2

; prepare MMX constants

        pxor    mm0, mm0        ; mm0 = 0000 0000 0000 0000
        pcmpeqw mm1, mm1                                        ; mm1 = ffff ffff ffff ffff
        psrlw   mm1, 8                                         ; mm1 = 00ff 00ff 00ff 00ff

;        psrlw   mm1, 15                                         ; mm1 = 0001 0001 0001 0001
;        psllw   mm1, 8          ; mm1 = 0100 0100 0100 0100

.loopY:
        mov     eax, [.srect.right]
        sub     eax, [.srect.left]
        mov     [.width], eax

        mov     eax, [.srcStartX]
        mov     ebx, [.dstStartX]

.loopX:
        dec     eax
        cmovs   eax, [.srcWrapX]

        dec     ebx
        cmovs   ebx, [.dstWrapX]

        movd    mm7, [ecx+4*eax]        ; source pixel.
        movd    mm6, [edx+4*ebx]        ; destination pixel.

        movq    mm5, mm7
        psrlq   mm5, 24                 ; alpha source
        punpckldq mm5, mm5
        packssdw  mm5, mm5              ; mm5 = As, As, As, As

        movq    mm4, mm1
        psubw   mm4, mm5                ; mm4 = Bs Bs Bs Bs     (Bs = $100 - As)

        punpcklbw mm6, mm0              ; byte to word destination pixel
        punpcklbw mm7, mm0              ; byte to word source pixel
        psllw     mm7, 8                ; Cs = Cs*256

        pmullw  mm6, mm4                ; mm6 = Cd = Cd * (256-As) = Cd * Bs   (For alpha Ad = Ad*Bs)
        paddusw mm6, mm7                ; Cd = Cs + Cd
        psrlw   mm6, 8                  ; Cd = Cd/256

        packuswb mm6, mm0               ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
        movd     [edx+4*ebx], mm6

        dec     [.width]
        jnz     .loopX

.nextY:
        add     ecx, [.srcYstep]
        cmp     ecx, [.srcWrapY]
        cmove   ecx, [esi+TImage.pPixels]

        add     edx, [.dstYstep]
        cmp     edx, [.dstWrapY]
        cmove   edx, [edi+TImage.pPixels]

        dec     [.srect.bottom]
        jnz     .loopY

        emms

; unlock the images.
        stdcall UnlockImg, edi

.finish2:
        stdcall UnlockImg, esi

.finish:
        popad
        return
endp



proc BlendImageTileWrap, .pDstImage, .xDst, .yDst, .wDst, .hDst, .pSrcImage

.srcXOffs dd ?
.srcXwrap dd ?

.srcYoffs dd ?
.srcYwrap dd ?

.dstXbegn dd ?
.dstXwrap dd ?
.dstYoffs dd ?
.dstYwrap dd ?

.stepYSrc dd ?
.stepYDst dd ?

.srcY0    dd ?
.dstY0    dd ?

begin
        pushad

        mov     esi, [.pSrcImage]
        mov     edi, [.pDstImage]

; lock the images.
        stdcall LockImg, esi
        jc      .finish

        stdcall LockImg, edi
        jc      .finish2

; step Y, source, destination

        mov     ecx, [esi+TImage.width]
        mov     edx, [edi+TImage.width]
        shl     ecx, 2
        shl     edx, 2
        mov     [.stepYSrc], ecx
        mov     [.stepYDst], edx

; Destination Y offset + wrap:

        mov     eax, [.yDst]
        mov     ebx, [edi+TImage.wrapH]

        add     eax, [edi+TImage.orgY]
        cmp     eax, ebx
        jb      @f
        sub     eax, ebx
@@:
        mov     ecx, [edi+TImage.pPixels]

        imul    eax, edx
        imul    ebx, edx
        add     eax, ecx
        add     ebx, ecx

        mov     [.dstYoffs], eax
        mov     [.dstYwrap], ebx
        mov     [.dstY0], ecx

        mov     ecx, [edi+TImage.wrapW]
        mov     [.dstXwrap], ecx

; Destination X start:

        mov     eax, [.xDst]
        add     eax, [edi+TImage.orgX]
        cmp     eax, ecx
        jb      @f
        sub     eax, ecx
@@:
        mov     [.dstXbegn], eax

; Source offset X,Y

        mov     eax, [.xDst]
        mov     ecx, [esi+TImage.wrapW]
        cdq
        div     ecx
        add     edx, [esi+TImage.orgX]
        cmp     edx, ecx
        jb      @f
        sub     edx, ecx
@@:
        mov     [.srcXOffs], edx
        mov     [.srcXwrap], ecx

        mov     eax, [.yDst]
        mov     ecx, [esi+TImage.wrapH]
        mov     ebx, [esi+TImage.pPixels]
        cdq
        div     ecx
        add     edx, [esi+TImage.orgY]
        cmp     edx, ecx
        jb      @f
        sub     edx, ecx
@@:
        imul    edx, [.stepYSrc]
        imul    ecx, [.stepYSrc]
        add     edx, ebx
        add     ecx, ebx
        mov     [.srcYoffs], edx
        mov     [.srcYwrap], ecx
        mov     [.srcY0],    ebx

; prepare MMX constants

        pxor    mm0, mm0        ; mm0 = 0000 0000 0000 0000
        pcmpeqw mm1, mm1                                        ; mm1 = ffff ffff ffff ffff
        psrlw   mm1, 8                                         ; mm1 = 00ff 00ff 00ff 00ff

;        psrlw   mm1, 15                                         ; mm1 = 0001 0001 0001 0001
;        psllw   mm1, 8                                          ; mm1 = 0100 0100 0100 0100

        xor     ebx, ebx
        mov     esi, [.srcYoffs]
        mov     edi, [.dstYoffs]


.loopY:
        dec     [.hDst]
        js      .exit

        mov     ecx, [.srcXOffs]
        mov     edx, [.dstXbegn]
        mov     eax, [.wDst]

.loopX:
        dec     eax
        js      .nextY

        movd    mm7, [esi+4*ecx]        ; source pixel.
        movd    mm6, [edi+4*edx]        ; destination pixel.

        movq    mm5, mm7
        psrlq   mm5, 24                 ; alpha source
        punpckldq mm5, mm5
        packssdw  mm5, mm5              ; mm5 = As, As, As, As

        movq    mm4, mm1
        psubw   mm4, mm5                ; mm4 = Bs Bs Bs Bs     (Bs = $100 - As)

        punpcklbw mm6, mm0              ; byte to word destination pixel
        punpcklbw mm7, mm0              ; byte to word source pixel
        psllw     mm7, 8                ; Cs = Cs*256

        pmullw  mm6, mm4                ; mm6 = Cd = Cd * (256-As) = Cd * Bs   (For alpha Ad = Ad*Bs)
        paddusw mm6, mm7                ; Cd = Cs + Cd
        psrlw   mm6, 8                  ; Cd = Cd/256

        packuswb mm6, mm0               ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
        movd     [edi+4*edx], mm6

        inc     ecx
        inc     edx

        cmp     ecx, [.srcXwrap]
        cmovae  ecx, ebx

        cmp     edx, [.dstXwrap]
        cmovae  edx, ebx

        jmp     .loopX

.nextY:
        add     esi, [.stepYSrc]
        cmp     esi, [.srcYwrap]
        cmovae  esi, [.srcY0]

        add     edi, [.stepYDst]
        cmp     edi, [.dstYwrap]
        cmovae  edi, [.dstY0]
        jmp     .loopY

.exit:
        emms

; unlock the images.
        stdcall UnlockImg, [.pDstImage]

.finish2:
        stdcall UnlockImg, [.pSrcImage]

.finish:
        popad
        return
endp






proc CopyImageRect, .pDstImage, .xDst, .yDst, .pSrcImage, .xSrc, .ySrc, .width, .height
.srect RECT
.drect RECT
.rect  RECT
begin
        pushad

        mov     esi, [.pSrcImage]
        mov     edi, [.pDstImage]

        xor     eax, eax
        mov     ecx, [esi+TImage.width]
        mov     edx, [esi+TImage.height]

        mov     [.srect.left], eax
        mov     [.srect.top], eax
        mov     [.srect.right], ecx
        mov     [.srect.bottom], edx

        mov     ecx, [edi+TImage.width]
        mov     edx, [edi+TImage.height]

        mov     [.drect.left], eax
        mov     [.drect.top], eax
        mov     [.drect.right], ecx
        mov     [.drect.bottom], edx

        mov     ecx, [.xSrc]
        mov     edx, [.ySrc]

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        add     ecx, [.width]
        add     edx, [.height]

        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     ecx, [.srect]
        lea     edx, [.rect]
        stdcall RectIntersect, ecx, ecx, edx
        jc      .finish

        mov     ecx, [.xSrc]
        mov     edx, [.ySrc]
        sub     ecx, [.xDst]
        sub     edx, [.yDst]

; convert the rect to the destination coordinates.
        sub     [.srect.left], ecx
        sub     [.srect.top], edx
        sub     [.srect.right], ecx
        sub     [.srect.bottom], edx

        lea     eax, [.srect]
        lea     ebx, [.drect]
        stdcall RectIntersect, ebx, ebx, eax
        jc      .finish

        stdcall RectCopy, eax, ebx      ; srect = drect

;convert back to source coordinates.
        add     [.srect.left], ecx
        add     [.srect.top], edx
        add     [.srect.right], ecx
        add     [.srect.bottom], edx

; here [.srect] contains the source rectange
; [.drect] contains the destination rectangle
; the width and height of the rectangles  is the same.

        mov     ecx, [.srect.left]
        mov     edx, [.srect.top]
        sub     [.srect.right], ecx
        sub     [.srect.bottom], edx

        mov     ecx, [.srect.top]
        mov     edx, [.drect.top]

        imul    ecx, [esi+TImage.width]
        imul    edx, [edi+TImage.width]

        add     ecx, [.srect.left]
        add     edx, [.drect.left]

        shl     ecx, 2
        shl     edx, 2

        add     ecx, [esi+TImage.pPixels]
        add     edx, [edi+TImage.pPixels]

        stdcall LockImg, esi
        jc      .finish

        stdcall LockImg, edi
        jc      .finish2

        mov     esi, [esi+TImage.width]
        mov     edi, [edi+TImage.width]
        lea     esi, [4*esi]
        lea     edi, [4*edi]


.loopY:
        mov     ebx, [.srect.right]     ; the width of the source rectangle
        test    ebx, 1
        jz      .loopX

; copy 1 dword

        dec     ebx
        mov     eax, [ecx+4*ebx]
        mov     [edx+4*ebx], eax
        jz      .nextY

.loopX:
        sub     ebx, 2

        movq    mm0, [ecx+4*ebx]
        movq    [edx+4*ebx], mm0

        jnz     .loopX

.nextY:
        add     ecx, esi
        add     edx, edi

        dec     [.srect.bottom]
        jnz     .loopY

        emms
        stdcall UnlockImg, [.pDstImage]

.finish2:
        stdcall UnlockImg, [.pSrcImage]

.finish:
        popad
        return
endp



;proc ImageMulAlpha2, .pImage, .x, .y, .width, .height
;.drect RECT
;.rect  RECT
;begin
;        pushad
;
;        mov     edi, [.pImage]
;
;        xor     eax, eax
;        mov     ecx, [edi+TImage.width]
;        mov     edx, [edi+TImage.height]
;
;        mov     [.drect.left], eax
;        mov     [.drect.top], eax
;        mov     [.drect.right], ecx
;        mov     [.drect.bottom], edx
;
;        mov     ecx, [.x]
;        mov     edx, [.y]
;
;        mov     [.rect.left], ecx
;        mov     [.rect.top], edx
;
;        add     ecx, [.width]
;        add     edx, [.height]
;
;        mov     [.rect.right], ecx
;        mov     [.rect.bottom], edx
;
;        lea     ecx, [.drect]
;        lea     edx, [.rect]
;        stdcall RectIntersect, ecx, ecx, edx
;        jc      .finish
;
;        mov     ecx, [.drect.left]
;        mov     edx, [.drect.top]
;        sub     [.drect.right], ecx
;        sub     [.drect.bottom], edx
;
;        mov     esi, [.drect.top]
;        imul    esi, [edi+TImage.width]
;
;        add     esi, [.drect.left]
;        lea     esi, [4*esi]
;        add     esi, [edi+TImage.pPixels]
;
;        mov     edi, [edi+TImage.width]
;        lea     edi, [4*edi]
;
;; prepare MMX constants
;
;        pxor    mm0, mm0        ; mm0 = 0000 0000 0000 0000
;        pcmpeqw mm1, mm1                                        ; mm1 = ffff ffff ffff ffff
;        psrlw   mm1, 15                                         ; mm1 = 0001 0001 0001 0001
;        psllw   mm1, 8          ; mm1 = 0100 0100 0100 0100
;        psllq   mm1, 48         ; mm1 = 0100 0000 0000 0000
;
;.loopY:
;        mov     ebx, [.drect.right]     ; the width of the source rectangle
;
;.loopX:
;        dec     ebx                     ; The ZF will not be changed later in the inner loop.
;
;        movd    mm6, [esi+4*ebx]        ; destination pixel.
;
;        movq    mm5, mm6
;        psrlq   mm5, 24                 ; alpha
;
;        punpckldq mm5, mm5              ;
;        punpcklbw mm6, mm0              ; byte to word destination pixel
;        packssdw  mm5, mm5              ; mm5 = Ad, Ad, Ad, Ad
;
;        psrlq   mm5, 16                 ; mm5 = 0  Ad Ad Ad
;        por     mm5, mm1                ; mm5 = $100 Ad Ad Ad
;
;        pmullw  mm6, mm5                ; mm6 = Cd = Cd * Ad   (For alpha Ad = Ad * 256)
;        psrlw   mm6, 8                  ; Cd = Cd/256          (For alpha Ad = Ad)
;
;        packuswb mm6, mm0               ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
;        movd     [esi+4*ebx], mm6
;
;        jnz     .loopX
;
;.nextY:
;        add     esi, edi
;
;        dec     [.drect.bottom]
;        jnz     .loopY
;
;.finish:
;        emms
;        popad
;        return
;endp


; the colors must be pre-multiplied ARGB.

proc _BlendPixel, .dstColor, .srcColor
begin
        pushad

        movzx   ecx, byte [.srcColor+3]      ; As
        mov     ebx, $ff
        mov     esi, ebx

        sub     ebx, ecx                     ; 1 - As

        movzx   eax, byte [.dstColor+3]      ; Ad
        imul    ecx, esi
        mul     ebx
        add     eax, ecx
        adc     edx, 0
        div     esi

        mov     byte [esp+4*regEAX+3], al


        movzx   eax, byte [.dstColor]       ; Bd
        movzx   ecx, byte [.srcColor]       ; Bs

        imul    ecx, esi
        mul     ebx
        add     eax, ecx
        adc     edx, 0
        div     esi

        mov     byte [esp+4*regEAX], al



        movzx   eax, byte [.dstColor+1]       ; Gd
        movzx   ecx, byte [.srcColor+1]       ; Gs

        imul    ecx, esi
        mul     ebx
        add     eax, ecx
        adc     edx, 0
        div     esi

        mov     byte [esp+4*regEAX+1], al



        movzx   eax, byte [.dstColor+2]       ; Rd
        movzx   ecx, byte [.srcColor+2]       ; Rs

        imul    ecx, esi
        mul     ebx
        add     eax, ecx
        adc     edx, 0
        div     esi

        mov     byte [esp+4*regEAX+2], al


        popad
        return
endp





include '%TargetOS%/images.asm'

endmodule

Added freshlib/graphics/pnglib.asm.













































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: PNG images decoding library.
;
;  Target OS: Any
;
;  Dependencies: memory.asm; files.asm
;
;  Notes:
;_________________________________________________________________________________________
module "PNG library"


;struct TPNGChunk
;  .length dd ?
;  .type   dd ?  ; 4 bytes ascii data - chunk name. Such as 'IDAT', 'iTXt', etc.
;  .data:        ; data itself. [.lenght] bytes.
;ends

; dword check sum follows the variable length data field.

; ALL integers in PNG are big-endian!

struct TchunkIHDR
  .Width        dd ?
  .Height       dd ?
  .BitDepth     db ?
  .ColorType    db ?
  .Compression  db ?
  .Filter       db ?
  .Interlaced   db ?
ends

ctPngGrayscale          = 0     ; .BitDepth = 1, 2, 4, 8 and 16
ctPngTrueColor          = 2     ; .BitDepth = 8, 16
ctPngIndexedColor       = 3     ; .BitDepth = 1, 2, 4, 8
ctPngAlphaGrayscale     = 4     ; .BitDepth = 8, 16
ctPngAlphaTrueColor     = 6     ; .BitDepth = 8, 16


pngCTPalette  = 1
pngCTColor    = 2
pngCTAlpha    = 4


pngFilterNone    = 0
pngFilterSub     = 1
pngFilterUp      = 2
pngFilterAverage = 3
pngFilterPaeth   = 4

pngFilterCount   = 5


; Creates TImage from the compressed PNG image.
;
; Arguments:
;   .pPNGImage - pointer to memory, where compressed image resides.
;   .size      - size of the image in bytes.
;
; Returns:
;   CF=1 if error;
;   CF=0 and eax=TImage if success.

proc CreateImagePNG, .pPNGImage, .size

  .pEnd          dd ?

  .start:

  .Width         dd ?         ;
  .Height        dd ?
  .BitDepth      dd ?
  .ColorType     dd ?

  .flags         dd ?
  .pPalette      dd ?
  .PaletteCnt    dd ?

  .pData         dd ?    ; compressed data.
  .DataSize      dd ?
  .DataCapacity  dd ?

  .BitsPerPixel  dd ?
  .SampleMask    dd ?   ; bit mask of one sample.

  .BytesPerPixel dd ?   ; for the filtering algorithms. rounded up to 1 bytes always.
  .BytesPerLine  dd ?

  .end:

  .i             dd ?    ; loop counter.
  .j             dd ?

begin
        pushad

;        OutputValue "CreateImagePNG called from: ", [ebp+4], 16, 8

        mov     ecx, (.end - .start)/4
        lea     edi, [.start]
        xor     eax, eax
        rep stosd

        mov     esi, [.pPNGImage]
        mov     edx, [.size]
        and     edx, $7fffffff                  ; allows using of -1 for  images with undefined size.

        cmp     edx, 8 + 12 + 13 + 12           ; header + IHDR + IEND the minimal size.
        jb      .error_unexpected_end

        add     edx, esi                ; the end pointer of the image.
        mov     [.pEnd], edx

; first, check the header.

        xor     ecx, ecx
        add     ecx, 4

        mov     edi, .hdrPNGImage
        repe cmpsd
        jne     .error_structure

; we are now in IHDR chunk - it is always the first after the signature!

        lea     eax, [esi-4]
        stdcall DataCRC32, eax, sizeof.TchunkIHDR + 4
        bswap   eax
        cmp     eax, [esi+sizeof.TchunkIHDR]
        jne     .error_checksum

        cmp     [esi+TchunkIHDR.Filter], 0
        jne     .error_structure        ; unsupported filter type!

        cmp     [esi+TchunkIHDR.Compression], 0
        jne     .error_structure        ; unsupported compression method!

; The following is my (johnfound) decision, as long as this library will never be used for progressive image display.
; Support of Adam-7 interlacing will cost a lot of code, work and speed. The interlaced images are bigger, so
; there is no single argument for supporting them.

        cmp     [esi+TchunkIHDR.Interlaced], 0
        jne     .error_structure        ; unsupported Interlaced images!

        movzx   ecx, [esi+TchunkIHDR.BitDepth]
        movzx   eax, [esi+TchunkIHDR.ColorType]
        mov     [.BitDepth], ecx
        mov     [.ColorType], eax

;        OutputValue "Color type:", eax, 10, 2
;        OutputValue "Bit depth:", ecx, 10, 2


        xor     edx, edx
        dec     edx
        shr     edx, cl
        not     edx
        mov     [.SampleMask], edx

        mov     edx, ecx

        test    [.ColorType], pngCTPalette
        jnz     .size_raw_ok

        test    [.ColorType], pngCTColor
        jz      .raw_color_ok

        lea     edx, [3*edx]

.raw_color_ok:
        test    [.ColorType], pngCTAlpha
        jz      .size_raw_ok

        add     edx, ecx        ; one more sample for the alpha channel.

.size_raw_ok:
        mov     [.BitsPerPixel], edx
        mov     eax, edx

        shr     eax, 3
        jnz     .bytes_per_pixel

        inc     eax

.bytes_per_pixel:
        mov     [.BytesPerPixel], eax

; Image size:
        mov     eax, [esi+TchunkIHDR.Width]
        mov     ecx, [esi+TchunkIHDR.Height]
        bswap   eax
        bswap   ecx
        mov     [.Width], eax
        mov     [.Height], ecx

        imul    eax, edx        ; line length in bits.
        add     eax, 7
        shr     eax, 3          ; align to byte
        mov     [.BytesPerLine], eax


; end of IHDR chunk:
        add     esi, sizeof.TchunkIHDR + 4

.chunk_loop:
        cmp     esi, [.pEnd]
        jae     .error_unexpected_end

        lodsd
        bswap   eax
        mov     ecx, eax                ; chunk length in bytes
        lea     edx, [eax+4]
        lea     eax, [esi+edx]

        cmp     eax, [.pEnd]
        jae     .error_unexpected_end

        stdcall DataCRC32, esi, edx
        bswap   eax
        cmp     eax, [esi+edx]
        jne     .error_checksum

        lodsd

        cmp     eax, 'PLTE'
        je      .PLTE

        cmp     eax, 'IDAT'
        je      .IDAT

        cmp     eax, 'IEND'
        je      .IEND

        cmp     eax, 'tRNS'
        je      .tRNS

; ignore chunk if unknown

        add     esi, ecx

.next_chunk:
        add     esi, 4  ; check sum
        jmp     .chunk_loop


.tRNS:
        mov     edi, [.pPalette]
        test    edi, edi
        jz      .error_structure

        cmp     ecx, [.PaletteCnt]
        ja      .error_structure

.trns_loop:
        lodsb
        mov     [edi+3], al
        add     edi, 4
        loop    .trns_loop

        jmp     .next_chunk


.PLTE:
        cmp     [.pPalette], 0
        jne     .error_structure        ; the palette can be only one!

; But for the way of processing in this library, this is not mandatory, actually.
;        cmp     [.pData], 0
;        jne     .error_structure        ; the palette must resides before the first IDAT!


        mov     eax, ecx
        cdq
        mov     ebx, 3
        div     ebx
        test    edx, edx
        jnz     .error_structure        ; the palette must contains multiple of 3 bytes.

        mov     [.PaletteCnt], eax
        mov     ecx, eax
        shl     eax, 2                  ; we need 4 bytes palette entries.

        stdcall GetMem, eax
        jc      .error_memory_allocation

        mov     [.pPalette], eax

        mov     edi, eax

.pal_loop:
        or      ah, -1          ; alpha.
        lodsb                   ; red.
        shl     eax, 8
        lodsb                   ; green.
        shl     eax, 8
        lodsb                   ; blue.

        stosd
        loop    .pal_loop

        jmp     .next_chunk

.IDAT:
        mov     edi, [.pData]
        test    edi, edi
        jnz     .buffer_allocated

        lea     eax, [ecx*2]
        mov     [.DataCapacity], eax
        stdcall GetMem, eax
        jc      .error_memory_allocation

        mov     edi, eax
        mov     [.pData], eax

.buffer_allocated:

        mov     eax, ecx
        add     eax, [.DataSize]
        cmp     eax, [.DataCapacity]
        jbe     .capacity_enough

        shl     eax, 1
        mov     [.DataCapacity], eax

        stdcall ResizeMem, edi, eax
        jc      .error_memory_allocation

        mov     [.pData], eax
        mov     edi, eax

.capacity_enough:
        add     edi, [.DataSize]
        add     [.DataSize], ecx

        rep movsb
        jmp     .next_chunk


.IEND:
; so, all data must be collected - process it.

        cmp     [.pData], 0
        je      .error_no_image


; decompressed data buffer:

        mov     edx, [.Width]
        imul    edx, [.BitsPerPixel]
        add     edx, 7
        shr     edx, 3  ; round up and compute the byte count.
        inc     edx                      ; one more byte for the filter byte.
        imul    edx, [.Height]

        stdcall GetMem, edx
        mov     edi, eax

        mov     esi, [.pData]
        mov     ecx, [.DataSize]

        add     esi, 2          ; first 2 bytes are ZLIB data format header. Ignore them.
        sub     ecx, 2+4        ; the last 4 bytes

        stdcall Inflate, edi, edx, esi, ecx
        jc      .error_decompression

        stdcall FreeMem, [.pData]
        mov     [.pData], edi
        mov     [.DataSize], edx

; Apply filters

        xor     esi, esi        ; previous line.
        mov     eax, [.Height]
        mov     [.i], eax

.outer:
        movzx   eax, byte [edi]
        inc     edi
        xor     ecx, ecx       ; x coordinate

        cmp     eax, pngFilterCount
        jae     .error_invalid_filter

        mov     edx, [.filters+4*eax]           ; filter procedure.

.inner:
        call    edx
        inc     ecx
        cmp     ecx, [.BytesPerLine]
        jne     .inner

        mov     esi, edi
        add     edi, [.BytesPerLine]
        dec     [.i]
        jnz     .outer


; convert to 32 bit TImage

        stdcall CreateImage2, [.Width], [.Height], FALSE
        jc      .error_memory_allocation

        mov     [esp+4*regEAX], eax
        mov     edi, [eax+TImage.pPixels] ; the TImage pixels array.
        mov     esi, [.pData]             ; the png image pixels.

        mov     eax, [.Height]
        mov     [.i], eax

        mov     ecx, [.BitDepth]

.outer2:
        mov     eax, [.Width]
        mov     [.j], eax

        inc     esi        ; one byte for the filter.
        lodsd
        bswap   eax

        mov     ch, $20

.inner2:
        xor     edx, edx

        mov     ebx, eax
        and     ebx, [.SampleMask]

        shl     eax, cl
        sub     ch, cl
        jnz     @f

        mov     ch, $20
        lodsd
        bswap   eax

@@:
        test    [.ColorType], pngCTPalette
        jnz     .get_palette_color

        push    ecx
        mov     ch, 8
        xor     edx, edx

.pxloop1:
        or      edx, ebx
        shr     ebx, cl
        sub     ch, cl
        jge     .pxloop1

        and     edx, $ff000000
        mov     ebx, edx
        pop     ecx

        test    [.ColorType], pngCTColor
        jnz     .read_more

; duplicate gray value two more times.
        rol     edx, 8
        or      edx, ebx
        rol     edx, 8
        or      edx, ebx

        jmp     .color_ok


.read_more:
        mov     ebx, eax
        and     ebx, [.SampleMask]

        shl     eax, cl
        sub     ch, cl
        jnz     @f

        mov     ch, $20
        lodsd
        bswap   eax

@@:
        push    ecx edx
        mov     ch, 8
        mov     edx, ebx

.pxloop2:
        or      ebx, edx
        shr     edx, cl
        sub     ch, cl
        jge     .pxloop2

        and     ebx, $ff000000
        pop     edx ecx

        rol     edx, 8
        or      edx, ebx

        mov     ebx, eax
        and     ebx, [.SampleMask]

        shl     eax, cl
        sub     ch, cl
        jnz     @f

        mov     ch, $20
        lodsd
        bswap   eax

@@:
        push    ecx edx
        mov     ch, 8
        mov     edx, ebx

.pxloop3:
        or      ebx, edx
        shr     edx, cl
        sub     ch, cl
        jge     .pxloop3

        and     ebx, $ff000000
        pop     edx ecx

        rol     edx, 8
        or      edx, ebx

.color_ok:

        test    [.ColorType], pngCTAlpha
        jnz     .read_alpha

        rol     edx, 8
        or      edx, $ff000000
        jmp     .store_px


.read_alpha:
        mov     ebx, eax
        and     ebx, [.SampleMask]

        shl     eax, cl
        sub     ch, cl
        jnz     @f

        mov     ch, $20
        lodsd
        bswap   eax

@@:
        push    ecx edx
        mov     ch, 8
        mov     edx, ebx

.pxloop4:
        or      ebx, edx
        shr     edx, cl
        sub     ch, cl
        jge     .pxloop4

        and     ebx, $ff000000
        pop     edx ecx

        rol     edx, 8
        or      edx, ebx

        jmp     .store_px

.get_palette_color:

        rol     ebx, cl
        shl     ebx, 2
        add     ebx, [.pPalette]
        mov     edx, [ebx]

.store_px:

        stdcall __fix_color, edx, regEDX        ; pre-multiply alpha

        mov     [edi], edx
        add     edi, 4

        dec     [.j]
        jnz     .inner2

        movzx   eax, ch
        shr     eax, 3
        sub     esi, eax

        dec     [.i]
        jnz     .outer2

; cleanup the allocated buffers...

        stdcall FreeMem, [.pPalette]
        stdcall FreeMem, [.pData]

        clc
        popad
        return


.error_invalid_filter:
        dbrk

.error_decompression:
        dbrk

.error_no_image:
        dbrk

.error_memory_allocation:
        dbrk

.error_checksum:
        dbrk

.error_structure:
        dbrk

.error_unexpected_end:
        dbrk

        stc
        popad
        return


  .hdrPNGImage  dd  $474e5089, $0a1a0a0d, $0d000000, 'IHDR'

  .filters      dd  .none, .sub, .up, .average, .paeth


; sub filter.
.sub:
        mov     ebx, ecx
        sub     ebx, [.BytesPerPixel]
        jl      .none

        mov     al, [edi+ebx]
        add     [edi+ecx], al

.none:
        retn


; up filter
.up:
        test    esi, esi
        jz      .none

        mov     al, [esi+ecx]
        add     [edi+ecx], al

        retn


; average filter
.average:
        xor     eax, eax

        mov     ebx, ecx
        sub     ebx, [.BytesPerPixel]
        jl      .left_ok

        add     al, [edi+ebx]

.left_ok:
        test    esi, esi
        jz      .up_ok

        add     al, [esi+ecx]

.up_ok:
        rcr     al, 1          ; 9-bit average
        add     [edi+ecx], al
        retn


; paeth filter
.paeth:
        push    ecx edx

        xor     eax, eax        ; A - left

        mov     ebx, ecx
        sub     ebx, [.BytesPerPixel]
        jl      .left_ok2

        movzx   eax, byte [edi+ebx]

.left_ok2:
        xor     edx, edx        ; B - above
        xor     ebx, ebx        ; C - left, above
        test    esi, esi
        jz      .up_ok2

        movzx   edx, byte [esi+ecx]

        sub     ecx, [.BytesPerPixel]
        jl      .up_ok2

        movzx   ebx, byte [esi+ecx]

.up_ok2:
        push    ebx edx eax

        mov     ecx, eax
        add     ecx, edx
        sub     ecx, ebx        ; p

        sub     [esp], ecx       ; pa
        sub     [esp+4], ecx     ; pb
        sub     [esp+8], ecx     ; pc

.abs1:
        neg     dword [esp]
        jl      .abs1

.abs2:
        neg     dword [esp+4]
        jl      .abs2

.abs3:
        neg     dword [esp+8]
        jl      .abs3

        mov     ecx, [esp]      ; pa
        cmp     ecx, [esp+4]    ; pb
        ja      .not_a
        cmp     ecx, [esp+8]    ; pc
        jbe     .end_pp

.not_a:
        mov     ecx, [esp+4]
        cmp     ecx, [esp+8]
        ja      .not_b

        mov     eax, edx
        jmp     .end_pp

.not_b:
        mov     eax, ebx

.end_pp:
        add     esp, 12         ; free temp variables.
        pop     edx ecx

        add     [edi+ecx], al

        retn

endp




endmodule

Added freshlib/graphics/rectangles.asm.







































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TGrid object class
;
;  Target OS: Any
;
;  Dependencies:
;  Notes:
;_________________________________________________________________________________________
module "Rectangles library"


; Calculates the bounding rectangle of two source rectangles, pointed by [.src1] and [.src2]
; The result rectangle is placed in RECT structure pointed by [.dest]
;
; All three rectangles may point to the same structures.
;
; Procedure preserves all registers.

proc RectBounding, .dest, .src1, .src2
begin
        pushad


        mov     esi, [.src1]
        mov     edi, [.src2]
        mov     ebx, [.dest]

; min left1, left2

        mov     eax, [esi+RECT.left]
        mov     edx, [edi+RECT.left]

        sub     edx, eax
        sbb     ecx, ecx
        and     ecx, edx
        add     eax, ecx

        mov     [ebx+RECT.left], eax


; min top1, top2

        mov     eax, [esi+RECT.top]
        mov     edx, [edi+RECT.top]

        sub     edx, eax
        sbb     ecx, ecx
        and     ecx, edx
        add     eax, ecx

        mov     [ebx+RECT.top], eax


; max right1, right2

        mov     eax, [esi+RECT.right]
        mov     edx, [edi+RECT.right]

        sub     edx, eax
        sbb     ecx, ecx
        not     ecx
        and     ecx, edx
        add     eax, ecx

        mov     [ebx+RECT.right], eax


; max bottom1, bottom2

        mov     eax, [esi+RECT.bottom]
        mov     edx, [edi+RECT.bottom]

        sub     edx, eax
        sbb     ecx, ecx
        not     ecx
        and     ecx, edx
        add     eax, ecx

        mov     [ebx+RECT.bottom], eax

        popad
        return
endp



; Calculates the intersection of two source rectangles, pointed by [.src1] and [.src2]
; The result rectangle is placed in RECT structure pointed by [.dest]
; All three rectangles may point to the same structures.
;
; Returns CF=0 if rectangles intersect and CF=1 if not.
; If the rectangles does not intersect, the [.dest] rectangle will contain all fields = 0
;
; Procedure preserves all registers.

proc RectIntersect, .dest, .src1, .src2
begin
        pushad

        mov     esi, [.src1]
        mov     edi, [.src2]
        mov     ebx, [.dest]

; max left1, left2
        mov     ecx, [esi+RECT.left]
        mov     eax, [edi+RECT.left]
        cmp     ecx, eax
        cmovl   ecx, eax
        mov     [ebx+RECT.left], ecx

; min right1, right2
        mov     edx, [esi+RECT.right]
        mov     eax, [edi+RECT.right]
        cmp     edx, eax
        cmovg   edx, eax
        mov     [ebx+RECT.right], edx

        cmp     ecx, edx
        jge     .null

; max top1, top2
        mov     ecx, [esi+RECT.top]
        mov     eax, [edi+RECT.top]
        cmp     ecx, eax
        cmovl   ecx, eax
        mov     [ebx+RECT.top], ecx

; min bottom1, bottom2
        mov     edx, [esi+RECT.bottom]
        mov     eax, [edi+RECT.bottom]
        cmp     edx, eax
        cmovg   edx, eax
        mov     [ebx+RECT.bottom], edx

        cmp     ecx, edx
        jge     .null

        clc
        popad
        return

.null:
        xor     eax, eax
        mov     [ebx+RECT.left], eax
        mov     [ebx+RECT.top], eax
        mov     [ebx+RECT.right], eax
        mov     [ebx+RECT.bottom], eax
        stc
        popad
        return
endp



; Calculates the intersection of two source rectangles, pointed by [.dst] and [.src]
; The result rectangle is placed in RECT structure pointed by [.dest]
;
; Returns CF=0 if rectangles intersect and CF=1 if not.
; If the rectangles does not intersect, the [.dest] rectangle will contain all fields = 0
;
; Procedure preserves all registers.

proc RectIntersect2, .dest, .src
begin
        pushad

        mov     esi, [.src]
        mov     edi, [.dest]
        xor     ebx, ebx        ; the result

; max left1, left2
        mov     ecx, [esi+RECT.left]
        mov     eax, [edi+RECT.left]
        cmp     ecx, eax
        cmovl   ecx, eax
        mov     [edi+RECT.left], ecx

; min right1, right2
        mov     edx, [esi+RECT.right]
        mov     eax, [edi+RECT.right]
        cmp     edx, eax
        cmovg   edx, eax
        mov     [edi+RECT.right], edx

        cmp     ecx, edx
        jl      .width_ok

        xor     ecx, ecx
        mov     [edi+RECT.right], ecx
        mov     [edi+RECT.left], ecx
        dec     ebx

.width_ok:
; max top1, top2
        mov     ecx, [esi+RECT.top]
        mov     eax, [edi+RECT.top]
        cmp     ecx, eax
        cmovl   ecx, eax
        mov     [edi+RECT.top], ecx

; min bottom1, bottom2
        mov     edx, [esi+RECT.bottom]
        mov     eax, [edi+RECT.bottom]
        cmp     edx, eax
        cmovg   edx, eax
        mov     [edi+RECT.bottom], edx

        cmp     ecx, edx
        jl      .finish

        xor     ecx, ecx
        mov     [edi+RECT.top], ecx
        mov     [edi+RECT.bottom], ecx
        dec     ebx

.finish:
        shl     ebx, 1  ; set CF
        popad
        return
endp





proc RectCopy, .dest, .src
begin
        pushad

        mov     esi, [.src]
        mov     edi, [.dest]

        mov     eax, [esi+RECT.left]
        mov     ecx, [esi+RECT.top]
        mov     edx, [esi+RECT.right]
        mov     ebx, [esi+RECT.bottom]

        mov     [edi+RECT.left], eax
        mov     [edi+RECT.top], ecx
        mov     [edi+RECT.right], edx
        mov     [edi+RECT.bottom], ebx

        popad
        return
endp



proc RectSort, .src
begin
        push    eax ecx esi

        mov     esi, [.src]

        mov     eax, [esi+RECT.left]
        mov     ecx, [esi+RECT.right]
        cmp     ecx, eax
        jge     @f
        mov     [esi+RECT.right], eax
        mov     [esi+RECT.left],ecx
@@:
        mov     eax, [esi+RECT.top]
        mov     ecx, [esi+RECT.bottom]
        cmp     ecx, eax
        jg      @f
        mov     [esi+RECT.top],ecx
        mov     [esi+RECT.bottom], eax
@@:
        pop     esi ecx eax
        return
endp



proc PointInRect, .pRect, .x, .y
begin
        push    eax esi

        mov     esi, [.pRect]
        mov     eax, [.x]

        cmp     eax, [esi+RECT.left]
        jl      .no
        cmp     eax, [esi+RECT.right]
        jge     .no

        mov     eax, [.y]
        cmp     eax, [esi+RECT.top]
        jl      .no
        cmp     eax, [esi+RECT.bottom]
        jge     .no

        stc
        pop     esi eax
        return

.no:
        clc
        pop     esi eax
        return
endp


; converts RECT to TBounds structure.

proc RectToBounds, .ptrBounds, .ptrRect
begin
        pushad

        mov     esi, [.ptrRect]
        mov     edi, [.ptrBounds]

        mov     ebx, [esi+RECT.left]
        mov     edx, [esi+RECT.top]
        mov     eax, [esi+RECT.right]
        mov     ecx, [esi+RECT.bottom]

        sub     eax, ebx
        sub     ecx, edx

        mov     [edi+TBounds.x], ebx
        mov     [edi+TBounds.y], edx
        mov     [edi+TBounds.width], eax
        mov     [edi+TBounds.height], ecx

        popad
        return
endp



proc IsRectZero, .pRect
begin
        pushad
        mov     eax, [.pRect]
        mov     ecx, [eax+RECT.right]
        mov     edx, [eax+RECT.bottom]
        sub     ecx, [eax+RECT.left]
        jz      .zero

        sub     edx, [eax+RECT.top]
        jz      .zero

        clc
        popad
        return

.zero:
        stc
        popad
        return
endp



; See RectListAdd

proc RectListAddXY, .pList, .x, .y, .width, .height
begin
        push    eax

        mov     edx, [.x]
        mov     eax, [.y]
        add     [.width], edx
        add     [.height], eax

        lea     eax, [.x]
        stdcall RectListAdd, [.pList], eax

        pop     eax
        return
endp


;
; Adds new rect to the rectangles list (region).
; Only non intersecting part of the rectangle is added and the resulting
; set of rectangles is always optimal.
;
; As a result some previously added rectangles can be changed or removed.
; The total count of rectangles after this operation can be any.
;
; All rectangles in the array are sorted - i.e. defined by their top/left
; and bottom/right corner, even if [.pRect] contains not sorted rectangle.
;
; Arguments:
;   .pList - pointer to TArray of RECT.
;   .pRect - pointer to RECT to be added to the array.
;
; Returns:
;   edx - pointer to the resulting TArray. Can be the same or reallocated [.pList], depending on the operations.
;

proc RectListAdd, .pList, .pRect
.end   dd ?
.sRect RECT

begin
        pushad

        lea     eax, [.sRect]
        stdcall RectCopy, eax, [.pRect]
        stdcall RectSort, eax


        push    0       ; end of queued commands.

        xor     ecx, ecx                ; from where to start.

.main_loop:
        mov     esi, [.pList]

        mov     edx, [esi+TArray.count]

        shl     ecx, 4
        shl     edx, 4

        lea     edx, [esi+TArray.array+edx]     ; the end of the array.
        lea     esi, [esi+TArray.array+ecx]     ; the start element.

        mov     [.end], edx

.loop:
        cmp     esi, [.end]
        jae     .end_loop


.again:
        mov     eax, [.sRect.right]
        mov     ecx, [.sRect.bottom]

        cmp     eax, [.sRect.left]
        je      .rect_added             ; empty rectangle.
        cmp     ecx, [.sRect.top]
        je      .rect_added             ; empty rectangle.

        dec     eax
        dec     ecx

        stdcall PointToRect, eax, ecx, esi
        lea     ecx, [9*eax]

        stdcall PointToRect, [.sRect.left], [.sRect.top], esi
        add     ecx, eax

        movzx   eax, byte [.cases+ecx]          ; what case for this rectangle?

        test    eax, eax
        jnz     .process_it

        stdcall RectSort, esi
        jmp     .again


.process_it:
        cmp     eax, 1
        je      .rect_added                     ; the rectangle is entirely inside the target rectangle. No need to be added.

        cmp     eax, 2
        je      .try_to_join

        cmp     eax, 6
        jbe     .case_3456

        cmp     eax, 7
        je      .case_7                         ; remove the old rectangle.

        cmp     eax, 11
        jbe     .case_89ab                      ; clip the new rectangle.

        cmp     eax, 15
        jbe     .case_cdef                      ; split the new rectangle on two rectangles.


; case_gh:  ;Split the new rectangle on two rectangles another way

        sub     eax, 16         ; dest index.

        lea     ecx, [eax+2]    ; src index
        and     ecx, 3

        pushd   [.sRect.bottom] [.sRect.right] [.sRect.top] [.sRect.left]   ; the remaning rectangle.

        mov     edx, [esi+4*ecx]
        mov     [esp+4*eax], edx        ; fix remaining rectangle.

        mov     edx, [esi+4*eax]
        mov     [.sRect + 4*ecx], edx

        lea     eax, [esi-TArray.array]
        sub     eax, [.pList]
        sar     eax, 4
        inc     eax

        push    eax     ; from where to start.
        push    2       ; add rect command.

        jmp     .try_to_join


.case_3456:     ; clip the target rectangle.

        sub     eax, 3  ; offset in target rect.

        mov     edx, [.sRect+4*eax]        ; (X0,Y0,X1,Y1)

        lea     eax, [eax+2]
        and     eax, 3

        mov     [esi+4*eax], edx        ; (A0,B0,A1,B1)

; If the resulting rectangle is zero rectange, it is case_7 (remove the target rectangle)
        mov     eax, [esi+RECT.right]
        cmp     eax, [esi+RECT.left]
        je      .case_7

        mov     eax, [esi+RECT.bottom]
        cmp     eax, [esi+RECT.top]
        je      .case_7

        jmp     .try_to_join


.case_7:        ; the target rectanlge should be removed from the list. The comparison continues with the next rect in the list.

        lea     eax, [esi-TArray.array]
        sub     eax, [.pList]
        sar     eax, 4                          ; sizeof.RECT = 16

        push    eax     ; the index of the rectangle that have to be deleted.
        push    1       ; delete command.
        jmp     .next_rect


.case_89ab:    ; clip the inserted rectangle and continue to the next target rectangle

        sub     eax, 8  ; offset in target rect.

        mov     edx, [esi+4*eax]

        lea     eax, [eax+2]
        and     eax, 3

        mov     [.sRect+4*eax], edx

        jmp     .try_to_join


.case_cdef:     ; split the new rectangle on two rectangles.

        sub     eax, 12         ; src index

        lea     ecx, [eax+2]    ; dest index
        and     ecx, 3

        pushd   [.sRect.bottom] [.sRect.right] [.sRect.top] [.sRect.left]   ; the remaning rectangle.

        mov     edx, [esi+4*eax]
        mov     [esp+4*eax], edx        ; fix remaining first value.
        mov     [.sRect + 4*ecx], edx   ; fix current rectangle

        inc     eax
        and     eax, 3
        lea     ecx, [eax+2]
        and     ecx, 3

        mov     edx, [esi+4*eax]
        mov     [esp+4*ecx], edx        ; fix remaining second value.

        lea     eax, [esi-TArray.array]
        sub     eax, [.pList]
        sar     eax, 4
        inc     eax

        push    eax     ; from where to start.
        push    2       ; add rect command.

        jmp     .next_rect


; try to join the rectangle to the current rectangle

.try_to_join:   ; can be optimized for SIZE!!!

        mov     eax, [.sRect.right]
        mov     ecx, [.sRect.bottom]
        dec     eax
        dec     ecx

        stdcall PointToRect, eax, ecx, esi
        mov     ecx, eax

        stdcall PointToRect, [.sRect.left], [.sRect.top], esi

        cmp     ecx, eax
        jne     .next_rect

        shr     ecx, 1
        jnc     .next_rect     ; only odd numbers can be joined.

        jz      .jcase_0

        dec     ecx

        jz      .jcase_1

        dec     ecx

        jz      .jcase_2

; join case 3

        mov     eax, [.sRect.left]
        mov     ecx, [.sRect.right]
        mov     edx, [.sRect.top]

        cmp     eax, [esi+RECT.left]
        jne     .next_rect

        cmp     ecx, [esi+RECT.right]
        jne     .next_rect

        cmp     edx, [esi+RECT.bottom]
        jne     .next_rect

        push    [esi+RECT.top]
        pop     [.sRect.top]

        jmp     .del_the_current


.jcase_2:
        mov     eax, [.sRect.top]
        mov     ecx, [.sRect.bottom]
        mov     edx, [.sRect.left]

        cmp     eax, [esi+RECT.top]
        jne     .next_rect

        cmp     ecx, [esi+RECT.bottom]
        jne     .next_rect

        cmp     edx, [esi+RECT.right]
        jne     .next_rect

        push    [esi+RECT.left]
        pop     [.sRect.left]

        jmp     .del_the_current


.jcase_1:
        mov     eax, [.sRect.top]
        mov     ecx, [.sRect.bottom]
        mov     edx, [.sRect.right]

        cmp     eax, [esi+RECT.top]
        jne     .next_rect

        cmp     ecx, [esi+RECT.bottom]
        jne     .next_rect

        cmp     edx, [esi+RECT.left]
        jne     .next_rect

        push    [esi+RECT.right]
        pop     [.sRect.right]

        jmp     .del_the_current


.jcase_0:
        mov     eax, [.sRect.left]
        mov     ecx, [.sRect.right]
        mov     edx, [.sRect.bottom]

        cmp     eax, [esi+RECT.left]
        jne     .next_rect

        cmp     ecx, [esi+RECT.right]
        jne     .next_rect

        cmp     edx, [esi+RECT.top]
        jne     .next_rect

        push    [esi+RECT.bottom]
        pop     [.sRect.bottom]


.del_the_current:
; queue the current rect for deleting.

        lea     eax, [esi-TArray.array]
        sub     eax, [.pList]
        sar     eax, 4                          ; sizeof.RECT = 16

        push    eax     ; the index of the rectangle that have to be deleted.
        push    1       ; delete command.

.next_rect:
        add     esi, sizeof.RECT
        jmp     .loop


.end_loop:

; here add the rectangle

        mov     eax, [.sRect.right]
        sub     eax, [.sRect.left]
        jz      .rect_added

        mov     eax, [.sRect.bottom]
        sub     eax, [.sRect.top]
        jz      .rect_added

        stdcall AddArrayItems, [.pList], 1
        mov     [.pList], edx

; add the new rectangle to the list.
        pushd   [.sRect.bottom] [.sRect.right] [.sRect.top] [.sRect.left]
        popd    [eax+RECT.left] [eax+RECT.top] [eax+RECT.right] [eax+RECT.bottom]

.rect_added:

        pop     eax     ; pop the command

        test    eax, eax
        jz      .finish_ok

        cmp     eax, 1
        je      .delete_element

        pop     ecx  ; from index?
        popd    [.sRect+RECT.left] [.sRect+RECT.top] [.sRect+RECT.right] [.sRect+RECT.bottom]

        jmp     .main_loop


.delete_element:

        pop     eax     ; the index of the element that have to be removed.
        stdcall DeleteArrayItems, [.pList], eax, 1
        mov     [.pList], edx
        jmp     .rect_added

.finish_ok:
        popad
        mov     edx, [.pList]

;        OutputValue "Rectangles list count:", [edx+TArray.count], 10, -1

        return

.cases db  2,  0, 0,  0,  0, 0, 0, 0, 0
       db  2,  2, 0,  0,  0, 0, 0, 0, 0
       db  2,  2, 2,  0,  0, 0, 0, 0, 0
       db  2,  0, 0,  2,  0, 0, 0, 0, 0
       db 12,  9, 0,  8,  1, 0, 0, 0, 0
       db  6, 13, 2, 16, 10, 2, 0, 0, 0
       db  2,  0, 0,  2,  0, 0, 2, 0, 0
       db  5, 17, 0, 15, 11, 0, 2, 2, 0
       db  7,  3, 2,  4, 14, 2, 2, 2, 2
endp


; Computes where [.pPoint] is located relative to [.pRect]
; and returns one of the following values: (4 is the rectangle itself)
;
;   +---+---+---+
;   | 0 | 1 | 2 |
;   +---+---+---+
;   | 3 | 4 | 5 |
;   +---+---+---+
;   | 6 | 7 | 8 |
;   +---+---+---+


proc PointToRect, .x, .y, .pRect
begin
        pushad

        mov     edi, [.pRect]

        xor     ecx, ecx

        mov     eax, [.x]
        mov     edx, [.y]

        cmp     eax, [edi+RECT.left]
        jl      .x_ok

        inc     ecx

        cmp     eax, [edi+RECT.right]
        jl      .x_ok

        inc     ecx

.x_ok:
        cmp     edx, [edi+RECT.top]
        jl      .y_ok

        add     ecx, 3

        cmp     edx, [edi+RECT.bottom]
        jl      .y_ok

        add     ecx, 3

.y_ok:
        mov     [esp+4*regEAX], ecx
        popad
        return
endp





proc PrintRectList, .pRectList
begin
        pushad

        mov     esi, [.pRectList]
        mov     ecx, [esi+TArray.count]
        lea     esi, [esi+TArray.array]

        stdcall FileWriteString, [STDERR], <txt 13, 10, 13, 10>

.loop:
        dec     ecx
        js      .end_of_loop

        stdcall FileWriteString, [STDERR], txt "Rectangle: "

        stdcall NumToStr, [esi+RECT.left], ntsDec or ntsSigned
        push    eax
        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel ; from the stack.

        stdcall FileWriteString, [STDERR], txt ", "
        stdcall NumToStr, [esi+RECT.top], ntsDec or ntsSigned
        push    eax
        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel ; from the stack.

        stdcall FileWriteString, [STDERR], txt ", "
        mov     eax, [esi+RECT.right]
        sub     eax, [esi+RECT.left]
        stdcall NumToStr, eax, ntsDec or ntsSigned
        push    eax
        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel ; from the stack.

        stdcall FileWriteString, [STDERR], txt ", "
        mov     eax, [esi+RECT.bottom]
        sub     eax, [esi+RECT.top]
        stdcall NumToStr, eax, ntsDec or ntsSigned
        push    eax
        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel ; from the stack.

        stdcall FileWriteString, [STDERR], <txt 13, 10>

        add     esi, sizeof.RECT
        jmp     .loop

.end_of_loop:
        stdcall FileWriteString, [STDERR], <txt 13, 10, 13, 10>

.finish:
        popad
        return
endp



endmodule

Added freshlib/graphics/recycler.asm.













































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
172
173
174
175
176
177
178
179
180
181
182
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Small library that allows already allocated images to be recycled in order
;               to avoid frequent allocation/deallocation of memory.
;
;  Target OS: Any
;
;  Dependencies:
;_________________________________________________________________________________________

module "Image recycling library"

uglobal
  align 4
  var pFirstRecycledImage = ?
endg


; proc RecycleImage
; stores the image in the image pool for recycling.

proc RecycleImage, .pImage
begin
        push    esi edi

        mov     esi, [.pImage]
        test    esi, esi
        jz      .finish

        and     [esi+TImage.wrapW], 0
        mov     edi, esi

        lock xchg edi, [pFirstRecycledImage]

        mov     [esi+TImage.wrapW], edi

.finish:
        pop     edi esi
        return
endp


griExactWidth = 0
griMoreWidth = 1

griExactHeight = 0
griMoreHeight = 2


; Searches the image pool for image having desired width and height.
; Notice, that this search is a fuzzy process. The returned image
; is guaranteed to have width and height greater or equal to the desired.
; the TImage.wrapW and TImage.wrapH are set to be exactly equal to .w and .h
; arguments. TImage.orgX and TImage.orgY are set to 0.
; The image pixel data can be random and should be considered invalid.
;
; Notice, that if the relevant image is not found in the pool, new
; image will be allocated. I.e. in the worst case scenario, the speed of
; this procedure degrades to the default CreateImage.
;
proc GetRecycledImage, .w, .h, .flags

if defined options.RecyclerBenchmark & options.RecyclerBenchmark
.start dd ?
end if

begin
        pushad

        xor     edi, edi

if defined options.RecyclerBenchmark & options.RecyclerBenchmark
        stdcall GetFineTimestamp
        mov     [.start], eax
end if

        mov     ecx, [.w]
        test    [.flags], griMoreWidth
        jz      .max_width_ok

        lea     ecx, [ecx*3+32]
        shr     ecx, 1

.max_width_ok:
        mov     edx, [.h]
        test    [.flags], griMoreHeight
        jz      .max_height_ok

        lea     edx, [edx*3+32]
        shr     edx, 1

.max_height_ok:

        mov     ebx, pFirstRecycledImage

.search:
        mov     esi, [ebx]
        test    esi, esi
        jz      .not_found

        mov     eax, [.w]
        cmp     [esi+TImage.width], eax
        jl      .next
        cmp     [esi+TImage.width], ecx
        jg      .next

        mov     eax, [.h]
        cmp     [esi+TImage.height], eax
        jl      .next
        cmp     [esi+TImage.height], edx
        jle     .found

.next:
        inc     edi
        lea     ebx, [esi+TImage.wrapW]         ; the previous image.
        jmp     .search

.not_found:

        stdcall CreateImage2, ecx, edx, FALSE
        mov     esi, eax
        jmp     .set_size

.found:
; remove from the list.

        mov     eax, [esi+TImage.wrapW]         ; the .next field.
        mov     [ebx], eax

.set_size:
        mov     eax, [.w]
        mov     ecx, [.h]
        xor     edx, edx

        mov     [esi+TImage.orgX], edx
        mov     [esi+TImage.orgY], edx
        mov     [esi+TImage.wrapW], eax
        mov     [esi+TImage.wrapH], ecx

        mov     [esp+4*regEAX], esi

if defined options.RecyclerBenchmark & options.RecyclerBenchmark
        stdcall GetFineTimestamp
        sub     eax, [.start]

        OutputValue "Image recycler work[us]: ", eax, 10, -1
        OutputValue "Searched images: ", edi, 10, -1
end if

        popad
        return
endp



; Frees all images from the pool.

proc FreeImagePool
begin
        push    esi
        mov     esi, [pFirstRecycledImage]

.free_loop:
        test    esi, esi
        jz      .finish

        push    esi
        mov     esi, [esi+TImage.wrapW]
        stdcall DestroyImage ; from the stack
        jmp     .free_loop

.finish:
        mov     [pFirstRecycledImage], 0
        pop     esi
        return
endp


endmodule

Changes to freshlib/graphics/text.asm.








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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343

344
345
346
347
348
349
350
351
352
353



354


355

356

357







358
359

360
361
362
363





364







include "%TargetOS%/text.asm"







macro min a, b, use {

        sub     b, a




        sbb     use, use



        and     use, b
        add     a, use

}



macro max a, b, use {





        sub     b, a
        sbb     use, use




        not     use
        and     use, b





        add     a, use

}




struct TTextExtent
  .width  dd ?
  .height dd ?
  .OffsX  dd ?
  .OffsY  dd ?
ends








; dtfXXX means "draw text flag"

; horizontal align

dtfAlignLeft    = 0
dtfAlignRight   = 1

dtfAlignCenter  = 2
dtfAlignJustify = 3

; vertical align
dtfAlignTop    = 0 shl 2
dtfAlignBottom = 1 shl 2
dtfAlignMiddle = 2 shl 2

; Text layout

dtfCRLF         = $0100
dtfWordWrap     = $0200


dtfTableTabs    = $0400


struct _TTextChunk
  .y      dd ?
  .width  dd ?
  .height dd ?
  .len    dd ?
  .ptr    dd ?
ends


proc DrawTextBox, .raster, .text, .bounds, .flags, .font











































































































.len   dd ?

.count dd ?

.height dd ?





























































































.y      dd ?


.low  dd  ?



.high dd  ?













































































.linew     dd ?

























.lineh     dd ?




.DrawProc dd ?















































begin
        pushad

        mov     ecx, DrawString

        mov     eax, [.flags]
        and     eax, $03
        cmp     eax, dtfAlignJustify
        jne     @f
        mov     ecx, DrawStringJustified
@@:
        mov     [.DrawProc], ecx

        stdcall StrLen, [.text]
        mov     [.len], eax
        stdcall StrPtr, [.text]
        mov     esi, eax

        mov     edi, [.bounds]
        mov     eax, [edi+TBounds.height]
        mov     ecx, [edi+TBounds.y]
        mov     [.height], eax
        mov     [.y], ecx

; slice the string on chunks, depending on flags, rectangle width and the string content.
; push _TTextChunk for every chunk in stack.
        mov     [.count], 0
.slice:
        mov     ecx, [.len]

        test    [.flags], dtfCRLF
        jz      .cropit

        xor     ecx, ecx
.scanCRLF:
        cmp     ecx, [.len]
        jae     .cropit

        mov     al, [esi+ecx]
        cmp     al, $0d
        je      .cropit
        cmp     al, $0a
        je      .cropit
        inc     ecx
        jmp     .scanCRLF

.cropit:
        mov     ebx, ecx  ; high limit
        stdcall GetTextBounds, [.raster], esi, ebx, [.font]

        cmp     edx, [.height]
        jg      .drawchunks

        mov     [.lineh], edx

        cmp     eax, [edi+TBounds.width]
        jle     .itfits

        mov     [.high], ebx
        mov     [.low], 0

.croploop:
        mov     ebx, [.low]
        add     ebx, [.high]
        shr     ebx, 1

        stdcall GetTextBounds, [.raster], esi, ebx, [.font]
        cmp     eax, [edi+TBounds.width]
        je      .itfits

        jg      .above

        cmp     ebx, [.low]
        je      .itfits

        mov     [.low], ebx
        jmp     .croploop

.above:
        mov     [.high], ebx
        jmp     .croploop

.itfits: ; here ebx contains the len of string that fits in the rectangle.
        mov     ecx, ebx
        mov     [.linew], eax

        test    [.flags], dtfWordWrap
        jz      .pushit

; search the last space or tab that separates words:
        mov     edx, ecx
        cmp     byte [esi+edx], $0d
        je      .found
        cmp     byte [esi+edx], $0a
        je      .found

.searchword:
        cmp     byte [esi+edx], 0
        je      .found
        cmp     byte [esi+edx], ' '
        je      .found
        cmp     byte [esi+edx], $09
        je      .found
        dec     edx
        jnz     .searchword
        cmovz   edx, ecx
.found:
        mov     ecx, edx

        stdcall GetTextBounds, [.raster], esi, ecx, [.font]
        mov     [.linew], eax
        mov     [.lineh], edx

.pushit:
        push    esi     ; pointer to the string.
        push    ecx     ; length of the string.
        push    [.lineh]
        push    [.linew]
        push    [.y]

        inc     [.count]

        mov     eax, [.lineh]
        add     [.y], eax
        sub     [.height], eax

        lea     esi, [esi+ecx]
        sub     [.len], ecx
        jz      .drawchunks
        xor     ecx, ecx

; search for the whitespace that have to be skip

.skiploop:
        mov     al, [esi]
        cmp     al, $0d
        je      .skipcrlf
        cmp     al, $0a
        je      .skipcrlf
        cmp     al, $20
        je      .skipspace
        cmp     al, $09
        je      .skipspace

        jmp     .slice

.skipspace:
        inc     esi
        dec     [.len]
        jnz     .skiploop
        jmp     .drawchunks

.skipcrlf:
        inc     esi
        dec     [.len]
        xor     al, $0d xor $0a
        cmp     [esi], al
        jne     .slice
        inc     esi
        dec     [.len]
        jnz     .slice

; pop the _TTextChunk structures and draw, depending on flags.
.drawchunks:
        mov     edx, [.flags]
        and     edx, $0c

        mov     ecx, [edi+TBounds.height]
        sub     ecx, [.y]

        cmp     edx, dtfAlignBottom
        je      .drawloop

        shr     ecx, 1
        cmp     edx, dtfAlignMiddle
        je      .drawloop

        xor     ecx, ecx

.drawloop:
        cmp     [.count], 0
        je      .finish

        mov     ebx, esp

        mov     eax, [edi+TBounds.width]
        sub     eax, [ebx+_TTextChunk.width]

        mov     edx, [.flags]
        and     edx, $03

        cmp     edx, dtfAlignRight
        je      .hready

        shr     eax, 1
        cmp     edx, dtfAlignCenter
        je      .hready

        xor     eax, eax

.hready:
        add     eax, [edi+TBounds.x]

        push    eax
        stdcall GetTextOffset, [.raster], [ebx+_TTextChunk.ptr], [ebx+_TTextChunk.len], [.font]
        add     edx, ecx
        add     edx, [ebx+_TTextChunk.y]
        add     edx, [edi+TBounds.y]
        pop     eax

        stdcall [.DrawProc], [.raster], [ebx+_TTextChunk.ptr], [ebx+_TTextChunk.len], eax, edx, [.font]

; draws lines on every row of text. For debug purposes.
;        stdcall SetLineStyle, $0000ff, 1, 0, 0
;        stdcall MoveTo, [.raster], 0, edx
;        stdcall DrawLine, [.raster], [edi+TBounds.width], edx

        add     esp, sizeof._TTextChunk
        dec     [.count]
        jmp     .drawloop

.finish:
        popad
        return
endp




proc DrawStringJustified, .raster, .ptrString, .len, .x, .y, .font
.XX    dd ?
.rem   dd ?
.ind   dd ?
.crem  dd ?
begin
        pushad

        mov     esi, [.ptrString]

        stdcall GetTextBounds, [.raster], esi, [.len], [.font]

        sub     eax, [edi+TBounds.width]
        neg     eax

        mov     ecx, [.len]
        dec     ecx

        cdq
        div    ecx

        cmp     eax, 4
        jge     .cantjustify    ; the needed space is too big for justify, so just draw it left aligned

        mov     ecx, eax
        mov     [.rem], edx
        mov     [.crem], edx

        mov     ebx, [.len]
        push    [.x]
        pop     [.XX]
        push    [.len]
        pop     [.ind]

.drawloop:
        cmp     [.ind], 0
        jle     .finish

        stdcall DrawString, [.raster], esi, 1, [.XX], [.y], [.font]
        stdcall GetTextBounds, [.raster], esi, 1, [.font]
        add     [.XX], eax
        add     [.XX], ecx

        cmp     [.crem], 0
        je      @f


        sub     ebx, [.rem]
        jge     @f

        inc     [.XX]
        dec     [.crem]
        mov     ebx, [.len]
        sub     ebx, [.rem]

@@:
        inc     esi



        dec     [.ind]


        jmp     .drawloop



.finish:







        popad
        return


.cantjustify:
        stdcall DrawString, [.raster], [.ptrString], [.len], [.x], [.y], [.font]
        jmp     .finish





endp
>
>
>
>
>
>
>
|
|
>
|
>
>
>
>
|
>
|
>
>
>
>
|
>
>
>
|
|
>
|
>
>

|
>
>
>
>
>
|
|
>
>
>
>
|
|
>
>
>
>
>
|
>
|
>
>









>
>
>
>
>
>

<

|
>
|
|
>
|
<

<
<
<
<

|
>
|
|
>
>
|





<





|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|

>
|
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>

>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
|
<
<
<
<
<
<
<
<
<

<
<
<
<
|
<
<
|

<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<

<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
|
<
<
|
|

<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
|
<
<
<
<
<
<

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
|
|
<
<

<
<
|
<
|
|
<
<
<
<
<
<
<
<
<
<
|









|
|
|
<
<



<
|
<
|
<
<

|
|

<
|

|
<

|
<
<

|
|
<
|
|

<
|
|
<
<
<
<
<
<
|
|

>
|
|

|
|
<
<
|
<

>
>
>
|
>
>
|
>

>
|
>
>
>
>
>
>
>


>

|
|
|
>
>
>
>
>
|
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472













473

474









475




476


477
478







479
















480


481










482






483


484
485
486






487












488



489






490




























491


492

































493












494
495


496


497

498
499










500
501
502
503
504
505
506
507
508
509
510
511
512


513
514
515

516

517


518
519
520
521

522
523
524

525
526


527
528
529

530
531
532

533
534






535
536
537
538
539
540
541
542
543


544

545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Text drawing library.
;
;  Target OS: Any
;
;  Dependencies: StrLib
;
;  Notes: This file contains OS independent part of the library and includes respective
;         OS dependent files.
;_________________________________________________________________________________________
module "Text library"

; troXXXX - text rendering options.

troSubpixel   = 0
troGrayscale  = 1
troMonochrome = 2
troSubpixelV  = 3

iglobal
  var TextRenderOptions = troSubpixel ;troGrayscale
endg


; dtfXXX means "draw text flag"

dtfHAlignMask = $3
dtfVAlignMask = $c


; horizontal align
dtfAlignLeft    = 0
dtfAlignRight   = 1
dtfAlignCenter  = 2
dtfAlignJustify = 3


; vertical align
dtfAlignTop    = 0 shl 2
dtfAlignBottom = 1 shl 2
dtfAlignMiddle = 2 shl 2


; Text layout
dtfCRLF         = $0100
dtfWordWrap     = $0200
dtfTableTabs    = $0400
dtfSingleLine   = $0800

; Text suppress

dtfNone         = $80000000



struct TTextExtent
  .width  dd ?
  .height dd ?
  .OffsX  dd ?
  .OffsY  dd ?
ends

struct TCharAttr
  .font       dd ?
  .color      dd ?
  .background dd ?
  .flags      dd ?      ; for free use of the client.
ends



struct TChunkFormat
  .length dd ?
  .font   dd ?
  .color  dd ?
  .flags  dd ?
ends







struct TChunkColor
  .length dd ?
  .color  dd ?
  .bkgnd  dd ?
  .flags  dd ?
ends



struct _TTextChunk
  .y      dd ?
  .width  dd ?

  .len    dd ?
  .ptr    dd ?
ends



struct TTextChar
  .code   dd ?           ; unicode of the character.
  .width  dw ?           ; width increment in pixels.
  .height dw ?           ; height increment in pixels - if <> 0 this char must be written on new line.
ends





interface DrawString, .pImage, .pString, .len, .x, .y, .font, .color


interface TextDecompose, .hString, .font


interface DrawDecomposedString, .pImage, .pArray, .x, .y, .font, .color


interface GetTextBounds, .pString, .len, .font


; Draws a rectangle of TText object with monospaced font.
;
; .pImage        - where to draw.
; .pText         - pointer to TText structure.
;
; .pColors       - pointer to TArray of TChunkColor to be used for drawing.
; .pFont         - font to be used. Must be monospaced.
; .wChar, .hChar - width and height of the font characters.
;
; .xOrg, .yOrg   - the upper left corner in pixels of the whole text.
; .xFrom, .yFrom - the upper left corner in characters from where to draw.
; .width, height - the width and height in characters of the rectangle to draw.

interface DrawFormattedMonoText, .pImage, .pText, .pColors, .pFont, .wChar, .hChar, .xOrg, .yOrg, .xFrom, .yFrom, .width, .height





proc AdjustCountUtf8
begin
        push    esi
        lea     esi, [esi+ebx]
        stdcall ScanBackUtf8
        mov     ebx, esi
        pop     esi
        sub     ebx, esi
        return
endp



proc JustifyLine, .CharArray, .from, .to, .current_width, .align_width
begin
        pushad

        dec     [.to]   ; don't change the last character width.

        mov     edi, [.CharArray]
        mov     ecx, [.to]
        sub     ecx, [.from]
        jle     .finish

        mov     edx, [.align_width]
        sub     edx, [.current_width]
        jle     .finish

        mov     esi, edx

        mov     ebx, [.from]

.align_loop:
        inc     ebx
        cmp     ebx, [.to]
        jae     .finish

        cmp     word [edi+TArray.array+8*ebx+TTextChar.width], 0
        je      .skip_this

.sub:
        test    esi, esi
        js      .negative

        sub     esi, ecx
        inc     word [edi+TArray.array+8*ebx+TTextChar.width]
        jmp     .sub

.negative:
        add     esi, edx
        jmp     .align_loop

.skip_this:
        dec     ecx
        jnz     .align_loop

.finish:
        popad
        return
endp




proc DrawTextBox, .pImage, .text, .x, .y, .width, .height, .extra_line, .flags, .font, .color

.ascender   dd ?
.descender  dd ?
.line_height dd ?

.txt_height dd ?

.last_word  dd ?
.lw_width   dd ?

.no_just    dd ?

begin

        pushad

        stdcall GetFontMetrics, [.font]
        mov     [.line_height], eax
        mov     [.ascender], ebx
        mov     [.descender], edx

        add     [.y], ebx

        stdcall TextDecompose, [.text], [.font]
        mov     edi, eax

        xor     ecx, ecx
        mov     [.txt_height], ecx

        cmp     [edi+TArray.count], ecx
        je      .finish

.main_loop:                             ; start of new line
        xor     ebx, ebx                ; current X coordinate.
        or      [.last_word], -1        ; end of the word -1 means there is no word from the beginning of the line.

        mov     eax, [.txt_height]
        cmp     eax, [.height]
        jb      .format_it

        mov     eax, [.extra_line]
        sub     [.txt_height], eax

        mov     [edi+TArray.count], ecx
        jmp     .draw_all2


.format_it:
        stdcall InsertArrayItems, edi, ecx, 1
        mov     edi, edx
        mov     [eax+TTextChar.code], $20
        mov     dword [eax+TTextChar.width], ebx        ; Set to zero TTextChar.height as well!

        mov     esi, ecx       ; start of the line!
        inc     ecx

.slice_loop:

; Is it end of a word?
        cmp     [edi+TArray.array+8*ecx+TTextChar.code], $20
        ja      .white_ok

        test    ecx, ecx
        jz      .white_ok

        cmp     [edi+TArray.array+8*ecx-8+TTextChar.code], $20  ; previous character
        jbe     .white_ok

        mov     [.last_word], ecx        ; edx is a pointer to the end of the last word.
        mov     [.lw_width], ebx

.white_ok:
        test    [.flags], dtfCRLF
        jz      .crlf_ok

        mov     [.no_just], 1

        cmp     [edi+TArray.array+8*ecx+TTextChar.code], $0d
        je      .new_line

        cmp     [edi+TArray.array+8*ecx+TTextChar.code], $0a
        je      .new_line

.crlf_ok:
        mov     [.no_just], 0

        test    [.flags], dtfTableTabs
        jz      .tabs_ok

; implement here check for tab and tabs expanding.

.tabs_ok:

; check the current line width

        movzx   eax, word [edi+TArray.array+8*ecx+TTextChar.width]
        add     eax, ebx

        cmp     eax, [.width]
        ja      .wider

        mov     ebx, eax

        inc     ecx
        cmp     ecx, [edi+TArray.count]
        jb      .slice_loop

        mov     [.no_just], 1
        call    .RowAlign
        jmp     .draw_all


.wider:
        test    [.flags], dtfSingleLine
        jnz     .del_remaining

        mov     eax, ecx
        sub     eax, esi
        cmp     eax, 1
        jbe     .finish         ; Even single char can not be displayed on this [.width]

; next line
.new_line:

        test    [.flags], dtfWordWrap
        jz      .word_ok

; word wrap
        cmp     [.last_word], 0
        jl      .word_ok       ; there is no previous word, so split on the current pos.

        mov     ecx, [.last_word]
        mov     ebx, [.lw_width]

.word_ok:
        call    .RowAlign

        mov     eax, [.line_height]
        add     eax, [.extra_line]

        add     [.txt_height], eax
        mov     word [edi+TArray.array+8*ecx-8+TTextChar.height], ax

        test    [.flags], dtfCRLF
        jz      .skip_ws_loop

        mov     eax, [edi+TArray.array+8*ecx+TTextChar.code]
        cmp     eax, $0d
        je      .skip_cr

        cmp     eax, $0a
        jne     .skip_ws_loop

.skip_cr:
        mov     word [edi+TArray.array+8*ecx+TTextChar.width], 0     ; zero width, skip it.
        inc     ecx
        cmp     ecx, [edi+TArray.count]
        je      .draw_all

        xor     eax, $0d xor $0a
        cmp     [edi+TArray.array+8*ecx+TTextChar.code], eax
        jne     .main_loop

        mov     word [edi+TArray.array+8*ecx+TTextChar.width], 0     ; zero width, skip it.

        inc     ecx
        cmp     ecx, [edi+TArray.count]
        jae     .draw_all
        jmp     .main_loop

.del_remaining:

        mov     eax, [edi+TArray.count]
        sub     eax, ecx
        stdcall DeleteArrayItems, edi, ecx, eax
        jmp     .draw_all


.skip_ws_loop:
        cmp     [edi+TArray.array+8*ecx+TTextChar.code], $20
        ja      .main_loop

        mov     word [edi+TArray.array+8*ecx+TTextChar.width], 0     ; zero width, skip it.

        inc     ecx
        cmp     ecx, [edi+TArray.count]
        jb      .skip_ws_loop


.draw_all:
; compute the vertical align.

        mov     eax, [.line_height]
        add     [.txt_height], eax

.draw_all2:
        mov     ecx, [.height]
        sub     ecx, [.txt_height]

        mov     eax, [.flags]
        and     eax, dtfVAlignMask

        cmp     eax, dtfAlignTop
        je      .drawit

        add     [.y], ecx

        cmp     eax, dtfAlignBottom
        je      .drawit

        sar     ecx, 1
        sub     [.y], ecx

.drawit:
        stdcall DrawDecomposedString, [.pImage], edi, [.x], [.y], [.font], [.color]


.finish:
        stdcall FreeMem, edi
        popad
        return




.RowAlign:
        mov     eax, [.flags]
        and     eax, dtfHAlignMask

        cmp     eax, dtfAlignLeft
        je      .align_ok               ; no need for extra space

        cmp     eax, dtfAlignJustify
        jne     .align_center_right

        cmp     [.no_just], 1
        je      .align_ok

        stdcall JustifyLine, edi, esi, ecx, ebx, [.width]
        jmp     .align_ok

.align_center_right:

        mov     edx, [.width]
        sub     edx, ebx
        cmp     eax, dtfAlignRight
        je      .set_align

        sar     edx, 1

.set_align:
        mov     word [edi+TArray.array+8*esi+TTextChar.width], dx

.align_ok:
        retn

endp





proc DrawStringFormatted, .pImage, .pString, .len, .x, .y, .pFormat
begin
        pushad














        mov     esi, [.pString]

        mov     edi, [.pFormat]









        mov     ecx, [.len]




        test    ecx, ecx


        jns     .loop








        stdcall StrLen, esi
















        mov     ecx, eax













.loop:






        mov     eax, [edi+TChunkFormat.length]


        test    eax, eax
        jns     @f







        stdcall StrLen, esi












@@:



        stdcall DrawString, [.pImage], esi, eax, [.x], [.y], [edi+TChunkFormat.font], [edi+TChunkFormat.color]



































        add     [.x], eax




































        mov     eax, [edi+TChunkFormat.length]












        test    eax, eax
        js      .finish





        add     edi, sizeof.TChunkFormat

        add     esi, eax
        sub     ecx, eax










        jae     .loop

.finish:
        popad
        return
endp





proc GetTextBounds2D, .pText, .font
.line dd ?


begin
        pushad


        stdcall GetFontMetrics, [.font]

        mov     [.line], eax



        xor     ebx, ebx
        xor     ecx, ecx


        mov     esi, [.pText]

.loopy:


        mov     edi, esi        ; start of the line.



.loopx:
        lodsb

        test    al, al
        jz      .eol


        cmp     al, $0d
        je      .eol






        cmp     al, $a0
        jne     .loopx

.eol:
        lea     edx, [esi-1]
        sub     edx, edi        ; the string length

        xor     al, $0d xor $0a
        cmp     al, byte [esi]


        jne     .cr_ok

        inc     esi
.cr_ok:
        cmp     al, $0d xor $0a
        pushf

        stdcall GetTextBounds, edi, edx, [.font]

        cmp     ebx, eax
        cmovb   ebx, eax

        add     ecx, [.line]

        popf
        jne     .loopy

.end:
        mov     [esp+4*regEAX], ebx
        mov     [esp+4*regEDX], ecx

        popad
        return
endp




include "%TargetOS%/text.asm"




endmodule

Added freshlib/gui/Dummy/Main.asm.





















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Main procedure of GUI application library.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes: Organize the main message/event loop needed by every GUI engine.
;_________________________________________________________________________________________

proc ProcessSystemEvents
begin
        stc
        return
endp



proc WaitForSystemEvent
begin
        return
endp



;----------------------------------------------------------------------------------------------------------
; This procedure makes following:
;   1. Takes as arguments one windows message
;   2. Converts this message to FreshLib system event (or not, depending on the message)
;   3. Calls SysEventHandler procedures for the given object (if any) with the created event structure.
;   4. returns CF=0 if the event was properly processed.
;   5. returns CF=1 if the event was not processed.
;
; The event can be not processed in the following cases:
;   1. The window that receives the message is not FreshLib object.
;   2. TObjectClass.procSysEventHandler = 0 for the given class and all parents.
;   3. All procSysEventHandler procedures refuse to process the event (CF=1)
;----------------------------------------------------------------------------------------------------------

dproc __ProcessOneSystemEvent, .hwnd, .wmsg, .wparam, .lparam
begin

        dispatch [.wmsg]

.ondefault:
        stc
        return

oncase 0
       clc
       return
enddp


Added freshlib/gui/Dummy/TApplication.asm.



























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TApplication object class.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


proc TApplication.Create, .obj
begin
        clc
        return
endp



proc TApplication.Get, .obj, .paramID
begin
        stc
        return
endp




proc TApplication.Set, .obj, .paramID, .value
begin
        stc
        return
endp



proc TApplication.SysEventHandler, .obj, .event
begin
        stc
        return
endp

Added freshlib/gui/Dummy/keycodes.inc.



























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: This file contains scan code values for control keyboard keys.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

keyHomeNumpad  = $47
keyUpNumpad    = $48
keyPgUpNumpad  = $49
keyLeftNumpad  = $4b
key5Numpad     = $4c
keyRightNumpad = $4d
keyEndNumpad   = $4f
keyDownNumpad  = $50
keyPgDnNumpad  = $51
keyInsNumpad   = $52
keyDelNumpad   = $53
keyEnterNumpad = $1c    ; it is ASCII $0d
keyPlusNumpad  = $4e
keyMinusNumpad = $4a
keyAsteriskNumpad = $37
keySlashNumpad = $35

keyNumLock     = $45
keyScrollLock  = $46
keyPause       = $45
keyPrtScr      = $37


keyLeft =  $4b
keyRight = $4d
keyUp    = $48
keyDown  = $50

keyInsert  = $52
keyDelete  = $53
keyHome    = $47
keyEnd     = $4f
keyPgUp    = $49
keyPgDown  = $51

keyF1   =  $3b
keyF2   =  $3c
keyF3   =  $3d
keyF4   =  $3e

keyF5   =  $3f
keyF6   =  $40
keyF7   =  $41
keyF8   =  $42

keyF9   =  $43
keyF10  =  $44 ; used for menu and does not generate WM_KEYDOWN.
keyF11  =  $57
keyF12  =  $58

keyCapsLock   = $3a
keyShiftLeft  = $2a
keyCtrlLeft   = $1d
keyWndLeft    = $5b
keyWndRight   = $5c
keyAltLeft    = $38
keyAltRight   = $38
keyPopupMenu  = $5d
keyShiftRight = $36
keyCtrlRight  = $1d

keyBackSpace  = $0e

Added freshlib/gui/Dummy/mouse.asm.

































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Provides unified access to standard mouse cursors.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


proc SetMouseCursor, .hCursor
begin
        return
endp



proc GetStockCursor, .index
begin
        return
endp


proc MouseCapture, .hwnd
begin
        return
endp

Added freshlib/gui/Dummy/windows.asm.



























































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Window management OS interface functions.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


;_________________________________________________________________________________________


proc _CreateNullWindow
begin
        return
endp

;_________________________________________________________________________________________



proc _DestroyWindow, .hwnd
begin
        return
endp


;_________________________________________________________________________________________


proc _GetParent, .hwnd
begin
        return
endp

;_________________________________________________________________________________________


proc _GetChildren, .hwnd
begin
        return
endp


;_________________________________________________________________________________________



proc _GetVisible, .hwnd
begin
        return
endp

;_________________________________________________________________________________________


proc _GetWindowBounds, .hwnd, .pBounds
begin
        return
endp



;_________________________________________________________________________________________


proc _SetWindowBounds, .hwnd, .pBounds
begin
        return
endp





;_________________________________________________________________________________________

proc _SetWindowBorder, .hwnd, .brdType
begin
        return
endp

;_________________________________________________________________________________________

proc _ShowWindow, .hwnd, .flag
begin
        return
endp


;_________________________________________________________________________________________


proc _RefreshWindow, .hwnd
begin
        return
endp


;_________________________________________________________________________________________


proc _SetFocus, .hwnd
begin
        return
endp

;_________________________________________________________________________________________

proc _AddChild, .hwnd, .child
begin
        return
endp

;_________________________________________________________________________________________


; Common utility procedures.


;_________________________________________________________________________________________
;
; Returns the window TObject structure, from the window handle.
;_________________________________________________________________________________________

proc _GetWindowStruct, .hwin
begin
        return
endp



;_________________________________________________________________________________________



proc _SetWindowStruct, .hwin, .value
begin
        return
endp


;_________________________________________________________________________________________



proc _SetWindowTextUtf8, .hwnd, .ptrUtf8
begin
        return
endp



;_________________________________________________________________________________________



proc _GetWindowTextUtf8, .hwnd, .ptrUtf8
begin
        return
endp



;_________________________________________________________________________________________


proc _EnableWindow, .hwnd, .flag
begin
        return
endp


;_________________________________________________________________________________________


proc _SetModalTowards, .hwnd, .hwndParent
begin
        return
endp


;_________________________________________________________________________________________


proc _FinalizeModal, .hwnd, .hwndParent
begin
        return
endp


;_________________________________________________________________________________________


proc __CommonWindowProc, .hwnd, .wmsg, .wparam, .lparam
begin
        return
endp

Added freshlib/gui/KolibriOS/Main.asm.





















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Main procedure of GUI application library.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes: Organize the main message/event loop needed by every GUI engine.
;_________________________________________________________________________________________

proc ProcessSystemEvents
begin
        stc
        return
endp



proc WaitForSystemEvent
begin
        return
endp



;----------------------------------------------------------------------------------------------------------
; This procedure makes following:
;   1. Takes as arguments one windows message
;   2. Converts this message to FreshLib system event (or not, depending on the message)
;   3. Calls SysEventHandler procedures for the given object (if any) with the created event structure.
;   4. returns CF=0 if the event was properly processed.
;   5. returns CF=1 if the event was not processed.
;
; The event can be not processed in the following cases:
;   1. The window that receives the message is not FreshLib object.
;   2. TObjectClass.procSysEventHandler = 0 for the given class and all parents.
;   3. All procSysEventHandler procedures refuse to process the event (CF=1)
;----------------------------------------------------------------------------------------------------------

proc __ProcessOneSystemEvent, .hwnd, .wmsg, .wparam, .lparam
begin

        dispatch [.wmsg]

.ondefault:
        stc
        return

oncase 0
       clc
       return

        enddispatch
endp

Added freshlib/gui/KolibriOS/application.asm.











































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TApplication object class.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________




uglobal
    var FTLibrary = ?
    var FTCManager = ?
    var FTCImageCache = ?
    var FTCCMapCache = ?
endg




proc InitGUIApplication
begin
        return
endp


proc TerminateGUI
begin
        return
endp

Added freshlib/gui/KolibriOS/clipboard.asm.



























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Clipboard management library.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;_________________________________________________________________________________________

; returns eax = handle to string with the clipboard data.
body ClipboardRead
begin
        return
endp



; writes the string .hstring to the clipboard.
; returns nothing.

body ClipboardWrite;, .hstring
begin
        return
endp


Added freshlib/gui/KolibriOS/keycodes.inc.





















































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: This file contains scan code values for control keyboard keys.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

keyHomeNumpad  = $47
keyUpNumpad    = $48
keyPgUpNumpad  = $49
keyLeftNumpad  = $4b
key5Numpad     = $4c
keyRightNumpad = $4d
keyEndNumpad   = $4f
keyDownNumpad  = $50
keyPgDnNumpad  = $51
keyInsNumpad   = $52
keyDelNumpad   = $53
keyEnterNumpad = $1c    ; it is ASCII $0d
keyPlusNumpad  = $4e
keyMinusNumpad = $4a
keyAsteriskNumpad = $37
keySlashNumpad = $35

keyNumLock     = $45
keyScrollLock  = $46
keyPause       = $45
keyPrtScr      = $37


keyLeft =  $4b
keyRight = $4d
keyUp    = $48  ; 72
keyDown  = $50

keyInsert  = $52
keyDelete  = $53
keyHome    = $47
keyEnd     = $4f
keyPgUp    = $49
keyPgDown  = $51

keyF1   =  $3b
keyF2   =  $3c
keyF3   =  $3d
keyF4   =  $3e

keyF5   =  $3f
keyF6   =  $40
keyF7   =  $41
keyF8   =  $42

keyF9   =  $43
keyF10  =  $44 ; used for menu and does not generate WM_KEYDOWN.
keyF11  =  $57
keyF12  =  $58

keyCapsLock   = $3a
keyShiftLeft  = $2a
keyCtrlLeft   = $1d
keyWndLeft    = $5b
keyWndRight   = $5c
keyAltLeft    = $38
keyAltRight   = $38
keyPopupMenu  = $5d
keyShiftRight = $36
keyCtrlRight  = $1d

keyBackSpace  = $0e

keyTab = $ff00

keyA            = 'a'
keyB            = 'b'
keyC            = 'c'
keyD            = 'd'
keyE            = 'e'
keyF            = 'f'
keyG            = 'g'
keyH            = 'h'
keyI            = 'i'
keyJ            = 'j'
keyK            = 'k'
keyL            = 'l'
keyM            = 'm'
keyN            = 'n'
keyO            = 'o'
keyP            = 'p'
keyQ            = 'q'
keyR            = 'r'
keyS            = 's'
keyT            = 't'
keyU            = 'u'
keyV            = 'v'
keyW            = 'w'
keyX            = 'x'
keyY            = 'y'
keyZ            = 'z'

Added freshlib/gui/KolibriOS/mouse.asm.

















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Provides unified access to standard mouse cursors.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


body SetMouseCursor     ;, .hWindow, .hCursor
begin
        return
endp



body GetStockCursor     ;, .index
begin
        return
endp



body __MouseCapture     ;, .hwnd
begin
        return
endp



body ZeroMouseMove
begin
        return
endp

Added freshlib/gui/KolibriOS/windows.asm.























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Window management OS interface functions.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________



body _CreateWindow
begin
        return
endp

;_________________________________________________________________________________________



body _DestroyWindow
begin
        return
endp


;_________________________________________________________________________________________




body _ClientToScreen
begin

        return
endp



;_________________________________________________________________________________________



body _RefreshWindowRect
begin
        return
endp


;_________________________________________________________________________________________


body _SetWindowTextUtf8
begin
        return
endp

;_________________________________________________________________________________________



body _SetModalTowards
begin
        return
endp


body _FinalizeModal
begin
        return
endp

;_________________________________________________________________________________________


; Common utility procedures.


;_________________________________________________________________________________________
;
; Returns the window TObject structure, from the window handle.
;_________________________________________________________________________________________

body _GetWindowStruct
begin
        return
endp



;_________________________________________________________________________________________



body _SetWindowStruct
begin
        return
endp


;_________________________________________________________________________________________

Added freshlib/gui/Linux/Main.asm.

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Main procedure of GUI application library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes: Organize the main message/event loop needed by every GUI engine.
;_________________________________________________________________________________________

uglobal
  if used fGlobalTerminate
    fGlobalTerminate dd ?
  end if

  if used __PrevClick
    __PrevClick evButtonPress
  end if


  if used __pExposeList
    __pExposeList dd ?
  end if

  if used __pMotionEvent
    __pMotionEvent dd ?
  end if
endg



body ProcessSystemEvents
  .evExpose evExpose
begin
        pushad

        xor     eax, eax
        xchg    eax, [__pMotionEvent]
        test    eax, eax
        jz      .event_loop
        
        stdcall FreeMem, eax

.event_loop:
        cmp     [fGlobalTerminate], 0    ; check for quit
        jne     .terminate

        stdcall xRecv, appConn, FALSE
        jc      .noevents

        test    eax, eax
        jz      .noevents     ; because of some reason the read mutex can't be locked. Try the next time.

        mov     ebx, eax

;.process:
        cmp     [ebx+xResponse.code],  rspError     ; error
        je      .error

        cmp     [ebx+xResponse.code], rspReply      ; reply
        je      .reply

; its event here

        cmp     [ebx+xAnyEvent.event], Expose
        jne     .expose_ok

; expose event.

        mov     edx, [__pExposeList]
        test    edx, edx
        jnz     .lst_ok

        stdcall CreateArray, sizeof.RECT
        mov     edx, eax

.lst_ok:
        mov     eax, [ebx+evExpose.window]
        cmp     eax, [edx+TArray.lparam]
        je      .add_expose

        call    .flush_expose

.add_expose:
        movzx   eax, [ebx+evExpose.x]
        movzx   ecx, [ebx+evExpose.y]
        movzx   esi, [ebx+evExpose.width]
        movzx   edi, [ebx+evExpose.height]
        stdcall RectListAddXY, edx, eax, ecx, esi, edi
        mov     eax, [ebx+evExpose.window]
        mov     [edx+TArray.lparam], eax
        
        mov     [__pExposeList], edx
        jmp     .next

.expose_ok:
        cmp     [ebx+xAnyEvent.event], MotionNotify
        jne     .process_event

        mov     eax, [ebx+evMotionNotify.window]
        xchg    ebx, [__pMotionEvent]

        test    ebx, ebx
        jz      .event_loop

        cmp     eax, [ebx+evMotionNotify.window]
        je      .next

.process_event:
        stdcall __ProcessOneSystemEvent, ebx

.next:
        stdcall FreeMem, ebx
        jmp     .event_loop


.flush_expose:
        push    edx

        mov     edi, [edx+TArray.count]

        mov     eax, [edx+TArray.lparam]
        mov     [.evExpose.window], eax

        mov     [.evExpose.event], Expose
        mov     [.evExpose.count], 0
        mov     [.evExpose.seq], 0

        lea     edx, [edx+TArray.array]

.flush_loop:
        dec     edi
        js      .end_flush

        mov     eax, [edx+RECT.left]
        mov     ecx, [edx+RECT.top]

        mov     [.evExpose.x], ax
        mov     [.evExpose.y], cx

        mov     eax, [edx+RECT.right]
        mov     ecx, [edx+RECT.bottom]
        sub     eax, [edx+RECT.left]
        sub     ecx, [edx+RECT.top]

        mov     [.evExpose.width], ax
        mov     [.evExpose.height], cx

        lea     eax, [.evExpose]
        stdcall __ProcessOneSystemEvent, eax

        add     edx, sizeof.RECT
        jmp     .flush_loop

.end_flush:
        pop     edx
        mov     [edx+TArray.count], 0
        retn




; process replies.

.reply:

; Dispatch the replies to the callbacks if any. Else, discard.
        movzx   ecx, [ebx+xAnyReply.seq]

        OutputValue "Reply for sequence: ", ecx, 10, -1

        xor     esi, esi
        xchg    [appConn.pFCallback], esi      ;(xchg is always atomic regardless of lock prefix)

        test    esi, esi
        jz      .next   ; there is no records in the queue

.loop_forward:
        cmp     cx, word [esi+xCallback.sequence]
        jl      .processed                         ; it is too early for this callback, restore the queue.
        jg      .discard                           ;

; call the callback
        pushad
        stdcall [esi+xCallback.proc], ebx, [esi+xCallback.lparam]
        popad

.discard:
        push    esi  ; for calling FreeMem below.

        mov     eax, esi                        ; Either it was the last record (esi == .pLCallback) so
        lea     edx, [appConn.pFCallback]       ; reset the queue, or it is not the last and it is safe to
        lock cmpxchg [appConn.pLCallback], edx  ; manipulate the .p_next field and write to the .pFCallback field.
        je      .free

; possible race condition here if new pointer is written to .pLCallback, but
; the previous element xCallback.p_next is not updated yet.

        xor     eax, eax

.wait:
        pause
        xchg [esi+xCallback.p_next], eax
        test   eax, eax
        jz     .wait

        mov     esi, eax  ; next element in the queue

        stdcall FreeMem ; from the stack
        jmp     .loop_forward

.free:
        stdcall FreeMem ; from the stack
        jmp     .next

.processed:
        mov     [appConn.pFCallback], esi        ; it is safe to write here, because there is at least one element in the queue
        jmp     .next                            ; so, the pFCallback field should not be written from another thread.


.error:
        stdcall OutputErrorMessage, ebx
        jmp     .next


.noevents:
        xor     edx, edx
        xchg    edx, [__pExposeList]
        test    edx, edx
        jz      .exp_ok
        
        call    .flush_expose
        stdcall FreeMem, edx

.exp_ok:
        xor     ebx, ebx
        xchg    ebx, [__pMotionEvent]
        test    ebx, ebx
        jz      .finish

        stdcall __ProcessOneSystemEvent, ebx
        stdcall FreeMem, ebx

.finish:
        clc
        popad
        return

.terminate:
        stc
        popad
        return
endp



; call this function on freeing window ID (in xFreeID).

proc __CleanupDeferedEvents, .id
begin
        push    eax edx
        
        mov     eax, [.id]
        mov     edx, [__pExposeList]
        test    edx, edx
        jz      .expose_ok
        
        cmp     eax, [edx+TArray.lparam]
        jne     .expose_ok

        xor     edx, edx
        xchg    edx, [__pExposeList]
        stdcall FreeMem, edx

.expose_ok:
        mov     edx, [__pMotionEvent]
        test    edx, edx
        jz      .finish

        cmp     eax, [edx+evMotionNotify.window]
        jne     .finish

        xor     edx, edx
        xchg    edx, [__pMotionEvent]
        stdcall FreeMem, edx

.finish:
        pop     edx eax
        return
endp







proc OutputErrorMessage, .xerror
begin
        pushad

        stdcall DebugLock

        mov     esi, [.xerror]

        stdcall FileWriteString, [STDERR], txt "XError code: "

        movzx   ecx, [ebx+xAnyError.error]
        cmp     ecx, .count
        ja      .show_number

        stdcall FileWriteString, [STDERR], txt "Bad"

        lea     ecx, [2*ecx]
        lea     ecx, [8*ecx+.noerror]
        stdcall FileWrite, [STDERR], ecx, 16
        jmp     .errnum_ok

.show_number:
        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        push    eax
        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel ; from the stack

.errnum_ok:
        stdcall FileWrite, [STDERR], <txt 13, 10>, 2

; bad sequence
        stdcall FileWriteString, [STDERR], "Sequence number: "

        movzx   eax, [ebx+xAnyError.seq]
        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        push    eax
        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel ; from the stack

        stdcall FileWrite, [STDERR], <txt 13, 10>, 2

; on operation:
        stdcall FileWriteString, [STDERR], "Operation opcode: "

        movzx   eax, [ebx+xAnyError.major]
        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        push    eax
        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel ; from the stack

        stdcall FileWriteString, [STDERR], txt "."

        movzx   eax, [ebx+xAnyError.minor]
        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        push    eax
        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel ; from the stack

        stdcall FileWrite, [STDERR], <txt 13, 10>, 2

; Bad value
        movzx   eax, [ebx+xAnyError.error]
        cmp     [.hasval + eax], 0
        je      .value_ok

        stdcall FileWriteString, [STDERR], "Bad value: $"

        mov     eax, [ebx+xAnyError.bad_num]
        stdcall NumToStr, eax, ntsHex or ntsUnsigned
        push    eax
        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel ; from the stack

        stdcall FileWriteString, [STDERR], txt " ("

        mov     eax, [ebx+xAnyError.bad_num]
        stdcall NumToStr, eax, ntsDec or ntsSigned
        push    eax
        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel ; from the stack

        stdcall FileWriteString, [STDERR], <txt ")", 13, 10>

.value_ok:
        stdcall FileWrite, [STDERR], <txt 13, 10>, 2
        stdcall DebugUnlock

        popad
        return

.noerror  dq "NoError ", "        "
.request  dq "Request ", "        "
.value    dq "Value   ", "        "
.window   dq "Window  ", "        "
.pixmap   dq "Pixmap  ", "        "
.atom     dq "Atom    ", "        "
.cursor   dq "Cursor  ", "        "
.font     dq "Font    ", "        "
.match    dq "Match   ", "        "
.drawable dq "Drawable", "        "
.access   dq "Access  ", "        "
.alloc    dq "Alloc   ", "        "
.colormap dq "Colormap", "        "
.gcontext dq "GContext", "        "
.idchoice dq "IDChoise", "        "
.name     dq "Name    ", "        "
.length   dq "Length  ", "        "
.implem   dq "Implemen", "tation  "
.count = ($ - .noerror)/16

.hasval   db 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0
endp




; Wait for events, but with timeout.
; Somehow tricky implementation.

body WaitForSystemEvent
.timeout lnx_timeval
.fd_set  rb 128
begin
        pushad

        lea     edi, [.fd_set]
        xor     eax, eax
        mov     ecx, 32
        rep stosd

        mov     [.timeout.tv_sec], eax
        mov     [.timeout.tv_usec], 50000

        mov     ecx, [appConn.socket]
        mov     eax, ecx
        and     ecx, 11111b
        shr     eax, 5
        bts     dword [.fd_set+4*eax], ecx

        mov     eax, sys_select
        mov     ebx, [appConn.socket]
        inc     ebx
        lea     ecx, [.fd_set]
        xor     edx, edx
        xor     esi, esi
        lea     edi, [.timeout]
        int     80h

        test    eax, eax
        jz      .its_timeout

.finish_ok:
        clc
        popad
        return

.its_timeout:
        stc
        popad
        return
endp






proc __ProcessOneSystemEvent, .xevent
begin
        pushad

        mov     ebx, [.xevent]

.base:
        movzx   ecx, [ebx+xAnyEvent.event]
        and     ecx, $7f                        ; the bit 7 indicates messages sent by SendMessage.

; clipboard events

        cmp     ecx, [appConn.exFixes.FirstEvent]
        je      .sel_owner_changed

        cmp     ecx, SelectionRequest
        je      .sel_req_event

        cmp     ecx, SelectionNotify
        je      .sel_notify_event

; events without window

        cmp     ecx, [appConn.exKbd.FirstEvent]
        je      .xkb_event

        cmp     ecx, [appConn.exShm.FirstEvent]
        je      .shm_complete

        cmp     ecx, MappingNotify
        je      .mapping_notify

; events with window
        cmp     ecx, LASTEvent
        jae     .notprocessed

        movzx   eax, [.jump_table+4*ecx+2]
        movzx   ecx, [.jump_table+4*ecx]
        jecxz   .notprocessed

        test    eax, eax
        jz      .notprocessed   ; the event is not about window

        add     ecx, .base

        mov     esi, dword [ebx+eax]  ; eax is the offset inside the raw event structure of the window ID
        stdcall xGetObj, appConn, esi
        jc      .notprocessed

        mov     esi, eax

        jmp     ecx

.notprocessed:
        popad
        stc
        return

.finish:
        popad
        clc
        return


.xkb_event:
        OutputValue "XKB Event #", ecx, 10, -1
        OutputMemoryByte ebx, 32

        jmp     .mapping_notify


.shm_complete:
        stdcall xGetObj, appConn, [ebx+evShmCompletion.segID]
        jc      .finish

        mov     [eax+TLinuxImage.readonly], 0
        jmp     .finish

; refreshes keyboard mapping information, stored locally.
.mapping_notify:
locals
.getmap __xXkbGetMapReq
endl
        mov     eax, [appConn.exKbd.OpCode]
        mov     [.getmap.op], al
        mov     [.getmap.minor], opXkbGetMap
        mov     [.getmap.length], sizeof.__xXkbGetMapReq/4
        mov     [.getmap.deviceSpec], xkbUseCoreKbd
        mov     [.getmap.full], mxkbKeySyms
        mov     [.getmap.partial], 0

        lea     eax, [.getmap]
        stdcall xSendWithCallback, appConn, eax, __IndexKeymap, 0
        jmp     .finish


;.........................................................................
; seMove and seResize events.
;-------------------------------------------------------------------------
.moveresize:
; ConfigureNotify event

        test    [ebx+evConfigureNotify.event], $80
        jz      .is_resize                          ; the correct move events are only from the window manager, i.e. through SendEvent

        movsx   eax, [ebx+evConfigureNotify.x]
        movsx   edx, [ebx+evConfigureNotify.y]

        cmp     eax, [esi+TWindow._x]
        jne     .move

        cmp     edx, [esi+TWindow._y]
        je      .is_resize

.move:
        exec    esi, TWindow:ExtMove, eax, edx

; resize event...
.is_resize:
        movzx   eax, [ebx+evConfigureNotify.width]
        movzx   edx, [ebx+evConfigureNotify.height]

        cmp     eax, [esi+TWindow._width]
        jne     .resize

        cmp     edx, [esi+TWindow._height]
        je      .finish

.resize:
        exec    esi, TWindow:ExtResize, eax, edx
        jmp     .finish

;.........................................................................
; DestroyNotify handler it invalidates the handle in TWindow structure and then destroys TWindow.
; Do we need it???
.destroy:
        test    esi, esi
        jz      .finish

;        mov     [esi+TWindow.handle], 0

;        destroy esi
        jmp     .finish


;.........................................................................
; Mouse event handlers

.mousemove:
        movsx   ecx, [ebx+evMotionNotify.x]
        movsx   edx, [ebx+evMotionNotify.y]
        movzx   eax, [ebx+evMotionNotify.state]

        stdcall ServeMenuMouseMove, esi, ecx, edx, eax
        jc      .finish

        mov     edi, [__MouseTarget]
        test    edi, edi
        jz      .search_target_move

        ; returns coordinates in ecx, edx
        stdcall __GetRelativeXY, edi, ecx, edx
        jmp     .target_move

.search_target_move:
        ; returns coordinates in ecx, edx
        exec    esi, TWindow:ChildByXY, ecx, edx, TRUE
        mov     edi, eax

.target_move:
        cmp     edi, [__LastPointedWindow]
        je      .move_event

        cmp     [__LastPointedWindow], 0
        je      .leave_ok

        exec    [__LastPointedWindow], TWindow:EventMouseLeave

.leave_ok:
        mov     [__LastPointedWindow], edi
        exec    edi, TWindow:EventMouseEnter

.move_event:
        movzx   eax, [ebx+evMotionNotify.state]
        exec    edi, TWindow:EventMouseMove, ecx, edx, eax
        jmp     .finish


.mouseleave:
        xor     eax, eax
        xchg    eax, [__LastPointedWindow]
        test    eax, eax
        jz      .finish

        exec    eax, TWindow:EventMouseLeave
        jmp     .finish


;.........................................................................

.mouse_btn_press:
        movsx   ecx, [ebx+evButtonPress.x]
        movsx   edx, [ebx+evButtonPress.y]
        movzx   eax, [ebx+evButtonPress.state]
        movzx   edi, [ebx+evButtonPress.detail]

        stdcall ServeMenuButtonPress, esi, edi, eax, ecx, edx
        jc      .finish

        mov     edi, [__MouseTarget]
        test    edi, edi
        jz      .search_target_press

        stdcall __GetRelativeXY, edi, ecx, edx
        jmp     .target_press


.search_target_press:
        exec    esi, TWindow:ChildByXY, ecx, edx, TRUE
        mov     edi, eax

.target_press:
        get     eax, edi, TWindow:GlobalEnabled
        test    eax, eax
        jz      .finish

        cmp     [ebx+evButtonPress.detail], mbScrollUp   ; the codes for the scroll are 4, 5, 6 and 7
        jae     .wheelscroll

; deal with focus
        stdcall __SetIntFocused, edi

; now detect double clicks:

        mov     al, [ebx+evButtonPress.detail]
        cmp     al, [__PrevClick.detail]
        jne     .single

        mov     eax, [ebx+evButtonPress.time]
        sub     eax, [__PrevClick.time]
        cmp     eax, [GUI.DoubleClickTime]
        ja      .single

        xor     eax, eax
        mov     ax, [ebx+evButtonPress.x]
        sub     ax, [__PrevClick.x]
        jns     @f
        neg     ax
@@:
        cmp     eax, [GUI.DoubleClickDistance]
        ja      .single

        mov     ax, [ebx+evButtonPress.y]
        sub     ax, [__PrevClick.y]
        jns     @f
        neg     ax
@@:
        cmp     eax, [GUI.DoubleClickDistance]
        ja      .single

; double click detected
        movzx   eax, [ebx+evButtonPress.detail]
        movzx   ebx, [ebx+evButtonPress.state]
        push    eax

        exec    edi, TWindow:EventButtonPress, eax, ebx, ecx, edx
        pop     eax
        exec    edi, TWindow:EventButtonDoubleClick, eax, ebx, ecx, edx

;clear the previous
        mov     edi, __PrevClick
        mov     ecx, sizeof.evButtonPress / 4
        xor     eax, eax
        rep stosd
        jmp     .finish


.single:
        movzx   eax, [ebx+evButtonPress.detail]
        movzx   ebx, [ebx+evButtonPress.state]
        exec    edi, TWindow:EventButtonPress, eax, ebx, ecx, edx

; copy the previous event
        mov     esi, [.xevent]
        mov     edi, __PrevClick
        mov     ecx, sizeof.evButtonPress / 4
        rep movsd
        jmp     .finish


.wheelscroll:
        movzx   ecx, [ebx+evButtonPress.detail]

        mov     edx, scrollY
        cmp     ecx, mbScrollLeft
        jae     .scrollx
        test    [ebx+evButtonPress.state], maskShift     ; generate horizontal scroll events when the Shift button is pressed during the scroll.
        jz      .dir_ok

.scrollx:
        mov     edx, scrollX
        and     ecx, $5         ; converts mbScrollLeft/mbScrollRight to scWheelUp/scWheelDn (number magic!!!)

.dir_ok:
        exec    edi, TWindow:EventScroll, edx, ecx, 1
        jmp     .finish

;.........................................................................

.mouse_btn_release:
        mov     edi, [__MouseTarget]
        test    edi, edi
        jz      .search_target_release

;       OutputValue "Release mouse target: ", edi, 16, 8

        movsx   ecx, [ebx+evButtonRelease.x]
        movsx   edx, [ebx+evButtonRelease.y]

        stdcall __GetRelativeXY, edi, ecx, edx
        jmp     .target_release

.search_target_release:

;        OutputValue "Search for mouse target in: ", esi, 16, 8

        movsx   ecx, [ebx+evButtonRelease.x]
        movsx   edx, [ebx+evButtonRelease.y]

        exec    esi, TWindow:ChildByXY, ecx, edx, TRUE
        mov     edi, eax

.target_release:
;        OutputValue "Release mouse target found: ", edi, 16, 8

        get     eax, eax, TWindow:GlobalEnabled
        test    eax, eax
        jz      .finish

        movzx   eax, [ebx+evButtonRelease.detail]
        movzx   ebx, [ebx+evButtonRelease.state]
        exec    edi, TWindow:EventButtonRelease, eax, ebx, ecx, edx
        jmp     .finish


;.........................................................................
; Window paint event

.expose:
        get     edi, esi, TWindow:Screen
        test    edi, edi
        jz      .finish

if defined Caret
        stdcall __PaintCaret, esi, edi
end if

        movzx   eax, [ebx+evExpose.count]

        movzx   ecx, [ebx+evExpose.width]
        movzx   edx, [ebx+evExpose.height]
        movsx   eax, [ebx+evExpose.x]
        movsx   ebx, [ebx+evExpose.y]

;        OutputValue "Expose width: ", ecx, 10, -1
;        OutputValue "Expose height: ", edx, 10, -1

        stdcall DrawImageRect, [esi+TWindow.handle], edi, eax, ebx, eax, ebx, ecx, edx

        mov     eax, [.xevent]
        movzx   eax, [eax+evExpose.count]

        test    eax, eax
        jnz     .finish            ; there are other expose events waiting.

if defined options.DebugMode.ComputeFPS & options.DebugMode.ComputeFPS
        stdcall FramesPerSecond
end if

        xor     eax, eax
        xor     edx, edx

        xchg    eax, [esi+TWindow.sync_valueLo]
        xchg    edx, [esi+TWindow.sync_valueHi]

        test    eax, eax
        jnz     .set_counter

        test    edx, edx
        jz      .finish

; XSYNC handling of the window resize by the window manager.
.set_counter:
locals
  .cnt __xSetCounterReq
endl
        mov     ecx, [esi+TWindow.sync_counter]
        test    ecx, ecx
        jz      .finish

        mov     [.cnt.counterID], ecx

        OutputValue "SetCounter valueLo: ", eax, 10, -1
        OutputValue "SetCounter valueHi: ", edx, 10, -1

        mov     [.cnt.valueHi], edx
        mov     [.cnt.valueLo], eax

        mov     eax, [appConn.exSync.OpCode]
        mov     [.cnt.op], al
        mov     [.cnt.minor], opSetCounter
        mov     [.cnt.length], sizeof.__xSetCounterReq/4

        lea     eax, [.cnt]
        stdcall xSend, appConn, eax
        jmp     .finish


;.........................................................................
; Keyboard events.
.key_press:

        movzx   eax, [ebx+evKeyPress.detail]
        movzx   edx, [ebx+evKeyPress.state]
        stdcall KeycodeToKeysym, [appConn.pKeymap], eax, edx
        mov     ecx, eax

        stdcall KeysymToUnicode, eax, edx
        stdcall EncodeUtf8, eax
        mov     edx, eax

        mov     edi, [__ActiveMenu]
        test    edi, edi
        jnz     .send_key_event

        mov     edi, [__FocusedWindow]
        test    edi, edi
        jz      .active_form

.send_key_event:
        movzx   eax, [ebx+evKeyPress.state]
        exec    edi, TWindow:EventKeyPress, edx, ecx, eax
        jc      .finish

.active_form:
        cmp     [__ActiveForm], 0
        je      .finish

        get     edi, [__ActiveForm], TForm:ActionList
        test    edi, edi
        jz      .finish

        movzx   eax, [ebx+evKeyPress.state]
        exec    edi, TActionList:EventKeyPress, edx, ecx, eax
        jmp     .finish

;.........................................................................

.key_release:

        cmp     [__FocusedWindow], 0
        je      .finish


        movzx   eax, [ebx+evKeyRelease.detail]
        movzx   ebx, [ebx+evKeyRelease.state]
        stdcall KeycodeToKeysym, [appConn.pKeymap], eax, ebx
        mov     ecx, eax

        stdcall KeysymToUnicode, eax, ebx
        stdcall EncodeUtf8, eax
        mov     edx, eax

        exec    [__FocusedWindow], TWindow:EventKeyRelease, edx, ecx, ebx
        jmp     .finish

;.........................................................................
; Some property was changed. Check for the Window state
.property_changed:
locals
  .pget __xGetPropertyReq
endl

;options.DebugMode = 1
;  OutputValue "Property changed event: ", [ebx+evPropertyChanged.property], 16, 8
;  OutputValue "_NET_WM_STATE = ", [cNetWMState], 16, 8
;  DebugMsg
;options.DebugMode = 0


        mov     eax, [ebx+evPropertyChanged.property]
        cmp     eax, [atomState]
        jne     .finish

        mov     ecx, [ebx+evPropertyChanged.window]

        mov     [.pget.op], opGetProperty
        mov     [.pget.delete], FALSE
        mov     [.pget.length], sizeof.__xGetPropertyReq/4
        mov     [.pget.window], ecx
        mov     [.pget.property], eax
        mov     [.pget.type], atomATOM
        mov     [.pget.data_ofs], 0
        mov     [.pget.data_len], 4

        lea     eax, [.pget]
        stdcall xSendWithCallback, appConn, eax, WindowStateChanged, ecx
        jmp     .finish


;.........................................................................
; This event is sent from the window manager or other X client application

.clientmessage:

        mov     eax, dword [ebx+evClientMessage.data]   ; data[0]

        cmp     eax, [wmProtocols.atomWMPing]
        jne     .maybe_delete

; _NET_WM_PING protocol handling
locals
  .ping __xSendEventReq
endl
        mov     eax, [appConn.rootID]
        mov     [ebx+evClientMessage.window], eax

        mov     [.ping.op], opSendEvent
        mov     [.ping.propagate], 0
        mov     [.ping.length], sizeof.evClientMessage/4 + sizeof.__xSendEventReq/4
        mov     [.ping.dest], eax
        mov     [.ping.event_mask], maskSubstructureNotify or maskSubstructureRedirect

        stdcall xReqStart, appConn
        lea     eax, [.ping]
        stdcall xReqSend, appConn, eax, sizeof.__xSendEventReq
        stdcall xReqSend, appConn, ebx, sizeof.evClientMessage
        stdcall xReqEnd, appConn

        OutputValue "_NET_WM_PING sequence: ", [appConn.Sequence], 10, -1

        jmp     .finish


.maybe_delete:
        cmp     eax, [wmProtocols.atomWMDelete]
        jne     .maybe_sync

; The window is closed by click on close button or by pressing Alt+F4 or by other WM method
;.close_from_wm:

        exec    esi, TWindow:CloseRequest, cerFromUser
        jmp     .finish

.maybe_sync:
        cmp     eax, [wmProtocols.atomWMSyncRequest]
        jne     .unknown_client_msg

; XSYNC protocol message. It contains a value for the counter that
; to be set when all the repaints of the window are finished.
; See the .expose handling above.

;if defined options.DebugMode & options.DebugMode
;        stdcall NumToStr64, [ebx+evClientMessage.data + 8], [ebx+evClientMessage.data + 12], ntsDec or ntsSigned
;        push    eax
;        stdcall FileWriteString, [STDERR], <txt 13, 10, "_NET_WM_SYNC_REQUEST counter: ">
;        mov     eax, [esp]
;        stdcall FileWriteString, [STDERR], eax
;        stdcall FileWriteString, [STDERR], <txt 13, 10>
;        stdcall StrDel ; from the stack
;end if

; store the value for later XSyncSetCounter
        mov     eax, [ebx+evClientMessage.data + 8]
        mov     edx, [ebx+evClientMessage.data + 12]

        xchg    eax, [esi+TWindow.sync_valueLo]
        xchg    edx, [esi+TWindow.sync_valueHi]

;if defined options.DebugMode & options.DebugMode
;        test    eax, eax
;        jnz     .err_prev
;
;        test    edx, edx
;        jz      .finish
;
;.err_prev:
;        OutputValue "ERROR! Previous value not set to the counter: ", eax, 10, -1
;end if
        jmp     .finish

.unknown_client_msg:
        jmp     .finish

;.........................................................................
; Focus handling events.

.focusin:
        call    .hide_menu

        istype  esi, TForm
        jne     @f
        mov     [__ActiveForm], esi
@@:
        stdcall __SetIntFocused, esi
        jmp     .finish


.focusout:
        call    .hide_menu

        stdcall __SetIntFocused, 0

        istype  esi, TForm
        jne     .finish

        mov     [__ActiveForm], 0
        jmp     .finish

.hideall:
        set     eax, TMenu:Visible, FALSE

.hide_menu:
        xor     eax, eax
        xchg    eax, [__ActiveMenu]
        test    eax, eax
        jnz     .hideall
        retn


.sel_owner_changed:
        DebugMsg "SelectionOwnerChanged event!"

        cmp     [ebx+evFixSelectionNotify.subtype], evFixSetSelectionOwner
        jne     .notprocessed

        mov     eax, [ebx+evFixSelectionNotify.owner]
        cmp     eax, [__idClipboardWindow]
        je      .finish                         ; we already have this selection.

locals
  .conv __xConvertSelectionReq
endl
        mov     eax, [atomClipboard]
        cmp     [ebx+evFixSelectionNotify.selection], eax
        jne     .finish                        ; we are working only with Clipboard selection.

        mov     ebx, [__idClipboardWindow]
        mov     ecx, [atomTargets]

        mov     [.conv.op], opConvertSelection
        mov     [.conv.length], sizeof.__xConvertSelectionReq/4
        mov     [.conv.requestor], ebx
        mov     [.conv.selection], eax
        mov     [.conv.target], ecx
        mov     [.conv.property], atomCUT_BUFFER0  ; reuse predefined atoms!
        and     [.conv.time], 0

        lea     eax, [.conv]
        stdcall xSend, appConn, eax

        jmp     .finish


.sel_notify_event:
        DebugMsg "SelectionNotify event!"

locals
  .getprop __xGetPropertyReq
endl

        cmp     [ebx+evSelectionNotify.property], 0    ; not converted.
        je      .empty

        mov     [.getprop.op], opGetProperty
        mov     [.getprop.delete], TRUE
        mov     [.getprop.length], sizeof.__xGetPropertyReq/4

        mov     eax, [ebx+evSelectionNotify.requestor]
        mov     edx, [ebx+evSelectionNotify.property]
        mov     ecx, [ebx+evSelectionNotify.target]
        mov     [.getprop.window], eax
        mov     [.getprop.property], edx
        mov     [.getprop.type], 0              ; ecx
        mov     [.getprop.data_ofs], 0
        mov     [.getprop.data_len], $7fffffff

        lea     eax, [.getprop]
        stdcall xSendWithCallback, appConn, eax, GetClipboardCallback, [ebx+evSelectionNotify.target]
        jmp     .finish

.empty:
        xor     eax, eax
        xchg    eax, [pClipboard]
        stdcall __ClipboardFree, eax
        jmp     .finish

;
; For proper handling of the SelectionRequest event, carefully read the following article:
;
; [Peer-to-Peer Communication by Means of Selections] https://tronche.com/gui/x/icccm/sec-2.html
;

.sel_req_event:

locals
  .chprop   __xChangePropertyReq
  .targets  rd 3

  .selntf    __xSendEventReq
  .selntfev  evSelectionNotify
endl

        DebugMsg "SelectionRequest event!"

        OutputValue "Selection request selection: ", [ebx+evSelectionRequest.selection], 16, 8
        OutputValue "                      owner: ", [ebx+evSelectionRequest.owner], 16, 8
        OutputValue "                  requestor: ", [ebx+evSelectionRequest.requestor], 16, 8
        OutputValue "                     target: ", [ebx+evSelectionRequest.target], 10, -1
        OutputValue "                   property: ", [ebx+evSelectionRequest.property], 10, -1

        mov     eax, [ebx+evSelectionRequest.requestor]
        mov     edx, [ebx+evSelectionRequest.selection]

        mov     [.selntf.op], opSendEvent
        mov     [.selntf.propagate], FALSE
        mov     [.selntf.length], (sizeof.__xSendEventReq + sizeof.evSelectionNotify)/4
        mov     [.selntf.dest], eax
        mov     [.selntf.event_mask], 0

        mov     [.selntfev.event], SelectionNotify
        mov     [.selntfev.requestor], eax
        mov     [.selntfev.time], 0
        mov     [.selntfev.selection], edx

        mov     [.chprop.op], opChangeProperty
        mov     [.chprop.mode], PropModeReplace
        mov     [.chprop.wid], eax

        cmp     edx, [atomClipboard]
        jne     .refuse

        mov     eax, [ebx+evSelectionRequest.property]
        mov     ecx, [ebx+evSelectionRequest.target]
        test    eax, eax
        cmovz   eax, ecx        ; obsolete clients support.

        mov     [.selntfev.property], eax
        mov     [.selntfev.target], ecx

        mov     [.chprop.prop], eax

        cmp     ecx, [atomTargets]
        je      .send_targets

        cmp     ecx, [atomStringUtf8]
        je      .target_ok
        cmp     ecx, atomSTRING
        jne     .refuse

.target_ok:
        mov     [.chprop.type], ecx
        mov     [.chprop.format], 8

        mov     ebx, [pClipboard]
        stdcall __ClipboardLock, ebx

        mov     eax, [ebx+TClipboard.Length]
        mov     [.chprop.datalen], eax

        lea     ecx, [eax+3]
        and     ecx, $fffffffc  ; align to 4 bytes

        mov     eax, ecx
        shr     eax, 2
        add     eax, sizeof.__xChangePropertyReq/4
        mov     [.chprop.length], ax

; sent opChangeProperty request

        stdcall xReqStart, appConn

        lea     eax, [.chprop]
        stdcall xReqSend, appConn, eax, sizeof.__xChangePropertyReq

        lea     eax, [ebx+TClipboard.data]
        stdcall xReqSend, appConn, eax, ecx

        stdcall xReqEnd, appConn

        stdcall __ClipboardUnlock, ebx
        jmp     .send_event

.refuse:
        mov     [.selntfev.property], 0         ; None

; send SelectionNotify event to the requestor.
.send_event:
        lea     eax, [.selntf]
        stdcall xSend, appConn, eax
        jmp     .finish

.send_targets:
        mov     [.chprop.type], atomATOM
        mov     [.chprop.format], 32
        mov     [.chprop.length], 3 + sizeof.__xChangePropertyReq/4
        mov     [.chprop.datalen], 3    ; in format units.

        mov     eax, [atomTargets]
        mov     [.targets], eax
        mov     [.targets+4], atomSTRING
        mov     eax, [atomStringUtf8]
        mov     [.targets+8], eax

        lea     eax, [.chprop]
        stdcall xSend, appConn, eax
        jmp     .send_event


;.........................................................................

.jump_table dw  0, 0                                                    ; event 0
            dw  0, 0                                                    ; event 1
            dw  .key_press - .base, evKeyPress.window                   ; KeyPress = 2
            dw  .key_release - .base, evKeyRelease.window               ; KeyRelease = 3
            dw  .mouse_btn_press - .base, evButtonPress.window          ; ButtonPress = 4
            dw  .mouse_btn_release - .base, evButtonRelease.window      ; ButtonRelease = 5
            dw  .mousemove - .base, evMotionNotify.window               ; MotionNotify = 6
            dw  0, 0                                                    ; EnterNotify = 7
            dw  .mouseleave - .base, evLeaveNotify.window               ; LeaveNotify = 8
            dw  .focusin - .base, evFocusIn.window                      ; FocusIn = 9
            dw  .focusout - .base, evFocusOut.window                    ; FocusOut = 10
            dw  0, 0                                                    ; KeymapNotify = 11
            dw  .expose - .base, evExpose.window                        ; Expose = 12
            dw  0, 0                                                    ; GraphicsExpose = 13
            dw  0, 0                                                    ; NoExpose = 14
            dw  0, 0                                                    ; VisibilityNotify = 15
            dw  0, 0                                                    ; CreateNotify = 16
            dw  .destroy - .base, evDestroyNotify.window                ; DestroyNotify = 17
            dw  0, 0                                                    ; UnmapNotify = 18
            dw  0, 0                                                    ; MapNotify = 19
            dw  0, 0                                                    ; MapRequest = 20
            dw  0, 0                                                    ; ReparentNotify = 21
            dw  .moveresize - .base, evConfigureNotify.window           ; ConfigureNotify = 22
            dw  0, 0                                                    ; ConfigureRequest = 23
            dw  0, 0                                                    ; GravityNotify = 24
            dw  0, 0                                                    ; ResizeRequest = 25
            dw  0, 0                                                    ; CirculateNotify = 26
            dw  0, 0                                                    ; CirculateRequest = 27
            dw  .property_changed - .base, evPropertyChanged.window     ; PropertyNotify = 28
            dw  0, 0                                                    ; SelectionClear = 29
            dw  0, 0                                                    ; SelectionRequest = 30
            dw  0, 0                                                    ; SelectionNotify = 31
            dw  0, 0                                                    ; ColormapNotify = 32
            dw  .clientmessage - .base, evClientMessage.window          ; ClientMessage = 33
            dw  0, 0                                                    ; MappingNotify = 34
endp





proc __IndexKeymap as xCallbackProc
.size dd ?
begin
        DebugMsg "Keymap callback procedure."

        mov     ebx, [.pReply]

        lea     esi, [ebx + sizeof.__xXkbGetMapRep]   ; the start of the keymap

        mov     eax, [ebx + __xXkbGetMapRep.length]
        mov     ecx, eax
        lea     eax, [4*eax + 256*4]

        mov     [.size], eax

        stdcall GetMem, eax
        jc      .memory_error

        push    eax

        lea     edi, [eax + 256*4]        ; the keymap in the allocated buffer.
        rep movsd

        mov     edi, eax               ; the start of the index
        lea     esi, [eax + 256*4]       ; the start of the copied keymap

        movzx   ecx, [ebx + __xXkbGetMapRep.minKeyCode]
        movzx   edx, [ebx + __xXkbGetMapRep.maxKeyCode]
        sub     edx, ecx  ; the total count of keycodes in the map - 1

        xor     eax, eax
        rep stosd         ; fill the first ECX index items with 0

        mov     ecx, edx
        lea     esi, [esi + sizeof.__xXkbGetMapRep2]    ; the remaining header of the reply. we don't need it.

.loop:
        dec     ecx
        js      .end_loop

        mov     [edi], esi
        add     edi, 4

        movzx   eax, [esi + xkbKeysymMapItem.nSyms]
        lea     esi, [esi + 4*eax + sizeof.xkbKeysymMapItem]
        jmp     .loop

.end_loop:
        pop     eax
        xchg    eax, [appConn.pKeymap]
        stdcall FreeMem, eax

        return

.memory_error:
        int3
        return
endp




proc GetClipboardCallback as xCallbackProc
  .conv __xConvertSelectionReq
begin
        DebugMsg "GetClipboardCallback"

        mov     edi, [.pReply]

        mov     eax, [atomTargets]
        cmp     eax, [.lparam]
        je      .get_targets

        xor     eax, eax
        movzx   edx, [edi+__xGetPropertyRep.format]
        shr     edx, 3  ; from bits to bytes, size of the data elements.
        jz      .finish

        lea     eax, [edi+__xGetPropertyRep.data]
        mov     ecx, [edi+__xGetPropertyRep.datalen]
        imul    ecx, edx

        stdcall __ClipboardFromMem, eax, ecx, clipboardString
        jnc     .finish

        xor     eax, eax

.finish:
        xchg    eax, [pClipboard]
        stdcall __ClipboardFree, eax
        return

.get_targets:
        lea     esi, [edi+__xGetPropertyRep.data]
        mov     ecx, [edi+__xGetPropertyRep.datalen]
        xor     ebx, ebx

.loop:
        dec     ecx
        js      .end_loop
        lodsd

        cmp     eax, [atomStringUtf8]
        cmove   ebx, eax

        test    ebx, ebx
        jnz     .loop

        cmp     eax, atomSTRING
        cmove   ebx, eax
        jmp     .loop

.end_loop:
        test    ebx, ebx
        jnz     .get_string

; Clear the clipboard. There is no compatible target.
        xor     eax, eax
        jmp     .finish

.get_string:
        mov     eax, [__idClipboardWindow]
        mov     ecx, [atomClipboard]

        mov     [.conv.op], opConvertSelection
        mov     [.conv.length], sizeof.__xConvertSelectionReq/4
        mov     [.conv.requestor], eax
        mov     [.conv.selection], ecx
        mov     [.conv.target], ebx
        mov     [.conv.property], atomCUT_BUFFER0  ; reuse predefined atoms!
        and     [.conv.time], 0

        lea     eax, [.conv]
        stdcall xSend, appConn, eax
.exit:
        return
endp



proc WindowStateChanged as xCallbackProc
begin
        mov     esi, [.pReply]

        DebugMsg "Window state changed"

        stdcall xGetObj, appConn, [.lparam]
        jc      .finish

        test    eax, eax
        jz      .finish

        mov     edi, eax

        mov     ecx, [esi+__xGetPropertyRep.datalen]
        xor     ebx, ebx        ; the new window state

.loop:
        dec     ecx
        js      .endloop

        mov     eax, [esi+__xGetPropertyRep.data+4*ecx]
        cmp     eax, [atomStateMaximizedVert]
        jne     .not_vert
        or      ebx, wstMaximizedVert
        jmp     .loop

.not_vert:
        cmp     eax, [atomStateMaximizedHorz]
        jne     .not_horz
        or      ebx, wstMaximizedHorz
        jmp     .loop

.not_horz:
        cmp     eax, [atomStateHidden]
        jne     .loop
        or      ebx, wstMinimized
        jmp     .loop

.endloop:
        mov    [edi+TWindow._window_state], ebx

.finish:
        return
endp

Added freshlib/gui/Linux/__encodings/BuildKeysymTable.fpr.

cannot compute difference between binary files

Added freshlib/gui/Linux/__encodings/build.asm.











































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType console

options.DebugMode = 0

include "%lib%/freshlib.asm"

options.DebugMode = 1

; include your includes here.

start:
        InitializeAll

        mov     ecx, 65536/2
        mov     edi, Table
        xor     eax, eax

        mov     [TableLen], eax
        rep stosd

        mov     [MaxKeycode], eax
        dec     eax
        mov     [MinKeycode], eax

        stdcall GetCmdArguments
        jc      .error_arg

        mov     edi, eax

.check_params:
        cmp     [edi+TArray.count], 2
        jb      .error_arg

        stdcall FileOpen, [edi+TArray.array+4]      ; "keysyms_encoding.txt"
        jc      .file_not_found

        mov     [hSourceFile], eax

.line_loop:
        stdcall FileReadLine, [hSourceFile]
        jc      .error_read

        test    eax, eax
        jz      .end_of_file

        stdcall ProcessOneLine, eax
        stdcall StrDel, eax

        jmp     .line_loop


.end_of_file:
        stdcall FileClose, ebx

        cmp     [edi+TArray.count], 3
        jb      .default_file

        mov     eax, [edi+TArray.array+8]
        jmp     .save

.default_file:
        mov     eax, cDefaultOutput

.save:
        stdcall SaveSimpleTable, eax

;        mov     ecx, [TableLen]
;        inc     ecx
;        shl     ecx, 1
;        OutputValue "Table length: ", ecx, 10, -1
;        OutputMemoryByte Table, ecx
;
;        stdcall SaveBinaryFile, eax, Table, ecx
        stdcall ListFree, edi, StrDel
        jmp     .finish

cDefaultOutput text 'table.bin'


.error_read:
        stdcall FileWriteString, [STDERR], <'Source file read error.', 13, 10>
        jmp     .end_of_file


.file_not_found:
        stdcall FileWriteString, [STDERR], <'Source file not found.', 13, 10>
        jmp     .finish

.error_arg:
        stdcall FileWriteString, [STDERR], <'Use: build.exe SOURCE DESTINATION', 13, 10>


.finish:
        FinalizeAll
        stdcall TerminateAll, 0



proc ProcessOneLine, .hString
begin
        pushad

        mov     eax, [.hString]
        stdcall StrClipSpacesR, eax
        stdcall StrClipSpacesL, eax
        stdcall StrCleanDupSpaces, eax
        stdcall StrLCase, eax

;        push    eax
;        stdcall FileWriteString, [STDOUT], [.hString]
;        stdcall FileWriteString, [STDOUT], cCRLF
;        pop     eax

        stdcall StrPtr, eax
        mov     esi, eax

        cmp     byte [esi], '#'
        je      .finish         ; comment line

        mov     edi, esi

.loop1:
        lodsb
        cmp     al, ' '
        ja      .loop1

        test    al, al
        jz      .finish         ; the string is invalid, skip it.

        dec     esi

        mov     eax, esi
        sub     eax, edi
        stdcall StrExtract, edi, 0, eax
        push    eax
        stdcall StrToNumEx, eax
        stdcall StrDel ; from the stack
        jc      .finish                 ; invalid number

        mov     ebx, eax                ; remember for now.

;        OutputValue "Keysym: ", ebx, 16, 8

.loop2:
        lodsb
        test    al, al
        jz      .finish                 ; there is no second number
        cmp     al, ' '
        jbe     .loop2

        dec     esi
        mov     edi, esi

.loop3:
        lodsb
        cmp     al, ' '
        ja      .loop3

        dec     esi
        mov     eax, esi
        sub     eax, edi
        stdcall StrExtract, edi, 0, eax
        push    eax
        stdcall StrToNumEx, eax
        stdcall StrDel ; from the stack
        jc      .finish                  ; invalid second number - undefined character.

;        OutputValue "Unicode: ", eax, 16, 8

        cmp     eax, $ffff
        ja      .finish                 ; too big unicode letter. Should be fixed maybe, but the tables are 16 bit.

;        stdcall AddToHashTable, ebx, eax, 7
         stdcall AddToSimpleTable, ebx, eax

.finish:
        popad
        return
endp



proc AddToSimpleTable, .keysym, .unicode
begin
        pushad

        movzx   eax, byte [.keysym]
        movzx   edx, word [.unicode]

        mov     word [Table+2*eax], dx

        mov     ebx, [MinKeycode]
        mov     ecx, [MaxKeycode]

        cmp     ebx, eax
        cmova   ebx, eax
        cmp     ecx, eax
        cmovb   ecx, eax

        mov     [MinKeycode], ebx
        mov     [MaxKeycode], ecx

        popad
        return
endp


proc SaveSimpleTable, .hFilename
begin
        pushad

        mov     ebx, [MinKeycode]
        mov     ecx, [MaxKeycode]
        sub     ecx, ebx

        lea     edi, [Table+2*ebx-2]
        mov     [edi], bl
        mov     [edi+1], cl

;        sub     ecx, ebx
        add     ecx, 2
        add     ecx, ecx

        OutputValue "Table length: ", ecx, 10, -1
        OutputMemoryByte edi, ecx

        stdcall SaveBinaryFile, [.hFilename], edi, ecx

        popad
        return
endp



proc AddToHashTable, .keysym, .unicode, .bits
begin
        pushad

        xor     ebx, ebx
        mov     ecx, [.bits]

.loop:
        dec     ecx
        js      .end_loop

        xor     eax, eax
        bt      [.keysym], ecx
        adc     eax, eax

        movzx   edx, byte [Table+2*ebx+eax]
        test    edx, edx
        jnz     .offset_ok

        inc     [TableLen]
        mov     edx, [TableLen]
        sub     edx, ebx
        mov     byte [Table+2*ebx+eax], dl

        test    dh, dh
        jz      .offset_ok

        OutputValue "Keysym: ", [.keysym], 16, 8
        OutputValue "Bit:", ecx, 10, -1
        OutputValue "Offset: ", edx, 10, -1

.offset_ok:
        add     ebx, edx
        jmp     .loop

.end_loop:
        mov     eax, [.unicode]
        mov     word [Table+2*ebx], ax

        popad
        return
endp








uglobal
  hSourceFile dd ?
  TableLen    dd ?
  MinKeycode  dd ?
  MaxKeycode  dd ?

  Table       rw 65536
endg

Added freshlib/gui/Linux/__encodings/build.sh.

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh

./build ./keysyms1.txt ./keysyms1.tbl
./build ./keysyms2.txt ./keysyms2.tbl
./build ./keysyms3.txt ./keysyms3.tbl
./build ./keysyms4.txt ./keysyms4.tbl
./build ./keysyms5.txt ./keysyms5.tbl
./build ./keysyms6.txt ./keysyms6.tbl
./build ./keysyms7.txt ./keysyms7.tbl
./build ./keysyms10.txt ./keysyms10.tbl
./build ./keysyms12.txt ./keysyms12.tbl
./build ./keysyms13.txt ./keysyms13.tbl

Added freshlib/gui/Linux/__encodings/keysyms1.tbl.

cannot compute difference between binary files

Added freshlib/gui/Linux/__encodings/keysyms1.txt.



















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
0x01A1  0x0104          #LATIN CAPITAL LETTER A WITH OGONEK
0x01A2  0x02D8          #BREVE
0x01A3  0x0141          #LATIN CAPITAL LETTER L WITH STROKE
0x01A5  0x013D          #LATIN CAPITAL LETTER L WITH CARON
0x01A6  0x015A          #LATIN CAPITAL LETTER S WITH ACUTE
0x01A9  0x0160          #LATIN CAPITAL LETTER S WITH CARON
0x01AA  0x015E          #LATIN CAPITAL LETTER S WITH CEDILLA
0x01AB  0x0164          #LATIN CAPITAL LETTER T WITH CARON
0x01AC  0x0179          #LATIN CAPITAL LETTER Z WITH ACUTE
0x01AE  0x017D          #LATIN CAPITAL LETTER Z WITH CARON
0x01AF  0x017B          #LATIN CAPITAL LETTER Z WITH DOT ABOVE
0x01B1  0x0105          #LATIN SMALL LETTER A WITH OGONEK
0x01B2  0x02DB          #OGONEK
0x01B3  0x0142          #LATIN SMALL LETTER L WITH STROKE
0x01B5  0x013E          #LATIN SMALL LETTER L WITH CARON
0x01B6  0x015B          #LATIN SMALL LETTER S WITH ACUTE
0x01B7  0x02C7          #CARON
0x01B9  0x0161          #LATIN SMALL LETTER S WITH CARON
0x01BA  0x015F          #LATIN SMALL LETTER S WITH CEDILLA
0x01BB  0x0165          #LATIN SMALL LETTER T WITH CARON
0x01BC  0x017A          #LATIN SMALL LETTER Z WITH ACUTE
0x01BD  0x02DD          #DOUBLE ACUTE ACCENT
0x01BE  0x017E          #LATIN SMALL LETTER Z WITH CARON
0x01BF  0x017C          #LATIN SMALL LETTER Z WITH DOT ABOVE
0x01C0  0x0154          #LATIN CAPITAL LETTER R WITH ACUTE
0x01C3  0x0102          #LATIN CAPITAL LETTER A WITH BREVE
0x01C5  0x0139          #LATIN CAPITAL LETTER L WITH ACUTE
0x01C6  0x0106          #LATIN CAPITAL LETTER C WITH ACUTE
0x01C8  0x010C          #LATIN CAPITAL LETTER C WITH CARON
0x01CA  0x0118          #LATIN CAPITAL LETTER E WITH OGONEK
0x01CC  0x011A          #LATIN CAPITAL LETTER E WITH CARON
0x01CF  0x010E          #LATIN CAPITAL LETTER D WITH CARON
0x01D0  0x0110          #LATIN CAPITAL LETTER D WITH STROKE
0x01D1  0x0143          #LATIN CAPITAL LETTER N WITH ACUTE
0x01D2  0x0147          #LATIN CAPITAL LETTER N WITH CARON
0x01D5  0x0150          #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
0x01D8  0x0158          #LATIN CAPITAL LETTER R WITH CARON
0x01D9  0x016E          #LATIN CAPITAL LETTER U WITH RING ABOVE
0x01DB  0x0170          #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
0x01DE  0x0162          #LATIN CAPITAL LETTER T WITH CEDILLA
0x01E0  0x0155          #LATIN SMALL LETTER R WITH ACUTE
0x01E3  0x0103          #LATIN SMALL LETTER A WITH BREVE
0x01E5  0x013A          #LATIN SMALL LETTER L WITH ACUTE
0x01E6  0x0107          #LATIN SMALL LETTER C WITH ACUTE
0x01E8  0x010D          #LATIN SMALL LETTER C WITH CARON
0x01EA  0x0119          #LATIN SMALL LETTER E WITH OGONEK
0x01EC  0x011B          #LATIN SMALL LETTER E WITH CARON
0x01EF  0x010F          #LATIN SMALL LETTER D WITH CARON
0x01F0  0x0111          #LATIN SMALL LETTER D WITH STROKE
0x01F1  0x0144          #LATIN SMALL LETTER N WITH ACUTE
0x01F2  0x0148          #LATIN SMALL LETTER N WITH CARON
0x01F5  0x0151          #LATIN SMALL LETTER O WITH DOUBLE ACUTE
0x01F8  0x0159          #LATIN SMALL LETTER R WITH CARON
0x01F9  0x016F          #LATIN SMALL LETTER U WITH RING ABOVE
0x01FB  0x0171          #LATIN SMALL LETTER U WITH DOUBLE ACUTE
0x01FE  0x0163          #LATIN SMALL LETTER T WITH CEDILLA
0x01FF  0x02D9          #DOT ABOVE

Added freshlib/gui/Linux/__encodings/keysyms10.tbl.

cannot compute difference between binary files

Added freshlib/gui/Linux/__encodings/keysyms10.txt.





















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
0x0AA1  0x2003      #EM SPACE        Publish
0x0AA2  0x2002      #EN SPACE        Publish
0x0AA3  0x2004      #3/EM SPACE      Publish
0x0AA4  0x2005      #4/EM SPACE      Publish
0x0AA5  0x2007      #DIGIT SPACE     Publish
0x0AA6  0x2008      #PUNCTUATION SPACE       Publish
0x0AA7  0x2009      #THIN SPACE      Publish
0x0AA8  0x200A      #HAIR SPACE      Publish
0x0AA9  0x2014      #EM DASH Publish
0x0AAA  0x2013      #EN DASH Publish
0x0AAC  0x2423      #SIGNIFICANT BLANK SYMBOL        Publish
0x0AAE  0x2026      #ELLIPSIS        Publish
0x0AAF  0x2025      #DOUBLE BASELINE DOT     Publish
0x0AB0  0x2153      #VULGAR FRACTION ONE THIRD       Publish
0x0AB1  0x2154      #VULGAR FRACTION TWO THIRDS      Publish
0x0AB2  0x2155      #VULGAR FRACTION ONE FIFTH       Publish
0x0AB3  0x2156      #VULGAR FRACTION TWO FIFTHS      Publish
0x0AB4  0x2157      #VULGAR FRACTION THREE FIFTHS    Publish
0x0AB5  0x2158      #VULGAR FRACTION FOUR FIFTHS     Publish
0x0AB6  0x2159      #VULGAR FRACTION ONE SIXTH       Publish
0x0AB7  0x215A      #VULGAR FRACTION FIVE SIXTHS     Publish
0x0AB8  0x2105      #CARE OF Publish
0x0ABB  0x2012      #FIGURE DASH     Publish
0x0ABC  0x3008      #LEFT ANGLE BRACKET      Publish
0x0ABD  0x002e      #DECIMAL POINT   Publish
0x0ABE  0x3009      #RIGHT ANGLE BRACKET     Publish
0x0AC3  0x215B      #VULGAR FRACTION ONE EIGHTH      Publish
0x0AC4  0x215C      #VULGAR FRACTION THREE EIGHTHS   Publish
0x0AC5  0x215D      #VULGAR FRACTION FIVE EIGHTHS    Publish
0x0AC6  0x215E      #VULGAR FRACTION SEVEN EIGHTHS   Publish
0x0AC9  0x2122      #TRADEMARK SIGN  Publish
0x0AD0  0x2018      #LEFT SINGLE QUOTATION MARK      Publish
0x0AD1  0x2019      #RIGHT SINGLE QUOTATION MARK     Publish
0x0AD2  0x201C      #LEFT DOUBLE QUOTATION MARK      Publish
0x0AD3  0x201D      #RIGHT DOUBLE QUOTATION MARK     Publish
0x0AD4  0x211E      #PRESCRIPTION, TAKE, RECIPE      Publish
0x0AD5  0x2030      #PER MILLE SIGN  Publish
0x0AD6  0x2032      #MINUTES Publish
0x0AD7  0x2033      #SECONDS Publish
0x0AD9  0x271D      #LATIN CROSS     Publish
0x0AEC  0x2663      #CLUB    Publish
0x0AED  0x2666      #DIAMOND Publish
0x0AEE  0x2665      #HEART   Publish
0x0AF0  0x2720      #MALTESE CROSS   Publish
0x0AF1  0x2020      #DAGGER  Publish
0x0AF2  0x2021      #DOUBLE DAGGER   Publish
0x0AF3  0x2713      #CHECK MARK, TICK        Publish
0x0AF4  0x2717      #BALLOT CROSS    Publish
0x0AF5  0x266F      #MUSICAL SHARP   Publish
0x0AF6  0x266D      #MUSICAL FLAT    Publish
0x0AF7  0x2642      #MALE SYMBOL     Publish
0x0AF8  0x2640      #FEMALE SYMBOL   Publish
0x0AF9  0x260E      #TELEPHONE SYMBOL        Publish
0x0AFA  0x2315      #TELEPHONE RECORDER SYMBOL       Publish
0x0AFB  0x2117      #PHONOGRAPH COPYRIGHT SIGN       Publish
0x0AFC  0x2038      #CARET   Publish
0x0AFD  0x201A      #SINGLE LOW QUOTATION MARK       Publish
0x0AFE  0x201E      #DOUBLE LOW QUOTATION MARK       Publish

Added freshlib/gui/Linux/__encodings/keysyms12.tbl.



>
1
ß ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéê

Added freshlib/gui/Linux/__encodings/keysyms12.txt.

























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
0x0CDF  0x2017          #DOUBLE LOW LINE
0x0CE0  0x05D0          #HEBREW LETTER ALEF
0x0CE1  0x05D1          #HEBREW LETTER BET
0x0CE2  0x05D2          #HEBREW LETTER GIMEL
0x0CE3  0x05D3          #HEBREW LETTER DALET
0x0CE4  0x05D4          #HEBREW LETTER HE
0x0CE5  0x05D5          #HEBREW LETTER VAV
0x0CE6  0x05D6          #HEBREW LETTER ZAYIN
0x0CE7  0x05D7          #HEBREW LETTER HET
0x0CE8  0x05D8          #HEBREW LETTER TET
0x0CE9  0x05D9          #HEBREW LETTER YOD
0x0CEA  0x05DA          #HEBREW LETTER FINAL KAF
0x0CEB  0x05DB          #HEBREW LETTER KAF
0x0CEC  0x05DC          #HEBREW LETTER LAMED
0x0CED  0x05DD          #HEBREW LETTER FINAL MEM
0x0CEE  0x05DE          #HEBREW LETTER MEM
0x0CEF  0x05DF          #HEBREW LETTER FINAL NUN
0x0CF0  0x05E0          #HEBREW LETTER NUN
0x0CF1  0x05E1          #HEBREW LETTER SAMEKH
0x0CF2  0x05E2          #HEBREW LETTER AYIN
0x0CF3  0x05E3          #HEBREW LETTER FINAL PE
0x0CF4  0x05E4          #HEBREW LETTER PE
0x0CF5  0x05E5          #HEBREW LETTER FINAL TSADI
0x0CF6  0x05E6          #HEBREW LETTER TSADI
0x0CF7  0x05E7          #HEBREW LETTER QOF
0x0CF8  0x05E8          #HEBREW LETTER RESH
0x0CF9  0x05E9          #HEBREW LETTER SHIN
0x0CFA  0x05EA          #HEBREW LETTER TAV

Added freshlib/gui/Linux/__encodings/keysyms13.tbl.

cannot compute difference between binary files

Added freshlib/gui/Linux/__encodings/keysyms13.txt.







































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
0x0DA1  0x0E01          #THAI CHARACTER KO KAI
0x0DA2  0x0E02          #THAI CHARACTER KHO KHAI
0x0DA3  0x0E03          #THAI CHARACTER KHO KHUAT
0x0DA4  0x0E04          #THAI CHARACTER KHO KHWAI
0x0DA5  0x0E05          #THAI CHARACTER KHO KHON
0x0DA6  0x0E06          #THAI CHARACTER KHO RAKHANG
0x0DA7  0x0E07          #THAI CHARACTER NGO NGU
0x0DA8  0x0E08          #THAI CHARACTER CHO CHAN
0x0DA9  0x0E09          #THAI CHARACTER CHO CHING
0x0DAA  0x0E0A          #THAI CHARACTER CHO CHANG
0x0DAB  0x0E0B          #THAI CHARACTER SO SO
0x0DAC  0x0E0C          #THAI CHARACTER CHO CHOE
0x0DAD  0x0E0D          #THAI CHARACTER YO YING
0x0DAE  0x0E0E          #THAI CHARACTER DO CHADA
0x0DAF  0x0E0F          #THAI CHARACTER TO PATAK
0x0DB0  0x0E10          #THAI CHARACTER THO THAN
0x0DB1  0x0E11          #THAI CHARACTER THO NANGMONTHO
0x0DB2  0x0E12          #THAI CHARACTER THO PHUTHAO
0x0DB3  0x0E13          #THAI CHARACTER NO NEN
0x0DB4  0x0E14          #THAI CHARACTER DO DEK
0x0DB5  0x0E15          #THAI CHARACTER TO TAO
0x0DB6  0x0E16          #THAI CHARACTER THO THUNG
0x0DB7  0x0E17          #THAI CHARACTER THO THAHAN
0x0DB8  0x0E18          #THAI CHARACTER THO THONG
0x0DB9  0x0E19          #THAI CHARACTER NO NU
0x0DBA  0x0E1A          #THAI CHARACTER BO BAIMAI
0x0DBB  0x0E1B          #THAI CHARACTER PO PLA
0x0DBC  0x0E1C          #THAI CHARACTER PHO PHUNG
0x0DBD  0x0E1D          #THAI CHARACTER FO FA
0x0DBE  0x0E1E          #THAI CHARACTER PHO PHAN
0x0DBF  0x0E1F          #THAI CHARACTER FO FAN
0x0DC0  0x0E20          #THAI CHARACTER PHO SAMPHAO
0x0DC1  0x0E21          #THAI CHARACTER MO MA
0x0DC2  0x0E22          #THAI CHARACTER YO YAK
0x0DC3  0x0E23          #THAI CHARACTER RO RUA
0x0DC4  0x0E24          #THAI CHARACTER RU
0x0DC5  0x0E25          #THAI CHARACTER LO LING
0x0DC6  0x0E26          #THAI CHARACTER LU
0x0DC7  0x0E27          #THAI CHARACTER WO WAEN
0x0DC8  0x0E28          #THAI CHARACTER SO SALA
0x0DC9  0x0E29          #THAI CHARACTER SO RUSI
0x0DCA  0x0E2A          #THAI CHARACTER SO SUA
0x0DCB  0x0E2B          #THAI CHARACTER HO HIP
0x0DCC  0x0E2C          #THAI CHARACTER LO CHULA
0x0DCD  0x0E2D          #THAI CHARACTER O ANG
0x0DCE  0x0E2E          #THAI CHARACTER HO NOKHUK
0x0DCF  0x0E2F          #THAI CHARACTER PAIYANNOI
0x0DD0  0x0E30          #THAI CHARACTER SARA A
0x0DD1  0x0E31          #THAI CHARACTER MAI HAN-AKAT
0x0DD2  0x0E32          #THAI CHARACTER SARA AA
0x0DD3  0x0E33          #THAI CHARACTER SARA AM
0x0DD4  0x0E34          #THAI CHARACTER SARA I
0x0DD5  0x0E35          #THAI CHARACTER SARA II
0x0DD6  0x0E36          #THAI CHARACTER SARA UE
0x0DD7  0x0E37          #THAI CHARACTER SARA UEE
0x0DD8  0x0E38          #THAI CHARACTER SARA U
0x0DD9  0x0E39          #THAI CHARACTER SARA UU
0x0DDA  0x0E3A          #THAI CHARACTER PHINTHU
0x0DDF  0x0E3F          #THAI CURRENCY SYMBOL BAHT
0x0DE0  0x0E40          #THAI CHARACTER SARA E
0x0DE1  0x0E41          #THAI CHARACTER SARA AE
0x0DE2  0x0E42          #THAI CHARACTER SARA O
0x0DE3  0x0E43          #THAI CHARACTER SARA AI MAIMUAN
0x0DE4  0x0E44          #THAI CHARACTER SARA AI MAIMALAI
0x0DE5  0x0E45          #THAI CHARACTER LAKKHANGYAO
0x0DE6  0x0E46          #THAI CHARACTER MAIYAMOK
0x0DE7  0x0E47          #THAI CHARACTER MAITAIKHU
0x0DE8  0x0E48          #THAI CHARACTER MAI EK
0x0DE9  0x0E49          #THAI CHARACTER MAI THO
0x0DEA  0x0E4A          #THAI CHARACTER MAI TRI
0x0DEB  0x0E4B          #THAI CHARACTER MAI CHATTAWA
0x0DEC  0x0E4C          #THAI CHARACTER THANTHAKHAT
0x0DED  0x0E4D          #THAI CHARACTER NIKHAHIT
0x0DF0  0x0E50          #THAI DIGIT ZERO
0x0DF1  0x0E51          #THAI DIGIT ONE
0x0DF2  0x0E52          #THAI DIGIT TWO
0x0DF3  0x0E53          #THAI DIGIT THREE
0x0DF4  0x0E54          #THAI DIGIT FOUR
0x0DF5  0x0E55          #THAI DIGIT FIVE
0x0DF6  0x0E56          #THAI DIGIT SIX
0x0DF7  0x0E57          #THAI DIGIT SEVEN
0x0DF8  0x0E58          #THAI DIGIT EIGHT
0x0DF9  0x0E59          #THAI DIGIT NINE

Added freshlib/gui/Linux/__encodings/keysyms2.tbl.

cannot compute difference between binary files

Added freshlib/gui/Linux/__encodings/keysyms2.txt.













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
0x02A1  0x0126          #LATIN CAPITAL LETTER H WITH STROKE
0x02A6  0x0124          #LATIN CAPITAL LETTER H WITH CIRCUMFLEX
0x02A9  0x0130          #LATIN CAPITAL LETTER I WITH DOT ABOVE
0x02AB  0x011E          #LATIN CAPITAL LETTER G WITH BREVE
0x02AC  0x0134          #LATIN CAPITAL LETTER J WITH CIRCUMFLEX
0x02B1  0x0127          #LATIN SMALL LETTER H WITH STROKE
0x02B6  0x0125          #LATIN SMALL LETTER H WITH CIRCUMFLEX
0x02B9  0x0131          #LATIN SMALL LETTER DOTLESS I
0x02BB  0x011F          #LATIN SMALL LETTER G WITH BREVE
0x02BC  0x0135          #LATIN SMALL LETTER J WITH CIRCUMFLEX
0x02C5  0x010A          #LATIN CAPITAL LETTER C WITH DOT ABOVE
0x02C6  0x0108          #LATIN CAPITAL LETTER C WITH CIRCUMFLEX
0x02D5  0x0120          #LATIN CAPITAL LETTER G WITH DOT ABOVE
0x02D8  0x011C          #LATIN CAPITAL LETTER G WITH CIRCUMFLEX
0x02DD  0x016C          #LATIN CAPITAL LETTER U WITH BREVE
0x02DE  0x015C          #LATIN CAPITAL LETTER S WITH CIRCUMFLEX
0x02E5  0x010B          #LATIN SMALL LETTER C WITH DOT ABOVE
0x02E6  0x0109          #LATIN SMALL LETTER C WITH CIRCUMFLEX
0x02F5  0x0121          #LATIN SMALL LETTER G WITH DOT ABOVE
0x02F8  0x011D          #LATIN SMALL LETTER G WITH CIRCUMFLEX
0x02FD  0x016D          #LATIN SMALL LETTER U WITH BREVE
0x02FE  0x015D          #LATIN SMALL LETTER S WITH CIRCUMFLEX

Added freshlib/gui/Linux/__encodings/keysyms3.tbl.

cannot compute difference between binary files

Added freshlib/gui/Linux/__encodings/keysyms3.txt.







































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
0x03A2  0x0138          #LATIN SMALL LETTER KRA
0x03A3  0x0156          #LATIN CAPITAL LETTER R WITH CEDILLA
0x03A5  0x0128          #LATIN CAPITAL LETTER I WITH TILDE
0x03A6  0x013B          #LATIN CAPITAL LETTER L WITH CEDILLA
0x03AA  0x0112          #LATIN CAPITAL LETTER E WITH MACRON
0x03AB  0x0122          #LATIN CAPITAL LETTER G WITH CEDILLA
0x03AC  0x0166          #LATIN CAPITAL LETTER T WITH STROKE
0x03B3  0x0157          #LATIN SMALL LETTER R WITH CEDILLA
0x03B5  0x0129          #LATIN SMALL LETTER I WITH TILDE
0x03B6  0x013C          #LATIN SMALL LETTER L WITH CEDILLA
0x03BA  0x0113          #LATIN SMALL LETTER E WITH MACRON
0x03BB  0x0123          #LATIN SMALL LETTER G WITH CEDILLA
0x03BC  0x0167          #LATIN SMALL LETTER T WITH STROKE
0x03BD  0x014A          #LATIN CAPITAL LETTER ENG
0x03BF  0x014B          #LATIN SMALL LETTER ENG
0x03C0  0x0100          #LATIN CAPITAL LETTER A WITH MACRON
0x03C7  0x012E          #LATIN CAPITAL LETTER I WITH OGONEK
0x03CC  0x0116          #LATIN CAPITAL LETTER E WITH DOT ABOVE
0x03CF  0x012A          #LATIN CAPITAL LETTER I WITH MACRON
0x03D1  0x0145          #LATIN CAPITAL LETTER N WITH CEDILLA
0x03D2  0x014C          #LATIN CAPITAL LETTER O WITH MACRON
0x03D3  0x0136          #LATIN CAPITAL LETTER K WITH CEDILLA
0x03D9  0x0172          #LATIN CAPITAL LETTER U WITH OGONEK
0x03DD  0x0168          #LATIN CAPITAL LETTER U WITH TILDE
0x03DE  0x016A          #LATIN CAPITAL LETTER U WITH MACRON
0x03E0  0x0101          #LATIN SMALL LETTER A WITH MACRON
0x03E7  0x012F          #LATIN SMALL LETTER I WITH OGONEK
0x03EC  0x0117          #LATIN SMALL LETTER E WITH DOT ABOVE
0x03EF  0x012B          #LATIN SMALL LETTER I WITH MACRON
0x03F1  0x0146          #LATIN SMALL LETTER N WITH CEDILLA
0x03F2  0x014D          #LATIN SMALL LETTER O WITH MACRON
0x03F3  0x0137          #LATIN SMALL LETTER K WITH CEDILLA
0x03F9  0x0173          #LATIN SMALL LETTER U WITH OGONEK
0x03FD  0x0169          #LATIN SMALL LETTER U WITH TILDE
0x03FE  0x016B          #LATIN SMALL LETTER U WITH MACRON

Added freshlib/gui/Linux/__encodings/keysyms4.tbl.

cannot compute difference between binary files

Added freshlib/gui/Linux/__encodings/keysyms4.txt.



































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
0x047E  0x203E          #OVERLINE
0x04A1  0x3002          #KANA FULL STOP
0x04A2  0x300C          #KANA OPENING BRACKET
0x04A3  0x300D          #KANA CLOSING BRACKET
0x04A4  0x3001          #KANA COMMA
0x04A5  0x30FB          #KANA CONJUNCTIVE
0x04A6  0x30F2          #KANA LETTER WO
0x04A7  0x30A1          #KANA LETTER SMALL A
0x04A8  0x30A3          #KANA LETTER SMALL I
0x04A9  0x30A5          #KANA LETTER SMALL U
0x04AA  0x30A7          #KANA LETTER SMALL E
0x04AB  0x30A9          #KANA LETTER SMALL O
0x04AC  0x30E3          #KANA LETTER SMALL YA
0x04AD  0x30E5          #KANA LETTER SMALL YU
0x04AE  0x30E7          #KANA LETTER SMALL YO
0x04AF  0x30C3          #KANA LETTER SMALL TSU
0x04B0  0x30FC          #PROLONGED SOUND SYMBOL
0x04B1  0x30A2          #KANA LETTER A
0x04B2  0x30A4          #KANA LETTER I
0x04B3  0x30A6          #KANA LETTER U
0x04B4  0x30A8          #KANA LETTER E
0x04B5  0x30AA          #KANA LETTER O
0x04B6  0x30AB          #KANA LETTER KA
0x04B7  0x30AD          #KANA LETTER KI
0x04B8  0x30AF          #KANA LETTER KU
0x04B9  0x30B1          #KANA LETTER KE
0x04BA  0x30B3          #KANA LETTER KO
0x04BB  0x30B5          #KANA LETTER SA
0x04BC  0x30B7          #KANA LETTER SHI
0x04BD  0x30B9          #KANA LETTER SU
0x04BE  0x30BB          #KANA LETTER SE
0x04BF  0x30BD          #KANA LETTER SO
0x04C0  0x30BF          #KANA LETTER TA
0x04C1  0x30C1          #KANA LETTER CHI
0x04C2  0x30C4          #KANA LETTER TSU
0x04C3  0x30C6          #KANA LETTER TE
0x04C4  0x30C8          #KANA LETTER TO
0x04C5  0x30CA          #KANA LETTER NA
0x04C6  0x30CB          #KANA LETTER NI
0x04C7  0x30CC          #KANA LETTER NU
0x04C8  0x30CD          #KANA LETTER NE
0x04C9  0x30CE          #KANA LETTER NO
0x04CA  0x30CF          #KANA LETTER HA
0x04CB  0x30D2          #KANA LETTER HI
0x04CC  0x30D5          #KANA LETTER FU
0x04CD  0x30D8          #KANA LETTER HE
0x04CE  0x30DB          #KANA LETTER HO
0x04CF  0x30DE          #KANA LETTER MA
0x04D0  0x30DF          #KANA LETTER MI
0x04D1  0x30E0          #KANA LETTER MU
0x04D2  0x30E1          #KANA LETTER ME
0x04D3  0x30E2          #KANA LETTER MO
0x04D4  0x30E4          #KANA LETTER YA
0x04D5  0x30E6          #KANA LETTER YU
0x04D6  0x30E8          #KANA LETTER YO
0x04D7  0x30E9          #KANA LETTER RA
0x04D8  0x30EA          #KANA LETTER RI
0x04D9  0x30EB          #KANA LETTER RU
0x04DA  0x30EC          #KANA LETTER RE
0x04DB  0x30ED          #KANA LETTER RO
0x04DC  0x30EF          #KANA LETTER WA
0x04DD  0x30F3          #KANA LETTER N
0x04DE  0x309B          #VOICED SOUND SYMBOL
0x04DF  0x309C          #SEMIVOICED SOUND SYMBOL

Added freshlib/gui/Linux/__encodings/keysyms5.tbl.

cannot compute difference between binary files

Added freshlib/gui/Linux/__encodings/keysyms5.txt.



































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
0x05AC  0x060C          #ARABIC COMMA
0x05BB  0x061B          #ARABIC SEMICOLON
0x05BF  0x061F          #ARABIC QUESTION MARK
0x05C1  0x0621          #ARABIC LETTER HAMZA
0x05C2  0x0622          #ARABIC LETTER ALEF WITH MADDA ABOVE
0x05C3  0x0623          #ARABIC LETTER ALEF WITH HAMZA ABOVE
0x05C4  0x0624          #ARABIC LETTER WAW WITH HAMZA ABOVE
0x05C5  0x0625          #ARABIC LETTER ALEF WITH HAMZA BELOW
0x05C6  0x0626          #ARABIC LETTER YEH WITH HAMZA ABOVE
0x05C7  0x0627          #ARABIC LETTER ALEF
0x05C8  0x0628          #ARABIC LETTER BEH
0x05C9  0x0629          #ARABIC LETTER TEH MARBUTA
0x05CA  0x062A          #ARABIC LETTER TEH
0x05CB  0x062B          #ARABIC LETTER THEH
0x05CC  0x062C          #ARABIC LETTER JEEM
0x05CD  0x062D          #ARABIC LETTER HAH
0x05CE  0x062E          #ARABIC LETTER KHAH
0x05CF  0x062F          #ARABIC LETTER DAL
0x05D0  0x0630          #ARABIC LETTER THAL
0x05D1  0x0631          #ARABIC LETTER REH
0x05D2  0x0632          #ARABIC LETTER ZAIN
0x05D3  0x0633          #ARABIC LETTER SEEN
0x05D4  0x0634          #ARABIC LETTER SHEEN
0x05D5  0x0635          #ARABIC LETTER SAD
0x05D6  0x0636          #ARABIC LETTER DAD
0x05D7  0x0637          #ARABIC LETTER TAH
0x05D8  0x0638          #ARABIC LETTER ZAH
0x05D9  0x0639          #ARABIC LETTER AIN
0x05DA  0x063A          #ARABIC LETTER GHAIN
0x05E0  0x0640          #ARABIC TATWEEL
0x05E1  0x0641          #ARABIC LETTER FEH
0x05E2  0x0642          #ARABIC LETTER QAF
0x05E3  0x0643          #ARABIC LETTER KAF
0x05E4  0x0644          #ARABIC LETTER LAM
0x05E5  0x0645          #ARABIC LETTER MEEM
0x05E6  0x0646          #ARABIC LETTER NOON
0x05E7  0x0647          #ARABIC LETTER HEH
0x05E8  0x0648          #ARABIC LETTER WAW
0x05E9  0x0649          #ARABIC LETTER ALEF MAKSURA
0x05EA  0x064A          #ARABIC LETTER YEH
0x05EB  0x064B          #ARABIC FATHATAN
0x05EC  0x064C          #ARABIC DAMMATAN
0x05ED  0x064D          #ARABIC KASRATAN
0x05EE  0x064E          #ARABIC FATHA
0x05EF  0x064F          #ARABIC DAMMA
0x05F0  0x0650          #ARABIC KASRA
0x05F1  0x0651          #ARABIC SHADDA
0x05F2  0x0652          #ARABIC SUKUN

Added freshlib/gui/Linux/__encodings/keysyms6.tbl.





>
>
1
2
¡^RSQTUVWXYZ[\‘^_!	
N01F45D3E89:;<=>?O@ABC62LK7HMIGJ.&$%/ !"#,+(-)'*

Added freshlib/gui/Linux/__encodings/keysyms6.txt.

































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
0x06A1  0x0452          #CYRILLIC SMALL LETTER DJE
0x06A2  0x0453          #CYRILLIC SMALL LETTER GJE
0x06A3  0x0451          #CYRILLIC SMALL LETTER IO
0x06A4  0x0454          #CYRILLIC SMALL LETTER UKRAINIAN IE
0x06A5  0x0455          #CYRILLIC SMALL LETTER DZE
0x06A6  0x0456          #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
0x06A7  0x0457          #CYRILLIC SMALL LETTER YI
0x06A8  0x0458          #CYRILLIC SMALL LETTER JE
0x06A9  0x0459          #CYRILLIC SMALL LETTER LJE
0x06AA  0x045A          #CYRILLIC SMALL LETTER NJE
0x06AB  0x045B          #CYRILLIC SMALL LETTER TSHE
0x06AC  0x045C          #CYRILLIC SMALL LETTER KJE
0x06AD  0x0491          #CYRILLIC SMALL LETTER GHE WITH UPTURN
0x06AE  0x045E          #CYRILLIC SMALL LETTER SHORT U
0x06AF  0x045F          #CYRILLIC SMALL LETTER DZHE
0x06B0  0x2116          #NUMERO SIGN
0x06B1  0x0402          #CYRILLIC CAPITAL LETTER DJE
0x06B2  0x0403          #CYRILLIC CAPITAL LETTER GJE
0x06B3  0x0401          #CYRILLIC CAPITAL LETTER IO
0x06B4  0x0404          #CYRILLIC CAPITAL LETTER UKRAINIAN IE
0x06B5  0x0405          #CYRILLIC CAPITAL LETTER DZE
0x06B6  0x0406          #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
0x06B7  0x0407          #CYRILLIC CAPITAL LETTER YI
0x06B8  0x0408          #CYRILLIC CAPITAL LETTER JE
0x06B9  0x0409          #CYRILLIC CAPITAL LETTER LJE
0x06BA  0x040A          #CYRILLIC CAPITAL LETTER NJE
0x06BB  0x040B          #CYRILLIC CAPITAL LETTER TSHE
0x06BC  0x040C          #CYRILLIC CAPITAL LETTER KJE
0x06BD  0x0490          #CYRILLIC CAPITAL LETTER GHE WITH UPTURN
0x06BE  0x040E          #CYRILLIC CAPITAL LETTER SHORT U
0x06BF  0x040F          #CYRILLIC CAPITAL LETTER DZHE
0x06C0  0x044E          #CYRILLIC SMALL LETTER YU
0x06C1  0x0430          #CYRILLIC SMALL LETTER A
0x06C2  0x0431          #CYRILLIC SMALL LETTER BE
0x06C3  0x0446          #CYRILLIC SMALL LETTER TSE
0x06C4  0x0434          #CYRILLIC SMALL LETTER DE
0x06C5  0x0435          #CYRILLIC SMALL LETTER IE
0x06C6  0x0444          #CYRILLIC SMALL LETTER EF
0x06C7  0x0433          #CYRILLIC SMALL LETTER GHE
0x06C8  0x0445          #CYRILLIC SMALL LETTER HA
0x06C9  0x0438          #CYRILLIC SMALL LETTER I
0x06CA  0x0439          #CYRILLIC SMALL LETTER SHORT I
0x06CB  0x043A          #CYRILLIC SMALL LETTER KA
0x06CC  0x043B          #CYRILLIC SMALL LETTER EL
0x06CD  0x043C          #CYRILLIC SMALL LETTER EM
0x06CE  0x043D          #CYRILLIC SMALL LETTER EN
0x06CF  0x043E          #CYRILLIC SMALL LETTER O
0x06D0  0x043F          #CYRILLIC SMALL LETTER PE
0x06D1  0x044F          #CYRILLIC SMALL LETTER YA
0x06D2  0x0440          #CYRILLIC SMALL LETTER ER
0x06D3  0x0441          #CYRILLIC SMALL LETTER ES
0x06D4  0x0442          #CYRILLIC SMALL LETTER TE
0x06D5  0x0443          #CYRILLIC SMALL LETTER U
0x06D6  0x0436          #CYRILLIC SMALL LETTER ZHE
0x06D7  0x0432          #CYRILLIC SMALL LETTER VE
0x06D8  0x044C          #CYRILLIC SMALL LETTER SOFT SIGN
0x06D9  0x044B          #CYRILLIC SMALL LETTER YERU
0x06DA  0x0437          #CYRILLIC SMALL LETTER ZE
0x06DB  0x0448          #CYRILLIC SMALL LETTER SHA
0x06DC  0x044D          #CYRILLIC SMALL LETTER E
0x06DD  0x0449          #CYRILLIC SMALL LETTER SHCHA
0x06DE  0x0447          #CYRILLIC SMALL LETTER CHE
0x06DF  0x044A          #CYRILLIC SMALL LETTER HARD SIGN
0x06E0  0x042E          #CYRILLIC CAPITAL LETTER YU
0x06E1  0x0410          #CYRILLIC CAPITAL LETTER A
0x06E2  0x0411          #CYRILLIC CAPITAL LETTER BE
0x06E3  0x0426          #CYRILLIC CAPITAL LETTER TSE
0x06E4  0x0414          #CYRILLIC CAPITAL LETTER DE
0x06E5  0x0415          #CYRILLIC CAPITAL LETTER IE
0x06E6  0x0424          #CYRILLIC CAPITAL LETTER EF
0x06E7  0x0413          #CYRILLIC CAPITAL LETTER GHE
0x06E8  0x0425          #CYRILLIC CAPITAL LETTER HA
0x06E9  0x0418          #CYRILLIC CAPITAL LETTER I
0x06EA  0x0419          #CYRILLIC CAPITAL LETTER SHORT I
0x06EB  0x041A          #CYRILLIC CAPITAL LETTER KA
0x06EC  0x041B          #CYRILLIC CAPITAL LETTER EL
0x06ED  0x041C          #CYRILLIC CAPITAL LETTER EM
0x06EE  0x041D          #CYRILLIC CAPITAL LETTER EN
0x06EF  0x041E          #CYRILLIC CAPITAL LETTER O
0x06F0  0x041F          #CYRILLIC CAPITAL LETTER PE
0x06F1  0x042F          #CYRILLIC CAPITAL LETTER YA
0x06F2  0x0420          #CYRILLIC CAPITAL LETTER ER
0x06F3  0x0421          #CYRILLIC CAPITAL LETTER ES
0x06F4  0x0422          #CYRILLIC CAPITAL LETTER TE
0x06F5  0x0423          #CYRILLIC CAPITAL LETTER U
0x06F6  0x0416          #CYRILLIC CAPITAL LETTER ZHE
0x06F7  0x0412          #CYRILLIC CAPITAL LETTER VE
0x06F8  0x042C          #CYRILLIC CAPITAL LETTER SOFT SIGN
0x06F9  0x042B          #CYRILLIC CAPITAL LETTER YERU
0x06FA  0x0417          #CYRILLIC CAPITAL LETTER ZE
0x06FB  0x0428          #CYRILLIC CAPITAL LETTER SHA
0x06FC  0x042D          #CYRILLIC CAPITAL LETTER E
0x06FD  0x0429          #CYRILLIC CAPITAL LETTER SHCHA
0x06FE  0x0427          #CYRILLIC CAPITAL LETTER CHE
0x06FF  0x042A          #CYRILLIC CAPITAL LETTER HARD SIGN

Added freshlib/gui/Linux/__encodings/keysyms7.tbl.

cannot compute difference between binary files

Added freshlib/gui/Linux/__encodings/keysyms7.txt.

















































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
0x07A1  0x0386          #GREEK CAPITAL LETTER ALPHA WITH TONOS
0x07A2  0x0388          #GREEK CAPITAL LETTER EPSILON WITH TONOS
0x07A3  0x0389          #GREEK CAPITAL LETTER ETA WITH TONOS
0x07A4  0x038A          #GREEK CAPITAL LETTER IOTA WITH TONOS
0x07A5  0x03AA          #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
0x07A7  0x038C          #GREEK CAPITAL LETTER OMICRON WITH TONOS
0x07A8  0x038E          #GREEK CAPITAL LETTER UPSILON WITH TONOS
0x07A9  0x03AB          #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
0x07AB  0x038F          #GREEK CAPITAL LETTER OMEGA WITH TONOS
0x07AE  0x0385          #GREEK DIALYTIKA TONOS
0x07AF  0x2015          #HORIZONTAL BAR
0x07B1  0x03AC          #GREEK SMALL LETTER ALPHA WITH TONOS
0x07B2  0x03AD          #GREEK SMALL LETTER EPSILON WITH TONOS
0x07B3  0x03AE          #GREEK SMALL LETTER ETA WITH TONOS
0x07B4  0x03AF          #GREEK SMALL LETTER IOTA WITH TONOS
0x07B5  0x03CA          #GREEK SMALL LETTER IOTA WITH DIALYTIKA
0x07B6  0x0390          #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
0x07B7  0x03CC          #GREEK SMALL LETTER OMICRON WITH TONOS
0x07B8  0x03CD          #GREEK SMALL LETTER UPSILON WITH TONOS
0x07B9  0x03CB          #GREEK SMALL LETTER UPSILON WITH DIALYTIKA
0x07BA  0x03B0          #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
0x07BB  0x03CE          #GREEK SMALL LETTER OMEGA WITH TONOS
0x07C1  0x0391          #GREEK CAPITAL LETTER ALPHA
0x07C2  0x0392          #GREEK CAPITAL LETTER BETA
0x07C3  0x0393          #GREEK CAPITAL LETTER GAMMA
0x07C4  0x0394          #GREEK CAPITAL LETTER DELTA
0x07C5  0x0395          #GREEK CAPITAL LETTER EPSILON
0x07C6  0x0396          #GREEK CAPITAL LETTER ZETA
0x07C7  0x0397          #GREEK CAPITAL LETTER ETA
0x07C8  0x0398          #GREEK CAPITAL LETTER THETA
0x07C9  0x0399          #GREEK CAPITAL LETTER IOTA
0x07CA  0x039A          #GREEK CAPITAL LETTER KAPPA
0x07CB  0x039B          #GREEK CAPITAL LETTER LAMDA
0x07CC  0x039C          #GREEK CAPITAL LETTER MU
0x07CD  0x039D          #GREEK CAPITAL LETTER NU
0x07CE  0x039E          #GREEK CAPITAL LETTER XI
0x07CF  0x039F          #GREEK CAPITAL LETTER OMICRON
0x07D0  0x03A0          #GREEK CAPITAL LETTER PI
0x07D1  0x03A1          #GREEK CAPITAL LETTER RHO
0x07D2  0x03A3          #GREEK CAPITAL LETTER SIGMA
0x07D4  0x03A4          #GREEK CAPITAL LETTER TAU
0x07D5  0x03A5          #GREEK CAPITAL LETTER UPSILON
0x07D6  0x03A6          #GREEK CAPITAL LETTER PHI
0x07D7  0x03A7          #GREEK CAPITAL LETTER CHI
0x07D8  0x03A8          #GREEK CAPITAL LETTER PSI
0x07D9  0x03A9          #GREEK CAPITAL LETTER OMEGA
0x07E1  0x03B1          #GREEK SMALL LETTER ALPHA
0x07E2  0x03B2          #GREEK SMALL LETTER BETA
0x07E3  0x03B3          #GREEK SMALL LETTER GAMMA
0x07E4  0x03B4          #GREEK SMALL LETTER DELTA
0x07E5  0x03B5          #GREEK SMALL LETTER EPSILON
0x07E6  0x03B6          #GREEK SMALL LETTER ZETA
0x07E7  0x03B7          #GREEK SMALL LETTER ETA
0x07E8  0x03B8          #GREEK SMALL LETTER THETA
0x07E9  0x03B9          #GREEK SMALL LETTER IOTA
0x07EA  0x03BA          #GREEK SMALL LETTER KAPPA
0x07EB  0x03BB          #GREEK SMALL LETTER LAMDA
0x07EC  0x03BC          #GREEK SMALL LETTER MU
0x07ED  0x03BD          #GREEK SMALL LETTER NU
0x07EE  0x03BE          #GREEK SMALL LETTER XI
0x07EF  0x03BF          #GREEK SMALL LETTER OMICRON
0x07F0  0x03C0          #GREEK SMALL LETTER PI
0x07F1  0x03C1          #GREEK SMALL LETTER RHO
0x07F2  0x03C3          #GREEK SMALL LETTER SIGMA
0x07F3  0x03C2          #GREEK SMALL LETTER FINAL SIGMA
0x07F4  0x03C4          #GREEK SMALL LETTER TAU
0x07F5  0x03C5          #GREEK SMALL LETTER UPSILON
0x07F6  0x03C6          #GREEK SMALL LETTER PHI
0x07F7  0x03C7          #GREEK SMALL LETTER CHI
0x07F8  0x03C8          #GREEK SMALL LETTER PSI
0x07F9  0x03C9          #GREEK SMALL LETTER OMEGA

Added freshlib/gui/Linux/__encodings/keysyms_encoding.txt.

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
0x01A1  0x0104          #LATIN CAPITAL LETTER A WITH OGONEK
0x01A2  0x02D8          #BREVE
0x01A3  0x0141          #LATIN CAPITAL LETTER L WITH STROKE
0x01A5  0x013D          #LATIN CAPITAL LETTER L WITH CARON
0x01A6  0x015A          #LATIN CAPITAL LETTER S WITH ACUTE
0x01A9  0x0160          #LATIN CAPITAL LETTER S WITH CARON
0x01AA  0x015E          #LATIN CAPITAL LETTER S WITH CEDILLA
0x01AB  0x0164          #LATIN CAPITAL LETTER T WITH CARON
0x01AC  0x0179          #LATIN CAPITAL LETTER Z WITH ACUTE
0x01AE  0x017D          #LATIN CAPITAL LETTER Z WITH CARON
0x01AF  0x017B          #LATIN CAPITAL LETTER Z WITH DOT ABOVE
0x01B1  0x0105          #LATIN SMALL LETTER A WITH OGONEK
0x01B2  0x02DB          #OGONEK
0x01B3  0x0142          #LATIN SMALL LETTER L WITH STROKE
0x01B5  0x013E          #LATIN SMALL LETTER L WITH CARON
0x01B6  0x015B          #LATIN SMALL LETTER S WITH ACUTE
0x01B7  0x02C7          #CARON
0x01B9  0x0161          #LATIN SMALL LETTER S WITH CARON
0x01BA  0x015F          #LATIN SMALL LETTER S WITH CEDILLA
0x01BB  0x0165          #LATIN SMALL LETTER T WITH CARON
0x01BC  0x017A          #LATIN SMALL LETTER Z WITH ACUTE
0x01BD  0x02DD          #DOUBLE ACUTE ACCENT
0x01BE  0x017E          #LATIN SMALL LETTER Z WITH CARON
0x01BF  0x017C          #LATIN SMALL LETTER Z WITH DOT ABOVE
0x01C0  0x0154          #LATIN CAPITAL LETTER R WITH ACUTE
0x01C3  0x0102          #LATIN CAPITAL LETTER A WITH BREVE
0x01C5  0x0139          #LATIN CAPITAL LETTER L WITH ACUTE
0x01C6  0x0106          #LATIN CAPITAL LETTER C WITH ACUTE
0x01C8  0x010C          #LATIN CAPITAL LETTER C WITH CARON
0x01CA  0x0118          #LATIN CAPITAL LETTER E WITH OGONEK
0x01CC  0x011A          #LATIN CAPITAL LETTER E WITH CARON
0x01CF  0x010E          #LATIN CAPITAL LETTER D WITH CARON
0x01D0  0x0110          #LATIN CAPITAL LETTER D WITH STROKE
0x01D1  0x0143          #LATIN CAPITAL LETTER N WITH ACUTE
0x01D2  0x0147          #LATIN CAPITAL LETTER N WITH CARON
0x01D5  0x0150          #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
0x01D8  0x0158          #LATIN CAPITAL LETTER R WITH CARON
0x01D9  0x016E          #LATIN CAPITAL LETTER U WITH RING ABOVE
0x01DB  0x0170          #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
0x01DE  0x0162          #LATIN CAPITAL LETTER T WITH CEDILLA
0x01E0  0x0155          #LATIN SMALL LETTER R WITH ACUTE
0x01E3  0x0103          #LATIN SMALL LETTER A WITH BREVE
0x01E5  0x013A          #LATIN SMALL LETTER L WITH ACUTE
0x01E6  0x0107          #LATIN SMALL LETTER C WITH ACUTE
0x01E8  0x010D          #LATIN SMALL LETTER C WITH CARON
0x01EA  0x0119          #LATIN SMALL LETTER E WITH OGONEK
0x01EC  0x011B          #LATIN SMALL LETTER E WITH CARON
0x01EF  0x010F          #LATIN SMALL LETTER D WITH CARON
0x01F0  0x0111          #LATIN SMALL LETTER D WITH STROKE
0x01F1  0x0144          #LATIN SMALL LETTER N WITH ACUTE
0x01F2  0x0148          #LATIN SMALL LETTER N WITH CARON
0x01F5  0x0151          #LATIN SMALL LETTER O WITH DOUBLE ACUTE
0x01F8  0x0159          #LATIN SMALL LETTER R WITH CARON
0x01F9  0x016F          #LATIN SMALL LETTER U WITH RING ABOVE
0x01FB  0x0171          #LATIN SMALL LETTER U WITH DOUBLE ACUTE
0x01FE  0x0163          #LATIN SMALL LETTER T WITH CEDILLA
0x01FF  0x02D9          #DOT ABOVE
0x02A1  0x0126          #LATIN CAPITAL LETTER H WITH STROKE
0x02A6  0x0124          #LATIN CAPITAL LETTER H WITH CIRCUMFLEX
0x02A9  0x0130          #LATIN CAPITAL LETTER I WITH DOT ABOVE
0x02AB  0x011E          #LATIN CAPITAL LETTER G WITH BREVE
0x02AC  0x0134          #LATIN CAPITAL LETTER J WITH CIRCUMFLEX
0x02B1  0x0127          #LATIN SMALL LETTER H WITH STROKE
0x02B6  0x0125          #LATIN SMALL LETTER H WITH CIRCUMFLEX
0x02B9  0x0131          #LATIN SMALL LETTER DOTLESS I
0x02BB  0x011F          #LATIN SMALL LETTER G WITH BREVE
0x02BC  0x0135          #LATIN SMALL LETTER J WITH CIRCUMFLEX
0x02C5  0x010A          #LATIN CAPITAL LETTER C WITH DOT ABOVE
0x02C6  0x0108          #LATIN CAPITAL LETTER C WITH CIRCUMFLEX
0x02D5  0x0120          #LATIN CAPITAL LETTER G WITH DOT ABOVE
0x02D8  0x011C          #LATIN CAPITAL LETTER G WITH CIRCUMFLEX
0x02DD  0x016C          #LATIN CAPITAL LETTER U WITH BREVE
0x02DE  0x015C          #LATIN CAPITAL LETTER S WITH CIRCUMFLEX
0x02E5  0x010B          #LATIN SMALL LETTER C WITH DOT ABOVE
0x02E6  0x0109          #LATIN SMALL LETTER C WITH CIRCUMFLEX
0x02F5  0x0121          #LATIN SMALL LETTER G WITH DOT ABOVE
0x02F8  0x011D          #LATIN SMALL LETTER G WITH CIRCUMFLEX
0x02FD  0x016D          #LATIN SMALL LETTER U WITH BREVE
0x02FE  0x015D          #LATIN SMALL LETTER S WITH CIRCUMFLEX
0x03A2  0x0138          #LATIN SMALL LETTER KRA
0x03A3  0x0156          #LATIN CAPITAL LETTER R WITH CEDILLA
0x03A5  0x0128          #LATIN CAPITAL LETTER I WITH TILDE
0x03A6  0x013B          #LATIN CAPITAL LETTER L WITH CEDILLA
0x03AA  0x0112          #LATIN CAPITAL LETTER E WITH MACRON
0x03AB  0x0122          #LATIN CAPITAL LETTER G WITH CEDILLA
0x03AC  0x0166          #LATIN CAPITAL LETTER T WITH STROKE
0x03B3  0x0157          #LATIN SMALL LETTER R WITH CEDILLA
0x03B5  0x0129          #LATIN SMALL LETTER I WITH TILDE
0x03B6  0x013C          #LATIN SMALL LETTER L WITH CEDILLA
0x03BA  0x0113          #LATIN SMALL LETTER E WITH MACRON
0x03BB  0x0123          #LATIN SMALL LETTER G WITH CEDILLA
0x03BC  0x0167          #LATIN SMALL LETTER T WITH STROKE
0x03BD  0x014A          #LATIN CAPITAL LETTER ENG
0x03BF  0x014B          #LATIN SMALL LETTER ENG
0x03C0  0x0100          #LATIN CAPITAL LETTER A WITH MACRON
0x03C7  0x012E          #LATIN CAPITAL LETTER I WITH OGONEK
0x03CC  0x0116          #LATIN CAPITAL LETTER E WITH DOT ABOVE
0x03CF  0x012A          #LATIN CAPITAL LETTER I WITH MACRON
0x03D1  0x0145          #LATIN CAPITAL LETTER N WITH CEDILLA
0x03D2  0x014C          #LATIN CAPITAL LETTER O WITH MACRON
0x03D3  0x0136          #LATIN CAPITAL LETTER K WITH CEDILLA
0x03D9  0x0172          #LATIN CAPITAL LETTER U WITH OGONEK
0x03DD  0x0168          #LATIN CAPITAL LETTER U WITH TILDE
0x03DE  0x016A          #LATIN CAPITAL LETTER U WITH MACRON
0x03E0  0x0101          #LATIN SMALL LETTER A WITH MACRON
0x03E7  0x012F          #LATIN SMALL LETTER I WITH OGONEK
0x03EC  0x0117          #LATIN SMALL LETTER E WITH DOT ABOVE
0x03EF  0x012B          #LATIN SMALL LETTER I WITH MACRON
0x03F1  0x0146          #LATIN SMALL LETTER N WITH CEDILLA
0x03F2  0x014D          #LATIN SMALL LETTER O WITH MACRON
0x03F3  0x0137          #LATIN SMALL LETTER K WITH CEDILLA
0x03F9  0x0173          #LATIN SMALL LETTER U WITH OGONEK
0x03FD  0x0169          #LATIN SMALL LETTER U WITH TILDE
0x03FE  0x016B          #LATIN SMALL LETTER U WITH MACRON
0x047E  0x203E          #OVERLINE
0x04A1  0x3002          #KANA FULL STOP
0x04A2  0x300C          #KANA OPENING BRACKET
0x04A3  0x300D          #KANA CLOSING BRACKET
0x04A4  0x3001          #KANA COMMA
0x04A5  0x30FB          #KANA CONJUNCTIVE
0x04A6  0x30F2          #KANA LETTER WO
0x04A7  0x30A1          #KANA LETTER SMALL A
0x04A8  0x30A3          #KANA LETTER SMALL I
0x04A9  0x30A5          #KANA LETTER SMALL U
0x04AA  0x30A7          #KANA LETTER SMALL E
0x04AB  0x30A9          #KANA LETTER SMALL O
0x04AC  0x30E3          #KANA LETTER SMALL YA
0x04AD  0x30E5          #KANA LETTER SMALL YU
0x04AE  0x30E7          #KANA LETTER SMALL YO
0x04AF  0x30C3          #KANA LETTER SMALL TSU
0x04B0  0x30FC          #PROLONGED SOUND SYMBOL
0x04B1  0x30A2          #KANA LETTER A
0x04B2  0x30A4          #KANA LETTER I
0x04B3  0x30A6          #KANA LETTER U
0x04B4  0x30A8          #KANA LETTER E
0x04B5  0x30AA          #KANA LETTER O
0x04B6  0x30AB          #KANA LETTER KA
0x04B7  0x30AD          #KANA LETTER KI
0x04B8  0x30AF          #KANA LETTER KU
0x04B9  0x30B1          #KANA LETTER KE
0x04BA  0x30B3          #KANA LETTER KO
0x04BB  0x30B5          #KANA LETTER SA
0x04BC  0x30B7          #KANA LETTER SHI
0x04BD  0x30B9          #KANA LETTER SU
0x04BE  0x30BB          #KANA LETTER SE
0x04BF  0x30BD          #KANA LETTER SO
0x04C0  0x30BF          #KANA LETTER TA
0x04C1  0x30C1          #KANA LETTER CHI
0x04C2  0x30C4          #KANA LETTER TSU
0x04C3  0x30C6          #KANA LETTER TE
0x04C4  0x30C8          #KANA LETTER TO
0x04C5  0x30CA          #KANA LETTER NA
0x04C6  0x30CB          #KANA LETTER NI
0x04C7  0x30CC          #KANA LETTER NU
0x04C8  0x30CD          #KANA LETTER NE
0x04C9  0x30CE          #KANA LETTER NO
0x04CA  0x30CF          #KANA LETTER HA
0x04CB  0x30D2          #KANA LETTER HI
0x04CC  0x30D5          #KANA LETTER FU
0x04CD  0x30D8          #KANA LETTER HE
0x04CE  0x30DB          #KANA LETTER HO
0x04CF  0x30DE          #KANA LETTER MA
0x04D0  0x30DF          #KANA LETTER MI
0x04D1  0x30E0          #KANA LETTER MU
0x04D2  0x30E1          #KANA LETTER ME
0x04D3  0x30E2          #KANA LETTER MO
0x04D4  0x30E4          #KANA LETTER YA
0x04D5  0x30E6          #KANA LETTER YU
0x04D6  0x30E8          #KANA LETTER YO
0x04D7  0x30E9          #KANA LETTER RA
0x04D8  0x30EA          #KANA LETTER RI
0x04D9  0x30EB          #KANA LETTER RU
0x04DA  0x30EC          #KANA LETTER RE
0x04DB  0x30ED          #KANA LETTER RO
0x04DC  0x30EF          #KANA LETTER WA
0x04DD  0x30F3          #KANA LETTER N
0x04DE  0x309B          #VOICED SOUND SYMBOL
0x04DF  0x309C          #SEMIVOICED SOUND SYMBOL
0x05AC  0x060C          #ARABIC COMMA
0x05BB  0x061B          #ARABIC SEMICOLON
0x05BF  0x061F          #ARABIC QUESTION MARK
0x05C1  0x0621          #ARABIC LETTER HAMZA
0x05C2  0x0622          #ARABIC LETTER ALEF WITH MADDA ABOVE
0x05C3  0x0623          #ARABIC LETTER ALEF WITH HAMZA ABOVE
0x05C4  0x0624          #ARABIC LETTER WAW WITH HAMZA ABOVE
0x05C5  0x0625          #ARABIC LETTER ALEF WITH HAMZA BELOW
0x05C6  0x0626          #ARABIC LETTER YEH WITH HAMZA ABOVE
0x05C7  0x0627          #ARABIC LETTER ALEF
0x05C8  0x0628          #ARABIC LETTER BEH
0x05C9  0x0629          #ARABIC LETTER TEH MARBUTA
0x05CA  0x062A          #ARABIC LETTER TEH
0x05CB  0x062B          #ARABIC LETTER THEH
0x05CC  0x062C          #ARABIC LETTER JEEM
0x05CD  0x062D          #ARABIC LETTER HAH
0x05CE  0x062E          #ARABIC LETTER KHAH
0x05CF  0x062F          #ARABIC LETTER DAL
0x05D0  0x0630          #ARABIC LETTER THAL
0x05D1  0x0631          #ARABIC LETTER REH
0x05D2  0x0632          #ARABIC LETTER ZAIN
0x05D3  0x0633          #ARABIC LETTER SEEN
0x05D4  0x0634          #ARABIC LETTER SHEEN
0x05D5  0x0635          #ARABIC LETTER SAD
0x05D6  0x0636          #ARABIC LETTER DAD
0x05D7  0x0637          #ARABIC LETTER TAH
0x05D8  0x0638          #ARABIC LETTER ZAH
0x05D9  0x0639          #ARABIC LETTER AIN
0x05DA  0x063A          #ARABIC LETTER GHAIN
0x05E0  0x0640          #ARABIC TATWEEL
0x05E1  0x0641          #ARABIC LETTER FEH
0x05E2  0x0642          #ARABIC LETTER QAF
0x05E3  0x0643          #ARABIC LETTER KAF
0x05E4  0x0644          #ARABIC LETTER LAM
0x05E5  0x0645          #ARABIC LETTER MEEM
0x05E6  0x0646          #ARABIC LETTER NOON
0x05E7  0x0647          #ARABIC LETTER HEH
0x05E8  0x0648          #ARABIC LETTER WAW
0x05E9  0x0649          #ARABIC LETTER ALEF MAKSURA
0x05EA  0x064A          #ARABIC LETTER YEH
0x05EB  0x064B          #ARABIC FATHATAN
0x05EC  0x064C          #ARABIC DAMMATAN
0x05ED  0x064D          #ARABIC KASRATAN
0x05EE  0x064E          #ARABIC FATHA
0x05EF  0x064F          #ARABIC DAMMA
0x05F0  0x0650          #ARABIC KASRA
0x05F1  0x0651          #ARABIC SHADDA
0x05F2  0x0652          #ARABIC SUKUN
0x06A1  0x0452          #CYRILLIC SMALL LETTER DJE
0x06A2  0x0453          #CYRILLIC SMALL LETTER GJE
0x06A3  0x0451          #CYRILLIC SMALL LETTER IO
0x06A4  0x0454          #CYRILLIC SMALL LETTER UKRAINIAN IE
0x06A5  0x0455          #CYRILLIC SMALL LETTER DZE
0x06A6  0x0456          #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
0x06A7  0x0457          #CYRILLIC SMALL LETTER YI
0x06A8  0x0458          #CYRILLIC SMALL LETTER JE
0x06A9  0x0459          #CYRILLIC SMALL LETTER LJE
0x06AA  0x045A          #CYRILLIC SMALL LETTER NJE
0x06AB  0x045B          #CYRILLIC SMALL LETTER TSHE
0x06AC  0x045C          #CYRILLIC SMALL LETTER KJE
0x06AD  0x0491          #CYRILLIC SMALL LETTER GHE WITH UPTURN
0x06AE  0x045E          #CYRILLIC SMALL LETTER SHORT U
0x06AF  0x045F          #CYRILLIC SMALL LETTER DZHE
0x06B0  0x2116          #NUMERO SIGN
0x06B1  0x0402          #CYRILLIC CAPITAL LETTER DJE
0x06B2  0x0403          #CYRILLIC CAPITAL LETTER GJE
0x06B3  0x0401          #CYRILLIC CAPITAL LETTER IO
0x06B4  0x0404          #CYRILLIC CAPITAL LETTER UKRAINIAN IE
0x06B5  0x0405          #CYRILLIC CAPITAL LETTER DZE
0x06B6  0x0406          #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
0x06B7  0x0407          #CYRILLIC CAPITAL LETTER YI
0x06B8  0x0408          #CYRILLIC CAPITAL LETTER JE
0x06B9  0x0409          #CYRILLIC CAPITAL LETTER LJE
0x06BA  0x040A          #CYRILLIC CAPITAL LETTER NJE
0x06BB  0x040B          #CYRILLIC CAPITAL LETTER TSHE
0x06BC  0x040C          #CYRILLIC CAPITAL LETTER KJE
0x06BD  0x0490          #CYRILLIC CAPITAL LETTER GHE WITH UPTURN
0x06BE  0x040E          #CYRILLIC CAPITAL LETTER SHORT U
0x06BF  0x040F          #CYRILLIC CAPITAL LETTER DZHE
0x06C0  0x044E          #CYRILLIC SMALL LETTER YU
0x06C1  0x0430          #CYRILLIC SMALL LETTER A
0x06C2  0x0431          #CYRILLIC SMALL LETTER BE
0x06C3  0x0446          #CYRILLIC SMALL LETTER TSE
0x06C4  0x0434          #CYRILLIC SMALL LETTER DE
0x06C5  0x0435          #CYRILLIC SMALL LETTER IE
0x06C6  0x0444          #CYRILLIC SMALL LETTER EF
0x06C7  0x0433          #CYRILLIC SMALL LETTER GHE
0x06C8  0x0445          #CYRILLIC SMALL LETTER HA
0x06C9  0x0438          #CYRILLIC SMALL LETTER I
0x06CA  0x0439          #CYRILLIC SMALL LETTER SHORT I
0x06CB  0x043A          #CYRILLIC SMALL LETTER KA
0x06CC  0x043B          #CYRILLIC SMALL LETTER EL
0x06CD  0x043C          #CYRILLIC SMALL LETTER EM
0x06CE  0x043D          #CYRILLIC SMALL LETTER EN
0x06CF  0x043E          #CYRILLIC SMALL LETTER O
0x06D0  0x043F          #CYRILLIC SMALL LETTER PE
0x06D1  0x044F          #CYRILLIC SMALL LETTER YA
0x06D2  0x0440          #CYRILLIC SMALL LETTER ER
0x06D3  0x0441          #CYRILLIC SMALL LETTER ES
0x06D4  0x0442          #CYRILLIC SMALL LETTER TE
0x06D5  0x0443          #CYRILLIC SMALL LETTER U
0x06D6  0x0436          #CYRILLIC SMALL LETTER ZHE
0x06D7  0x0432          #CYRILLIC SMALL LETTER VE
0x06D8  0x044C          #CYRILLIC SMALL LETTER SOFT SIGN
0x06D9  0x044B          #CYRILLIC SMALL LETTER YERU
0x06DA  0x0437          #CYRILLIC SMALL LETTER ZE
0x06DB  0x0448          #CYRILLIC SMALL LETTER SHA
0x06DC  0x044D          #CYRILLIC SMALL LETTER E
0x06DD  0x0449          #CYRILLIC SMALL LETTER SHCHA
0x06DE  0x0447          #CYRILLIC SMALL LETTER CHE
0x06DF  0x044A          #CYRILLIC SMALL LETTER HARD SIGN
0x06E0  0x042E          #CYRILLIC CAPITAL LETTER YU
0x06E1  0x0410          #CYRILLIC CAPITAL LETTER A
0x06E2  0x0411          #CYRILLIC CAPITAL LETTER BE
0x06E3  0x0426          #CYRILLIC CAPITAL LETTER TSE
0x06E4  0x0414          #CYRILLIC CAPITAL LETTER DE
0x06E5  0x0415          #CYRILLIC CAPITAL LETTER IE
0x06E6  0x0424          #CYRILLIC CAPITAL LETTER EF
0x06E7  0x0413          #CYRILLIC CAPITAL LETTER GHE
0x06E8  0x0425          #CYRILLIC CAPITAL LETTER HA
0x06E9  0x0418          #CYRILLIC CAPITAL LETTER I
0x06EA  0x0419          #CYRILLIC CAPITAL LETTER SHORT I
0x06EB  0x041A          #CYRILLIC CAPITAL LETTER KA
0x06EC  0x041B          #CYRILLIC CAPITAL LETTER EL
0x06ED  0x041C          #CYRILLIC CAPITAL LETTER EM
0x06EE  0x041D          #CYRILLIC CAPITAL LETTER EN
0x06EF  0x041E          #CYRILLIC CAPITAL LETTER O
0x06F0  0x041F          #CYRILLIC CAPITAL LETTER PE
0x06F1  0x042F          #CYRILLIC CAPITAL LETTER YA
0x06F2  0x0420          #CYRILLIC CAPITAL LETTER ER
0x06F3  0x0421          #CYRILLIC CAPITAL LETTER ES
0x06F4  0x0422          #CYRILLIC CAPITAL LETTER TE
0x06F5  0x0423          #CYRILLIC CAPITAL LETTER U
0x06F6  0x0416          #CYRILLIC CAPITAL LETTER ZHE
0x06F7  0x0412          #CYRILLIC CAPITAL LETTER VE
0x06F8  0x042C          #CYRILLIC CAPITAL LETTER SOFT SIGN
0x06F9  0x042B          #CYRILLIC CAPITAL LETTER YERU
0x06FA  0x0417          #CYRILLIC CAPITAL LETTER ZE
0x06FB  0x0428          #CYRILLIC CAPITAL LETTER SHA
0x06FC  0x042D          #CYRILLIC CAPITAL LETTER E
0x06FD  0x0429          #CYRILLIC CAPITAL LETTER SHCHA
0x06FE  0x0427          #CYRILLIC CAPITAL LETTER CHE
0x06FF  0x042A          #CYRILLIC CAPITAL LETTER HARD SIGN
0x07A1  0x0386          #GREEK CAPITAL LETTER ALPHA WITH TONOS
0x07A2  0x0388          #GREEK CAPITAL LETTER EPSILON WITH TONOS
0x07A3  0x0389          #GREEK CAPITAL LETTER ETA WITH TONOS
0x07A4  0x038A          #GREEK CAPITAL LETTER IOTA WITH TONOS
0x07A5  0x03AA          #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
0x07A7  0x038C          #GREEK CAPITAL LETTER OMICRON WITH TONOS
0x07A8  0x038E          #GREEK CAPITAL LETTER UPSILON WITH TONOS
0x07A9  0x03AB          #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
0x07AB  0x038F          #GREEK CAPITAL LETTER OMEGA WITH TONOS
0x07AE  0x0385          #GREEK DIALYTIKA TONOS
0x07AF  0x2015          #HORIZONTAL BAR
0x07B1  0x03AC          #GREEK SMALL LETTER ALPHA WITH TONOS
0x07B2  0x03AD          #GREEK SMALL LETTER EPSILON WITH TONOS
0x07B3  0x03AE          #GREEK SMALL LETTER ETA WITH TONOS
0x07B4  0x03AF          #GREEK SMALL LETTER IOTA WITH TONOS
0x07B5  0x03CA          #GREEK SMALL LETTER IOTA WITH DIALYTIKA
0x07B6  0x0390          #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
0x07B7  0x03CC          #GREEK SMALL LETTER OMICRON WITH TONOS
0x07B8  0x03CD          #GREEK SMALL LETTER UPSILON WITH TONOS
0x07B9  0x03CB          #GREEK SMALL LETTER UPSILON WITH DIALYTIKA
0x07BA  0x03B0          #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
0x07BB  0x03CE          #GREEK SMALL LETTER OMEGA WITH TONOS
0x07C1  0x0391          #GREEK CAPITAL LETTER ALPHA
0x07C2  0x0392          #GREEK CAPITAL LETTER BETA
0x07C3  0x0393          #GREEK CAPITAL LETTER GAMMA
0x07C4  0x0394          #GREEK CAPITAL LETTER DELTA
0x07C5  0x0395          #GREEK CAPITAL LETTER EPSILON
0x07C6  0x0396          #GREEK CAPITAL LETTER ZETA
0x07C7  0x0397          #GREEK CAPITAL LETTER ETA
0x07C8  0x0398          #GREEK CAPITAL LETTER THETA
0x07C9  0x0399          #GREEK CAPITAL LETTER IOTA
0x07CA  0x039A          #GREEK CAPITAL LETTER KAPPA
0x07CB  0x039B          #GREEK CAPITAL LETTER LAMDA
0x07CC  0x039C          #GREEK CAPITAL LETTER MU
0x07CD  0x039D          #GREEK CAPITAL LETTER NU
0x07CE  0x039E          #GREEK CAPITAL LETTER XI
0x07CF  0x039F          #GREEK CAPITAL LETTER OMICRON
0x07D0  0x03A0          #GREEK CAPITAL LETTER PI
0x07D1  0x03A1          #GREEK CAPITAL LETTER RHO
0x07D2  0x03A3          #GREEK CAPITAL LETTER SIGMA
0x07D4  0x03A4          #GREEK CAPITAL LETTER TAU
0x07D5  0x03A5          #GREEK CAPITAL LETTER UPSILON
0x07D6  0x03A6          #GREEK CAPITAL LETTER PHI
0x07D7  0x03A7          #GREEK CAPITAL LETTER CHI
0x07D8  0x03A8          #GREEK CAPITAL LETTER PSI
0x07D9  0x03A9          #GREEK CAPITAL LETTER OMEGA
0x07E1  0x03B1          #GREEK SMALL LETTER ALPHA
0x07E2  0x03B2          #GREEK SMALL LETTER BETA
0x07E3  0x03B3          #GREEK SMALL LETTER GAMMA
0x07E4  0x03B4          #GREEK SMALL LETTER DELTA
0x07E5  0x03B5          #GREEK SMALL LETTER EPSILON
0x07E6  0x03B6          #GREEK SMALL LETTER ZETA
0x07E7  0x03B7          #GREEK SMALL LETTER ETA
0x07E8  0x03B8          #GREEK SMALL LETTER THETA
0x07E9  0x03B9          #GREEK SMALL LETTER IOTA
0x07EA  0x03BA          #GREEK SMALL LETTER KAPPA
0x07EB  0x03BB          #GREEK SMALL LETTER LAMDA
0x07EC  0x03BC          #GREEK SMALL LETTER MU
0x07ED  0x03BD          #GREEK SMALL LETTER NU
0x07EE  0x03BE          #GREEK SMALL LETTER XI
0x07EF  0x03BF          #GREEK SMALL LETTER OMICRON
0x07F0  0x03C0          #GREEK SMALL LETTER PI
0x07F1  0x03C1          #GREEK SMALL LETTER RHO
0x07F2  0x03C3          #GREEK SMALL LETTER SIGMA
0x07F3  0x03C2          #GREEK SMALL LETTER FINAL SIGMA
0x07F4  0x03C4          #GREEK SMALL LETTER TAU
0x07F5  0x03C5          #GREEK SMALL LETTER UPSILON
0x07F6  0x03C6          #GREEK SMALL LETTER PHI
0x07F7  0x03C7          #GREEK SMALL LETTER CHI
0x07F8  0x03C8          #GREEK SMALL LETTER PSI
0x07F9  0x03C9          #GREEK SMALL LETTER OMEGA


0x0AA1  0x2003      #EM SPACE        Publish
0x0AA2  0x2002      #EN SPACE        Publish
0x0AA3  0x2004      #3/EM SPACE      Publish
0x0AA4  0x2005      #4/EM SPACE      Publish
0x0AA5  0x2007      #DIGIT SPACE     Publish
0x0AA6  0x2008      #PUNCTUATION SPACE       Publish
0x0AA7  0x2009      #THIN SPACE      Publish
0x0AA8  0x200A      #HAIR SPACE      Publish
0x0AA9  0x2014      #EM DASH Publish
0x0AAA  0x2013      #EN DASH Publish
0x0AAC  0x2423      #SIGNIFICANT BLANK SYMBOL        Publish
0x0AAE  0x2026      #ELLIPSIS        Publish
0x0AAF  0x2025      #DOUBLE BASELINE DOT     Publish
0x0AB0  0x2153      #VULGAR FRACTION ONE THIRD       Publish
0x0AB1  0x2154      #VULGAR FRACTION TWO THIRDS      Publish
0x0AB2  0x2155      #VULGAR FRACTION ONE FIFTH       Publish
0x0AB3  0x2156      #VULGAR FRACTION TWO FIFTHS      Publish
0x0AB4  0x2157      #VULGAR FRACTION THREE FIFTHS    Publish
0x0AB5  0x2158      #VULGAR FRACTION FOUR FIFTHS     Publish
0x0AB6  0x2159      #VULGAR FRACTION ONE SIXTH       Publish
0x0AB7  0x215A      #VULGAR FRACTION FIVE SIXTHS     Publish
0x0AB8  0x2105      #CARE OF Publish
0x0ABB  0x2012      #FIGURE DASH     Publish
0x0ABC  0x3008      #LEFT ANGLE BRACKET      Publish
0x0ABD  0x002e      #DECIMAL POINT   Publish
0x0ABE  0x3009      #RIGHT ANGLE BRACKET     Publish
0x0AC3  0x215B      #VULGAR FRACTION ONE EIGHTH      Publish
0x0AC4  0x215C      #VULGAR FRACTION THREE EIGHTHS   Publish
0x0AC5  0x215D      #VULGAR FRACTION FIVE EIGHTHS    Publish
0x0AC6  0x215E      #VULGAR FRACTION SEVEN EIGHTHS   Publish
0x0AC9  0x2122      #TRADEMARK SIGN  Publish
0x0AD0  0x2018      #LEFT SINGLE QUOTATION MARK      Publish
0x0AD1  0x2019      #RIGHT SINGLE QUOTATION MARK     Publish
0x0AD2  0x201C      #LEFT DOUBLE QUOTATION MARK      Publish
0x0AD3  0x201D      #RIGHT DOUBLE QUOTATION MARK     Publish
0x0AD4  0x211E      #PRESCRIPTION, TAKE, RECIPE      Publish
0x0AD5  0x2030      #PER MILLE SIGN  Publish
0x0AD6  0x2032      #MINUTES Publish
0x0AD7  0x2033      #SECONDS Publish
0x0AD9  0x271D      #LATIN CROSS     Publish
0x0AEC  0x2663      #CLUB    Publish
0x0AED  0x2666      #DIAMOND Publish
0x0AEE  0x2665      #HEART   Publish
0x0AF0  0x2720      #MALTESE CROSS   Publish
0x0AF1  0x2020      #DAGGER  Publish
0x0AF2  0x2021      #DOUBLE DAGGER   Publish
0x0AF3  0x2713      #CHECK MARK, TICK        Publish
0x0AF4  0x2717      #BALLOT CROSS    Publish
0x0AF5  0x266F      #MUSICAL SHARP   Publish
0x0AF6  0x266D      #MUSICAL FLAT    Publish
0x0AF7  0x2642      #MALE SYMBOL     Publish
0x0AF8  0x2640      #FEMALE SYMBOL   Publish
0x0AF9  0x260E      #TELEPHONE SYMBOL        Publish
0x0AFA  0x2315      #TELEPHONE RECORDER SYMBOL       Publish
0x0AFB  0x2117      #PHONOGRAPH COPYRIGHT SIGN       Publish
0x0AFC  0x2038      #CARET   Publish
0x0AFD  0x201A      #SINGLE LOW QUOTATION MARK       Publish
0x0AFE  0x201E      #DOUBLE LOW QUOTATION MARK       Publish


0x0CDF  0x2017          #DOUBLE LOW LINE
0x0CE0  0x05D0          #HEBREW LETTER ALEF
0x0CE1  0x05D1          #HEBREW LETTER BET
0x0CE2  0x05D2          #HEBREW LETTER GIMEL
0x0CE3  0x05D3          #HEBREW LETTER DALET
0x0CE4  0x05D4          #HEBREW LETTER HE
0x0CE5  0x05D5          #HEBREW LETTER VAV
0x0CE6  0x05D6          #HEBREW LETTER ZAYIN
0x0CE7  0x05D7          #HEBREW LETTER HET
0x0CE8  0x05D8          #HEBREW LETTER TET
0x0CE9  0x05D9          #HEBREW LETTER YOD
0x0CEA  0x05DA          #HEBREW LETTER FINAL KAF
0x0CEB  0x05DB          #HEBREW LETTER KAF
0x0CEC  0x05DC          #HEBREW LETTER LAMED
0x0CED  0x05DD          #HEBREW LETTER FINAL MEM
0x0CEE  0x05DE          #HEBREW LETTER MEM
0x0CEF  0x05DF          #HEBREW LETTER FINAL NUN
0x0CF0  0x05E0          #HEBREW LETTER NUN
0x0CF1  0x05E1          #HEBREW LETTER SAMEKH
0x0CF2  0x05E2          #HEBREW LETTER AYIN
0x0CF3  0x05E3          #HEBREW LETTER FINAL PE
0x0CF4  0x05E4          #HEBREW LETTER PE
0x0CF5  0x05E5          #HEBREW LETTER FINAL TSADI
0x0CF6  0x05E6          #HEBREW LETTER TSADI
0x0CF7  0x05E7          #HEBREW LETTER QOF
0x0CF8  0x05E8          #HEBREW LETTER RESH
0x0CF9  0x05E9          #HEBREW LETTER SHIN
0x0CFA  0x05EA          #HEBREW LETTER TAV

0x0DA1  0x0E01          #THAI CHARACTER KO KAI
0x0DA2  0x0E02          #THAI CHARACTER KHO KHAI
0x0DA3  0x0E03          #THAI CHARACTER KHO KHUAT
0x0DA4  0x0E04          #THAI CHARACTER KHO KHWAI
0x0DA5  0x0E05          #THAI CHARACTER KHO KHON
0x0DA6  0x0E06          #THAI CHARACTER KHO RAKHANG
0x0DA7  0x0E07          #THAI CHARACTER NGO NGU
0x0DA8  0x0E08          #THAI CHARACTER CHO CHAN
0x0DA9  0x0E09          #THAI CHARACTER CHO CHING
0x0DAA  0x0E0A          #THAI CHARACTER CHO CHANG
0x0DAB  0x0E0B          #THAI CHARACTER SO SO
0x0DAC  0x0E0C          #THAI CHARACTER CHO CHOE
0x0DAD  0x0E0D          #THAI CHARACTER YO YING
0x0DAE  0x0E0E          #THAI CHARACTER DO CHADA
0x0DAF  0x0E0F          #THAI CHARACTER TO PATAK
0x0DB0  0x0E10          #THAI CHARACTER THO THAN
0x0DB1  0x0E11          #THAI CHARACTER THO NANGMONTHO
0x0DB2  0x0E12          #THAI CHARACTER THO PHUTHAO
0x0DB3  0x0E13          #THAI CHARACTER NO NEN
0x0DB4  0x0E14          #THAI CHARACTER DO DEK
0x0DB5  0x0E15          #THAI CHARACTER TO TAO
0x0DB6  0x0E16          #THAI CHARACTER THO THUNG
0x0DB7  0x0E17          #THAI CHARACTER THO THAHAN
0x0DB8  0x0E18          #THAI CHARACTER THO THONG
0x0DB9  0x0E19          #THAI CHARACTER NO NU
0x0DBA  0x0E1A          #THAI CHARACTER BO BAIMAI
0x0DBB  0x0E1B          #THAI CHARACTER PO PLA
0x0DBC  0x0E1C          #THAI CHARACTER PHO PHUNG
0x0DBD  0x0E1D          #THAI CHARACTER FO FA
0x0DBE  0x0E1E          #THAI CHARACTER PHO PHAN
0x0DBF  0x0E1F          #THAI CHARACTER FO FAN
0x0DC0  0x0E20          #THAI CHARACTER PHO SAMPHAO
0x0DC1  0x0E21          #THAI CHARACTER MO MA
0x0DC2  0x0E22          #THAI CHARACTER YO YAK
0x0DC3  0x0E23          #THAI CHARACTER RO RUA
0x0DC4  0x0E24          #THAI CHARACTER RU
0x0DC5  0x0E25          #THAI CHARACTER LO LING
0x0DC6  0x0E26          #THAI CHARACTER LU
0x0DC7  0x0E27          #THAI CHARACTER WO WAEN
0x0DC8  0x0E28          #THAI CHARACTER SO SALA
0x0DC9  0x0E29          #THAI CHARACTER SO RUSI
0x0DCA  0x0E2A          #THAI CHARACTER SO SUA
0x0DCB  0x0E2B          #THAI CHARACTER HO HIP
0x0DCC  0x0E2C          #THAI CHARACTER LO CHULA
0x0DCD  0x0E2D          #THAI CHARACTER O ANG
0x0DCE  0x0E2E          #THAI CHARACTER HO NOKHUK
0x0DCF  0x0E2F          #THAI CHARACTER PAIYANNOI
0x0DD0  0x0E30          #THAI CHARACTER SARA A
0x0DD1  0x0E31          #THAI CHARACTER MAI HAN-AKAT
0x0DD2  0x0E32          #THAI CHARACTER SARA AA
0x0DD3  0x0E33          #THAI CHARACTER SARA AM
0x0DD4  0x0E34          #THAI CHARACTER SARA I
0x0DD5  0x0E35          #THAI CHARACTER SARA II
0x0DD6  0x0E36          #THAI CHARACTER SARA UE
0x0DD7  0x0E37          #THAI CHARACTER SARA UEE
0x0DD8  0x0E38          #THAI CHARACTER SARA U
0x0DD9  0x0E39          #THAI CHARACTER SARA UU
0x0DDA  0x0E3A          #THAI CHARACTER PHINTHU
0x0DDF  0x0E3F          #THAI CURRENCY SYMBOL BAHT
0x0DE0  0x0E40          #THAI CHARACTER SARA E
0x0DE1  0x0E41          #THAI CHARACTER SARA AE
0x0DE2  0x0E42          #THAI CHARACTER SARA O
0x0DE3  0x0E43          #THAI CHARACTER SARA AI MAIMUAN
0x0DE4  0x0E44          #THAI CHARACTER SARA AI MAIMALAI
0x0DE5  0x0E45          #THAI CHARACTER LAKKHANGYAO
0x0DE6  0x0E46          #THAI CHARACTER MAIYAMOK
0x0DE7  0x0E47          #THAI CHARACTER MAITAIKHU
0x0DE8  0x0E48          #THAI CHARACTER MAI EK
0x0DE9  0x0E49          #THAI CHARACTER MAI THO
0x0DEA  0x0E4A          #THAI CHARACTER MAI TRI
0x0DEB  0x0E4B          #THAI CHARACTER MAI CHATTAWA
0x0DEC  0x0E4C          #THAI CHARACTER THANTHAKHAT
0x0DED  0x0E4D          #THAI CHARACTER NIKHAHIT
0x0DF0  0x0E50          #THAI DIGIT ZERO
0x0DF1  0x0E51          #THAI DIGIT ONE
0x0DF2  0x0E52          #THAI DIGIT TWO
0x0DF3  0x0E53          #THAI DIGIT THREE
0x0DF4  0x0E54          #THAI DIGIT FOUR
0x0DF5  0x0E55          #THAI DIGIT FIVE
0x0DF6  0x0E56          #THAI DIGIT SIX
0x0DF7  0x0E57          #THAI DIGIT SEVEN
0x0DF8  0x0E58          #THAI DIGIT EIGHT
0x0DF9  0x0E59          #THAI DIGIT NINE

0x13BC  0x0152          #LATIN CAPITAL LIGATURE OE
0x13BD  0x0153          #LATIN SMALL LIGATURE OE
0x13BE  0x0178          #LATIN CAPITAL LETTER Y WITH DIAERESIS

0x20A0  0x20A0          #CURRENCY ECU SIGN
0x20A1  0x20A1          #CURRENCY COLON SIGN
0x20A2  0x20A2          #CURRENCY CRUZEIRO SIGN
0x20A3  0x20A3          #CURRENCY FRENCH FRANC SIGN
0x20A4  0x20A4          #CURRENCY LIRA SIGN
0x20A5  0x20A5          #CURRENCY MILL SIGN
0x20A6  0x20A6          #CURRENCY NAIRA SIGN
0x20A7  0x20A7          #CURRENCY PESETA SIGN
0x20A8  0x20A8          #CURRENCY RUPEE SIGN
0x20A9  0x20A9          #CURRENCY WON SIGN
0x20AA  0x20AA          #CURRENCY NEW SHEQEL SIGN
0x20AB  0x20AB          #CURRENCY DONG SIGN
0x20AC  0x20AC          #CURRENCY EURO SIGN

Added freshlib/gui/Linux/__images/cursors.png.

cannot compute difference between binary files

Added freshlib/gui/Linux/application.asm.























































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TApplication object class.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes: TApplication by the idea is the base of GUI application, but the implementation
;         somehow need fixing...
;_________________________________________________________________________________________


uglobal
  if used appConn
    appConn xConnection

    var flagSharedMemory = ?

    var atomWMProtocols = ?
    wmProtocols:
      .atomWMDelete      dd ?
      .atomWMSyncRequest dd ?
      .atomWMPing        dd ?
      .count = ($ - wmProtocols)/4

    var atomWMSyncCounter = ?

    var atomState = ?
    var atomStateAbove = ?
    var atomStateModal = ?
    var atomStateMaximizedVert = ?
    var atomStateMaximizedHorz = ?
    var atomStateHidden = ?
    var atomStateSkipTaskbar = ?
    var atomStateSkipPager = ?

    var atomAllowedActions = ?
    var atomActionMove = ?
    var atomActionResize = ?
    var atomActionMinimize = ?
    var atomActionShade = ?
    var atomActionStick = ?
    var atomActionMaximizeHorz = ?
    var atomActionMaximizeVert = ?
    var atomActionFullscreen = ?
    var atomActionChangeDesktop = ?
    var atomActionClose = ?

    var atomWindowType = ?
    var atomWindowTypePopupMenu = ?
    var atomWindowTypeUtility = ?
    var atomWindowTypeToolbar = ?
    var atomWindowTypeMenu = ?
    var atomWindowTypeDialog = ?
    var atomWindowTypeNormal = ?
    var atomWindowTypeDock = ?

    var atomWindowName = ?
    var atomIcon = ?

    var atomClientLeader = ?

    var atomClipboard = ?
    var atomTargets = ?
    var atomStringUtf8 = ?

    var FTLibrary = ?
    var FTCManager = ?
    var FTCImageCache = ?
    var FTCCMapCache = ?

    var applicationClass = ? ; contains the application class name to be set to WM_CLASS property of the windows.

  end if
endg



iglobal
  if used allAtoms
  allAtoms      dd      cWMProtocols, atomWMProtocols
                dd      cWMDeleteWindow, wmProtocols.atomWMDelete
                dd      cNetWMSyncRequest, wmProtocols.atomWMSyncRequest
                dd      cNetWMPing, wmProtocols.atomWMPing
                dd      cNetWMSyncRequestCounter, atomWMSyncCounter
                dd      cNetWMState, atomState
                dd      cNetWMStateAbove, atomStateAbove
                dd      cNetWMStateModal, atomStateModal
                dd      cNetWMStateSkipTaskbar, atomStateSkipTaskbar
                dd      cNetWMStateSkipPager, atomStateSkipPager
                dd      cNetWMStateMaximizedVert, atomStateMaximizedVert
                dd      cNetWMStateMaximizedHorz, atomStateMaximizedHorz
                dd      cNetWMStateHidden, atomStateHidden
                dd      cNetWMWindowType, atomWindowType
                dd      cNetWMWindowTypePopupMenu, atomWindowTypePopupMenu
                dd      cNetWMWindowTypeUtility, atomWindowTypeUtility
                dd      cNetWMWindowTypeToolbar, atomWindowTypeToolbar
                dd      cNetWMWindowTypeMenu, atomWindowTypeMenu
                dd      cNetWMWindowTypeDialog, atomWindowTypeDialog
                dd      cNetWMWindowTypeNormal, atomWindowTypeNormal
                dd      cNetWMWindowTypeDock, atomWindowTypeDock
                dd      cNetWMWindowName, atomWindowName
                dd      cNetWMIcon, atomIcon
                dd      cWMClientLeader, atomClientLeader
                dd      cClipboard, atomClipboard
                dd      cTargets, atomTargets
                dd      cStringUtf8, atomStringUtf8
  .count = ($ - allAtoms)/8
  end if

  cWMProtocols               xAtom "WM_PROTOCOLS"
    cWMDeleteWindow            xAtom "WM_DELETE_WINDOW"
    cNetWMSyncRequest          xAtom "_NET_WM_SYNC_REQUEST"
    cNetWMPing                 xAtom "_NET_WM_PING"
    cNetWMSyncRequestCounter   xAtom "_NET_WM_SYNC_REQUEST_COUNTER"

  cNetWMState                xAtom "_NET_WM_STATE"
    cNetWMStateAbove           xAtom "_NET_WM_STATE_ABOVE"
    cNetWMStateModal           xAtom "_NET_WM_STATE_MODAL"
    cNetWMStateSkipTaskbar     xAtom "_NET_WM_STATE_SKIP_TASKBAR"
    cNetWMStateSkipPager       xAtom "_NET_WM_STATE_SKIP_PAGER"
    cNetWMStateMaximizedVert   xAtom "_NET_WM_STATE_MAXIMIZED_VERT"
    cNetWMStateMaximizedHorz   xAtom "_NET_WM_STATE_MAXIMIZED_HORZ"
    cNetWMStateHidden          xAtom "_NET_WM_STATE_HIDDEN"

  cNetWMWindowType           xAtom "_NET_WM_WINDOW_TYPE"
    cNetWMWindowTypePopupMenu  xAtom "_NET_WM_WINDOW_TYPE_POPUP_MENU"
    cNetWMWindowTypeUtility    xAtom "_NET_WM_WINDOW_TYPE_UTILITY"
    cNetWMWindowTypeToolbar    xAtom "_NET_WM_WINDOW_TYPE_TOOLBAR"
    cNetWMWindowTypeMenu       xAtom "_NET_WM_WINDOW_TYPE_MENU"
    cNetWMWindowTypeDialog     xAtom "_NET_WM_WINDOW_TYPE_DIALOG"
    cNetWMWindowTypeNormal     xAtom "_NET_WM_WINDOW_TYPE_NORMAL"
    cNetWMWindowTypeDock       xAtom "_NET_WM_WINDOW_TYPE_DOCK"

  cNetWMWindowName             xAtom "_NET_WM_NAME"
  cNetWMIcon                   xAtom "_NET_WM_ICON"

  cWMClientLeader            xAtom "WM_CLIENT_LEADER"

  cClipboard                 xAtom "CLIPBOARD"
  cTargets                   xAtom "TARGETS"
  cStringUtf8                xAtom "UTF8_STRING"

endg




proc InitGUIApplication
.ptr dd ?
.getmap    __xXkbGetMapReq
.selevents __xXkbSelectEventsReq
begin
        stdcall xOpenConnection, appConn, 32
        jc      .error_disp

        OutputValue "X server connection opened. Socket: ", [appConn.socket], 10, -1
        OutputValue "Root window: ", [appConn.rootID], 16, 8

; Creating InternAtom's that to be used with Window manager of the application windows...

        mov     esi, allAtoms
        mov     ecx, allAtoms.count

.atom_loop:
        stdcall xInternAtom, [esi]
        jc      .next_atom

        mov     edx, [esi+4]
        mov     [edx], eax

.next_atom:
        add     esi, 8
        loop    .atom_loop


;        stdcall InitMouseCursors
        stdcall InitMouseCursors2

; Extract the application filename and use it as WM_CLASS

        stdcall GetCmdArguments
        push    StrDel
        push    eax
        stdcall StrExtractFilename, [eax+TArray.array]  ; the first argument is the application name.
        stdcall ListFree ; from the stack

        mov     [applicationClass], eax

; XShm extension check

if defined options.DebugMode.DisableSHM & options.DebugMode.DisableSHM
        mov     [flagSharedMemory], 0
else
        mov     eax, [appConn.exShm.Active]
        mov     [flagSharedMemory], eax
end if

        OutputValue "MIT-SHM extension available:", [flagSharedMemory], 10, -1

        mov     eax, [appConn.exKbd.OpCode]
        mov     [.selevents.op], al
        mov     [.selevents.minor], opXkbSelectEvents
        mov     [.selevents.length], sizeof.__xXkbSelectEventsReq/4
        mov     [.selevents.deviceSpec], xkbUseCoreKbd
        mov     [.selevents.affectWhich], mxkbMapNotify; or mxkbCompatMapNotify
        mov     [.selevents.clear], 0
        mov     [.selevents.selectAll], mxkbMapNotify; or mxkbCompatMapNotify
        mov     [.selevents.affectMap], mxkbKeySyms
        mov     [.selevents.map], mxkbKeySyms

        lea     eax, [.selevents]
        stdcall xSend, appConn, eax

; Get the keyboard mapping

        mov     eax, [appConn.exKbd.OpCode]
        mov     [.getmap.op], al
        mov     [.getmap.minor], opXkbGetMap
        mov     [.getmap.length], sizeof.__xXkbGetMapReq/4
        mov     [.getmap.deviceSpec], xkbUseCoreKbd
        mov     [.getmap.full], mxkbKeySyms
        mov     [.getmap.partial], 0

        lea     eax, [.getmap]
        stdcall xSendWithCallback, appConn, eax, __IndexKeymap, 0

; Init freetype library.

        cinvoke FT_Init_FreeType, FTLibrary
        test    eax, eax
        jnz     .error_ft

        cinvoke FTC_Manager_New, [FTLibrary], 0, 0, 0, FTCRequester, 0, FTCManager
        cinvoke FTC_ImageCache_New, [FTCManager], FTCImageCache
        cinvoke FTC_CMapCache_New, [FTCManager], FTCCMapCache

; clipboard initialization.
if __UseClipboard = 1
        stdcall   __InitLinuxClipboard
end if

        clc
        return

.error_ft:

        DebugMsg 'Error initializing FreeType library.'
        jmp      .exit_error

.error_disp:
        DebugMsg 'Error open display.'

.exit_error:
        stc
        return

endp



proc TerminateGUI
begin
        DebugMsg "Terminate GUI"

        stdcall FreeMouseCursors
        stdcall xCloseConnection, appConn
        stdcall StrDel, [applicationClass]

        return
endp



proc CloseGUIApplication
begin
        inc     [fGlobalTerminate]
        return
endp

Added freshlib/gui/Linux/clipboard.asm.







































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Clipboard management library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


if used ClipboardRead | used ClipboardWrite
  __UseClipboard = 1
else
  __UseClipboard = 0
end if

; Clipboard data type constants.

clipboardNull   = 0    ; empty clipboard.
clipboardString = 1
clipboardBinary = 2

struct TClipboard
  .type   dd  ?
  .Length dd  ?
  .mutex  TMutex

  label .data byte
ends



uglobal
  var pClipboard = 0            ; String handle with the clipboard text.
  var __idClipboardWindow = 0
endg


body ClipboardType
begin
        mov     eax, [pClipboard]
        test    eax, eax
        jz      .finish

        mov     eax, [eax+TClipboard.type]

.finish:
        return
endp



body ClipboardRead
begin
        stdcall __StringFromClipboard, [pClipboard]
        return
endp



body ClipboardWrite   ; .hstring
.sso __xSetSelectionOwnerReq
begin
        pushad

        stdcall StrLen, [.hstring]
        mov     ecx, eax

        stdcall StrPtr, [.hstring]

        stdcall __ClipboardFromMem, eax, ecx, clipboardString
        jc      .finish

        xchg    eax, [pClipboard]
        stdcall __ClipboardFree, eax

        mov     eax, [__idClipboardWindow]
        mov     edx, [atomClipboard]

        mov     [.sso.op], opSetSelectionOwner
        mov     [.sso.length], sizeof.__xSetSelectionOwnerReq/4
        mov     [.sso.owner], eax
        mov     [.sso.selection], edx
        mov     [.sso.time], 0    ; CurrentTime
        lea     eax, [.sso]
        stdcall xSend, appConn, eax

        clc

.finish:
        popad
        return
endp



proc __ClipboardCreate, .datalength
begin
        push    ecx

        mov     ecx, [.datalength]
        lea     eax, [ecx+sizeof.TClipboard]
        add     eax, 3
        and     al, $fc         ; align 4 bytes
        stdcall GetMem, eax
        jc      .finish

        lea     ecx, [eax+TClipboard.mutex]
        stdcall MutexCreate, 0, ecx
        stdcall MutexRelease, ecx
        clc

.finish:
        pop     ecx
        return
endp



proc __ClipboardFree, .pClipboard
begin
        push    eax ebx esi

        mov     esi, [.pClipboard]
        test    esi, esi
        jz      .finish

        lea     ebx, [esi+TClipboard.mutex]
        stdcall WaitForMutex, ebx, 1000
        stdcall MutexDestroy, ebx

        stdcall FreeMem, esi

.finish:
        pop     esi ebx eax
        return
endp



proc __ClipboardLock, .pClipboard
begin
        push    eax
        mov     eax, [.pClipboard]
        lea     eax, [eax+TClipboard.mutex]
        stdcall WaitForMutex, eax, 1000
        pop     eax
        return
endp



proc __ClipboardUnlock, .pClipboard
begin
        push    eax
        mov     eax, [.pClipboard]
        lea     eax, [eax+TClipboard.mutex]
        stdcall MutexRelease, eax
        pop     eax
        return
endp



proc __ClipboardFromMem, .pMemory, .length, .type
begin
        pushad

        mov     ecx, [.length]
        mov     esi, [.pMemory]

        stdcall __ClipboardCreate, ecx
        jc      .finish

        mov     ebx, [.type]
        mov     [eax+TClipboard.type], ebx
        mov     [eax+TClipboard.Length], ecx

        lea     edi, [eax+TClipboard.data]

        mov     ebx, ecx
        shr     ecx, 2
        rep movsd

        mov     ecx, ebx
        and     ecx, 3
        rep movsb

        mov     [esp+4*regEAX], eax
        clc

.finish:
        popad
        return
endp



proc __StringFromClipboard, .pClipboard
begin
        push    esi

        xor     eax, eax
        mov     esi, [.pClipboard]
        test    esi, esi
        jz      .error

        stdcall __ClipboardLock, esi
        jc      .error

        stdcall StrExtractMem, esi, TClipboard.data, [esi+TClipboard.Length]
        stdcall __ClipboardUnlock, esi

        clc
        pop     esi
        return

.error:
        stc
        pop     esi
        return
endp





proc  __InitLinuxClipboard
.win  __xCreateWindowReq
.ev   __xfixSelectSelectionInputReq
.conv __xConvertSelectionReq
begin
        pushad

        mov     [.win.op], opCreateWindow
        mov     [.win.depth], 0
        mov     [.win.length], sizeof.__xCreateWindowReq/4

        stdcall xGetID, appConn, __idClipboardWindow

        push    eax

        mov     ebx, [appConn.rootID]
        xor     ecx, ecx
        mov     edx, [appConn.visualID]

        mov     [.win.wid], eax
        mov     [.win.parent], ebx
        mov     [.win.x], cx
        mov     [.win.y], cx
        mov     [.win.border], cx
        inc     ecx
        mov     [.win.w], cx
        mov     [.win.h], cx
        mov     [.win.class], InputOnly
        mov     [.win.visid], edx
        mov     [.win.attr_mask], 0

        mov     [.ev.window], eax

        lea     eax, [.win]
        stdcall xSend, appConn, eax

        mov     eax, [appConn.exFixes.OpCode]
        mov     edx, [atomClipboard]

        mov     [.ev.op], al
        mov     [.ev.minor], opFixSelectSelectionInput
        mov     [.ev.length], sizeof.__xfixSelectSelectionInputReq/4
        mov     [.ev.selection], edx
        mov     [.ev.event_mask], maskFixSetSelectionOwner

; subscribe for XFIXES event SetSelectionOwner
        lea     eax, [.ev]
        stdcall xSend, appConn, eax

        pop     [__idClipboardWindow]
        OutputValue "Clipboard window created: ", [__idClipboardWindow], 16, 8

; Send the first opConvertSelection request in order to start the clipboard engine.

        mov     eax, [__idClipboardWindow]
        mov     ebx, [atomClipboard]
        mov     ecx, [atomStringUtf8]

        mov     [.conv.op], opConvertSelection
        mov     [.conv.length], sizeof.__xConvertSelectionReq/4
        mov     [.conv.requestor], eax
        mov     [.conv.selection], ebx
        mov     [.conv.target], ecx
        mov     [.conv.property], atomCUT_BUFFER0  ; reuse predefined atoms!
        and     [.conv.time], 0

        lea     eax, [.conv]
        stdcall xSend, appConn, eax


        popad
        return
endp


Added freshlib/gui/Linux/keycodes.inc.





























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: This file contains scan code values for control keyboard keys.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

keyHomeNumpad   = $ff95
keyUpNumpad     = $ff97
keyPgUpNumpad   = $ff9a
keyLeftNumpad   = $ff96
key5Numpad      = $ff9d
keyRightNumpad  = $ff98
keyEndNumpad    = $ff9c
keyDownNumpad   = $ff99
keyPgDnNumpad   = $ff9b
keyInsNumpad    = $ff9e
keyDelNumpad    = $ff9f
keyEnterNumpad  = $ff8d
keyPlusNumpad   = $ffab
keyMinusNumpad  = $ffad
keyAsteriskNumpad = $ffaa
keySlashNumpad  = $ffaf

keyNumLock      = $ff7f
keyScrollLock   = $ff14
keyPause        = $ff13


keyLeft         = $ff51
keyRight        = $ff53
keyUp           = $ff52
keyDown         = $ff54

keyInsert       = $ff63
keyDelete       = $ffff
keyHome         = $ff50
keyEnd          = $ff57
keyPgUp         = $ff55
keyPgDown       = $ff56

keyF1           =  $ffbe
keyF2           =  $ffbf
keyF3           =  $ffc0
keyF4           =  $ffc1

keyF5           =  $ffc2
keyF6           =  $ffc3
keyF7           =  $ffc4
keyF8           =  $ffc5

keyF9           =  $ffc6
keyF10          =  $ffc7
keyF11          =  $ffc8
keyF12          =  $ffc9

keyCapsLock     = $ffe5
keyShiftLeft    = $ffe1
keyCtrlLeft     = $ffe3
;keyWndLeft     =
;keyWndRight    =
keyAltLeft      = $ffe9
keyAltRight     = $ffea
keyPopupMenu    = $ff67
keyShiftRight   = $ffe2
keyCtrlRight    = $ffe4
keyBackSpace    = $ff08

keyTab          = $ff09
keyLeftTab      = $fe20
keyEscape       = $ff1b
keyEnter        = $ff0d

keySpace        = ' '

keyA            = 'a'
keyB            = 'b'
keyC            = 'c'
keyD            = 'd'
keyE            = 'e'
keyF            = 'f'
keyG            = 'g'
keyH            = 'h'
keyI            = 'i'
keyJ            = 'j'
keyK            = 'k'
keyL            = 'l'
keyM            = 'm'
keyN            = 'n'
keyO            = 'o'
keyP            = 'p'
keyQ            = 'q'
keyR            = 'r'
keyS            = 's'
keyT            = 't'
keyU            = 'u'
keyV            = 'v'
keyW            = 'w'
keyX            = 'x'
keyY            = 'y'
keyZ            = 'z'


Added freshlib/gui/Linux/mouse.asm.































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Provides unified access to standard mouse cursors.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

uses xcursor

iglobal
  if used _Xcursors
    _Xcursors db 68, 152, 34, 108, 116, 40, 40, 150, 58, 52, 86   ; X standard cursor font
  end if

  getfile _Xcursors2, "%lib%/gui/Linux/__images/cursors.png"
  _XcursorsXY db 1, 1  ; mcArrow
              db 3, 8  ; mcText
              db 11,11 ; mcCross
              db 13,13 ; mcSizeH
              db 13,13 ; mcSizeV
              db 13,13 ; mcSizeUL_LR
              db 13,13 ; mcSizeLL_UR
              db 7, 11 ; mcWait
              db 1, 1  ; mcArrowWait
              db 6, 3  ; mcHand
              db 12, 3 ; mcDragHand
              db 1, 30 ; mcPencil
endg


uglobal
  if used StockCursors
    StockCursors rd mcCount
  end if
endg


proc InitMouseCursors
.fnt __xOpenFontReq
     rd 2

.cc  __xCreateGlyphCursorReq
begin
        push    eax ebx ecx edx

        stdcall xGetID, appConn, objXFont
        mov     ecx, eax

        mov     [.fnt.op], opOpenFont
        mov     [.fnt.length], sizeof.__xOpenFontReq/4 + 2
        mov     [.fnt.fontid], ecx
        mov     [.fnt.namelen], 6       ;'cursor'
        mov     dword [.fnt.name], 'curs'
        mov     dword [.fnt.name+4], 'or'
        lea     eax, [.fnt]
        stdcall xSend, appConn, eax

        xor     eax, eax
        dec     eax
        mov     [.cc.op], opCreateGlyphCursor
        mov     [.cc.length], sizeof.__xCreateGlyphCursorReq/4
        mov     [.cc.cursorid], eax
        mov     [.cc.src_font], ecx
        mov     [.cc.mask_font], ecx
        mov     [.cc.fg_red], ax
        mov     [.cc.fg_green], ax
        mov     [.cc.fg_blue], ax
        inc     eax
        mov     [.cc.bg_red], ax
        mov     [.cc.bg_green], ax
        mov     [.cc.bg_blue], ax

        mov     ebx, mcCount-1

.create_cursor_loop:
        movzx   eax, [_Xcursors+ebx]
        mov     [.cc.src_char], ax
        inc     ax
        mov     [.cc.mask_char], ax

        stdcall xGetID, appConn, objCursor
        mov     [StockCursors+4*ebx], eax
        mov     [.cc.cursorid], eax

        lea     eax, [.cc]
        stdcall xSend, appConn, eax

        dec     ebx
        jns     .create_cursor_loop

; close the font.
        mov     [.fnt.op], opCloseFont
        mov     [.fnt.length], sizeof.__xFreeCursorReq/4

        lea     eax, [.fnt]
        stdcall xSend, appConn, eax
        stdcall xFreeID, appConn, ecx

        pop     edx ecx ebx eax
        return
endp


proc InitMouseCursors2

.cc    __xCreateCursorReq
.px    __xCreatePixmapReq
.pxm   __xCreatePixmapReq
.fr    __xFreePixmapReq
.frm   __xFreePixmapReq

.img  dd ?
begin
        push    eax ebx ecx edx

        stdcall CreateImagePNG, _Xcursors2, _Xcursors2.size
        mov     [.img], eax

; create pixmaps

        mov     [.px.op], opCreatePixmap
        mov     [.pxm.op], opCreatePixmap
        mov     [.fr.op], opFreePixmap
        mov     [.frm.op], opFreePixmap

        mov     [.px.depth], 1
        mov     [.pxm.depth], 1

        mov     [.px.length], sizeof.__xCreatePixmapReq/4
        mov     [.pxm.length], sizeof.__xCreatePixmapReq/4
        mov     [.fr.length], sizeof.__xFreePixmapReq/4
        mov     [.frm.length], sizeof.__xFreePixmapReq/4

        stdcall xGetID, appConn, objPixmap

        mov     [.px.pid], eax
        mov     [.fr.pid], eax
        mov     [.cc.source], eax

        stdcall xGetID, appConn, objPixmap

        mov     [.pxm.pid], eax
        mov     [.frm.pid], eax
        mov     [.cc.mask], eax

        mov     edx, [appConn.rootID]
        mov     [.px.drawable], edx
        mov     [.pxm.drawable], edx

        mov     [.px.width], 32
        mov     [.px.height], 32
        mov     [.pxm.width], 32
        mov     [.pxm.height], 32

        lea     eax, [.px]
        stdcall xSend, appConn, eax

        lea     eax, [.pxm]
        stdcall xSend, appConn, eax

        xor     edi, edi
        xor     ebx, ebx

.loop:
; put the image on the pixmaps.

        stdcall __xPutImageToBitmap, [.px.pid], [.img], edi, 0, 0, 0, 32, 32
        add     edi, 32
        stdcall __xPutImageToBitmap, [.pxm.pid], [.img], edi, 0, 0, 0, 32, 32
        add     edi, 32

; create the cursor from the pixmap.
        stdcall xGetID, appConn, objCursor

        mov     [.cc.op], opCreateCursor
        mov     [.cc.length], sizeof.__xCreateCursorReq/4

        mov     [.cc.cursorid], eax
        mov     [StockCursors+4*ebx], eax

        mov     [.cc.fg_red], $ffff
        mov     [.cc.fg_green], $ffff
        mov     [.cc.fg_blue], $ffff
        mov     [.cc.bg_red], $0000
        mov     [.cc.bg_green], $0000
        mov     [.cc.bg_blue], $0000

        movzx   eax, [_XcursorsXY+2*ebx]
        movzx   edx, [_XcursorsXY+2*ebx+1]

        mov     [.cc.x], ax
        mov     [.cc.y], dx

        lea     eax, [.cc]
        stdcall xSend, appConn, eax

        inc     ebx
        cmp     ebx, mcCount
        jne     .loop

; free the image

        stdcall DestroyImage, [.img]


; free the pixmaps
        lea     eax, [.fr]
        stdcall xSend, appConn, eax

        lea     eax, [.frm]
        stdcall xSend, appConn, eax

        stdcall xFreeID, appConn, [.fr.pid]
        stdcall xFreeID, appConn, [.frm.pid]

        pop     edx ecx ebx eax
        return
endp






proc FreeMouseCursors
.fc __xFreeCursorReq
begin
        mov     ebx, mcCount-1

        mov     [.fc.op], opFreeCursor
        mov     [.fc.length], sizeof.__xFreeCursorReq/4
        lea     esi, [.fc]

.free_cursor_loop:
        mov     eax, [StockCursors+4*ebx]
        mov     [.fc.cursor], eax

        stdcall xFreeID, appConn, eax
        stdcall xSend, appConn, esi

        dec     ebx
        jns     .free_cursor_loop

DebugMsg "Mouse cursors destroyed."
        return
endp



body SetMouseCursor     ;, .hWindow, .hCursor
.attr __xChangeWindowAttributesReq
      dd ?
begin
        push    eax edx

        mov     eax, [.hWindow]
        mov     edx, [.hCursor]

        mov     [.attr.op], opChangeWindowAttributes
        mov     [.attr.length], sizeof.__xChangeWindowAttributesReq/4 + 1
        mov     [.attr.window], eax
        mov     [.attr.mask], maskCursor
        mov     [.attr.values], edx

        lea     eax, [.attr]
        stdcall xSend, appConn, eax

        pop     edx eax
        return
endp



body GetStockCursor     ;, .index
begin
        mov     eax, [.index]
        cmp     eax, mcCount
        jb      @f
        xor     eax, eax
@@:
        mov     eax, [StockCursors+4*eax]
        return
endp



body __MouseCapture ; .hwnd
begin
        return
endp



body ZeroMouseMove
.wrp __xWarpPointerReq
begin
        push    eax ecx edi

        mov     ecx, sizeof.__xWarpPointerReq/4
        lea     edi, [.wrp]
        xor     eax, eax
        rep stosd

        mov     [.wrp.op], opWarpPointer
        mov     [.wrp.length], sizeof.__xWarpPointerReq/4

        lea     edi, [.wrp]
        stdcall xSend, appConn, edi

        pop     edi ecx eax
        return
endp

Added freshlib/gui/Linux/windows.asm.











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Window management OS interface functions.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

include "xraw.asm"

struct __xCreateFreshWindowReq
  .  __xCreateWindowReq

  .BrPixel    dd ?     ; border color
  .ovr_redir  dd ?     ; override redirect
  .event_mask dd ?     ; event mask
  .colormap   dd ?     ; color map ID
  .cursor     dd ?
ends


body _CreateWindow
.create __xCreateFreshWindowReq
.map    __xMapWindowReq
.cnt    __xCreateCounterReq
.gc     __xCreateContextReq
.change __xChangePropertyReq
.prop   rd 16       ; MUST be immediately after .change
begin
        pushad

        mov     esi, [.pWindow]
;        OutputValue "_CreateWindow for TWindow: ", esi, 16, 8

; create the window
        stdcall xGetID, appConn, esi
        mov     [.create.wid], eax
        mov     [.map.wid], eax
        mov     [.change.wid], eax
        mov     [.gc.drawable], eax
        mov     [esp+4*regEAX], eax             ; return value

        mov     [.create.op], opCreateWindow
        mov     [.map.op], opMapWindow
        mov     [.map.length], sizeof.__xMapWindowReq/4


        mov     eax, [appConn.colormap]
        mov     ecx, [appConn.visualID]
        mov     edx, [appConn.rootID]

        mov     [.create.colormap], eax
        mov     [.create.visid], ecx
        mov     [.create.parent], edx

        mov     [.create.attr_mask], maskBorderPixel or maskOverrideRedirect or maskEventMask or maskColorMap or maskCursor
        mov     [.create.length], sizeof.__xCreateFreshWindowReq/4

; border

        mov     ecx, [esi+TWindow._border]
        test    ecx, ecx                        ; borderNone = 0
        setz    al
        movzx   eax, al
        mov     [.create.ovr_redir], eax

        and     ecx, $3
        mov     eax, [.types+4*ecx]
        mov     eax, [eax]
        mov     [.prop], eax

        mov     [.create.event_mask],  maskExposure or maskFocusChange or       \
                                       maskKeyPress or maskKeyRelease or        \
                                       maskButtonPress or maskButtonRelease or  \
                                       maskEnterWindow or maskLeaveWindow or    \
                                       maskPointerMotion or maskStructureNotify or \
                                       maskPropertyChange

        mov     eax, [GUI.clDialogBk]
        mov     [.create.BrPixel], eax

        mov     eax, [esi+TWindow._x]
        mov     ebx, [esi+TWindow._y]
        mov     ecx, [esi+TWindow._width]
        mov     edx, [esi+TWindow._height]

        mov     [.create.x], ax
        mov     [.create.y], bx
        mov     [.create.w], cx
        mov     [.create.h], dx

        stdcall GetStockCursor, [esi+TWindow._cursor]
        mov     [.create.cursor], eax

        mov     [.create.depth], $20
        mov     [.create.border], 0
        mov     [.create.class], InputOutput

        lea     eax, [.create]
        stdcall xSend, appConn, eax

; Set _NET_WM_WINDOW_TYPE
        mov     [.change.op], opChangeProperty
        mov     [.change.mode], PropModeReplace
        mov     [.change.length], 7

        mov     eax, [atomWindowType]           ; _NET_WM_WINDOW_TYPE
        mov     [.change.prop], eax
        mov     [.change.type], atomATOM
        mov     [.change.format], 32
        mov     [.change.datalen], 1

        lea     eax, [.change]
        stdcall xSend, appConn, eax

; Set WM_NORMAL_HINTS

;        mov     [.change.prop], atomWM_NORMAL_HINTS
;        mov     [.change.type], atomWM_SIZE_HINTS
;        mov     [.change.length], 3 + 6
;        mov     [.change.datalen], 3
;        mov     [.prop], 4      ; PProgram - program specified position
;        mov     eax, [esi+TWindow._x]
;        mov     ecx, [esi+TWindow._y]
;        mov     [.prop+4], eax
;        mov     [.prop+8], ecx
;
;        lea     eax, [.change]
;        stdcall xSend, appConn, eax

; Set window protocols.
        mov     eax, [atomWMProtocols]
        mov     [.change.prop], eax
        mov     [.change.type], atomATOM
        mov     [.change.length], 6 + wmProtocols.count
        mov     [.change.datalen], wmProtocols.count

        stdcall xReqStart, appConn
        lea     eax, [.change]
        stdcall xReqSend, appConn, eax, sizeof.__xChangePropertyReq
        stdcall xReqSend, appConn, wmProtocols, 4*wmProtocols.count
        stdcall xReqEnd, appConn

; Set window caption.

        mov     [.change.prop], atomWM_NAME
        mov     [.change.type], atomSTRING
        mov     [.change.format], 8

        mov     eax, [esi+TWindow._caption]
        test    eax, eax
        jz      .caption_ok

        stdcall StrLen, eax
        test    eax, eax
        jz      .caption_ok

        lea     ecx, [eax+3]
        shr     ecx, 2
        mov     [.change.datalen], eax  ; in bytes
        lea     eax, [ecx+6]
        mov     [.change.length], ax

        stdcall xReqStart, appConn

        lea     eax, [.change]
        stdcall xReqSend, appConn, eax, sizeof.__xChangePropertyReq

        shl     ecx, 2

        stdcall StrPtr, [esi+TWindow._caption]
        stdcall xReqSend, appConn, eax, ecx
        stdcall xReqEnd, appConn

.caption_ok:
; set window class

        cmp     [applicationClass], 0
        je      .class_ok

        mov     [.change.mode], PropModeAppend
        mov     [.change.prop], atomWM_CLASS

        stdcall StrLen, [applicationClass]
        inc     eax
        lea     ecx, [eax+3]
        shr     ecx, 2
        mov     [.change.datalen], eax  ; in bytes
        lea     eax, [ecx+6]
        mov     [.change.length], ax

        stdcall xReqStart, appConn

        lea     eax, [.change]
        stdcall xReqSend, appConn, eax, sizeof.__xChangePropertyReq

        shl     ecx, 2
        jz      .class_ok1

        stdcall StrPtr, [applicationClass]
        stdcall xReqSend, appConn, eax, ecx

.class_ok1:
        stdcall xReqEnd, appConn

        stdcall xReqStart, appConn

        lea     eax, [.change]
        stdcall xReqSend, appConn, eax, sizeof.__xChangePropertyReq

        stdcall StrPtr, [applicationClass]
        stdcall xReqSend, appConn, eax, ecx

        stdcall xReqEnd, appConn

.class_ok:

; Set window icons

        mov     edx, [esi+TWindow._winicons]
        test    edx, edx
        jz      .icons_ok

        mov     ecx, [edx+TArray.count]

.loop:
        dec     ecx
        js      .icons_ok

        stdcall _AddWindowIcon, [.change.wid], [edx+TArray.array + 4*ecx]
        jmp     .loop

.icons_ok:

; create graphic context

        mov     [.gc.op], opCreateGC
        mov     [.gc.length], sizeof.__xCreateContextReq/4

        stdcall xGetID, appConn, objContext
        mov     [.gc.gcID], eax
        mov     [esi+TWindow.context], eax
        mov     [.gc.value_mask], 0

;        DebugMsg "Graphic context is about to be created."

        lea     eax, [.gc]
        stdcall xSend, appConn, eax

;        DebugMsg "Graphic context created."

; create sync counter
        mov     eax, [appConn.exSync.OpCode]
        mov     [.cnt.op], al
        mov     [.cnt.minor], opCreateCounter
        mov     [.cnt.length], sizeof.__xCreateCounterReq/4

        stdcall xGetID, appConn, objCounter
        mov     [.cnt.counterID], eax
        mov     [esi+TWindow.sync_counter], eax
        mov     [.prop], eax

        xor     eax, eax
        mov     [.cnt.valueHi], eax
        mov     [.cnt.valueLo], eax

        lea     eax, [.cnt]
        stdcall xSend, appConn, eax

; set property _NET_WM_SYNC_REQUEST_COUNTER

        mov     eax, [atomWMSyncCounter]
        mov     [.change.mode], PropModeReplace
        mov     [.change.prop], eax
        mov     [.change.type], atomCARDINAL
        mov     [.change.format], 32
        mov     [.change.datalen], 1
        mov     [.change.length], 7

        lea     eax, [.change]
        stdcall xSend, appConn, eax

; Set transient-for if the owner is set.

        mov     ebx, [esi+TWindow.__owner]
        test    ebx, ebx
        jz      .no_owner

        istype  ebx, TWindow
        jne     .no_owner

        mov     eax, [ebx+TWindow.handle]
        test    eax, eax
        jz      .no_owner

        mov     [.prop], eax
        mov     [.change.prop], atomWM_TRANSIENT_FOR
        mov     [.change.type], atomWINDOW
        mov     [.change.length], 7
        mov     [.change.datalen], 1

        lea     eax, [.change]
        stdcall xSend, appConn, eax

.no_owner:

; map the window at the end.

        lea     eax, [.map]
        stdcall xSend, appConn, eax

        popad
        return


.types  dd  atomWindowTypePopupMenu, atomWindowTypeNormal, atomWindowTypeDialog, atomWindowTypeToolbar


endp

;_________________________________________________________________________________________

body _MoveWindow
.conf __xConfigureWindowReq
.params rd 4
begin
        pushad
        mov     esi, [.pWindow]

        mov     eax, [esi+TWindow.handle]
        test    eax, eax
        jz      .error

        mov     [.conf.op], opConfigureRequest
        mov     [.conf.length], 3+2
        mov     [.conf.window], eax
        mov     [.conf.value_mask], cwmX or cwmY

        mov     ecx, [esi+TWindow._x]
        mov     edx, [esi+TWindow._y]
        mov     [.conf.params], ecx
        mov     [.conf.params+4], edx

        lea     eax, [.conf]
        stdcall xSend, appConn, eax

        clc
        popad
        return

.error:
        stc
        popad
        return
endp


body _ResizeWindow
.conf __xConfigureWindowReq
.params rd 4
begin
        pushad
        mov     esi, [.pWindow]

        mov     eax, [esi+TWindow.handle]
        test    eax, eax
        jz      .error

        mov     [.conf.op], opConfigureRequest
        mov     [.conf.length], 3+2
        mov     [.conf.window], eax
        mov     [.conf.value_mask], cwmWidth or cwmHeight

        mov     ecx, [esi+TWindow._width]
        mov     edx, [esi+TWindow._height]
        mov     [.conf.params], ecx
        mov     [.conf.params+4], edx

        lea     eax, [.conf]
        stdcall xSend, appConn, eax

        clc
        popad
        return

.error:
        stc
        popad
        return
endp


;_________________________________________________________________________________________



body _DestroyWindow
.req __xDestroyWindowReq
.gc  __xFreeContextReq
.cnt __xDestroyCounterReq
begin
        push    eax ecx edx

        mov     [.req.op], opDestroyWindow
        mov     [.req.length], 2

        mov     edx, [.hwnd]
        mov     [.req.wid], edx

        lea     eax, [.req]
        stdcall xSend, appConn, eax

        stdcall xFreeID, appConn, edx   ; returns the previous object pointer.
        mov     edx, eax

        xor     eax, eax
        xchg    eax, [edx+TWindow.sync_counter]
        test    eax, eax
        jz      .counter_ok

        mov     [.cnt.counterID], eax
        stdcall xFreeID, appConn, eax

        mov     eax, [appConn.exSync.OpCode]
        mov     [.cnt.op], al
        mov     [.cnt.minor], opDestroyCounter
        mov     [.cnt.length], sizeof.__xDestroyCounterReq/4

        lea     eax, [.cnt]
        stdcall xSend, appConn, eax

.counter_ok:
        xor     eax, eax
        xchg    eax, [edx+TWindow.context]
        test    eax, eax
        jz      .finish

        mov     [.gc.op], opFreeGC
        mov     [.gc.length], sizeof.__xFreeContextReq/4
        mov     [.gc.gcID], eax

        stdcall xFreeID, appConn, eax

        lea     eax, [.gc]
        stdcall xSend, appConn, eax

.finish:
        pop     edx ecx eax
        return
endp



;_________________________________________________________________________________________


;body _RefreshWindowRect
;.exp __xSendEventReq
;.ev  evExpose
;begin
;        push    eax ecx edx
;
;        mov     eax, [.x]
;        mov     ecx, [.y]
;        mov     [.ev.x], ax
;        mov     [.ev.y], cx
;
;        mov     [.ev.event], Expose
;
;        mov     eax, [.width]
;        mov     ecx, [.height]
;        mov     [.ev.width], ax
;        mov     [.ev.height], cx
;
;        mov     eax, [.hwnd]
;        mov     [.ev.window], eax
;        mov     [.exp.dest], eax
;
;        xor     eax, eax
;        mov     [.ev.count], ax
;
;        mov     [.exp.op], opSendEvent
;        mov     [.exp.propagate], 0
;        mov     [.exp.length], (sizeof.__xSendEventReq + sizeof.evExpose)/4
;        mov     [.exp.event_mask], 0
;
;        lea     ecx, [.exp]
;        stdcall xSend, appConn, ecx
;
;        pop     edx ecx eax
;        return
;endp



body _RefreshWindowRect
.clr __xClearAreaReq
begin
        push    eax ecx edx

        mov     eax, [.x]
        mov     ecx, [.y]
        mov     [.clr.x], ax
        mov     [.clr.y], cx

        mov     [.clr.op], opClearArea
        mov     [.clr.exposures], TRUE
        mov     [.clr.length], sizeof.__xClearAreaReq/4

        mov     eax, [.width]
        mov     ecx, [.height]
        mov     [.clr.width], ax
        mov     [.clr.height], cx

        mov     eax, [.hwnd]
        mov     [.clr.window], eax

        lea     ecx, [.clr]
        stdcall xSend, appConn, ecx

        pop     edx ecx eax
        return
endp


;_________________________________________________________________________________________


body _SetWindowTextUtf8
.prop __xChangePropertyReq
begin
        push    eax ebx ecx edx

        mov     edx, [.hString]
        test    edx, edx
        jz      .finish

        mov     eax, [.hwnd]
        mov     ecx, [atomWindowName]
        mov     ebx, [atomStringUtf8]

        mov     [.prop.op], opChangeProperty
        mov     [.prop.mode], PropModeReplace
        mov     [.prop.length], sizeof.__xChangePropertyReq/4   ; the name length addred below.
        mov     [.prop.wid], eax
        mov     [.prop.prop], ecx
        mov     [.prop.type], ebx
        mov     [.prop.format], 8

        stdcall StrLen, edx
        mov     [.prop.datalen], eax
        add     eax, 3
        shr     eax, 2  ; in dwords
        add     [.prop.length], ax
        lea     ecx, [4*eax]

        stdcall xReqStart, appConn
        lea     eax, [.prop]
        stdcall xReqSend, appConn, eax, sizeof.__xChangePropertyReq

        stdcall StrPtr, edx
        stdcall xReqSend, appConn, eax, ecx

        stdcall xReqEnd, appConn

.finish:
        pop     edx ecx ebx eax
        return
endp

;_________________________________________________________________________________________


body _SetModalTowards
.prop   __xChangePropertyReq
        rd 2
begin
        push    eax ecx edx

        mov     [.prop.op], opChangeProperty
        mov     [.prop.mode], PropModeReplace
        mov     [.prop.length], sizeof.__xChangePropertyReq/4 + 1

        mov     eax, [.hwnd]
        mov     edx, [.hwndParent]
        mov     [.prop.wid], eax
        mov     [.prop.prop], atomWM_TRANSIENT_FOR
        mov     [.prop.type], atomWINDOW
        mov     [.prop.format], 32
        mov     [.prop.datalen], 1
        mov     [.prop.data], edx

        lea     ebx, [.prop]
        stdcall xSend, appConn, ebx

; With this property the modal windows are displayed as a separate window
; in the window manager which is not very good
;
        mov     [.prop.mode], PropModeAppend
        mov     eax, [atomState]
        mov     ecx, [atomStateModal]
        mov     [.prop.prop], eax
        mov     [.prop.type], atomATOM
        mov     [.prop.data], ecx

        stdcall xSend, appConn, ebx

        mov     ecx, [atomStateSkipTaskbar]
        mov     [.prop.data], ecx

        stdcall xSend, appConn, ebx

        mov     ecx, [atomStateSkipPager]
        mov     [.prop.data], ecx

        stdcall xSend, appConn, ebx

        pop     edx ecx eax
        return
endp


;_________________________________________________________________________________________



body _FinalizeModal
begin
        return
endp


;_________________________________________________________________________________________

; does not accepts 0 for .hwnd

body _SetFocus
  .focus __xSetInputFocus
begin
        push    eax

        mov     eax, [.hwnd]
        test    eax, eax
        jz      .finish

        mov     [.focus.op], opSetInputFocus
        mov     [.focus.revert_to], 2   ; 0 = None, 1 = PointerRoot, 2 = Parent
        mov     [.focus.length], 3
        mov     [.focus.wid], eax
        mov     [.focus.timestamp], 0

        lea     eax, [.focus]
        stdcall xSend, appConn, eax

.finish:
        pop     eax
        return
endp


;_________________________________________________________________________________________


body _SetWindowState
.req __xSendEventReq
.msg evClientMessage
begin
        pushad

        mov     esi, [.pWindow]

        mov     [.req.op], opSendEvent
        mov     [.req.propagate], 0
        mov     [.req.length], (sizeof.__xSendEventReq + sizeof.evClientMessage)/4
        mov     eax, [appConn.rootID]
        mov     [.req.dest], eax
        mov     [.req.event_mask], maskSubstructureNotify

        mov     eax, [esi+TWindow.handle]
        mov     edx, [atomState]

        test    eax, eax
        jz      .error

        mov     [.msg.event], ClientMessage
        mov     [.msg.format], 32
        mov     [.msg.seq], 0
        mov     [.msg.window], eax
        mov     [.msg.type], edx

        mov     eax, [atomStateMaximizedVert]
        mov     ebx, [atomStateMaximizedHorz]
        xor     edx, edx
        xor     ecx, ecx
        inc     ecx     ; 1 == add state
        test    [esi+TWindow._window_state], wstMaximizedVert or wstMaximizedHorz
        cmovz   ecx, edx ; 0 == remove

        mov     [.msg.data], ecx        ; operation add or remove
        mov     [.msg.data+4], eax
        mov     [.msg.data+8], ebx
        mov     [.msg.data+12], edx
        mov     [.msg.data+16], edx

        lea     eax, [.req]
        stdcall xSend, appConn, eax

        mov     eax, [atomStateHidden]
        xor     ecx, ecx
        inc     ecx     ; 1 == add state
        test    [esi+TWindow._window_state], wstMinimized
        cmovz   ecx, edx ; 0 == remove

        mov     [.msg.data], ecx        ; operation add or remove
        mov     [.msg.data+4], eax
        mov     [.msg.data+8], edx

        lea     eax, [.req]
        stdcall xSend, appConn, eax

.finish:
        clc
        popad
        return

.error:
        stc
        popad
        return

endp




body _GetScreenSize
begin
        mov     eax, [appConn.size_x_px]
        mov     ebx, [appConn.size_y_px]
        return
endp







;_________________________________________________________________________________________

proc _AddWindowIcon, .wID, .pImage
.change __xChangePropertyReq
begin
        pushad

        mov     eax, [.wID]
        mov     ebx, [atomIcon]
        mov     esi, [.pImage]

        mov     [.change.op], opChangeProperty
        mov     [.change.mode], PropModePrepend
        mov     [.change.wid], eax
        mov     [.change.prop], ebx
        mov     [.change.type], atomCARDINAL
        mov     [.change.format], 32

        mov     ecx, [esi+TImage.width]
        imul    ecx, [esi+TImage.height]
        add     ecx, 2  ; width and height

        mov     [.change.datalen], ecx ; in dwords.

        add     ecx, 6
        mov     [.change.length], cx

        stdcall xReqStart, appConn

        lea     eax, [.change]
        stdcall xReqSend, appConn, eax, sizeof.__xChangePropertyReq

        lea     eax, [esi+TImage.width]
        stdcall xReqSend, appConn, eax, 4       ; width

        lea     eax, [esi+TImage.height]
        stdcall xReqSend, appConn, eax, 4       ; width

        mov     ecx, [esi+TImage.width]
        imul    ecx, [esi+TImage.height]
        shl     ecx, 2
        stdcall xReqSend, appConn, [esi+TImage.pPixels], ecx

        stdcall xReqEnd, appConn

        popad
        return
endp



Added freshlib/gui/Linux/xraw.asm.











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Main procedure of GUI application library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes: Organize the main message/event loop needed by every GUI engine.
;_________________________________________________________________________________________

module "xraw library"


xPath text "/tmp/.X11-unix/X"
xBasePort = 6000


struct xConnection
  .socket       dd  ?
  .host         dd  ?
  .disp         dd  ?
  .fRemote      dd  ?

  .id_base      dd  ?
  .id_mask      dd  ?
  .min_keycode  dd  ?
  .max_keycode  dd  ?
  .screenID     dd  ?
  .rootID       dd  ?
  .visualID     dd  ?
  .colormap     dd  ?
  .id_list      dd  ?

  .size_x_px    dd  ?
  .size_y_px    dd  ?

  .wait_timeout dd  ?
  .Sequence     dd  ?

  .pFCallback   dd  ?
  .pLCallback   dd  ?

  .exBig        xExtension
  .exSync       xExtension
  .exShm        xExtension
  .exKbd        xExtension
  .exFixes      xExtension

  .mutex_rd     TMutex
  .mutex_wr     TMutex

  .pKeymap      dd ?    ; pointer to last __xXkbGetMapRep replay + keycode index ahead.
ends


struct xCallback
  .p_next   dd ?
  .sequence dd ?
  .proc     dd ?
  .lparam   dd ?
ends


iglobal
  qeBigRequests xQueryExtension "BIG-REQUESTS"
  qeSync        xQueryExtension "SYNC"
  qeMitShm      xQueryExtension "MIT-SHM"
  qeKeyboard    xQueryExtension "XKEYBOARD"
  qeFixes       xQueryExtension "XFIXES"
endg


WAIT_FOR_XREQUEST_TIMEOUT = 100   ; 100ms for now.


interface xCallbackProc, .pReply, .lparam

; Sends fully prepared request to the server.

proc xSend, .pConnection, .pRequest
begin
        pushad

        mov     edi, [.pConnection]
        mov     esi, [.pRequest]

        stdcall xReqStart, edi

        movzx   ecx, [esi+xRequest.length]
        test    ecx, ecx
        cmovz   ecx, [esi+xBigRequest.biglen]
        lea     ecx, [4*ecx]

.send_loop:
        stdcall SocketSend, [edi+xConnection.socket], esi, ecx, 0
        jc      .finish  ; Some error processing?

        add     esi, eax
        sub     ecx, eax
        jnz     .send_loop


.finish:
        stdcall xReqEnd, edi
        popad
        return
endp


proc xSendWithCallback, .pConnection, .pRequest, .ReplyCallback, .lparam
begin
        pushad

        mov     edi, [.pConnection]
        mov     esi, [.pRequest]

        stdcall xReqStart, edi

        movzx   ecx, [esi+xRequest.length]
        test    ecx, ecx
        cmovz   ecx, [esi+xBigRequest.biglen]
        lea     ecx, [4*ecx]

.send_loop:
        stdcall SocketSend, [edi+xConnection.socket], esi, ecx, 0
        jc      .finish  ; Some error processing?

        add     esi, eax
        sub     ecx, eax
        jnz     .send_loop


.finish:
        stdcall xReqEndCallback, edi, [.ReplyCallback], [.lparam]
        popad
        return
endp



; Receives one reply, error ot event from the server.

proc xRecv, .pConnection, .fBlocking
begin
        pushad
        mov     esi, [.pConnection]

        lea     eax, [esi+xConnection.mutex_rd]
        stdcall WaitForMutex, eax, [esi+xConnection.wait_timeout]
        jc      .timeout

        stdcall GetMem, sizeof.xAnyReply
        jc      .error_mem
        mov     edi, eax

        mov     ebx, edi
        mov     ecx, sizeof.xResponse

        mov     eax, MSG_WAITALL

        cmp     [.fBlocking], 0
        jne     .read_loop

        mov     eax, MSG_DONTWAIT

.read_loop:
        stdcall SocketReceive, [esi+xConnection.socket], ebx, ecx, eax
        jc      .error

        add     ebx, eax
        sub     ecx, eax
        mov     eax, MSG_WAITALL  ; if the read is started, wait for the whole response.
        jnz     .read_loop

        cmp     byte [edi+xResponse.code], rspReply
        jne     .all_received

; process a reply here

        mov     ecx, [edi+xAnyReply.length]
        shl     ecx, 2
        jz      .all_received

        lea     eax, [ecx+sizeof.xResponse]
        stdcall ResizeMem, edi, eax
        mov     edi, eax

        lea     ebx, [edi+sizeof.xResponse]

.read_data_loop:
        stdcall SocketReceive, [esi+xConnection.socket], ebx, ecx, MSG_WAITALL
        jc      .error

        add     ebx, eax
        sub     ecx, eax
        jnz     .read_data_loop

.all_received:
        clc

.finish:
        mov     [esp+4*regEAX], edi

        lea     eax, [esi+xConnection.mutex_rd]
        stdcall MutexRelease, eax

        popad
        return

.error:
        stdcall FreeMem, edi

.error_mem:
        xor     edi, edi
        stc
        jmp     .finish

.timeout:
        xor     edi, edi
        clc
        mov     [esp+4*regEAX], edi
        popad
        return
endp



; Starts a request that can be sent by several writes to the socket.

proc xReqStart, .pConnection
begin
        push    eax
        mov     eax, [.pConnection]

        push    [eax+xConnection.wait_timeout]
        lea     eax, [eax+xConnection.mutex_wr]
        stdcall WaitForMutex, eax ; timeout from the stack.

        pop     eax
        return
endp


; Sends a part of the request to the socket. The full request can be sent by several calls to xReqSend

proc xReqSend, .pConnection, .pRequest, .length
begin
        push    eax
        mov     eax, [.pConnection]
        stdcall SocketSend, [eax+xConnection.socket], [.pRequest], [.length], 0
        pop     eax
        return
endp


; Ends the request without callback.
proc xReqEnd, .pConnection
begin
        push    esi eax

        mov     esi, [.pConnection]

        xor     eax, eax
        inc     eax
        lock xadd [esi+xConnection.Sequence], eax

        lea     eax, [esi+xConnection.mutex_wr]
        stdcall MutexRelease, eax

        pop     eax esi
        return
endp



; Finalizes a request. Increments the sequence number. Unlocks the write socket, optionally registers a callback for the reply (if any).

proc xReqEndCallback, .pConnection, .ReplyCallback, .lparam
begin
        pushad
        mov     esi, [.pConnection]

        xor     ebx, ebx
        inc     ebx
        lock xadd [esi+xConnection.Sequence], ebx
        inc     ebx      ; the sequence number of the current request.

        cmp     [.ReplyCallback], 0
        je      .callback_ok

        stdcall GetMem, sizeof.xCallback
        mov     edi, eax

; fill all the fields of the xCallback record.
        xor     eax, eax
        mov     ecx, [.ReplyCallback]
        mov     edx, [.lparam]

        mov     [edi+xCallback.p_next], eax
        mov     [edi+xCallback.sequence], ebx
        mov     [edi+xCallback.proc], ecx
        mov     [edi+xCallback.lparam], edx

; now atomically replace the last element in the queue.
        mov     eax, edi
        xchg    [esi+xConnection.pLCallback], eax       ; xConnection.pLCallback always contains valid pointer.

; if there is a previous last element, try to follow it to the end and attach the record as next.
; although, it is possible that in this moment, there are already other elements in the chain, because of other threads.
; i.e. in this point the [edi+xCallback.p_next] is possibly already <> 0
.loop_last:
        mov     ecx, eax
        xor     eax, eax
        lock cmpxchg [ecx+xCallback.p_next], edi
        jne     .loop_last

.callback_ok:
        lea     eax, [esi+xConnection.mutex_wr]
        stdcall MutexRelease, eax

        popad
        return
endp





proc xOpenConnection, .pConnection, .depth
.disp      dd ?
.name      dd ?
.data      dd ?
.req       __xBeginReq
.resp      __xConnectServerInfo
.pmore     dd ?
.req_map   __xCreateColorMapReq
.ext_resp  xReply
begin
        pushad

        xor     eax, eax
        mov     [.disp], eax
        mov     [.name], eax
        mov     [.data], eax
        mov     [.pmore], eax

        mov     edi, [.pConnection]

        lea     eax, [edi+xConnection.mutex_rd]
        stdcall MutexCreate, 0, eax

        lea     eax, [edi+xConnection.mutex_wr]
        stdcall MutexCreate, 0, eax

        mov     [edi+xConnection.wait_timeout], WAIT_FOR_XREQUEST_TIMEOUT

        lea     eax, [edi+xConnection.pFCallback]       ; this is a little big tricky
        mov     [edi+xConnection.pLCallback], eax       ; the .pFCallback field will be threated as a xCallback element on adding new elements.


        stdcall __xConnectToServer, edi
        jc      .sock_closed

        OutputValue "Server connected! Socket: ", [edi+xConnection.socket], 10, -1

        and     [edi + xConnection.Sequence], 0

        stdcall __xSearchForAuth, [edi+xConnection.disp]
        mov     [.name], eax
        mov     [.data], edx

if defined options.DebugMode & options.DebugMode
        test    eax, eax
        jz      @f

        stdcall FileWriteString, [STDERR], txt "Name string: "
        stdcall FileWriteString, [STDERR], [.name]
        stdcall FileWriteString, [STDERR], <txt 13, 10>

        stdcall FileWriteString, [STDERR], <txt "Data string: ", 13, 10>
        stdcall StrPtr, [.data]
        stdcall OutputMemoryByte, eax, [eax+string.len]

@@:
end if

        mov     [.req.byte_order], 'l'
        mov     [.req.ver_major], 11
        mov     [.req.ver_minor], 0

        mov     ecx, [.name]
        test    ecx, ecx
        jz      .cookie_ok

        stdcall StrLen, ecx
        mov     ecx, eax

.cookie_ok:
        mov     edx, [.data]
        test    edx, edx
        jz      .data_ok

        stdcall StrLen, edx
        mov     edx, eax

.data_ok:
        mov     [.req.auth_proto_len], cx
        mov     [.req.auth_data_len], dx

        lea     eax, [.req]
        stdcall SocketSend, [edi+xConnection.socket], eax, sizeof.__xBeginReq, 0
        jc      .error_close_sock

        test    ecx, ecx
        jz      .cookie_sent

        add     ecx, 3
        and     ecx, $fffffffc
        stdcall StrPtr, [.name]

        stdcall SocketSend, [edi+xConnection.socket], eax, ecx, 0        ; the string always can be aligned to dword
        jc      .error_close_sock

.cookie_sent:
        test    edx, edx
        jz      .data_sent

        add     edx, 3
        and     edx, $fffffffc
        stdcall StrPtr, [.data]

        stdcall SocketSend, [edi+xConnection.socket], eax, edx, 0
        jc      .error_close_sock

.data_sent:
        DebugMsg "Start request sent!"

        lea     eax, [.resp]
        stdcall SocketReceive, [edi+xConnection.socket], eax, sizeof.__xConnectServerInfo, MSG_WAITALL
        jc      .error_close_sock

        cmp     eax, sizeof.__xConnectServerInfo
        jb      .error_close_sock

        cmp     [.resp.resp], 1
        jne     .connection_failed

        DebugMsg "Response OK!"

        movzx   ecx, [.resp.data_length]
        shl     ecx, 2

        stdcall GetMem, ecx
        mov     [.pmore], eax
        mov     esi, eax

        stdcall SocketReceive, [edi+xConnection.socket], esi, ecx, MSG_WAITALL
        jc      .error_close_sock

        cmp     eax, ecx
        jne     .error_close_sock

        DebugMsg "Additional info received!"

        mov     eax, [esi+__xConnectAdditionalInfo.res_id_base]
        mov     edx, [esi+__xConnectAdditionalInfo.res_id_mask]
        mov     [edi+xConnection.id_base], eax
        mov     [edi+xConnection.id_mask], edx

        movzx   eax, [esi+__xConnectAdditionalInfo.min_keycode]
        movzx   edx, [esi+__xConnectAdditionalInfo.max_keycode]
        mov     [edi+xConnection.min_keycode], eax
        mov     [edi+xConnection.max_keycode], edx

        lea     edx, [esi+__xConnectAdditionalInfo.stream_data]
        movzx   eax, [esi+__xConnectAdditionalInfo.len_vendor]
        add     eax, 3
        and     eax, $fffffffc
        add     edx, eax                ; skip the vendor string.

        movzx   eax, [esi+__xConnectAdditionalInfo.format_num]
        lea     edx, [edx+8*eax]        ; the start of the screens list.

        movzx   ecx, [esi+__xConnectAdditionalInfo.screen_num]

.screen_loop:
        mov     eax, [edx + __xscreen.root_window]
        mov     [edi+xConnection.rootID], eax

        movzx   eax, [edx+__xscreen.width_px]
        mov     [edi+xConnection.size_x_px], eax
        movzx   eax, [edx+__xscreen.height_px]
        mov     [edi+xConnection.size_y_px], eax

        mov     ch, [edx + __xscreen.num_depths]
        lea     edx, [edx + __xscreen.depths]

.depth_loop:
        movzx   eax, [edx + __xdepth.depth]
        cmp     eax, [.depth]
        je      .depth_found

        movzx   eax, [edx + __xdepth.num_visual]
        lea     eax, [3*eax]
        lea     edx, [edx+8*eax+sizeof.__xdepth]  ; on the next depth.

.next_depth:
        dec     ch
        jnz     .depth_loop

        dec     cl
        jnz     .screen_loop

.depth_not_found:
        jmp     .error_close_sock

.depth_found:
        DebugMsg "Depth found!"

        movzx   eax,  [edx + __xdepth.num_visual]
        lea     edx, [edx + __xdepth.visual_types]

.vis_loop:
        cmp     [edx + __xvisualtype.class], TrueColor
        je      .visual_found

        add     edx, sizeof.__xvisualtype
        dec     eax
        jnz     .vis_loop
        jmp     .next_depth

.visual_found:

        DebugMsg "Visual found!"

        mov     eax, [edx + __xvisualtype.id]
        mov     [edi+xConnection.visualID], eax

; Query all needed extensions.

        stdcall xSend, edi, qeBigRequests

        lea     esi, [.ext_resp]
        stdcall SocketReceive, [edi+xConnection.socket], esi, 32, MSG_WAITALL

        cmp     [esi+xRespQueryExt.reply], rspReply
        jne     .big_requests_ok

        lea     eax, [edi+xConnection.exBig]
        stdcall __CopyExtensionParameters, eax, esi

; enable Big Requests extension.
        mov     eax, [edi+xConnection.exBig.OpCode]
        mov     [esi+xRequest.op], al
        mov     [esi+xRequest.minor], 0
        mov     [esi+xRequest.length], 1

        stdcall xSend, edi, esi

        stdcall SocketReceive, [edi+xConnection.socket], esi, 32, MSG_WAITALL

        OutputValue "Big requests extension OpCode: ", [edi+xConnection.exBig.OpCode], 10, -1

.big_requests_ok:

        stdcall xSend, edi, qeSync
        stdcall SocketReceive, [edi+xConnection.socket], esi, 32, MSG_WAITALL

        cmp     [esi+xRespQueryExt.reply], rspReply
        jne     .sync_ok

        lea     eax, [edi+xConnection.exSync]
        stdcall __CopyExtensionParameters, eax, esi

        mov     eax, [edi+xConnection.exSync.OpCode]
        mov     [esi+xRequest.op], al
        mov     [esi+xRequest.minor], 0
        mov     [esi+xRequest.length], 2
        mov     [esi+xRequest.data], 3
        mov     [esi+xRequest.data+1], 1

        stdcall xSend, edi, esi
        stdcall SocketReceive, [edi+xConnection.socket], esi, 32, MSG_WAITALL

        OutputValue "Sync extension OpCode: ", [edi+xConnection.exSync.OpCode], 10, -1

.sync_ok:
; MIT-SHM extension. Check it only if not remote connection
        cmp     [edi+xConnection.fRemote], 0
        jne     .shm_ok

        stdcall xSend, edi, qeMitShm
        stdcall SocketReceive, [edi+xConnection.socket], esi, 32, MSG_WAITALL

        cmp     [esi+xRespQueryExt.reply], rspReply
        jne     .shm_ok

        lea     eax, [edi+xConnection.exShm]
        stdcall __CopyExtensionParameters, eax, esi

        ; ShmQueryVersion
        mov     eax, [edi+xConnection.exShm.OpCode]
        mov     [esi+xRequest.op], al
        mov     [esi+xRequest.minor], opShmEnable
        mov     [esi+xRequest.length], 1

        stdcall xSend, edi, esi
        stdcall SocketReceive, [edi+xConnection.socket], esi, 32, MSG_WAITALL

        OutputValue "MIT-SHM extension OpCode: ", [edi+xConnection.exShm.OpCode], 10, -1

.shm_ok:
        stdcall xSend, edi, qeKeyboard
        stdcall SocketReceive, [edi+xConnection.socket], esi, 32, MSG_WAITALL

        cmp     [esi+xRespQueryExt.reply], rspReply
        jne     .xkeyboard_ok

        lea     eax, [edi+xConnection.exKbd]
        stdcall __CopyExtensionParameters, eax, esi

        mov     eax, [edi+xConnection.exKbd.OpCode]
        mov     [esi+xRequest.op], al
        mov     [esi+xRequest.minor], opXkbUseExtension
        mov     [esi+xRequest.length], 2
        mov     word [esi+xRequest.data], 1     ; major version
        mov     word [esi+xRequest.data+2], 0   ; minor version

        stdcall xSend, edi, esi
        stdcall SocketReceive, [edi+xConnection.socket], esi, 32, MSG_WAITALL

        OutputValue "XKEYBOARD extension OpCode: ", [edi+xConnection.exKbd.OpCode], 10, -1
        OutputValue "XKEYBOARD extension Event: ", [edi+xConnection.exKbd.FirstEvent], 10, -1
        OutputMemoryByte esi, 32

.xkeyboard_ok:
; XFIXES extension
        stdcall xSend, edi, qeFixes
        stdcall SocketReceive, [edi+xConnection.socket], esi, 32, MSG_WAITALL

        cmp     [esi+xRespQueryExt.reply], rspReply
        jne     .xfixes_ok

        lea     eax, [edi+xConnection.exFixes]
        stdcall __CopyExtensionParameters, eax, esi

        mov     eax, [edi+xConnection.exFixes.OpCode]
        mov     [esi+__xfixQueryVersionReq.op], al
        mov     [esi+__xfixQueryVersionReq.minor], opfixQueryVersion
        mov     [esi+__xfixQueryVersionReq.length], sizeof.__xfixQueryVersionReq/4
        mov     [esi+__xfixQueryVersionReq.client_major_version], 5   ; major version
        mov     [esi+__xfixQueryVersionReq.client_minor_version], 0   ; minor version

        stdcall xSend, edi, esi
        stdcall SocketReceive, [edi+xConnection.socket], esi, 32, MSG_WAITALL

        OutputValue "XFIXES extension OpCode: ", [edi+xConnection.exFixes.OpCode], 10, -1
        OutputValue "XFIXES extension Event: ", [edi+xConnection.exFixes.FirstEvent], 10, -1
        OutputMemoryByte esi, 32

.xfixes_ok:

; create color map.

        mov     [.req_map.op], opCreateColorMap
        mov     [.req_map.alloc], AllocNone
        mov     [.req_map.length], sizeof.__xCreateColorMapReq/4

        stdcall xGetID, edi, objColorMap
        mov     [.req_map.map_id], eax
        mov     [edi+xConnection.colormap], eax

        mov     eax, [edi+xConnection.rootID]
        mov     edx, [edi+xConnection.visualID]
        mov     [.req_map.win_id], eax
        mov     [.req_map.vis_id], edx

        lea     ebx, [.req_map]
        stdcall xSend, edi, ebx

        clc

; finalize and release the mutexes.

.finish:
        pushf

        lea     eax, [edi+xConnection.mutex_rd]
        stdcall MutexRelease, eax
        lea     eax, [edi+xConnection.mutex_wr]
        stdcall MutexRelease, eax

        stdcall StrDel, [.name]
        stdcall StrDel, [.data]
        stdcall FreeMem, [.pmore]

        popf
        popad
        return

.connection_failed:
.error_close_sock:

        xor     eax, eax
        xchg    eax, [edi+xConnection.socket]
        test    eax, eax
        jz      .sock_closed

        stdcall SocketClose, eax

.sock_closed:
        lea     eax, [edi+xConnection.mutex_rd]
        stdcall MutexDestroy, eax
        lea     eax, [edi+xConnection.mutex_wr]
        stdcall MutexDestroy, eax

        stdcall StrDel, [.name]
        stdcall StrDel, [.data]
        stdcall FreeMem, [.pmore]

        stc
        popad
        return
endp




proc xCloseConnection, .pConnection
begin
        DebugMsg "Close connection!"

        push    ecx edx

        mov     edx, [.pConnection]

        xor     ecx, ecx
        xchg    ecx, [edx+xConnection.socket]
        test    ecx, ecx
        jz      .sock_ok

        stdcall SocketShutDown, ecx
        stdcall SocketClose, ecx

.sock_ok:
        stdcall StrDel, [edx+xConnection.host]

        xor     ecx, ecx
        xchg    ecx, [edx+xConnection.id_list]
        stdcall FreeMem, ecx

        lea     ecx, [edx+xConnection.mutex_rd]
        stdcall MutexDestroy, ecx

        lea     ecx, [edx+xConnection.mutex_wr]
        stdcall MutexDestroy, ecx

        pop     edx ecx
        return
endp




proc __CopyExtensionParameters, .extension, .server_resp
begin
        pushad
        mov     esi, [.server_resp]
        mov     edi, [.extension]

        movzx   eax, [esi+xRespQueryExt.present]
        movzx   ebx, [esi+xRespQueryExt.OpCode]
        movzx   ecx, [esi+xRespQueryExt.first_event]
        movzx   edx, [esi+xRespQueryExt.first_error]

        mov     [edi+xExtension.Active], eax
        mov     [edi+xExtension.OpCode], ebx
        mov     [edi+xExtension.FirstEvent], ecx
        mov     [edi+xExtension.FirstError], edx

        popad
        return
endp



proc __xConnectToServer, .pConnection
.addr:   rb sizeof.TSocketAddressUn
begin
        pushad

        xor     eax, eax

        lea     edi, [.addr]
        mov     ecx, sizeof.TSocketAddressUn
        rep stosb

        mov     edi, [.pConnection]

        mov     [edi+xConnection.host], eax
        mov     [edi+xConnection.disp], eax
        mov     [edi+xConnection.fRemote], eax

        stdcall GetEnvVariable, txt "DISPLAY"
        jnc     .addr_ok
        stdcall StrDupMem, txt ":0.0"
.addr_ok:
        mov     ebx, eax
        stdcall StrPtr, eax
        mov     esi, eax
        xor     ecx, ecx

.loop1:
        mov     al, [esi+ecx]

        test    al, al
        jz      .host_fin

        cmp     al, ':'
        je      .host_found

        inc     ecx
        jmp     .loop1

.host_found:
        test    ecx, ecx
        jz      .host_ok

        stdcall StrNew
        mov     [edi+xConnection.host], eax
        stdcall StrCatMem, eax, esi, ecx

.host_ok:
        lea     esi, [esi+ecx+1]

.host_fin:
        xor     ecx, ecx

.loop2:
        mov     al, [esi+ecx]

        test    al, al
        jz      .disp_found

        cmp     al, '.'
        je      .disp_found

        inc     ecx
        jmp     .loop2

.disp_found:

        test    ecx, ecx
        jz      .disp_ok

        stdcall StrNew
        push    eax
        stdcall StrCatMem, eax, esi, ecx
        stdcall StrToNumEx, eax
        stdcall StrDel ; from the stack

        mov     [edi+xConnection.disp], eax

.disp_ok:
        stdcall StrDel, ebx
        cmp     [edi+xConnection.host], 0
        je      .unix_sock

        stdcall StrPos, [edi+xConnection.host], txt "/unix"
        test    eax, eax
        jnz     .unix_sock

        inc     [edi+xConnection.fRemote]

        mov     [.addr + TSocketAddressIn.saFamily], AF_INET6

        stdcall ResolveDomainIP6, [edi+xConnection.host]
        jc      .finish

        mov     [.addr + TSocketAddressIn6.saAddress.addr32], eax
        mov     [.addr + TSocketAddressIn6.saAddress.addr32+4], ebx
        mov     [.addr + TSocketAddressIn6.saAddress.addr32+8], ecx
        mov     [.addr + TSocketAddressIn6.saAddress.addr32+12], edx

        mov     eax, [edi+xConnection.disp]
        add     eax, xBasePort
        xchg    al, ah
        mov     [.addr + TSocketAddressIn6.saPort], ax

        jmp     .connect


.unix_sock:
        mov     [.addr + TSocketAddressUn.saFamily], AF_UNIX
        stdcall StrDupMem, xPath
        mov     ebx, eax

        stdcall NumToStr, [edi+xConnection.disp], ntsDec or ntsUnsigned
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax

        push    edi

        lea     edi, [.addr + TSocketAddressUn.saPath]
        stdcall StrPtr, ebx
        mov     ecx, [eax+string.len]
        mov     esi, eax
        inc     ecx

        rep movsb

        stdcall StrDel, ebx
        pop     edi

.connect:
        movzx   eax, [.addr + TSocketAddress.saFamily]
        stdcall SocketCreate, eax, SOCK_STREAM, 0
        jc      .finish

        mov     [edi+xConnection.socket], eax

        lea     ecx, [.addr]
        stdcall SocketConnect, [edi+xConnection.socket], ecx
        jc      .error_close_sock

.finish:
        popad
        return

.error_close_sock:
        stdcall SocketClose, ebx
        stc
        jmp     .finish

endp




xAuth text "/.Xauthority"


; returns magic cookie in eax and edx

proc __xSearchForAuth, .disp
.xauth  dd ?
.name   dd ?
.data   dd ?
begin
        pushad

        xor     eax, eax
        mov     [.xauth], eax
        mov     [.name], eax
        mov     [.data], eax

        stdcall GetEnvVariable, txt "XAUTHORITY"
        jnc     .auth_file

        stdcall GetEnvVariable, txt "HOME"
        jc      .end_of_file

        stdcall StrCatMem, eax, xAuth, xAuth.length

.auth_file:
        push    eax
        stdcall LoadBinaryFile, eax
        stdcall StrDel ; from the stack
        jc      .end_of_file

        mov     [.xauth], eax

        mov     esi, eax
        lea     ebx, [esi+ecx] ; the end of the file.

.loop:
        xor     eax, eax
        lodsw

        cmp     esi, ebx
        jae     .end_of_file

        lodsw
        xchg    al, ah  ; host string length.

        add     esi, eax                ; skip the host string.
        cmp     esi, ebx
        jae     .end_of_file

        lodsw
        xchg    al, ah  ; display number length

        mov     edx, ebx
        sub     edx, esi

        cmp     eax, edx
        jae     .end_of_file

        mov     edx, eax
        stdcall StrNew
        stdcall StrCatMem, eax, esi, edx
        push    eax
        stdcall StrToNumEx, eax
        stdcall StrDel ; from the stack

        add     esi, edx
        cmp     esi, ebx
        jae     .end_of_file

        cmp     eax, [.disp]
        je      .auth_found

; skip the name and the data
        xor     eax, eax
        lodsw
        xchg    al, ah          ; the length of the name
        add     esi, eax
        cmp     esi, ebx
        jae     .end_of_file

        lodsw
        xchg    al, ah
        add     esi, eax
        cmp     esi, ebx
        jb      .loop

.end_of_file:
        stdcall FreeMem, [.xauth]
        stdcall StrDel, [.name]
        popad

        xor     eax, eax
        xor     edx, edx
        return

.auth_found:

        lodsw
        xchg    al, ah
        movzx   edx, ax

        mov     eax, ebx
        sub     eax, esi
        cmp     edx, eax
        ja      .end_of_file

        stdcall StrNew
        mov     [.name], eax
        stdcall StrCatMem, eax, esi, edx

        add     esi, edx
        cmp     esi, ebx
        jae     .end_of_file

        lodsw
        xchg    al, ah
        movzx   edx, ax

        mov     eax, ebx
        sub     eax, esi
        cmp     edx, eax
        ja      .end_of_file

        stdcall StrNew
        mov     [.data], eax
        stdcall StrCatMem, eax, esi, edx

        stdcall FreeMem, [.xauth]
        popad
        clc
        mov     eax, [.name]
        mov     edx, [.data]
        return
endp


ID_SEARCH_ONE_ATTEMPT = 100


proc xGetID, .conn, .obj
begin
        pushad

        mov     edi, [.conn]
        lea     eax, [edi+xConnection.mutex_wr]
        stdcall WaitForMutex, eax, -1

        mov     edx, [edi+xConnection.id_list]
        test    edx, edx
        jnz     @f

        stdcall CreateArray, 4
        mov     edx, eax
@@:

; Search for first empty place.
        mov     ecx, ID_SEARCH_ONE_ATTEMPT       ; search only limited count of items
        cmp     ecx, [edx+TArray.count]
        cmova   ecx, [edx+TArray.count]
        mov     esi,[edx+TArray.lparam]
        xor     eax,eax

.search:
        dec     ecx
        js      .notfound

        inc     esi
        cmp     esi, [edx+TArray.count]
        cmovae  esi, eax

        cmp     [edx+TArray.array+4*esi], eax
        je      .found
        jmp     .search

.notfound:
        mov     [edx+TArray.lparam], esi        ; store the place where the search ends this time.
        mov     esi, [edx+TArray.count]
        stdcall AddArrayItems, edx, 1

.found:
        mov     eax, [.obj]
        mov     [edx+TArray.array+4*esi], eax

        and     esi, [edi+xConnection.id_mask]
        or      esi, [edi+xConnection.id_base]

        mov     [edi+xConnection.id_list], edx

        lea     eax, [edi+xConnection.mutex_wr]
        stdcall MutexRelease, eax

;        OutputValue "ID allocated: ", esi, 16,8

        mov     [esp+4*regEAX], esi
        popad
        return
endp



; try not to use this procedure, because if causes the ID space to always increase and makes the ID recycling not effective.

proc xGetNewID, .conn, .obj
begin
        pushad

        mov     edi, [.conn]
        lea     eax, [edi+xConnection.mutex_wr]
        stdcall WaitForMutex, eax, -1

        mov     edx, [edi+xConnection.id_list]
        test    edx, edx
        jnz     @f

        stdcall CreateArray, 4
        mov     edx, eax
@@:
        mov     esi, [edx+TArray.count]
        stdcall AddArrayItems, edx, 1

        mov     eax, [.obj]
        mov     [edx+TArray.array+4*esi], eax

        and     esi, [edi+xConnection.id_mask]
        or      esi, [edi+xConnection.id_base]

        mov     [edi+xConnection.id_list], edx

        lea     eax, [edi+xConnection.mutex_wr]
        stdcall MutexRelease, eax

        mov     [esp+4*regEAX], esi
        popad
        return
endp



proc xGetObj, .conn, .id
begin
        push    edx esi

        mov     esi, [.conn]
        mov     eax, [esi+xConnection.id_base]
        mov     edx, [esi+xConnection.id_list]
        cmp     [.id], eax
        jb      .error

        not     eax
        and     eax, [.id]
        cmp     eax, [esi+xConnection.id_mask]
        ja      .error

        cmp     eax, [edx+TArray.count]
        jae     .error

        mov     eax, [edx+TArray.array+4*eax]
        test    eax, eax
        jz      .error

        clc
        pop     esi edx
        return

.error:
        stc
        pop     esi edx
        return
endp



proc xFreeID, .conn, .id
begin
        pushad

        mov     esi, [.conn]
        lea     edx, [esi+xConnection.mutex_wr]
        stdcall WaitForMutex, edx, -1

        mov     ecx, [esi+xConnection.id_base]
        mov     edx, [esi+xConnection.id_list]
        not     ecx
        and     ecx, [.id]

;        OutputValue "ID freed: ", [.id], 16,8

        cmp     ecx, [esi+xConnection.id_mask]
        ja      .error

        cmp     ecx, [edx+TArray.count]
        jae     .error

        stdcall __CleanupDeferedEvents, [.id]   ; this is a kind of cross-level call (from lower level abstraction to the upper level abstraction, but we need somehow to clear the stored window IDs stored for defered processing.

        mov     [edx+TArray.lparam], ecx

        xor     eax, eax
        xchg    eax, [edx+TArray.array+4*ecx]
        mov     [esp+4*regEAX], eax

        clc

.finish:
        lea     edx, [esi+xConnection.mutex_wr]
        stdcall MutexRelease, edx
        popad
        return

.error:
        OutputValue "Error ID free: ", [.id], 16,8
        stc
        jmp     .finish
endp



struct __xInternAtomReq
  .op        db ?      ; opInternAtom
  .ifexists  db ?      ; bool
  .length    dw ?      ; total length in dword = 2 + string/4
  .name_len  dw ?      ; in chars
             dw ?
  .name:
ends

struct __xInternAtomResp
  .resp      db ?
             db ?
  .sequence  dw ?
  .length    dd ?       ; 0 usually
  .atom      dd ?       ; 0 == None
             rb 20
ends


struc xAtom name {
.@here = 1
if used .
label . byte
local ..name, ..start, ..len_all, ..len
..start db opInternAtom
        db 1
        dw ..len_all
        dw ..len
        dw ?
..name  db name
..len = $ - ..name
      align 4
..len_all = ($ - ..start)/4
.size = $ - ..start
end if
}


macro xEncoding name, filename {
  name#.@here = 1
  if used name
    align 4
    label name word
    file  filename
  end if
}


proc xInternAtom, .xAtom
begin
        stdcall xSend, appConn, [.xAtom]
        stdcall xRecv, appConn, TRUE

        push    eax
        mov     eax, [eax+__xInternAtomResp.atom]
        stdcall FreeMem ; from the stack

if defined options.DebugMode & options.DebugMode
        push eax ecx

        stdcall Output, "Atom name: "
        mov  eax, [.xAtom]
        movzx ecx, [eax+__xInternAtomReq.name_len]
        lea  eax, [eax+__xInternAtomReq.name]

        stdcall   OutputSz, eax, ecx
        pop  ecx eax
end if
        OutputValue " == #", eax, 10, -1

        clc
        return
endp



proc KeysymToUnicode, .keysym, .kbdstate
begin
        push    edx

        mov     eax, [.keysym]

        test    [.kbdstate], maskCtrl
        jz      .normal

        cmp     eax, $61
        jb      .normal
        cmp     eax, $7f
        ja      .normal

        sub     eax, $60
        jmp     .finish

.normal:
        cmp     eax, $ff
        jbe     .finish         ; latin1 == unicode

        test    eax, $01000000
        jz      .legacy_keysym

        and     eax, $00ffffff
        jmp     .finish

.legacy_keysym:
        cmp     ah,  $20
        je      .finish         ; the group 20 == unicode.

        cmp     ah, $ff
        jne     .not_func

; ah = ff, special keys, KP, Fx, etc.

        xor     ah, ah

        cmp     al, ' '
        jb      .finish

        cmp     al, $80      ; space
        jne     .not_space

        mov     eax, ' '
        jmp     .finish

.not_space:
        cmp     al, $90
        jae     .not_ctrl

        cmp     al, $80
        jb      .not_possible

        and     al, $0f
        jmp     .finish

.not_ctrl:
        cmp     al, $a0
        jb      .not_possible

        cmp     al, $be
        jae     .not_possible

        and     al, $7f
        jmp     .finish

.not_func:
        cmp     ah, 13
        ja      .not_possible

        movzx   edx, ah
        movzx   eax, al
        dec     edx
        mov     edx, [.table+4*edx]
        test    edx, edx
        jz      .not_possible

        sub     al, byte [edx]  ; minimal keycode
        jc      .not_possible

        cmp     al, byte [edx+1] ; max offset in the table
        ja      .not_possible

        movzx   eax, word [edx+2+2*eax]

.finish:
        clc
        pop     edx
        return

.not_possible:
        xor     eax, eax
        stc
        pop     edx
        return

.table dd .xLatin2,  .xLatin3,   .xLatin4, .xKana
       dd .xArabic,  .xCyrillic, .xGreek,  0
       dd 0,         .xPublish,  0,        .xHebrew
       dd .xThai

EncodingTable .xLatin2, "__encodings/keysyms1.tbl"
EncodingTable .xLatin3, "__encodings/keysyms2.tbl"
EncodingTable .xLatin4, "__encodings/keysyms3.tbl"
EncodingTable .xKana, "__encodings/keysyms4.tbl"
EncodingTable .xArabic, "__encodings/keysyms5.tbl"
EncodingTable .xCyrillic, "__encodings/keysyms6.tbl"
EncodingTable .xGreek, "__encodings/keysyms7.tbl"
EncodingTable .xPublish, "__encodings/keysyms10.tbl"
EncodingTable .xHebrew, "__encodings/keysyms12.tbl"
EncodingTable .xThai, "__encodings/keysyms13.tbl"

endp



proc KeycodeToKeysym, .keyMap, .keycode, .kbdstate
begin
        pushad

        mov     esi, [.keyMap]
        test    esi, esi
        jz      .null

        mov     ecx, [.kbdstate]
        mov     edx, [.keycode]

        mov     esi, [esi+4*edx]        ; pointer to xkbKeysymMapItem
        test    esi, esi
        jz      .null

;        OutputValue "Keyboard state: ", ecx, 2, 32
;        OutputMemoryByte esi, 8
;        movzx   ebx, [esi+xkbKeysymMapItem.nSyms]
;        shl     ebx, 2
;        lea     eax, [esi+xkbKeysymMapItem.keysyms]
;        OutputMemoryByte eax, ebx

        xor     ebx, ebx
        test    ecx, maskCtrl or maskAlt
        cmovnz  ecx, ebx                ; if Ctrl state, zero ecx in order to get the first character from the table.
        jnz     .getit

; compute the number of the groups.

        mov     ax, [esi+xkbKeysymMapItem.nSyms]
        div     [esi+xkbKeysymMapItem.width]            ; al = group count. ah should be 0
        mov     bl, al

        mov     eax, ecx
        shr     eax, 13
        and     eax, 3    ; the group number.

        div     bl
        movzx   ebx, ah   ; ebx - group number.

        cmp     [esi+xkbKeysymMapItem.ktIndex+ebx], xkbOneLevelIndex
        je      .one_level

        cmp     [esi+xkbKeysymMapItem.ktIndex+ebx], xkbTwoLevelIndex
        je      .two_levels

        cmp     [esi+xkbKeysymMapItem.ktIndex+ebx], xkbKeypadIndex
        je      .keypad

; all remaining is xkbAlphabeticIndex - (Shift cancels CapsLock)
        mov     eax, ecx
        shr     eax, 1          ; maskCapsLock = 2
        xor     ecx, eax
        and     ecx, 1

        mov     eax, [.kbdstate]
        and     eax, maskLevel3
        shr     eax, 6          ; 0 or 2
        add     ecx, eax
        jmp     .getit

; only the first level is important.
.one_level:
        xor     ecx, ecx
        jmp     .getit

; Only Shift modifier matters
.two_levels:
        and     ecx, maskShift
        jmp     .getit

; Keypad (numpad) key type. (Shift cancels NumLock)
.keypad:
        mov     eax, ecx
        shr     eax, 4          ; maskNumLock = $10
        xor     ecx, eax
        and     ecx, 1
;        jmp     .getit


.getit:
;        OutputValue "Group number: ", ebx, 10, -1

        mov     eax, ecx
        div     [esi+xkbKeysymMapItem.width]
        movzx   ecx, ah

;        OutputValue "Level offset: ", ecx, 10, -1

        movzx   eax, [esi+xkbKeysymMapItem.width]
        imul    ebx, eax                                ; group offset

        add     ecx, ebx

.get_loop:
        mov     eax, [esi + xkbKeysymMapItem.keysyms + 4*ecx]
        test    eax, eax
        jnz     .char_ok

        sub     ecx, 2
        jns     .get_loop

.char_ok:
        mov     [esp+4*regEAX], eax
        clc
        popad
        return

.null:
        xor     eax, eax
        mov     [esp+4*regEAX], eax
        stc
        popad
        return
endp


endmodule

Added freshlib/gui/Main.asm.



















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Main procedure of GUI application library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Organize the main message/event loop needed by every GUI engine.
;         This file contains only OS independent part and includes OS dependent files.
;_________________________________________________________________________________________
module "Main library"

uglobal
  var __LastPointedWindow = ?
  var __ActiveForm = ?          ; The form that get the focus from the OS.
  var __FocusedWindow = ?       ; The current focused window. It should be a child of [__ActiveForm]
  var __MouseTarget = ?         ; The control that holds the mouse capture in the moment.

  var __ActiveMenu = ?
endg


;_________________________________________________________________________________________
;
; Process all the events queued from the system and exits.
; Arguments: none
; Returns: CF = 1 if the termination event has been received.
;_________________________________________________________________________________________

interface ProcessSystemEvents




;_________________________________________________________________________________________
;
; Waits for system events to arive.
; During the wait, the application
; does not use CPU resources.
;_________________________________________________________________________________________

interface WaitForSystemEvent





proc Run
begin
.mainloop:
        stdcall ProcessSystemEvents
        jc      .terminate

        call    ProcessIdleStates

.eventok:
if defined Caret & (~ defined options.DebugMode.NoTimers | options.DebugMode.NoTimers = 0)
        stdcall __CaretTimerProc
end if

        stdcall WaitForSystemEvent
        jc      .eventok
        jmp     .mainloop

.terminate:
        DebugMsg "Terminate GUI application!"
        return
endp


proc ProcessIdleStates
begin
        cmp     [__ActiveForm], 0
        je      .finish
        exec    [__ActiveForm], TForm:ProcessIdle
.finish:
        return
endp



proc ServeMenuMouseMove, .window, .x, .y, .kbdState
begin
        cmp     [__ActiveMenu], 0
        jne     .serve_menu

        clc
        return

.serve_menu:
        pushad

        exec    [.window], TWindow:ClientToScreenXY, [.x], [.y]
        exec    [__ActiveMenu], TWindow:EventMouseMove, ecx, edx, [.kbdState]

        popad
        stc
        return
endp



proc ServeMenuButtonPress, .window, .button, .kbdState, .x, .y
begin
        pushad

        cmp     [__ActiveMenu], 0
        jne     .serve_menu

.not_processed:
        clc
        popad
        return

.serve_menu:

        exec    [.window], TWindow:ClientToScreenXY, [.x], [.y]
        exec    [__ActiveMenu], TWindow:EventButtonPress, [.button], [.kbdState], ecx, edx

        popad
        return
endp



iglobal
  if used tplModalActionList
  tplModalActionList:
          ObjTemplate tfParent or tfEnd, TActionList, 0
            ObjTemplate tfChild, TAction, 0, Accelerator = "Esc", OnExecute = OnModalCancel
            ObjTemplate tfChild or tfEnd, TAction, 0, Accelerator = "Enter", OnExecute = OnModalOK
  end if
endg


proc ShowModal, .pForm, .pParent
.prev dd ?
begin
        push    ebx ecx edx

        mov     ecx, [.pParent]
        mov     edx, [.pForm]
        test    ecx, ecx
        jz      .modal_parent_ok

; center the window on the parent.

        mov     eax, [ecx+TWindow._width]
        mov     ebx, [ecx+TWindow._height]
        sub     eax, [edx+TWindow._width]
        sub     ebx, [edx+TWindow._height]
        sar     eax, 1
        sar     ebx, 1
        add     eax, [ecx+TWindow._x]
        add     ebx, [ecx+TWindow._y]

;TODO: Min/Max coordinates range check.

        exec    edx, TWindow:Move, eax, ebx

.modal_parent_ok:

        set     edx, TForm:Visible, TRUE

        test    ecx, ecx
        jz      .parent_ok2

        stdcall _SetModalTowards, [edx+TForm.handle], [ecx+TWindow.handle]
        set     ecx, TWindow:Enabled, FALSE

.parent_ok2:
        stdcall CreateFromTemplate, tplModalActionList, 0
        get     eax, edx, TForm:ActionList
        set     edx, TForm:ActionList, ebx

        test    eax, eax
        jz      @f
        destroy eax
@@:
        set     edx, TForm:ModalResult, mrNone

        get     eax, edx, TForm:OnClose
        mov     [.prev], eax

        set     edx, TForm:OnClose, __ModalOnClose

.modal_loop:
        stdcall ProcessSystemEvents
        jc      .exit_modal

        get     eax, edx, TForm:ModalResult
        test    eax, eax
        jnz     .exit_modal

        get     eax, edx, TWindow:Visible
        test    eax, eax
        jz      .exit_modal

        cmp     [__ActiveForm], 0
        je      .vis_ok

        exec    [__ActiveForm], TForm:ProcessIdle

.vis_ok:
if defined Caret & (~ defined options.DebugMode.NoTimers | options.DebugMode.NoTimers = 0)
        stdcall __CaretTimerProc
end if
        stdcall WaitForSystemEvent
        jmp     .modal_loop

.exit_modal:
        jecxz   @f
        set     ecx, TWindow:Enabled, TRUE
@@:

        set     edx, TForm:OnClose, [.prev]

        jecxz   @f
        stdcall _FinalizeModal, [edx+TForm.handle], [ecx+TWindow.handle]
@@:
        set     edx, TForm:Visible, FALSE

        xor     ebx, ebx
        xchg    ebx, [edx+TForm._action_list]
        destroy ebx

        stdcall SetFocusedWindow, ecx

        get     eax, edx, TForm:ModalResult
        pop     edx ecx ebx
        return
endp


proc OnModalCancel as TAction.OnExecute
begin
        push    eax

        get     eax, [.Action], TAction:Parent
        get     eax, eax, TActionList:Form

        set     eax, TForm:ModalResult, mrCancel
        pop     eax
        return
endp

proc OnModalOK as TAction.OnExecute
begin
        push    eax

        get     eax, [.Action], TAction:Parent
        get     eax, eax, TActionList:Form

        set     eax, TForm:ModalResult, mrOK
        pop     eax
        return
endp


; prevent destroy of the form from the close button or Alt+F4
proc __ModalOnClose, .self, .reason
begin
        set     [.self], TForm:ModalResult, mrCancel
        stc
        return
endp





proc __GetRelativeXY, .window, .x, .y
begin
        push    eax esi

        mov     ecx, [.x]
        mov     edx, [.y]
        mov     esi, [.window]

.loop:
        get     eax, esi, TWindow:Parent
        test    eax, eax
        jz      .finish

        sub     ecx, [esi+TWindow._x]
        sub     edx, [esi+TWindow._y]

        mov     esi, eax
        jmp     .loop

.finish:
        pop     esi eax
        return
endp


proc SetFocusedWindow, .pWindow
begin
        push    eax

        stdcall __SetIntFocused, [.pWindow]
        jc      .finish

        mov     eax, [__FocusedWindow]
        test    eax, eax
        jz      .set_os

        exec    eax, TWindow:GetOSWindow
        test    eax, eax
        jz      .set_os

        mov     eax, [eax+TWindow.handle]

.set_os:
        stdcall _SetFocus, eax

.finish:
        pop     eax
        return
endp



; Only registers in __FocusedWindow already focused window.
; To be used only internally in SetFocusedWindow and the events from the OS
; for already focused by the OS windows.

proc __SetIntFocused, .pWindow
begin
        push    eax edx

        mov     edx, [.pWindow]
        cmp     edx, [__FocusedWindow]
        je      .ignore

        test    edx, edx
        jz      .setit

        istype  edx, TWindow
        jne     .ignore

        stdcall CanGetFocus, edx
        jz      .ignore

.setit:
        xchg    edx, [__FocusedWindow]
        test    edx, edx
        jz      .prev_ok

        exec    edx, TWindow:EventFocusOut

.prev_ok:
        cmp     [__FocusedWindow], 0
        je      .finish

        exec    [__FocusedWindow], TWindow:EventFocusIn

.finish:
        clc
        pop     edx eax
        return

.ignore:
        stc
        pop     edx eax
        return
endp




proc FocusNext
begin
        push    eax edx
        mov     eax, [__FocusedWindow]
        test    eax, eax
        jz      .target_ok

.loop:
        stdcall NextLeaf, eax
        je      .setit
        cmp     eax, [__FocusedWindow]
        je      .setit

        stdcall CanGetFocus, eax
        jz      .loop

.setit:
        stdcall CanGetFocus, eax
        jnz     .target_ok
        xor     eax, eax
.target_ok:
        stdcall SetFocusedWindow, eax

.finish:
        pop     edx eax
        return

endp




proc FocusPrev
begin
        push    eax edx
        mov     eax, [__FocusedWindow]
        test    eax, eax
        jz      .target_ok

.loop:
        stdcall PrevLeaf, eax
        je      .setit
        cmp     eax, [__FocusedWindow]
        je      .setit

        stdcall CanGetFocus, eax
        jz      .loop

.setit:
        stdcall CanGetFocus, eax
        jnz     .target_ok
        xor     eax, eax
.target_ok:
        stdcall SetFocusedWindow, eax

.finish:
        pop     edx eax
        return
endp


; Returns ZF = 1 if the window can not be focused.
;         ZF = 0 if the window can be foculed.
proc CanGetFocus, .window
begin
        push    eax

        get     eax, [.window], TWindow:Visible
        test    eax, eax
        jz      .fin

        get     eax, [.window], TWindow:Enabled
        test    eax, eax
        jz      .fin

        get     eax, [.window], TWindow:WantFocus
        test    eax, eax

.fin:
        pop     eax
        return
endp





iglobal

if used FramesPerSecond

  fpsTime dd 0

  fps     dd 0
  fpsmin  dd $ffffffff
  fpsmax  dd 0

  fpscnt  dd 0

end if

endg

fpsCount = 16

proc FramesPerSecond
begin
        pushad

        inc     [fpscnt]
        cmp     [fpscnt], fpsCount
        jne     .finish

        mov     [fpscnt], 0

        stdcall GetFineTimestamp
        mov     ecx, eax

        xchg    ecx, [fpsTime]
        test    ecx, ecx
        jz      .finish

        sub     ecx, [fpsTime]
        neg     ecx
        mov     eax, fpsCount*1000000
        xor     edx, edx

        div     ecx

        mov     [fps], eax

        cmp     eax, [fpsmin]
        jae      @f
        mov     [fpsmin], eax
@@:

        cmp     eax, [fpsmax]
        jb      @f
        mov     [fpsmax], eax
@@:


if defined options.DebugMode.ShowFPS & options.DebugMode.ShowFPS
        stdcall FileWriteString, [STDOUT], <txt '  FPS: '>
        stdcall NumToStr, [fps], ntsDec or ntsUnsigned
        push    eax
        stdcall FileWriteString, [STDOUT], eax
        stdcall StrDel ; from the stack

        stdcall FileWriteString, [STDOUT], <txt ', min: '>
        stdcall NumToStr, [fpsmin], ntsDec or ntsUnsigned
        push    eax
        stdcall FileWriteString, [STDOUT], eax
        stdcall StrDel ; from the stack

        stdcall FileWriteString, [STDOUT], <txt ', max: '>
        stdcall NumToStr, [fpsmax], ntsDec or ntsUnsigned
        push    eax
        stdcall FileWriteString, [STDOUT], eax
        stdcall StrDel ; from the stack
        stdcall FileWriteString, [STDOUT], <txt "                                           ", 13>

      if defined options.DebugMode & options.DebugMode
        stdcall FileWriteString, [STDOUT], <txt 10>
      end if
end if

.finish:
        popad
        return
endp




include '%TargetOS%/Main.asm'

endmodule

Added freshlib/gui/ObjTemplates.asm.































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Objects template engine
;
;  Target OS: Any
;
;  Dependencies: objects.asm
;
;  Notes:
;_________________________________________________________________________________________
module "Templates library"

tfChild  = 0
tfParent = 1
tfEnd    = 2


struct TObjTemplate
  .flags     dd  ?         ; tfParent; tfEnd.
  .size      dd  ?         ; size of the instance structure.
  .vtable    dd  ?         ; pointer to the virtual methods table.
  .paramsize dd  ?
  .ptrVar    dd  ?
  .params:
ends


macro ObjTemplate  flags, class, name, [idparam] {
common
local ..paramsize, ..prms, ..here

   if ~defined used.#class | defined ..here
     used.#class = 1
     ..here = 1
   end if

      dd  flags
      dd  sizeof.#class
      dd  vtables.#class
      dd  ..paramsize
if ~ name eq NONE
      dd  name
else
      dd  0
end if

..prms:

forward
local ..value, ..ofs, ..valid
  if ~idparam eq
  ..valid equ FALSE
  match  id == param, idparam \{
    ..ofs dd  class\#.\#id\#.#set
          dd  ..value

    if defined class\#.\#id\#.#set.arg

      if class\#.\#id\#.#set.arg = 2
            dd class\#.\#id, -1
      end if

      if class\#.\#id\#.#set.arg = 3
            dd class\#.\#id, class\#.\#id\#.#get
      end if

    else
          dd 0, -1
    end if

    ..valid EQU TRUE
  \}

  match =FALSE, ..valid \{
    error Invalid parameter definition in template.
  \}
  end if

common
      dd  -1

forward

    match  id == param, idparam \{
      if param eqtype 2
        ..value = param
      else
        if param eqtype [2]
           match =[par=], param \\{
           ..value = par
        \\}
          store byte $fe at ..ofs+3
        else
          ..value db param, 0
        end if
      end if
    \}

common
local ..here

    if ~(name eq NONE) & (~defined name | defined ..here)
      name dd ?
      ..here = 1
    end if
  ..paramsize = $ - ..prms
}


; returns the last created window in ebx.
proc CreateFromTemplate, .ptrTemplate, .parent
begin
        push    esi

        mov     esi, [.ptrTemplate]
        stdcall _DoCreateFromTemplate, [.parent]

        pop     esi
        return
endp


proc _DoCreateFromTemplate, .parent
begin
        push    eax ecx edx edi

.createloop:
        stdcall GetMem, [esi+TObjTemplate.size]
        mov     ebx, eax
        mov     edi, [esi+TObjTemplate.vtable]
        mov     [ebx], edi

        exec    ebx, TObject:Create, [.parent]

        lea     ecx, [esi+TObjTemplate.params]

.paramloop:
        cmp     dword [ecx], -1
        je      .paramsok

        mov     eax, [ecx]
        bswap   eax

        mov     edx, [ecx+4]            ; value

        cmp     al, $fe                 ; Is it indirect?
        jne     @f
        mov     edx, [edx]              ; the value is an address of a variable.
@@:
        bswap   eax

        test    eax, $00ff0000
        movzx   eax, ax                 ; not changing flags!
        jnz     .method

        mov     [ebx+eax], edx
        jmp     .param_set

.method:
        push    edx     ; value

        cmp     dword [ecx+12], -1
        je      .get_ok
        push    dword [ecx+12]
.get_ok:
        cmp     dword [ecx+8], 0        ; the parameter ID. <>0 if to be pushed during the method call.
        je      .param_ok
        push    dword [ecx+8]
.param_ok:

        stdcall dword [edi+4*eax+8], ebx

.param_set:
        add     ecx, 16
        jmp     .paramloop

.paramsok:
        mov     eax, [esi+TObjTemplate.ptrVar]
        test    eax, eax
        jz      .var_ok

        mov     [eax], ebx      ; returned pointer/handle to the object.
        set     ebx, TObject:ptrVar, eax

.var_ok:
        get     eax, ebx, TObject:OnCreate
        test    eax, eax
        jz      .gonext

; execute user OnCreate event.

        pushad
        stdcall eax, ebx
        popad

.gonext:
        mov     edx, [esi+TObjTemplate.flags]

        mov     eax, sizeof.TObjTemplate
        add     eax, [esi+TObjTemplate.paramsize]
        add     esi, eax

        test    edx, tfParent
        jz      .childrenok

        push    ebx
        stdcall _DoCreateFromTemplate, ebx
        pop     ebx

.childrenok:
        test    edx, tfEnd
        jz      .createloop

.exit:
        pop     edi edx ecx eax
        return
endp


endmodule

Added freshlib/gui/OldTemplates.inc.









































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; This macro aims to provide some limited use of the old visual editor
; with the new template engine, until the new one is created.


macro __define_one_property class, subtype, style, property {
common
  local ..txt, ..set, ..subtype

  match id==value, property \{

    ; class
    if class eq 'TForm'
      ..set = TForm.\#id\#.set
    else
      if class eq 'BUTTON'

        if subtype = 0  ; BS_PUSHBUTTON
          ..set = TButton.\#id\#.set
        end if

        if subtype = 2  ; BS_CHECKBOX
          ..set = TButton.\#id\#.set
        end if

      else

         if class eq 'EDIT'
           if (style and 4)  ;ES_MULTILINE
             ..set = TAsmEdit.\#id\#.set
           else
             ..set = TEdit.\#id\#.set
           end if
         else

           if class eq 'STATIC'
             ..set = TLabel.\#id\#.set
           else
             if class eq 'msctls_progress32'
               ..set = TProgress.\#id\#.set
             else
               if class eq 'SysTreeView32'
                 ..set = TTreeView.\#id\#.set
               end if
             end if
           end if
         end if
      end if
    end if


         dd ..set
         if value eqtype 2
            dd  value
         else
           if value eqtype 'A'
             dd  ..txt
           else
             dd value
           end if
         end if
    ..txt text value
  \}
}



macro Window  name, flags, walign, class, txt, style, styleEx, ID, left, top, width, height, [props] {
common
  local ..paramsize, ..prms, ..caption, ..name, ..subtype, ..txtalign, ..class, ..size, ..here, ..capset, ..alset

  ..subtype = style and $0f

  ..txtalign = 0
  ..alset = 0

  if ~name eq NONE
     name#.template#:
  end if

  ..class = vtables.TWindow
  ..size  = sizeof.TWindow
  ..capset = 0

  ; class
  if class eq 'TForm'
    ..class = vtables.TForm
    ..size  = sizeof.TForm
  else
    if class eq 'BUTTON'


      if ..subtype = 0  ; BS_PUSHBUTTON
        ..class = vtables.TButton
        ..size  = sizeof.TButton
        ..txtalign = dtfAlignCenter or dtfAlignMiddle
        ..alset = TButton.TextAlign.set
        ..capset = TButton.Caption.set
      end if

      if ..subtype = 2  ; BS_CHECKBOX
        ..class = vtables.TCheckbox
        ..size = sizeof.TCheckbox
        ..capset = TCheckbox.Caption.set
      end if

    else

       if class eq 'EDIT'
         if (style and 4)  ;ES_MULTILINE
           ..class = vtables.TAsmEdit    ; it is not good to use TAsmEdit, but we don't have light multiline edit.
           ..size = sizeof.TAsmEdit
           ..capset = TAsmEdit.Text.set
         else
           ..class = vtables.TEdit
           ..size = sizeof.TEdit
           ..capset = TEdit.Text.set
         end if
       else

         if class eq 'STATIC'
           ..class = vtables.TLabel
           ..size = sizeof.TLabel
           ..capset = TLabel.Caption.set
           ..alset = TLabel.TextAlign.set

           if ..subtype = 1     ; SS_CENTER
             ..txtalign = ..txtalign or dtfAlignCenter
           end if

           if ..subtype = 2     ; SS_RIGHT
             ..txtalign = ..txtalign or dtfAlignCenter
           end if

           if (style and $200) ;SS_CENTERIMAGE
             ..txtalign = ..txtalign or dtfAlignMiddle
           end if

         else
           if class eq 'msctls_progress32'
             ..class = vtables.TProgress
             ..size = sizeof.TProgress
           else
             if class eq 'SysTreeView32'
               ..class = vtables.TTreeView
               ..size = sizeof.TTreeView
             end if
           end if
         end if
       end if

    end if
  end if


  dd flags              ; flags - the values are the same
  dd ..size
  dd ..class
  dd ..paramsize        ;parameters size

  ; name
  if name eq NONE
        dd  ..name
  else
        dd  name
  end if


..prms:
        dd      TWindow.x.set
        dd      left

        dd      TWindow.y.set
        dd      top

        dd      TWindow.width.set
        dd      width

        dd      TWindow.height.set
        dd      height

        if ..capset
          dd      ..capset
          dd      ..caption
        end if

  if (style and $10000000) <> 0   ; WS_VISIBLE
        dd      TWindow.Visible.set
        dd      TRUE
  end if

  if ..txtalign
        dd      ..alset
        dd      ..txtalign
  end if

forward
       __define_one_property class, ..subtype, style, props

common
       dd  -1   ; end of params

  if name eq NONE
    ..name dd ?
  else
    name dd ?
  end if

  ..paramsize = $ - ..prms

  ..caption text txt

}

Added freshlib/gui/SplitGrid.asm.















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Objects template engine
;
;  Target OS: Any
;
;  Dependencies: objects.asm
;
;  Notes:
;_________________________________________________________________________________________
module "SplitGrid"


stOriginBR = $08    ; the origin of the cell splitter is on the right (or bottom)
                    ; edge of the cell.

stHoriz    = $00    ; the cell is splitted on left and right parts.
stVert     = $04    ; the cell is splitted on up and down parts.

stNone     = $80    ; the cell is not splitted.

stAutosize =  1 shl 11

stMaxHidden = 1 shl 12 ; the pos is assumed to be equal to the max value (but the real value is not changed).
stHidden    = 1 shl 13 ; the pos is assumed to be 0 (but the real value is not changed)
stRelative  = 1 shl 14 ; the pos field is a part of a whole rectangle (in 1/32768 units)
stJustGap   = 1 shl 15 ; the rectangle is splitted, but not resizeable.



struct TSplitRect
  .rect    RECT    ; the rectangle of the area.
  .spRect  RECT    ; rectangle of the splitter.
  .pWindow dd ?    ; pointer to TWindow descendent, bound to the grid cell.
  .pos     dd ?    ; in pixels or as part of the whole.
  .min     dd ?    ; minimal size
  .max     dd ?    ; maximal size
  .type    dd ?    ; one or more of stXXXXX flags defined above.
  .spWidth dd ?    ; width of the spliter
  .id      dd ?
  .reserve dd ?    ; in order the size to be power of 2
ends


struct TSplitTemplate
  .type  dw ?      ; stXXXXXXXXX flags
  .width dw ?      ; width of the splitter
  .pos   dd ?      ; current position
  .min   dd ?      ; min
  .max   dd ?      ; max
ends


struct TCellTemplate
  .type  dw ?
  .id    dw ?
ends


macro SplitStart name {
  local ..expected, ..id
  ..expected = 1
  ..id = 0

  cell@expected equ ..expected
  cell@id equ ..id
  cell@name equ name

  label name byte

  macro Split type, width, pos, min, max \{
    dw type, width
    dd pos, min, max
    cell@id = cell@id + 1
    cell@expected = cell@expected + 1
  \}

  macro Cell name \{
    .\#name = cell@id
    dw stNone, cell@id
    cell@id = cell@id + 1
    cell@expected = cell@expected - 1
  \}

}


macro SplitEnd {
  match name, cell@name \{ cell@namestr equ `name  \}
  if cell@expected<>0
    disp 1, 'WARNING! "', cell@namestr, '" split template is not consistent! Automatically added  ', <cell@expected, 10>, " empty cells. FIXIT!", 13
    repeat cell@expected
      dw stNone, 0
    end repeat
  end if
  match name, cell@name \{ sizeof.\#name = $ - name \}
  purge Cell, Split
  restore cell@expected, cell@id, cell@name
}


struc SplitTemplate [name, type, width, pos, min, max] {
common
  .:
  local ..expected, ..index
  ..expected = 1
  ..index = 0
forward
  if ~name eq NONE
    name = ..index
  end if
     dw type
     dw width
     dd pos
     dd min
     dd max
  if (type <> stNone)
    ..expected = ..expected + 1
  else
    ..expected = ..expected - 1
  end if

  ..index = ..index + 1
common
  repeat ..expected
    dw  stNone, 0
    dd  0, 0, 0
  end repeat

  if ..expected <> 0
    disp 1, 'WARNING! "', `., '" split template is not consistent! Automatically added  ', <..expected, 10>, " empty cells. FIXIT!", 13
  end if
}



proc RealignGrid, .ptrSplitter, .ptrRect
.rect RECT
begin
        pushad

        mov     edi, [.ptrSplitter]
        mov     esi, [.ptrRect]
        call    _DoRealign

        popad
        return
endp


; edi is pointer to the current TSplitRect
; esi is pointer to the rect that have to be assigned to the current TSplitRect
proc _DoRealign
.rect1 RECT
.rect2 RECT
begin

; copy the rect to the target rectangles.
        mov     eax, [esi+RECT.left]
        mov     ecx, [esi+RECT.top]

        mov     [edi+TSplitRect.rect.left], eax
        mov     [edi+TSplitRect.rect.top], ecx

        mov     [edi+TSplitRect.spRect.left], eax
        mov     [edi+TSplitRect.spRect.top], ecx

        mov     [.rect1.left], eax
        mov     [.rect1.top], ecx
        mov     [.rect2.left], eax
        mov     [.rect2.top], ecx

        mov     eax, [esi+RECT.right]
        mov     ecx, [esi+RECT.bottom]

        mov     [edi+TSplitRect.rect.right], eax
        mov     [edi+TSplitRect.rect.bottom], ecx

        mov     [edi+TSplitRect.spRect.right], eax
        mov     [edi+TSplitRect.spRect.bottom], ecx

        mov     [.rect1.right], eax
        mov     [.rect1.bottom], ecx
        mov     [.rect2.right], eax
        mov     [.rect2.bottom], ecx

        mov     esi, edi                  ; current TSplitRect
        add     edi, sizeof.TSplitRect    ; goto next one

        mov     ecx, [esi+TSplitRect.type]
        test    ecx, stNone
        jnz     .resize_window

; There is split, so compute it.
        and     ecx, stVert            ; it is 0 for stHoriz and 4 for stVert

        mov     ebx, [esi+TSplitRect.rect.right+ecx]
        sub     ebx, [esi+TSplitRect.rect.left+ecx]     ; ebx = size of rect (x or y depending on type)
        mov     edx, [esi+TSplitRect.spWidth]

        test    [esi+TSplitRect.type], stHidden or stMaxHidden
        jz      .hidden_ok1
        xor     edx, edx
.hidden_ok1:

        sub     ebx, edx

        mov     eax, [esi+TSplitRect.pos]               ; limit the .pos value

        test    [esi+TSplitRect.type], stAutosize
        jz      .autosize_ok

        call    __GetSplitAutosize

.autosize_ok:

        cmp     eax, [esi+TSplitRect.min]
        cmovl   eax, [esi+TSplitRect.min]

        cmp     eax, [esi+TSplitRect.max]
        cmovg   eax, [esi+TSplitRect.max]

        mov     [esi+TSplitRect.pos],eax                ; EAX = position of the splitter.

        test    [esi+TSplitRect.type], stHidden
        jz      .hidden_ok2
        xor     eax, eax
.hidden_ok2:

        test    [esi+TSplitRect.type], stMaxHidden
        jz      .hidden_ok3
        mov     eax, [esi+TSplitRect.max]
.hidden_ok3:

        mov     ecx, [esi+TSplitRect.type]
        and     ecx, $ff                                 ; Here ECX = 0, 4, 8 or 12 depending on stVert and stOriginBR

        test    [esi+TSplitRect.type], stRelative
        jz      .posready

        imul    eax, ebx
        sar     eax, 15         ; div $8000

.posready:
        test    ecx, stOriginBR
        jz      .readyofs                               ; it is Left or Top

        neg     edx                                     ; EDX is the width of the splitter
        neg     eax                                     ; EAX is the position of the splitter

.readyofs:
        add     eax, [.rect1.left+ecx]                  ; .left or .top, depending on the ECX (0 or 4)

        mov     [.rect1.right+ecx], eax                 ; .right or .bottom, depending on the ECX
        mov     [esi+TSplitRect.spRect.left+ecx], eax   ; spRect.left or spRect.top

        add     ecx, 8      ; right or bottom
        and     ecx, $0f                                ; ecx = 8, 12, 0 or 4 depending on stVert and stOriginBR

        add     eax, edx
        mov     [.rect1.right+ecx], eax                 ; it is rect2.left or .top !!!!!!
        mov     [esi+TSplitRect.spRect.left+ecx], eax   ; spRect.right or spRect.bottom


        push    esi

        lea     esi, [.rect1]
        call _DoRealign

        lea     esi, [.rect2]
        call _DoRealign

        pop     esi
        return

.resize_window:
        mov     ebx, [esi+TSplitRect.pWindow]
        test    ebx, ebx
        jz      .endresize

        mov     eax, [esi+TSplitRect.rect.left]
        mov     ecx, [esi+TSplitRect.rect.top]

        exec    ebx, TWindow:Move, eax, ecx

        mov     eax, [esi+TSplitRect.rect.right]
        mov     ecx, [esi+TSplitRect.rect.bottom]
        sub     eax, [esi+TSplitRect.rect.left]
        sub     ecx, [esi+TSplitRect.rect.top]

        xor     edx, edx

        test    eax, eax
        cmovs   eax, edx

        test    ecx, ecx
        cmovs   ecx, edx

; Visible
        test    eax, eax
        setnz   dl
        test    ecx, ecx
        setnz   dh
        and     dl, dh
        movzx   edx, dl

        set     ebx, TWindow:Visible, edx
        exec    ebx, TWindow:Resize, eax, ecx

.endresize:
        return
endp



proc __GetSplitAutosize
.rect RECT
begin
        pushad
        mov     ebx, [esi+TSplitRect.pWindow]
        test    ebx, ebx
        jz      .finish

        mov     ebx, [esi+ebx+TSplitRect.pWindow]
        test    ebx, ebx
        jz      .finish

        exec    ebx, TWindow:Autosize   ; returns eax - width; edx - height;

        test    [esi+TSplitRect.type], stVert
        cmovnz  eax, edx                       ; here edx is the pos of the splitter

        mov     [esp+4*regEAX], eax

.finish:
        popad
        return
endp








proc DrawSplitters, .pImage, .ptrSplitters, .xDst, .yDst, .width, .height, .ofsx, .ofsy, .proc_draw_splitter
.rect RECT
begin
        pushad

        mov     eax, [.xDst]
        mov     edx, [.yDst]
        add     [.width], eax
        add     [.height], edx

        lea     ebx, [.xDst]

        mov     esi, [.ptrSplitters]
        lea     edi, [.rect]
        call    .DoDrawSplitters
        popad
        return

; esi - pointer to TSplitRect
.DoDrawSplitters:

        lea     eax, [esi+TSplitRect.spRect]
        stdcall RectCopy, edi, eax

        mov     eax, [.ofsx]
        mov     edx, [.ofsy]
        add     [edi+RECT.left], eax
        add     [edi+RECT.top], edx
        add     [edi+RECT.right], eax
        add     [edi+RECT.bottom], edx

        mov     edx, [esi+TSplitRect.type]
        add     esi, sizeof.TSplitRect

        test    edx, stNone
        jnz     .exit

        test    edx, stJustGap
        jnz     .next

        stdcall [.proc_draw_splitter], [.pImage], edi, edx, ebx

.next:
        call    .DoDrawSplitters  ; first
        call    .DoDrawSplitters  ; second

.exit:
        retn
endp



; Returns:
;   CF=1; the splitter has been found. EAX=pointer to TSplitRect structure.
;   CF=0; the splitter has not been found. EAX not changed.

proc FindSplitter, .ptrSplitters, .ptrPoint
begin
        pushad

        mov     esi, [.ptrSplitters]
        mov     edi, [.ptrPoint]

        call    _DoFindSplitter
        jnc     .exit
        mov     [esp+4*regEAX], ebx
.exit:
        popad
        return
endp


proc _DoFindSplitter
begin
        mov     ebx, esi
        add     esi, sizeof.TSplitRect

        test    [ebx+TSplitRect.type], stNone
        jnz     .exit

        lea     eax, [ebx+TSplitRect.spRect]

        stdcall PointInRect, eax, [edi+POINT.x], [edi+POINT.y]
        jnc     .next
        return

.next:
        call    _DoFindSplitter  ; first
        jc      .exit

        call    _DoFindSplitter  ; second
.exit:
        return
endp



proc FindSplitterCell, .ptrSplitters, .ptrPoint
begin
        pushad
        mov     esi, [.ptrSplitters]
        mov     edi, [.ptrPoint]
        mov     ecx, 1                  ; one splitter expected.

.loop:
        add     ecx, 2
        test    [esi+TSplitRect.type], stNone
        jz      .next

        sub     ecx, 2

        lea     eax, [esi+TSplitRect.rect]
        stdcall PointInRect, esi, [edi+POINT.x], [edi+POINT.y]
        jc      .found

.next:
        lea     esi, [esi+sizeof.TSplitRect]
        dec     ecx
        jnz     .loop
; here CF=0
        popad
        return

.found:
; here CF=1
        mov     [esp+regEAX*4], esi
        popad
        return
endp



proc ReadSplitGridTemplate, .ptrTemplate
begin
        pushad

        mov     edx, [.ptrTemplate]
        test    edx, edx
        jz      .finish

        mov     esi, edx

        stdcall CreateArray, sizeof.TSplitRect
        mov     edx, eax

        mov     ecx, 1

.read_loop:
        stdcall AddArrayItems, edx, 1

        push    eax ecx

        mov     edi, eax
        mov     ecx, sizeof.TSplitRect/4
        xor     eax, eax
        rep stosd

        pop     ecx edi

        xor     eax, eax
        lodsw   ; the stXXX values.

        mov     [edi+TSplitRect.type], eax

        test    eax, stNone
        jnz     .empty_cell

        lodsw   ; the width
        mov     [edi+TSplitRect.spWidth], eax

        xor     ebx, ebx
        lodsd
        test    [edi+TSplitRect.type], stAutosize
        jz      @f

        mov     ebx, eax                           ; the index of the auto
        sub     ebx, [edx+TArray.count]
        inc     ebx
        imul    ebx, sizeof.TSplitRect
        xor     eax, eax

@@:
        mov     [edi+TSplitRect.pWindow], ebx
        mov     [edi+TSplitRect.pos], eax
        lodsd
        mov     [edi+TSplitRect.min], eax
        lodsd
        mov     [edi+TSplitRect.max], eax

        inc     ecx
        jmp     .read_loop

.empty_cell:
        lodsw
        mov     [edi+TSplitRect.id], eax
        dec     ecx
        jnz     .read_loop

.finish:
        mov     [esp+regEAX*4], edx
        popad
        return
endp



cdspHide = 0
cdspShow = 1
cdspToggle = 2

; fDisplay = 0 -> hide, 1->show, 2->switch

proc CellMinMax, .pForm, .cellID, .fDisplay
begin
        pushad

        get     esi, [.pForm], TForm:SplitGrid
        test    esi, esi
        jz      .error

        lea     esi, [esi+TArray.array]
        mov     edi, esi

        mov     eax, [.cellID]
        shl     eax, 6          ; * sizeof.TSplitRect
        add     esi, eax

        xor     ecx, ecx

; Search for the split element of this cell

.loop:
        sub     esi, sizeof.TSplitRect
        cmp     esi, edi
        jb      .error

        bt      [esi+TSplitRect.type], 7        ; stNone
        sbb     edx, edx                        ; -1 if the element is a cell and 0 if split
        lea     edx, [2*edx+1]                  ; -1 if the element is a cell and +1 if split

        add     ecx, edx
        jl      .loop

; here ecx =  0 if the cell is the second cell
;      ecx = +1 if the cell is the first cell

        test    [esi+TSplitRect.type], stOriginBR
        jz      @f
        xor     ecx, 1          ; reverse it if the split is stOriginBR
@@:
        add     ecx, 12         ; stMaxHidden = 2^12; stHidden = 2^13

        xor     edx, edx
        inc     edx

        shl     edx, cl         ; edx = stHidden or stMaxHidden depending on the cell that has to be hidden or shown.

        mov     ecx, edx
        not     ecx             ; AND mask.

; found
        cmp     [.fDisplay], 0
        sete    al
        shr     al, 1
        sbb     eax, eax        ; eax = $ffffffff or 0 depending on the .fDisplay flag.

        cmp     [.fDisplay], 2
        je      .xor

        and     edx, eax

        and     [esi+TSplitRect.type], ecx
        or      [esi+TSplitRect.type], edx ; set only one.
        jmp     .realign

.xor:
        xor     [esi+TSplitRect.type], edx

.realign:
        stdcall RealignGrid, esi, esi   ; realign on its own rectangle.

        mov     eax, [esi+TSplitRect.type]
        mov     [esp+4*regEAX], eax          ; return the result split type.

        clc
        popad
        return

.error:
        stc
        popad
        return
endp




endmodule

Added freshlib/gui/TAction.asm.

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Actions management library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: "Action" is set of executable code, combined with user interface attributes -
;         caption, accelerator keys, enable/disable status flag etc.
;         Different UI elements, such as buttons, menu items etc. can be attached to
;         the action object and to use its attributes. When the programmer changes
;         something in the action, all UI elements are updated automatically.
;_________________________________________________________________________________________

module "TAction"

Ctrl = maskCtrl
Alt = maskAlt
Shift = maskShift


struct TFastKey
 .flags  dd ?
 .key    dd ?
ends


object TAction, TObject

  ._caption    dd ?
  ._hint_text  dd ?
  ._icon_index dd ?
  ._enabled    dd ?
  ._checked    dd ?

  ._accel      TFastKey

  ._on_execute dd ?
  ._on_idle    dd ?

  ._ctrl_list  dd ?

  ._icon_cache_gray  dd ?
  ._icon_cache       dd ?

  param .Caption,   .GetCaption,    .SetCaption
  param .HintText,  ._hint_text,  .SetHintText
  param .IconIndex, ._icon_index, .SetIconIndex
  param .Enabled,   ._enabled,    .SetEnabled
  param .Checked,   ._checked,    .SetChecked
  param .Accelerator, .GetAccelStr, .SetAccelStr
  param .Icon, .GetIcon, NONE

  param .OnExecute, ._on_execute, ._on_execute
  param .OnIdle,    ._on_idle,    ._on_idle

  method .GetIcon
  method .GetAccelStr
  method .SetAccelStr, .value
  method .GetCaption

  method .SetParent, .value

  method .SetCaption, .value
  method .SetHintText, .value
  method .SetIconIndex, .value
  method .SetEnabled, .value
  method .SetChecked, .value

  method .UpdateControls

  method .SetAccelerator, .flags, .key

  method .Execute, .fromCtrl
  method .Attach,  .ctrl
  method .Detach,  .ctrl

  method .Create, .parent
  method .Destroy

  method .__clear_cache

endobj



interface TAction.OnExecute, .Action, .Ctrl
interface TAction.OnIdle, .Action



method TAction.Create
begin
        inherited [.parent]

        pushad
        mov     eax, [.self]
        mov     [eax+TAction._enabled], 1
        return
endp




method TAction.Destroy
begin
        pushad

        get         eax, [.self], TAction:Caption
        stdcall StrDel, eax

        mov     esi, [.self]
        exec    esi, TAction:__clear_cache

        xor     edi, edi
        xchg    edi, [esi+TAction._ctrl_list]
        test    edi, edi
        jz      .finish

        mov     ecx, [edi+TArray.count]

.loop:
        dec     ecx
        js      .end_loop

        mov     eax, [edi+TArray.array+4*ecx]
        test    eax, eax
        jz      .loop

        set     eax, TWindow:Action, 0
        jmp     .loop

.end_loop:
        stdcall FreeMem, edi


.finish:
        popad
        inherited
        return
endp



method TAction.SetParent
begin
        inherited [.value]
        exec      [.self], TAction:UpdateControls
        return
endp



method TAction.Execute
begin
        pushad

        mov     esi, [.self]

        cmp     [esi+TAction._enabled], 0
        je      .finish

        mov     edi, [esi+TAction._on_execute]
        test    edi, edi
        jz      .finish

        stdcall edi, esi, [.fromCtrl]

.finish:
        popad
        return
endp




method TAction.Attach
begin
        pushad

        mov     esi, [.self]
        mov     edx, [esi+TAction._ctrl_list]
        test    edx, edx
        jnz     .list_ok

        stdcall CreateArray, 4
        mov     edx, eax
        jmp     .add_it

.list_ok:
        stdcall ListIndexOf, edx, [.ctrl]
        jnc     .finish

.add_it:
        stdcall AddArrayItems, edx, 1
        mov     ecx, [.ctrl]
        mov     [eax], ecx
        mov     [esi+TAction._ctrl_list], edx

.finish:
        popad
        return
endp




method TAction.Detach
begin
        pushad

        mov     esi, [.self]
        mov     edx, [esi+TAction._ctrl_list]
        test    edx, edx
        jz      .finish

        stdcall ListIndexOf, edx, [.ctrl]
        jc      .finish                         ; not found

        stdcall DeleteArrayItems, edx, eax, 1

        cmp     [edx+TArray.count], 0
        jne     @f

        stdcall FreeMem, edx
        xor     edx, edx

@@:
        mov     [esi+TAction._ctrl_list], edx

.finish:
        popad
        return
endp




method TAction.GetIcon
.list dd ?
begin
        pushad
        mov     esi, [.self]

        mov     edi, [esi+TAction._enabled]
        and     edi, 1

        mov     eax, [esi+TAction._icon_cache_gray+4*edi]
        test    eax, eax
        jnz     .finish

        mov     edx, [esi+TAction._icon_index]
        test    edx, edx
        js      .finish         ; return 0

        get     [.list], esi, TAction:Parent
        get     ecx, [.list], TActionList:IconSize

        stdcall CreateImage2, ecx, ecx, FALSE
        mov     [esi+TAction._icon_cache_gray+4*edi], eax

        imul    edx, ecx                                ; x coordinate.

        get     ebx, [.list], TActionList:ImgIcons
        test    ebx, ebx
        jz      .finish

        stdcall CopyImageRect, eax, 0, 0, ebx, edx, 0, ecx, ecx
        test    edi, edi
        jnz     .finish

        stdcall FilterDisabled, eax, FALSE

.finish:
        mov     [esp+regEAX*4], eax
        popad
        return
endp


method TAction.GetAccelStr
begin
        mov     eax, [.self]
        lea     eax, [eax+TAction._accel]
        stdcall AcceleratorToStr, eax
        return
endp


method TAction.SetAccelStr; , .value
begin
        push    eax edx
        stdcall StrToAccelerator, [.value]
        exec    [.self], TAction:SetAccelerator, eax, edx
        pop     edx eax
        return
endp



method TAction.__clear_cache
begin
        push    eax edx
        mov     edx, [.self]

        xor     eax, eax
        xchg    eax, [edx+TAction._icon_cache]
        test    eax, eax
        jz      .cache_ok1

        stdcall DestroyImage, eax

.cache_ok1:
        xor     eax, eax
        xchg    eax, [edx+TAction._icon_cache_gray]
        test    eax, eax
        jz      .cache_ok2

        stdcall DestroyImage, eax

.cache_ok2:

        pop     edx eax
        return
endp



method TAction.UpdateControls
begin
        push    eax ecx edx

        mov     edx, [.self]

        exec    edx, TAction:__clear_cache

        mov     edx, [edx+TAction._ctrl_list]
        test    edx, edx
        jz      .finish

        mov     ecx, [edx+TArray.count]
.loop:
        dec     ecx
        js      .finish

        cmp     [edx+TArray.array+4*ecx], 0
        je      .loop

;        OutputValue "Update action for window: ", [edx+TArray.array+4*ecx], 16, 8

        exec    [edx+TArray.array+4*ecx], TWindow:UpdateAction, [.self]
        jmp     .loop

.finish:
        pop     edx ecx eax
        return
endp



method TAction.GetCaption
begin
        mov     eax, [.self]
        mov     eax, [eax+TAction._caption]
        test    eax, eax
        jz      .finish

        stdcall StrDup, eax

.finish:
        return
endp


method TAction.SetCaption      ;, .value
begin
        pushad
        mov     esi, [.self]
        mov     eax, [.value]
        cmp     eax, [esi+TAction._caption]
        je      .finish

        mov     [esi+TAction._caption], eax
        exec    esi, TAction:UpdateControls

.finish:
        popad
        return
endp



method TAction.SetHintText     ;, .value
begin
        pushad
        mov     esi, [.self]
        mov     eax, [.value]
        cmp     eax, [esi+TAction._hint_text]
        je      .finish

        mov     [esi+TAction._hint_text], eax
        exec    esi, TAction:UpdateControls

.finish:
        popad
        return
endp



method TAction.SetIconIndex    ;, .value
begin
        pushad
        mov     esi, [.self]
        mov     eax, [.value]
        cmp     eax, [esi+TAction._icon_index]
        je      .finish

        mov     [esi+TAction._icon_index], eax
        exec    esi, TAction:UpdateControls

.finish:
        popad
        return
endp



method TAction.SetEnabled      ;, .value
begin
        pushad
        mov     esi, [.self]
        mov     eax, [.value]
        test    eax, eax
        setnz   al
        movzx   eax, al

        cmp     eax, [esi+TAction._enabled]
        je      .finish

        mov     [esi+TAction._enabled], eax
        exec    esi, TAction:UpdateControls

.finish:
        popad
        return
endp



method TAction.SetChecked      ;, .value
begin
        pushad
        mov     esi, [.self]
        mov     eax, [.value]
        cmp     eax, [esi+TAction._checked]
        je      .finish

        mov     [esi+TAction._checked], eax

        exec    esi, TAction:UpdateControls

.finish:
        popad
        return
endp



method TAction.SetAccelerator
begin
        pushad

        mov     esi, [.self]

        mov     eax, [.flags]
        mov     ecx, [.key]
        mov     [esi+TAction._accel.flags], eax
        mov     [esi+TAction._accel.key], ecx

        exec    esi, TAction:UpdateControls

        popad
        return
endp


endmodule

Added freshlib/gui/TActionList.asm.























































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Actions management library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: TActionList is set of TAction that provides some common functionality
;         for example the common icons. It is implemented as a parent object for
;         several TAction objects.
;_________________________________________________________________________________________

module "TActionList"


object TActionList, TObject

  ._img_icons  dd ?
  ._icon_size  dd ?
  ._form       dd ?

  param .ImgIcons, ._img_icons, .SetIcons
  param .IconSize, ._icon_size, .SetIconSize

  param .Form, ._form, ._form

  method .Create, .parent
  method .Destroy

  method .SetIcons, .value
  method .SetIconSize, .value

  method .UpdateActions
  method .EventKeyPress, .utf8, .keycode, .kbdState    ; returns CF=1 if an accelerator key has been detected and executed.

endobj



method TActionList.Create
begin
        inherited [.parent]
        set     [.self], TActionList:IconSize, 16
        return
endp


method TActionList.Destroy
begin
        get     eax, [.self], TActionList:ImgIcons
        stdcall DestroyImage, eax
        inherited
        return
endp


method TActionList.SetIconSize
begin
        push    eax ecx

        mov     ecx, [.self]
        mov     eax, [.value]
        xchg    eax, [ecx+TActionList._icon_size]
        cmp     eax, [ecx+TActionList._icon_size]
        je      .finish

        exec    ecx, TActionList:UpdateActions

.finish:
        pop     ecx eax
        return
endp



method TActionList.UpdateActions
begin
        pushad

        get     edx, [.self], TActionList:FirstChild

.loop:
        test    edx, edx
        jz      .finish

        exec    edx, TAction:UpdateControls

        mov     edx, [edx+TObject.__next]
        jmp     .loop

.finish:
        popad
        return
endp



method TActionList.SetIcons
begin
        pushad

; the .value parameter points to a PNG image in the memory.
        mov     esi, [.self]

        get     ecx, esi, TActionList:ImgIcons
        jecxz   .old_ok

        stdcall DestroyImage, ecx

.old_ok:
        mov     eax, [.value]
        test    eax, eax
        jz      .new_ok

        stdcall CreateImagePNG, eax, -1

.new_ok:
        mov     [esi+TActionList._img_icons], eax
        exec    [.self], TActionList:UpdateActions
        popad
        return
endp



method TActionList.EventKeyPress
begin
        push    eax edx
        get     edx, [.self], TActionList:FirstChild

.loop:
        test    edx, edx
        jz      .finish_no

        cmp     [edx+TAction._accel.key], 0
        je      .next

        mov     eax, [.keycode]
        cmp     eax, [edx+TAction._accel.key]
        jne     .next

        mov     eax, [.kbdState]
        and     eax, Alt or Ctrl or Shift
        cmp     eax, [edx+TAction._accel.flags]
        je      .execute

.next:
        mov     edx, [edx+TObject.__next]
        jmp     .loop

.execute:
        exec    edx, TAction:Execute, 0
        stc
        pop     edx eax
        return

.finish_no:
        clc
        pop     edx eax
        return
endp





endmodule

Added freshlib/gui/TAsmEdit.asm.

































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
; ______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TAsmEdit object class
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Advanced text editor.
;_________________________________________________________________________________________

module "TAsmEdit"

; view options: how the editor looks
aeoLeftMargin          = $01
aeoLineNumbers         = $02
aeoStripedBackground   = $04
aeoConsoleCaret        = $08

; navigation options
aeoScrollYMore         = $0100            ; scroll Y more than needed in order to scroll less and to scroll more readable.
aeoScrollXMore         = $0200            ; scroll X more than needed

; editing options

aeoAutoIndents         = $010000
aeoAutoBrackets        = $020000
aeoSmartTabs           = $040000
aeoPersistentSelection = $080000

aeoDefault = aeoLeftMargin or aeoLineNumbers or aeoConsoleCaret or aeoAutoIndents or aeoSmartTabs or aeoScrollXMore or aeoStripedBackground

; editor mode flags

aemOverwrite = 1
aemBlockSelection = 2



; Operations for undo/redo:

chopInserted = 0
chopDeleted  = 1
chopChanged  = 2


struct TUndoInfo
  .pNext       dd ?       ; pointer to the next TUndoInfo structure in the chain.

  .caretPos    POINT
  .selStart    POINT
  .selEnd      POINT
  .modified    dd ?       ; the modified status.
  .operation   dd ?       ; change operation.
  .group       dd ?       ;
  .line        dd ?       ; the line number affected.
  .pText       dd ?       ; pointer to the previous TTextLine of the affected line for chopChanged and chopDeleted
ends


; The element of the [TTextLine.syn_array] array. Contains information about text highlighting

struct TTextChunk
  .bytes dw ?   ; the length of the text chunk in bytes. (UTF-8 characters???)
  .color db ?   ; byte, index of the color/background of the text chunk.
  .flags db ?   ; the text formatting flags. not used, reserved. For example underlining, bold, etc...
ends


; Constants for the TTextLine.flags

tlfWrapText         = $00000001   ; The text is wrapped to fit to the wrap width of the editor. Not used/not implemented yet!!!
tlfBookmark         = $00000002   ; There is a bookmark on the line.
tlfBreakpoint       = $00000004
tlfRendered         = $80000000   ; The line is properly rendered.
tlfHighlightNeutral = $40000000   ; The line is highlighted with neutral color.
tlfHighlightError   = $20000000   ; the line is highlighted with error color.
tlfmClearHighlight  = not (tlfHighlightNeutral or tlfHighlightError)

; The structure for one text line. This structure is expanded TText gap buffer structure.
; contains the line/IDE related information and UTF-8 encoded text of the line.
; For example the line colorization, format, syntax context, pointer to the debug data, etc.

rstruct TTextLine
  .flags        dd  ?   ; line flags
  .ch_len       dd  ?   ; the length of the text in utf-8 characters.
                        ;
  .debugdata    dd  ?   ; pointer to debug data, associated to this line
                        ;
  .syn_array    dd  ?   ; TArray of TTextChunk items for syntax colorization.
                        ; Should be updated by calling the syntax highlighting proc.
                        ;
  .syn_context  dd  ?   ; Syntax context after the line
                        ;
  .fold_level   dd  ?   ; the level of folding.

  .imgRendered  dd  ?   ; the TImage with the rendered line.
                rd  1
                        ;
  .             TText
ends


; Search options constants

srchCaseSensitive = tsfCaseSensitive
srchWholeWords = 2


object TAsmEdit, TScrollable

; private fields

  ._lines         dd    ?             ; pointer to TText structure that contains pointers to TTextLine structures.
  ._line_widths   dd    ?             ; TArray of TCounter for counting the line width. Must be kept in consistency.

  ._end_of_line   rd    1             ; string (not a pointer) with up to 3 characters for EOL termination. Usually only 1 or 2 are used.

  ._imgMargin     dd    ?
  ._img_margin_valid dd ?

  ._pUndo         dd    ?
  ._pRedo         dd    ?
  ._UndoLevel     dd    ?
  ._prev_char     dd    ?

  ._options       dd    ?             ; behaviour bit options: aeoXXXXXX values.
  ._mode          dd    ?             ; set of aemXXXXX flags.

  ._modified      dd    ?

  ._font_height   dd    ?
  ._font_asc      dd    ?
  ._font_desc     dd    ?

  ._font_width    dd    ?

  ._numfont_width dd    ?

  ._left_margin   dd    ?
  ._num_margin    dd    ?

  ._caretPos      POINT         ; the position of the caret in absolute text coordinates.

  ._selStart      POINT         ; The selection start point
  ._selEnd        POINT         ;
  ._selAreaUpdate dd ?

  ._selCmd        dd    ?       ; ==0 if the shift key wasn't pressed on the last keyboard interaction.
  ._selCmdPrev    dd    ?       ; the previous value of the _selCmd field.

  ._drag_button   dd    ?

  ._width_ch      dd    ?       ; width and
  ._height_ch     dd    ?       ; height of the window in chars. Partial rows and columns are counted

  ._width_ch_nav  dd    ?       ; width and
  ._height_ch_nav dd    ?       ; height of the window in chars. For caret navigation purposes. Only full rows and columns.

  ._prev_y_from   dd    ?       ; what lines were on the screen when the previous lines images cache
  ._prev_y_to     dd    ?       ; was cleaned up. Used in the .__InvalidateImgCache method.

  ._syntax_proc   dd    ?

  ._on_mode_change dd ?
  ._on_caret_move  dd ?

; Current editor search data
  ._search_index   dd ?         ; index of the found instances of ._search_str: array of POINT
  ._search_str     dd ?         ; handle of the last search string
  ._search_options dd ?         ; search options

; parameters

  param .Options, ._options, .SetOptions
  param .Mode, ._mode, .SetMode
  param .EndOfLine, ._end_of_line, .SetEOL

  param .Selection, .GetSelection, NONE
  param .Text,      .GetText,      .SetText             ; This property works with pointer to a asciiz terminated string for "set" and TText for "get" instructions.

  param .LMImage, .GetLeftMargin, NONE

  param .CaretX,    ._caretPos.x, .SetCaretX
  param .CaretY,    ._caretPos.y, .SetCaretY
  param .SelStartX, ._selStart.x, NONE
  param .SelStartY, ._selStart.y, NONE
  param .SelEndX, ._selEnd.x, NONE
  param .SelEndY, ._selEnd.y, NONE

  param .WordAtCaret, .GetWordAtCaret, NONE

  param .SyntaxProc, ._syntax_proc, .SetSyntaxProc

  param .OnModeChange, ._on_mode_change, ._on_mode_change
  param .OnCaretMove, ._on_caret_move, ._on_caret_move

  param .Modified, ._modified, ._modified

; param methods

  method  .SetCaretX, .value
  method  .SetCaretY, .value

  method  .SetOptions, .value
  method  .SetMode, .value
  method  .SetEOL, .value


  method  .HasSelection
  method  .GetSelection

  method  .GetText
  method  .SetText, .value

  method  .GetWordAtCaret
  method  .ReplaceWordAtCaret, .new_word

  method  .GetLeftMargin

  method  .ComputeLeftMarginWidth
  method  .ComputeScreenInChars

  method  .SetSyntaxProc, .value

  method  ._AddSelRectangles, .pRectList
  method  ._AddSelRectanglesAbs, .pRectList

; common methods

  method .Create, .parent
  method .Destroy

  method .UpdateThemeParams

  method .__InvalidateImgCache

  method .__UpdateImages
  method .Resize, .newWidth, .newHeight
  method .Move, .newX, .newY

  method .UpdateScrollBar

  method .UpdateCaretPos

; rendering methods

  method .GetLineImg, .lineNumber

  method .__RenderLine, .pTextLine, .clBackground
  method ._RenderLM,  .pImage, .from, .to       ; .from, .to in character positions, relative to the begining of the window.

; Painting methods

  method .SelfPaint, .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height    ; Paints itself on the caller provided TImage.

  method .__DrawScrollbar, .scrollbar   ; .scrollbar == scrollX or scrollY

; Text navigarion methods

  method .Highlight, .LineNum, .fHighlight

  method .TextLine, .LineNum, .fAddMissing

  method .ScrollToCaretX
  method .ScrollToCaretY
  method .CenterCaretY

  method .CaretLeftRight, .count
  method .CaretUpDown, .count, .scroll


; Selection control methods.

  method .SelStartHere
  method .SelEndHere

  method .SelChangeBegin
  method .SelChangeEnd


; undo/redo

  method .SaveForUndo, .LineNum, .operation
  method .ClearUndoRedo

; Text editing methods

  method .AddChar, .utf8

  method .InsertNewLine, .LineNum
  method .DeleteLine, .LineNum
  method .DeleteChar, .LineNum, .CharPos

  method .JoinNextLine, .LineNum        ; if .LineNum < 0; joins the current caret line
  method .SplitLine, .LineNum, .PosX    ; if .LineNum < 0 splits on caret position.

  method .DeleteSelection
  method .ReplaceSelection, .text

  method .InsertString, .text

  method .AddTrailingSpaces, .LineNum, .PosX  ; if the caret is positioned after the line end, fills with spaces
  method .DelTrailingSpaces, .LineNum         ; deletes the trailing spaces from the line end.

  method .PrefixInsert, .LineFrom, .LineTo, .char
  method .PrefixRemove, .LineFrom, .LineTo, .char
  method .SelectionPrefix, .op, .char

  method .GetSmartTab, .lineNum, .fromX

; Text searching methods

  method .Search, .pattern, .options
  method .SearchHere
  method .SearchNext
  method .SearchPrev

; OS event handlers

  method .EventFocusIn
  method .EventFocusOut

  method .EventScroll, .direction, .command, .value
  method .EventKeyPress, .utf8, .scancode, .kbdState
  method .EventButtonPress, .button, .kbdState, .x, .y
  method .EventButtonRelease, .button, .kbdState, .x, .y
  method .EventButtonDoubleClick, .button, .kbdState, .x, .y
  method .EventMouseMove, .x, .y, .kbdState


; Keyboard UI direct methods.

                                ; usually assigned to:

  method .CaretLeft                     ; Left arrow
  method .CaretRight                    ; Right arrow
  method .CaretUp                       ; Up arrow
  method .CaretDown                     ; Down arrow

  method .CaretHome                     ; Home
  method .CaretEnd                      ; End
  method .CaretTxtHome                  ; Ctrl+PgUp
  method .CaretTxtEnd                   ; Ctrl+PgDn
  method .CaretScrHome                  ; Ctrl+Home
  method .CaretScrEnd                   ; Ctrl+End

  method .CaretWordBack                 ; Ctrl+Left
  method .CaretWordForward              ; Ctrl+Right

  method .Undo                          ; Ctrl+Z
  method .CanUndo
  
  method .Redo                          ; Ctrl+Shift+Z
  method .CanRedo

  method .Cut                           ; Ctrl+X
  method .Copy                          ; Ctrl+C
  method .Paste                         ; Ctrl+V

  method .ToggleBookmark
  method .GoPrevBookmark
  method .GoNextBookmark
  method .ClearBookmarks

  method .IndentSelection
  method .OutdentSelection
  method .CommentSelection
  method .UncommentSelection

endobj



; Create/destroy methods

method TAsmEdit.Create
begin
        inherited [.parent]

        pushad

        mov     edi, [.self]

        set     edi, TAsmEdit:Cursor, mcText
        set     edi, TAsmEdit:WantFocus, TRUE
        set     edi, TAsmEdit:Behavior, wbUseTabKeys or wbUseEnterKey
        exec    edi, TAsmEdit:UpdateThemeParams
        
        set     edi, TAsmEdit:Text, 0
        set     edi, TAsmEdit:Options, aeoDefault
        set     edi, TAsmEdit:EndOfLine, dNEWLINE

        popad
        return
endp



method TAsmEdit.Destroy
begin
        push    ecx
        mov     ecx, [.self]

        DebugMsg "TAsmEdit DESTROY!!!"

        set     ecx, TAsmEdit:Text, 0                   ; Clear all the text.
        stdcall TextFree, [ecx+TAsmEdit._lines]         ; Release the lines TText structure.

        stdcall DestroyImage, [ecx+TAsmEdit._imgMargin]

        pop     ecx
        inherited
        return
endp



method TAsmEdit.UpdateThemeParams
begin
        pushad

        mov     edi, [.self]

        set     edi, TAsmEdit:StepX, [ASM.MouseWheel]
        set     edi, TAsmEdit:StepY, [ASM.MouseWheel]

        stdcall GetFontMetrics, [ASM.Font]
        jc      .finish

        mov     [edi+TAsmEdit._font_height], eax
        mov     [edi+TAsmEdit._font_asc], ebx
        mov     [edi+TAsmEdit._font_desc], edx

;        OutputValue "   Font height:", eax, 10, -1
;        OutputValue " Font ascender:", ebx, 10, -1
;        OutputValue "Font descender:", edx, 10, -1

        stdcall GetTextBounds, "ABCDEFGH", 8, [ASM.Font]
        sar     eax, 3
        jnz     @f
        inc     eax
@@:
        mov     [edi+TAsmEdit._font_width], eax

;        OutputValue "    Font width:", eax, 10, -1

        stdcall GetTextBounds, "99999999", 8, [ASM.NumFont]
        sar     eax, 3
        jnz     @f
        inc     eax
@@:
        mov     [edi+TAsmEdit._numfont_width], eax

        cmp     [edi+TAsmEdit._lines], 0
        je      .finish

        stdcall FreeImagePool

        mov     esi, [edi+TAsmEdit._lines]
        test    esi, esi
        jz      .end_free_loop

        xor     ecx, ecx

.free_loop:
        mov     eax, [esi+TText.GapBegin]
        cmp     ecx, eax
        cmovae  eax, [esi+TText.GapEnd]
        sub     eax, [esi+TText.GapBegin]
        add     eax, ecx

        cmp     eax, [esi+TText.Length]
        jae     .end_free_loop

        mov     edx, [esi+eax]

        xor     eax, eax
        xchg    eax, [edx+TTextLine.imgRendered]
        stdcall DestroyImage, eax

        and     [edx+TTextLine.flags], not tlfRendered

        add     ecx, 4
        jmp     .free_loop

.end_free_loop:

        and     [edi+TAsmEdit._img_margin_valid], 0
        exec    edi, TAsmEdit:ComputeScreenInChars
        exec    edi, TAsmEdit:UpdateCaretPos

        exec    edi, TAsmEdit:RectChanged2, 0

.finish:
        popad
        return
endp




method TAsmEdit.GetLineImg  ; .lineNumber
begin
        pushad

        mov     eax, [.self]

        xor     edx, edx
        test    [esi+TAsmEdit._options], aeoStripedBackground
        cmovnz  edx, [.lineNumber]
        and     edx, 1
        mov     edx, [ASM.clBackground+4*edx]       ; the background color later for __RenderLine

        mov     esi, [eax+TAsmEdit._lines]

        xor     ebx, ebx

        mov     eax, [.lineNumber]
        shl     eax, 2

        cmp     eax, [esi+TText.GapBegin]
        jb      @f
        add     eax, [esi+TText.GapEnd]
        sub     eax, [esi+TText.GapBegin]
@@:
        cmp     eax, [esi+TText.Length]
        jae     .finish

        mov     edi, [esi+eax]  ; TTextLine

        mov     eax, [edi+TTextLine.flags]
        shr     eax, 29                       ; tlfHighlightNeutral or tlfHighlightError
        and     eax, 3
        jz      .color_ok
        cmp     eax, 3
        je      .color_ok

        mov     edx, [ASM.clBackground+4+4*eax]

.color_ok:

        mov     ebx, [edi+TTextLine.imgRendered]

        mov     esi, [.self]
        mov     ecx, [edi+TTextLine.ch_len]
        imul    ecx, [esi+TAsmEdit._font_width]

        test    ebx, ebx
        jz      .create

        test    ecx, ecx
        jz      .destroy

        cmp     ecx, [ebx+TImage.wrapW]
        je      .render_it

        and     [edi+TTextLine.flags], not tlfRendered

;.check_width:
        cmp     ecx, [ebx+TImage.width]
        jle     .set_wrap

.destroy:
        xor     ebx, ebx
        xchg    ebx, [edi+TTextLine.imgRendered]

        stdcall RecycleImage, ebx
        xor     ebx, ebx

.create:
        test    ecx, ecx
        jz      .finish ; here ebx == 0 always.

        stdcall GetRecycledImage, ecx, [esi+TAsmEdit._font_height], griMoreWidth or griExactHeight
        mov     [edi+TTextLine.imgRendered], eax
        mov     ebx, eax

.set_wrap:
        stdcall SetImageWrap, ebx, ecx, [esi+TAsmEdit._font_height]

.render_it:
        test    [edi+TTextLine.flags], tlfRendered
        jnz     .finish

        exec    esi, TAsmEdit:__RenderLine, edi, edx

.finish:
        mov     [esp+4*regEAX], ebx
        popad
        return
endp


method TAsmEdit.GetLeftMargin
begin
        pushad
        mov     esi, [.self]
        mov     edx, [esi+TAsmEdit._imgMargin]

        cmp     [esi+TAsmEdit._img_margin_valid], 0
        jne     @f
        exec    esi, TAsmEdit:_RenderLM, edx, 0, [esi+TAsmEdit._height_ch]
        inc     [esi+TAsmEdit._img_margin_valid]
@@:
        mov     [esp+4*regEAX], edx
        popad
        return
endp


; This method should be called on every operation that changes
; what text lines are displayed on the screen.
; 1. On any scroll in Y direction.
; 2. On inserting or deleting line in the text.
; 3. On window resize in Y direction.
; The call should be made after the actual parameter has been changed,
; but before the editor window has been rendered.
;
; The method removes the TTextLine.imgRendered images from the lines
; that are off the screen (with possible support for some reserve off
; the screen for faster rendering.
;
; Also, it is possible to render offscreen lines and cache cleanup
; in a separate thread in order to provide the best possible speed.
;
; prev:         x0|=======|y0
; current:                   x1|-------|y1
;
;               x0|=======|y0
;  x1|-------|y1
;
;               x0|=======|y0
;                   x1|--------|y1
;
;               x0|=======|y0
;           x1|-------|y1
;
;
;               x0|=======|y0
;           x1|---------------|y1
;
;           x0|===============|y0
;               x1|-------|y1
;
;Left interval to recycle:
; from min(x0, x1) to min(y0, x1)
;
;Right interval to recycle:
; from max(x0, y1) to max(y0, y1)
;

method TAsmEdit.__InvalidateImgCache
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TAsmEdit._lines]

        get     ebx, esi, TAsmEdit:PosY           ; x1

        mov     ecx, [esi+TAsmEdit._prev_y_from]  ; x0
        mov     edx, [esi+TAsmEdit._prev_y_to]    ; y0

; left interval

        cmp     ecx, ebx        ; x0, x1
        cmovg   ecx, ebx        ; ecx = min(x0, x1) = from left

        cmp     edx, ebx        ; y1, x1
        cmovg   edx, ebx        ; edx = min(y0, x1) = to left

        call    .recycle_loop

        mov     ecx, [esi+TAsmEdit._prev_y_from]  ; x0
        mov     edx, [esi+TAsmEdit._prev_y_to]    ; y0

; store the new "previous" values.
        mov     [esi+TAsmEdit._prev_y_from], ebx
        add     ebx, [esi+TAsmEdit._height_ch]    ; y1
        mov     [esi+TAsmEdit._prev_y_to], ebx

        cmp     ecx, ebx        ; x0, y1
        cmovl   ecx, ebx        ; ecx = max(x0, y1)

        cmp     edx, ebx        ; y0, y1
        cmovl   edx, ebx        ; edx = max(y0, y1)

        call    .recycle_loop

        popad
        return


; iterates the lines from ecx to edx and recycles the line rendered images for future use.

.recycle_loop:
        cmp     ecx, edx
        jae     .end_recycle

        lea     eax, [4*ecx]
        cmp     eax, [edi+TText.GapBegin]
        jb      .ofs_ok
        add     eax, [edi+TText.GapEnd]
        sub     eax, [edi+TText.GapBegin]
.ofs_ok:
        cmp     eax, [edi+TText.Length]
        jae     .end_recycle

        mov     eax, [edi+eax]
        cmp     [eax+TTextLine.imgRendered], 0
        je      .next_line

        stdcall RecycleImage, [eax+TTextLine.imgRendered]
        and     [eax+TTextLine.imgRendered], 0
        and     [eax+TTextLine.flags], not tlfRendered

.next_line:
        inc     ecx
        jmp     .recycle_loop

.end_recycle:
        retn

endp




; TAsmEdit.SelfPaint method

method TAsmEdit.SelfPaint       ;.pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height    ; Paints itself on the caller provided TImage.

.offs_x dd ?
.offs_y dd ?

.line_x_offs dd ?
.y           dd ?

.rect_src RECT  ; the rectangle on the client that need to be drawn.
.rect_ln  RECT  ; the rectangle of the current line that need to be drawn in line image coordinates.
.rect_rm  RECT  ; the rectangle of the remaining area after the end of the current line.

.rect_dst RECT

begin
        pushad

        mov     esi, [.self]

        mov     ecx, [.xDst]            ;
        mov     edx, [.yDst]            ;
        sub     ecx, [.xSrc]            ;
        sub     edx, [.ySrc]            ;
        mov     [.offs_x], ecx          ;
        mov     [.offs_y], edx          ; the offset between the source and destination rectangles.

        mov     ecx, [.xSrc]            ;
        mov     edx, [.ySrc]            ;
        mov     [.rect_src.left], ecx   ;
        mov     [.rect_src.top], edx    ;
        add     ecx, [.width]           ;
        add     edx, [.height]          ;
        mov     [.rect_src.right], ecx  ;
        mov     [.rect_src.bottom], edx ; clip everything to the source rectangle

; draw all lines in the rectangle...

        get     eax, esi, TAsmEdit:PosX
        imul    eax, [esi+TAsmEdit._font_width] ; horizontal offset of the line images in pixels.
        mov     [.line_x_offs], eax             ; from where the line image should be drawn on the client text area. (client coordinates, not related to the drawing rectangle).

        get     ebx, esi, TAsmEdit:PosY

        mov     eax, [.ySrc]
        xor     edx, edx
        mov     ecx, eax
        div     [esi+TAsmEdit._font_height]

        add     ebx, eax        ; the first line in the source rectangle.

        sub     ecx, edx        ; == ySrc - ySrc mod font_height
        mov     [.y], ecx       ; the top Y coordinate of the first line in client coordinates.

.line_loop:

        mov     eax, [.y]
        cmp     eax, [.rect_src.bottom]
        jge     .end_lines

        mov     [.rect_ln.top], eax
        mov     [.rect_rm.top], eax
        add     eax, [esi+TAsmEdit._font_height]
        mov     [.rect_ln.bottom], eax
        mov     [.rect_rm.bottom], eax

        mov     ecx, [esi+TAsmEdit._left_margin]
        mov     [.rect_ln.left], ecx

        exec    esi, TAsmEdit:GetLineImg, ebx   ; returns valid, rendered TImage for the given line.
        mov     edx, eax

        xor     eax, eax
        test    edx, edx
        jz      @f
        mov     eax, [edx+TImage.wrapW]
@@:
        add     eax, ecx
        sub     eax, [.line_x_offs]
        cmovge  ecx, eax
        mov     [.rect_ln.right], ecx
        mov     [.rect_rm.left], ecx
        jle     .line_ok

        lea     eax, [.rect_ln]
        lea     ecx, [.rect_src]
        stdcall RectIntersect2, eax, ecx
        jc      .line_ok

        mov     ecx, [.rect_ln.left]
        mov     eax, [.rect_ln.top]
        sub     [.rect_ln.right], ecx
        sub     [.rect_ln.bottom], eax

        push    ecx eax

        add     ecx, [.line_x_offs]
        sub     ecx, [esi+TAsmEdit._left_margin]
        sub     eax, [.y]
        mov     [.rect_ln.left], ecx
        mov     [.rect_ln.top], eax

        pop     eax ecx
        add     ecx, [.offs_x]
        add     eax, [.offs_y]

        stdcall CopyImageRect, [.pDstImage], ecx, eax, edx, [.rect_ln.left], [.rect_ln.top], [.rect_ln.right], [.rect_ln.bottom]

.line_ok:

; draw the remaining background if any.

        mov     eax, [.rect_src.right]
        mov     [.rect_rm.right], eax

        lea     eax, [.rect_rm]
        lea     ecx, [.rect_src]
        stdcall RectIntersect2, eax, ecx
        jc      .background_ok

        xor     edx, edx
        exec    esi, TAsmEdit:TextLine, ebx, FALSE
        jc      .high_ok
        mov     eax, [eax]
        mov     eax, [eax+TTextLine.flags]
        shr     eax, 29
        and     eax, 3
        jz      .high_ok
        lea     edx, [eax+1]
        and     edx, 3
.high_ok:

        mov     ecx, [.rect_rm.left]
        mov     eax, [.rect_rm.top]
        sub     [.rect_rm.right], ecx
        sub     [.rect_rm.bottom], eax

        add     ecx, [.offs_x]
        add     eax, [.offs_y]  ; to destination coordinates.

        test    edx, edx
        jnz     .bgcol_ok

        test    [esi+TAsmEdit._options], aeoStripedBackground
        cmovnz  edx, ebx
        and     edx, 1

.bgcol_ok:
        stdcall DrawSolidRect, [.pDstImage], ecx, eax, [.rect_rm.right], [.rect_rm.bottom], [ASM.clBackground+4*edx]

.background_ok:

        inc     ebx

        mov     eax, [esi+TAsmEdit._font_height]
        add     [.y], eax
        jmp     .line_loop


.end_lines:

; Here, draw the left margin.

        xor     eax, eax
        mov     ecx, [esi+TAsmEdit._left_margin]
        mov     edx, [esi+TAsmEdit._height]
        mov     [.rect_dst.top], eax
        mov     [.rect_dst.left], eax
        mov     [.rect_dst.right], ecx
        mov     [.rect_dst.bottom], edx

        lea     edx, [.rect_dst]
        lea     ecx, [.rect_src]
        stdcall RectIntersect2, edx, ecx
        jc      .margin_ok

        mov     ecx, [.rect_dst.left]
        mov     eax, [.rect_dst.top]
        sub     [.rect_dst.right], ecx
        sub     [.rect_dst.bottom], eax

        add     ecx, [.offs_x]
        add     eax, [.offs_y]

        get     edx, esi, TAsmEdit:LMImage
        stdcall CopyImageRect, [.pDstImage], ecx, eax, edx, [.rect_dst.left], [.rect_dst.top], [.rect_dst.right], [.rect_dst.bottom]

.margin_ok:

; Here, draw the selection if any.

        exec    esi, TAsmEdit:_AddSelRectangles, 0
        push    edx

        mov     ecx, [edx+TArray.count]
        test    ecx, ecx
        jz      .selection_ok

        mov     eax, [.xSrc]
        mov     ebx, [.ySrc]
        mov     [.rect_dst.left], eax
        mov     [.rect_dst.top], ebx

        add     eax, [.width]
        add     ebx, [.height]
        mov     [.rect_dst.right], eax
        mov     [.rect_dst.bottom], ebx

        lea     edi, [edx+TArray.array]
        lea     ebx, [.rect_dst]

.loop:
        mov     eax, [edi+RECT.left]
        mov     edx, [edi+RECT.top]

        imul    eax, [esi+TAsmEdit._font_width]
        imul    edx, [esi+TAsmEdit._font_height]

        add     eax, [esi+TAsmEdit._left_margin]

        mov     [edi+RECT.left], eax
        mov     [edi+RECT.top], edx

        mov     eax, [edi+RECT.right]
        mov     edx, [edi+RECT.bottom]

        imul    eax, [esi+TAsmEdit._font_width]
        imul    edx, [esi+TAsmEdit._font_height]

        add     eax, [esi+TAsmEdit._left_margin]

        mov     [edi+RECT.right], eax
        mov     [edi+RECT.bottom], edx

        stdcall RectIntersect2, edi, ebx
        jc      .next

        push    [ASM.clSelection]

        mov     edx, [edi+RECT.bottom]
        mov     eax, [edi+RECT.right]
        sub     edx, [edi+RECT.top]
        sub     eax, [edi+RECT.left]

        push    edx     ; height
        push    eax     ; width

        mov     eax, [edi+RECT.left]
        mov     edx, [edi+RECT.top]
        add     eax, [.offs_x]
        add     edx, [.offs_y]

;        stdcall BlendSolidRect, [.pDstImage], eax, edx  ; remaining arguments from the stack.
        stdcall XorRect, [.pDstImage], eax, edx ; remaining from the stack

.next:
        add     edi, sizeof.RECT
        dec     ecx
        jnz     .loop

.selection_ok:
        stdcall FreeMem ; from the stack

        popad
        inherited       [.pDstImage], [.xDst], [.yDst], [.xSrc], [.ySrc], [.width], [.height]
        return
endp




method TAsmEdit.__DrawScrollbar ; .scrollbar
begin
        pushad

        cmp       [.scrollbar], scrollX
        je        .finish

        mov     esi, [.self]
        mov     edi, [esi+TAsmEdit._search_index]
        test    edi, edi
        jz      .finish

        mov     ebx, [esi+TAsmEdit._imgY]
        test    ebx, ebx
        jz      .finish

        cmp     [esi+TAsmEdit._scrXY.max+4], 0
        je      .finish

        mov     eax, [ebx+TImage.wrapW]
        mov     ebx, [ebx+TImage.wrapH]
        sub     ebx, eax

        lea     eax, [esi+TAsmEdit._scrXY]
        stdcall _SliderPixels2, eax, scrollY, ebx

        sub     ebx, edx  ; the height of the scroller without the slider.
        mov     ecx, [edi+TArray.count]

.loop:
        dec     ecx
        js      .finish

        mov     eax, [edi + TArray.array + sizeof.POINT*ecx + POINT.y]
        mul     ebx
        div     [esi+TAsmEdit._scrXY.max+4]

        stdcall DrawSolidRect, [esi+TAsmEdit._imgY], 0, eax, [GUI.scrollWidth], 1, $ffff0000
        jmp     .loop

.finish:
        inherited [.scrollbar]
        pushad
        return
endp



method TAsmEdit.__RenderLine    ;, .pTextLine, .clBackground

.img       dd ?
.gap_start dd ?
.gap_end   dd ?
.txt_end   dd ?
.x         dd ?
.y         dd ?

begin
        pushad

        mov     esi, [.self]
        mov     eax, [esi+TAsmEdit._font_asc]
        mov     [.y], eax

        mov     esi, [.pTextLine]       ; Should not be called with invalid [.pTextLine]
        mov     edi, [esi+TTextLine.syn_array]
        test    edi, edi
        jnz     .syntax_ok

        get     eax, [.self], TAsmEdit:SyntaxProc
        test    eax, eax
        jz      .syntax_ok

        stdcall eax, esi, 0   ; the syntax context is set to 0 here, but should be read from the previous line.
        mov     edi, [esi+TTextLine.syn_array]

.syntax_ok:
        mov     eax, [esi+TTextLine.imgRendered]
        mov     [.img], eax

        mov     eax, [esi+TTextLine.GapBegin]
        mov     ecx, [esi+TTextLine.GapEnd]
        mov     edx, [esi+TTextLine.Length]

        add     eax, esi
        add     ecx, esi
        add     edx, esi

        mov     [.gap_start], eax
        mov     [.gap_end], ecx
        mov     [.txt_end], edx

        xor     ebx, ebx                ; position inside the TTextChunk array.
        mov     [.x], ebx
        dec     ebx

.loop:
        cmp     esi, [.txt_end]
        jae     .end_of_line

        test    edi, edi
        jz      .default_color

        inc     ebx
        cmp     ebx, [edi + TArray.count]
        jae     .default_color

        movzx   ecx, byte [edi + TArray.array + sizeof.TTextChunk * ebx + TTextChunk.color]
        movzx   edx, word [edi + TArray.array + sizeof.TTextChunk * ebx + TTextChunk.bytes]
        and     ecx, ciExtended + $0f

        test    ecx, ciExtended
        jz      .chunk_ok

        inc     ebx     ; next chunk contains only the second word of the length.
        movzx   eax, word [edi + TArray.array + sizeof.TTextChunk * ebx + TTextChunk.bytes]
        shl     eax, 16
        add     edx, eax
        and     ecx, $0f

.chunk_ok:
        lea     eax, [edx+esi]

        cmp     esi, [.gap_end]
        jae     .ofs_ok

        cmp     eax, [.gap_start]
        jbe     .ofs_ok

        mov     eax, [.gap_start]
        sub     eax, esi
        jz      @f

        call    .draw_current_chunk

@@:
        mov     esi, [.gap_end]
        sub     edx, eax        ; remaining of the chunk on the other side of the gap.

.ofs_ok:
        mov     eax, edx
        test    eax, eax
        jz      .loop

        call    .draw_current_chunk
        add     esi, edx
        jmp     .loop

.default_color:
        xor     ecx, ecx
        mov     edx, [.txt_end]
        sub     edx, esi
        jnz     .chunk_ok

.end_of_line:
        mov     esi, [.pTextLine]
        or      [esi+TTextLine.flags], tlfRendered

        popad
        return


.draw_current_chunk:
        push    eax ebx edx

        push    [ASM.clText+4*ecx]
        push    [ASM.Font]
        push    [.y]
        push    [.x]
        push    eax
        push    esi
        push    [.img]

        stdcall GetTextBounds, esi, eax, [ASM.Font]
        mov     edx, [.img]
        stdcall DrawSolidRect, edx, [.x], 0, eax, [edx+TImage.wrapH], [.clBackground]

        stdcall DrawString      ; the arguments are in the stack: [.img], esi, eax, [.x], [.y], [ASM.Font], [ASM.clText+4*ecx]
        add     [.x], eax
        pop     edx ebx eax
        retn
endp








method TAsmEdit.EventMouseMove   ;, .x, .y, .kbdState
begin
        inherited [.x], [.y], [.kbdState]
        jc        .processed

        pushad
        mov     esi, [.self]

        cmp     [esi+TAsmEdit._drag_button], mbLeft
        jne     .finish

        xor     ecx, ecx

        exec    esi, TAsmEdit:SelChangeBegin

        mov     eax, [.x]
        sub     eax, [esi+TAsmEdit._left_margin]
        cdq
        idiv    [esi+TAsmEdit._font_width]
        shl     edx, 1
        sbb     eax, 0

        get     ebx, esi, TAsmEdit:PosX
        add     eax, ebx
        cmovs   eax, ecx
        set     esi, TAsmEdit:CaretX, eax
        mov     [esi+TAsmEdit._selEnd.x], eax

        mov     eax, [.y]
        cdq
        idiv    [esi+TAsmEdit._font_height]
        shl     edx, 1
        sbb     eax, 0

        get     ebx, esi, TAsmEdit:PosY
        add     eax, ebx
        cmovs   eax, ecx
        set     esi, TAsmEdit:CaretY, eax
        mov     [esi+TAsmEdit._selEnd.y], eax

        exec    esi, TAsmEdit:UpdateCaretPos
        exec    esi, TAsmEdit:SelChangeEnd

        exec    esi, TAsmEdit:ScrollToCaretX
        mov     ecx, eax
        exec    esi, TAsmEdit:ScrollToCaretY
        or      ecx, eax
        jz      .finish

; repeat the scroll if the mouse is outside the  window!
        stdcall ZeroMouseMove

.finish:
        popad

.processed:
        return
endp



method TAsmEdit.EventButtonPress        ;, .button, .kbdState, .x, .y
begin
        inherited [.button], [.kbdState], [.x], [.y]
        jc        .processed

        pushad
        mov     esi, [.self]
        mov     edx, [.button]

        cmp     edx, mbRight
        jne     .set_drag

        exec    esi, TAsmEdit:HasSelection
        jc      .processed

.set_drag:
        mov     [esi+TAsmEdit._drag_button], edx

        stdcall SetMouseCapture, esi

        exec    esi, TAsmEdit:SelChangeBegin

        xor     ecx, ecx

        mov     eax, [.x]
        sub     eax, [esi+TAsmEdit._left_margin]
        cdq
        idiv    [esi+TAsmEdit._font_width]

        get     ebx, esi, TAsmEdit:PosX
        add     eax, ebx
        cmovs   eax, ecx
        set     esi, TAsmEdit:CaretX, eax
        mov     [esi+TAsmEdit._selStart.x], eax
        mov     [esi+TAsmEdit._selEnd.x], eax

        mov     eax, [.y]
        cdq
        idiv    [esi+TAsmEdit._font_height]
        get     ebx, esi, TAsmEdit:PosY
        add     eax, ebx
        cmovs   eax, ecx
        set     esi, TAsmEdit:CaretY, eax
        mov     [esi+TAsmEdit._selStart.y], eax
        mov     [esi+TAsmEdit._selEnd.y], eax

        exec    esi, TAsmEdit:UpdateCaretPos
        exec    esi, TAsmEdit:SelChangeEnd

        popad

.processed:
        return
endp



method TAsmEdit.EventButtonRelease      ;, .button, .kbdState, .x, .y
begin
        push    eax

        mov     eax, [.self]
        and     [eax+TAsmEdit._drag_button], 0
        stdcall SetMouseCapture, 0

        pop     eax

        inherited [.button], [.kbdState], [.x], [.y]
        return
endp


method TAsmEdit.EventButtonDoubleClick
begin
        inherited [.button], [.kbdState], [.x], [.y]
        jc        .finish

        pushad

        mov     esi, [.self]

        mov     edi, [esi+TAsmEdit._lines]
        mov     ecx, [esi+TAsmEdit._caretPos.y]
        shl     ecx, 2

        mov     eax, [edi+TText.GapBegin]
        cmp     ecx, eax
        cmovae  eax, [edi+TText.GapEnd]
        sub     eax, [edi+TText.GapBegin]
        add     eax, ecx

        cmp     eax, [edi+TText.Length]
        jae     .not_a_word

        mov     edi, [edi+eax]

        stdcall TextIndexToPos, edi, [esi+TAsmEdit._caretPos.x]
        jc      .not_a_word
        mov     ebx, eax

        stdcall TextMoveGap, edi, ebx

        cmp     ebx, [edi+TTextLine.GapBegin]
        ja      .not_a_word

        push    ebx

.loop_back:
        dec     ebx
        js      .start_is_here

        mov     al, [edi+ebx+TTextLine]
        stdcall RecognizeChar, SepMapSansPoints
        jnc     .loop_back

.start_is_here:
        inc     ebx
        stdcall TextMoveGap, edi, ebx   ; the whole word is after the gap.

        add     ebx, [edi+TTextLine.GapEnd]
        sub     ebx, [edi+TTextLine.GapBegin]
        mov     ecx, ebx        ; start of the word.

        pop     ebx
        add     ebx, [edi+TTextLine.GapEnd]
        sub     ebx, [edi+TTextLine.GapBegin]
        dec     ebx

.loop_forward:
        inc     ebx

        cmp     ebx, [edi+TTextLine.Length]
        jae     .end_is_here

        mov     al, [edi+ebx+TTextLine]

        stdcall RecognizeChar, SepMapWithPoints
        jnc     .loop_forward

.end_is_here:
        cmp     ebx, ecx
        je      .not_a_word

        ofs2pos ecx, edi
        stdcall TextPosToIndex, edi, ecx
        mov     ecx, eax

        ofs2pos ebx, edi
        stdcall TextPosToIndex, edi, ebx
        mov     ebx, eax

        set     esi, TAsmEdit:CaretX, ecx
        exec    esi, TAsmEdit:SelStartHere
        set     esi, TAsmEdit:CaretX, ebx
        exec    esi, TAsmEdit:SelEndHere
        exec    esi, TAsmEdit:UpdateCaretPos

        popad
        return

.not_a_word:
        xor     eax, eax
        stc

.exit:
        popad

.finish:
        return
endp



method TAsmEdit.EventScroll
begin
        inherited [.direction], [.command], [.value]
        jc       .finish

        push    esi
        mov     esi, [.self]

        cmp     [.direction], scrollX
        je      .y_ok

        exec    esi, TAsmEdit:__InvalidateImgCache
        mov     [esi+TAsmEdit._img_margin_valid], 0

.y_ok:
        exec    esi, TAsmEdit:UpdateCaretPos
        exec    esi, TAsmEdit:RectChanged2, 0

        pop     esi

.finish:
        return
endp





; returns in EDX the rectangle list.

method TAsmEdit._AddSelRectanglesAbs      ;, .pRectList
begin
        pushad

        mov     esi, [.self]
        mov     edx, [.pRectList]

        test    edx, edx
        jnz     .array_ok

        stdcall CreateArray, sizeof.RECT
        mov     edx, eax

.array_ok:

        mov     eax, [esi+TAsmEdit._selStart.x]
        mov     ecx, [esi+TAsmEdit._selStart.y]
        mov     ebx, [esi+TAsmEdit._selEnd.x]
        mov     edi, [esi+TAsmEdit._selEnd.y]

        test    [esi+TAsmEdit._mode], aemBlockSelection
        jz      .add_char

; block selection

        push    eax
        stdcall AddArrayItems, edx, 1
        mov     esi, eax
        pop     eax

        mov     [esi+RECT.left], eax
        mov     [esi+RECT.right], ebx
        mov     [esi+RECT.top], ecx
        mov     [esi+RECT.bottom], edi
        stdcall RectSort, esi
        inc     [esi+RECT.bottom]
        jmp     .end_sel

.add_char:
        cmp     ecx, edi        ; caret_y and selection_y
        jl      .order_ok
        jg      .reverse

        cmp     eax, ebx        ; caret_x and caret_y
        je      .end_sel
        jl      .order_ok

.reverse:
        xchg    eax, ebx
        xchg    ecx, edi

; now eax,ecx are the begining of the selection and ebx, edi the end of the selection.
.order_ok:
        test    eax, eax
        jz      .more_than_one

        push    eax
        stdcall AddArrayItems, edx, 1
        mov     esi, eax
        pop     eax

        mov     [esi+RECT.left], eax
        mov     [esi+RECT.top], ecx
        inc     ecx
        mov     [esi+RECT.bottom], ecx
        mov     [esi+RECT.right], $7fffffff

        cmp     ecx, edi
        je      .maybe_one
        jb      .more_than_one

; one line selection.
        mov     [esi+RECT.right], ebx
        jmp     .end_sel

.maybe_one:
        test    ebx, ebx
        jz      .end_sel

.more_than_one:
        cmp     ecx, edi
        je      .final_rect

        stdcall AddArrayItems, edx, 1
        mov     esi, eax

        mov     [esi+RECT.left], 0
        mov     [esi+RECT.top], ecx
        mov     [esi+RECT.right], $7fffffff
        mov     [esi+RECT.bottom], edi

.final_rect:
        test    ebx, ebx
        jz      .end_sel

        stdcall AddArrayItems, edx, 1
        mov     esi, eax

        mov     [esi+RECT.left], 0
        mov     [esi+RECT.top], edi
        inc     edi
        mov     [esi+RECT.right], ebx
        mov     [esi+RECT.bottom], edi

.end_sel:
        mov     [esp+4*regEDX], edx
        popad
        return
endp




; returns in EDX the rectangle list.

method TAsmEdit._AddSelRectangles       ;, .pRectList
.rect1 RECT
.rect2 RECT
.rect3 RECT

.client RECT
begin
        pushad

        xor     eax, eax
        lea     edi, [.rect1]
        mov     ecx, sizeof.RECT * 4 / 4

        rep stosd

        mov     esi, [.self]
        mov     edx, [.pRectList]

        test    edx, edx
        jnz     .array_ok
        stdcall CreateArray, sizeof.RECT
        mov     edx, eax
.array_ok:

        mov     eax, [esi+TAsmEdit._width_ch]
        mov     ecx, [esi+TAsmEdit._height_ch]
        mov     [.client.right], eax
        mov     [.client.bottom], ecx

        mov     eax, [esi+TAsmEdit._selStart.x]
        mov     ecx, [esi+TAsmEdit._selStart.y]
        mov     ebx, [esi+TAsmEdit._selEnd.x]
        mov     edi, [esi+TAsmEdit._selEnd.y]

        test    [esi+TAsmEdit._mode], aemBlockSelection
        jnz     .add_block

        cmp     ecx, edi        ; caret_y and selection_y
        jl      .order_ok
        jg      .reverse

        cmp     eax, ebx        ; caret_x and caret_y
        je      .finish
        jl      .order_ok

.reverse:
        xchg    eax, ebx
        xchg    ecx, edi

; now eax,ecx is the begining of the selection and ebx, edi the end of the selection.
.order_ok:
        mov     [.rect1.left], eax
        mov     [.rect1.top], ecx
        mov     [.rect1.right], $7fffffff
        inc     ecx
        mov     [.rect1.bottom], ecx

        cmp     ecx, edi        ; begin_y and end_y
        jl      .first_ok
        je      .middle_ok

; there is only one line selection

        mov     [.rect1.right], ebx
        jmp     .rect1_only

.first_ok:
;        mov     [.rect2.left], 0       ; already 0
        mov     [.rect2.top], ecx
        mov     [.rect2.right], $7fffffff
        mov     [.rect2.bottom], edi

.middle_ok:
;        mov     [.rect3.left], 0       ; already 0
        mov     [.rect3.top], edi
        mov     [.rect3.right], ebx

        inc     edi
        mov     [.rect3.bottom], edi

; now offset rectangles

        get     eax, esi, TAsmEdit:PosX
        get     ecx, esi, TAsmEdit:PosY

        sub     [.rect1.left], eax
        sub     [.rect1.top], ecx
        sub     [.rect1.right], eax
        sub     [.rect1.bottom], ecx

        sub     [.rect2.left], eax
        sub     [.rect2.top], ecx
        sub     [.rect2.right], eax
        sub     [.rect2.bottom], ecx

        sub     [.rect3.left], eax
        sub     [.rect3.top], ecx
        sub     [.rect3.right], eax
        sub     [.rect3.bottom], ecx

        lea     ecx, [.client]
        lea     eax, [.rect1]

        stdcall RectIntersect2, eax, ecx
        jc      .rect1_ok

        stdcall RectListAdd, edx, eax

.rect1_ok:
        lea     eax, [.rect2]
        stdcall RectIntersect2, eax, ecx
        jc      .rect2_ok

        stdcall RectListAdd, edx, eax

.rect2_ok:
        lea     eax, [.rect3]
        stdcall RectIntersect2, eax, ecx
        jc      .finish

        stdcall RectListAdd, edx, eax
        jmp     .finish


.add_block:
        mov     [.rect1.left], eax
        mov     [.rect1.right], ebx
        mov     [.rect1.top], ecx
        mov     [.rect1.bottom], edi
        lea     eax, [.rect1]
        stdcall RectSort, eax
        inc     [.rect1.bottom]

.rect1_only:
        get     eax, esi, TAsmEdit:PosX
        get     ecx, esi, TAsmEdit:PosY

        sub     [.rect1.left], eax
        sub     [.rect1.top], ecx
        sub     [.rect1.right], eax
        sub     [.rect1.bottom], ecx

        lea     eax, [.rect1]
        lea     ecx, [.client]
        stdcall RectIntersect2, eax, ecx
        jc      .finish

        stdcall RectListAdd, edx, eax

.finish:
        mov     [esp+4*regEDX], edx
        popad
        return
endp






method TAsmEdit.SetSyntaxProc
begin
        pushad
        mov     esi, [.self]
        mov     eax, [.value]
        xchg    eax, [esi+TAsmEdit._syntax_proc]
        cmp     eax, [.value]
        je      .finish

; if the syntax procedure were changed, then
; free all syntax arrays from the lines and
; invalidate the rendered images.

        mov     edi, [esi+TAsmEdit._lines]
        xor     ecx, ecx

.loop:
        mov     eax, ecx
        shl     eax, 2
        cmp     eax, [edi+TText.GapBegin]
        jb      @f
        add     eax, [edi+TText.GapEnd]
        sub     eax, [edi+TText.GapBegin]
@@:
        cmp     eax, [edi+TText.Length]
        jae     .refresh

        mov     eax, [edi+eax]

        xor     edx, edx
        xchg    edx, [eax+TTextLine.syn_array]
        stdcall FreeMem, edx

        and     [eax+TTextLine.flags], not tlfRendered  ; set the line not rendered.

        inc     ecx
        jmp     .loop

.refresh:
        and     [esi+TAsmEdit._img_margin_valid], 0
        exec    esi, TAsmEdit:RectChanged2, 0

.finish:
        popad
        return
endp




method TAsmEdit.AddChar ;, .utf8
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [esi+TAsmEdit._caretPos.y]
        exec    esi, TAsmEdit:TextLine, ebx, TRUE
        mov     edi, eax

; change the undo group level for every space character in the line.
        mov     eax, [.utf8]
        cmp     eax, ' '
        jne     .level_ok

        cmp     [esi+TAsmEdit._prev_char], ' '
        je      .level_ok

        inc     [esi+TAsmEdit._UndoLevel]

.level_ok:
        mov     [esi+TAsmEdit._prev_char], eax

        exec    esi, TAsmEdit:SaveForUndo, ebx, chopChanged
        exec    esi, TAsmEdit:AddTrailingSpaces, ebx, [esi+TAsmEdit._caretPos.x]

        test    [esi+TAsmEdit._mode], aemOverwrite
        jz      .ins_ok

        exec    esi, TAsmEdit:DeleteChar, ebx, [esi+TAsmEdit._caretPos.x]

.ins_ok:
        stdcall TextIndexToPos, [edi], [esi+TAsmEdit._caretPos.x]
        stdcall TextMoveGap, [edi], eax
        stdcall TextAddChar, [edi], [.utf8]
        mov     [edi], edx

        push    [edx+TTextLine.ch_len]
        inc     [edx+TTextLine.ch_len]
        push    [edx+TTextLine.ch_len]

        stdcall IncCount, [esi+TAsmEdit._line_widths]   ; count from the stack!
        stdcall DecCount, edx                           ; count from the stack!
        mov     [esi+TAsmEdit._line_widths], edx

        and     [edx+TTextLine.flags], not tlfRendered

        exec    esi, TAsmEdit:DelTrailingSpaces, [esi+TAsmEdit._caretPos.y]
        exec    esi, TAsmEdit:CaretLeftRight, 1

        popad
        return
endp




method TAsmEdit.EventKeyPress
.selCmd dd ?
.rect RECT
begin
        inherited [.utf8], [.scancode], [.kbdState]
        jnc       .not_processed

        return

.not_processed:
        pushad

        mov     esi, [.self]

; check the keys

        mov     eax, [.utf8]

;        OutputValue "Key status: ", [.kbdState], 16, 8
;        OutputValue "Key utf8: ", eax, 16, 8
;        OutputValue "Key scancode: ", [.scancode], 16, 8

        test    eax, eax
        jz      .no_char

        cmp     eax, $20
        jb      .ctrl_char

        cmp     eax, $7f
        je      .no_char

; here handle usual typing!

        OutputValue "Character pressed: ", eax, 16, 8

        test    [.kbdState], Alt or Ctrl  ; here Alt and Ctrl should be not pressed.
        jnz     .finish_not_processed

        call    .line_render_rect

        push    eax
        exec    esi, TAsmEdit:DeleteSelection
        pop     eax
        exec    esi, TAsmEdit:AddChar, eax

        call    .render_changed_line
        jmp     .finish_processed

.ctrl_char:

        cmp     eax, 8          ; BackSpace
        je      .backspacekey

        cmp     eax, 9          ; tab
        je      .tabkey

        cmp     eax, 13         ; Enter
        je      .enterkey

.no_char:
        mov     eax, [.scancode]

        cmp     eax, keyF5
        je      .refresh

; moving commands

; ignore the modifier keys because they break the _selCmd field in TAsmEdit
; and they are not used for control of the editor.

        cmp     eax, keyShiftLeft
        je      .finish_not_processed
        cmp     eax, keyShiftRight
        je      .finish_not_processed
        cmp     eax, keyCtrlLeft
        je      .finish_not_processed
        cmp     eax, keyCtrlRight
        je      .finish_not_processed
        cmp     eax, keyAltLeft
        je      .finish_not_processed
        cmp     eax, keyAltRight
        je      .finish_not_processed

; what is the selection command?
        mov     ecx, [.kbdState]
        and     ecx, maskShift
        xchg    ecx, [esi+TAsmEdit._selCmd]
        mov     [esi+TAsmEdit._selCmdPrev], ecx

        cmp     [esi+TAsmEdit._selCmd], 0
        je      .first_sel_ok

        exec    esi, TAsmEdit:SelChangeBegin

        cmp     [esi+TAsmEdit._selCmdPrev], 0
        jne     .first_sel_ok

        exec    esi, TAsmEdit:SelStartHere
        exec    esi, TAsmEdit:SelEndHere

.first_sel_ok:
        mov     eax, [.scancode]

        inc     [esi+TAsmEdit._UndoLevel]

        cmp     eax, keyLeftNumpad
        je      .left
        cmp     eax, keyLeft
        je      .left

        cmp     eax, keyRightNumpad
        je      .right
        cmp     eax, keyRight
        je      .right

        cmp     eax, keyHomeNumpad
        je      .homekey
        cmp     eax, keyHome
        je      .homekey

        cmp     eax, keyEndNumpad
        je      .endkey
        cmp     eax, keyEnd
        je      .endkey

        cmp     eax, keyPgUpNumpad
        je      .pgupkey
        cmp     eax, keyPgUp
        je      .pgupkey

        cmp     eax, keyPgDnNumpad
        je      .pgdnkey
        cmp     eax, keyPgDown
        je      .pgdnkey

        cmp     eax, keyUpNumpad
        je      .up
        cmp     eax, keyUp
        je      .up

        cmp     eax, keyDownNumpad
        je      .down
        cmp     eax, keyDown
        je      .down

        dec     [esi+TAsmEdit._UndoLevel]

; end of moving commands

        cmp     eax, keyInsNumpad
        je      .insertkey
        cmp     eax, keyInsert
        je      .insertkey

        cmp     eax, keyDelNumpad
        je      .delkey
        cmp     eax, keyDelete
        je      .delkey

        jmp     .endselect_not_processed


.tabkey:
        test    [.kbdState], maskCtrl or maskAlt
        jnz     .finish_not_processed
        
        call    .line_render_rect

        test    [esi+TAsmEdit._options], aeoSmartTabs
        jz      .classic_tabs

        mov     eax, [esi+TAsmEdit._caretPos.x]
        inc     eax
        exec    esi, TAsmEdit:GetSmartTab, [esi+TAsmEdit._caretPos.y], eax
        mov     ecx, eax
        jnc     .tab_pos

.classic_tabs:
        mov     ecx, [esi+TAsmEdit._caretPos.x]
        add     ecx, 8
        and     ecx, $fffffff8
.tab_pos:
        sub     ecx, [esi+TAsmEdit._caretPos.x]

.spadd:
        dec     ecx
        js      .end_tab
        exec    esi, TAsmEdit:AddChar, ' '
        jmp     .spadd

.end_tab:
        call    .render_changed_line
        jmp     .finish_processed


.enterkey:
        test    [.kbdState], maskCtrl or maskShift or maskAlt
        jnz     .finish_not_processed

        xor     eax, eax
        test    [esi+TAsmEdit._mode], aemOverwrite
        jnz     .split_ok

        exec    esi, TAsmEdit:SplitLine, -1, 0
        inc     [esi+TAsmEdit._UndoLevel]

.split_ok:
        set     esi, TAsmEdit:CaretX, eax
        exec    esi, TAsmEdit:ScrollToCaretX

        exec    esi, TAsmEdit:CaretUpDown, 1, FALSE

        exec    esi, TAsmEdit:ComputeLeftMarginWidth
        exec    esi, TAsmEdit:__UpdateImages
        exec    esi, TAsmEdit:UpdateScrollBar
        exec    esi, TAsmEdit:UpdateCaretPos

        and     [esi+TAsmEdit._img_margin_valid], 0
        exec    esi, TAsmEdit:RectChanged2, 0
        jmp     .finish_processed

.refresh:
        xor     eax, eax
        mov     [esi+TAsmEdit._img_margin_valid], eax
        exec    esi, TAsmEdit:RectChanged2, eax
        jmp     .finish_processed


; caret moving commands!

.left:
        test    [.kbdState], maskCtrl
        jnz     .left_word

        exec    esi, TAsmEdit:CaretLeftRight, -1
        jmp     .endmove

.left_word:
        exec    esi, TAsmEdit:CaretWordBack
        jmp     .endmove


.right:
        test    [.kbdState], maskCtrl
        jnz     .right_word

        exec    esi, TAsmEdit:CaretLeftRight, 1
        jmp     .endmove

.right_word:
        exec    esi, TAsmEdit:CaretWordForward
        jmp     .endmove

.up:
        test    [.kbdState], maskCtrl
        jnz     .prev_bookmark

        exec    esi, TAsmEdit:CaretUpDown, -1, FALSE
        jmp     .endmove

.prev_bookmark:
        exec    esi, TAsmEdit:GoPrevBookmark
        jmp     .endmove

.down:
        test    [.kbdState], maskCtrl
        jnz     .next_bookmark

        exec    esi, TAsmEdit:CaretUpDown, 1, FALSE
        jmp     .endmove

.next_bookmark:
        exec    esi, TAsmEdit:GoNextBookmark
        jmp     .endmove

.homekey:
        test    [.kbdState], maskCtrl
        jnz     .start_of_scr

        exec    esi, TAsmEdit:CaretHome
        jmp     .endmove

.start_of_scr:
        exec    esi, TAsmEdit:CaretScrHome
        jmp     .endmove


.endkey:
        test    [.kbdState], maskCtrl
        jnz     .end_of_scr

        exec    esi, TAsmEdit:CaretEnd
        jmp     .endmove

.end_of_scr:
        exec    esi, TAsmEdit:CaretScrEnd
        jmp     .endmove

.pgupkey:
        test    [.kbdState], maskCtrl
        jnz     .start_of_text

        mov     eax, [esi+TAsmEdit._height_ch_nav]
        neg     eax
        exec    esi, TAsmEdit:CaretUpDown, eax, TRUE
        jmp     .endmove

.start_of_text:
        exec    esi, TAsmEdit:CaretTxtHome
        jmp     .endmove


.pgdnkey:
        test    [.kbdState], maskCtrl
        jnz     .end_of_text

        exec    esi, TAsmEdit:CaretUpDown, [esi+TAsmEdit._height_ch_nav], TRUE
        jmp     .endmove

.end_of_text:
        exec    esi, TAsmEdit:CaretTxtEnd
        jmp     .endmove


.insertkey:
        get     eax, esi, TAsmEdit:Mode

        mov     edx, aemOverwrite
        mov     ecx, [.kbdState]
        and     ecx, maskCtrl + maskAlt
        cmp     ecx, maskCtrl + maskAlt
        jne     .ins_mask_ok

        mov     edx, aemBlockSelection

.ins_mask_ok:
        xor     eax, edx
        set     esi, TAsmEdit:Mode, eax
        jmp     .endselect_processed

.backspacekey:
        cmp     [esi+TAsmEdit._caretPos.x], 0
        jne     .do_back

        test    [esi+TAsmEdit._mode], aemOverwrite
        jnz     .do_back

        cmp     [esi+TAsmEdit._caretPos.y], 0
        je      .finish_processed

        exec    esi, TAsmEdit:CaretUpDown, -1, FALSE
        exec    esi, TAsmEdit:CaretEnd
        jmp     .delkey

.do_back:
        exec    esi, TAsmEdit:AddTrailingSpaces, -1, 0
        exec    esi, TAsmEdit:CaretLeftRight, -1

.delkey:
        exec    esi, TAsmEdit:DeleteSelection
        jnc     .del_refresh

        exec    esi, TAsmEdit:AddTrailingSpaces, -1, 0

        test    [esi+TAsmEdit._mode], aemOverwrite
        jz      .del_it

        exec    esi, TAsmEdit:AddChar, ' '
        exec    esi, TAsmEdit:CaretLeftRight, -1
        jmp     .del_refresh

.del_it:
        exec    esi, TAsmEdit:DeleteChar, -1, 0
        jnc     .del_refresh                            ; notice that the undo/redo group is not increased in order to allow
                                                        ; another change operations on this line to be grouped in one TUndoInfo
                                                        ; structure.
        exec    esi, TAsmEdit:JoinNextLine, -1
        inc     [esi+TAsmEdit._UndoLevel]

.del_refresh:
        exec    esi, TAsmEdit:DelTrailingSpaces, -1

        and     [esi+TAsmEdit._img_margin_valid], 0

        exec    esi, TAsmEdit:RectChanged2, 0
        exec    esi, TAsmEdit:UpdateScrollBar
        exec    esi, TAsmEdit:UpdateCaretPos

        exec    esi, TAsmEdit:SelChangeBegin
        exec    esi, TAsmEdit:SelStartHere
        exec    esi, TAsmEdit:SelEndHere
        exec    esi, TAsmEdit:SelChangeEnd

        jmp     .finish_processed


.endmove:
        cmp     [esi+TAsmEdit._selCmd], 0
        jne     .endselect_processed

        test    [esi+TAsmEdit._options], aeoPersistentSelection
        jnz     .endselect_processed

        exec    esi, TAsmEdit:SelStartHere
        exec    esi, TAsmEdit:SelEndHere
        exec    esi, TAsmEdit:SelChangeEnd
        jmp     .finish_processed

.endselect_processed:
        cmp     [esi+TAsmEdit._selCmd], 0
        je      .finish_processed

        exec    esi, TAsmEdit:SelEndHere
        exec    esi, TAsmEdit:SelChangeEnd

.finish_processed:
        stc
        popad
        return


.endselect_not_processed:
        cmp     [esi+TAsmEdit._selCmd], 0
        je      .finish_not_processed

        exec    esi, TAsmEdit:SelChangeEnd

.finish_not_processed:
        clc
        popad
        return


; -------------------------------------

.line_render_rect:
        push    eax

        mov     ecx, [esi+TAsmEdit._caretPos.x]
        mov     edx, [esi+TAsmEdit._caretPos.y]

        get     eax, esi, TAsmEdit:PosX
        get     ebx, esi, TAsmEdit:PosY

        sub     ecx, eax
        sub     edx, ebx

        mov     [.rect.left], ecx
        mov     [.rect.top], edx

        inc     edx
        mov     [.rect.bottom], edx

        mov     ecx, [esi+TAsmEdit._width_ch]
        mov     [.rect.right], ecx

        pop     eax
        retn

.render_changed_line:

; see if the left margin needs update.

        exec    esi, TAsmEdit:ComputeLeftMarginWidth
        jnc     .images_ok

        exec    esi, TAsmEdit:__UpdateImages   ; If the left margin is changed, the text image may need an update!
        exec    esi, TAsmEdit:RectChanged2, 0

.images_ok:

; render the text of the line.

        mov     eax, [.rect.top]
        imul    eax, [esi+TAsmEdit._font_height]

        mov     edx, [esi+TAsmEdit._width]
        sub     edx, [esi+TAsmEdit._left_margin]

        exec    esi, TAsmEdit:RectChangedXY2, [esi+TAsmEdit._left_margin], eax, edx, [esi+TAsmEdit._font_height]

        exec    esi, TAsmEdit:UpdateScrollBar
        exec    esi, TAsmEdit:UpdateCaretPos
        retn


endp




method TAsmEdit.EventFocusIn
begin
        pushad

        stdcall CaretAttach, [.self]
        exec    [.self], TAsmEdit:UpdateCaretPos

        mov     eax, [.self]
        cmp     [eax+TAsmEdit._on_mode_change], 0
        je      .mode_ok

        stdcall [eax+TAsmEdit._on_mode_change], eax

.mode_ok:
        mov     eax, [.self]
        cmp     [eax+TAsmEdit._on_caret_move], 0
        je      .finish

        stdcall [eax+TAsmEdit._on_caret_move], eax

.finish:
        popad
        inherited
        return
endp




method TAsmEdit.EventFocusOut
begin
        pushad
        stdcall CaretAttach, 0

        mov     eax, [.self]
        cmp     [eax+TAsmEdit._on_mode_change], 0
        je      .mode_ok

        stdcall [eax+TAsmEdit._on_mode_change], 0

.mode_ok:
        mov     eax, [.self]
        cmp     [eax+TAsmEdit._on_caret_move], 0
        je      .finish

        stdcall [eax+TAsmEdit._on_caret_move], 0

.finish:
        popad
        inherited
        return
endp


; Call after scrolling the content in order to move the caret to the proper position.

method TAsmEdit.UpdateCaretPos
.zero dd ?
begin
        pushad

        mov     esi, [.self]

        xor     edi, edi
        mov     [.zero], edi
        inc     edi

        mov     eax, [esi+TAsmEdit._caretPos.x]
        mov     ebx, [esi+TAsmEdit._caretPos.y]

        get     edx, esi, TAsmEdit:PosX
        sub     eax, edx
        cmovs   edi, [.zero]    ; hide

        imul    eax, [esi+TAsmEdit._font_width]
        add     eax, [esi+TAsmEdit._left_margin]

        cmp     eax, [esi+TAsmEdit._width]
        cmovae  edi, [.zero]

        get     edx, esi, TAsmEdit:PosY
        sub     ebx, edx
        cmovs   edi, [.zero]

        mov     edx, 2
        mov     ecx, 2
        test    [esi+TAsmEdit._mode], aemOverwrite
        cmovnz  ecx, [esi+TAsmEdit._font_width]
        cmovnz  edx, [esi+TAsmEdit._font_height]

        test    [esi+TAsmEdit._options], aeoConsoleCaret
        cmovnz  ecx, [esi+TAsmEdit._font_width]
        cmovz   edx, [esi+TAsmEdit._font_height]

        imul    ebx, [esi+TAsmEdit._font_height]
        add     ebx, [esi+TAsmEdit._font_height]

        cmp     ebx, [esi+TAsmEdit._height]
        cmovae  edi, [.zero]

        sub     ebx, edx

        stdcall CaretChange, [.self], eax, ebx, ecx, edx, edi

        cmp     [esi+TAsmEdit._on_caret_move], 0
        je      .finish

        stdcall [esi+TAsmEdit._on_caret_move], esi

.finish:
        popad
        return
endp





method TAsmEdit._RenderLM ;  .pImage, .from, .to
.last dd ?
begin
        pushad

        cmp     [.pImage], 0
        je      .end_lines

        mov     esi, [.self]

        mov     eax, [esi+TAsmEdit._height_ch]
        xor     ebx, ebx
        mov     ecx, [.from]
        mov     edx, [.to]

        cmp     ecx, ebx        ; .from should be >=0
        cmovl   ecx, ebx

        cmp     edx, ebx
        cmovl   edx, ebx

        cmp     edx, eax
        cmova   edx, eax        ; edx = max(PosY+height_ch, [.to])

        cmp     ecx, edx
        jae     .end_lines

        mov     [.from], ecx
        mov     [.to], edx

        get     ebx, esi, TAsmEdit:PosY
        lea     ebx, [ebx+ecx+1]                ; line numbers are from 1

        mov     eax, [esi+TAsmEdit._font_height]
        imul    ecx, eax
        imul    edx, eax

        push    edx

        mov     edx, [esi+TAsmEdit._lines]
        mov     eax, [edx+TText.Length]
        add     eax, [edx+TText.GapBegin]
        sub     eax, [edx+TText.GapEnd]
        shr     eax, 2
        mov     [.last], eax

        pop     edx

.lines_loop:
        cmp     ecx, edx
        jae     .end_lines

; background

        mov     eax, [esi+TAsmEdit._left_margin]
        dec     eax
        stdcall DrawSolidRect, [.pImage], 0, ecx, eax, [esi+TAsmEdit._font_height], [ASM.clLeftMargin]
        stdcall DrawSolidRect, [.pImage], eax, ecx, 1, [esi+TAsmEdit._font_height], [ASM.clLeftMarginEdge]

; the number

        cmp     ebx, [.last]
        ja      .next

        pushad

        add     ecx, [esi+TAsmEdit._font_asc]

        stdcall NumToStr, ebx, ntsDec or ntsUnsigned
        push    eax

        stdcall StrPtr, eax
        push    eax

        stdcall GetTextBounds, eax, [eax+string.len], [ASM.NumFont]
        mov     edx, [esi+TAsmEdit._num_margin]
        sub     edx, eax

        pop     eax
        stdcall DrawString, [.pImage], eax, [eax+string.len], edx, ecx, [ASM.NumFont], [ASM.clLeftMarginText]

        stdcall StrDel ; from the stack

        popad

; get the line on y = ebx-1

        lea     eax, [4*ebx-4]
        
        mov     edi, [esi+TAsmEdit._lines]
        cmp     eax, [edi+TText.GapBegin]
        jb      @f
        add     eax, [edi+TText.GapEnd]
        sub     eax, [edi+TText.GapBegin]
@@:
        cmp     eax, [edi+TText.Length]
        jae     .next

        mov     edi, [edi+eax]
        test    edi, edi
        jz      .next

; edi contains a pointer to the current drawn TTextLine

        pushad

; start position of the icons.

        mov     eax, [esi+TAsmEdit._num_margin]
        add     eax, [ASM.xSpcIcons]

; draw bookmark

        mov     edx, [ASM.iconBookmark]

        test    [edi+TTextLine.flags], tlfBookmark
        jz      .bookmark_ok


        OutputValue "Bookmark on line: ", ebx, 10, -1

        push    [edx+TImage.wrapH]
        push    [edx+TImage.wrapW]
        push    0 0
        push    edx

        mov     ebx, [esi+TAsmEdit._font_height]
        sub     ebx, [edx+TImage.wrapH]
        shr     ebx, 1
        add     ebx, ecx

        stdcall BlendImage, [.pImage], eax, ebx ; remaining from the stack

.bookmark_ok:

; draw breakpoint

        mov     edx, [ASM.iconBreakpoints]

        test    [edi+TTextLine.flags], tlfBreakpoint
        jz      .breakpoint_ok

        push    [edx+TImage.wrapH]
        push    [edx+TImage.wrapW]
        push    0 0
        push    edx

        mov     ebx, [esi+TAsmEdit._font_height]
        sub     ebx, [edx+TImage.wrapH]
        shr     ebx, 1
        add     ebx, ecx

        stdcall BlendImage, [.pImage], eax, ebx ; remaining from the stack

.breakpoint_ok:

        popad

.next:
        inc     ebx
        add     ecx, [esi+TAsmEdit._font_height]
        jmp     .lines_loop


.end_lines:
        popad
        return
endp



method TAsmEdit.UpdateScrollBar
begin
        pushad
        mov     esi, [.self]

        xor     eax, eax
        cmp     [esi+TAsmEdit._font_width], eax
        lea     eax, [eax+1]
        je      .xpage_ok


        mov     eax, [esi+TAsmEdit._width_ch_nav]
        cmp     eax, 0
        jg      .xpage_ok

        xor     eax, eax
        inc     eax

.xpage_ok:
        set     esi, TAsmEdit:PageX, eax

        mov     ecx, [esi+TAsmEdit._line_widths]
        mov     edx, [ecx+TArray.count]
        test    edx, edx
        jz      .xsize_ok
        mov     edx, [ecx+TArray.array+sizeof.TCounter*edx+TCounter.value - sizeof.TCounter]
        sub     edx, eax
        jg      .xsize_ok

        xor     edx, edx        ; hide the scrollbar.

        set     esi, TAsmEdit:PosX, edx    ; scroll to 0 in this case.

.xsize_ok:
        set     esi, TAsmEdit:MaxX, edx

        get     eax, esi, TAsmEdit:PosX
        cmp     eax, edx
        cmovg   eax, edx
        set     esi, TAsmEdit:PosX, eax

; set Y scrollers page

        xor     eax, eax
        cmp     [esi+TAsmEdit._font_height], eax
        lea     eax, [eax+1]
        je      .ypage_ok

        mov     eax, [esi+TAsmEdit._height_ch_nav]
        cmp     eax, 0
        jg      .ypage_ok

        xor     eax, eax
        inc     eax

.ypage_ok:
        set     esi, TAsmEdit:PageY, eax

        mov     edx, [esi+TAsmEdit._lines]
        mov     ecx, [edx+TText.Length]
        add     ecx, [edx+TText.GapBegin]
        sub     ecx, [edx+TText.GapEnd]
        shr     ecx, 2

        sub     ecx, eax
        jg      .ymax_ok

        xor     ecx, ecx  ; hide the scrollbar
        set     esi, TAsmEdit:PosY, ecx       ; scroll to 0 in this case.

.ymax_ok:
        set     esi, TAsmEdit:MaxY, ecx

        get     eax, esi, TAsmEdit:PosY
        cmp     eax, ecx
        cmovg   eax, ecx
        set     esi, TAsmEdit:PosY, eax

        popad
        return
endp



; general methods


method TAsmEdit.__UpdateImages
begin
        inherited
        pushad
        mov     esi, [.self]

; Process ._imgLeftMargin

        mov     edi, [esi+TAsmEdit._imgMargin]
        mov     ecx, [esi+TAsmEdit._left_margin]
        mov     edx, [esi+TAsmEdit._height]
        mov     eax, [esi+TAsmEdit._img_margin_valid]

        test    edi, edi
        jz      .create_new

        jecxz   .destroy

        cmp     ecx, [edi+TImage.width]
        ja      .destroy

        cmp     edx, [edi+TImage.height]
        jbe     .set_wrap

.destroy:
        stdcall DestroyImage, edi
        xor     edi, edi
        xor     eax, eax

.create_new:
        jecxz   .store

        lea     ebx, [edx+SCREEN_MORE_Y]
        xor     eax, eax      ; on error, CreateImage does not change eax!
        stdcall CreateImage2, ecx, ebx, FALSE
        mov     edi, eax
        xor     eax, eax

.set_wrap:
        xor     ebx, ebx
        cmp     edx, [edi+TImage.wrapH]
        cmova   eax, ebx                   ; clear valid flag, if the new size is bigger than the old.

        stdcall SetImageWrap, edi, ecx, edx

.store:
        mov     [esi+TAsmEdit._imgMargin], edi
        mov     [esi+TAsmEdit._img_margin_valid], eax

        test    eax, eax
        jnz     .finish

        exec    esi, TAsmEdit:RectChangedXY2, 0, 0, ecx, edx

.finish:
        popad
        return
endp




method TAsmEdit.Resize
.rect     RECT
.rect_ch  RECT
begin
        pushad

        mov     esi, [.self]

        mov     ebx, [esi+TAsmEdit._width]      ; the old values
        mov     ecx, [esi+TAsmEdit._height]     ; of the height and width
        mov     edi, [esi+TAsmEdit._width_ch]   ;
        mov     edx, [esi+TAsmEdit._height_ch]

        inherited [.newWidth], [.newHeight]

        exec    [.self], TAsmEdit:ComputeScreenInChars

        cmp     [esi+TAsmEdit._width], ebx
        jbe     .render_right_ok

        dec     edi
        jns     @f
        xor     edi, edi
@@:

        mov     [.rect.left], ebx
        mov     [.rect_ch.left], edi

        mov     ebx, [esi+TAsmEdit._width]
        mov     edi, [esi+TAsmEdit._width_ch]
        mov     [.rect.right], ebx
        mov     [.rect_ch.right], edi

        xor     eax, eax
        mov     [.rect.top], eax
        mov     [.rect_ch.top], eax

        mov     eax, [esi+TAsmEdit._height]
        mov     ebx, [esi+TAsmEdit._height_ch]
        mov     [.rect.bottom], eax
        mov     [.rect_ch.bottom], edx

        lea     eax, [.rect]
        exec    esi, TAsmEdit:RectChanged2, eax

.render_right_ok:

        cmp     [esi+TAsmEdit._height], ecx
        jbe     .render_bottom_ok

        dec     edx
        jns     @f
        xor     edx, edx
@@:

        mov     [.rect.top], ecx
        mov     [.rect_ch.top], edx

        mov     ecx, [esi+TAsmEdit._height]
        mov     edx, [esi+TAsmEdit._height_ch]
        mov     [.rect.bottom], ecx
        mov     [.rect_ch.bottom], edx

        xor     eax, eax
        mov     [.rect.left], eax
        mov     [.rect_ch.left], eax

        mov     eax, [esi+TAsmEdit._width]
        mov     edx, [esi+TAsmEdit._width_ch]
        mov     [.rect.right], eax
        mov     [.rect_ch.right], edx

        exec    esi, TAsmEdit:_RenderLM, [esi+TAsmEdit._imgMargin], [.rect_ch.top], [.rect_ch.bottom]

        lea     eax, [.rect]
        exec    esi, TAsmEdit:RectChanged2, eax

.render_bottom_ok:
        exec    esi, TAsmEdit:__InvalidateImgCache

        exec    esi, TAsmEdit:UpdateScrollBar
        exec    [.self], TAsmEdit:ComputeScreenInChars
        exec    esi, TAsmEdit:UpdateScrollBar

        exec    esi, TAsmEdit:__UpdateImages

        popad
        return
endp



method TAsmEdit.Move
begin
        mov     eax, [Caret.pWindow]
        push    eax
        cmp     eax, [.self]
        jne     @f
        stdcall CaretAttach, 0
@@:
        inherited [.newX], [.newY]

        pop     eax
        cmp     eax, [.self]
        jne     @f
        stdcall CaretAttach, eax
        exec    [.self], TAsmEdit:UpdateCaretPos
@@:
        return
endp


; parameters get/set methods

method TAsmEdit.SetCaretX
begin
        push    eax esi

        mov     esi, [.self]
        mov     eax, [.value]
        cmp     eax, [esi+TAsmEdit._caretPos.x]
        je      .finish

        mov     [esi+TAsmEdit._caretPos.x], eax
        exec    esi, TAsmEdit:Highlight, [esi+TAsmEdit._caretPos.y], 0

.finish:
        pop     esi eax
        return
endp


method TAsmEdit.SetCaretY
begin
        push    eax esi

        mov     esi, [.self]
        mov     eax, [.value]
        cmp     eax, [esi+TAsmEdit._caretPos.y]
        je      .finish

        xchg    eax, [esi+TAsmEdit._caretPos.y]
        exec    esi, TAsmEdit:Highlight, eax, 0

.finish:
        pop     esi eax
        return
endp


method TAsmEdit.SetOptions
begin
        pushad

        mov     esi, [.self]
        mov     eax, [.value]

        cmp     eax, [esi+TAsmEdit._options]
        je      .finish

        mov     [esi+TAsmEdit._options], eax

        xor     eax, eax
        mov     [esi+TAsmEdit._img_margin_valid], eax

        exec    esi, TAsmEdit:RectChanged2, eax
        exec    esi, TAsmEdit:ComputeLeftMarginWidth
        exec    esi, TAsmEdit:UpdateCaretPos

.finish:
        popad
        return
endp


method TAsmEdit.SetMode
begin
        pushad

        mov     esi, [.self]
        mov     eax, [.value]

        xchg    eax, [esi+TAsmEdit._mode]
        cmp     eax, [esi+TAsmEdit._mode]
        je      .finish

        xor     eax, eax
        exec    esi, TAsmEdit:RectChanged2, eax
        exec    esi, TAsmEdit:UpdateCaretPos

        cmp     [esi+TAsmEdit._on_mode_change], 0
        je      .finish

        stdcall [esi+TAsmEdit._on_mode_change], esi

.finish:
        popad
        return
endp


method TAsmEdit.SetEOL
begin
        pushad
        mov     esi, [.self]
        mov     eax, [.value]
        xchg    eax, [esi+TAsmEdit._end_of_line]
        cmp     eax, [esi+TAsmEdit._end_of_line]
        je      .finish

        set     esi, TAsmEdit:Modified, TRUE

.finish:
        popad
        return
endp



method TAsmEdit.HasSelection
begin
        pushad
        
        mov     esi, [.self]
        test    [esi+TAsmEdit._mode], aemBlockSelection
        jnz     .block
        
        mov     eax, [esi+TAsmEdit._selStart.x]
        cmp     eax, [esi+TAsmEdit._selEnd.x]
        jne     .yes

        mov     eax, [esi+TAsmEdit._selStart.y]
        cmp     eax, [esi+TAsmEdit._selEnd.y]
        je      .no

.yes:
        stc
        popad
        return

.no:
        clc
        popad
        return

.block:
        mov     eax, [esi+TAsmEdit._selEnd.x]
        mov     ecx, [esi+TAsmEdit._selEnd.y]
        sub     eax, [esi+TAsmEdit._selStart.x]
        sub     ecx, [esi+TAsmEdit._selStart.y]

        test    eax, eax
        jns     @f
        neg     eax
@@:
        test    ecx, ecx
        jns     @f
        neg     ecx
@@:
        imul    eax, ecx
        test    eax, eax
        jz      .no
        jmp     .yes
endp



method TAsmEdit.GetSelection
.lines dd ?
begin
        pushad

        exec    [.self], TAsmEdit:_AddSelRectanglesAbs, 0
        mov     [.lines], edx

        lea     edi, [edx+TArray.array]
        mov     ecx, [edx+TArray.count]

        stdcall StrNew
        mov     edx, eax

        test    ecx, ecx
        jz      .finish

.rect_loop:
        mov     ebx, [edi+RECT.top]

.y_loop:
        exec    [.self], TAsmEdit:TextLine, ebx, TRUE
        mov     esi, [eax]

        mov     eax, [esi+TTextLine.ch_len]
        cmp     eax, [edi+RECT.right]
        cmova   eax, [edi+RECT.right]

        stdcall TextIndexToPos, esi, eax   ; move the gap after the rectangle right bound.
        push    eax

        stdcall TextMoveGap, esi, eax
        stdcall TextIndexToPos, esi, [edi+RECT.left]

        add     esi, eax
        sub     [esp], eax
        stdcall StrCatMem, edx, esi ; length from the stack

        cmp     [edi+RECT.right], $7fffffff
        jne     .eol_ok

        stdcall StrCat, edx, cNewLine

.eol_ok:
        inc     ebx
        cmp     ebx, [edi+RECT.bottom]
        jl      .y_loop

.next_rect:
        add     edi, sizeof.RECT
        dec     ecx
        jnz     .rect_loop

.finish:
        stdcall FreeMem, [.lines]

        mov     [esp+4*regEAX], edx     ; the result string. StrDel when not needed.
        popad
        return
endp





;   CF = 0 if the width was not changed.
;   CF = 1 if the width has been changed.

method  TAsmEdit.ComputeLeftMarginWidth
begin
        pushad

        mov     esi, [.self]
        xor     ebx, ebx

        mov     [esi+TAsmEdit._num_margin], ebx

        test    [esi+TAsmEdit._options], aeoLeftMargin
        jz      .marginok

        test    [esi+TAsmEdit._options], aeoLineNumbers
        jz      .marginok1

        mov     ecx, [esi+TAsmEdit._lines]
        jecxz   .marginok1

        mov     eax, [ecx+TText.Length]
        add     eax, [ecx+TText.GapBegin]
        sub     eax, [ecx+TText.GapEnd]
        shr     eax, 2                          ; the number of the lines.
        test    eax, eax
        jz      .marginok1

        call    .digits
        imul    ecx, [esi+TAsmEdit._numfont_width]
        add     ebx, ecx
        add     ebx, [ASM.xspcLMPadding]

        mov     [esi+TAsmEdit._num_margin], ebx

.marginok1:

        mov     eax, [ASM.iconBreakpoints]
        mov     ebx, [eax+TImage.width]

        mov     eax, [ASM.iconBookmark]
        cmp     ebx, [eax+TImage.width]
        cmovl   ebx, [eax+TImage.width]

        mov     eax, [ASM.iconDebugInfo]
        cmp     ebx, [eax+TImage.width]
        cmovl   ebx, [eax+TImage.width]

        add     ebx, [ASM.xSpcIcons]
        add     ebx, [ASM.xSpcIcons]

        add     ebx, [esi+TAsmEdit._num_margin]

.marginok:
        xchg    [esi+TAsmEdit._left_margin], ebx
        cmp     ebx, [esi+TAsmEdit._left_margin]
        je      .finish

        xor     eax, eax
        mov     [esi+TAsmEdit._img_margin_valid], eax

        exec    [.self], TAsmEdit:ComputeScreenInChars
        stc

.finish:
        popad
        return


.digits:
        xor     ecx, ecx
        cmp     eax, 1          ; 0
        jb      .edig

        inc     ecx
        cmp     eax, 10         ; 1
        jb      .edig

        inc     ecx
        cmp     eax, 100        ; 2
        jb      .edig

        inc     ecx
        cmp     eax, 1000       ; 3
        jb      .edig

        inc     ecx
        cmp     eax, 10000      ; 4
        jb      .edig

        inc     ecx
        cmp     eax, 100000     ; 5
        jb      .edig

        inc     ecx
        cmp     eax, 1000000    ; 6
        jb      .edig

        inc     ecx
        cmp     eax, 10000000   ; 7
        jb      .edig

        inc     ecx
        cmp     eax, 100000000  ; 8
        jb      .edig

        inc     ecx
        cmp     eax, 1000000000 ; 9
        jb      .edig

        inc     ecx             ; 10

.edig:
        retn

endp





method TAsmEdit.ComputeScreenInChars
begin
        pushad
        mov     esi, [.self]

        mov     ebx, [esi+TAsmEdit._font_width]
        mov     ecx, [esi+TAsmEdit._font_height]

; width_ch
        mov     eax, [esi+TAsmEdit._width]
        lea     eax, [eax+ebx-1]
        sub     eax, [esi+TAsmEdit._left_margin]
        cdq

        idiv    ebx
        mov     [esi+TAsmEdit._width_ch], eax

; height_ch
        mov     eax, [esi+TAsmEdit._height]
        lea     eax, [eax+ecx-1]
        cdq

        idiv    ecx
        mov     [esi+TAsmEdit._height_ch], eax

; width_ch_nav

        xor     edx, edx
        get     eax, esi, TAsmEdit:MaxY
        test    eax, eax                     ; is the vertical scrollbar hidden?
        cmovnz  edx, [GUI.scrollWidth]

        mov     eax, [esi+TAsmEdit._width]
        sub     eax, [esi+TAsmEdit._left_margin]
        sub     eax, edx
        cdq
        idiv    ebx

        mov     [esi+TAsmEdit._width_ch_nav], eax

; height_ch_nav

        xor     edx, edx
        get     eax, esi, TAsmEdit:MaxX
        test    eax, eax                     ; is the horizontal scrollbar hidden?
        cmovnz  edx, [GUI.scrollWidth]

        mov     eax, [esi+TAsmEdit._height]
        sub     eax, edx
        cdq
        idiv    ecx

        mov     [esi+TAsmEdit._height_ch_nav], eax

        popad
        return
endp



method TAsmEdit.ReplaceWordAtCaret
begin
        pushad
        mov     esi, [.self]

        exec    esi, TAsmEdit:TextLine, -1, TRUE
        mov     edi, [eax]

        exec    esi, TAsmEdit:SaveForUndo, -1, chopChanged
        exec    esi, TAsmEdit:AddTrailingSpaces, -1, 0

        mov     ecx, [esi+TAsmEdit._caretPos.x]    ; the current caret position.

        stdcall TextIndexToPos, edi, ecx
        jc      .not_a_word
        mov     esi, eax

        stdcall TextMoveGap, edi, esi

        cmp     esi, [edi+TTextLine.GapBegin]
        ja      .not_a_word

        mov     ebx, [.self]
        stdcall DecCount, [ebx+TAsmEdit._line_widths], [edi+TTextLine.ch_len]
        mov     [ebx+TAsmEdit._line_widths], edx

        push    esi
        lea     esi, [edi+esi]

.loop_back:
        dec     esi
        call    ScanBackUtf8

        dec     ecx
        dec     [edi+TTextLine.ch_len]

        cmp     esi, edi
        jb      .start_is_here

        mov     al, [esi]
        stdcall RecognizeChar, SepMapWithPoints
        jnc     .loop_back

.start_is_here:
        inc     ecx
        inc     [edi+TTextLine.ch_len]

        inc     esi
        sub     esi, edi
        stdcall TextMoveGap, edi, esi   ; the whole word is after the gap.

        pop     esi
        add     esi, [edi+TTextLine.GapEnd]
        sub     esi, [edi+TTextLine.GapBegin]

        lea     esi, [edi+esi]
        mov     ebx, [edi+TTextLine.Length]  ; the end of the line.
        add     ebx, edi ; maximal address.

.loop_forward:
        cmp     esi, ebx
        jae     .end_is_here

        mov     al, [esi]
        stdcall RecognizeChar, SepMapWithPoints
        jc      .end_is_here

        inc     esi
        call    ScanForwardUtf8

        dec     [edi+TTextLine.ch_len]
        jmp     .loop_forward

.end_is_here:
        sub     esi, edi        ; position of the end
        mov     [edi+TTextLine.GapEnd], esi   ; delete the prev word.

        stdcall StrLenUtf8, [.new_word], -1
        add     ecx, eax
        add     [edi+TTextLine.ch_len], eax

        mov     ebx, [.self]
        stdcall IncCount, [ebx+TAsmEdit._line_widths], [edi+TTextLine.ch_len]
        mov     [ebx+TAsmEdit._line_widths], edx

        set     [.self], TAsmEdit:CaretX, ecx
        exec    [.self], TAsmEdit:UpdateCaretPos

        stdcall StrLen, [.new_word]
        mov     ecx, eax

        stdcall StrPtr, [.new_word]
        mov     esi, eax

        stdcall TextSetGapSize, edi, ecx
        mov     edi, edx
        jc      .finish

        and     [edi+TTextLine.flags], not tlfRendered   ; the line will be changed so needs to be rendered.
        xor     eax, eax
        xchg    eax, [edi+TTextLine.syn_array]          ; the syntax highlight need to be recreated.
        stdcall FreeMem, eax

        add     [edi+TTextLine.GapBegin], ecx
        add     edi, [edi+TTextLine.GapBegin]
        sub     edi, ecx

        rep movsb

; refresh the line. ONLY the current line should be updated... and don't forget for the syntax highlighting.

        mov     esi, [.self]
        exec    esi, TAsmEdit:__UpdateImages
        exec    esi, TAsmEdit:UpdateScrollBar
        exec    esi, TAsmEdit:ScrollToCaretX

        exec    esi, TAsmEdit:RectChanged2, 0
        clc

.finish:
        popad
        return

.not_a_word:
        xor     eax, eax
        stc
        jmp     .finish
endp


method TAsmEdit.GetWordAtCaret
begin
        pushad
        mov     esi, [.self]

        mov     edi, [esi+TAsmEdit._lines]
        mov     ecx, [esi+TAsmEdit._caretPos.y]
        shl     ecx, 2

        mov     eax, [edi+TText.GapBegin]
        cmp     ecx, eax
        cmovae  eax, [edi+TText.GapEnd]
        sub     eax, [edi+TText.GapBegin]
        add     eax, ecx

        cmp     eax, [edi+TText.Length]
        jae     .not_a_word

        mov     edi, [edi+eax]

        stdcall TextIndexToPos, edi, [esi+TAsmEdit._caretPos.x]
        jc      .not_a_word
        mov     ebx, eax

        stdcall TextMoveGap, edi, ebx

        cmp     ebx, [edi+TTextLine.GapBegin]
        ja      .not_a_word

        push    ebx

.loop_back:
        dec     ebx
        js      .start_is_here

        mov     al, [edi+ebx+TTextLine]
        stdcall RecognizeChar, SepMapSansPoints
        jnc     .loop_back

.start_is_here:
        inc     ebx
        stdcall TextMoveGap, edi, ebx   ; the whole word is after the gap.

        add     ebx, [edi+TTextLine.GapEnd]
        sub     ebx, [edi+TTextLine.GapBegin]
        mov     ecx, ebx        ; start of the word.

        pop     ebx
        add     ebx, [edi+TTextLine.GapEnd]
        sub     ebx, [edi+TTextLine.GapBegin]
        dec     ebx

.loop_forward:
        inc     ebx

        cmp     ebx, [edi+TTextLine.Length]
        jae     .end_is_here

        mov     al, [edi+ebx+TTextLine]

        stdcall RecognizeChar, SepMapWithPoints
        jnc     .loop_forward

.end_is_here:
        sub     ebx, ecx
        jz      .not_a_word

        lea     ecx, [edi+ecx]

        stdcall StrNew
        stdcall StrCatMem, eax, ecx, ebx
        clc
.finish:
        mov     [esp+4*regEAX], eax
        popad
        return

.not_a_word:
        xor     eax, eax
        stc
        jmp     .finish
endp


; Arguments:
;    al - the first byte of utf8 char.
;    .map - pointer to the SeparatorsMap array (16 bytes) where each bit is 1 if the char is
;          separator and 0 if not.
; Returns:
;    CF = 0 if the character is a regular character.
;    CF = 1 if the character is a "word separator character": one of: ; +-*/=<>()[]{}:,|&~#`"'
proc RecognizeChar, .map
begin
        push    eax ecx
        test    al, $80
        jnz     .finish   ; after test, CF = 0

        movzx   eax, al

        mov     ecx, eax
        and     ecx, 7   ; 0..7
        shr     eax, 3
        add     eax, [.map]

        movzx   eax, byte [eax]
        bt      eax, ecx

.finish:
        pop     ecx eax
        return
endp


struc SeparatorsMap [sep] {
common
  if used .
    . db 16 dup(0)
  forward
    local ..val, ..ofs, ..mask

    if sep < $80
      ..ofs = sep / 8
      ..mask = 1 shl (sep mod 8)

      load ..val byte from . + ..ofs
      ..val = ..val or ..mask
      store byte ..val at . + ..ofs
    end if
common
  end if
}


iglobal
   ; For use with GetWordAtCaret
   SepMapSansPoints SeparatorsMap $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0a, $0b, $0c, $0d, $0e, $0f, \
                               $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, ' ', '"', '#', '%', '&', '`', \
                               '(', ')', '*', '+', ',', '-', '/', '<', '=', '>', '[', '\', ']', '^', '{', '|', \
                               '}', '~', ';'

   ; For use with Code completion.
   SepMapWithPoints SeparatorsMap $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0a, $0b, $0c, $0d, $0e, $0f, \
                               $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, ' ', '"', '#', '%', '&', '`', \
                               '(', ')', '*', '+', ',', '-', '/', '<', '=', '>', '[', '\', ']', '^', '{', '|', \
                               '}', '~', ';', '.', ':'
endg



method TAsmEdit.GetText
begin
        pushad
        stdcall TextCreate, sizeof.TText
        mov     edx, eax

        mov     ebx, [.self]
        mov     esi, [ebx+TAsmEdit._lines]
        xor     ecx, ecx

.loop:
        mov     eax, [esi+TText.GapBegin]
        cmp     ecx, eax
        cmovae  eax, [esi+TText.GapEnd]
        sub     eax, [esi+TText.GapBegin]
        add     eax, ecx

        cmp     eax, [esi+TText.Length]
        jae     .end_of_text

        stdcall TextAddText, edx, -1, [esi+eax]
        lea     eax, [ebx+TAsmEdit._end_of_line]
        stdcall TextAddStr2, edx, -1, eax, 4

        add     ecx, 4
        jmp     .loop

.end_of_text:
        mov     [esp+4*regEAX], edx
        popad
        return
endp




method TAsmEdit.SetText
.context   dd ?
.first_eol dd ?
.temp_eol  dd ?
begin
        pushad

        mov     ebx, [.self]

        xor     eax, eax
        mov     [.context], eax
        mov     [.first_eol], eax
        mov     [.temp_eol], eax

; free the previous TText structure for the TAsmEdit._lines

        mov     esi, [ebx+TAsmEdit._lines]
        test    esi, esi
        jz      .create_new_lines

        xor     ecx, ecx

.free_loop:
        mov     eax, [esi+TText.GapBegin]
        cmp     ecx, eax
        cmovae  eax, [esi+TText.GapEnd]
        sub     eax, [esi+TText.GapBegin]
        add     eax, ecx

        cmp     eax, [esi+TText.Length]
        jae     .end_free_loop

        mov     edx, [esi+eax]
        stdcall FreeMem, [edx+TTextLine.syn_array]

        stdcall RecycleImage, [edx+TTextLine.imgRendered]
        stdcall TextFree, edx

        add     ecx, 4
        jmp     .free_loop

.end_free_loop:

        stdcall TextFree, esi

.create_new_lines:

        stdcall TextCreate, sizeof.TText
        mov     [ebx+TAsmEdit._lines], eax

; new line widths array.

        stdcall FreeMem, [ebx+TAsmEdit._line_widths]
        stdcall CreateArray, sizeof.TCounter
        mov     [ebx+TAsmEdit._line_widths], eax

        mov     edi, [.value]
        test    edi, edi
        jz      .end_text

        stdcall StrPtr, edi
        mov     edi, eax

.text_loop:

        cmp     byte [edi], 0
        je      .end_text

        exec    ebx, TAsmEdit:InsertNewLine, -1
        mov     esi, eax

        xor     ecx, ecx

.line_loop:
        stdcall DecodeUtf8, [edi]
        jnc     .char_ok

        mov     eax, '?'
        xor     edx, edx
        inc     edx

.char_ok:
        add     edi, edx

        test    eax, eax
        jz      .cr_ok

        cmp     eax, $0d
        je      .new_line
        cmp     eax, $0a
        je      .new_line

        cmp     eax, $09
        je      .tab_to_spc

        cmp     eax, ' '
        jae     .ctrl_ok

        mov     eax, '?'

.ctrl_ok:
        stdcall EncodeUtf8, eax
        jc      .end_text

        stdcall TextAddChar, [esi], eax
        mov     [esi], edx
        jc      .end_text

        inc     ecx                             ; ecx counts the characters!
        jmp     .line_loop

.tab_to_spc:
        stdcall TextAddChar, [esi], $20
        mov     [esi], edx
        jc      .end_text

        inc     ecx
        test    ecx, $7
        jnz     .tab_to_spc

        jmp     .line_loop


.new_line:
        and     [.temp_eol], 0
        mov     byte [.temp_eol], al

        xor     eax, $0d xor $0a
        cmp     [edi], al
        jne     .cr_ok

        inc     edi
        mov     byte [.temp_eol+1], al

.cr_ok:
        cmp     [.first_eol], 0
        jne     .eol_ok

        push    [.temp_eol]
        pop     [.first_eol]

.eol_ok:
        push    eax

        mov     esi, [esi]
        mov     [esi+TTextLine.ch_len], ecx
        stdcall IncCount, [ebx+TAsmEdit._line_widths], ecx
        mov     [ebx+TAsmEdit._line_widths], edx

        mov     eax, [ebx+TAsmEdit._syntax_proc]
        test    eax, eax
        jz      .syntax_ok

        stdcall eax, esi, [.context]
        mov     [.context], eax

.syntax_ok:
        pop     eax
        test    eax, eax
        jnz     .text_loop

.end_text:
        mov     eax, [ebx+TAsmEdit._end_of_line]
        cmp     [.first_eol], 0
        cmovne  eax, [.first_eol]
        mov     [ebx+TAsmEdit._end_of_line], eax

        exec    ebx, TAsmEdit:ComputeLeftMarginWidth
        exec    ebx, TAsmEdit:UpdateScrollBar
        exec    ebx, TAsmEdit:RectChanged2, 0

        set     ebx, TAsmEdit:Modified, FALSE

        DebugMsg "SetText method."

        popad
        return
endp



method TAsmEdit.Highlight
begin
        push    eax ecx edx

        exec    [.self], TAsmEdit:TextLine, [.LineNum], FALSE
        jc      .finish

        mov     eax, [eax]
        mov     edx, [.fHighlight]

        mov     ecx, [eax+TTextLine.flags]
        and     [eax+TTextLine.flags], tlfmClearHighlight
        or      [eax+TTextLine.flags], edx
        cmp     ecx, [eax+TTextLine.flags]
        je      .finish
        
        and     [eax+TTextLine.flags], not tlfRendered
        exec    [.self], TAsmEdit:RectChanged2, 0          ; only one line need to be refreshed!!!

.finish:
        pop     edx ecx eax
        return
endp




; Navigation manipulation methods.

; Returns a pointer to variable where TTextLine with absolute coordinate [.y] is stored.
; If [.y] is outside the text, appends new lines up to [.y] and returns the result.
method TAsmEdit.TextLine  ; .LineNum, .fAddMissing
begin
        push    esi ebx

        mov     ebx, [.self]
        mov     esi, [ebx+TAsmEdit._lines]

        mov     eax, [.LineNum]
        test    eax, eax
        cmovs   eax, [ebx+TAsmEdit._caretPos.y]
        mov     [.LineNum], eax

        shl     eax, 2

        cmp     eax, [esi+TText.GapBegin]
        jb      @f
        add     eax, [esi+TText.GapEnd]
        sub     eax, [esi+TText.GapBegin]
@@:
        cmp     eax, [esi+TText.Length]
        jae     .create_new

        lea     eax, [esi+eax]

.finish:
        clc
        pop     ebx esi
        return

.error:
        stc
        pop     ebx esi
        return

.create_new:
        cmp     [.fAddMissing], 0
        je      .error

        mov     ebx, [esi+TText.Length]
        sub     ebx, [esi+TText.GapEnd]
        add     ebx, [esi+TText.GapBegin]
        shr     ebx, 2

.loop:
        exec    [.self], TAsmEdit:InsertNewLine, ebx
        push    eax
        exec    [.self], TAsmEdit:SaveForUndo, ebx, chopInserted
        pop     eax

        cmp     ebx, [.LineNum]
        lea     ebx, [ebx+1]
        jne     .loop

        push    eax

        mov     ebx, [.self]
        and     [ebx+TAsmEdit._img_margin_valid], 0
        exec    ebx, TAsmEdit:ComputeLeftMarginWidth
        jnc     .width_ok
        
        exec    ebx, TAsmEdit:__UpdateImages
        exec    ebx, TAsmEdit:UpdateScrollBar
        exec    ebx, TAsmEdit:UpdateCaretPos

.width_ok:
        exec    ebx, TAsmEdit:RectChanged2, 0
        pop     eax

        inc     [ebx+TAsmEdit._UndoLevel]
        jmp     .finish
endp



method TAsmEdit.ScrollToCaretX
begin
        pushad

        mov     esi, [.self]
        xor     ecx, ecx
        mov     [esp+4*regEAX], ecx

        mov     ebx, [esi+TAsmEdit._width_ch_nav]
        mov     eax, ebx

        dec     ebx     ; max column number where to not scroll.

        shr     eax, 2
        test    [esi+TAsmEdit._options], aeoScrollXMore
        cmovz   edi, ecx
        cmovnz  edi, eax        ; scroll more than needed.

        get     edx, esi, TAsmEdit:PosX

        mov     eax, [esi+TAsmEdit._caretPos.x]
        sub     eax, edx                       ; offset from the screen home.
        jz      .finish                        ; no need to scroll
        js      .do_scroll

        sub     eax, ebx
        jle     .finish

        neg     edi

.do_scroll:
        sub     eax, edi
        add     edx, eax
        cmovs   edx, ecx

        exec    esi, TAsmEdit:EventScroll, scrollX, scTrack, edx
        inc     dword [esp+4*regEAX]

.finish:
        exec    esi, TAsmEdit:UpdateCaretPos
        popad
        return
endp




method TAsmEdit.ScrollToCaretY
begin
        pushad

        mov     esi, [.self]
        xor     ecx, ecx
        mov     [esp+4*regEAX], ecx

        mov     ebx, [esi+TAsmEdit._height_ch_nav]
        mov     eax, ebx

        dec     ebx     ; max row number where to not scroll.

        shr     eax, 2
        test    [esi+TAsmEdit._options], aeoScrollYMore
        cmovz   edi, ecx
        cmovnz  edi, eax        ; scroll more than needed.

        get     edx, esi, TAsmEdit:PosY

        mov     eax, [esi+TAsmEdit._caretPos.y]
        sub     eax, edx                       ; offset from the screen home.
        jz      .finish                        ; no need to scroll
        js      .do_scroll

        sub     eax, ebx
        jle     .finish

        neg     edi

.do_scroll:

        sub     eax, edi
        add     edx, eax
        cmovs   edx, ecx

        exec    esi, TAsmEdit:EventScroll, scrollY, scTrack, edx
        inc     dword [esp+4*regEAX]

.finish:
        popad
        return
endp


method TAsmEdit.CenterCaretY
begin
        pushad

        mov     esi, [.self]

        mov     ebx, [esi+TAsmEdit._height_ch_nav]
        get     edx, esi, TAsmEdit:CaretY
        get     ecx, esi, TAsmEdit:PosY

        sub     ecx, edx
        add     ecx, ebx

        cmp     ecx, ebx
        jg      .scroll

        cmp     ecx, 0
        jg      .finish

.scroll:
        shr     ebx, 1  ; center of the screen
        xor     ecx, ecx

        sub     edx, ebx
        cmovs   edx, ecx ; the new PosY

        exec    esi, TAsmEdit:EventScroll, scrollY, scTrack, edx

.finish:
        popad
        return
endp






method TAsmEdit.CaretLeftRight
begin
        pushad

        mov     esi, [.self]
        xor     edx, edx                    ; minimal caret pos 0

        mov     ebx, [esi+TAsmEdit._caretPos.x]
        add     ebx, [.count]
        jns     .set_pos

        xor     ebx, ebx

.set_pos:
        set     esi, TAsmEdit:CaretX, ebx
        exec    esi, TAsmEdit:ScrollToCaretX

        popad
        return
endp





method TAsmEdit.CaretUpDown
.rect RECT
begin
        pushad

        mov     esi, [.self]
        xor     edx, edx                    ; minimal caret pos 0

        mov     ebx, [esi+TAsmEdit._caretPos.y]
        get     ecx, esi, TAsmEdit:PosY

        add     ebx, [.count]
        cmovs   ebx, edx

        add     ecx, [.count]
        cmovs   ecx, edx

        mov     edi, [esi+TAsmEdit._lines]

        mov     eax, [edi+TText.Length]
        add     eax, [edi+TText.GapBegin]
        sub     eax, [edi+TText.GapEnd]
        shr     eax, 2
        dec     eax      ; max line number.

        cmp     ebx, eax
        cmova   ebx, eax

        add     eax, 2
        sub     eax, [esi+TAsmEdit._height_ch]
        cmovs   eax, edx

        cmp     ecx, eax
        cmova   ecx, eax

        set     esi, TAsmEdit:CaretY, ebx

        cmp     [.scroll], edx
        je      .finish

        set     esi, TAsmEdit:PosY, ecx
        jc      .finish

        exec    esi, TAsmEdit:__InvalidateImgCache
        and     [esi+TAsmEdit._img_margin_valid], edx
        exec    esi, TAsmEdit:RectChanged2, edx

.finish:
        exec    esi, TAsmEdit:ScrollToCaretY
        exec    esi, TAsmEdit:UpdateCaretPos
        popad
        return
endp




; Keyboard UI methods.

method TAsmEdit.CaretLeft
begin
        exec    esi, TAsmEdit:CaretLeftRight, -1
        return
endp



method TAsmEdit.CaretRight
begin
        exec    esi, TAsmEdit:CaretLeftRight, 1
        return
endp



method TAsmEdit.CaretUp
begin
        exec    esi, TAsmEdit:CaretUpDown, -1, FALSE
        return
endp



method TAsmEdit.CaretDown
begin
        exec    esi, TAsmEdit:CaretUpDown, 1, FALSE
        return
endp



method TAsmEdit.CaretHome
begin
        push    eax
        mov     eax, [.self]
        set     eax, TAsmEdit:CaretX, 0
        exec    eax, TAsmEdit:ScrollToCaretX
        pop     eax
        return
endp



method TAsmEdit.CaretEnd
begin
        push    esi
        mov     esi, [.self]

        exec    esi, TAsmEdit:TextLine, -1, TRUE
        mov     eax, [eax]
        mov     eax, [eax+TTextLine.ch_len]

        set     esi, TAsmEdit:CaretX, eax
        exec    esi, TAsmEdit:ScrollToCaretX

        pop     esi
        return
endp


method TAsmEdit.CaretScrHome
begin
        push    esi

        mov     esi, [.self]

        get     eax, esi, TAsmEdit:PosY

        set     esi, TAsmEdit:CaretY, eax
        exec    esi, TAsmEdit:UpdateCaretPos

        pop     esi
        return
endp


method TAsmEdit.CaretScrEnd
begin
        push    esi edx

        mov     esi, [.self]

        mov     eax, [esi+TAsmEdit._height_ch_nav]
        add     eax, [esi + TAsmEdit._scrXY.pos + 4]
        dec     eax
        js      .finish

        set     esi, TAsmEdit:CaretY, eax
        exec    esi, TAsmEdit:UpdateCaretPos

.finish:
        pop     edx esi
        return
endp



method TAsmEdit.CaretTxtHome
begin
        push    ebx
        mov     ebx, [.self]
        set     ebx, TAsmEdit:CaretY, 0
        exec    ebx, TAsmEdit:ScrollToCaretY
        pop     ebx
        return
endp


method TAsmEdit.CaretTxtEnd
begin
        push    esi edx

        mov     esi, [.self]
        mov     edx, [esi+TAsmEdit._lines]

        mov     eax, [edx+TText.Length]
        add     eax, [edx+TText.GapBegin]
        sub     eax, [edx+TText.GapEnd]
        shr     eax, 2
        dec     eax

        set     esi, TAsmEdit:CaretY, eax
        exec    esi, TAsmEdit:ScrollToCaretY

        pop     edx esi
        return
endp


method TAsmEdit.CaretWordBack
begin
        pushad

        mov     edi, [.self]
        mov     ebx, [edi+TAsmEdit._caretPos.y]
        mov     ecx, [edi+TAsmEdit._caretPos.x]

.loopy:
        exec    edi, TAsmEdit:TextLine, ebx, FALSE
        jc      .prevline

        mov     edx, [eax]

        cmp     ecx, -1
        jne     .xok

        mov     ecx, [edx+TText.Length]      ; ecx at the end of the line if this is not the first line.
        sub     ecx, [edx+TText.GapEnd]
        add     ecx, [edx+TText.GapBegin]

.xok:
        dec     ecx
        js      .prevline

        stdcall TextIndexToPos, edx, ecx
        mov     ecx, eax

        xor     ah, ah

.loopx:
        mov     esi, [edx+TText.GapEnd]
        cmp     ecx, [edx+TText.GapBegin]
        cmovb   esi, [edx+TText.GapBegin]
        sub     esi, [edx+TText.GapBegin]
        add     esi, ecx
        cmp     esi, [edx+TText.Length]
        jae     .prevx

        mov     al, [edx+esi]
        stdcall RecognizeChar, SepMapWithPoints
        jnc     .regular

        test    ah, ah
        jz      .prevx

        inc     ecx
        jmp     .word_edge_found

.regular:
        mov     ah, al

.prevx:
        dec     ecx
        jns     .loopx

        test    ah, ah
        jz      .prevline

        inc     ecx
        jmp     .word_edge_found

.prevline:
        xor     ecx, ecx
        dec     ecx

        dec     ebx
        jns     .loopy

        inc     ecx
        inc     ebx

.word_edge_found:

        set     edi, TAsmEdit:CaretY, ebx

        stdcall TextPosToIndex, edx, ecx
        set     edi, TAsmEdit:CaretX, eax

        exec    edi, TAsmEdit:ScrollToCaretX
        exec    edi, TAsmEdit:ScrollToCaretY
        exec    edi, TAsmEdit:UpdateCaretPos

        popad
        return
endp


method TAsmEdit.CaretWordForward
.lenx dd ?
.eax  dd ?
begin
        pushad

        mov     edi, [.self]
        mov     ebx, [edi+TAsmEdit._caretPos.y]
        mov     ecx, [edi+TAsmEdit._caretPos.x]

        xor     ah, ah


.loopy:
        mov     [.eax], eax

        xor     edx, edx
        exec    edi, TAsmEdit:TextLine, ebx, FALSE
        jc      .end_of_text

        mov     edx, [eax]

        mov     eax, [edx+TText.Length]
        sub     eax, [edx+TText.GapEnd]
        add     eax, [edx+TText.GapBegin]
        mov     [.lenx], eax

        inc     ecx

        stdcall TextIndexToPos, edx, ecx
        mov     ecx, eax

        mov     eax, [.eax]

.loopx:
        mov     esi, [edx+TText.GapEnd]
        cmp     ecx, [edx+TText.GapBegin]
        cmovb   esi, [edx+TText.GapBegin]
        sub     esi, [edx+TText.GapBegin]
        add     esi, ecx
        cmp     esi, [edx+TText.Length]
        jae     .nextx

        mov     al, [edx+esi]
        stdcall RecognizeChar, SepMapWithPoints
        jnc     .regular

        mov     ah, al
        jmp     .nextx

.regular:
        test    ah, ah
        jnz     .word_edge_found

.nextx:
        inc     ecx
        cmp     ecx, [.lenx]
        jb      .loopx

.nextline:
        xor     ecx, ecx
        dec     ecx
        mov     ah, cl

        inc     ebx
        jmp     .loopy

.end_of_text:
        inc     ecx

.word_edge_found:
        test    edx, edx
        cmovz   eax, edx
        jz      .indx_ok

        stdcall TextPosToIndex, edx, ecx

.indx_ok:
        set     edi, TAsmEdit:CaretX, eax
        set     edi, TAsmEdit:CaretY, ebx

        exec    edi, TAsmEdit:ScrollToCaretX
        exec    edi, TAsmEdit:ScrollToCaretY
        exec    edi, TAsmEdit:UpdateCaretPos

        popad
        return
endp

; Selection control methods


method TAsmEdit.SelStartHere
begin
        pushad

        mov     esi, [.self]
        exec    esi, TAsmEdit:SelChangeBegin
        mov     eax, [esi+TAsmEdit._caretPos.x]
        mov     edx, [esi+TAsmEdit._caretPos.y]
        mov     [esi+TAsmEdit._selStart.x], eax
        mov     [esi+TAsmEdit._selStart.y], edx
        exec    esi, TAsmEdit:SelChangeEnd

        popad
        return
endp



method TAsmEdit.SelEndHere
begin
        pushad

        mov     esi, [.self]
        exec    esi, TAsmEdit:SelChangeBegin
        mov     eax, [esi+TAsmEdit._caretPos.x]
        mov     edx, [esi+TAsmEdit._caretPos.y]
        mov     [esi+TAsmEdit._selEnd.x], eax
        mov     [esi+TAsmEdit._selEnd.y], edx
        exec    esi, TAsmEdit:SelChangeEnd

        popad
        return
endp


method TAsmEdit.SelChangeBegin
begin
        pushad
        mov     esi, [.self]
        xor     edx, edx
        xchg    edx, [esi+TAsmEdit._selAreaUpdate]
        test    edx, edx
        jz      .old_ok

        stdcall FreeMem, edx
        xor     edx, edx

.old_ok:
        exec    esi, TAsmEdit:_AddSelRectangles, edx
        mov     [esi+TAsmEdit._selAreaUpdate], edx

        popad
        return
endp


method TAsmEdit.SelChangeEnd
begin
        pushad
        mov     esi, [.self]
        mov     edx, [esi+TAsmEdit._selAreaUpdate]

        exec    esi, TAsmEdit:_AddSelRectangles, edx
        mov     ecx, [edx+TArray.count]
        lea     edi, [edx+TArray.array]

.loop:
        dec     ecx
        js      .freelist

        mov     eax, [edi+RECT.left]
        mov     ebx, [edi+RECT.top]

        imul    eax, [esi+TAsmEdit._font_width]
        imul    ebx, [esi+TAsmEdit._font_height]

        add     eax, [esi+TAsmEdit._left_margin]

        mov     [edi+RECT.left], eax
        mov     [edi+RECT.top], ebx

        mov     eax, [edi+RECT.right]
        mov     ebx, [edi+RECT.bottom]

        imul    eax, [esi+TAsmEdit._font_width]
        imul    ebx, [esi+TAsmEdit._font_height]

        add     eax, [esi+TAsmEdit._left_margin]

        mov     [edi+RECT.right], eax
        mov     [edi+RECT.bottom], ebx

        exec    esi, TAsmEdit:RectChanged2, edi

        add     edi, sizeof.RECT
        jmp     .loop

.freelist:
        stdcall FreeMem, edx
        xor     edx, edx
        mov     [esi+TAsmEdit._selAreaUpdate], edx

        popad
        return
endp


; Line handling and formatting methods.



; Undo/Redo methods


method TAsmEdit.SaveForUndo
begin
        pushad

        mov     esi, [.self]
        mov     edx, [esi+TAsmEdit._pUndo]
        mov     ecx, [.operation]

        mov     ebx, [.LineNum]
        test    ebx, ebx
        cmovs   ebx, [esi+TAsmEdit._caretPos.y]

        test    edx, edx
        jz      .add_new

        cmp     [edx+TUndoInfo.line], ebx
        jne     .add_new

        cmp     ecx, chopChanged
        jne     .add_new

        mov     eax, [esi+TAsmEdit._UndoLevel]
        cmp     eax, [edx+TUndoInfo.group]
        jne     .add_new

        cmp     [edx+TUndoInfo.operation], ecx
        je      .finish                         ; group the chopChanged for the same line.

; add new record in the chain.

.add_new:
        OutputValue "Add new TUndoInfo for operation: ", ecx, 10, -1

        stdcall GetMem, sizeof.TUndoInfo
        jc      .finish

        mov     edi, eax

        mov     [edi+TUndoInfo.pNext], edx
        mov     [edi+TUndoInfo.operation], ecx

        mov     eax, [esi+TAsmEdit._UndoLevel]
        mov     [edi+TUndoInfo.group], eax

        mov     [esi+TAsmEdit._pUndo], edi

        mov     ecx, [esi+TAsmEdit._caretPos.x]
        mov     edx, [esi+TAsmEdit._caretPos.y]

        mov     [edi+TUndoInfo.line], ebx
        mov     [edi+TUndoInfo.caretPos.x], ecx
        mov     [edi+TUndoInfo.caretPos.y], edx

        mov     ecx, [esi+TAsmEdit._selStart.x]
        mov     edx, [esi+TAsmEdit._selStart.y]
        mov     [edi+TUndoInfo.selStart.x], ecx
        mov     [edi+TUndoInfo.selStart.y], edx

        mov     ecx, [esi+TAsmEdit._selEnd.x]
        mov     edx, [esi+TAsmEdit._selEnd.y]
        mov     [edi+TUndoInfo.selEnd.x], ecx
        mov     [edi+TUndoInfo.selEnd.y], edx

        mov     ecx, [esi+TAsmEdit._modified]
        mov     [edi+TUndoInfo.modified], ecx

        exec    esi, TAsmEdit:TextLine, ebx, TRUE
        stdcall TextDup, [eax]

.store:
        mov     [edi+TUndoInfo.pText], eax
        mov     [eax+TTextLine.syn_array], 0    ; don't copy syntax array pointer!
        mov     [eax+TTextLine.imgRendered], 0  ; and the image.
        and     [eax+TTextLine.flags], not tlfRendered

; now free all redo records, because every new stored undo point invalidates the whole redo list.

.clean_redo:
        xor     ecx, ecx
        xchg    ecx, [esi+TAsmEdit._pRedo]
        call    __do_clean_list

.finish:
        set     esi, TAsmEdit:Modified, TRUE
        popad
        return
endp


method TAsmEdit.ClearUndoRedo
begin
        pushad
        mov     esi, [.self]

        xor     ecx, ecx
        xchg    ecx, [esi+TAsmEdit._pUndo]
        call    __do_clean_list

        xor     ecx, ecx
        xchg    ecx, [esi+TAsmEdit._pRedo]
        call    __do_clean_list

        popad
        return

endp


proc __do_clean_list
begin
.clean_loop:
        jecxz      .end_clean

        stdcall TextFree, [ecx+TUndoInfo.pText]

        push    ecx
        mov     ecx, [ecx+TUndoInfo.pNext]

        stdcall FreeMem ; from the stack
        jmp     .clean_loop

.end_clean:
        return
endp


method TAsmEdit.CanUndo
begin
        mov     eax, [.self]
        mov     eax, [eax+TAsmEdit._pUndo]
        test    eax, eax
        setnz   al
        movzx   eax, al
        return
endp


method TAsmEdit.Undo
.group dd ?
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TAsmEdit._pUndo]

        test    edi, edi
        jz      .finish         ; nothing to undo.

        mov     eax, [edi+TUndoInfo.group]
        mov     [.group], eax

.loop:
        mov     edx, [edi+TUndoInfo.pNext]
        mov     [esi+TAsmEdit._pUndo], edx           ; remove from the UNDO list.

        mov     edx, [esi+TAsmEdit._pRedo]
        mov     [edi+TUndoInfo.pNext], edx
        mov     [esi+TAsmEdit._pRedo], edi           ; insert in the REDO list.

        call    __ApplyUndo

        mov     edi, [esi+TAsmEdit._pUndo]
        test    edi, edi
        jz      .refresh

        mov     eax, [edi+TUndoInfo.group]
        cmp     eax, [.group]
        je      .loop

.refresh:
        exec    esi, TAsmEdit:ScrollToCaretY
        exec    esi, TAsmEdit:ScrollToCaretX

        and     [esi+TAsmEdit._img_margin_valid], 0
        exec    esi, TAsmEdit:RectChanged2, 0

        exec    esi, TAsmEdit:UpdateScrollBar
        exec    esi, TAsmEdit:UpdateCaretPos

.finish:
        popad
        return
endp



method TAsmEdit.CanRedo
begin
        mov     eax, [.self]
        mov     eax, [eax+TAsmEdit._pRedo]
        test    eax, eax
        setnz   al
        movzx   eax, al
        return
endp


method TAsmEdit.Redo
.group dd ?
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [esi+TAsmEdit._lines]

        mov     edi, [esi+TAsmEdit._pRedo]

        test    edi, edi
        jz      .finish

        mov     eax, [edi+TUndoInfo.group]
        mov     [.group], eax

.loop:
        mov     edx, [edi+TUndoInfo.pNext]
        mov     [esi+TAsmEdit._pRedo], edx           ; remove from the REDO list.

        mov     edx, [esi+TAsmEdit._pUndo]
        mov     [edi+TUndoInfo.pNext], edx
        mov     [esi+TAsmEdit._pUndo], edi           ; insert in the UNDO list.

        call    __ApplyUndo

        mov     edi, [esi+TAsmEdit._pRedo]
        test    edi, edi
        jz      .refresh

        mov     eax, [edi+TUndoInfo.group]
        cmp     eax, [.group]
        je      .loop

.refresh:
        set     esi, TAsmEdit:Modified, TRUE
        exec    esi, TAsmEdit:ScrollToCaretY
        exec    esi, TAsmEdit:ScrollToCaretX

        and     [esi+TAsmEdit._img_margin_valid], 0
        exec    esi, TAsmEdit:RectChanged2, 0

        exec    esi, TAsmEdit:UpdateCaretPos
        exec    esi, TAsmEdit:UpdateScrollBar

.finish:
        popad
        return
endp


; esi - pointer to TAsmEdit
; edi - pointer to TUndoInfo

proc __ApplyUndo
begin
        pushad

        mov     eax, [esi+TAsmEdit._caretPos.x]
        xchg    eax, [edi+TUndoInfo.caretPos.x]
        set     esi, TAsmEdit:CaretX, eax          ; xchg caret_x

        mov     eax, [esi+TAsmEdit._caretPos.y]
        xchg    eax, [edi+TUndoInfo.caretPos.y]
        set     esi, TAsmEdit:CaretY, eax          ; xchg caret_y

        mov     eax, [esi+TAsmEdit._selStart.x]
        xchg    eax, [edi+TUndoInfo.selStart.x]
        mov     [esi+TAsmEdit._selStart.x], eax    ; xchg selStart_x

        mov     eax, [esi+TAsmEdit._selStart.y]
        xchg    eax, [edi+TUndoInfo.selStart.y]
        mov     [esi+TAsmEdit._selStart.y], eax    ; xchg selStart_y

        mov     eax, [esi+TAsmEdit._selEnd.x]
        xchg    eax, [edi+TUndoInfo.selEnd.x]
        mov     [esi+TAsmEdit._selEnd.x], eax      ; xchg selEnd_x

        mov     eax, [esi+TAsmEdit._selEnd.y]
        xchg    eax, [edi+TUndoInfo.selEnd.y]
        mov     [esi+TAsmEdit._selEnd.y], eax      ; xchg selEnd_y

        mov     eax, [esi+TAsmEdit._modified]
        xchg    eax, [edi+TUndoInfo.modified]
        mov     [esi+TAsmEdit._modified], eax      ; xchg _modified

        mov     ebx, [esi+TAsmEdit._lines]
        mov     eax, [edi+TUndoInfo.operation]

        cmp     eax, chopChanged
        je      .op_changed

        cmp     eax, chopDeleted
        je      .op_deleted

        cmp     eax, chopInserted
        je      .op_inserted

        int3           ; INVALID OPERATION
        jmp     .finish

.op_inserted:
        mov     [edi+TUndoInfo.operation], chopDeleted

        mov     eax, [edi+TUndoInfo.line]
        shl     eax, 2
        stdcall TextMoveGap, ebx, eax

        mov     eax, [ebx+TText.GapEnd]
        mov     ecx, [ebx+eax]

        mov     [edi+TUndoInfo.pText], ecx

        xor     edx, edx
        xchg    edx, [ecx+TTextLine.syn_array]
        stdcall FreeMem, edx

        and     [ecx+TTextLine.flags], not tlfRendered

        add     [ebx+TText.GapEnd], 4
        stdcall DecCount, [esi+TAsmEdit._line_widths], [ecx+TTextLine.ch_len]
        mov     [esi+TAsmEdit._line_widths], edx

        jmp     .finish

.op_deleted:

        mov     [edi+TUndoInfo.operation], chopInserted

        mov     eax, [edi+TUndoInfo.line]
        shl     eax, 2
        stdcall TextMoveGap, ebx, eax
        stdcall TextSetGapSize, ebx, 4
        mov     [esi+TAsmEdit._lines], edx

        mov     ebx, edx
        mov     eax, [ebx+TText.GapBegin]

        and     dword [ebx+eax], 0
        add     [ebx+TText.GapBegin], 4
        jmp     .restore_txt


.op_changed:
        mov     eax, [edi+TUndoInfo.line]
        shl     eax, 2          ; in bytes
        pos2ofs eax, ebx

.restore_txt:
        pushd   [edi+TUndoInfo.pText] [ebx+eax]
        popd    [edi+TUndoInfo.pText] [ebx+eax]      ; xchg TTextLine structures of the line.

        mov     ecx, [edi+TUndoInfo.pText]
        jecxz   @f

        xor     edx, edx
        xchg    edx, [ecx+TTextLine.syn_array]
        stdcall FreeMem, edx

        and     [ecx+TTextLine.flags], not tlfRendered

@@:
        mov     ecx, [ebx+eax]  ; the restored TTextLine

        and     [ecx+TTextLine.syn_array], 0
        and     [ecx+TTextLine.flags], not tlfRendered

; fix the horizontal scrollbar size.

        stdcall IncCount, [esi+TAsmEdit._line_widths], [ecx+TTextLine.ch_len]
        mov     [esi+TAsmEdit._line_widths], edx

        mov     ecx, [edi+TUndoInfo.pText]
        jecxz   @f
        stdcall DecCount, [esi+TAsmEdit._line_widths], [ecx+TTextLine.ch_len]
        mov     [esi+TAsmEdit._line_widths], edx
@@:

        exec    esi, TAsmEdit:DelTrailingSpaces, [edi+TUndoInfo.line]

.finish:
        popad
        return
endp




method TAsmEdit.Cut
begin
        push    eax ebx

        get     ebx, [.self], TAsmEdit:Selection
        stdcall StrLen, ebx
        test    eax, eax
        jz      .finish

        stdcall ClipboardWrite, ebx
        exec    [.self], TAsmEdit:DeleteSelection

.finish:
        pop     ebx eax
        return
endp



method TAsmEdit.Copy
begin
        push    eax ebx

        get     ebx, [.self], TAsmEdit:Selection
        stdcall StrLen, ebx
        test    eax, eax
        jz      .finish

        stdcall ClipboardWrite, ebx

.finish:
        pop     ebx eax
        return
endp



method TAsmEdit.Paste
begin
        push    eax

        stdcall ClipboardRead
        jc      .finish

        exec    [.self], TAsmEdit:ReplaceSelection, eax

.finish:
        pop     eax
        return
endp



; Text editing methods




method TAsmEdit.InsertNewLine   ;, .LineNum
begin
        pushad

        mov     esi, [.self]
        mov     edx, [esi+TAsmEdit._lines]

        stdcall TextSetGapSize, edx, 4
        mov     [esi+TAsmEdit._lines], edx
        jc      .finish

        xor     edi, edi

        mov     eax, [.LineNum]
        shl     eax, 2

        stdcall TextMoveGap, edx, eax

        mov     ebx, [edx+TText.GapBegin]
        add     ebx, edx

        stdcall TextCreate, sizeof.TTextLine
        jc      .finish

        mov     [ebx], eax
        mov     [esp+4*regEAX], ebx                     ; return value in EAX is the pointer to the new inserted TText.

; Init the TTextLine part of the structure to 0.
        lea     edi, [eax - sizeof.TTextLine]
        mov     ecx, (sizeof.TTextLine - sizeof.TText)/4
        xor     eax, eax
        rep stosd

        add     [edx+TText.GapBegin], 4

        stdcall IncCount, [esi+TAsmEdit._line_widths], 0
        mov     [esi+TAsmEdit._line_widths], edx

        clc

.finish:
        popad
        return
endp



method TAsmEdit.DeleteLine      ;, .LineNum
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TAsmEdit._lines]
        mov     ebx, [.LineNum]
        test    ebx, ebx
        cmovs   ebx, [esi+TAsmEdit._caretPos.y]
        mov     [.LineNum], ebx

        shl     ebx, 2
        stdcall TextMoveGap, edi, ebx

        mov     ebx, [edi+TText.GapEnd]
        cmp     ebx, [edi+TText.Length]
        jae     .not_deleted

        exec    esi, TAsmEdit:SaveForUndo, [.LineNum], chopDeleted

        mov     edx, [edi+ebx]
        stdcall FreeMem, [edx+TTextLine.syn_array]
        stdcall RecycleImage, [edx+TTextLine.imgRendered]
        stdcall TextFree, edx

        add     [edi+TText.GapEnd], 4

        clc
        popad
        return

.not_deleted:
        stc
        popad
        return
endp


method TAsmEdit.DeleteChar  ; .LineNum, .CharPos
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TAsmEdit._lines]
        mov     ebx, [.LineNum]
        mov     eax, [.CharPos]
        test    ebx, ebx
        cmovs   ebx, [esi+TAsmEdit._caretPos.y]
        cmovs   eax, [esi+TAsmEdit._caretPos.x]
        mov     [.CharPos], eax
        mov     [.LineNum], ebx

        shl     ebx, 2
        cmp     ebx, [edi+TText.GapBegin]
        jb      .skip
        add     ebx, [edi+TText.GapEnd]
        sub     ebx, [edi+TText.GapBegin]
.skip:
        cmp     ebx, [edi+TText.Length]
        jae     .not_deleted

        mov     ebx, [edi+ebx]
        stdcall TextIndexToPos, ebx, [.CharPos]
        jc      .not_deleted

        stdcall TextMoveGap, ebx, eax
        mov     edx, [ebx+TTextLine.GapEnd]
        cmp     edx, [ebx+TTextLine.Length]
        jae     .not_deleted

        exec    esi, TAsmEdit:SaveForUndo, [.LineNum], chopChanged

        movzx   eax, byte [ebx+edx]

                                ; compute the length of the UTF-8 character by its first byte (version without branches) Is it fast?
        not     al              ; utf-8 starts with one of: 0xxxxxxx, 110xxxxx, 1110xxxx, 11110xxx, 111110xx, 1111110x
        bsr     eax, eax        ; eax =                 7,  5,  4,  3,  2,  1
        sub     eax, 7          ; eax =                 0, -2, -3, -4, -5, -6
                                ; CF  =                 0,  1,  1,  1,  1,  1
        not     eax             ; eax =                -1, +1, +2, +3, +4, +5
        sbb     eax, -2         ; eax = edx + 2 - CF = +1, +2, +3, +4, +5, +6

        add     edx, eax
        cmp     edx, [ebx+TTextLine.Length]
        cmova   edx, [ebx+TTextLine.Length]
        mov     [ebx+TTextLine.GapEnd], edx

        xor     eax, eax
        xchg    eax, [ebx+TTextLine.syn_array]     ; reset the syntax array of the line...
        stdcall FreeMem, eax

        and     [ebx+TTextLine.flags], not tlfRendered

        stdcall DecCount, [esi+TAsmEdit._line_widths], [ebx+TTextLine.ch_len]
        dec     [ebx+TTextLine.ch_len]
        stdcall IncCount, edx, [ebx+TTextLine.ch_len]
        mov     [esi+TAsmEdit._line_widths], edx

        and     [esi+TAsmEdit._img_margin_valid], 0
        exec    esi, TAsmEdit:RectChanged2, 0
        exec    esi, TAsmEdit:UpdateCaretPos

        clc
        popad
        return

.not_deleted:
        stc
        popad
        return
endp


method TAsmEdit.JoinNextLine    ; .LineNum
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TAsmEdit._lines]
        mov     ebx, [.LineNum]
        test    ebx, ebx
        cmovs   ebx, [esi+TAsmEdit._caretPos.y]
        mov     [.LineNum], ebx

        shl     ebx, 2
        lea     ecx, [ebx+4]

        stdcall TextMoveGap, edi, ecx   ; move the gap between the two lines.

; here ebx is before the gap and ecx is after!

        add     ecx, [edi+TText.GapEnd]
        sub     ecx, [edi+TText.GapBegin]
        cmp     ecx, [edi+TText.Length]
        jae     .finish ; nothing to join

        cmp     ebx, [edi+TText.Length]
        jae     .finish

        exec    esi, TAsmEdit:SaveForUndo, [.LineNum], chopChanged
        inc     [.LineNum]
        exec    esi, TAsmEdit:SaveForUndo, [.LineNum], chopDeleted

        add     [edi+TText.GapEnd], 4   ; free the place of the next line...

; first fix the new line widths...

        mov     edx, [esi+TAsmEdit._line_widths]

        mov     eax, [edi+ebx]
        push    [eax+TTextLine.ch_len]
        stdcall DecCount, edx, [eax+TTextLine.ch_len]

        mov     eax, [edi+ecx]
        push    [eax+TTextLine.ch_len]
        stdcall DecCount, edx, [eax+TTextLine.ch_len]

        mov     [esi+TAsmEdit._line_widths], edx

        pop     eax edx
        add     eax, edx
        mov     edx, [edi+ebx]
        mov     [edx+TTextLine.ch_len], eax

        stdcall IncCount, [esi+TAsmEdit._line_widths], eax
        mov     [esi+TAsmEdit._line_widths], edx

; then join the texts

        stdcall TextAddText, [edi+ebx], -1, [edi+ecx]
        mov     [edi+ebx], edx

; then free the next line TTextLine structure...

        mov     eax, [edi+ecx]
        mov     edx, [eax+TTextLine.flags]

        stdcall FreeMem, [eax+TTextLine.syn_array]
        stdcall RecycleImage, [eax+TTextLine.imgRendered]
        stdcall TextFree, eax     ; delete the next line... but what about the debug info and other attributes?

; reset the syntax coloring of the result line
        mov     eax, [edi+ebx]
        or      [eax+TTextLine.flags], edx

        stdcall FreeMem, [eax+TTextLine.syn_array]
        and     [eax+TTextLine.syn_array], 0

.finish:
        popad
        return
endp



method TAsmEdit.SplitLine
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [.LineNum]
        mov     ecx, [.PosX]
        test    ebx, ebx
        cmovs   ebx, [esi+TAsmEdit._caretPos.y]
        cmovs   ecx, [esi+TAsmEdit._caretPos.x]
        mov     [.LineNum], ebx
        mov     [.PosX], ecx

        exec    esi, TAsmEdit:TextLine, ebx, TRUE     ; ensure the line ebx exists.

        inc     ebx
        exec    esi, TAsmEdit:InsertNewLine, ebx
        mov     edi, eax
        exec    esi, TAsmEdit:SaveForUndo, ebx, chopInserted

        mov     edx, [esi+TAsmEdit._lines]
        mov     ebx, [edx+4*ebx-4]                ; the gap, after the InsertNewLine is located just after the ebx line.

        stdcall TextIndexToPos, ebx, [.PosX]

        push    eax
        exec    esi, TAsmEdit:SaveForUndo, [.LineNum], chopChanged
        pop     eax

        stdcall TextMoveGap, ebx, eax
        stdcall DecCount, [esi+TAsmEdit._line_widths], [ebx+TTextLine.ch_len]
        mov     [esi+TAsmEdit._line_widths], edx

        mov     eax, [ebx+TTextLine.GapEnd]
        mov     ecx, [ebx+TTextLine.Length]
        mov     [ebx+TTextLine.GapEnd], ecx
        sub     ecx, eax     ; the length in bytes of the remaining text in the splitted line.
        add     eax, ebx     ; the address of the remaining of the splitted line.

        push    eax ecx

        stdcall StrLenUtf8, eax, ecx
        push    eax eax  ; the length in utf-8 chars.

        test    [esi+TAsmEdit._options], aeoAutoIndents
        jz      .indent_ok

        mov     eax, [.LineNum]
        inc     eax
        exec    esi, TAsmEdit:GetSmartTab, eax, 0
        mov     edx, [edi]
        mov     [edx+TTextLine.ch_len], eax

.spc:
        dec     eax
        js      .end_spc

        stdcall TextAddChar, edx, ' '
        jmp     .spc

.end_spc:
        mov     [edi], edx

.indent_ok:
        mov     ecx, [edi]

        xor     edx, edx
        xchg    edx, [ecx+TTextLine.syn_array]
        stdcall FreeMem, edx
        and     [ecx+TTextLine.flags], not tlfRendered   ; mark the new line as not rendered.

        xor     edx, edx
        xchg    edx, [ebx+TTextLine.syn_array]
        stdcall FreeMem, edx
        and     [ebx+TTextLine.flags], not tlfRendered   ; mark the old line as not rendered.

        stdcall DecCount, [esi+TAsmEdit._line_widths], 0        ; the initial length of the new line was incremented in InsertLine

        pop     eax
        add     [ecx+TTextLine.ch_len], eax

        stdcall IncCount, edx, [ecx+TTextLine.ch_len]   ; the width of the new line.

        pop     eax
        sub     [ebx+TTextLine.ch_len], eax

        stdcall IncCount, edx, [ebx+TTextLine.ch_len]   ; the width of the old line.
        mov     [esi+TAsmEdit._line_widths], edx

        pop     ecx eax

        mov     ebx, [edi]
        mov     ebx, [ebx+TTextLine.GapBegin]
        mov     [esp+4*regEAX], ebx             ; the caret position is returned in EAX. Notice, that from the begining of
                                                ; the line up to the caret, there can be only $20 spaces, so the GapBegin
                                                ; is always equal to the caret position X.

        stdcall TextAddBytes, [edi], -1, eax, ecx       ; copy the text from the old line into the new.
        mov     [edi], edx

        exec    esi, TAsmEdit:DelTrailingSpaces, [.LineNum]

.finish:
        popad
        return
endp



method TAsmEdit.DeleteSelection
.list dd ?
begin
        pushad

        exec    [.self], TAsmEdit:_AddSelRectanglesAbs, 0
        mov     [.list], edx

        lea     edi, [edx+TArray.array]
        mov     ecx, [edx+TArray.count]
        test    ecx, ecx
        jz      .exit_empty

        mov     eax, ecx
        shl     eax, 4  ; sizeof.RECT
        add     edi, eax

.rect_loop:

        sub     edi, sizeof.RECT
        dec     ecx
        js      .finish

        mov     ebx, [edi+RECT.bottom]

.y_loop:
        dec     ebx
        cmp     ebx, [edi+RECT.top]
        jl      .rect_loop

        exec    [.self], TAsmEdit:SaveForUndo, ebx, chopChanged

        exec    [.self], TAsmEdit:AddTrailingSpaces, ebx, [edi+RECT.left]
        exec    [.self], TAsmEdit:TextLine, ebx, TRUE
        mov     esi, [eax]

        stdcall TextIndexToPos, esi, [edi+RECT.left]
        stdcall TextMoveGap, esi, eax

        mov     eax, [esi+TTextLine.ch_len]
        cmp     eax, [edi+RECT.right]
        cmova   eax, [edi+RECT.right]                   ; delete up to the min(length, RECT.right) utf-8 character position!

        push    ecx
        push    eax             ; char count
        mov     ecx, [.self]

        stdcall TextIndexToPos, esi, eax
        sub     eax, [esi+TTextLine.GapBegin]
        add     [esi+TTextLine.GapEnd], eax             ; delete eax bytes!

        stdcall DecCount, [ecx+TAsmEdit._line_widths], [esi+TTextLine.ch_len]

        pop     eax
        sub     eax, [edi+RECT.left]    ; deleted characters!
        sub     [esi+TTextLine.ch_len], eax

        stdcall IncCount, edx, [esi+TTextLine.ch_len]
        mov     [ecx+TAsmEdit._line_widths], edx

        pop     ecx

; join the lines, if the selection is right to infinity:

        cmp     [edi+RECT.right], $7fffffff
        je      .joinnext

        exec    [.self], TAsmEdit:DelTrailingSpaces, ebx
        jmp     .y_loop

.joinnext:
        exec    [.self], TAsmEdit:JoinNextLine, ebx
        jmp     .y_loop

.finish:
        mov     esi, [.self]

        get     eax, esi, TAsmEdit:SelStartX
        get     ecx, esi, TAsmEdit:SelEndX
        cmp     eax, ecx
        cmovg   eax, ecx

        get     edx, esi, TAsmEdit:SelStartY
        get     ecx, esi, TAsmEdit:SelEndY
        cmp     edx, ecx
        cmovg   edx, ecx

        set     esi, TAsmEdit:CaretX, eax
        set     esi, TAsmEdit:CaretY, edx

        exec    esi, TAsmEdit:SelChangeBegin
        exec    esi, TAsmEdit:SelStartHere
        exec    esi, TAsmEdit:SelEndHere
        exec    esi, TAsmEdit:SelChangeEnd

        exec    esi, TAsmEdit:UpdateScrollBar
        xor     eax, eax
        xchg    eax, [esi+TAsmEdit._img_margin_valid]
        exec    esi, TAsmEdit:RectChanged2, 0
        exec    esi, TAsmEdit:ScrollToCaretX
        exec    esi, TAsmEdit:ScrollToCaretY

.exit:
        inc     [esi+TAsmEdit._UndoLevel]
        stdcall FreeMem, [.list]
        clc
        popad
        return

.exit_empty:

        stdcall FreeMem, [.list]
        stc
        popad
        return
endp



method TAsmEdit.InsertString    ;, .text
.varline dd ?
.options dd ?
begin
        pushad

        mov     edi, [.self]

        inc     [edi+TAsmEdit._UndoLevel]
        get     ebx, edi, TAsmEdit:CaretY
        get     ecx, edi, TAsmEdit:CaretX

        push    [edi+TAsmEdit._options]
        and     [edi+TAsmEdit._options], not aeoAutoIndents

        stdcall StrPtr, [.text]
        mov     esi, eax

.loopy:
        exec    [.self], TAsmEdit:TextLine, ebx, TRUE
        mov     [.varline], eax
        mov     edx, [eax]

        exec    [.self], TAsmEdit:SaveForUndo, ebx, chopChanged
        exec    [.self], TAsmEdit:AddTrailingSpaces, ebx, ecx

        and     [edx+TTextLine.flags], not tlfRendered
        xor     eax, eax
        xchg    eax, [edx+TTextLine.syn_array]
        stdcall FreeMem, eax

        stdcall TextIndexToPos, edx, ecx
        stdcall TextMoveGap, edx, eax

        xor     ecx, ecx        ; inserted characters.

.loopx:
        stdcall TextSetGapSize, edx, 4

        mov     eax, [esi]

        cmp     al, $20
        jae     .insert

; ctrl characters
        test    al, al
        jz      .end_of_line

        cmp     al, $0d
        je      .end_of_line

        cmp     al, $0a
        je      .end_of_line

;        cmp     al, $09
;        je      .tab

; ignore the remaining ctrl characters.
        inc     esi
        jmp     .loopx

.insert:
        mov     edi, [edx+TTextLine.GapBegin]
        mov     [edx+edi], eax

        movzx   eax, al
                                ; compute the length of the UTF-8 character by its first byte (version without branches) Is it fast?
        not     al              ; utf-8 starts with one of: 0xxxxxxx, 110xxxxx, 1110xxxx, 11110xxx, 111110xx, 1111110x
        bsr     eax, eax        ; eax =                 7,  5,  4,  3,  2,  1
        sub     eax, 7          ; eax =                 0, -2, -3, -4, -5, -6
                                ; CF  =                 0,  1,  1,  1,  1,  1
        not     eax             ; eax =                -1, +1, +2, +3, +4, +5
        sbb     eax, -2         ; eax = eax + 2 - CF = +1, +2, +3, +4, +5, +6

        add     [edx+TTextLine.GapBegin], eax
        add     esi, eax
        inc     ecx
        jmp     .loopx

.end_of_line:
        xor     ah, $0d xor $0a
        cmp     al, ah      ; ah is the next char.
        jne     .crlf_ok

        inc     esi

.crlf_ok:
        push    eax

        inc     esi
        mov     edi, [.self]

        get     eax, edi, TAsmEdit:CaretX
        add     eax, ecx
        set     edi, TAsmEdit:CaretX, eax

        mov     eax, [.varline]
        mov     [eax], edx         ; save the modified line.

        add     ecx, [edx+TTextLine.ch_len]
        push    [edx+TTextLine.ch_len]
        mov     [edx+TTextLine.ch_len], ecx

        stdcall DecCount, [edi+TAsmEdit._line_widths] ; from the stack
        stdcall IncCount, edx, ecx
        mov     [edi+TAsmEdit._line_widths], edx

        pop     eax
        test    al, al
        jz      .end_of_text

        exec    edi, TAsmEdit:SplitLine, ebx, [edi+TAsmEdit._caretPos.x]

        mov     ecx, eax
        set     edi, TAsmEdit:CaretX, eax

        inc     ebx
        set     edi, TAsmEdit:CaretY, ebx
        jmp     .loopy

.end_of_text:
        mov     edi, [.self]

        pop     [edi+TAsmEdit._options]

        exec    edi, TAsmEdit:ScrollToCaretX
        exec    edi, TAsmEdit:ScrollToCaretY

        exec    edi, TAsmEdit:ComputeLeftMarginWidth

        and     [edi+TAsmEdit._img_margin_valid], 0
        exec    edi, TAsmEdit:__UpdateImages
        exec    edi, TAsmEdit:UpdateScrollBar
        exec    edi, TAsmEdit:UpdateCaretPos
        exec    edi, TAsmEdit:RectChanged2, 0

        popad
        return
endp



method TAsmEdit.ReplaceSelection        ;, .text
begin
        exec    [.self], TAsmEdit:DeleteSelection
        exec    [.self], TAsmEdit:InsertString, [.text]
        return
endp



method TAsmEdit.AddTrailingSpaces  ; .LineNum, .CharX
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [.LineNum]
        mov     eax, [.PosX]
        test    ebx, ebx
        cmovs   ebx, [esi+TAsmEdit._caretPos.y]
        cmovs   eax, [esi+TAsmEdit._caretPos.x]
        mov     [.PosX], eax

        mov     edi, [esi+TAsmEdit._lines]

        shl     ebx, 2
        cmp     ebx, [edi+TText.GapBegin]
        jb      .skip
        add     ebx, [edi+TText.GapEnd]
        sub     ebx, [edi+TText.GapBegin]
.skip:
        cmp     ebx, [edi+TText.Length]
        jae     .finish         ; the line is outside the text. Add empty lines???

        mov     edx, [edi+ebx]

        mov     ecx, [.PosX]
        sub     ecx, [edx+TTextLine.ch_len]
        jle     .finish                         ; the caret is inside the line.

        push    edx
        stdcall DecCount, [esi+TAsmEdit._line_widths], [edx+TTextLine.ch_len]
        mov     [esi+TAsmEdit._line_widths], edx
        pop     edx

        add     [edx+TTextLine.ch_len], ecx

        push    edx
        stdcall IncCount, [esi+TAsmEdit._line_widths], [edx+TTextLine.ch_len]
        mov     [esi+TAsmEdit._line_widths], edx
        pop     edx

        stdcall TextMoveGap, edx, -1
        stdcall TextSetGapSize, edx, ecx
        mov     [edi+ebx], edx

        mov     edi, edx
        add     edi, [edx+TTextLine.GapBegin]
        add     [edx+TTextLine.GapBegin], ecx
        mov     al, " "
        rep stosb

.finish:
        popad
        return
endp




method TAsmEdit.DelTrailingSpaces       ;, ;.LineNum
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [.LineNum]
        test    ebx, ebx
        cmovs   ebx, [esi+TAsmEdit._caretPos.y]

        mov     edi, [esi+TAsmEdit._lines]

        shl     ebx, 2
        cmp     ebx, [edi+TText.GapBegin]
        jb      .skip
        add     ebx, [edi+TText.GapEnd]
        sub     ebx, [edi+TText.GapBegin]
.skip:
        cmp     ebx, [edi+TText.Length]
        jae     .finish         ; the line is outside the text. Add empty lines???

        mov     edi, [edi+ebx]

        stdcall TextMoveGap, edi, -1

        mov     edx, edi
        add     edx, [edi+TTextLine.GapBegin]

; search back the first non-whitespace...

.loop:
        dec     edx
        cmp     edx, edi
        jl      .found

        cmp     byte [edx], ' '
        jbe     .loop

.found:
        inc     edx
        mov     ecx, edx
        sub     ecx, edi

        xchg    ecx, [edi+TTextLine.GapBegin]
        sub     ecx, [edi+TTextLine.GapBegin]

        stdcall DecCount, [esi+TAsmEdit._line_widths], [edi+TTextLine.ch_len]
        sub     [edi+TTextLine.ch_len], ecx
        stdcall IncCount, edx, [edi+TTextLine.ch_len]
        mov     [esi+TAsmEdit._line_widths], edx

        xor     eax, eax
        xchg    eax, [edi+TTextLine.syn_array]
        stdcall FreeMem, eax

        and     [edi+TTextLine.flags], not tlfRendered

.finish:
        popad
        return
endp



method TAsmEdit.PrefixInsert
begin
        pushad

        movzx   ecx, byte [.char]
        
                                ; compute the length of the UTF-8 character by its first byte (version without branches) Is it fast?
        not     cl              ; utf-8 starts with one of: 0xxxxxxx, 110xxxxx, 1110xxxx, 11110xxx, 111110xx, 1111110x
        bsr     ecx, ecx        ; eax =                 7,  5,  4,  3,  2,  1
        sub     ecx, 7          ; eax =                 0, -2, -3, -4, -5, -6
                                ; CF  =                 0,  1,  1,  1,  1,  1
        not     ecx             ; eax =                -1, +1, +2, +3, +4, +5
        sbb     ecx, -2         ; eax = edx + 2 - CF = +1, +2, +3, +4, +5, +6

        shl     ecx, 3  ; *8 bits
        xor     eax, eax
        dec     eax
        shl     eax, cl
        not     eax
        and     [.char], eax    ; only one utf8 char is allowed.

        mov     esi, [.self]
        inc     [esi+TAsmEdit._UndoLevel]

        mov     ebx, [.LineFrom]
        dec     ebx

.loop:
        inc     ebx
        cmp     ebx, [.LineTo]
        je      .end_loop
        
        exec    esi, TAsmEdit:SaveForUndo, ebx, chopChanged
        
        exec    esi, TAsmEdit:TextLine, ebx, FALSE
        jc      .end_loop

        mov     edx, [eax]
        
        stdcall TextMoveGap, edx, 0
        stdcall TextAddChar, edx, [.char]
        mov     [eax], edx

        mov     eax, [edx+TTextLine.ch_len]
        inc     [edx+TTextLine.ch_len]
        mov     ecx, [edx+TTextLine.ch_len]

        stdcall DecCount, [esi+TAsmEdit._line_widths], eax
        stdcall IncCount, edx, ecx
        mov     [esi+TAsmEdit._line_widths], edx

        exec    esi, TAsmEdit:DelTrailingSpaces, ebx
        jmp     .loop

.end_loop:
        exec    esi, TAsmEdit:UpdateScrollBar
        exec    esi, TAsmEdit:RectChanged2, 0

        popad
        return
endp



method TAsmEdit.PrefixRemove
begin
        pushad

        movzx   ecx, byte [.char]

                                ; compute the length of the UTF-8 character by its first byte (version without branches) Is it fast?
        not     cl              ; utf-8 starts with one of: 0xxxxxxx, 110xxxxx, 1110xxxx, 11110xxx, 111110xx, 1111110x
        bsr     ecx, ecx        ; ecx =                 7,  5,  4,  3,  2,  1
        sub     ecx, 7          ; ecx =                 0, -2, -3, -4, -5, -6
                                ; CF  =                 0,  1,  1,  1,  1,  1
        not     ecx             ; ecx =                -1, +1, +2, +3, +4, +5
        sbb     ecx, -2         ; ecx = ecx + 2 - CF = +1, +2, +3, +4, +5, +6

        shl     ecx, 3  ; *8 bits
        xor     eax, eax
        dec     eax
        shl     eax, cl
        not     eax
        and     [.char], eax    ; only one utf8 char is allowed.

        mov     esi, [.self]
        
        mov     ebx, [.LineFrom]
        dec     ebx

.loop1:
        inc     ebx
        cmp     ebx, [.LineTo]
        je      .end_loop1

        exec    esi, TAsmEdit:TextLine, ebx, FALSE
        jc      .end_loop1

        mov     edx, [eax]

        stdcall TextMoveGap, edx, 0
        stdcall TextGetChar, edx
        jc      .finish

        cmp     eax, [.char]
        je      .loop1
        jmp     .finish


.end_loop1:

        mov     ebx, [.LineFrom]
        dec     ebx

        inc     [esi+TAsmEdit._UndoLevel]

.loop2:
        inc     ebx
        cmp     ebx, [.LineTo]
        je      .end_loop2

        exec    esi, TAsmEdit:SaveForUndo, ebx, chopChanged
        exec    esi, TAsmEdit:TextLine, ebx, FALSE
        jc      .end_loop2

        mov     edx, [eax]
        stdcall TextDelChar, edx

        mov     eax, [edx+TTextLine.ch_len]
        dec     [edx+TTextLine.ch_len]
        mov     ecx, [edx+TTextLine.ch_len]

        stdcall DecCount, [esi+TAsmEdit._line_widths], eax
        stdcall IncCount, edx, ecx
        mov     [esi+TAsmEdit._line_widths], edx

        exec    esi, TAsmEdit:DelTrailingSpaces, ebx
        jmp     .loop2

.end_loop2:
        exec    esi, TAsmEdit:UpdateScrollBar
        exec    esi, TAsmEdit:RectChanged2, 0

.finish:
        popad
        return
endp



;  method .SelectionPrefix, .op, .char

selprInsert = 0
selprRemove = 1

method TAsmEdit.SelectionPrefix
begin
        pushad

        mov     esi, [.self]
        exec    esi, TAsmEdit:HasSelection
        jnc     .finish

        exec    esi, TAsmEdit:SelChangeBegin

        get     eax, esi, TAsmEdit:Mode
        and     eax, not aemBlockSelection
        set     esi, TAsmEdit:Mode, eax

        mov     eax, [esi+TAsmEdit._selStart.x]
        mov     ebx, [esi+TAsmEdit._selStart.y]
        mov     ecx, [esi+TAsmEdit._selEnd.x]
        mov     edx, [esi+TAsmEdit._selEnd.y]

        cmp     ebx, edx
        jb      .sel_ok
        ja      .swap

        cmp     eax, ecx
        jbe     .sel_ok

.swap:
        xchg    ebx, edx
        xchg    eax, ecx

.sel_ok:
        xor     eax, eax        ; from the start of the line.

        test    ecx, ecx
        jz      .sel_ok2

        inc     edx
        xor     ecx, ecx

.sel_ok2:
        mov     [esi+TAsmEdit._selStart.x], eax
        mov     [esi+TAsmEdit._selStart.y], ebx
        mov     [esi+TAsmEdit._selEnd.x], ecx
        mov     [esi+TAsmEdit._selEnd.y], edx
        mov     [esi+TAsmEdit._caretPos.x], ecx
        mov     [esi+TAsmEdit._caretPos.y], edx

        exec    esi, TAsmEdit:SelChangeEnd
        exec    esi, TAsmEdit:UpdateCaretPos

        cmp     [.op], 0
        jne     .remove

;insert
        exec    esi, TAsmEdit:PrefixInsert, ebx, edx, [.char]
        jmp     .finish

.remove:
        exec    esi, TAsmEdit:PrefixRemove, ebx, edx, [.char]

.finish:
        popad
        return
endp




method TAsmEdit.GetSmartTab     ;, .lineNum, .fromX
begin
        pushad

        mov     eax, [.lineNum]
        test    eax, eax
        jz      .missing

        dec     eax
        exec    [.self], TAsmEdit:TextLine, eax, FALSE
        jc      .missing

        mov     esi, [eax]
        stdcall TextIndexToPos, esi, [.fromX]
        mov     ebx, eax

        xor     ecx, ecx
        test    ebx, ebx
        cmovz   ecx, esi        ; esi is only <>0 here!
        jz      .start

        dec     ebx
        cmp     ebx, [esi+TText.GapBegin]
        jb      @f
        cmp     ebx, [esi+TText.GapEnd]
        jae     @f
        add     ebx, [esi+TText.GapEnd]
        sub     ebx, [esi+TText.GapBegin]
@@:
        cmp     ebx, [esi+TText.Length]
        jae     .missing

        cmp     byte [esi+ebx], ' '
        cmove   ecx, esi
        jmp     .search

.start:
        dec     ebx

.search:
        inc     ebx

        cmp     ebx, [esi+TText.GapBegin]
        jb      @f
        cmp     ebx, [esi+TText.GapEnd]
        jae     @f
        add     ebx, [esi+TText.GapEnd]
        sub     ebx, [esi+TText.GapBegin]
@@:
        cmp     ebx, [esi+TText.Length]
        jae     .missing

        cmp     byte [esi+ebx], ' '
        cmove   ecx, esi
        je      .search

        test    ecx, ecx
        jz      .search

        cmp     ebx, [esi+TText.GapBegin]
        jb      .finish

        sub     ebx, [esi+TText.GapEnd]
        add     ebx, [esi+TText.GapBegin]

.finish:
        stdcall TextPosToIndex, esi, ebx
        mov     [esp+4*regEAX], eax
        clc
        popad
        return


.missing:
        mov     dword [esp+4*regEAX], 0
        stc
        popad
        return
endp






; Search methods

method TAsmEdit.Search  ;, .pattern, .options
.lines dd ?
begin
        pushad

        mov     esi, [.self]

        xor     eax, eax
        xchg    eax, [esi+TAsmEdit._search_str]
        test    eax, eax
        jz      .ready

        stdcall StrDel, eax

        xor     eax, eax
        xchg    eax, [esi+TAsmEdit._search_index]
        test    eax, eax
        jz      .ready

        stdcall FreeMem, eax


.ready:
        cmp     [.pattern], 0
        je      .finish

        xor     edx, edx

        stdcall StrLen, [.pattern]
        test    eax, eax
        jz      .end_search

        stdcall StrDup, [.pattern]
        mov     [esi+TAsmEdit._search_str], eax

        mov     eax, [.options]
        mov     [esi+TAsmEdit._search_options], eax

        stdcall TextPrepareSearch, [esi+TAsmEdit._search_str], [esi+TAsmEdit._search_options]
        mov     edi, eax

        stdcall CreateArray, sizeof.POINT
        mov     edx, eax

        mov     ebx, [esi+TAsmEdit._lines]
        mov     eax, [ebx+TText.Length]
        sub     eax, [ebx+TText.GapEnd]
        add     eax, [ebx+TText.GapBegin]
        shr     eax, 2
        mov     [.lines], eax

        xor     ebx, ebx
        dec     ebx

.next_line:
        inc     ebx
        cmp     ebx, [.lines]
        jae     .end_search

        exec    esi, TAsmEdit:TextLine, ebx, FALSE
        jc      .end_search

        mov     ecx, [eax]
        xor     eax, eax

.loop:
        stdcall TextSearch, ecx, [esi+TAsmEdit._search_str], eax, edi, [esi+TAsmEdit._search_options]
        jnc     .next_line

        push    eax ebx eax

        stdcall AddArrayItems, edx, 1

        pop     [eax+POINT.x] [eax+POINT.y]

        pop     eax
        inc     eax
        jmp     .loop

.end_search:
        mov     [esi+TAsmEdit._search_index], edx
        exec    esi, TAsmEdit:SearchHere

.finish:
        popad
        return
endp




method TAsmEdit.SearchHere
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TAsmEdit._search_index]
        test    edi, edi
        jz      .deselect

        get     eax, esi, TAsmEdit:CaretY
        get     edx, esi, TAsmEdit:CaretX

        xor     ecx, ecx
        dec     ecx

.search:
        inc     ecx
        cmp     ecx, [edi+TArray.count]
        jge     .not_found

        cmp     eax, [edi+TArray.array+8*ecx+POINT.y]
        jg      .search
        jl      .found

        cmp     edx, [edi+TArray.array+8*ecx+POINT.x]
        jg      .search

.found:
        set     esi, TAsmEdit:CaretY, [edi+TArray.array+8*ecx+POINT.y]

        stdcall StrLenUtf8, [esi+TAsmEdit._search_str]
        add     eax, [edi+TArray.array+8*ecx+POINT.x]
        set     esi, TAsmEdit:CaretX, eax
        exec    esi, TAsmEdit:SelStartHere

        set     esi, TAsmEdit:CaretX, [edi+TArray.array+8*ecx+POINT.x]
        exec    esi, TAsmEdit:SelEndHere

        exec    esi, TAsmEdit:ScrollToCaretX
        exec    esi, TAsmEdit:CenterCaretY, [edi+TArray.array+8*ecx+POINT.y]

.finish:
        exec    esi, TAsmEdit:__ClearScrollbar, scrollY
        exec    esi, TAsmEdit:__DrawScrollbar, scrollY
        exec    esi, TAsmEdit:__Invalidate, scrollY

        popad
        return

.deselect:
        exec    esi, TAsmEdit:SelStartHere
        exec    esi, TAsmEdit:SelEndHere
        jmp     .finish

.not_found:
        or      eax, edx
        jz      .deselect

        xor     ecx, ecx
        dec     ecx
        xor     eax, eax
        xor     edx, edx
        jmp     .search
endp




method TAsmEdit.SearchNext
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TAsmEdit._search_index]
        test    edi, edi
        jz      .finish

; sort selection first

        mov     eax, [esi+TAsmEdit._selEnd.y]
        cmp     eax, [esi+TAsmEdit._selStart.y]
        jne     .do_search

        cmp     eax, [esi+TAsmEdit._caretPos.y]
        jne     .do_search

        mov     eax, [esi+TAsmEdit._selEnd.x]
        mov     edx, [esi+TAsmEdit._selStart.x]

        cmp     eax, [esi+TAsmEdit._caretPos.x]
        je      .sort
        cmp     edx, [esi+TAsmEdit._caretPos.x]
        jne     .do_search
.sort:
        cmp     eax, edx
        cmovb   eax, edx

        set     esi, TAsmEdit:CaretX, eax

.do_search:
        get     eax, esi, TAsmEdit:CaretY
        get     edx, esi, TAsmEdit:CaretX

        xor     ecx, ecx
        dec     ecx

.search:
        inc     ecx
        cmp     ecx, [edi+TArray.count]
        jge     .not_found

        cmp     eax, [edi+TArray.array+8*ecx+POINT.y]
        jg      .search
        jl      .found

        cmp     edx, [edi+TArray.array+8*ecx+POINT.x]
        jg      .search

.found:
        set     esi, TAsmEdit:CaretY, [edi+TArray.array+8*ecx+POINT.y]
        set     esi, TAsmEdit:CaretX, [edi+TArray.array+8*ecx+POINT.x]
        exec    esi, TAsmEdit:SelStartHere

        stdcall StrLenUtf8, [esi+TAsmEdit._search_str]
        add     eax, [edi+TArray.array+8*ecx+POINT.x]
        set     esi, TAsmEdit:CaretX, eax
        exec    esi, TAsmEdit:SelEndHere

        exec    esi, TAsmEdit:CenterCaretY, [edi+TArray.array+8*ecx+POINT.y]
        exec    esi, TAsmEdit:ScrollToCaretX

        exec    esi, TAsmEdit:__ClearScrollbar, scrollY
        exec    esi, TAsmEdit:__DrawScrollbar, scrollY
        exec    esi, TAsmEdit:__Invalidate, scrollY

.finish:
        popad
        return

.not_found:
        or      eax, edx
        jz      .finish

        xor     ecx, ecx
        dec     ecx
        xor     eax, eax
        xor     edx, edx
        jmp     .search
endp


method TAsmEdit.SearchPrev
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TAsmEdit._search_index]
        test    edi, edi
        jz      .finish

; sort selection first

        mov     eax, [esi+TAsmEdit._selStart.y]
        cmp     eax, [esi+TAsmEdit._selEnd.y]
        jne     .do_search

        cmp     eax, [esi+TAsmEdit._caretPos.y]
        jne     .do_search

        mov     eax, [esi+TAsmEdit._selStart.x]
        mov     edx, [esi+TAsmEdit._selEnd.x]

        cmp     eax, [esi+TAsmEdit._caretPos.x]
        je      .sort
        cmp     edx, [esi+TAsmEdit._caretPos.x]
        jne     .do_search
.sort:
        cmp     eax, edx
        cmova   eax, edx

        set     esi, TAsmEdit:CaretX, eax

.do_search:
        get     eax, esi, TAsmEdit:CaretY
        get     edx, esi, TAsmEdit:CaretX

        mov     ecx, [edi+TArray.count]

.search:
        dec     ecx
        js      .not_found

        cmp     eax, [edi+TArray.array+8*ecx+POINT.y]
        jl      .search
        jg      .found

        cmp     edx, [edi+TArray.array+8*ecx+POINT.x]
        jle     .search

.found:
        set     esi, TAsmEdit:CaretY, [edi+TArray.array+8*ecx+POINT.y]

        stdcall StrLenUtf8, [esi+TAsmEdit._search_str]
        add     eax, [edi+TArray.array+8*ecx+POINT.x]
        set     esi, TAsmEdit:CaretX, eax
        exec    esi, TAsmEdit:SelStartHere

        set     esi, TAsmEdit:CaretX, [edi+TArray.array+8*ecx+POINT.x]
        exec    esi, TAsmEdit:SelEndHere

        exec    esi, TAsmEdit:CenterCaretY, [edi+TArray.array+8*ecx+POINT.y]
        exec    esi, TAsmEdit:ScrollToCaretX

        exec    esi, TAsmEdit:__ClearScrollbar, scrollY
        exec    esi, TAsmEdit:__DrawScrollbar, scrollY
        exec    esi, TAsmEdit:__Invalidate, scrollY

.finish:
        popad
        return

.not_found:
        or      eax, edx
        cmp     eax, -1
        je      .finish

        mov     ecx, [edi+TArray.count]
        mov     eax, [edi+TArray.array+8*ecx-8+POINT.y]
        inc     eax
        xor     edx, edx
        jmp     .search
endp





method TAsmEdit.ToggleBookmark
begin
        pushad

        mov     esi, [.self]

        exec    esi, TAsmEdit:TextLine, -1, FALSE
        jc      .finish

        mov     eax, [eax]
        xor     [eax+TTextLine.flags], tlfBookmark

        
        xor     eax, eax
        xchg    eax, [esi+TAsmEdit._img_margin_valid]
        exec    esi, TWindow:RectChangedXY2, 0, 0, [esi+TAsmEdit._left_margin], [esi+TAsmEdit._height]

.finish:
        popad
        return
endp


method TAsmEdit.GoPrevBookmark
begin
        pushad

        get     ebx, [.self], TAsmEdit:CaretY

.loop:
        dec     ebx
        js      .finish

        exec    [.self], TAsmEdit:TextLine, ebx, FALSE
        jc      .finish

        mov     eax, [eax]
        test    [eax+TTextLine.flags], tlfBookmark
        jz      .loop

        set     [.self], TAsmEdit:CaretY, ebx
        exec    [.self], TAsmEdit:CenterCaretY
        exec    [.self], TAsmEdit:UpdateCaretPos

.finish:
        popad
        return
endp



method TAsmEdit.GoNextBookmark
begin
        pushad

        get     ebx, [.self], TAsmEdit:CaretY

.loop:
        inc     ebx

        exec    [.self], TAsmEdit:TextLine, ebx, FALSE
        jc      .finish

        mov     eax, [eax]
        test    [eax+TTextLine.flags], tlfBookmark
        jz      .loop

        set     [.self], TAsmEdit:CaretY, ebx
        exec    [.self], TAsmEdit:CenterCaretY
        exec    [.self], TAsmEdit:UpdateCaretPos

.finish:
        popad
        return
endp



method TAsmEdit.ClearBookmarks
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TAsmEdit._lines]
        xor     ebx, ebx

.loop:
        cmp     ebx, [edi+TText.GapBegin]
        jb      .ofs_ok
        cmp     ebx, [edi+TText.GapEnd]
        jae     .ofs_ok

        add     ebx, [edi+TText.GapEnd]
        sub     ebx, [edi+TText.GapBegin]

.ofs_ok:
        cmp     ebx, [edi+TText.Length]
        jae     .end_loop

        mov     eax, [edi+ebx]
        and     [eax+TTextLine.flags], not tlfBookmark

        add     ebx, 4
        jmp     .loop

.end_loop:

        and     [esi+TAsmEdit._img_margin_valid], 0
        exec    esi, TWindow:RectChangedXY2, 0, 0, [esi+TAsmEdit._left_margin], [esi+TAsmEdit._height]

        popad
        return
endp



method TAsmEdit.IndentSelection
begin
        exec    [.self], TAsmEdit:SelectionPrefix, selprInsert, ' '
        return
endp




method TAsmEdit.OutdentSelection
begin
        exec    [.self], TAsmEdit:SelectionPrefix, selprRemove, ' '
        return
endp



method TAsmEdit.CommentSelection
begin
        exec    [.self], TAsmEdit:SelectionPrefix, selprInsert, ';'
        return
endp


method TAsmEdit.UncommentSelection
begin
        exec    [.self], TAsmEdit:SelectionPrefix, selprRemove, ';'
        return
endp


endmodule


include "themes/asmedit.asm"
include "syntax/SyntaxFASM.asm"

Added freshlib/gui/TBackWindow.asm.























































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TBackWindow object class
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: TBackWindow is a window that have TBackBuffer object associated and all drawing
;         happens in the back buffer. This way the repainting events are processed
;         flicker free on all supported OSes.
;_________________________________________________________________________________________
module "TBackWindow library"


object TBackWindow, TWindow
; private fields
  ._pShadow      dd  ?      ; pointer to TBackBuffer
  ._fShadowReady dd ?

; parameters
  param .pShadow, ._pShadow, .SetShadow

; methods
  method   .Destroy
  method   .SetShadow, .value

  method   .SysEventHandler, .pEvent

  abstract ._RedrawShadow  ; abstract method to be implemented in descending classes.
endobj


;_________________________________________________________________________________________


method TBackWindow.Destroy
begin
        set     [.self], TBackWindow:pShadow, 0
        return
endp


;_________________________________________________________________________________________


method TBackWindow.SetShadow
begin
        push    eax esi

        mov     esi, [.self]
        mov     eax, [.value]
        xchg    eax, [esi+TBackWindow._pShadow]
        cmp     eax, [esi+TBackWindow._pShadow]
        je      .finish

        test    eax, eax
        jz      .finish

        stdcall DestroyBackBuffer, eax

.finish:
        mov     [esi+TBackWindow._fShadowReady], 0
        pop     esi eax
        return
endp


;_________________________________________________________________________________________


method TBackWindow.SysEventHandler
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [.pEvent]

        cmp     [ebx+TSysEvent.event], sePaint
        je      .paint

        cmp     [ebx+TSysEvent.event], seResize
        je      .resize

        inherited [.pEvent]

.continue:
        popad
        return

;.........................................................................................
.resize:
;        DebugMsg "Window resized!"
;        OutputValue " width=", [ebx+TMoveResizeEvent.newWidth], 10, -1
;        OutputValue "height=", [ebx+TMoveResizeEvent.newHeight], 10, -1

        mov     [esi+TBackWindow._fShadowReady], 0
        jmp     .continue

;.........................................................................................

.paint:
locals
  .clip_bounds TBounds
endl
        stdcall SetClipRectangle, [ebx+TPaintEvent.context], 0

        get     edi, esi, TBackWindow:pShadow

        get     ecx, esi, TBackWindow:height
        get     eax, esi, TBackWindow:width

        test    edi, edi
        jz      .create_new_shadow

        cmp     eax, [edi+TBackBuffer.width]
        ja      .create_new_shadow

        cmp     ecx, [edi+TBackBuffer.height]
        ja      .create_new_shadow

        shl     eax, 1
        shl     ecx, 1
        add     eax, 100
        add     ecx, 100

        cmp     eax, [edi+TBackBuffer.width]
        ja      .shadow_size_ok
        cmp     ecx, [edi+TBackBuffer.height]
        ja      .shadow_size_ok

        sub     eax, 100
        sub     ecx, 100
        shr     eax, 1
        shr     ecx, 1

.create_new_shadow:
        cmp     [esi+TBackWindow.handle], 0
        je      .end_paint

        lea     eax, [3*eax]
        lea     ecx, [3*ecx]
        sar     eax, 1
        sar     ecx, 1
        add     eax, 100
        add     ecx, 100

;        DebugMsg "Back buffer created."
;        OutputValue " width=", eax, 10, -1
;        OutputValue "height=", ecx, 10, -1

        stdcall CreateBackBuffer, [esi+TBackWindow.handle], eax, ecx
        jc      .end_paint

        set     esi, TBackWindow:pShadow, eax
        jmp     .draw

.shadow_size_ok:
        cmp     [esi+TBackWindow._fShadowReady], FALSE
        jne     .shadowok

.draw:
;        stdcall Get, esi, TWindow.FreeArea

        exec    esi, TBackWindow:_RedrawShadow
        mov     [esi+TBackWindow._fShadowReady], TRUE

;        DebugMsg "Back buffer repainted."

.shadowok:
        lea     eax, [.clip_bounds]
        lea     ecx, [ebx+TPaintEvent.rect]
        stdcall RectToBounds, eax, ecx
        stdcall SetClipRectangle, [ebx+TPaintEvent.context], eax
        stdcall DrawBackBuffer, [ebx+TPaintEvent.context], [esi+TBackWindow._pShadow], 0, 0

        inc     [esi+TWindow.___counter]        ; debug code

;        DebugMsg "Window painted."
;        OutputValue "     X=", [.clip_bounds.x], 10, -1
;        OutputValue "     Y=", [.clip_bounds.y], 10, -1
;        OutputValue " width=", [.clip_bounds.width], 10, -1
;        OutputValue "height=", [.clip_bounds.height], 10, -1


.end_paint:
        clc
        popad
        return

endp


;_________________________________________________________________________________________





endmodule

Added freshlib/gui/TButton.asm.





































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TButton object class
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Represents GUI button.
;_________________________________________________________________________________________
module "TButton library"


; Button states for the field TButton._state; The height of TButton._canvas = btnStateCount * TButton._height

bsNeutral    = 0
bsHovered    = 1
bsPressed    = 2
bsDisabled   = 3
btnStateCount = 4

; icon positions

iposLeft   = 0
iposRight  = 1
iposTop    = 2
iposBottom = 3
iposCenter = 4


object TButton, TWindow

; private fields

  ._state        dd ?      ; internal state variable.

  ._textalign    dd ?
  ._icon         dd ?
  ._iconpos      dd ?

  ._OnClick      dd ?

  ._ModalResult  dd ?

  ._canvas       dd ?
  ._canvas_valid dd ?

; parameters

  param .OnClick, ._OnClick, ._OnClick

  param .TextAlign,    ._textalign,  .SimpleSetParam:3
  param .Icon,         ._icon,       .SetIcon
  param .IconPosition, ._iconpos,    .SimpleSetParam:3

  param .State,        .GetState,    ._state

  param .ModalResult, ._ModalResult, ._ModalResult

; methods

  ; parameters handling methods

  method .GetState

  method .SetIcon, .value
  method .SimpleSetParam, .param, .get, .value

  ; system events methods

  method .Create, .Parent
  method .Destroy
  method .ForceRefresh

  method ._RenderView
  method .UpdateAction, .action

  method .SelfPaint, .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height
  method .Resize, .newWidth, .newHeight
  method .SetCaption, .value

  method .EventFocusIn
  method .EventFocusOut

  method .EventMouseEnter
  method .EventMouseLeave
  method .EventMouseMove, .x, .y, .kbdState

  method .EventButtonPress, .button, .kbdState, .x, .y
  method .EventButtonRelease, .button, .kbdState, .x, .y

  method .EventKeyPress, .utf8, .scancode, .kbdState
  method .EventKeyRelease, .utf8, .scancode, .kbdState

endobj


interface TButton.OnClick, .self, .button


; new

method TButton.Create
begin
        inherited [.Parent]

        mov     eax, [.self]
        mov     [eax+TButton._cursor], mcHand
        set     eax, TButton:WantFocus, TRUE

        return
endp


method TButton.Destroy
begin
        push    ebx
        mov     ebx, [.self]
        stdcall DestroyImage, [ebx+TButton._canvas]
        stdcall DestroyImage, [ebx+TButton._icon]
        pop     ebx
        inherited
        return
endp



method TButton.ForceRefresh
begin
        mov     eax, [.self]
        and     [eax+TButton._canvas_valid], 0
        inherited
        return
endp


method TButton.SelfPaint
begin
        pushad
        mov     esi, [.self]

        cmp     [esi+TButton._canvas_valid], 0
        jne     @f
        exec    esi, TButton:_RenderView
@@:
        mov     ebx, [esi+TButton._canvas]
        test    ebx, ebx
        jz      .finish

        get     edx, esi, TButton:State
        imul    edx, [esi+TButton._height]
        add     edx, [.ySrc]

        stdcall BlendImage, [.pDstImage], [.xDst], [.yDst], ebx, [.xSrc], edx, [.width], [.height]

.finish:
        popad
        inherited [.pDstImage], [.xDst], [.yDst], [.xSrc], [.ySrc], [.width], [.height]
        return
endp



method TButton.Resize ; .newWidth, .newHeight
begin
        inherited [.newWidth], [.newHeight]
        pushad

        mov     esi, [.self]
        mov     ecx, [.newWidth]
        mov     edx, [.newHeight]
        shl     edx, 2

        mov     ebx, [esi+TButton._canvas]
        test    ebx, ebx
        jz      .create_new

        cmp     ecx, [ebx+TImage.width]
        jg      .destroy

        cmp     edx, [ebx+TImage.height]
        jle     .size_ok

.destroy:
        stdcall DestroyImage, ebx
        and     [esi+TButton._canvas], 0

.create_new:
        test    ecx, ecx
        jz      .size_ok

        test    edx, edx
        jz      .size_ok

        stdcall CreateImage2, ecx, edx, FALSE
        mov     [esi+TButton._canvas], eax

.size_ok:
        and     [esi+TButton._canvas_valid], 0
        exec    esi, TButton:RectChanged2, 0
        popad
        return
endp




method TButton.GetState
begin
        pushad

        mov     esi, [.self]
        get     edi, esi, TButton:Action
        test    edi, edi
        cmovz   ecx, [esi+TButton._enabled]
        jz      .test_en

        get     ecx, edi, TAction:Enabled

.test_en:
        mov     eax, bsDisabled
        test    ecx, ecx
        cmovnz  eax, [esi+TButton._state]

        mov     [esp+4*regEAX], eax
        popad
        return
endp



method TButton.SetCaption       ;, .value
begin
        inherited [.value]

        push    eax
        mov     eax, [.self]
        and     [eax+TButton._canvas_valid], 0
        pop     eax
        exec    [.self], TButton:RectChanged2, 0
        return
endp



method TButton.SetIcon;, .value
begin
        pushad

        mov     esi, [.self]
        mov     eax, [esi+TButton._icon]
        test    eax, eax
        jz      .load_new

        stdcall DestroyImage, eax
        xor     eax, eax

.load_new:

        cmp     [.value], 0
        je      @f

        stdcall CreateImagePNG, [.value], -1

@@:
        mov     [esi+TButton._icon], eax

        and     [esi+TButton._canvas_valid], 0
        exec    esi, TButton:RectChanged2, 0

        popad
        return
endp



method TButton.UpdateAction
begin
        exec    [.self], TButton:_RenderView
        exec    [.self], TWindow:RectChanged2, 0
        return
endp




method TButton._RenderView

 .bounds TBounds
 .client TBounds

 .clTxt dd ?
 .canvas dd ?

 .caption dd ?
 .enabled dd ?
 .icon    dd ?
 .icon_x  dd ?
 .icon_y  dd ?

begin
        pushad

        mov     esi, [.self]
        mov     eax, [esi+TButton._canvas]
        test    eax, eax
        jz      .finish

        mov     [.canvas], eax

        get     edx, esi, TButton:Action
        test    edx, edx
        jz      .get_normal

        get     [.caption], edx, TAction:Caption
        get     [.icon],    edx, TAction:Icon
        jmp     .render_states

.get_normal:

        get     [.caption], esi, TButton:Caption
        get     [.icon], esi, TButton:Icon

.render_states:

        xor     eax, eax        ; Y coordinate
        mov     ecx, [esi+TButton._width]
        mov     edx, [esi+TButton._height]

        mov     [.icon_x], eax
        mov     [.icon_y], eax

        mov     [.bounds.x], eax
        mov     [.client.x], eax
        mov     [.bounds.y], eax
        mov     [.client.y], eax
        mov     [.bounds.width], ecx
        mov     [.client.width], ecx
        mov     [.bounds.height], edx
        mov     [.client.height], edx

        mov     ebx, [GUI.btnMarginX]
        mov     edx, [GUI.btnMarginY]

        add     [.bounds.x], ebx
        add     [.bounds.y], edx
        sub     [.bounds.width], ebx
        sub     [.bounds.height], edx
        sub     [.bounds.width], ebx
        sub     [.bounds.height], edx

        mov     edi, [.icon]
        test    edi, edi
        jz      .icon_pos_ok

        mov     eax, [.bounds.width]
        sub     eax, [edi+TImage.width]
        sar     eax, 1
        add     eax, [.bounds.x]                ; x coordinate of the icon.

        mov     ecx, [.bounds.height]
        sub     ecx, [edi+TImage.height]
        sar     ecx, 1
        add     ecx, [.bounds.y]                ; y coordinate of the icon.

        cmp     [esi+TButton._iconpos], iposCenter
        je      .icon_pos_store

        cmp     [esi+TButton._iconpos], iposLeft
        jne     @f

; align left
        mov     eax, [.bounds.x]

        add     ebx, [edi+TImage.width]
        add     [.bounds.x], ebx
        sub     [.bounds.width], ebx
        jmp     .icon_pos_store

@@:
        cmp     [esi+TButton._iconpos], iposRight
        jne     @f

; align right
        mov     eax, [.bounds.x]
        add     eax, [.bounds.width]
        sub     eax, [edi+TImage.width]

        add     ebx, [edi+TImage.width]
        sub     [.bounds.width], ebx
        jmp     .icon_pos_store

@@:
        cmp     [esi+TButton._iconpos], iposTop
        jne     @f

; align top
        mov     ecx, [.bounds.y]
        add     edx, [edi+TImage.height]

        add     [.bounds.y], edx
        sub     [.bounds.height], edx
        jmp     .icon_pos_store

@@:
        cmp     [esi+TButton._iconpos], iposBottom
        jne     .icon_pos_ok

; align bottom
        mov     ecx, [.bounds.y]
        add     ecx, [.bounds.height]
        sub     ecx, [edi+TImage.height]

        add     edx, [edi+TImage.height]
        sub     [.bounds.height], edx

.icon_pos_store:

        mov     [.icon_x], eax
        mov     [.icon_y], ecx

.icon_pos_ok:

        xor     ebx, ebx        ; 0 == bsNeutral

.loop_y:

; draw the border and the background

        lea     eax, [.client]
        stdcall [DrawBox], [.canvas], eax, [GUI.clBtnBk+4*ebx], [GUI.btnBorder+4*ebx], [GUI.boxBorderWidth]

; draw the icon

        mov     edi, [.icon]
        test    edi, edi
        jz      .draw_text

        mov     ecx, [.icon_y]
        mov     eax, [.icon_x]
        add     ecx, [.client.y]

        cmp     ebx, bsPressed
        jne     .blend_icon

        add     eax, [GUI.btnPressedOfsX]
        add     ecx, [GUI.btnPressedOfsY]

.blend_icon:
        xor     edx, edx
        stdcall BlendImage, [.canvas], eax, ecx, edi, edx, edx, [edi+TImage.width], [edi+TImage.height]

.draw_text:

        get     edi, esi, TButton:TextAlign
        cmp     [.caption], 0
        je      .textok

        test    edi, dtfNone
        jnz     .textok

        mov     eax, [.bounds.x]
        mov     ecx, [.bounds.y]

        cmp     ebx, bsPressed
        jne     @f
        add     eax, [GUI.btnPressedOfsX]
        add     ecx, [GUI.btnPressedOfsY]
@@:

        stdcall DrawTextBox, [.canvas], [.caption], eax, ecx, [.bounds.width], [.bounds.height], 2, edi, [GUI.DefaultFont], [GUI.clBtnTxt+4*ebx]

.textok:
        cmp     esi, [__FocusedWindow]
        jne     .focus_ok

        mov     eax, [.client.y]
        add     eax, [.client.height]
        sub     eax, 2
        stdcall DrawSolidRect, [.canvas], 0, eax, [esi+TButton._width], 2, [GUI.clBorderFocused]

.focus_ok:

        get     eax, esi, TWindow:height
        add     [.bounds.y], eax
        add     [.client.y], eax

        inc     ebx
        cmp     ebx, bsDisabled
        jbe     .loop_y

.finish:
        stdcall StrDel, [.caption]
        inc     [esi+TButton._canvas_valid]
        popad
        return
endp





method TButton.SimpleSetParam
begin
        push eax esi edi

        mov     esi, [.self]
        mov     edi, esi
        add     esi, [.get]

        mov     eax, [.value]
        cmp     eax, [esi]
        je      .finish

        mov     [esi], eax
        cmp     [.param], 0
        je      @f
        and     [edi+TButton._canvas_valid], 0
@@:
        exec    edi, TButton:RectChanged2, 0

.finish:
        pop     edi esi eax
        return
endp



method TButton.EventFocusIn
begin
        push    eax
        mov     eax, [.self]
        and     [eax+TButton._canvas_valid], 0
        exec    eax, TWindow:RectChanged2, 0
        pop     eax
        inherited
        return
endp


method TButton.EventFocusOut
begin
        push    eax
        mov     eax, [.self]
        and     [eax+TButton._canvas_valid], 0
        exec    eax, TWindow:RectChanged2, 0
        pop     eax
        inherited
        return
endp



method TButton.EventMouseEnter
begin
        exec    [.self], TButton:SimpleSetParam, 0, TButton._state, bsHovered
        inherited
        return
endp


method TButton.EventMouseLeave
begin
        exec    [.self], TButton:SimpleSetParam, 0, TButton._state, bsNeutral
        inherited
        return
endp


method TButton.EventMouseMove
begin
;        exec    [.self], TButton:SimpleSetParam, 0, TButton._state, bsHovered
        inherited [.x], [.y], [.kbdState]
        return
endp


method TButton.EventButtonPress
begin
        exec    [.self], TButton:SimpleSetParam, 0, TButton._state, bsPressed
        return
endp



method TButton.EventButtonRelease
begin
        pushad

        mov     esi, [.self]

        cmp     [esi+TButton._state], bsPressed
        jne     .finish

        cmp     [.x], -1         ; when called from the keyboard event as a mouse emulation the .x and .y parameters are both -1.
        jne     .hover

        cmp     [.y], -1
        je      .state_ok

.hover:
        exec    [.self], TButton:SimpleSetParam, 0, TButton._state, bsHovered

.state_ok:
        cmp     [esi+TButton._ModalResult], mrNone
        je      @f

        get     eax, esi, TButton:Parent

        istype  eax, TForm
        jne     @f

        set     eax, TForm:ModalResult, [esi+TButton._ModalResult]

@@:
        get     eax, esi, TButton:Menu
        test    eax, eax
        jz      .menu_ok

        exec    eax, TMenu:Show, esi, 0, 0

.menu_ok:
        get     eax, esi, TButton:OnClick
        test    eax, eax
        jz      .click_ok

        stdcall eax, esi, [.button]       ; OnClick event

.click_ok:
        get     eax, esi, TButton:Action
        test    eax, eax
        jz      .finish

        exec    eax, TAction:Execute, [.self]

.finish:
        popad
        return
endp




method TButton.EventKeyPress
begin
        inherited [.utf8], [.scancode], [.kbdState]
        jc      .finish

        cmp     [.utf8], ' '
        clc
        jne     .finish

        exec    [.self], TButton:SimpleSetParam, 0, TButton._state, bsPressed
        exec    [.self], TWindow:EventButtonRelease, mbLeft, [.kbdState], -1, -1
        stc

.finish:
        return
endp



method TButton.EventKeyRelease
begin
        exec    [.self], TButton:SimpleSetParam, 0, TButton._state, bsNeutral
        return
endp



endmodule

Added freshlib/gui/TCanvasWindow.asm.









































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
172
173
174
175
176
177
178
179
180
module "TCanvasWindow"


object TCanvasWindow, TWindow
  ._canvas        dd ?    ; TImage containing the image of the window only.
  ._canvas_valid  dd ?
  ._OnPaint       dd ?

  param .Canvas, ._canvas, NONE
  param .OnPaint, ._OnPaint, .SetOnPaint


  method .SetOnPaint, .value

  method .ForceRefresh
  method .__RenderView
  method .__UpdateImages
  method .SelfPaint, .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height    ; Paints itself on the caller provided TImage.

endobj


interface TCanvasWindow.OnPaint, .self, .pCanvas



method TCanvasWindow.ForceRefresh
begin
        mov     eax, [.self]
        and     [eax+TCanvasWindow._canvas_valid], 0
        inherited
        return
endp


method TCanvasWindow.SelfPaint       ; .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height
begin
        pushad
        mov     esi, [.self]

        cmp     [esi+TCanvasWindow._canvas_valid], 0
        jne     @f
        exec    esi, TCanvasWindow:__RenderView
@@:
        mov     ebx, [esi+TCanvasWindow._canvas]
        test    ebx, ebx
        jz      .finish

        stdcall BlendImage, [.pDstImage], [.xDst], [.yDst], ebx, [.xSrc], [.ySrc], [.width], [.height]

.finish:
        popad
        inherited [.pDstImage], [.xDst], [.yDst], [.xSrc], [.ySrc], [.width], [.height]
        return
endp




method TCanvasWindow.__UpdateImages
begin
        pushad
        mov     esi, [.self]

;        DebugMsg "TCanvasWindow update canvas."

        mov     ebx, [esi+TCanvasWindow._visible]
        mov     edi, [esi+TCanvasWindow._canvas]

        mov     ecx, [esi+TCanvasWindow._width]
        mov     edx, [esi+TCanvasWindow._height]

        test    ebx, ebx
        jz      .destroy

        test    edi, edi
        jz      .create_new

; check the size

        cmp     ecx, [edi+TImage.width]
        ja      .destroy

        cmp     edx, [edi+TImage.height]
        jbe     .setwrap

.destroy:
;        DebugMsg "Destroy old canvas."

        stdcall DestroyImage, edi                         ; canvas

        xor     eax, eax
        mov     [esi+TCanvasWindow._canvas], eax

        test    ebx, ebx
        jz      .exit


.create_new:

;        DebugMsg "Create new canvas."

; new size - get it with x1.5 reserve in order to allow easy resizing.
;        lea     ecx, [ecx*3]
;        lea     edx, [edx*3]
;        shr     ecx, 1
;        shr     edx, 1

; The above reserve is too big. Lets make it more RAM-friendly.

        lea     eax, [ecx+256]
        lea     ebx, [edx+256]

        stdcall CreateImage2, eax, ebx, FALSE
        mov     [esi+TCanvasWindow._canvas], eax
        mov     edi, eax


;        OutputValue "Canvas created: ", eax, 16, 8

.setwrap:
        mov     [edi+TImage.wrapW], ecx
        mov     [edi+TImage.wrapH], edx

.exit:
        and     [esi+TCanvasWindow._canvas_valid], 0
        popad
        inherited
        return
endp




method TCanvasWindow.__RenderView
begin
        pushad

        mov     esi, [.self]

        get     eax, esi, TCanvasWindow:OnPaint
        test    eax, eax
        jz      .user_paint_ok

        get     ecx, esi, TCanvasWindow:Canvas
        test    ecx, ecx
        jz      .user_paint_ok

        stdcall eax, esi, ecx                   ; user OnPaint handler.

.user_paint_ok:
        inc     [esi+TCanvasWindow._canvas_valid]
        popad
        return
endp



method TCanvasWindow.SetOnPaint
begin
        push    eax esi

        mov     esi, [.self]
        mov     eax, [.value]
        cmp     eax, [esi+TCanvasWindow._OnPaint]
        je      .finish

        mov     [esi+TCanvasWindow._OnPaint], eax
        exec    esi, TWindow:RectChanged2, 0

.finish:
        pop     esi eax
        return
endp

;_________________________________________________________________________________________



endmodule

Added freshlib/gui/TCheckbox.asm.









































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TCheckbox object class
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Represents GUI checkbox.
;_________________________________________________________________________________________
module "TCheckbox library"


; Button states for the field TCheckbox._state

cbsNeutral    = 0
cbsHovered    = 1
cbsPressed    = 2

cbsDisabled   = 3


object TCheckbox, TCanvasWindow

; private fields

  ._state       dd ?      ; internal state variable.

  ._OnClick     dd ?
  ._OnChange    dd ?

  ._checked     dd ?
  ._value       dd ?

; parameters

  param .Checked, .GetChecked, .SetChecked
  param .Value, .GetValue, ._value

  param .OnClick, ._OnClick, ._OnClick
  param .OnChange, ._OnChange, ._OnChange

; methods

  ; parameters handling methods

  method .GetChecked
  method .SetChecked, .value
  method .GetValue

  ; system events methods

  method .Create, .Parent

  method .Autosize

  method .__RenderView
  method .UpdateAction, .action

  method .EventMouseEnter
  method .EventMouseLeave

  method .EventButtonPress, .button, .kbdState, .x, .y
  method .EventButtonRelease, .button, .kbdState, .x, .y

  method .EventKeyPress, .utf8, .scancode, .kbdState
  method .EventKeyRelease, .utf8, .scancode, .kbdState

  method .EventFocusIn
  method .EventFocusOut

endobj


; new


method TCheckbox.Create
begin
        inherited [.Parent]

        set     [.self], TCheckbox:Enabled, TRUE
        set     [.self], TCheckbox:Cursor, mcHand
        set     [.self], TCheckbox:WantFocus, TRUE
        return
endp


method TCheckbox.Autosize
begin
        mov     edx, [GUI.cbIconSize]

        get     eax, [.self], TCheckbox:Caption
        test    eax, eax
        cmovz   eax, [GUI.cbIconSize]
        jz      .finish

        push    eax

        stdcall StrPtr, eax

        stdcall GetTextBounds, eax, [eax+string.len], [GUI.DefaultFont]

        stdcall StrDel ; from the stack

        add     eax, [GUI.cbIconSize]
        add     eax, [GUI.cbMargin]

        cmp     edx, [GUI.cbIconSize]
        cmovl   edx, [GUI.cbIconSize]

.finish:
        return
endp



method TCheckbox.EventFocusIn
begin
        push    eax
        mov     eax, [.self]
        and     [eax+TCheckbox._canvas_valid], 0
        exec    eax, TWindow:RectChanged2, 0
        pop     eax
        inherited
        return
endp


method TCheckbox.EventFocusOut
begin
        push    eax
        mov     eax, [.self]
        and     [eax+TCheckbox._canvas_valid], 0
        exec    eax, TWindow:RectChanged2, 0
        pop     eax
        inherited
        return
endp



method TCheckbox.__RenderView

 .bounds TBounds
 .canvas dd ?

 .caption dd ?
 .enabled dd ?
 .checked dd ?

begin
        pushad

        mov     esi, [.self]

        get     edx, esi, TCheckbox:Action
        test    edx, edx
        jz      .get_normal

        get     eax, edx, TAction:Caption

        stdcall StrDup, eax
        mov     [.caption], eax

        get     [.checked], edx, TAction:Checked
        jmp     .get_enabled

.get_normal:

        get     [.caption], esi, TCheckbox:Caption
        get     [.checked], esi, TCheckbox:Checked


.get_enabled:
        get     [.enabled], esi, TCheckbox:Enabled

.paint_it:
        get     eax, esi, TCanvasWindow:Canvas
        mov     [.canvas], eax

        test    eax, eax
        jz      .finish


        mov     eax, [esi+TCheckbox._state]
        cmp     [.enabled], 0
        jne     .state_ok

        mov     eax, cbsDisabled

.state_ok:
        mov     edi, [GUI.clCheckboxBack+4*eax]    ; background color

        get     ecx, esi, TCheckbox:height
        mov     edx, [GUI.cbIconSize]
        sub     ecx, edx
        sar     ecx, 1

        mov     [.bounds.x], 0
        mov     [.bounds.y], ecx
        mov     [.bounds.width], edx
        mov     [.bounds.height], edx

        stdcall DrawSolidRect, [.canvas], 0, 0, [esi+TCheckbox._width], [esi+TCheckbox._height], [GUI.clDialogBk]

        lea     eax, [.bounds]

        mov     ebx, [GUI.borderCheckbox]
        cmp     [.enabled], 0
        jne     .border_ok

        or      ebx, bxDisabled

.border_ok:
        stdcall [DrawBox], [.canvas], eax, edi, ebx, [GUI.boxBorderWidth]

        mov     [.bounds.x], 0
        mov     [.bounds.y], ecx
        mov     [.bounds.width], edx
        mov     [.bounds.height], edx

; first draw the icon and then resize bounds for the text.

        cmp     [.checked], 0
        je      .icon_ok

        mov     eax, [GUI.iconCheckedGray]
        cmp     [.enabled], 0
        je      .draw_icon

        mov     eax, [GUI.iconChecked]

.draw_icon:

        stdcall BlendImage, [.canvas], [.bounds.x], [.bounds.y], eax, 0, 0, [eax+TImage.width], [eax+TImage.height]

.icon_ok:
        mov     ecx, [.bounds.width]
        mov     edx, [esi+TCheckbox._width]
        mov     ebx, [esi+TCheckbox._height]

        add     ecx, [GUI.cbMargin]
        sub     edx, ecx

        mov     eax, [.caption]
        test    eax, eax
        jz      .textok

        mov     edi, [GUI.clCheckboxTxt]
        cmp     [.enabled], 0
        jne     .txt_color_ok

        mov     edi, [GUI.clCheckboxTxtGray]

.txt_color_ok:
        stdcall DrawTextBox, [.canvas], eax, ecx, 0, edx, ebx, 0, dtfAlignLeft or dtfAlignMiddle, [GUI.DefaultFont], edi
        stdcall StrDel, eax

.textok:
        cmp     esi, [__FocusedWindow]
        jne     .not_focused

        mov     eax, [.bounds.y]
        add     eax, 15
        stdcall DrawSolidRect, [.canvas], 0, eax, 13, 2, [GUI.clBorderFocused]

.not_focused:
.finish:

        inherited

        popad
        return
endp


method TCheckbox.UpdateAction
begin
        exec    [.self], TWindow:RectChanged2, 0
        return
endp



method TCheckbox.EventMouseEnter
begin
        mov     eax, [.self]
        mov     [eax+TCheckbox._state], cbsHovered
        exec    eax, TCheckbox:RectChanged2, 0

        inherited
        return
endp




method TCheckbox.EventMouseLeave
begin
        mov     eax, [.self]

        mov     [eax+TCheckbox._state], cbsNeutral
        exec    eax, TCheckbox:ForceRefresh

        inherited
        return
endp




method TCheckbox.EventButtonPress
begin
        push    eax

        mov     eax, [.self]
        mov     [eax+TCheckbox._state], cbsPressed

        get     eax, [.self], TCheckbox:Checked
        xor     eax, 1
        set     [.self], TCheckbox:Checked, eax

        get     eax, [.self], TCheckbox:OnClick
        test    eax, eax
        jz      .finish

        stdcall eax, [.self], [.button]

.finish:
        exec    [.self], TCheckbox:ForceRefresh
        pop     eax
        return
endp



method TCheckbox.EventButtonRelease
begin
        pushad

        mov     esi, [.self]
        mov     [esi+TCheckbox._state], cbsHovered
        exec    esi, TCheckbox:ForceRefresh

        popad
        return
endp




method TCheckbox.EventKeyPress
begin
        inherited [.utf8], [.scancode], [.kbdState]
        jc        .exit

        cmp     [.utf8], ' '
        clc
        jne     .exit

        push    ecx
        mov     ecx, [.self]

        cmp     [ecx+TCheckbox._state], cbsPressed
        je      .processed

        exec    ecx, TWindow:EventButtonPress, mbLeft, [.kbdState], 0, 0

        mov     [ecx+TCheckbox._state], cbsPressed
        exec    ecx, TCheckbox:ForceRefresh

.processed:
        stc
        pop     ecx

.exit:
        return
endp




method TCheckbox.EventKeyRelease
begin
        push    ecx
        mov     ecx, [.self]
        mov     [ecx+TCheckbox._state], cbsNeutral
        exec    ecx, TCheckbox:ForceRefresh
        pop     ecx
        return
endp



method TCheckbox.GetChecked
begin
        push    ecx edx

        mov     edx, [.self]
        mov     ecx, [edx+TCheckbox.__action]
        jecxz   .native

        get     eax, ecx, TAction:Checked
        jmp     .finish

.native:
        mov     eax, [edx+TCheckbox._checked]

.finish:
        pop     edx ecx
        return
endp



method TCheckbox.SetChecked
begin
        pushad

        mov     ecx, [.self]
        mov     eax, [.value]

        get     edx, ecx, TCheckbox:Checked

        cmp     eax, edx
        je      .finish

        cmp     [ecx+TCheckbox.__action], 0
        je      .action_ok

        set     [ecx+TCheckbox.__action], TAction:Checked, eax

.action_ok:
        mov     [ecx+TCheckbox._checked], eax
        exec    ecx, TCheckbox:ForceRefresh

        cmp     [ecx+TCheckbox._OnChange], 0
        je      .finish

        stdcall [ecx+TCheckbox._OnChange], ecx  ; MUST BE IMMEDIATELY BEFORE THE EXIT

.finish:
        popad
        return
endp



method TCheckbox.GetValue
begin
        get     eax, [.self], TCheckbox:Checked
        test    eax, eax
        jz      .finish

        mov     eax, [.self]
        mov     eax, [eax+TCheckbox._value]

.finish:
        return
endp



endmodule

Added freshlib/gui/TColorSample.asm.























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TColorSample object class
;
;  Target OS: Any
;
;  Dependencies: TCanvasWindow
;
;  Notes: Represents GUI window that displays assigned color on a chessboard background.
;_________________________________________________________________________________________
module "TColorSample library"


object TColorSample, TCanvasWindow
  ._color dd ?
  ._prev  dd ?

  param .Color, ._color, .SetColor

  method .SetColor, .value
  method .__RenderView
endobj




method TColorSample.SetColor
begin
        push    eax ecx edx

        mov     edx, [.self]
        mov     eax, [.value]

        xchg    eax, [edx+TColorSample._color]
        cmp     eax, [edx+TColorSample._color]
        je      .finish

        exec    edx, TColorSample:__RenderView
        exec    edx, TColorSample:RectChanged2, 0

.finish:
        pop     edx ecx eax
        return
endp



method TColorSample.__RenderView
.border TBounds
begin
        pushad

        mov     esi, [.self]
        get     ebx, esi, TColorSample:Canvas

        xor     eax, eax
        mov     ecx, [esi+TColorSample._width]
        mov     edx, [esi+TColorSample._height]
        mov     [.border.x], eax
        mov     [.border.y], eax
        mov     [.border.width], ecx
        mov     [.border.height], edx

        stdcall BlendImageTileWrap, ebx, eax, eax, ecx, edx, [GUI.bgChessboard]
        stdcall BlendSolidRect, ebx, eax, eax, ecx, edx, [esi+TColorSample._color]

        popad
        inherited
        return
endp

endmodule

Added freshlib/gui/TEdit.asm.





























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TEdit object class
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Represents single line edit control.
;_________________________________________________________________________________________
module "TEdit library"


object TEdit, TCanvasWindow
  ._Text  dd ?
  ._Len   dd ?  ; the length of the string in characters. (UTF-8)
  ._Start dd ?  ; Where the string begins to be displayed in the edit window.
  ._Pos   dd ?  ; Position of the caret in the string.
  ._Sel   dd ?  ; Position of the selection in the string.

  ._drag_mode    dd ?

  ._MarginLeft   dd ?
  ._MarginRight  dd ?

  ._OnChange     dd ?

  ._Lock         dd ?


  param .Text, .GetText, .SetText
  param .Selection, .GetSel, .ReplaceSel

  param .MarginLeft,  ._MarginLeft, ._MarginLeft
  param .MarginRight, ._MarginRight, ._MarginRight

  param .OnChange, ._OnChange, ._OnChange

  param .CaretPos, ._Pos, .SetCaretPos

; System methods

  method .Create, .parent
  method .Destroy

  method .__RenderView

; parameters get/set methods

  method .GetText

  method .GetSel
  method .ReplaceSel, .hString

  method .SetText, .value
  method .SetCaretPos, .value

; public methods

  method .HitTest, .x, .select

; system event methods

  method .UpdateCaretPos


  method .EventKeyPress, .utf8, .scancode, .kbdState
  method .EventKeyRelease, .utf8, .scancode, .kbdState

  method .EventButtonPress, .button, .kbdState, .x, .y
  method .EventMouseMove, .x, .y, .kbdState
  method .EventButtonRelease, .button, .kbdState, .x, .y

  method .EventFocusIn
  method .EventFocusOut

endobj

interface TEdit.OnChange, .self



method TEdit.Create
begin
        push    ecx eax

        inherited [.parent]

        stdcall StrNew
        mov     ecx, [.self]
        mov     [ecx+TEdit._Text], eax
        mov     [ecx+TEdit._cursor], mcText
        set     ecx, TEdit:WantFocus, TRUE

        pop     eax ecx
        return
endp




method TEdit.Destroy
begin
        mov     eax, [.self]
        stdcall StrDel, [eax+TEdit._Text]
        inherited
        return
endp





method TEdit.GetText
begin
        mov     eax, [.self]
        stdcall StrDup, [eax+TEdit._Text]
        return
endp



method TEdit.GetSel
begin
        pushad
        mov     esi, [.self]

        xor     edx, edx
        mov     ebx, [esi+TEdit._Pos]
        mov     ecx, [esi+TEdit._Sel]

        cmp     ebx, [esi+TEdit._Sel]
        je      .finish

        jl      @f
        xchg    ebx, ecx        ; ebx=beg_selection; ecx=end_selection
@@:
        stdcall StrOffsUtf8, [esi+TEdit._Text], ecx
        mov     ecx, eax

        stdcall StrOffsUtf8, [esi+TEdit._Text], ebx
        mov     ebx, eax

        stdcall StrPtr, [esi+TEdit._Text]
        sub     ebx, eax     ; begin of the selection
        sub     ecx, eax
        sub     ecx, ebx

        stdcall StrNew
        mov     edx, eax

        stdcall StrCopyPart, edx, [esi+TEdit._Text], ebx, ecx

.finish:
        mov     [esp+4*regEAX], edx
        popad
        return
endp


; returns CF=1 if there was no selection.
;         CF=0 if some text was deleted.

method TEdit.ReplaceSel ;, .hString
.beg   dd ?
.end   dd ?
begin
        pushad
        mov     esi, [.self]

        xor     edx, edx

        mov     ebx, [esi+TEdit._Pos]
        mov     ecx, [esi+TEdit._Sel]

        cmp     ebx, [esi+TEdit._Sel]
        jne     @f
        lea     edx, [edx+1]            ; ret CF=1
@@:
        jle     @f
        xchg    ebx, ecx        ; ebx=beg_selection; ecx=end_selection
@@:
        add     [esi+TEdit._Len], ebx
        sub     [esi+TEdit._Len], ecx

        stdcall StrOffsUtf8, [esi+TEdit._Text], ecx
        mov     [.end], eax

        stdcall StrOffsUtf8, [esi+TEdit._Text], ebx
        mov     [.beg], eax

        stdcall StrPtr, [esi+TEdit._Text]
        sub     [.beg], eax     ; begin of the selection
        sub     [.end], eax


        stdcall StrSplit, [esi+TEdit._Text], [.end]     ; end of the string
        mov     ecx, eax

        stdcall StrSplit, [esi+TEdit._Text], [.beg]
        stdcall StrDel, eax

        cmp     [.hString], 0
        je      .string_ok

        stdcall StrCat, [esi+TEdit._Text], [.hString]
        stdcall StrLenUtf8, [.hString], -1

        add     ebx, eax
        add     [esi+TEdit._Len], eax

.string_ok:
        mov     [esi+TEdit._Sel], ebx
        mov     [esi+TEdit._Pos], ebx

        stdcall StrCat, [esi+TEdit._Text], ecx
        stdcall StrDel, ecx

        cmp     [esi+TEdit._OnChange], 0
        je      .event_ok

        pushad
        stdcall [esi+TEdit._OnChange], esi
        popad

.event_ok:
        cmp     [esi+TEdit._Lock], 0
        jne     .refresh_ok

        and     [esi+TCanvasWindow._canvas_valid], 0
        exec    esi, TProgress:RectChanged2, 0

.refresh_ok:
        shr     edx, 1          ; CF = return value
        popad
        return
endp





method TEdit.SetText
begin
        push    esi eax
        mov     esi, [.self]

        mov     [esi+TEdit._Start], 0
        mov     [esi+TEdit._Pos], 0
        mov     [esi+TEdit._Sel], 0

        lea     eax, [esi+TEdit._Text]
        stdcall SetString, eax, [.value]

        stdcall StrLenUtf8, [esi+TEdit._Text], -1
        mov     [esi+TEdit._Len], eax

        and     [esi+TCanvasWindow._canvas_valid], 0
        exec    esi, TProgress:RectChanged2, 0
        pop     eax esi
        return
endp



method TEdit.__RenderView
 .bounds  TBounds
 .selbeg  dd ?
 .selend  dd ?

 .clBack  dd ?
 .border  dd ?

begin
        pushad

        mov     esi, [.self]
        cmp     [esi+TCanvasWindow._canvas], 0
        je      .finish

        mov     eax, [GUI.clEditBk]
        mov     ecx, [GUI.editBorder]

        cmp     esi, [__FocusedWindow]
        jne     @f
        mov     eax, [GUI.clEditBkFocused]
        mov     ecx, [GUI.editBorderFocused]
@@:
        mov     [.clBack], eax
        mov     [.border], ecx

; selection sort positions.
        mov     eax, [esi+TEdit._Pos]
        mov     ecx, [esi+TEdit._Sel]
        cmp     eax,ecx
        jle     @f
        xchg    eax, ecx
@@:
        mov     [.selbeg], eax
        mov     [.selend], ecx

; drawing bounds
        mov     ecx, [esi+TEdit._width]
        mov     eax, [esi+TEdit._height]

        mov     [.bounds.x], 0
        mov     [.bounds.y], 0
        mov     [.bounds.width], ecx
        mov     [.bounds.height], eax

        lea     eax, [.bounds]

        stdcall [DrawBox], [esi+TCanvasWindow._canvas], eax, [.clBack], [.border], [GUI.boxBorderWidth]

        mov     eax, [GUI.boxBorderWidth]
        add     [.bounds.x], eax
        add     [.bounds.y], eax
        shl     eax, 1
        sub     [.bounds.width], eax
        sub     [.bounds.height], eax

        mov     eax, [esi+TEdit._MarginLeft]
        mov     ecx, [esi+TEdit._MarginRight]
        add     [.bounds.x], eax
        sub     [.bounds.width], eax
        sub     [.bounds.width], ecx
        cmp     [.bounds.width], 0
        jle     .enddraw

        stdcall StrOffsUtf8, [esi+TEdit._Text], [esi+TEdit._Start]
        mov     edi, eax

        stdcall DrawTextBox, [esi+TEdit._canvas], edi, [.bounds.x], [.bounds.y], [.bounds.width], [.bounds.height], 0, dtfAlignLeft or dtfAlignMiddle or dtfSingleLine, [GUI.DefaultFont], [GUI.clEditTxt]

; determine the selection

        mov     eax, [.selbeg]
        xor     ecx, ecx

        sub     eax, [esi+TEdit._Start]
        jle     .xsel_ok

        stdcall StrOffsUtf8, edi, eax
        sub     eax, edi

        stdcall GetTextBounds, edi, eax, [GUI.DefaultFont]
        mov     ecx, eax

.xsel_ok:
        mov     eax, [.selend]
        sub     eax, [esi+TEdit._Start]
        jle     .enddraw

        stdcall StrOffsUtf8, edi, eax
        sub     eax, edi

        stdcall GetTextBounds, edi, eax, [GUI.DefaultFont]

        mov     edx, [.bounds.width]
        add     edx, [.bounds.x]

        cmp     eax, edx
        cmovg   eax, edx
        sub     eax, ecx

        add     ecx, [.bounds.x]
        stdcall BlendSolidRect, [esi+TCanvasWindow._canvas], ecx, [.bounds.y], eax, [.bounds.height], [GUI.clEditSel]

.enddraw:
        inherited
        inc     [esi+TCanvasWindow._canvas_valid]

.finish:
        popad
        return
endp




method TEdit.EventKeyPress      ;, .utf8, .scancode, .kbdState
begin
        inherited  [.utf8], [.scancode], [.kbdState]
        jnc        .editor_keys  ; the key was not processed by the parent class.
        return

.editor_keys:

        pushad

        mov     esi, [.self]
        mov     [esi+TEdit._Lock], 1

        get     ebx, esi, TEdit:CaretPos

        mov     eax, [.utf8]

        test    eax, eax
        jz      .no_char

        cmp     eax, $20
        jb      .ctrl_char

        cmp     eax, $7f
        je      .not_processed


        stdcall StrNew
        stdcall StrCharCat, eax, [.utf8]
        push    eax

        exec    esi, TEdit:ReplaceSel, eax

        stdcall StrDel ; from the stack

        mov     ebx, [esi+TEdit._Pos]
        jmp     .set_pos

.ctrl_char:

        OutputValue "Ascii:", eax, 10, 4

        cmp     eax, 1          ; Ctrl+A
        je      .select_all

        cmp     eax, 3          ; Ctrl+C
        je      .copy

        cmp     eax, 22         ; Ctrl+V
        je      .paste

        jmp     .no_char

.select_all:

        mov     ebx, [esi+TEdit._Len]
        mov     [esi+TEdit._Sel], 0
        jmp     .set_pos


.copy:
        DebugMsg "Copy"

        exec    esi, TEdit:GetSel
        test    eax, eax
        jz      .processed

        stdcall ClipboardWrite, eax
        stdcall StrDel, eax
        jmp     .processed

.paste:
        DebugMsg "Paste"

        stdcall ClipboardRead
        test    eax, eax
        jz      .processed

        push    eax

        exec    esi, TEdit:ReplaceSel, eax
        mov     ebx, [esi+TEdit._Pos]

        stdcall StrDel
        jmp     .endmove


.no_char:
        mov     eax, [.scancode]

        cmp     eax, keyLeftNumpad
        je      .left
        cmp     eax, keyLeft
        je      .left

        cmp     eax, keyRightNumpad
        je      .right
        cmp     eax, keyRight
        je      .right

        cmp     eax, keyHomeNumpad
        je      .home
        cmp     eax, keyHome
        je      .home

        cmp     eax, keyEndNumpad
        je      .end
        cmp     eax, keyEnd
        je      .end

        cmp     eax, keyDelNumpad
        je      .del
        cmp     eax, keyDelete
        je      .del

        cmp     eax, keyBackSpace
        je      .backdel

        jmp     .not_processed

.left:
        cmp     ebx, 0
        jle     .endmove

        dec     ebx
        jmp     .endmove

.right:
        cmp     ebx, [esi+TEdit._Len]
        jae     .endmove

        inc     ebx
        jmp     .endmove

.home:
        xor     ebx, ebx
        jmp     .endmove


.end:
        mov     ebx, [esi+TEdit._Len]
        jmp     .endmove


.backdel:
        cmp     ebx, [esi+TEdit._Sel]
        jne     .pos_ok

        test    ebx, ebx
        jz      .pos_ok                ; can't delete more than the begning

        dec     ebx
        mov     [esi+TEdit._Pos], ebx
        jmp     .pos_ok


.del:
        cmp     ebx, [esi+TEdit._Sel]
        jne     .pos_ok

        cmp     ebx, [esi+TEdit._Len]
        jae     .endmove                ; can't delete past the end.

        inc     ebx
        mov     [esi+TEdit._Pos], ebx

.pos_ok:
        exec    esi, TEdit:ReplaceSel, 0
        mov     ebx, [esi+TEdit._Pos]

.endmove:
        test    [.kbdState], maskShift
        jnz     .set_pos

        mov     [esi+TEdit._Sel], ebx

.set_pos:
        mov     [esi+TEdit._Lock], 0
        set     esi, TEdit:CaretPos, ebx

        and     [esi+TCanvasWindow._canvas_valid], 0
        exec    esi, TProgress:RectChanged2, 0

.processed:
        stc
        popad
        return

.not_processed:
        clc
        popad
        return
endp



method TEdit.EventKeyRelease  ;, .scancode, .kbdState
begin

        return
endp



method TEdit.SetCaretPos
begin
        pushad

        mov     ecx, [.self]
        mov     eax, [.value]
        mov     [ecx+TEdit._Pos], eax

        and     [ecx+TCanvasWindow._canvas_valid], 0
        exec    ecx, TEdit:RectChanged2, 0
        exec    ecx, TEdit:UpdateCaretPos

        popad
        return
endp



method TEdit.UpdateCaretPos
.refresh dd ?
begin
        pushad
        mov     esi, [.self]

        xor     eax, eax
        mov     [.refresh], eax

        mov     eax, [esi+TEdit._Pos]
        cmp     eax, [esi+TEdit._Start]
        jge     .compute_x

; scroll the text
        and     eax, $fffffff8
        mov     [esi+TEdit._Start], eax
        inc     [.refresh]

.compute_x:
        stdcall StrPtr, [esi+TEdit._Text]
        mov     edi, eax

        stdcall StrOffsUtf8, edi, [esi+TEdit._Pos]
        mov     ecx, eax

        stdcall StrOffsUtf8, edi, [esi+TEdit._Start]
        sub     ecx, eax                           ; offset to char under cursor.
        js      .finish


.leftok:
        mov     edi, eax                           ; StrOffsUtf8 returns pointer to start of the text.

        mov     eax, ecx
        jecxz   @f

        stdcall GetTextBounds, edi, ecx, [GUI.DefaultFont]

@@:
        lea     ecx, [eax-1]                       ; x coordinate of the cursor.
        add     ecx, [esi+TEdit._MarginLeft]
        add     ecx, [GUI.boxBorderWidth]

        mov     eax, [esi+TEdit._width]
        sub     eax, [esi+TEdit._MarginRight]
        sub     eax, [GUI.boxBorderWidth]

        cmp     eax, ecx
        jg      .caretok

        mov     eax, [esi+TEdit._Start]
        add     eax, 8
        cmp     eax, [esi+TEdit._Len]
        jle     @f
        mov     eax, [esi+TEdit._Len]
@@:
        mov     [esi+TEdit._Start], eax
        inc     [.refresh]
        jmp     .compute_x


.caretok:
        cmp     [.refresh], 0
        je      .canvas_ok

        and     [esi+TCanvasWindow._canvas_valid], 0

.canvas_ok:
        mov     edx, [esi+TEdit._height]
        sub     edx, 6

;        add     ecx, [GUI.boxBorderWidth]
        stdcall CaretChange, [.self], ecx, 3, 2, edx, TRUE

.finish:
        popad
        return
endp


method TEdit.EventButtonPress
begin
        inherited [.button], [.kbdState], [.x], [.y]

        push    ecx
        mov     ecx, [.self]
        mov     [ecx+TEdit._drag_mode], 1

        stdcall SetMouseCapture, ecx
        exec    [.self], TEdit:HitTest, [.x], FALSE

        pop     ecx
        return
endp


method TEdit.EventMouseMove
begin
        inherited [.x], [.y], [.kbdState]

        push    ecx
        mov     ecx, [.self]

        cmp     [ecx+TEdit._drag_mode], 0
        je      .finish

        exec    [.self], TEdit:HitTest, [.x], TRUE

.finish:
        pop     ecx
        return
endp


method TEdit.EventButtonRelease
begin
        inherited  [.button], [.kbdState], [.x], [.y]
        push    ecx

        mov     ecx, [.self]
        mov     [ecx+TEdit._drag_mode], 0
        stdcall SetMouseCapture, 0
        pop     ecx
        return
endp




method TEdit.HitTest
.target dd ?
.start  dd ?
.offset dd ?
begin
        pushad
        mov     ebx, [.self]

        mov     ecx, [.x]
        sub     ecx, [GUI.boxBorderWidth]
        sub     ecx, [ebx+TEdit._MarginLeft]

        mov     [.target], ecx

        stdcall StrPtr, [ebx+TEdit._Text]
        mov     [.start], eax

        stdcall StrOffsUtf8, [.start], [ebx+TEdit._Start]
        sub     eax, [.start]

        stdcall GetTextBounds, [.start], eax, [GUI.DefaultFont]
        mov     [.offset], eax                        ; the offset in pixels of the leftmost edge of the window.


; Binary search of the position.

        mov     edi, [ebx+TEdit._Len]     ; current
        mov     esi, [ebx+TEdit._Len]     ; upper limit
        xor     ecx, ecx                  ; lower limit

.search_loop:
        stdcall StrOffsUtf8, [ebx+TEdit._Text], edi
        sub     eax, [.start]

        stdcall GetTextBounds, [.start], eax, [GUI.DefaultFont]
        sub     eax, [.offset]

        cmp     eax, [.target]
        jg      .go_down

; go up
        cmp     edi, esi
        je      .found

        mov     ecx, edi
        add     edi, esi
        sar     edi, 1

        cmp     edi, ecx
        je      .found
        jmp     .search_loop


.go_down:
        cmp     edi, ecx
        je      .found

        mov     esi, edi
        add     edi, ecx
        sar     edi, 1

        cmp     edi, esi
        je      .found
        jmp     .search_loop


.found:
        mov     eax, [ebx+TEdit._Start]
        add     eax, edi

        cmp     [.select], 0
        jne     @f
        mov     [ebx+TEdit._Sel], edi
@@:
        set     ebx, TEdit:CaretPos, edi
        and     [ebx+TCanvasWindow._canvas_valid], 0
        exec    ebx, TProgress:RectChanged2, 0

.finish:
        popad
        return

endp





method TEdit.EventFocusIn
begin
        stdcall CaretAttach, [.self]
        exec    [.self], TEdit:UpdateCaretPos
        exec    [.self], TEdit:ForceRefresh
        inherited
        return
endp


method TEdit.EventFocusOut
begin
        stdcall CaretAttach, 0
        exec    [.self], TEdit:ForceRefresh
        inherited
        return
endp




endmodule


Added freshlib/gui/TForm.asm.



















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TForm object class
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Represents form window that to serve as parent window for other controls.
;_________________________________________________________________________________________

module "TForm library"


mrNone   = 0
mrOK     = 1
mrCancel = 2
mrAbort  = 3
mrRetry  = 4
mrIgnore = 5
mrYes    = 6
mrNo     = 7
mrMaybe  = 8


object TForm, TWindow

  ._modal_result dd ?
  ._OnClose      dd ?         ; On close window event handler.

  ._action_list  dd ?

  ._p_split_grid     dd ?
  ._p_split_template dd ?
  ._drag_splitter    dd ?

  ._padding_top      dd ?
  ._padding_right    dd ?
  ._padding_bottom   dd ?
  ._padding_left     dd ?

  ._transparent      dd ?

  .DrawSplitterProc  dd ?

  param .ActionList, ._action_list, .SetActionList

  param .Transparent, ._transparent, ._transparent      ; if the form is fully covered with controls set to TRUE in order to not paint the form background.

  param .ModalResult, ._modal_result, ._modal_result
  param .OnClose, ._OnClose, ._OnClose

  param .SplitGrid, ._p_split_grid, .SetSplitGrid
  param .PaddingLeft, ._padding_left, ._padding_left
  param .PaddingTop,  ._padding_top, ._padding_top
  param .PaddingRight, ._padding_right, ._padding_right
  param .PaddingBottom, ._padding_bottom, ._padding_bottom

  method .Create, .parent
  method .Destroy
  method .ProcessIdle

  method .__RealignSplitGrid, .newW, .newH
  method .SplitCellChanged

  method .SetActionList, .value

  method .SetSplitGrid, .value
  method .AttachControlToCell, .pWindow, .idCell

  method .EventMouseMove, .x, .y, .kbdState
  method .EventButtonPress, .button, .kbdState, .x, .y
  method .EventButtonRelease, .button, .kbdState, .x, .y

  method .ExtResize, .newWidth, .newHeight

  method .CloseRequest, .reason
  method .SelfPaint, .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height    ; Paints itself on the caller provided TImage.

endobj



;----------------------------------------------------------------------
; Interface for TForm.OnClose user handler.
; Arguments:
;   .self - pointer to the TForm object
;   .reason - the reason for the close request.
;
; Returns:
;   CF = 1 - Ignore the request. The form will not be closed.
;   CF = 0 - Destroy the object.
;
; If the OnClose event handler is not set, the form will be destroyed.
;----------------------------------------------------------------------
interface TForm.OnClose, .self, .reason


method TForm.Create
begin
        inherited [.parent]
        push    eax edx
        mov     eax, [.self]
        mov     edx, [DrawSplitter]
        mov     [eax+TForm.DrawSplitterProc], edx
        pop     edx eax
        return
endp

method TForm.Destroy
begin
        OutputValue "TForm.Destroy of $", [.self], 16, 8

        set     [.self], TForm:ActionList, 0
        set     [.self], TForm:SplitGrid, 0
        inherited
        return
endp


method TForm.ProcessIdle
begin
        pushad

        mov     esi, [.self]
        get     ebx, esi, TForm:ActionList
        test    ebx, ebx
        jz      .end_actions

        get     edx, ebx, TActionList:FirstChild

.loop:
        test    edx, edx
        jz      .end_actions

        get     eax, edx, TAction:OnIdle
        test    eax, eax
        jz      .idle_ok

        pushad
        stdcall eax, edx
        popad

.idle_ok:
        mov     edx, [edx+TObject.__next]
        jmp     .loop

.end_actions:
        popad
        return
endp



method TForm.SelfPaint
begin
        get     eax, [.self], TForm:Transparent
        test    eax, eax
        jnz     .draw_ok

        stdcall DrawSolidRect,  [.pDstImage], [.xDst], [.yDst], [.width], [.height], [GUI.clDialogBk]

.draw_ok:
        inherited [.pDstImage], [.xDst], [.yDst], [.xSrc], [.ySrc], [.width], [.height]

        pushad
        mov     esi, [.self]
        mov     eax, [esi+TForm._p_split_grid]
        test    eax, eax
        jz      .finish

        mov     ecx, [.xDst]
        mov     edx, [.yDst]
        sub     ecx, [.xSrc]
        sub     edx, [.ySrc]

        lea     eax, [eax+TArray.array]
        stdcall DrawSplitters, [.pDstImage], eax, [.xDst], [.yDst], [.width], [.height], ecx, edx, [esi+TForm.DrawSplitterProc]

.finish:
        popad
        return
endp




method TForm.ExtResize        ;, .newWidth, .newHeight
begin
        exec      [.self], TForm:__RealignSplitGrid, [.newWidth], [.newHeight]
        inherited [.newWidth], [.newHeight]
        return
endp




method TForm.CloseRequest     ;, .reason
begin
        push    eax

        DebugMsg "Form close request."

        get     eax, [.self], TForm:OnClose

        test    eax, eax
        jz      .destroy

        stdcall eax, [.self], [.reason]
        jc      .finish

.destroy:
        destroy [.self]

.finish:
        pop     eax
        return
endp



method TForm.SetActionList
begin
        pushad
        mov     esi, [.self]
        mov     edx, [.value]

        mov     edi, esi
        xor     ecx, ecx

        test    edx, edx
        jz      @f
        xchg    edi, [edx+TActionList._form]
        test    edi, edi
        jz      @f
        mov     [edi+TForm._action_list], ecx
@@:
        xchg    edx, [esi+TForm._action_list]
        test    edx, edx
        jz      @f
        mov     [edx+TActionList._form], ecx
@@:
        popad
        return
endp


; sets the splitgrid from a template.

method TForm.SetSplitGrid
begin
        pushad
        mov     esi, [.self]
        mov     edx, [.value]
        cmp     edx, [esi+TForm._p_split_template]
        je      .finish

        mov     [esi+TForm._p_split_template], edx

        xor     ecx, ecx
        xchg    ecx, [esi+TForm._p_split_grid]
        stdcall FreeMem, ecx

        test    edx, edx
        jz      .finish

        stdcall ReadSplitGridTemplate, edx
        mov     [esi+TForm._p_split_grid], eax

        exec    esi, TForm:__RealignSplitGrid, [esi+TWindow._width], [esi+TWindow._height]

.finish:
        popad
        return
endp





method TForm.AttachControlToCell;, .pWindow, .idCell
begin
        pushad
        mov     esi, [.self]
        mov     edi, [esi+TForm._p_split_grid]
        test    edi, edi
        jz      .finish

        mov     eax, [.idCell]
        cmp     eax, [edi+TArray.count]
        jae     .finish

        imul    eax, sizeof.TSplitRect
        lea     edi, [edi+TArray.array+eax]

        mov     ecx, [.pWindow]
        xchg    ecx, [edi+TSplitRect.pWindow]

        cmp     ecx, [edi+TSplitRect.pWindow]
        je      .realign

        test    ecx, ecx
        jz      .old_ok

        set     ecx, TWindow:Visible, FALSE     ; hide the previous window

.old_ok:
        cmp     [edi+TSplitRect.pWindow], 0
        je      .realign

        set     [edi+TSplitRect.pWindow], TWindow:Visible, TRUE

.realign:
        exec    esi, TForm:__RealignSplitGrid, [esi+TWindow._width], [esi+TWindow._height]

.finish:
        popad
        return
endp



method TForm.__RealignSplitGrid
.rect RECT
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [esi+TForm._p_split_grid]
        test    ebx, ebx
        jz      .finish

        lea     ebx, [ebx+TArray.array]

        mov     eax, [esi+TForm._padding_left]
        mov     edi, [esi+TForm._padding_top]
        mov     ecx, [.newW]
        mov     edx, [.newH]
        sub     ecx, [esi+TForm._padding_right]
        sub     edx, [esi+TForm._padding_bottom]

        mov     [.rect.left], eax
        mov     [.rect.top], edi
        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     eax, [.rect]
        stdcall RealignGrid, ebx, eax

.finish:
        popad
        return
endp


method TForm.SplitCellChanged
begin
        push    eax esi
        mov     esi, [.self]
        exec    esi, TForm:__RealignSplitGrid, [esi+TForm._width], [esi+TForm._height]
        pop     esi eax
        return
endp




method TForm.EventMouseMove     ;, .x, .y, .kbdState
begin
        pushad

        mov     ebx, [.self]

        mov     esi, [ebx+TForm._drag_splitter]
        test    esi, esi
        jz      .find_splitter

        mov     ecx, [esi+TSplitRect.type]
        and     ecx, stVert
        mov     eax, [.x+ecx] ; the respective coordinate.

        sub     eax, [esi+TSplitRect.rect.left+ecx]

        mov     edx, [esi+TSplitRect.spWidth]
        sar     edx, 1
        sub     eax, edx

        test    [esi+TSplitRect.type], stOriginBR
        jz      .sizeok

        mov     edx, [esi+TSplitRect.rect.right+ecx]
        sub     edx, [esi+TSplitRect.rect.left+ecx]
        sub     eax, edx
        neg     eax

        sub     eax, [esi+TSplitRect.spWidth]

.sizeok:
        test    [esi+TSplitRect.type], stRelative
        jz      .posok

        cdq
        mov     ebx, $8000
        imul    ebx

        mov     ebx, [esi+ecx+TSplitRect.rect.right]
        sub     ebx, [esi+ecx+TSplitRect.rect.left]     ; size of rect (x or y depending on type)
        sub     ebx, [esi+TSplitRect.spWidth]

        idiv    ebx

.posok:
        push    eax
        push    esi

        call    .invalidate_splitters

        pop     esi
        pop     [esi+TSplitRect.pos]
        stdcall RealignGrid, esi, esi

        call    .invalidate_splitters

.finish:
        popad
        inherited [.x], [.y], [.kbdState]
        return


.find_splitter:
        mov     edi, [ebx+TForm._p_split_grid]
        test    edi, edi
        jnz     .found

.set_default:
        mov     ecx, [ebx+TForm._cursor]
        jmp     .setit

.found:
        lea     edi, [edi+TArray.array]

        lea     eax, [.x]
        stdcall FindSplitter, edi, eax
        jnc     .set_default

        test    [eax+TSplitRect.type], stJustGap
        jnz     .finish

        mov     ecx, mcSizeH
        test    [eax+TSplitRect.type], stVert
        jz      .setit
        mov     ecx, mcSizeV

.setit:
        stdcall GetStockCursor, ecx

        get     edx, ebx, TWindow:OSWindow
        stdcall SetMouseCursor, [edx+TWindow.handle], eax
        jmp     .finish


.invalidate_splitters:

        test    [esi+TSplitRect.type], stNone
        lea     eax, [esi+TSplitRect.spRect]
        lea     esi, [esi+sizeof.TSplitRect]
        jnz     .end_spl

        exec    [.self], TForm:RectChanged2, eax
        call    .invalidate_splitters
        call    .invalidate_splitters

.end_spl:
        retn
endp



method TForm.EventButtonPress   ;, .button, .kbdState, .x, .y
  .pnt POINT
  .cliprect RECT
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [esi+TForm._p_split_grid]
        test    ebx, ebx
        jz      .finish

        lea     ebx, [ebx+TArray.array]

        mov     eax, [.x]
        mov     ecx, [.y]
        mov     [.pnt.x], eax
        mov     [.pnt.y], ecx

        lea     eax, [.pnt]
        stdcall FindSplitter, ebx, eax
        jnc     .finish

        test    [eax+TSplitRect.type], stJustGap
        jnz     .finish

        mov     [esi+TForm._drag_splitter], eax

        stdcall SetMouseCapture, esi

.finish:
        popad
        inherited [.button], [.kbdState], [.x], [.y]
        return
endp



method TForm.EventButtonRelease ;, .button, .kbdState, .x, .y
begin
        push    eax

        mov     eax, [.self]
        mov     [eax+TForm._drag_splitter], 0
        stdcall SetMouseCapture, 0

.finish:
        pop     eax
        inherited [.button], [.kbdState], [.x], [.y]
        return
endp




endmodule

Added freshlib/gui/TGrid.asm.































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TGrid object class
;
;  Target OS: Any
;
;  Dependencies:
;  Notes:
;_________________________________________________________________________________________
module "TGrid library"



object TGrid, TScrollable

; private fields

  ._canvas        dd ?    ; To be split later on 4 different canvases. One for fixed[0,0], one for fixed columns, one for the fixed rows and one for the regular cells.
                          ; this way the amount of drawing on refresh will be minimized.
  ._canvas_valid  dd ?


  ._captured dd ?

; properties
  .ColCount  dd ?
  .RowCount  dd ?
  .ColWidth  dd ?               ; default column width - every column can have different width though.
  .RowHeight dd ?               ; default row height - every row can have diferent height.

  ._FixedCols dd ?               ; count of the fixed columns [0.._FixedCols-1]
  ._FixedRows dd ?               ; count of the fixed rows [0.._FixedRows-1]
  ._flags    dd ?               ; grid flags ( dgf* flags)

  .ptrGridData dd ?             ; one pointer for the user.

  ._focused   POINT             ; coordinates of the focused cell.
  ._on_focus_change dd ?        ; event handler for focus changed.

; These 2 arrays contains respectively ColCount+1 and RowCount+1 elements.
  .ptrColX dd ?                 ; pointer to array of dwords with X coordinates of the columns.
  .ptrRowY dd ?                 ; pointer to array of dwords with Y coordinates of the rows.

  .selection RECT               ; rectangle with current selection.
  .sel_flags  dd ?              ; see gsfXXXXX constants below
  .resize_rc  dd ?              ; row or column to resize.
  .resize_ofs dd ?

; Parameters

  param    .Flags, ._flags, ._flags
  param    .FocusedX, ._focused.x, NONE
  param    .FocusedY, ._focused.y, NONE
  param    .OnFocusChange, ._on_focus_change, ._on_focus_change
  param    .FixedCols, ._FixedCols, ._FixedCols
  param    .FixedRows, ._FixedRows, ._FixedRows

; Abstract methods

  abstract .DrawCell, .canvas, .ptrRect, .Col, .Row

; Methods

  method .ForceRefresh
  method .__UpdateImages
  method .SelfPaint, .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height    ; Paints itself on the caller provided TImage.

  method .__RenderGrid
  method .__AdjustScrollbars
  method .__AdjustOneScroller, .kind, .ptrArray, .Count, .Fixed, .client, .meansize

  method .Create, .parent
  method .Destroy

  method .Resize, .newW, .newH


  method .EnsureVisible, .Col, .Row
  method .HitTest, .x, .y
  method .GetCellXY, .Col, .Row
  method .SetCounts, .ColCount, .RowCount
  method .SetColWidth, .Col, .Width
  method .SetColumnsWidth, .BegCol, .EndCol, .Width
  method .SetRowHeight, .Row, .Height
  method .SetRowsHeight, .BegRow, .EndRow, .Height

  method .SetFocused, .x, .y

; system event handlers

  method .EventMouseMove, .x, .y, .kbdState
;  method .EventMouseLeave

  method .EventButtonPress, .button, .kbdState, .x, .y
  method .EventButtonRelease, .button, .kbdState, .x, .y
  method .EventScroll, .direction, .command, .value

  method .EventKeyPress, .utf8, .scancode, .kbdState

  method .EventFocusIn
  method .EventFocusOut

endobj


fcfUnfocused = 0
fcfFocused = 1

interface TGrid.OnFocusChange, .pGrid, .x, .y, .fFocused


; TGrid features flags

; implemented
gfGridLines     = 1
gfGridLinesFixed = 2
gfResizeColumns = 4
gfResizeRows    = 8
gfRowFocus      = $10
gfSingleCellSelect = $20

; not implemented
;gfSelectRows    = $10   ; clicks on the fixed column selects entire row. Else, click column event.
;gfSelectColumns = $20   ; clicks on the fixed row selects entire column. Else, click row event.
;gfSelectCells   = $40   ; rectangle of cells can be selected. Else, only focused cell is changed or
                        ; if gfSelectRows or gfSelectColumns is set, select the respective row or column.



; grid selections flags for the field TGrid.sel_flags

gsfSelectEntireRow = 1
gsfSelectEntireCol = 2
gsfResizeColWidth = 4
gsfResizeRowHeight = 8


; cell possible states:

cellRegular  = 0
cellFixed    = 1
cellSelected = 2
cellFocused  = 3
cellFocused2 = 4


method TGrid.Create
begin
        inherited [.parent]
        push    eax esi

        mov     esi, [.self]

        stdcall GetMem, 4
        mov     [esi+TGrid.ptrColX], eax
        stdcall GetMem, 4
        mov     [esi+TGrid.ptrRowY], eax

; Default values for sizes.

        set     esi, TGrid:WantFocus, TRUE

        mov     [esi+TGrid.ColWidth], 64
        mov     [esi+TGrid.RowHeight], 20
        mov     [esi+TGrid._flags], gfResizeColumns or gfResizeRows or gfGridLinesFixed or gfGridLines   ;gfGridLinesFixed or gfGridLines or gfResizeColumns or gfResizeRows

        set     esi, TGrid:StepX, 64
        set     esi, TGrid:StepY, 20

        or      eax, -1
        mov     [esi+TGrid._focused.x], eax
        mov     [esi+TGrid._focused.y], eax
        mov     [esi+TGrid.selection.left], eax
        mov     [esi+TGrid.selection.top], eax
        mov     [esi+TGrid.selection.right], eax
        mov     [esi+TGrid.selection.bottom], eax

        exec    esi, TGrid:SetCounts, 1, 1
        pop     esi eax
        return
endp


method TGrid.Destroy
begin
        pushad
        mov     esi, [.self]
        stdcall FreeMem, [esi+TGrid.ptrColX]
        stdcall FreeMem, [esi+TGrid.ptrRowY]

        popad
        inherited
        return
endp





method TGrid.ForceRefresh
begin
        mov     eax, [.self]
        and     [eax+TGrid._canvas_valid], 0
        inherited
        return
endp



method TGrid.SelfPaint       ; .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height
begin
        pushad
        mov     esi, [.self]

        cmp     [esi+TGrid._canvas_valid], 0
        jne     @f
        exec    esi, TGrid:__RenderGrid
@@:
        mov     ebx, [esi+TGrid._canvas]
        test    ebx, ebx
        jz      .finish

        stdcall BlendImage, [.pDstImage], [.xDst], [.yDst], ebx, [.xSrc], [.ySrc], [.width], [.height]

.finish:
        popad
        inherited [.pDstImage], [.xDst], [.yDst], [.xSrc], [.ySrc], [.width], [.height]
        return
endp




; returns CF = 1 if the focus has been changed.

method TGrid.SetFocused ; .x, .y
begin
        pushad

        mov     esi, [.self]
        mov     ecx, [.x]
        mov     edx, [.y]
        mov     edi, [esi+TGrid._on_focus_change]

        mov     eax, [esi+TGrid.ColCount]
        mov     ebx, [esi+TGrid.RowCount]
        dec     eax
        dec     ebx

        cmp     ecx, eax
        cmova   ecx, eax

        cmp     edx, ebx
        cmova   edx, ebx

        cmp     ecx, [esi+TGrid._focused.x]
        jne     .changeit

        cmp     edx, [esi+TGrid._focused.y]
        je      .finish

.changeit:
        test    edi, edi
        jz      .old_ok

        pushad
        stdcall edi, esi, [esi+TGrid._focused.x], [esi+TGrid._focused.y], fcfUnfocused
        popad

.old_ok:
        mov     [esi+TGrid._focused.x], ecx
        mov     [esi+TGrid._focused.y], edx
        test    edi, edi
        jz      .end_ok

        stdcall edi, esi, ecx, edx, fcfFocused

.end_ok:
        stc

.finish:
        popad
        return
endp



method TGrid.__UpdateImages
begin
        pushad
        mov     esi, [.self]

        mov     ebx, [esi+TGrid._visible]
        mov     edi, [esi+TGrid._canvas]

        mov     ecx, [esi+TGrid._width]
        mov     edx, [esi+TGrid._height]

        test    ebx, ebx
        jz      .destroy

        test    edi, edi
        jz      .create_new

; check the size

        cmp     ecx, [edi+TImage.width]
        ja      .destroy

        cmp     edx, [edi+TImage.height]
        jbe     .setwrap

.destroy:
        stdcall DestroyImage, edi                         ; canvas

        xor     eax, eax
        mov     [esi+TGrid._canvas], eax

        test    ebx, ebx
        jz      .exit


.create_new:

; new size - make it a little bit bigger.

        lea     eax, [ecx+256]
        lea     ebx, [edx+256]

        stdcall CreateImage2, eax, ebx, FALSE
        mov     [esi+TGrid._canvas], eax
        mov     edi, eax

.setwrap:
        mov     [edi+TImage.wrapW], ecx
        mov     [edi+TImage.wrapH], edx

.exit:
        and     [esi+TGrid._canvas_valid], 0
        popad
        inherited
        return
endp




method TGrid.Resize
begin
        inherited [.newW], [.newH]
        exec    [.self], TGrid:__AdjustScrollbars
        return
endp



method TGrid.EventScroll        ; , .direction, .command, .value
begin
        inherited [.direction], [.command], [.value]
        jc        .finish

        pushad
        mov     esi, [.self]
        and     [esi+TGrid._canvas_valid], 0
        exec    esi, TGrid:RectChanged2, 0
        popad

.finish:
        return
endp




method TGrid.EventMouseMove     ;, .x, .y, .kbdState
begin
        inherited [.x], [.y], [.kbdState]
        jc        .processed

        pushad
        mov     esi, [.self]

; first the mouse cursor:

        mov     ebx, mcArrow

        exec    esi, TGrid:HitTest, [.x], [.y]
        cmovc   eax, [esi+TGrid.selection.right]
        cmovc   edx, [esi+TGrid.selection.bottom]
        jc      .cursor_ok

        test    eax, eax
        jns     @f
        mov     ebx, mcSizeV
@@:
        test    edx, edx
        jns     @f
        mov     ebx, mcSizeH
@@:

.cursor_ok:
        cmp     [esi+TGrid.sel_flags], 0
        jne     .mouse_cursor_ok

        push    eax edx

        mov     [esi+TWindow._cursor], ebx
        stdcall GetStockCursor, ebx

        get     ecx, esi, TGrid:OSWindow
        stdcall SetMouseCursor, [ecx+TWindow.handle], eax

        pop     edx eax

        test    eax, eax
        js      .end_mouse_move
        test    edx, edx
        js      .end_mouse_move

.mouse_cursor_ok:
        cmp     [esi+TGrid._captured], 0
        je      .end_mouse_move

; here process the drag operations:

        mov     edi, [esi+TGrid.sel_flags]

        test    edi, gsfResizeColWidth or gsfResizeRowHeight
        jnz     .resize_row_col

        cmp     edi, gsfSelectEntireRow
        cmove   eax, [esi+TGrid.ColCount]

        cmp     edi, gsfSelectEntireCol
        cmove   edx, [esi+TGrid.RowCount]

        mov     [esi + TGrid.selection.right], eax
        mov     [esi + TGrid.selection.bottom], edx

        cmp     edi, gsfSelectEntireRow
        cmove   eax, [esi+TGrid._FixedCols]

        cmp     edi, gsfSelectEntireCol
        cmove   edx, [esi+TGrid._FixedRows]

        exec    esi, TGrid:SetFocused, eax, edx
        jnc     .end_mouse_move

.ensure:
        exec    esi, TGrid:EnsureVisible, [esi+TGrid.selection.right], [esi+TGrid.selection.bottom]
        and     [esi+TGrid._canvas_valid], 0
        exec    esi, TGrid:RectChanged2, 0

.end_mouse_move:
        popad

.processed:
        return


.resize_row_col:

        test    edi, gsfResizeColWidth
        jz      .col_width_ok

        mov     ebx, [esi+TGrid.ptrColX]
        mov     eax, [esi+TGrid.resize_rc]
        mov     ecx, [.x]
        sub     ecx, [ebx+4*eax]        ; the start coordinate.
        cmp     eax, [esi+TGrid._FixedCols]
        jb      .xpos_ok
        add     ecx, [esi + TGrid._scrXY.pos]
.xpos_ok:
        sub     ecx, [esi+TGrid.resize_ofs]
        cmp     ecx, 4
        jge     @f
        mov     ecx, 4
@@:
        exec    esi, TGrid:SetColWidth, eax, ecx

        mov     eax, [esi+TGrid.resize_rc]
        xor     edx, edx
        jmp     .ensure

.col_width_ok:
        test    edi, gsfResizeRowHeight
        jz      .end_mouse_move

        mov     ebx, [esi+TGrid.ptrRowY]
        mov     eax, [esi+TGrid.resize_rc]
        mov     ecx, [.y]
        sub     ecx, [ebx+4*eax]        ; the start coordinate.
        cmp     eax, [esi+TGrid._FixedCols]
        jb      .ypos_ok
        add     ecx, [esi + TGrid._scrXY.pos + 4]
.ypos_ok:
        sub     ecx, [esi + TGrid.resize_ofs]
        cmp     ecx, 4
        jge     @f
        mov     ecx, 4
@@:
        exec    esi, TGrid:SetRowHeight, eax, ecx

        mov     edx, [esi + TGrid.resize_rc]
        xor     eax, eax
        jmp     .ensure
endp




method TGrid.EventButtonPress        ;, .button, .kbdState, .x, .y
begin
        inherited [.button], [.kbdState], [.x], [.y]
        jc        .processed

        pushad

        mov     esi, [.self]

        exec    esi, TGrid:HitTest, [.x], [.y]
        jc      .finish

        stdcall SetMouseCapture, [.self]
        mov     [esi+TGrid._captured], 1

        test    eax, eax
        js      .resize_row
        test    edx, edx
        js      .resize_col

        and     [esi+TGrid.sel_flags], 0
        mov     [esi+TGrid.selection.left], eax
        mov     [esi+TGrid.selection.top], edx
        mov     [esi+TGrid.selection.right], eax
        mov     [esi+TGrid.selection.bottom], edx

        cmp     eax, [esi+TGrid._FixedCols]
        jge     .notleft

; if the cursor is on the left fixed cells
        or      [esi+TGrid.sel_flags], gsfSelectEntireRow
        mov     ebx, [esi+TGrid._FixedCols]  ; xbeg
        mov     ecx, [esi+TGrid.ColCount]   ; xend
        mov     [esi+TGrid.selection.left], ebx
        mov     [esi+TGrid.selection.right], ecx
        mov     eax, [esi+TGrid._FixedCols]

.notleft:
        cmp     edx, [esi+TGrid._FixedRows]
        jge     .nottop

; if the cursor is on the top fixed cells
        or      [esi+TGrid.sel_flags], gsfSelectEntireCol
        mov     ebx, [esi+TGrid._FixedRows]  ; ybeg
        mov     ecx, [esi+TGrid.RowCount]   ; yend
        mov     [esi+TGrid.selection.top], ebx
        mov     [esi+TGrid.selection.bottom], ecx
        mov     edx, [esi+TGrid._FixedCols]

.nottop:

        exec    esi, TGrid:SetFocused, eax, edx

                and     [esi+TGrid._canvas_valid], 0
        exec    esi, TGrid:RectChanged2, 0

.finish:
        popad

.processed:
        return


.resize_row:
        mov     [esi+TGrid.sel_flags], gsfResizeRowHeight
        mov     eax, edx
        mov     ecx, [esi+TGrid.ptrRowY]
        mov     edx, [.y]
        cmp     eax, [esi+TGrid._FixedRows]
        jb      .do_resize
        add     edx, [esi + TGrid._scrXY.pos + 4]
        jmp     .do_resize

.resize_col:
        mov     [esi+TGrid.sel_flags], gsfResizeColWidth
        mov     ecx, [esi+TGrid.ptrColX]
        mov     edx, [.x]
        cmp     eax, [esi+TGrid._FixedCols]
        jb      .do_resize
        add     edx, [esi + TGrid._scrXY.pos]

.do_resize:
        mov     [esi+TGrid.resize_rc], eax
        sub     edx, [ecx+4*eax+4]      ; Y coordinate on the next cell.
        mov     [esi+TGrid.resize_ofs], edx
        jmp     .finish
endp





method TGrid.EventButtonRelease      ;, .button, .kbdState, .x, .y
begin
        inherited [.button], [.kbdState], [.x], [.y]
        pushad

        mov     esi, [.self]
        cmp     [esi+TGrid._captured], 0
        je      .finish

        stdcall SetMouseCapture, 0
        mov     [esi+TGrid._captured], 0

        and     [esi+TGrid.sel_flags], 0
        lea     edi, [esi+TGrid.selection]
        stdcall RectSort, edi

        and     [esi+TGrid._canvas_valid], 0
        exec    esi, TGrid:RectChanged2, 0

.finish:
        popad
        return
endp





method TGrid.EventKeyPress    ;, .utf8, .scancode, .kbdState
begin
        inherited [.utf8], [.scancode], [.kbdState]
        jc        .finish       ; CF == 1

        mov     eax, [.utf8]
        test    eax, eax
        jnz     .finish         ; CF == 0

        pushad

        mov     esi, [.self]
        mov     eax, [.scancode]

        mov     ecx, [esi+TGrid._focused.x]
        mov     edx, [esi+TGrid._focused.y]

        cmp     eax, keyUpNumpad
        je      .up
        cmp     eax, keyUp
        je      .up

        cmp     eax, keyDownNumpad
        je      .down
        cmp     eax, keyDown
        je      .down

        cmp     eax, keyPgUpNumpad
        je      .pageup
        cmp     eax, keyPgUp
        je      .pageup

        cmp     eax, keyPgDnNumpad
        je      .pagedown
        cmp     eax, keyPgDown
        je      .pagedown

        cmp     eax, keyLeftNumpad
        je      .left
        cmp     eax, keyLeft
        je      .left

        cmp     eax, keyRightNumpad
        je      .right
        cmp     eax, keyRight
        je      .right

        cmp     eax, keyHomeNumpad
        je      .home
        cmp     eax, keyHome
        je      .home

        cmp     eax, keyEndNumpad
        je      .end
        cmp     eax, keyEnd
        je      .end

; key not processed.
        clc
        popad

.finish:
        return


.xy_ok:
        mov     [esi+TGrid.selection.right], ecx
        mov     [esi+TGrid.selection.bottom], edx

        test    [.kbdState], maskShift
        jnz     .selection_ok

        mov     [esi+TGrid.selection.left], ecx
        mov     [esi+TGrid.selection.top], edx

.selection_ok:

        exec    esi, TGrid:SetFocused, ecx, edx
        jnc     .key_processed

        exec    esi, TGrid:EnsureVisible, [esi+TGrid._focused.x], [esi+TGrid._focused.y]
        exec    esi, TGrid:__AdjustScrollbars

        xor     eax, eax
        mov     [esi+TGrid._canvas_valid], eax
        exec    esi, TGrid:RectChanged2, eax

.key_processed:
        stc
        popad
        return

;------------------------------------------------------------------

.up:
        dec     edx
        cmp     edx, [esi+TGrid._FixedRows]
        cmovl   edx, [esi+TGrid._FixedRows]
        jmp     .xy_ok

.down:
        mov     eax, [esi+TGrid.RowCount]
        dec     eax

        inc     edx
        cmp     edx, eax
        cmovg   edx, eax
        jmp     .xy_ok


.left:
        dec     ecx
        cmp     ecx, [esi+TGrid._FixedCols]
        cmovl   ecx, [esi+TGrid._FixedCols]
        jmp     .xy_ok

.right:
        mov     eax, [esi+TGrid.ColCount]
        dec     eax

        inc     ecx
        cmp     ecx, eax
        cmovg   ecx, eax
        jmp     .xy_ok


.home:
        mov     edx, [esi+TGrid._FixedRows]
        jmp     .xy_ok


.end:
        mov     edx, [esi+TGrid.RowCount]
        dec     edx
        jmp     .xy_ok


; It is a little bit more complex.

.pageup:
        push    ecx

        mov     ebx, [esi+TGrid.ptrRowY]
        mov     ecx, [esi+TGrid._height]

        mov     eax, [esi+TGrid._FixedRows]
        sub     ecx, [ebx+eax*4]
        sub     ecx, [GUI.boxBorderWidth]       ; ecx = height of the floating area.

        mov     eax, [ebx+edx*4]   ; Yabs of the focused row.
        sub     eax, ecx                        ; the new Yabs
        get     ecx, esi, TGrid:PosY
        sub     ecx, [ebx+edx*4]   ; the offset of the current focused row from the page start. Negative!

.loop_up:
        dec     edx
        cmp     edx, [esi+TGrid._FixedRows]
        jb      .end_up

        cmp     eax, [ebx+edx*4]
        jl      .loop_up

.end_up:
        inc     edx
        add     ecx, [ebx+edx*4]  ; ecx is negative here!
        jns     @f
        xor     ecx, ecx
@@:
        set     esi, TGrid:PosY, ecx

        pop     ecx
        jmp     .xy_ok


.pagedown:
        push    ecx

        mov     ebx, [esi+TGrid.ptrRowY]
        mov     ecx, [esi+TGrid._height]
        
        mov     eax, [esi+TGrid._FixedRows]
        sub     ecx, [ebx+eax*4]
        sub     ecx, [GUI.boxBorderWidth]       ; ecx = height of the floating area.

        mov     eax, [ebx+edx*4]   ; Yabs of the focused row.
        add     eax, ecx                        ; the new Yabs
        get     ecx, esi, TGrid:PosY
        sub     ecx, [ebx+edx*4]   ; the offset of the current focused row from the page start. Negative!

.loop_dn:
        inc     edx
        cmp     edx, [esi+TGrid.RowCount]
        jae     .end_dn

        cmp     eax, [ebx+edx*4]
        ja      .loop_dn
        
.end_dn:
        dec     edx
        add     ecx, [ebx+edx*4]  ; ecx is negative here!

        get     eax, esi, TGrid:MaxY
        cmp     ecx, eax
        cmova   ecx, eax
        
        set     esi, TGrid:PosY, ecx

        pop     ecx
        jmp     .xy_ok
endp





method TGrid.__RenderGrid
.rcFixedTL RECT      ; fixed cells top-left quadrant.
.rcFixedT  RECT      ; fixed cells on the top
.rcFixedL  RECT      ; fixed cells on the left
.rcFloat   RECT      ; the float zode of the grid that can be scrolled.
.rcClient  RECT      ; the TGrid client rect.
.ptrRect   dd ?
begin
        pushad

        mov     esi, [.self]

        lea     eax, [.rcClient]
        mov     [.ptrRect], eax

        mov     eax, [esi+TGrid._width]
        mov     ecx, [esi+TGrid._height]

        mov     edx, [GUI.boxBorderWidth]
        neg     edx
        lea     eax, [eax+2*edx]
        lea     ecx, [ecx+2*edx]

        xor     edx, edx

        mov     [.rcClient.left], edx
        mov     [.rcClient.top], edx

        mov     [.rcClient.right], eax
        mov     [.rcClient.bottom], ecx

        mov     [.rcFixedT.right], eax
        mov     [.rcFixedL.bottom], ecx

        mov     [.rcFloat.right], eax
        mov     [.rcFloat.bottom], ecx

        mov     [.rcFixedTL.left], edx
        mov     [.rcFixedTL.top], edx

        mov     [.rcFixedT.top], edx
        mov     [.rcFixedL.left], edx

        mov     ecx, [esi+TGrid._FixedCols]
        mov     eax, [esi+TGrid.ptrColX]
        test    eax, eax
        jnz     .colsizeok

        imul    ecx, [esi+TGrid.ColWidth]   ; default width if there is no size array
        jmp     .x1ok

.colsizeok:
        mov     ecx, [eax+4*ecx]

.x1ok:
        mov     edx, [esi+TGrid._FixedRows]
        mov     eax, [esi+TGrid.ptrRowY]
        test    eax, eax
        jnz     .rowsizeok

        imul    edx, [esi+TGrid.ColWidth]   ; default width if there is no size array
        jmp     .y1ok

.rowsizeok:
        mov     edx, [eax+4*edx]
.y1ok:
        mov     [.rcFixedTL.right], ecx
        mov     [.rcFixedTL.bottom], edx

        mov     [.rcFixedT.left], ecx
        mov     [.rcFixedT.bottom], edx

        mov     [.rcFixedL.right], ecx
        mov     [.rcFixedL.top], edx

        mov     [.rcFloat.left], ecx
        mov     [.rcFloat.top], edx


; Here all 4 rectangles are ready. Some of them can be empty of course.
; Lets make intersections with the invalidated rectangle.

.drawFloat:
        lea     eax, [.rcFloat]
        stdcall RectIntersect, eax, eax, [.ptrRect]
        jc      .drawFixedT

        lea     eax, [.rcFloat]
        stdcall TGrid.__DrawCellArea, [esi+TGrid._canvas], eax, 0, [GUI.boxBorderWidth]

.drawFixedT:
        lea     eax, [.rcFixedT]
        stdcall RectIntersect, eax, eax, [.ptrRect]
        jc      .drawFixedL

;options.DebugMode = 1
;        OutputValue "Fixed top: left = ", [.rcFixedT.left], 10, -1
;        OutputValue "Fixed top: top = ", [.rcFixedT.top], 10, -1
;        OutputValue "Fixed top: right = ", [.rcFixedT.right], 10, -1
;        OutputValue "Fixed top: bottom = ", [.rcFixedT.bottom], 10, -1
;options.DebugMode = 0

        stdcall TGrid.__DrawCellArea, [esi+TGrid._canvas], eax, fxVertical, [GUI.boxBorderWidth]

.drawFixedL:
        lea     eax, [.rcFixedL]
        stdcall RectIntersect, eax, eax, [.ptrRect]
        jc      .drawFixedTL

        stdcall TGrid.__DrawCellArea, [esi+TGrid._canvas], eax, fxHorizontal, [GUI.boxBorderWidth]

.drawFixedTL:
        lea     eax, [.rcFixedTL]
        stdcall RectIntersect, eax, eax, [.ptrRect]
        jc      .finish

        stdcall TGrid.__DrawCellArea, [esi+TGrid._canvas], eax, fxHorizontal or fxVertical, [GUI.boxBorderWidth]

.finish:
        xor     edx, edx
        mov     ecx, [esi+TGrid._width]
        mov     eax, [esi+TGrid._height]
        mov     [.rcClient.left], edx
        mov     [.rcClient.top], edx
        mov     [.rcClient.right], ecx
        mov     [.rcClient.bottom], eax

        lea     edi, [.rcClient]
        stdcall DrawBoxDefault, [esi+TGrid._canvas], edi, 0, bxFlat or bxNoFill, [GUI.boxBorderWidth]

        popad
        return
endp




; .fFixed contains flags:
fxHorizontal = 1  ; columns
fxVertical   = 2  ; rows

proc TGrid.__DrawCellArea, .canvas, .ptrClipRect, .fFixed, .offset
  .Cell  RECT
  .xofs  dd ?
  .yofs  dd ?
  .clip  RECT
  .sel   RECT
  .bnd   TBounds
begin
        pushad

; selection rectangle in cells coordinates.

        lea     edi, [.sel]
        lea     eax, [esi+TGrid.selection]
        stdcall RectCopy, edi, eax
        stdcall RectSort, edi
        inc     [.sel.right]
        inc     [.sel.bottom]

        mov     eax, [esi+TGrid._FixedRows]
        mov     ecx, [esi+TGrid._FixedCols]

; The fixed cells can not be selected!!!
; [edi+RECT.top] := max([edi+RECT.top], [esi+TGrid._FixedRows])
; [edi+RECT.left] := max([edi+RECT.left], [esi+TGrid._FixedCols])

        cmp     eax, [edi+RECT.top]
        cmovl   eax, [edi+RECT.top]

        cmp     ecx, [edi+RECT.left]
        cmovl   ecx, [edi+RECT.left]

        mov     [edi+RECT.top], eax
        mov     [edi+RECT.left], ecx

        mov     eax, [esi+TGrid._FixedCols]
        mov     ecx, [esi+TGrid.ColCount]

        test    [esi+TGrid._flags], gfRowFocus
        jz      @f

        mov     [edi+RECT.left], eax
        mov     [edi+RECT.right], ecx

@@:

; drawing clip rectange.
        lea     eax, [.bnd]
        stdcall RectToBounds, eax, [.ptrClipRect]

; erase the background
        cmp     [.fFixed], 0
        cmove   eax, [GUI.clGridCellBk + 4*cellRegular]
        cmovne  eax, [GUI.clGridCellBk + 4*cellFixed]

        push    eax ; color

        mov     edi, [.ptrClipRect]

;options.DebugMode = 1
;   OutputValue "Rect left: ", [edi+RECT.left], 10, -1
;   OutputValue "Rect top: ", [edi+RECT.top], 10, -1
;   OutputValue "Rect right: ", [edi+RECT.right], 10, -1
;   OutputValue "Rect bottom: ", [edi+RECT.bottom], 10, -1
;options.DebugMode = 0

        mov     eax, [edi+RECT.left]
        mov     ebx, [edi+RECT.top]
        mov     ecx, [edi+RECT.right]
        mov     edx, [edi+RECT.bottom]

        sub     ecx, eax
        sub     edx, ebx

        add     eax, [.offset]
        add     ebx, [.offset]

        stdcall DrawSolidRect, [.canvas], eax, ebx, ecx, edx ; color from the stack.

; If the cells are not fixed, compute the real coordinates of the rectangle.
        xor     eax, eax
        mov     [.xofs], eax
        mov     [.yofs], eax

        test    [.fFixed], fxHorizontal
        jnz     .horizOK

        mov     eax, [esi + TGrid._scrXY.pos]

        add     [edi+RECT.left], eax
        add     [edi+RECT.right], eax

        mov     [.xofs], eax

.horizOK:
        test    [.fFixed], fxVertical
        jnz     .vertOK

        mov     eax, [esi + TGrid._scrXY.pos + 4]
        add     [edi+RECT.top], eax
        add     [edi+RECT.bottom], eax

        mov     [.yofs], eax

; Determine the cell range for the given clip rectangle.
.vertOK:
        xor     eax, eax
        stdcall __SearchCoordinate, [edi+RECT.left], [esi+TGrid.ptrColX], 0, [esi+TGrid.ColCount]
        mov     [.Cell.left], eax

;        OutputValue "Cell.left: ", eax, 10, -1

        mov     eax, [esi+TGrid.ColCount]
        stdcall __SearchCoordinate, [edi+RECT.right], [esi+TGrid.ptrColX], 0, eax
        mov     [.Cell.right], eax

;        OutputValue "Cell.right: ", eax, 10, -1

        xor     eax, eax
        stdcall  __SearchCoordinate, [edi+RECT.top], [esi+TGrid.ptrRowY], 0, [esi+TGrid.RowCount]
        mov     [.Cell.top], eax

;        OutputValue "Cell.top: ", eax, 10, -1

        mov     eax, [esi+TGrid.RowCount]
        stdcall __SearchCoordinate, [edi+RECT.bottom], [esi+TGrid.ptrRowY], 0, eax
        mov     [.Cell.bottom], eax

;        OutputValue "Cell.bottom: ", eax, 10, -1

        mov     ebx, [.Cell.top]

.yloop:
        cmp     ebx, [.Cell.bottom]
        jg     .endyloop

        test    [.fFixed], fxVertical
        cmovnz  eax, [esi+TGrid._FixedRows]
        cmovz   eax, [esi+TGrid.RowCount]

        cmp     ebx, eax
        jge     .endyloop


        mov     eax, [esi+TGrid.ptrRowY]
        mov     ecx, [4*ebx+eax+4]              ; bottom
        mov     eax, [4*ebx+eax]                ; top
        sub     ecx, [.yofs]
        sub     eax, [.yofs]

        add     eax, [.offset]
        add     ecx, [.offset]

        mov     [.clip.bottom], ecx
        mov     [.clip.top], eax

        mov     edi, [.Cell.left]

.xloop:
        cmp     edi, [.Cell.right]
        jg      .endxloop

        test    [.fFixed], fxHorizontal
        cmovnz  eax, [esi+TGrid._FixedCols]
        cmovz   eax, [esi+TGrid.ColCount]

        cmp     edi, eax
        jge     .endxloop


        mov     eax, [esi+TGrid.ptrColX]
        mov     ecx, [4*edi+eax+4]
        mov     eax, [4*edi+eax]
        sub     ecx, [.xofs]
        sub     eax, [.xofs]

        add     eax, [.offset]
        add     ecx, [.offset]

        mov     [.clip.right], ecx
        mov     [.clip.left], eax

; draw the background if the cell is selected or focused:

        cmp     ebx, [esi+TGrid._focused.y]
        jne     .is_selected

        test    [esi+TGrid._flags], gfRowFocus
        jnz     .cell_focused

        cmp     edi, [esi+TGrid._focused.x]
        jne     .is_selected

.cell_focused:
        mov     edx, [GUI.clGridCellBk+4*cellFocused]
        cmp     esi, [__FocusedWindow]
        je      .draw_bk

        mov     edx, [GUI.clGridCellBk+4*cellFocused2]
        jmp     .draw_bk

.is_selected:

        lea     eax, [.sel]
        stdcall PointInRect, eax, edi, ebx
        jnc     .bkgroundok

        mov     edx, [GUI.clGridCellBk + 4*cellSelected]

.draw_bk:
        mov     eax, [.clip.right]
        mov     ecx, [.clip.bottom]
        sub     eax, [.clip.left]
        sub     ecx, [.clip.top]
        stdcall DrawSolidRect, [.canvas], [.clip.left], [.clip.top], eax, ecx, edx

.bkgroundok:
        lea     eax, [.clip]
        exec    esi, TGrid:DrawCell, [.canvas], eax, edi, ebx

; draw the gridlines:

        push    ebx

        xor     ebx, ebx
        mov     eax, gfGridLines

        cmp     [.fFixed], 0
        je      .datagridline

        mov     ebx, 8
        mov     eax, gfGridLinesFixed

.datagridline:
;        OutputValue "Flags: ", [esi+TGrid._flags], 16, 8

        test    [esi+TGrid._flags], eax
        jz      .gridok

        mov     edx, [.clip.left]
        mov     ecx, [.clip.right]
        mov     eax, [.clip.bottom]
        dec     ecx
        sub     eax, [.clip.top]

        stdcall BlendSolidRect, [.canvas], edx, [.clip.top], 1, eax, [GUI.clGridLines+ebx]      ; left
        stdcall BlendSolidRect, [.canvas], ecx, [.clip.top], 1, eax, [GUI.clGridLines+4+ebx]    ; right

        mov     edx, [.clip.top]
        mov     ecx, [.clip.right]
        mov     eax, [.clip.bottom]
        dec     eax
        sub     ecx, [.clip.left]

        stdcall BlendSolidRect, [.canvas], [.clip.left], edx, ecx, 1, [GUI.clGridLines+ebx]     ; top
        stdcall BlendSolidRect, [.canvas], [.clip.left], eax, ecx, 1, [GUI.clGridLines+4+ebx]   ; bottom

.gridok:
        pop     ebx

        inc     edi
        jmp     .xloop

.endxloop:
        inc     ebx
        jmp     .yloop

.endyloop:

        popad
        return
endp






;------------------------------------------------------------------
; If .Col, .Row is inside the visible client area, does nothing.
; , if .Col, .Row is outside this area, provides scrolling to
; make it visible to the center of the client area.
;------------------------------------------------------------------
method TGrid.EnsureVisible      ;, .Col, .Row
.client RECT
begin
        pushad
        mov     edi, [.self]

        mov     ebx, [edi+TGrid._FixedCols]
        mov     ecx, [edi+TGrid._FixedRows]
        shl     ebx, 2
        shl     ecx, 2
        add     ebx, [edi+TGrid.ptrColX]
        add     ecx, [edi+TGrid.ptrRowY]
        mov     ebx, [ebx]
        mov     ecx, [ecx]
        mov     [.client.left], ebx
        mov     [.client.top], ecx

        mov     ebx, [edi+TGrid._width]
        mov     ecx, [edi+TGrid._height]
        mov     eax, [GUI.boxBorderWidth]
        shl     eax, 1
        sub     ebx, eax
        sub     ecx, eax

        mov     [.client.right], ebx
        mov     [.client.bottom], ecx

        mov     eax, [.Col]
        cmp     eax, [edi+TGrid._FixedCols]
        jb      .posvertical                    ; fixed columns are always inside the screen

        get     ecx, edi, TGrid:PosX
        add     [.client.left], ecx
        add     [.client.right], ecx

        mov     edx, [edi+TGrid.ptrColX]
        mov     ecx, [.Col]
        mov     ebx, [edx+4*ecx]
        mov     ecx, [edx+4*ecx+4]

        cmp     ecx, [.client.right]
        jle     .rightok

        sub     ecx, [.client.right]
        add     ecx, [.client.left]

        get     eax, edi, TGrid:PosX
        sub     eax, [.client.left]
        add     ecx, eax

        set     edi, TGrid:PosX, ecx
        jmp     .posvertical

.rightok:
        cmp     ebx, [.client.left]
        jge     .posvertical

        get     eax, edi, TGrid:PosX
        sub     eax, [.client.left]
        add     ebx, eax

        set     edi, TGrid:PosX, ebx

.posvertical:


; This logic is somehow strange. Up to .bottomok; To be checked...


        mov     eax, [.Row]
        cmp     eax, [edi+TGrid._FixedRows]
        jb      .endpos

        get     ecx, edi, TGrid:PosY
        add     [.client.top], ecx
        add     [.client.bottom], ecx

        mov     edx, [edi+TGrid.ptrRowY]
        mov     ecx, [.Row]
        mov     ebx, [edx+4*ecx]
        mov     ecx, [edx+4*ecx+4]

        cmp     ecx, [.client.bottom]
        jle     .bottomok

        sub     ecx, [.client.bottom]
        add     ecx, [.client.top]

        get     eax, edi, TGrid:PosY
        sub     eax, [.client.top]
        add     ecx, eax

        set     edi, TGrid:PosY, ecx
        jmp     .endpos

.bottomok:
        cmp     ebx, [.client.top]
        jge     .endpos

        get     eax, edi, TGrid:PosY
        sub     eax, [.client.top]
        add     ebx, eax

        set     edi, TGrid:PosY, ebx

.endpos:
        popad
        return
endp



; Return:
;   CF = 1: no cell on the given coordinates.
;   CF = 0: a cell has been found on these coordinates.
;   eax: column pointed or -1.
;   edx: row pointed or -1
;   If eax = -1 then the cursor is in the row resize area for the row in edx
;   if edx = -1 then the cursor is in the column resize area for the column in eax

method TGrid.HitTest ; .x, .y
begin
        pushad

        mov     esi, [.self]

        mov     edx, [GUI.boxBorderWidth]
        sub     [.x], edx
        sub     [.y], edx

        stdcall __SearchCoordinate, [.y], [esi+TGrid.ptrRowY], 0, [esi+TGrid._FixedRows]
        jc      .col_not_resize

        mov     ebx, eax

        mov     edi, [.x]
        stdcall __SearchCoordinate, edi, [esi+TGrid.ptrColX], 0, [esi+TGrid._FixedCols]
        jnc     .maybe_col_resize

        add     edi, [esi + TGrid._scrXY.pos]
        stdcall __SearchCoordinate, edi, [esi+TGrid.ptrColX], [esi+TGrid._FixedCols], [esi+TGrid.ColCount]
        jc      .cell_not_found

.maybe_col_resize:

        test    [esi+TGrid._flags], gfResizeColumns
        jz      .col_select

        sub     edx, edi
        sub     edi, ecx

        cmp     edx, 3
        jle     .col_resize

        cmp     edi, 2
        jg      .col_select

        dec     eax

.col_resize:
        mov     [esp+4*regEAX], eax
        mov     dword [esp+4*regEDX], -1

        clc
        popad
        return

.col_select:
        cmp     eax, [esi+TGrid._FixedCols]
        jb      .col_not_resize

        mov     [esp+4*regEAX], eax
        mov     [esp+4*regEDX], ebx

        clc
        popad
        return

.cell_not_found:
        stc
        popad
        return

; the Y coordinate is not on the fixed rows, so it is either row resize or simple data cell selection.

.col_not_resize:

        stdcall __SearchCoordinate, [.x], [esi+TGrid.ptrColX], 0, [esi+TGrid._FixedCols]
        jc      .select_data_cell

        mov     ebx, eax

        mov     edi, [.y]
        stdcall __SearchCoordinate, edi, [esi+TGrid.ptrRowY], 0, [esi+TGrid._FixedRows]
        jnc     .maybe_row_resize

        add     edi, [esi + TGrid._scrXY.pos + 4]
        stdcall __SearchCoordinate, edi, [esi+TGrid.ptrRowY], [esi+TGrid._FixedRows], [esi+TGrid.RowCount]
        jc      .cell_not_found

.maybe_row_resize:
        test    [esi+TGrid._flags], gfResizeRows
        jz      .row_select

        sub     edx, edi
        sub     edi, ecx

        cmp     edx, 3
        jle     .row_resize

        cmp     edi, 2
        jg      .row_select

        dec     eax

.row_resize:
        mov     [esp+4*regEDX], eax
        mov     dword [esp+4*regEAX], -1
        clc
        popad
        return


.select_data_cell:
        mov     edi, [.x]
        add     edi, [esi + TGrid._scrXY.pos]
        stdcall __SearchCoordinate, edi, [esi+TGrid.ptrColX], [esi+TGrid._FixedCols], [esi+TGrid.ColCount]
        jc      .cell_not_found

        mov     ebx, eax

        mov     edi, [.y]
        add     edi, [esi + TGrid._scrXY.pos + 4]
        stdcall __SearchCoordinate, edi, [esi+TGrid.ptrRowY], [esi+TGrid._FixedRows], [esi+TGrid.RowCount]
        jc      .cell_not_found

.row_select:
        mov     [esp+4*regEAX], ebx
        mov     [esp+4*regEDX], eax
        clc
        popad
        return


endp






method TGrid.GetCellXY  ;, .Col, .Row
begin
        push    esi

        mov     esi, [.self]
        mov     eax, [.Col]
        mov     edx, [.Row]
        shl     eax, 2
        shl     edx, 2
        add     eax, [esi+TGrid.ptrColX]
        add     edx, [esi+TGrid.ptrRowY]
        mov     eax, [eax]
        mov     edx, [edx]

        pop     esi
        return
endp



method TGrid.SetCounts  ;, .ColCount, .RowCount
.ycount dd ?
.ptrNewColX  dd ?
.ptrNewRowY  dd ?
begin
        pushad

        mov     [.ptrNewColX], 0
        mov     [.ptrNewRowY], 0
        mov     ebx, [.self]

; resize column coordinates array...
        mov     eax, [ebx+TGrid.ptrColX]
        mov     [.ptrNewColX], eax

        mov     eax, [.ColCount]
        cmp     eax, [ebx+TGrid.ColCount]
        je      .resizey

        mov     eax, [.ColCount]
        lea     eax, [4*eax+4]          ; byte size of the array.
        stdcall ResizeMem, [ebx+TGrid.ptrColX], eax
        mov     [.ptrNewColX], eax
        test    eax, eax
        jz      .finish

        mov     edi, eax

        mov     ecx, [ebx+TGrid.ColCount]
        cmp     ecx, [.ColCount]
        jge     .resizey

        mov     eax, [edi+4*ecx]

.newsizesx:
        inc     ecx
        cmp     ecx, [.ColCount]
        jg      .resizey

        add     eax, [ebx+TGrid.ColWidth]
        mov     [edi+4*ecx], eax
        jmp     .newsizesx

.resizey:
; resize row coordinates array...
        mov     eax, [ebx+TGrid.ptrRowY]
        mov     [.ptrNewRowY], eax

        mov     eax, [.RowCount]
        cmp     eax, [ebx+TGrid.RowCount]
        je      .finish

        mov     eax, [.RowCount]
        lea     eax, [4*eax+4]          ; byte size of the array.
        stdcall ResizeMem,[ebx+TGrid.ptrRowY], eax
        mov     [.ptrNewRowY], eax
        test    eax, eax
        jz      .finish

        mov     edi, eax

        mov     ecx, [ebx+TGrid.RowCount]
        cmp     ecx, [.RowCount]
        jg      .finish

        mov     eax, [edi+4*ecx]

.newsizesy:
        inc     ecx
        cmp     ecx, [.RowCount]
        jg      .finish

        add     eax, [ebx+TGrid.RowHeight]
        mov     [edi+4*ecx], eax
        jmp     .newsizesy

.finish:
        xor     eax, eax
        cmp     eax, [.ptrNewColX]
        je      .error1
        cmp     eax, [.ptrNewRowY]
        je      .error2

        mov     ecx, [.RowCount]
        mov     edx, [.ColCount]
        mov     [ebx+TGrid.RowCount], ecx
        mov     [ebx+TGrid.ColCount], edx

        mov     ecx, [.ptrNewColX]
        mov     edx, [.ptrNewRowY]
        mov     [ebx+TGrid.ptrColX], ecx
        mov     [ebx+TGrid.ptrRowY], edx

        exec    ebx, TGrid:__AdjustScrollbars

        clc
        popad
        return

.error2:
        stdcall FreeMem, [.ptrNewColX]

.error1:
        stc
        popad
        return
endp


method TGrid.SetColWidth;, .Col, .Width
begin
        pushad
        mov     edi, [.self]
        mov     eax, [edi+TGrid.ptrColX]
        mov     ecx, [.Col]

        lea     eax, [eax+4*ecx+4]

        mov     edx, [.Width]
        sub     ecx, [edi+TGrid.ColCount]
        jge     .finish         ; error, the index is greater than count.

        sub     edx, [eax]
        neg     ecx
        add     edx, [eax-4]

.loop:
        add     [eax], edx
        lea     eax, [eax+4]
        loop    .loop

        exec    edi, TGrid:__AdjustScrollbars

.finish:
        popad
        return
endp



method TGrid.SetColumnsWidth    ;, .BegCol, .EndCol, .Width
begin
        pushad

        mov     edi, [.self]
        mov     ebx, [.BegCol]
        cmp     ebx, [edi+TGrid.ColCount]
        jae     .endloop

        mov     eax, [edi+TGrid.ColCount]
        cmp     [.EndCol], eax
        jl      .do_resize

        dec     eax
        mov     [.EndCol], eax

.do_resize:
        mov     esi, [edi+TGrid.ptrColX]
        mov     ecx, [esi+4*ebx]        ; the start X coordinate.

.loop:
        add     ecx, [.Width]
        inc     ebx
        cmp     ebx, [.EndCol]
        ja      .endloop

        mov     [esi+4*ebx], ecx
        jmp     .loop

.endloop:
        sub     ecx, [esi+4*ebx]   ; the delta.

.loop2:
        cmp     ebx, [edi+TGrid.ColCount]
        ja      .endloop2

        add     [esi+4*ebx], ecx
        inc     ebx
        jmp     .loop2

.endloop2:

        exec    edi, TGrid:__AdjustScrollbars

        popad
        return
endp



method TGrid.SetRowHeight       ;, .Row, .Height
begin
        pushad
        mov     edi, [.self]
        mov     eax, [edi+TGrid.ptrRowY]
        mov     ecx, [.Row]

        lea     eax, [eax+4*ecx+4]

        mov     edx, [.Height]
        sub     ecx, [edi+TGrid.RowCount]
        jge     .finish         ; error, the index is greater than count.

        sub     edx, [eax]
        neg     ecx
        add     edx, [eax-4]

.loop:
        add     [eax], edx
        lea     eax, [eax+4]
        loop    .loop

        exec    edi, TGrid:__AdjustScrollbars

.finish:
        popad
        return
endp



method TGrid.SetRowsHeight      ;.BegRow, .EndRow, .Height
begin
        pushad

        mov     edi, [.self]
        mov     ebx, [.BegRow]
        cmp     ebx, [edi+TGrid.RowCount]
        jae     .endloop

        mov     eax, [edi+TGrid.RowCount]
        cmp     [.EndRow], eax
        jl      .do_resize

        dec     eax
        mov     [.EndRow], eax

.do_resize:
        mov     esi, [edi+TGrid.ptrRowY]
        mov     ecx, [esi+4*ebx]        ; the start Y coordinate.

.loop:
        add     ecx, [.Height]
        inc     ebx
        cmp     ebx, [.EndRow]
        ja      .endloop

        mov     [esi+4*ebx], ecx
        jmp     .loop

.endloop:
        sub     ecx, [esi+4*ebx]   ; the delta.

.loop2:
        cmp     ebx, [edi+TGrid.RowCount]
        ja      .endloop2

        add     [esi+4*ebx], ecx
        inc     ebx
        jmp     .loop2

.endloop2:

        exec    edi, TGrid:__AdjustScrollbars

        popad
        return
endp



; Arguments:
;  .x : some coordinate.
;  .xarray: array or dword with coordinates of the cells.
;  .from: the count of the array. It contains N+1 elements where N is the number of cells in the table.
;  .to: from which cell to search.
; returns:
;   eax - the index of the cell where the coordinate is located.
;   ecx - the left coordinate of the cell.
;   edx - the right coordinate of the cell+1 (the left coordinate of the next cell).

proc __SearchCoordinate, .x, .xarray, .from, .to
begin
        pushad

        mov     esi, [.xarray]
        mov     eax, [.from]   ; left
        mov     edx, [.to]     ; right

        cmp     eax, edx
        jge     .not_found

        mov     ebx, [.x]
        cmp     ebx, [esi+4*eax]
        jl      .not_found      ; it is less than the first element.

        cmp     ebx, [esi+4*edx]
        jge     .not_found      ; it is greater than the last column.

; binary search between

.loop:
        cmp     eax, edx
        je      .found

        lea     ecx, [eax+edx]
        shr     ecx, 1

        cmp     ebx, [esi+4*ecx]
        cmovl   edx, ecx
        jl      .loop

        cmp     ebx, [esi+4*ecx+4]
        cmovge  eax, ecx
        jge     .loop

.found:
        mov     [esp+4*regEAX], ecx     ; the index of the
        mov     eax, [esi+4*ecx]
        mov     edx, [esi+4*ecx+4]
        mov     [esp+4*regECX], eax
        mov     [esp+4*regEDX], edx
        clc
        popad
        return

.not_found:
        stc
        popad
        return
endp



;------------------------------------------------------------------------
; TGrid private methods.
; These functions are for internal use. Don't call them outside TGrid
; control.
;------------------------------------------------------------------------

;---------------------------------------------------------
; Auto adjusts the scrollbars
;---------------------------------------------------------

sbHorz = 0
sbVert = 1

method TGrid.__AdjustScrollbars
begin
        pushad

        mov     ebx, [.self]
        get     eax, ebx, TGrid:height
        get     ecx, ebx, TGrid:width

        mov     edx, [GUI.boxBorderWidth]
        neg     edx

        lea     eax, [eax+2*edx]
        lea     ecx, [ecx+2*edx]

        exec    ebx, TGrid:__AdjustOneScroller, sbVert, [ebx+TGrid.ptrRowY], [ebx+TGrid.RowCount], [ebx+TGrid._FixedRows], eax, [ebx+TGrid.RowHeight]
        exec    ebx, TGrid:__AdjustOneScroller, sbHorz, [ebx+TGrid.ptrColX], [ebx+TGrid.ColCount], [ebx+TGrid._FixedCols], ecx, [ebx+TGrid.ColWidth]

        popad
        return
endp


method TGrid.__AdjustOneScroller        ;, .kind, .ptrArray, .Count, .Fixed, .client, .meansize
begin
        pushad

        mov     ebx, [.self]

        mov     esi, [.ptrArray]
        test    esi, esi
        jz      .finish

        mov     ecx, [.Count]
        mov     edx, [.Fixed]

        mov     ecx, [esi+4*ecx]        ; total height of all cells
        mov     eax, [esi+4*edx]        ; height of the fixed cells

        mov     edx, [.client]
        sub     edx, eax
        jge     @f
        xor     edx, edx
@@:

        sub     ecx, eax
        sub     ecx, edx
        jns     @f
        xor     ecx, ecx
@@:
        cmp     [.kind], sbHorz
        jne     .vert

; horizonal
        get     eax, ebx, TGrid:PosX
        cmp     eax, ecx
        cmova   eax, ecx

        set     ebx, TGrid:PosX, eax
        set     ebx, TGrid:MaxX, ecx
        set     ebx, TGrid:PageX, edx

.finish:
        popad
        return

.vert:
        get     eax, ebx, TGrid:PosY
        cmp     eax, ecx
        cmova   eax, ecx

        set     ebx, TGrid:PosY, eax
        set     ebx, TGrid:MaxY, ecx
        set     ebx, TGrid:PageY, edx
        jmp     .finish

endp




method TGrid.EventFocusIn
begin
        push    eax
        mov     eax, [.self]
        and     [eax+TGrid._canvas_valid], 0
        exec    eax, TGrid:RectChanged2, 0
        pop     eax
        inherited
        return
endp


method TGrid.EventFocusOut
begin
        push    eax
        mov     eax, [.self]
        and     [eax+TGrid._canvas_valid], 0
        exec    eax, TGrid:RectChanged2, 0
        pop     eax
        inherited
        return
endp


endmodule



Added freshlib/gui/TImageLabel.asm.



























































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TImageLabel object class
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Represents GUI picture or image.
;_________________________________________________________________________________________
module "TImageLabel library"


iaLeft = 0
iaRight = 1
iaCenter = 2
iaStretchH = 3

iaTop = $0
iaBottom = $100
iaMiddle = $200
iaStrechV = $300


object TImageLabel, TCanvasWindow
  ._ImageAlign dd ?
  ._Image      dd ?

  param .ImageAlign, ._ImageAlign, .SetImageAlign       ; image align flags.
  param .Image, ._Image, .SetImage                      ; TImage object

  method .SetImageAlign, .value
  method .SetImage, .value

  method .__RenderView
endobj


method TImageLabel.SetImageAlign
begin
        push    eax

        mov     eax, [.self]
        push    [.value]
        pop     [eax+TImageLabel._ImageAlign]

        and     [eax+TImageLabel._canvas_valid], 0
        exec    [.self], TWindow:RectChanged2, 0
        pop     eax
        return
endp



method TImageLabel.SetImage
begin
        push    eax

        mov     eax, [.self]
        push    [.value]
        pop     [eax+TImageLabel._Image]

        and     [eax+TImageLabel._canvas_valid], 0
        exec    [.self], TWindow:RectChanged2, 0
        pop     eax
        return
endp



method TImageLabel.__RenderView
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TImageLabel._canvas]
        test    edi, edi
        jz      .finish

        mov     ecx, [esi+TImageLabel._width]
        mov     edx, [esi+TImageLabel._height]
        xor     eax, eax

        stdcall DrawSolidRect, edi, eax, eax, ecx, edx, eax    ; clear with transparency.

        mov     eax, [esi+TImageLabel._ImageAlign]
        mov     esi, [esi+TImageLabel._Image]

        test    esi, esi
        jz      .finish

        sub     ecx, [esi+TImage.width]
        sub     edx, [esi+TImage.height]

        cmp     al, iaRight
        je      .x_ok

        cmp     al, iaCenter
        je      .x_center

        xor     ecx, ecx
        jmp     .x_ok

.x_center:
        sar     ecx, 1

.x_ok:
        cmp     ah, iaBottom /256
        je      .y_ok

        cmp     ah, iaMiddle / 256
        je      .y_center

        xor     edx, edx
        jmp     .y_ok

.y_center:
        sar     edx, 1

.y_ok:

        xor     eax, eax
;        stdcall BlendImage, edi, ecx, edx, esi, eax, eax, [esi+TImage.width], [esi+TImage.height]
        stdcall CopyImageRect, edi, ecx, edx, esi, eax, eax, [esi+TImage.width], [esi+TImage.height]

.finish:
        popad
        inherited
        return
endp







endmodule

Added freshlib/gui/TLabel.asm.











































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TLabel object class
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Not finished.
;_________________________________________________________________________________________
module "TLabel library"



object TLabel, TCanvasWindow

; private fields
  ._textalign    dd ?
  ._textcolor    dd ?
  ._background   dd ?
  ._default_colors dd ?

; parameters
  param .TextAlign, ._textalign, .SetTextAlign        ; text align flags.
  param .Color, ._textcolor, .SetColor:2
  param .Background, ._background, .SetColor:2
  param .fDefaultColors, ._default_colors, ._default_colors

; parameter methods
  method .SetColor, .param, .value
  method .SetTextAlign, .value
  method .SetCaption, .value

; other methods
  method .Create, .parent

  method .__RenderView

endobj



method TLabel.Create
begin
        push    eax

        inherited [.parent]

        mov     eax, [.self]
        mov     [eax+TLabel._textalign], dtfAlignLeft or dtfAlignMiddle or dtfCRLF or dtfWordWrap
        mov     [eax+TLabel._default_colors], 1

        pop     eax
        return
endp



method TLabel.SetTextAlign
begin
        push    eax ecx

        mov     eax, [.self]
        mov     ecx, [.value]

        xchg    ecx, [eax+TLabel._textalign]
        cmp     ecx, [eax+TLabel._textalign]
        je      .finish

        xor     ecx, ecx
        and     [eax+TLabel._canvas_valid], ecx
        exec    eax, TWindow:RectChanged2, ecx

.finish:
        pop     ecx eax
        return
endp



method TLabel.SetColor
begin
        push    eax ebx ecx

        mov     eax, [.param]
        mov     ebx, [.self]
        mov     ecx, [.value]

        sub     eax, TLabel.Color

        xchg    ecx, [ebx+TLabel._textcolor+4*eax]
        cmp     ecx, [ebx+TLabel._textcolor+4*eax]
        je      .finish

        xor     ecx, ecx
        and     [ebx+TLabel._canvas_valid], ecx
        exec    ebx, TWindow:RectChanged2, ecx

.finish:
        pop     ecx ebx eax
        return
endp




method TLabel.SetCaption       ;, .value
begin
        inherited [.value]

        push    eax
        mov     eax, [.self]
        and     [eax+TLabel._canvas_valid], 0
        pop     eax
        exec    [.self], TLabel:RectChanged2, 0
        return
endp



method TLabel.__RenderView
 .bounds TBounds
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TLabel._canvas]
        test    edi, edi
        jz      .finish

        xor     edx, edx
        mov     ecx, [esi+TLabel._width]
        mov     eax, [esi+TLabel._height]
        mov     [.bounds.x], edx
        mov     [.bounds.y], edx
        mov     [.bounds.width], ecx
        mov     [.bounds.height], eax

        cmp     [esi+TLabel._default_colors], 0
        cmove   ecx, [esi+TLabel._background]
        cmove   edx, [esi+TLabel._textcolor]
        cmovne  ecx, [GUI.clLabelBk]
        cmovne  edx, [GUI.clLabelTxt]

        lea     eax, [.bounds]
        stdcall [DrawBox], edi, eax, ecx, bxNone, [GUI.boxBorderWidth]

        get     eax, esi, TWindow:Caption
        test    eax, eax
        jz      .finish

        stdcall DrawTextBox, edi, eax, [.bounds.x], [.bounds.y], [.bounds.width], [.bounds.height], 2, [esi+TLabel._textalign], [GUI.DefaultFont], edx
        stdcall StrDel, eax

.finish:
        popad
        return
endp



endmodule

Added freshlib/gui/TListView.asm.





















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842


struct TLvItem
  .captions dd ?         ; pointer to TArray of dword with strings for the item and subitems.
  .icon     dd ?         ; index into ._img_icons
  .data     dd ?         ; user data, attached to the item.
            dd ?         ;

  .shift = 4
ends


lvsTiles   = 0
lvsList    = 1
lvsDetails = 2


object TListView, TGrid

  ._img_icons     dd      ?
  ._items         dd      ?     ; TArray of TLvItem elements.
  ._style         dd      ?
  ._headers       dd      ?     ; TArray of dword with strings, captions of the header.

  param .Icons, ._img_icons, .SetIcons
  param .Style, ._style, .SetStyle
  param .Items, ._items, NONE

  method .Destroy

  method .Resize, .newWidth, .newHeight

  method .GetItem, .index       ; returns pointer to TLvItem

  method .SetIcons, .value
  method .SetStyle, .value
  method .SetVisible, .value

  method .DrawCell, .canvas, .ptrRect, .Col, .Row

  method .InsertItem, .index, .caption, .icon, .data
  method .AddSubItem, .iItem, .strSubitem
  method .RemoveItem, .iItem
  method .Clear
  method .Sort, .icolumn

  method .AddHeader, .hString
  method .ClearHeaders

  method .ArangeItems

endobj


interface TListView.OnFocusChange, .pListView, .x, .y, .fFocused


method TListView.Destroy
begin
        push    eax
        get     eax, [.self], TListView:Icons
        stdcall DestroyImage, eax

        exec    [.self], TListView:Clear
        exec    [.self], TListView:ClearHeaders

        pop     eax
        inherited
        return
endp


method TListView.Resize
begin
        inherited [.newWidth], [.newHeight]
        exec      [.self], TListView:ArangeItems
        return
endp



method TListView.AddHeader      ; .hString
begin
        pushad
        mov     esi, [.self]
        mov     edx, [esi+TListView._headers]
        test    edx, edx
        jnz     .array_ok

        stdcall CreateArray, 4
        mov     edx, eax

.array_ok:
        stdcall AddArrayItems, edx, 1
        mov     [esi+TListView._headers], edx
        mov     edx, eax

        stdcall StrDup, [.hString]
        mov     [edx], eax

        popad
        return
endp



method TListView.ClearHeaders
begin
        push    eax edx
        mov     edx, [.self]
        xor     eax, eax
        xchg    eax, [edx+TListView._headers]

        stdcall ListFree, eax, StrDel
        pop     edx eax
        return
endp



method TListView.GetItem  ; .index
begin
        pushad
        mov     esi, [.self]
        get     ebx, esi, TListView:Items
        test    ebx, ebx
        jz      .notfound

        mov     ecx, [.index]

        cmp     ecx, [ebx+TArray.count]
        jae     .notfound

        shl     ecx, TLvItem.shift
        lea     eax, [ebx+TArray.array+ecx]
        mov     [esp+4*regEAX], eax

        clc
        popad
        return

.notfound:
        stc
        popad
        return
endp



method TListView.SetIcons       ; .value
begin
        push    esi eax
        mov     esi, [.self]

        stdcall CreateImagePNG, [.value], -1
        jc      .finish

        xchg    eax, [esi+TListView._img_icons]
        stdcall DestroyImage, eax

        xor     eax, eax
        and     [esi+TListView._canvas_valid], eax
        exec    esi, TListView:RectChanged2, eax

.finish:
        pop     eax esi
        return
endp




method TListView.SetStyle       ; .value
begin
        pushad
        mov     esi, [.self]

        mov     eax, [.value]
        xchg    eax, [esi+TListView._style]
        cmp     eax, [esi+TListView._style]
        je      .finish

        exec    [.self], TListView:ArangeItems
        exec    [.self], TListView:ForceRefresh

.finish:
        popad
        return
endp


method TListView.SetVisible
begin
        inherited [.value]

        cmp       [.value], 0
        je        .finish

        push    eax esi
        mov     esi, [.self]

        exec    esi, TListView:ArangeItems

        xor     eax, eax
        mov     [esi+TListView._canvas_valid], eax
        exec    esi, TListView:RectChanged2, eax
        pop     esi eax

.finish:
        return
endp



method  TListView.DrawCell      ; .canvas, .ptrRect, .Col, .Row
.sel RECT
begin
        pushad

        mov     edx, [.self]

        mov     ecx, cellFixed
        mov     esi, [.Col]
        mov     edi, [.Row]
        cmp     esi, [edx+TListView._FixedCols]
        jl      .status_ok
        cmp     edi, [edx+TListView._FixedRows]
        jl      .status_ok

        cmp     edi, [edx+TListView._focused.y]
        jne     .is_selected

        test    [edx+TListView._flags], gfRowFocus
        jnz     .focused

        cmp     esi, [edx+TListView._focused.x]
        jne     .is_selected

.focused:
        mov     ecx, cellFocused
        cmp     edx, [__FocusedWindow]
        je      .status_ok

        mov     ecx, cellFocused2
        jmp     .status_ok

.is_selected:
        lea     ecx, [edx+TListView.selection]
        lea     eax, [.sel]
        stdcall RectCopy, eax, ecx
        stdcall RectSort, eax
        inc     [eax+RECT.right]
        inc     [eax+RECT.bottom]

        mov     ecx, cellSelected
        stdcall PointInRect, eax, esi, edi
        jc      .status_ok

        mov     ecx, cellRegular

.status_ok:
        mov     eax, [edx+TListView._style]
        and     eax, 3 ;(0..3)

        mov     ebx, [.Row]
        sub     ebx, [edx+TListView._FixedRows]
        cmovl   ebx, [edx+TListView._headers]
        jl      .drawit

        mov     edi, [edx+TListView._items]
        test    edi, edi
        jz      .finish

        cmp     ebx, [edi+TArray.count]
        jae     .finish

        shl     ebx, TLvItem.shift
        lea     ebx, [edi+ebx+TArray.array]

.drawit:
        get     edx, edx, TListView:Font
        test    edx, edx
        cmovz   edx, [GUI.DefaultFont]
        stdcall [__lv_draw_proc+4*eax], [.canvas], [.ptrRect], ebx, [.Col], ecx, edx         ; ebx can be pointer to TLvItem or string handle.

.finish:
        popad
        return
endp



method TListView.Clear
begin
        pushad

        mov     esi, [.self]

        xor     edx, edx
        xchg    edx, [esi+TListView._items]

        test    edx, edx
        jz      .finish

        mov     ecx, [edx+TArray.count]
        lea     edi, [edx+TArray.array]

.loop:
        dec     ecx
        js      .free_array

        stdcall ListFree, [edi+TLvItem.captions], StrDel
        add     edi, sizeof.TLvItem
        jmp     .loop

.free_array:
        stdcall FreeMem, edx

        or      eax, -1
        mov     [esi+TListView._focused.x], eax
        mov     [esi+TListView._focused.y], eax
        mov     [esi+TListView.selection.left], eax
        mov     [esi+TListView.selection.top], eax
        mov     [esi+TListView.selection.right], eax
        mov     [esi+TListView.selection.bottom], eax

        xor     eax, eax
        mov     [esi+TListView._canvas_valid], eax
        mov     [esi+TListView.ColCount], eax
        mov     [esi+TListView.RowCount], eax

        exec    esi, TListView:RectChanged2, eax

.finish:
        popad
        return
endp



; In success returns:
;    eax - the index of the element inserted. It can differs from the [.index] argument.
;    edx - a pointer to the TLvItem inserted.

method TListView.InsertItem     ; .index, .caption, .icon, .data
begin
        pushad
        mov     esi, [.self]
        mov     edx, [esi+TListView._items]

        test    edx, edx
        jnz     @f
        stdcall CreateArray, sizeof.TLvItem
        jc      .finish
        mov     edx, eax
@@:

        stdcall InsertArrayItems, edx, [.index], 1
        jc      .finish

        mov     [esi+TListView._items], edx
        mov     edi, eax

        stdcall CreateArray, 4
        stdcall AddArrayItems, eax, 1
        mov     [edi+TLvItem.captions], edx
        mov     edx, eax

        stdcall StrDup, [.caption]
        mov     [edx], eax

        mov     eax, [.icon]
        mov     ecx, [.data]
        mov     [edi+TLvItem.icon], eax
        mov     [edi+TLvItem.data], ecx

        cmp     [esi+TListView._visible], FALSE
        je      .return

        exec    esi, TListView:ArangeItems

        xor     eax, eax
        mov     [esi+TListView._canvas_valid], eax
        exec    esi, TListView:RectChanged2, eax

.return:
        mov     [esp+4*regEDX], edi        ;

        mov     eax, [esi+TListView._items]
        lea     eax, [eax+TArray.array]
        sub     edi, eax
        shr     edi, TLvItem.shift      ; the index of the inserted element
        mov     [esp+4*regEAX], edi

        clc

.finish:
        popad
        return
endp



method TListView.AddSubItem     ; .iItem, .strSubitem
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TListView._items]
        mov     ecx, [.iItem]
        cmp     ecx, [edi+TArray.count]
        jae     .error

        shl     ecx, TLvItem.shift
        lea     edi, [edi + TArray.array + ecx]

        mov     edx, [edi+TLvItem.captions]
        stdcall AddArrayItems, edx, 1
        jc      .error

        mov     [edi+TLvItem.captions], edx
        mov     edx, eax

        stdcall StrDup, [.strSubitem]
        mov     [edx], eax

        clc
        popad
        return

.error:
        stc
        popad
        return
endp




method TListView.RemoveItem
begin
        pushad
        mov     esi, [.self]

        mov     edi, [esi+TListView._items]
        mov     ecx, [.iItem]
        cmp     ecx, [edi+TArray.count]
        jae     .error

        shl     ecx, TLvItem.shift
        lea     ebx, [edi + TArray.array + ecx]

        stdcall ListFree, [ebx+TLvItem.captions], StrDel
        stdcall DeleteArrayItems, edi, [.iItem], 1
        mov     [esi+TListView._items], edx

        mov     eax, [esi+TListView._focused.y]
        cmp     eax, [edx+TArray.count]
        cmova   eax, [edx+TArray.count]
        mov     [esi+TListView._focused.y], eax

        exec    esi, TListView:ArangeItems

        xor     eax, eax
        mov     [esi+TListView._canvas_valid], eax
        exec    esi, TListView:RectChanged2, eax

        clc
        popad
        return

.error:
        stc
        popad
        return
endp




method TListView.ArangeItems
begin
        push    eax
        mov     eax, [.self]

        mov     eax, [eax+TListView._style]
        and     eax, 3 ;(0..3)

        stdcall [__lv_count_proc+4*eax], [.self]

        pop     eax
        return
endp


iglobal
  if used __lv_count_proc
    __lv_count_proc dd __LVTileCount, __LVListCount, __LVDetailsCount, 0
  end if

  if used __lv_draw_proc
    __lv_draw_proc dd  __LVTileDraw, __LVListDraw, __LVDetailsDraw, 0
  end if
endg


proc __LVTileCount, .self
begin

        return
endp



proc __LVListCount, .self
begin
        pushad

        stdcall GetFontMetrics, [GUI.DefaultFont]
        mov     ebx, eax

        mov     esi, [.self]

        xor     ecx, ecx
        mov     edx, [esi+TListView._items]
        test    edx, edx
        jz      .set_count

        mov     ecx, [edx+TArray.count]

.set_count:
        exec    esi, TListView:SetCounts, 1, ecx

        get     eax, esi, TListView:width
        sub     eax, [GUI.boxBorderWidth]
        sub     eax, [GUI.boxBorderWidth]
        exec    esi, TListView:SetColWidth, 0, eax

        test    ecx, ecx
        jz      .finish

; height:
        lea     edi, [edx+TArray.array]

.loop:
        dec     ecx
        js      .end_loop

        mov     eax, [edi+TLvItem.icon]
        test    eax, eax
        jz      .next

        cmp     ebx, [eax+TImage.height]
        cmovb   ebx, [eax+TImage.height]

.next:
        add     edi, sizeof.TLvItem
        jmp     .loop

.end_loop:
        add     ebx, [GUI.lvIconMargin]
        add     ebx, [GUI.lvIconMargin]

        mov     [esi+TListView.RowHeight], ebx
        set     esi, TListView:StepY, ebx

        mov     eax, [edx+TArray.count]
        dec     eax
        exec    esi,  TListView:SetRowsHeight, 0, eax, ebx

.finish:
        popad
        return
endp




proc __LVDetailsCount, .self
begin
        pushad

        stdcall GetFontMetrics, [GUI.DefaultFont]
        mov     ebx, eax

        mov     esi, [.self]

        xor     edi, edi        ; columns count
        inc     edi
        mov     edx, [esi+TListView._headers]
        test    edx, edx
        jz      .columns_ok

        mov     edi, [edx+TArray.count]
        test    edi, edi
        jnz     .columns_ok

        inc     edi

.columns_ok:
        xor     ecx, ecx
        mov     edx, [esi+TListView._items]
        test    edx, edx
        jz      .set_count

        mov     ecx, [edx+TArray.count]

.set_count:
        push    edx

        get     eax, esi, TListView:width
        sub     eax, [GUI.boxBorderWidth]
        sub     eax, [GUI.boxBorderWidth]

        sar     eax, 1
        xor     edx, edx

        dec     edi
        jz      @f
        div     edi     ; column_count-1
@@:
        inc     edi
        pop     edx

        mov     [esi+TListView.ColWidth], eax
        set     esi, TListView:StepX, eax

        add     ecx, [esi+TListView._FixedRows]
        exec    esi, TListView:SetCounts, edi, ecx

        dec     edi
        exec    esi, TListView:SetColumnsWidth, 0, edi, [esi+TListView.ColWidth]

        imul    edi, [esi+TListView.ColWidth]

        get     eax, esi, TListView:width
        sub     eax, [GUI.boxBorderWidth]
        sub     eax, [GUI.boxBorderWidth]

        sub     eax, edi
        exec    esi, TListView:SetColWidth, 0, eax

        cmp     ecx, 1
        jbe     .finish

;.height:
        lea     edi, [edx+TArray.array]

.loop:
        dec     ecx
        jz      .end_loop

        mov     eax, [edi+TLvItem.icon]
        test    eax, eax
        jz      .next

        cmp     ebx, [eax+TImage.height]
        cmovb   ebx, [eax+TImage.height]

.next:
        add     edi, sizeof.TLvItem
        jmp     .loop

.end_loop:
        mov     eax, [GUI.lvIconMargin]
        lea     ebx, [ebx+2*eax]

        mov     [esi+TListView.RowHeight], ebx
        set     esi, TListView:StepY, ebx

        mov     eax, [edx+TArray.count]
        dec     eax
        exec    esi,  TListView:SetRowsHeight, 0, eax, ebx

.finish:
        popad
        return
endp




proc __LVTileDraw, .canvas, .ptrRect, .pItem, .iSubitem, .sel, .font
begin
        return
endp



proc __LVListDraw, .canvas, .ptrRect, .pItem, .iSubitem, .sel, .font
begin

        pushad

        mov     esi, [.pItem]
        mov     edi, [.ptrRect]
        mov     ecx, [edi+RECT.left]
        mov     edx, [edi+RECT.top]
        mov     ebx, [esi+TLvItem.icon]
        test    ebx, ebx
        jz      .icon_ok

        mov     eax, [edi+RECT.bottom]
        sub     eax, [edi+RECT.top]
        stdcall DrawSolidRect, [.canvas], ecx, edx, [ebx+TImage.wrapW], eax, [GUI.clGridCellBk]

        mov     eax, ecx
        add     eax, [GUI.lvIconMargin]
        add     edx, [GUI.lvIconMargin]

        stdcall BlendImage, [.canvas], eax, edx, ebx, 0, 0, [ebx+TImage.wrapW], [ebx+TImage.wrapH]

        add     ecx, [ebx+TImage.wrapW]
        add     ecx, [GUI.lvIconMargin]

.icon_ok:
        add     ecx, [GUI.lvIconMargin]
        mov     eax, [edi+RECT.right]
        mov     edx, [edi+RECT.bottom]

        sub     eax, ecx
        sub     edx, [edi+RECT.top]

        mov     ebx, [.sel]
        mov     esi, [esi+TLvItem.captions]
        stdcall DrawTextBox, [.canvas], [esi+TArray.array], ecx, [edi+RECT.top], eax, edx, 0, dtfAlignLeft or dtfSingleLine or dtfAlignMiddle, [GUI.DefaultFont], [GUI.clGridCellTxt + 4*ebx]
        popad
        return
endp



proc __LVDetailsDraw, .canvas, .ptrRect, .pItem, .iSubitem, .sel, .font
.draw_flags dd ?
begin
        pushad

        mov     esi, [.pItem]
        mov     edi, [.ptrRect]

        mov     [.draw_flags], dtfAlignCenter or dtfSingleLine or dtfAlignMiddle

        mov     eax, [edi+RECT.left]
        mov     ecx, eax

        cmp     [.sel], cellFixed
        je      .draw_text_from_array   ; in this case, pItem is an array with the header strings.

        mov     [.draw_flags], dtfAlignLeft or dtfSingleLine or dtfAlignMiddle

        cmp     [.iSubitem], 0
        je      .draw_icon

        mov     [.draw_flags], dtfAlignLeft or dtfSingleLine or dtfAlignMiddle
        jmp     .icon_ok

.draw_icon:
        mov     edx, [edi+RECT.top]
        mov     ebx, [esi+TLvItem.icon]
        test    ebx, ebx
        jz      .icon_ok

        add     eax, [GUI.lvIconMargin]
        add     edx, [GUI.lvIconMargin]

        stdcall BlendSolidRect, [.canvas], eax, edx, [ebx+TImage.wrapW], [ebx+TImage.wrapH], $c0ffffff;[GUI.clGridCellBk]
        stdcall BlendImage, [.canvas], eax, edx, ebx, 0, 0, [ebx+TImage.wrapW], [ebx+TImage.wrapH]

        add     ecx, [ebx+TImage.wrapW]
        add     ecx, [GUI.lvIconMargin]

.icon_ok:
        add     ecx, [GUI.lvIconMargin]
        mov     esi, [esi+TLvItem.captions]

.draw_text_from_array:
        test    esi, esi
        jz      .finish

        mov     eax, [.iSubitem]
        cmp     eax, [esi+TArray.count]
        jae     .finish

        mov     esi, [esi+TArray.array+4*eax]         ; string handle of the cell content.

        mov     eax, [edi+RECT.right]
        mov     edx, [edi+RECT.bottom]

        sub     eax, ecx
        sub     eax, [GUI.lvIconMargin]
        sub     eax, [GUI.lvIconMargin]
        sub     edx, [edi+RECT.top]

        mov     ebx, [.sel]
        stdcall DrawTextBox, [.canvas], esi, ecx, [edi+RECT.top], eax, edx, 0, [.draw_flags], [.font], [GUI.clGridCellTxt + 4*ebx]

.finish:
        popad
        return
endp






method TListView.Sort
begin
        push    eax

        mov     eax, [.self]
        cmp     [eax+TListView._items], 0
        je      .finish
        
        stdcall SortArray, [eax+TListView._items], __CompareLvItems, [.icolumn]
        exec    eax, TListView:ForceRefresh

.finish:
        pop     eax
        return
endp



proc __CompareLvItems as CompareProc
begin
        pushad

        mov     esi, [.pElement1]
        mov     edi, [.pElement2]

        mov     ebx, [esi+TLvItem.captions]
        mov     edx, [edi+TLvItem.captions]

        mov     ecx, [.param]

        stdcall StrCompSort2, [ebx+TArray.array+4*ecx], [edx+TArray.array+4*ecx], FALSE
        shl     eax, 1

        popad
        return
endp

Added freshlib/gui/TMenu.asm.

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TMenu object class
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Represents main menu or popup menu objects.
;_________________________________________________________________________________________
module "TMenu library"

; menu item types for the menu templates.

mitSeparator = 0
mitAction    = 1
mitSubmenu   = 2
mitString    = 3        ; contains simple text string can't have accelerator and icons.



struct TMenuItem
  .type   dd ?
  .item   dd ?    ; different for the different types of items: NULL, pointer to TAction, pointer to TMenu, handle of string.
  .itemID dd ?    ; user assigned ID
  .height dd ?
ends


mitEnd = $80


macro MenuTemplate name {

  macro action actvar, id \{
    \local ..sz, ..beg
    ..beg = $
    db ..sz
    db mitAction
    dd actvar
    if ~id eq
      dd id
    else
      dd 0
    end if
    ..sz = $-..beg
  \}

  macro submenu text, id \{
    \local ..sz, ..beg, ..lbl
    ..beg = $
    db ..sz
    db mitSubmenu
    if ~id eq
      dd id
    else
      dd 0
    end if
    ..lbl db text, 0
    ..sz = $-..beg
  \}

  macro text txt, id \{
    \local ..sz, ..beg, ..lbl
    ..beg = $
    db ..sz
    db mitString
    if ~id eq
      dd id
    else
      dd 0
    end if
    ..lbl db txt, 0
    ..sz = $-..beg
  \}

  macro separator \{
    db 2
    db mitSeparator
  \}

  macro endsub \{
    db 2
    db mitEnd
  \}

  label name byte
}


macro EndMenu {
  endsub
  purge action
  purge submenu
  purge text
  purge separator
  purge endsub
}



object TMenu, TCanvasWindow
  ._p_items   dd ?
  ._selected  dd ?
  .__caller   dd ?

  .__icon_size dd ?

  ._ActiveSubmenu dd ?

  ._onstring    dd ?
  ._beforeshow  dd ?

  param .OnString, ._onstring, ._onstring
  param .BeforeShow, ._beforeshow, ._beforeshow

  param .Selected, ._selected, .SetSelected
  param .Items, ._p_items, .SetItems

  method .SetSelected, .value
  method .SetItems, .menu_template
  method .SetVisible, .value

  method .AddItem, .Type, .Item, .itemID
  method .InsertItem, .Type, .Item, .itemID, .position
  method .DeleteItem, .item_index

  method .SetAction, .value
  method .UpdateAction, .action

  method .__RenderView

  method .Create, .Parent
  method .Destroy

  method .Show, .parent, .x, .y

  method .ExecuteItem, .iItem
  method .HideAll

  method .EventButtonPress, .button, .kbdState, .x, .y
  method .EventMouseMove, .x, .y, .kbdState
  method .EventKeyPress, .utf8, .scancode, .kbdState

endobj


interface TMenu.OnString, .self, .item
interface TMenu.BeforeShow, .self


method TMenu.Create
begin
        inherited 0

        stdcall CreateArray, sizeof.TMenuItem
        push    eax

        mov     eax, [.self]
        pop     [eax+TMenu._p_items]

        set     eax, TMenu:WantFocus, FALSE
        mov     [eax+TMenu._selected], -1

        set     [.self], TWindow:border, borderNone
        return
endp


method TMenu.Destroy
begin
        pushad
        mov     esi, [.self]
        mov     edx, [esi+TMenu._p_items]
        mov     ecx, [edx+TArray.count]
        lea     edx, [edx+TArray.array]

.loop:
        dec     ecx
        js      .end_loop

        mov     eax, [edx+TMenuItem.type]

        cmp     eax, mitSeparator
        je      .next

        cmp     eax, mitSubmenu
        je      .submenu

        cmp     eax, mitAction
        je      .action

        cmp     eax, mitString
        je      .string

.next:
        add     edx, sizeof.TMenuItem
        jmp     .loop

.submenu:
        destroy [edx+TMenuItem.item]
        jmp     .next

.string:
        stdcall StrDel, [edx+TMenuItem.item]
        jmp     .next

.action:
        exec    [edx+TMenuItem.item], TAction:Detach, esi
        jmp     .next

.end_loop:
        stdcall FreeMem, [esi+TMenu._p_items]
        popad
        inherited
        return
endp



method TMenu.SetItems
begin
        pushad




        popad
        return
endp


method TMenu.AddItem
begin
        pushad

        mov     esi, [.self]
        mov     edx, [esi+TMenu._p_items]

        stdcall AddArrayItems, edx, 1
        mov     [esi+TMenu._p_items], edx

        pushd   [.Type]
        pushd   [.Item]
        pushd   [.itemID]
        popd    [eax+TMenuItem.itemID]
        popd    [eax+TMenuItem.item]
        popd    [eax+TMenuItem.type]

        mov     [eax+TMenuItem.height], 10

        cmp     [eax+TMenuItem.type], mitAction
        jne     .action_ok

        exec    [eax+TMenuItem.item], TAction:Attach, [.self]

.action_ok:
        popad
        return
endp


method TMenu.InsertItem
begin
        pushad

        mov     esi, [.self]
        mov     edx, [esi+TMenu._p_items]

        stdcall InsertArrayItems, edx, [.position], 1
        mov     [esi+TMenu._p_items], edx

        pushd   [.Type]
        pushd   [.Item]
        pushd   [.itemID]
        popd    [eax+TMenuItem.itemID]
        popd    [eax+TMenuItem.item]
        popd    [eax+TMenuItem.type]

        mov     [eax+TMenuItem.height], 10

        cmp     [eax+TMenuItem.type], mitAction
        jne     .action_ok

        exec    [eax+TMenuItem.item], TAction:Attach, [.self]

.action_ok:
        popad
        return
endp


method TMenu.DeleteItem
begin
        pushad

        mov     esi, [.self]
        mov     edx, [esi+TMenu._p_items]
        stdcall GetArrayItem, edx, [.item_index]
        jc      .finish

        cmp     [eax+TMenuItem.type], mitAction
        jne     .action_ok

        exec    [eax+TMenuItem.item], TAction:Detach, esi

.action_ok:
        cmp     [eax+TMenuItem.type], mitSubmenu
        jne     .submenu_ok

        destroy [eax+TMenuItem.item]
        jmp     .delete_item

.submenu_ok:
        cmp     [eax+TMenuItem.type], mitString
        jne     .delete_item

        stdcall StrDel, [eax+TMenuItem.item]

.delete_item:
        stdcall DeleteArrayItems, edx, [.item_index], 1
        clc

.finish:
        popad
        return
endp






; TMenu does not support actions to the menu.

method TMenu.SetAction
begin
        push    eax
        mov     eax, [.self]
        mov     [eax+TMenu.__action], 0
        pop     eax
        return
endp


method TMenu.UpdateAction ; .action
begin
        exec    [.self], TMenu:ForceRefresh
        return
endp



method TMenu.SetVisible ;

.maxW dd ?
.sumH dd ?
.str  dd ?

begin
        pushad

        mov     esi, [.self]

        mov     eax, [.value]
        cmp     eax, [esi+TMenu._visible]
        je      .finish

        test    eax, eax
        jz      .switch_off

        get     edi, esi, TMenu:Items

        mov     ecx, [edi+TArray.count]
        test    ecx, ecx
        jnz     .compute_width

        stdcall GetTextBounds, "Empty menu", 10, [GUI.DefaultFont]
        add     eax, 20
        jmp     .set_width


.compute_width:
; first scan for the icon height

        lea     edx, [edi+TArray.array-sizeof.TMenuItem]
        mov     [esi+TMenu.__icon_size], 0

.loop_icon:
        add     edx, sizeof.TMenuItem
        dec     ecx
        js      .height_ok

        cmp     [edx+TMenuItem.type], mitAction
        jne     .loop_icon

        get     eax, [edx+TMenuItem.item], TAction:Icon
        test    eax, eax
        jz      .loop_icon

        mov     eax, [eax+TImage.height]
        cmp     eax, [esi+TMenu.__icon_size]
        cmovb   eax, [esi+TMenu.__icon_size]
        mov     [esi+TMenu.__icon_size], eax
        jmp     .loop_icon

.height_ok:
        mov     ecx, [edi+TArray.count]
        lea     edi, [edi+TArray.array-sizeof.TMenuItem]        ; edi points to the current TMenuItem

        xor     eax, eax
        mov     [.maxW], eax                    ; the width of the menu window
        mov     [.sumH], eax                    ; the total height of the menu window

.loop:
        add     edi, sizeof.TMenuItem
        dec     ecx
        js      .end_width

        cmp     [edi+TMenuItem.type], mitSeparator
        je      .separator

        cmp     [edi+TMenuItem.type], mitAction
        je      .action

        cmp     [edi+TMenuItem.type], mitSubmenu
        je      .submenu

; it is string.

        stdcall StrDup, [edi+TMenuItem.item]
        push    eax
        jmp     .str_width

.separator:

        mov     edx, [GUI.menuSeparatorHeight]
        jmp     .set_height

.submenu:
        get     eax, [edi+TMenuItem.item], TMenu:Caption
        push    eax

        stdcall StrCat, eax, txt "  >"
        jmp     .str_width


.action:
        get     eax, [edi+TMenuItem.item], TAction:Accelerator
        push    eax

        get     edx, [edi+TMenuItem.item], TAction:Caption
        stdcall StrCat, eax, edx
        stdcall StrDel, edx


.str_width:
        stdcall StrPtr, eax
        stdcall GetTextBounds, eax, [eax+string.len], [GUI.DefaultFont]

        stdcall StrDel ; from the stack

        cmp     eax, [.maxW]
        jbe     .comp_height

        mov     [.maxW], eax

.comp_height:

        mov     eax, [esi+TMenu.__icon_size]
        add     eax, [GUI.menuIconMargin]
        add     edx, [GUI.menuIconMargin]       ; edx = height

        cmp     edx, eax
        cmovb   edx, eax

.set_height:
        mov     [edi+TMenuItem.height], edx
        add     [.sumH], edx

        jmp     .loop

.end_width:

; here compute the size of the menu and set .width and .height fields.

        mov     edx, [GUI.iconMenuChecked]
        mov     eax, [edx+TImage.width]
        add     eax, [esi+TMenu.__icon_size]

        add     eax, [.maxW]
        add     eax, [GUI.menuMinTextDist]

        mov     edx, [GUI.menuIconMargin]
        lea     edx, [3*edx]
        add     eax, edx
        mov     edx, [GUI.boxBorderWidth]
        lea     eax, [eax+2*edx]


.set_width:
        set     esi, TWindow:width, eax

        mov     edx, [.sumH]
        mov     eax, [GUI.boxBorderWidth]
        lea     edx, [edx+2*eax]

        mov     eax, [GUI.menuIconMargin]
        lea     edx, [edx+2*eax]

        set     esi, TWindow:height, edx

.finish:
        popad
        inherited [.value]
        return


.switch_off:
; close the active submenu if any
        xor     ecx, ecx
        xchg    ecx, [esi+TMenu._ActiveSubmenu]
        test    ecx, ecx
        jz      .submenu_ok

        set     ecx, TMenu:Visible, FALSE

.submenu_ok:
        xor     ecx, ecx
        mov     eax, [esi+TMenu.__caller]
        test    eax, eax
        jz      .set_active

        istype  eax, TMenu
        cmove   ecx, eax
        je      .set_active

.set_active:
        stdcall SetMouseCapture, ecx
        mov     [__ActiveMenu], ecx
        jmp     .finish

endp



method TMenu.__RenderView

.bounds TBounds

.y    dd ?
.ytxt dd ?
.xTxt dd ?
.clTxt dd ?

.txtline dd ?
.ascender dd ?

.count dd ?

.canvas dd ?

; item parameters, depend on the item type.

.text    dd ?
.accel   dd ?
.icon    dd ?
.check   dd ?
.enabled dd ?
.subicon dd ?

begin
        pushad
        mov     esi, [.self]

;        exec    esi, TMenu:__UpdateCanvas

        mov     ebx, [esi+TMenu._canvas]
        mov     [.canvas], ebx
        test    ebx, ebx
        jz      .end_loop

        xor     eax, eax
        mov     [.bounds.x], eax
        mov     [.bounds.y], eax

        mov     eax, [esi+TWindow._width]
        mov     ecx, [esi+TWindow._height]
        mov     [.bounds.width], eax
        mov     [.bounds.height], ecx

        lea     eax, [.bounds]
        stdcall [DrawBox], [.canvas], eax, [GUI.clMenuBack], [GUI.borderMenu], [GUI.boxBorderWidth]

        get     edi, esi, TMenu:Items
        test    edi, edi
        jz      .end_loop


; compute the text base line.

        stdcall GetFontMetrics, [GUI.DefaultFont]
        mov     [.txtline], eax
        lea     ebx, [2*ebx]
        mov     [.ascender], ebx

        mov     ecx, [GUI.boxBorderWidth]
        add     ecx, [GUI.menuIconMargin]
        mov     [.y], ecx

        mov     ecx, [GUI.menuIconMargin]
        lea     ecx, [3*ecx]
        mov     eax, [esi+TMenu.__icon_size]

        add     ecx, eax
        add     ecx, [GUI.boxBorderWidth]

        mov     eax, [GUI.iconMenuChecked]
        add     ecx, [eax+TImage.width]

        mov     [.xTxt], ecx

        mov     ecx, [edi+TArray.count]
        lea     edi, [edi+TArray.array]

        mov     [.count], ecx

        xor     ecx, ecx
        dec     ecx

.loop:
        inc     ecx
        cmp     ecx, [.count]
        jae     .end_loop

        mov     eax, [edi+TMenuItem.type]

        cmp     eax, mitSeparator
        je      .draw_separator

        cmp     eax, mitAction
        je      .action

        cmp     eax, mitSubmenu
        je      .submenu

        cmp     eax, mitString
        jne     .next_item

.string:
        stdcall StrDup, [edi+TMenuItem.item]
        mov     [.text], eax

        xor     eax, eax
        mov     [.accel], eax
        mov     [.icon], eax
        mov     [.check], eax
        mov     [.subicon], eax
        inc     eax
        mov     [.enabled], eax
        jmp     .draw_background

.submenu:
        get     eax, [edi+TMenuItem.item], TMenu:Caption
        mov     [.text], eax

        get     eax, [edi+TMenuItem.item], TMenu:Enabled
        mov     [.enabled], eax

        mov     ebx, [GUI.menuSubIconGray]
        test    eax, eax
        jz      @f

        mov     ebx, [GUI.menuSubIcon]

        cmp     ecx, [esi+TMenu._selected]
        jne     @f
        mov     ebx, [GUI.menuSubIconSel]

@@:
        mov     [.subicon], ebx

        xor     eax, eax
        mov     [.icon], eax
        mov     [.check], eax
        mov     [.accel], eax
        jmp     .draw_background


.action:
        mov     [.subicon], 0

        get     eax, [edi+TMenuItem.item], TAction:Caption
        mov     [.text], eax

        get     eax, [edi+TMenuItem.item], TAction:Accelerator
        mov     [.accel], eax

        get     eax, [edi+TMenuItem.item], TAction:Enabled
        mov     [.enabled], eax

        get     eax, [edi+TMenuItem.item], TAction:Icon
        mov     [.icon], eax

        get     eax, [edi+TMenuItem.item], TAction:Checked
        mov     [.check], eax
        jmp     .draw_background


.draw_separator:
        mov     eax, [.bounds.x]
        mov     ebx, [.bounds.width]
        mov     edx, [GUI.menuIconMargin]
        add     eax, edx
        sub     ebx, edx
        sub     ebx, edx

        mov     edx, [edi+TMenuItem.height]
        add     edx, [.y]
        add     edx, [.y]
        sar     edx, 1

        stdcall DrawSolidRect, [.canvas], eax, edx, ebx, 1, [GUI.clBorderDark]
        inc     edx
        stdcall DrawSolidRect, [.canvas], eax, edx, ebx, 1, [GUI.clBorderLight]
        jmp     .next_item


; draw the background
.draw_background:
        cmp     ecx, [esi+TMenu._selected]
        jne     .selected_ok

        cmp     [.enabled], 0
        je      .selected_ok

        mov     eax, [.bounds.x]
        mov     edx, [.bounds.width]

        add     eax, [GUI.boxBorderWidth]
        sub     edx, [GUI.boxBorderWidth]
        sub     edx, [GUI.boxBorderWidth]

        stdcall DrawSolidRect, [.canvas], eax, [.y], edx, [edi+TMenuItem.height], [GUI.clMenuSelection]

        mov     ebx, [.icon]
        test    ebx, ebx
        jz      .selected_ok

        mov     edx, [ebx+TImage.width]
        add     edx, [GUI.menuIconMargin]

        mov     ebx, [GUI.iconMenuChecked]
        add     eax, [ebx+TImage.width]

        mov     ebx, [GUI.menuIconMargin]
        add     eax, ebx
        shr     ebx, 1
        add     eax, ebx

        stdcall DrawSolidRect, [.canvas], eax, [.y], edx, [edi+TMenuItem.height], [GUI.clMenuSelIcon]

.selected_ok:

; draw the icon

        cmp     [.icon], 0
        je      .icon_ok

        mov     ebx, [GUI.iconMenuChecked]
        mov     eax, [ebx+TImage.width]

        add     eax, [GUI.menuIconMargin]
        add     eax, [GUI.menuIconMargin]
        add     eax, [GUI.boxBorderWidth]       ; x-coordinate

        mov     ebx, [.icon]
        test    ebx, ebx
        jz      .icon_ok

        mov     edx, [edi+TMenuItem.height]
        sub     edx, [ebx+TImage.height]
        add     edx, [.y]
        add     edx, [.y]
        sar     edx, 1

        stdcall BlendImage, [.canvas], eax, edx, ebx, 0, 0, [ebx+TImage.width], [ebx+TImage.height]

.icon_ok:

; draw the checkbox

        cmp     [.check], 0
        je      .draw_text

        mov     eax, [GUI.menuIconMargin]
        add     eax, [GUI.boxBorderWidth]

        mov     ebx, [GUI.iconMenuChecked]

        cmp     [.enabled], 0
        jne     .check_ok

        mov     ebx, [GUI.iconMenuCheckedGray]

.check_ok:
        mov     edx, [edi+TMenuItem.height]
        sub     edx, [ebx+TImage.height]
        add     edx, [.y]
        add     edx, [.y]
        sar     edx, 1

        stdcall BlendImage, [.canvas], eax, edx, ebx, 0, 0, [ebx+TImage.width], [ebx+TImage.height]


.draw_text:

        mov     eax, [GUI.clMenuTextGray]

        cmp     [.enabled], 0
        je      .txt_color_ok

        mov     eax, [GUI.clMenuText]

        cmp     ecx, [esi+TMenu._selected]
        jne     .txt_color_ok

        mov     eax, [GUI.clEditSelTxt]

.txt_color_ok:
        mov     [.clTxt], eax

        push    eax
        push    [GUI.DefaultFont]

        mov     eax, [edi+TMenuItem.height]
        sub     eax, [.txtline]
        add     eax, [.ascender]
        sar     eax, 1
        add     eax, [.y]
        mov     [.ytxt], eax

        push    eax
        pushd   [.xTxt]

        stdcall StrLen, [.text]
        push    eax

        stdcall StrPtr, [.text]

        stdcall DrawString, [.canvas], eax    ; remaining from the stack

        stdcall StrDel, [.text]

; draw the submenu arrow
        mov     ebx, [.subicon]
        test    ebx, ebx
        jz      .draw_accelerator

        mov     eax, [.bounds.width]
        sub     eax, [ebx+TImage.width]
        sub     eax, [GUI.menuIconMargin]

        mov     edx, [edi+TMenuItem.height]
        sub     edx, [ebx+TImage.height]
        add     edx, [.y]
        add     edx, [.y]
        sar     edx, 1

        stdcall BlendImage, [.canvas], eax, edx, ebx, 0, 0, [ebx+TImage.width], [ebx+TImage.height]
        jmp     .next_item

; draw the accelerator
.draw_accelerator:
        cmp     [.accel], 0
        je      .next_item

        stdcall StrPtr, [.accel]
        push    eax

        stdcall GetTextBounds, eax, [eax+string.len], [GUI.DefaultFont]

        mov     edx, [.bounds.width]
        sub     edx, [GUI.boxBorderWidth]
        sub     edx, [GUI.menuIconMargin]
        sub     edx, eax

        pop     eax
        stdcall DrawString, [.canvas], eax, [eax+string.len], edx, [.ytxt], [GUI.DefaultFont], [.clTxt]

        stdcall StrDel, [.accel]


.next_item:
        mov     eax, [edi+TMenuItem.height]
        add     [.y], eax

        add     edi, sizeof.TMenuItem
        jmp     .loop


.end_loop:

        popad
        return

.empty_menu:
        stdcall DrawString, [.canvas], "Empty menu", 10, 10, 14, [GUI.DefaultFont], [GUI.clMenuText]
        stdcall FilterDisabled, [.canvas], FALSE
        jmp     .end_loop

endp




method TMenu.Show
begin
        pushad

        mov     esi, [.self]
        mov     edi, [.parent]

        mov     [esi+TMenu.__caller], edi
        istype  edi, TMenu
        jne     .submenu_ok

        mov     eax, esi
        xchg    eax, [edi+TMenu._ActiveSubmenu]

        test    eax, eax
        jz      .submenu_ok

        set     eax, TMenu:Visible, FALSE
        stdcall SetMouseCapture, edi

.submenu_ok:
        cmp     [esi+TMenu._beforeshow], 0
        je      @f

        push    esi
        stdcall [esi+TMenu._beforeshow], esi
        pop     esi
@@:
        set     esi, TMenu:Visible, TRUE
        set     esi, TMenu:Selected, -1
        mov     [__ActiveMenu], esi


        exec    edi, TWindow:ClientToScreenXY, [.x], [.y]

        stdcall _GetScreenSize

        sub     eax, [esi+TMenu._width]
        sub     ebx, [esi+TMenu._height]

        cmp     ecx, eax
        cmovg   ecx, eax

        cmp     edx, ebx
        cmovg   edx, ebx

        exec    esi, TMenu:Move, ecx, edx

        popad
        return
endp




proc AcceleratorToStr, .pFastKey
begin
        mov     eax, [.pFastKey]
        test    eax, eax
        jz      .empty

        stdcall CreateKeyName, [eax+TFastKey.key], [eax+TFastKey.flags]
        jnc     .finish

.empty:
        stdcall StrNew
        stc

.finish:
        return
endp


; Converts the string representation of an accelerator key to
; TFastKey structure.
;
; Returns:
;   eax - keyboard flags (TFastKey.flags)
;   edx - keyboard key (TFastKey.key)
;
; ToDo: more modifiers need to be processed

proc StrToAccelerator, .hString
.res TFastKey
begin
        pushad

        stdcall StrSplitList, [.hString], "+", FALSE
        mov     edx, eax
        xor     ecx, ecx
        mov     [.res.flags], ecx
        mov     [.res.key], ecx
        dec     ecx

.loop:
        inc     ecx
        cmp     ecx, [edx+TArray.count]
        jae     .finish

        mov     ebx, Ctrl
        stdcall StrCompNoCase, [edx+TArray.array + 4*ecx], txt "Ctrl"
        jc      .setflag
        stdcall StrCompNoCase, [edx+TArray.array + 4*ecx], txt "Control"
        jc      .setflag
        stdcall StrCompNoCase, [edx+TArray.array + 4*ecx], txt "Ctl"
        jc      .setflag

        mov     ebx, Alt
        stdcall StrCompNoCase, [edx+TArray.array + 4*ecx], txt "Alt"
        jc      .setflag

        mov     ebx, Shift
        stdcall StrCompNoCase, [edx+TArray.array + 4*ecx], txt "Shift"
        jc      .setflag

        stdcall KbdNameToCode, [edx+TArray.array + 4*ecx]
        jc      .loop
        mov     [.res.key], eax
        jmp     .loop

.setflag:
        or      [.res.flags], ebx
        jmp     .loop

.finish:
        stdcall ListFree, edx, StrDel
        mov     eax, [.res.flags]
        mov     edx, [.res.key]
        mov     [esp+4*regEAX], eax
        mov     [esp+4*regEDX], edx

        OutputValue "Accelerator key: ", edx, 16, 8
        OutputValue "Accelerator flags: ", eax, 16, 8

        popad
        return
endp




method TMenu.SetSelected
begin
        pushad

        mov     esi, [.self]
        mov     ecx, [.value]
        cmp     ecx, [esi+TMenu._selected]
        je      .finish

        get     edi, esi, TMenu:Items
        test    edi, edi
        jz      .finish

        mov     eax, [esi+TMenu._selected]
        mov     [esi+TMenu._selected], ecx

        cmp     eax, [edi+TArray.count]
        jae     .old_ok

        imul    eax, sizeof.TMenuItem
        cmp     [edi + TArray.array + eax + TMenuItem.type], mitSubmenu
        jne     .old_ok

        set     [edi + TArray.array + eax + TMenuItem.item], TMenu:Visible, FALSE

.old_ok:
        cmp     ecx, [edi+TArray.count]
        jae     .finish

; compute Y coordinate

        lea     edi, [edi+TArray.array]
        xor     ebx, ebx

.loop:
        dec     ecx
        js      .height_ok

        add     ebx, [edi+TMenuItem.height]
        add     edi, sizeof.TMenuItem
        jmp     .loop

.height_ok:

        mov     eax, ebx
        add     eax, [edi+TMenuItem.height]
        exec    esi, TMenu:RectChanged2, 0;, ebx, [esi+TWindow._width], eax

        cmp     [edi+TMenuItem.type], mitSubmenu
        jne     .hide_old

        get     eax, [edi+TMenuItem.item], TMenu:Enabled
        test    eax, eax
        jz      .hide_old

        mov     eax, [esi+TMenu._width]
        sub     eax, [GUI.menuIconMargin]

        exec    [edi+TMenuItem.item], TMenu:Show, esi, eax, ebx ; will hide the previous open submenu!
        jmp     .finish

; hide old menu if active:
.hide_old:
        cmp     [esi+TMenu._ActiveSubmenu], 0
        je      .finish

        set     [esi+TMenu._ActiveSubmenu], TMenu:Visible, FALSE
        and     [esi+TMenu._ActiveSubmenu], 0

.finish:
        popad
        return
endp



method TMenu.EventMouseMove
begin
        pushad

        mov     esi, [.self]

        mov     ecx, [.x]
        mov     edx, [.y]
        sub     ecx, [esi+TMenu._x]
        js      .check_caller
        sub     edx, [esi+TMenu._y]
        js      .check_caller

        cmp     ecx, [esi+TMenu._width]
        jge     .check_caller

        cmp     edx, [esi+TMenu._height]
        jge      .check_caller

        sub     edx, [GUI.boxBorderWidth]
        js      .exit

        sub     edx, [GUI.menuIconMargin]
        js      .exit

; search for item.

        get     edi, esi, TMenu:Items

        mov     ecx, [edi+TArray.count]
        lea     edi, [edi+TArray.array]

        xor     ebx, ebx        ; index
        xor     eax, eax        ; Y coordinate

.loop:
        dec     ecx
        js      .exit

        add     eax, [edi+TMenuItem.height]
        cmp     edx, eax
        jl      .found

        inc     ebx
        add     edi, sizeof.TMenuItem
        jmp     .loop

.found:
        set     esi, TMenu:Selected, ebx

.exit:
        popad
        return

.check_caller:
        mov     esi, [esi+TMenu.__caller]
        test    esi, esi
        jz      .exit

        istype  esi, TMenu
        jne     .exit

        exec    esi, TMenu:EventMouseMove, [.x], [.y], [.kbdState]
        jmp     .exit
endp





; returns CF = 1 if the item was executed. Else CF = 0

method TMenu.ExecuteItem        ;, .iItem
begin
        pushad
        mov     esi, [.self]
        get     edx, esi, TMenu:Items

        test    edx, edx
        jz      .finish

        mov     ecx, [.iItem]
        cmp     ecx, [edx+TArray.count]
        jae     .finish

        shl     ecx, 4  ; sizeof.TMenuItem = $10
        lea     edi, [edx+TArray.array+ecx]

        cmp     [edi+TMenuItem.type], mitSeparator
        je      .finish

        cmp     [edi+TMenuItem.type], mitString
        je      .onstring

        cmp     [edi+TMenuItem.type], mitSubmenu
        je      .finish

        cmp     [edi+TMenuItem.type], mitAction
        je      .onaction

        jmp     .finish

.onstring:
        get     edx, esi, TMenu:OnString
        test    edx, edx
        jz      .finish

        exec    esi, TMenu:HideAll
        stdcall edx, esi, edi
        jmp     .finish


.onaction:
        get     eax, [edi+TMenuItem.item], TAction:Enabled
        test    eax, eax
        jz      .finish

        exec    esi, TMenu:HideAll
        exec    [edi+TMenuItem.item], TAction:Execute, [.self]   ; execute the action.

.finish_true:
        stc

.finish:
        popad
        return
endp



method TMenu.HideAll
begin
        push    ecx esi
        mov     esi, [.self]

.loop:
        mov     ecx, [esi+TMenu.__caller]
        jecxz   .closeit

        istype  ecx, TMenu
        cmove   esi, ecx
        je      .loop

.closeit:
        set     esi, TMenu:Visible, FALSE
        pop     esi ecx
        return
endp



method TMenu.EventButtonPress
begin
        inherited [.button], [.kbdState], [.x], [.y]
        jc        .exit

        pushad
        mov     esi, [.self]

        get     eax, esi, TMenu:Visible
        test    eax, eax
        jz      .finish

        mov     ecx, [.x]
        mov     edx, [.y]

        sub     ecx, [esi+TMenu._x]
        js      .check_caller
        sub     edx, [esi+TMenu._y]
        js      .check_caller
        cmp     ecx, [esi+TMenu._width]
        jge     .check_caller
        cmp     edx, [esi+TMenu._height]
        jge     .check_caller

        exec    esi, TMenu:ExecuteItem, [esi+TMenu._selected]
        stc
        
.finish:
        popad
.exit:
        return


.check_caller:
        set     esi, TMenu:Visible, FALSE       ; hide the menu

        mov     esi, [esi+TMenu.__caller]
        test    esi, esi
        jz      .finish

        istype  esi, TMenu
        clc
        jne     .finish

        mov     [esi+TMenu._selected], -1
        exec    esi, TMenu:EventMouseMove, [.x], [.y], [.kbdState]
        exec    esi, TMenu:EventButtonPress, [.button], [.kbdState], [.x], [.y] ; what about converting coordinates to the caller ???
        jmp     .finish
endp




method TMenu.EventKeyPress
begin
        pushad

        OutputValue "Key pressed: ", [.scancode], 10, -1

        mov     esi, [.self]
        get     edx, esi, TMenu:Items
        test    edx, edx
        jz      .finish

        get     ebx, esi, TMenu:Selected
        cmp     ebx, -1
        jne     .continue

        istype  [esi+TMenu.__caller], TMenu
        jne     .continue

        exec    [esi+TMenu.__caller], TMenu:EventKeyPress, [.utf8], [.scancode], [.kbdState]
        jmp     .finish

.continue:
        xor     edi, edi

        mov     eax, [.scancode]

        cmp     eax, keyDownNumpad
        je      .down
        cmp     eax, keyDown
        je      .down

        cmp     eax, keyUpNumpad
        je      .up
        cmp     eax, keyUp
        je      .up

        cmp     eax, keyLeftNumpad
        je      .left
        cmp     eax, keyLeft
        je      .left

        cmp     eax, keyRightNumpad
        je      .right
        cmp     eax, keyRight
        je      .right

        cmp     [.utf8], $1b
        je      .escape

        cmp     [.utf8], $0d
        je      .enter

        jmp     .finish

.down:
        inc     edi             ; == +1
        jmp     .inc_pos

.up:
        dec    edi             ; == -1

.inc_pos:
        xor     ecx, ecx
        mov     eax, [edx+TArray.count]
        dec     eax
        js      .finish

        add     ebx, edi

        cmp     ebx, eax
        cmovg   ebx, ecx

        test    ebx, ebx
        cmovs   ebx, eax

        lea     ecx, [4*ebx]
        cmp     [edx+TArray.array + 4*ecx + TMenuItem.type], mitSeparator
        je      .next

        cmp     [edx+TArray.array + 4*ecx + TMenuItem.type], mitAction
        jne     .set_selected

        get     eax, [edx+TArray.array + 4*ecx + TMenuItem.item], TAction:Enabled
        test    eax, eax
        jz      .next

.set_selected:
        set     esi, TMenu:Selected, ebx
        jmp     .finish

.next:
        get     eax, esi, TMenu:Selected
        cmp     eax, ebx                        ; only one item can be selected!!!
        je      .finish
        jmp     .inc_pos

.escape:
        set     esi, TMenu:Visible, FALSE
        jmp     .finish


.left:
        cmp     [esi+TMenu.__caller], 0
        je      .maybe_not_active

        istype  [esi+TMenu.__caller], TMenu
        jne     .maybe_not_active

        set     esi, TMenu:Visible, FALSE
        jmp     .finish

.maybe_not_active:
        cmp     [esi+TMenu._ActiveSubmenu], 0
        je      .finish

        set     [esi+TMenu._ActiveSubmenu], TMenu:Visible, FALSE
        jmp     .finish

.right:
        test    ebx, ebx
        js      .finish

        lea     ecx, [4*ebx]
        lea     ecx, [edx + TArray.array + 4*ecx]
        cmp     [ecx+TMenuItem.type], mitSubmenu
        jne     .finish

        get     eax, [ecx+TMenuItem.item], TMenu:Enabled
        test    eax, eax
        jz      .finish

        mov     eax, [esi+TMenu._width]
        sub     eax, [GUI.menuIconMargin]

        mov     [esi+TMenu._selected], -1
        set     esi, TMenu:Selected, ebx
        set     [ecx+TMenuItem.item], TMenu:Selected, 0
        jmp     .finish

.enter:
; execute the item.

        exec    esi, TMenu:ExecuteItem, ebx

.finish:
        popad
        return
endp





proc ___MenuFromTemplate
begin
        push    ebx ecx edx edi

        create  ebx, TMenu, 0

.loop:
        movzx   edx, byte [esi+1]       ; the type of the item

        cmp     edx, mitEnd
        je      .end_of_menu

        cmp     edx, mitSeparator
        je      .separator

        cmp     edx, mitAction
        je      .action

        cmp     edx, mitString
        je      .string

        cmp     edx, mitSubmenu
        je      .submenu

        jne     .next_item

.separator:

        xor     ecx, ecx
        xor     edi, edi
        jmp     .add_item

.action:
        mov     edi, [esi+6]    ; the item ID
        mov     ecx, [esi+2]
        mov     ecx, [ecx]
        jmp     .add_item

.string:
        mov     edi, [esi+2]    ; the item ID
        lea     ecx, [esi+6]
        stdcall StrDupMem, ecx
        mov     ecx, eax
        jmp     .add_item

.submenu:
        mov     edi, [esi+2]    ; the item ID
        lea     ecx, [esi+6]
        movzx   eax, byte [esi]
        add     esi, eax

        call    ___MenuFromTemplate
        set     eax, TMenu:Caption, ecx
        set     eax, TMenu:Enabled, TRUE
        set     eax, TMenu:Visible, FALSE
        mov     ecx, eax

.add_item:
        exec    ebx, TMenu:AddItem, edx, ecx, edi

.next_item:
        movzx   eax, byte [esi]
        add     esi, eax
        jmp     .loop

.end_of_menu:
        mov     eax, ebx
        pop     edi edx ecx ebx
        return
endp



proc MenuFromTemplate, .pTemplate
begin
        push    esi
        mov     esi, [.pTemplate]
        call    ___MenuFromTemplate
        pop     esi
        return
endp


; Searches menu item with the given itemID.
; Returns:
;    CF = 1; The item has been found. EAX = pointer the TMenuItem, EDX = pointer to TMenu.
;    CF = 0; The item has not been found.

proc SearchMenuItem, .pMenu, .itemID
begin
        push    ebx ecx eax edx

        mov     edx, [.pMenu]
        mov     eax, [edx+TMenu._p_items]
        mov     ecx, [eax+TArray.count]
        lea     eax, [eax+TArray.array]

.loop:
        dec     ecx
        js      .not_found

        mov     ebx, [eax+TMenuItem.itemID]
        cmp     ebx, [.itemID]
        je      .found

        cmp     [eax+TMenuItem.type], mitSubmenu
        jne     .next

        stdcall SearchMenuItem, [eax+TMenuItem.item], [.itemID]
        jc      .found

.next:
        add     eax, sizeof.TMenuItem
        jmp     .loop

.found:
        lea     esp, [esp+8]  ; remove edx and eax from the stack
        stc
        pop     ecx ebx
        return

.not_found:
        clc
        pop     edx eax ecx ebx
        return
endp






endmodule


Added freshlib/gui/TObject.asm.











































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TObject object class.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: TObject is the root member of FreshLib objects tree.
;_________________________________________________________________________________________
module "TObject library"




object TObject
; fields
  if options.Threads
    ._mxAccess  TMutex  ; access mutex. Procedures from objects.asm will use it to ensure thread safety.
  end if

  ._OnCreate  dd ?
  ._OnDestroy dd ?
  ._ptrVar    dd ?

  .__parent       dd ?
  .__first_child  dd ?
  .__last_child   dd ?

  .__prev         dd ?
  .__next         dd ?

  .__owner        dd ?


; parameters

  param .Parent, .__parent, .SetParent
  param .FirstChild, .__first_child, NONE
  param .LastChild, .__last_child, NONE
  param .NextSibling, .__next, NONE
  param .PrevSibling, .__prev, NONE

  param .Owner, .__owner, .__owner

  param  .OnCreate, ._OnCreate, ._OnCreate
  param  .OnDestroy, ._OnDestroy, ._OnDestroy
  param  .ptrVar, ._ptrVar, ._ptrVar

; methods

  method .Create, .parent
  method .Destroy

  method .SetParent, .value

  method .AddChild, .objchild
  method .RemoveChild, .objchild
endobj



interface TObject.OnCreate, .self
interface TObject.OnDestroy, .self





method TObject.Create
begin
if defined options.Threads & options.Threads
        push    eax
        mov     eax, [.self]
        lea     eax, [eax+TObject._mxAccess]
        stdcall MutexCreate, 0, eax
        stdcall MutexRelease, eax
        pop     eax
end if
        set     [.self], TWindow:Parent, [.parent]
        return
endp




method TObject.Destroy
begin
        pushad

        mov     esi, [.self]

        get     ecx, esi, TObject:OnDestroy
        jecxz   .event_ok

        push    esi
        stdcall dword ecx, [.self]
        pop     esi

.event_ok:

; destroy all children

.loop:
        get     ebx, esi, TObject:LastChild
        test    ebx, ebx
        jz      .end_children

        destroy ebx
        jmp     .loop

.end_children:

        set     esi, TObject:Parent, 0      ; detach from the parent.

        get     ecx, esi, TObject:ptrVar
        jecxz   .varok
        mov     dword [ecx], 0
.varok:

if defined options.Threads & options.Threads
        lea     ecx, [esi+TObject._mxAccess]
        stdcall MutexDestroy, ecx
end if
        popad
        return
endp





;_________________________________________________________________________________________



method TObject.AddChild
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [.objchild]
        xor     ecx, ecx

        test    ebx, ebx
        jz      .not_object

        istype  ebx, TObject
        jne     .not_object

; remove the object from the previous parent list, if any.
        mov     eax, [ebx+TObject.__parent]
        test    eax, eax
        jz      @f
        exec    eax, TObject:RemoveChild, ebx
@@:
        mov     [ebx+TObject.__next], ecx       ; it is the last child in the chain.
        mov     [ebx+TObject.__parent], esi

; connect to the new parent structures.
        mov     eax, [esi+TObject.__first_child]
        test    eax, eax
        cmovz   eax, ebx

        mov     edx, [esi+TObject.__last_child]
        test    edx, edx
        jz      @f
        mov     [edx+TObject.__next], ebx
@@:
        mov     [ebx+TObject.__prev], edx
        mov     [esi+TObject.__first_child], eax
        mov     [esi+TObject.__last_child], ebx

        clc
        popad
        return


.not_object:
        stc
        popad
        return
endp


;_________________________________________________________________________________________


;----------------------------------------------------------------------
; Returns:
;   CF = 1 - if the object specified was not found as a window child.
;   CF = 0 - the child was removed from the list of childrens.
;----------------------------------------------------------------------

method TObject.RemoveChild
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [.objchild]
        xor     ecx, ecx

        test    ebx, ebx
        jz      .error

        istype  ebx, TObject
        jne     .error

        cmp     [ebx+TObject.__parent], esi
        jne     .error

        mov     [ebx+TObject.__parent], ecx

        mov     eax, [ebx+TObject.__prev]
        mov     edx, [ebx+TObject.__next]

        test    eax, eax
        jz      .prev_ok
        mov     [eax+TObject.__next], edx

.prev_ok:
        test    edx, edx
        jz      .next_ok
        mov     [edx+TObject.__prev], eax

.next_ok:

        cmp     [esi+TObject.__first_child], ebx
        jne     .first_child_ok
        mov     [esi+TObject.__first_child], edx

.first_child_ok:

        cmp     [esi+TObject.__last_child], ebx
        jne     .last_child_ok
        mov     [esi+TObject.__last_child], eax

.last_child_ok:
        clc
        popad
        return

.error:
        stc
        popad
        return
endp



;_________________________________________________________________________________________



method TObject.SetParent
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [.value]

        get     edx, esi, TObject:Parent

        cmp     ebx, edx         ; if the parent is already set to the same value, ignore.
        je      .finish

        test    edx, edx
        je      .parent_ok

        exec    edx, TObject:RemoveChild, esi        ; remove the window from the old parent.

.parent_ok:
        test    ebx, ebx
        jz      .finish

        exec    ebx, TObject:AddChild, esi

.finish:
        popad
        return
endp



; Returns the next leaf object in the tree, relative to the input object.
; The search is circular, if pObject is the last leaf of the tree,
; the first leaf is returned.
;
; Arguments:
;   .pObject - pointer to TObject;
;
; Returns:
;   eax - pointer to the next object if any, or the same object if next was not found.
;   ZF = 1 - next object not found.
;   ZF = 0 - next object returned.

proc NextLeaf, .pObject
begin
        mov     eax, [.pObject]

.next:
        cmp     [eax+TObject.__next], 0
        cmovne  eax, [eax+TObject.__next]
        jne     .down_to_leaf

        cmp     [eax+TObject.__parent], 0
        cmovne  eax, [eax+TObject.__parent]
        jne     .next

.back_to_first:
        cmp     [eax+TObject.__prev], 0
        cmovne  eax, [eax+TObject.__prev]
        jne     .back_to_first

.down_to_leaf:
        cmp     [eax+TObject.__first_child], 0
        cmovne  eax, [eax+TObject.__first_child]
        jne     .down_to_leaf

        cmp     eax, [.pObject]
        return
endp



; Returns the previous leaf object in the tree, relative to the input object.
; The search is circular, if pObject is the first leaf of the tree,
; the last leaf is returned.
;
; Arguments:
;   .pObject - pointer to TObject;
;
; Returns:
;   eax - pointer to the previous leaf, if any, or the same leaf if next was not found.
;   ZF = 1 - previous object not found.
;   ZF = 0 - previous object returned.

proc PrevLeaf, .pObject
begin
        mov     eax, [.pObject]

.prev:
        cmp     [eax+TObject.__prev], 0
        cmovne  eax, [eax+TObject.__prev]
        jne     .down_to_leaf

        cmp     [eax+TObject.__parent], 0
        cmovne  eax, [eax+TObject.__parent]
        jne     .prev

.back_to_first:
        cmp     [eax+TObject.__next], 0
        cmovne  eax, [eax+TObject.__next]
        jne     .back_to_first

.down_to_leaf:
        cmp     [eax+TObject.__last_child], 0
        cmovne  eax, [eax+TObject.__last_child]
        jne     .down_to_leaf

        cmp     eax, [.pObject]
        return
endp






endmodule

Added freshlib/gui/TProgressbar.asm.

































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TProgressBar object class; Simple progress bar control.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________
module "TProgressbar library"


object TProgress, TCanvasWindow
  ._Pos          dd ?
  ._Max          dd ?
  ._Color        dd ?
  ._embeded      dd ?

  param .Pos, ._Pos, .SetPos
  param .Max, ._Max, .SetMax
  param .Embeded, ._embeded, .SetEmbeded

  method .Step
  method .SetPos, .value
  method .SetMax, .value
  method .SetEmbeded, .value

  method .Create, .pParent

  method .__RenderView
endobj



method TProgress.Create
begin
        mov     eax, [.self]
        set     eax, TProgress:WantFocus, FALSE

        inherited [.pParent]
        return
endp


method TProgress.Step
begin
        push    eax ecx

        mov     ecx, [.self]
        mov     eax, [ecx+TProgress._Pos]
        cmp     eax, [ecx+TProgress._Max]
        jge     .exit

        inc     [ecx+TProgress._Pos]

        and     [ecx+TProgress._canvas_valid], 0
        exec    ecx, TProgress:RectChanged2, 0

.exit:
        pop     ecx eax
        clc
        return
endp


method TProgress.SetPos
begin
        push    eax ecx
        mov     ecx, [.self]
        mov     eax, [.value]

        xchg    eax, [ecx+TProgress._Pos]
        cmp     eax, [ecx+TProgress._Pos]
        je      .finish

        and     [ecx+TProgress._canvas_valid], 0
        exec    ecx, TProgress:RectChanged2, 0

.finish:
        pop     ecx eax
        return
endp


method TProgress.SetMax
begin
        push    eax ecx
        mov     ecx, [.self]
        mov     eax, [.value]

        xchg    eax, [ecx+TProgress._Max]
        cmp     eax, [ecx+TProgress._Max]
        je      .finish

        and     [ecx+TProgress._canvas_valid], 0
        exec    ecx, TProgress:RectChanged2, 0

.finish:
        pop     ecx eax
        return
endp


method TProgress.SetEmbeded
begin
        push    ecx eax

        mov     ecx, [.self]
        mov     eax, [.value]

        xchg    eax, [ecx+TProgress._embeded]
        cmp     eax, [ecx+TProgress._embeded]
        je      .finish

        and     [ecx+TProgress._canvas_valid], 0
        exec    ecx, TProgress:RectChanged2, 0

.finish:
        pop     eax ecx
        return
endp




method TProgress.__RenderView
 .bounds TBounds
begin
        pushad

        mov     esi, [.self]
        cmp     [esi+TProgress._canvas], 0
        je      .finish

        stdcall LockImg, [esi+TProgress._canvas]
        jc      .finish

        mov     [.bounds.x], 0
        mov     [.bounds.y], 0
        mov     eax, [esi+TProgress._width]
        mov     ecx, [esi+TProgress._height]
        mov     [.bounds.width], eax
        mov     [.bounds.height], ecx

        mov     edx, [GUI.progressBorder]

        cmp     [esi+TProgress._embeded], 0
        je      .border_ok

        mov     edx, bxNone

.border_ok:
        lea     eax, [.bounds]
        stdcall [DrawBox], [esi+TProgress._canvas], eax, [GUI.clProgressBk], edx, [GUI.boxBorderWidth]

        mov     eax, [GUI.boxBorderWidth]
        inc     eax

        add     [.bounds.x], eax
        add     [.bounds.y], eax
        shl     eax, 1
        sub     [.bounds.width], eax
        sub     [.bounds.height], eax

        mov     eax, [esi+TProgress._Pos]
        mov     ecx, [esi+TProgress._Max]

        test    ecx, ecx
        jnz     @f
        inc     ecx
@@:
        cmp     eax, ecx
        cmovg   eax, ecx

        imul    [.bounds.width]
        idiv    ecx

        stdcall DrawSolidRect, [esi+TProgress._canvas], [.bounds.x], [.bounds.y], eax, [.bounds.height], [GUI.clProgressBar]
        stdcall UnlockImg, [esi+TProgress._canvas]

.finish:
        popad
        return
endp



endmodule

Added freshlib/gui/TScrollable.asm.































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TScrollWindow object class
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: TScrollWindow is window that may have scrollers to scroll the client area.
;_________________________________________________________________________________________
module "TScrollable library"


struct TScrollerXY
  .pos   rd 2
  .page  rd 2
  .max   rd 2
  .step  rd 2
  .state rd 2
ends

; Constants for TScroller.state - the state of the particular scrollbar.

sbsNormal = 0   ; when the mouse is outside the scrollbar
sbsActive = 1   ; when the mouse points on the scrollbar

; Constants for TScrollable._state - the state of the window as a whole.

scsReleased = 0           ; no scrollbar is in drag state.
scsDragHorizontal = 1     ; the horizontal scrollbar is in drag state.
scsDragVertical   = 2     ; the vertical scrollbar is in drag state.



object TScrollable, TWindow

  ._scrXY  TScrollerXY

  ._drag_ofs dd ?

  ._state    dd ?

  ._imgX     dd ?
  ._imgY     dd ?

  param .PosX,  ._scrXY.pos,  .SetPos:2
  param .PageX, ._scrXY.page, .SetPage:2
  param .MaxX,  ._scrXY.max,  .SetMax:2
  param .StepX, ._scrXY.step, ._scrXY.step

  param .PosY,  ._scrXY.pos+4,  .SetPos:2
  param .PageY, ._scrXY.page+4, .SetPage:2
  param .MaxY,  ._scrXY.max+4,  .SetMax:2
  param .StepY, ._scrXY.step+4, ._scrXY.step+4

  method .SetPos,  .param, .value
  method .SetPage, .param, .value
  method .SetMax,  .param, .value

  method .Create, .parent
  method .Destroy

  method .__UpdateImages
  method .__ClearScrollbar, .scrollbar  ; .scrollbar == scrollX or scrollY
  method .__DrawScrollbar, .scrollbar   ; .scrollbar == scrollX or scrollY
  method .__Invalidate, .scrollbar
  method .SelfPaint, .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height    ; Paints itself on the caller provided TImage.

  method .EventMouseMove, .x, .y, .kbdState
  method .EventMouseLeave

  method .EventButtonPress, .button, .kbdState, .x, .y
  method .EventButtonRelease, .button, .kbdState, .x, .y
  method .EventScroll, .direction, .command, .value

endobj


;_________________________________________________________________________________________


method TScrollable.Create
begin
        inherited [.parent]

        set     [.self], TScrollable:StepX, 1
        set     [.self], TScrollable:StepY, 1

        return
endp


method TScrollable.Destroy
begin
        push    esi
        mov     esi, [.self]
        stdcall DestroyImage, [esi+TScrollable._imgX]
        and     [esi+TScrollable._imgX], 0

        stdcall DestroyImage, [esi+TScrollable._imgY]
        and     [esi+TScrollable._imgY], 0

        pop     esi
        inherited
        return
endp



method TScrollable.__Invalidate ; .scrollbar
begin
        pushad
        mov     esi, [.self]

        cmp     [.scrollbar], scrollY
        je      .invalidateY

        xor     eax, eax
        mov     edx, [GUI.scrollWidth]
        mov     ebx, [esi+TScrollable._height]
        mov     ecx, [esi+TScrollable._width]
        sub     ebx, edx
        jmp     .invalidate

.invalidateY:

        xor     ebx, ebx
        mov     ecx, [GUI.scrollWidth]

        mov     eax, [esi+TScrollable._width]
        mov     edx, [esi+TScrollable._height]
        sub     eax, ecx

.invalidate:

        exec    esi, TScrollable:RectChangedXY2, eax, ebx, ecx, edx
        popad
        return
endp

;_________________________________________________________________________________________


method TScrollable.__UpdateImages
begin
        inherited
        pushad

        mov     esi, [.self]

        mov     edi, [esi+TScrollable._imgX]
        mov     ecx, [esi+TScrollable._width]
        mov     edx, [GUI.scrollWidth]

        test    edi, edi
        jz      .createx

        cmp     [edi+TImage.wrapW], ecx
        jne     .destroyx
        cmp     [edi+TImage.wrapH], edx
        je      .ximg_ok

.destroyx:

        stdcall DestroyImage, edi

.createx:
        stdcall CreateImage2, ecx, edx, FALSE
        mov     [esi+TScrollable._imgX], eax

.ximg_ok:

        mov     edi, [esi+TScrollable._imgY]
        mov     ecx, [esi+TScrollable._height]
        mov     edx, [GUI.scrollWidth]

        test    edi, edi
        jz      .createy

        cmp     [edi+TImage.wrapH], ecx
        jne     .destroyy
        cmp     [edi+TImage.wrapW], edx
        je      .yimg_ok

.destroyy:

        stdcall DestroyImage, edi

.createy:
        stdcall CreateImage2, edx, ecx, FALSE
        mov     [esi+TScrollable._imgY], eax

.yimg_ok:
        exec    esi, TScrollable:__ClearScrollbar, scrollX
        exec    esi, TScrollable:__DrawScrollbar, scrollX

        exec    esi, TScrollable:__ClearScrollbar, scrollY
        exec    esi, TScrollable:__DrawScrollbar, scrollY
        popad
        return
endp


;_________________________________________________________________________________________


method TScrollable.SetPos       ;, .param, .value
begin
        pushad

        mov     esi, [.self]
        mov     eax, [.value]

        xor     edx, edx  ;  == scrollX
        cmp     [.param], TScrollable.PosX
        je      @f
        inc     edx
@@:
        cmp     eax, [esi + TScrollable._scrXY.pos + 4*edx]
        je      .finish

        mov     [esi + TScrollable._scrXY.pos + 4*edx], eax

        exec    esi, TScrollable:__ClearScrollbar, edx
        exec    esi, TScrollable:__DrawScrollbar, edx
        exec    esi, TScrollable:__Invalidate, edx

        clc     ; position changed. refresh.
        popad
        return

.finish:
        stc     ; no need to refresh.
        popad
        return
endp

;_________________________________________________________________________________________


method TScrollable.SetPage         ; .param, .value
begin
        pushad

        mov     esi, [.self]
        mov     eax, [.value]

        xor     edx, edx  ; == scrollX
        cmp     [.param], TScrollable.PageX
        je      @f
        inc     edx
@@:
        cmp     eax, [esi + TScrollable._scrXY.page + 4*edx]
        je      .finish

        mov     [esi + TScrollable._scrXY.page + 4*edx], eax
        exec    esi, TScrollable:__ClearScrollbar, edx
        exec    esi, TScrollable:__DrawScrollbar, edx
        exec    esi, TScrollable:__Invalidate, edx

.finish:
        popad
        return
endp

;_________________________________________________________________________________________


method TScrollable.SetMax          ;, .param, .value
begin
        pushad

        mov     esi, [.self]
        mov     eax, [.value]

        xor     edx, edx
        cmp     [.param], TScrollable.MaxX
        je      @f
        inc     edx
@@:
        cmp     eax, [esi + TScrollable._scrXY.max + 4*edx]
        je      .finish

        mov     [esi + TScrollable._scrXY.max + 4*edx], eax
        exec    esi, TScrollable:__ClearScrollbar, edx
        exec    esi, TScrollable:__DrawScrollbar, edx
        exec    esi, TScrollable:__Invalidate, edx

.finish:
        popad
        return
endp



;_________________________________________________________________________________________


method TScrollable.SelfPaint       ;, .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height
.src  RECT  ; the rectangle that need paint.
.vscr RECT  ; the vertical scroller rect.
.hscr RECT  ; the horizontal scroller rect.
.res  RECT
begin
        inherited [.pDstImage], [.xDst], [.yDst], [.xSrc], [.ySrc], [.width], [.height]
        pushad

        mov     esi, [.self]

        mov     eax, [.xSrc]
        mov     ecx, [.ySrc]
        mov     [.src.left], eax
        mov     [.src.top], ecx
        add     eax, [.width]
        add     ecx, [.height]
        mov     [.src.right], eax
        mov     [.src.bottom], ecx

        xor     eax, eax
        mov     [.vscr.top], eax
        mov     [.hscr.left], eax

        mov     ecx, [esi+TScrollable._width]
        mov     edx, [esi+TScrollable._height]

        mov     [.vscr.right], ecx
        mov     [.vscr.bottom], edx

        mov     [.hscr.right], ecx
        mov     [.hscr.bottom], edx

        sub     ecx, [GUI.scrollWidth]
        sub     edx, [GUI.scrollWidth]

        mov     [.vscr.left], ecx
        mov     [.hscr.top], edx

        lea     edx, [.src]
        lea     ebx, [.vscr]
        lea     eax, [.res]

        stdcall RectIntersect, eax, ebx, edx
        jc      .vscr_ok

        cmp     [esi + TScrollable._scrXY.max + 4], 0
        je      .vscr_ok

        mov     eax, [.res.left]
        mov     ebx, [.res.top]
        mov     ecx, eax
        mov     edx, ebx
        sub     [.res.right], eax
        sub     [.res.bottom], ebx
        sub     eax, [.vscr.left]
        sub     ebx, [.vscr.top]

        add     ecx, [.xDst]
        add     edx, [.yDst]
        sub     ecx, [.xSrc]
        sub     edx, [.ySrc]

        stdcall BlendImage, [.pDstImage], ecx, edx, [esi+TScrollable._imgY], eax, ebx, [.res.right], [.res.bottom]

.vscr_ok:
        lea     edx, [.src]
        lea     ebx, [.hscr]
        lea     eax, [.res]
        stdcall RectIntersect, eax, ebx, edx
        jc      .hscr_ok

        cmp     [esi+TScrollable._scrXY.max], 0
        je      .hscr_ok

        mov     eax, [.res.left]
        mov     ebx, [.res.top]
        mov     ecx, eax
        mov     edx, ebx
        sub     [.res.right], eax
        sub     [.res.bottom], ebx
        sub     eax, [.hscr.left]
        sub     ebx, [.hscr.top]

        add     ecx, [.xDst]
        add     edx, [.yDst]
        sub     ecx, [.xSrc]
        sub     edx, [.ySrc]

        stdcall BlendImage, [.pDstImage], ecx, edx, [esi+TScrollable._imgX], eax, ebx, [.res.right], [.res.bottom]

.hscr_ok:
        popad
        return
endp


method TScrollable.__ClearScrollbar
begin
        pushad
        mov     esi, [.self]
        mov     ebx, [.scrollbar]
        mov     ebx, [esi+TScrollable._imgX+4*ebx]
        test    ebx, ebx
        jz      .finish
        stdcall DrawSolidRect, ebx, 0, 0, [ebx+TImage.wrapW], [ebx+TImage.wrapH], $00;ffffff
.finish:
        popad
        return
endp



method TScrollable.__DrawScrollbar
begin
        pushad
        mov     esi, [.self]

        cmp     [.scrollbar], scrollX
        je      .draw_x

        mov     ebx, [esi+TScrollable._imgY]
        test    ebx, ebx
        jz      .scry_ok

        mov     edi, [esi + TScrollable._scrXY.state + 4]

; Draw background Y

        mov     ecx, [ebx+TImage.wrapH]
        mov     edx, [GUI.scrollWidth]
        sub     ecx, edx
        stdcall BlendSolidRect, ebx, 0, 0, edx, ecx, [GUI.clScrollBk+4*edi]
        stdcall BlendTriangle, ebx, 0, ecx, edx, trtUpper or trtRight, [GUI.clScrollBk+4*edi]

; Draw slider Y
        lea     eax, [esi + TScrollable._scrXY]
        stdcall _SliderPixels2, eax, scrollY, ecx

        cmp     eax, ecx
        cmovg   eax, ecx

        mov     ecx, [esi + TScrollable._scrXY.pos + 4]
        cmp     ecx, [esi + TScrollable._scrXY.max + 4]
        cmovg   ecx, [GUI.clScrollSliderOvf+4*edi]
        cmovle  ecx, [GUI.clScrollSlider+4*edi]

        stdcall BlendSolidRect, ebx, 0, eax, [GUI.scrollWidth], edx, ecx
        add     eax, edx
        stdcall BlendTriangle,  ebx, 0, eax, [GUI.scrollWidth], trtUpper or trtRight, ecx

.scry_ok:
        popad
        return


.draw_x:
        mov     ebx, [esi+TScrollable._imgX]
        test    ebx, ebx
        jz      .scrx_ok

        mov     edi, [esi+TScrollable._scrXY.state]

; Draw background X

        mov     ecx, [ebx+TImage.wrapW]
        mov     edx, [GUI.scrollWidth]
        sub     ecx, edx
        stdcall BlendSolidRect, ebx, 0, 0, ecx, edx, [GUI.clScrollBk+4*edi]
        stdcall BlendTriangle, ebx, ecx, 0, edx, trtLower or trtLeft, [GUI.clScrollBk+4*edi]

; Draw slider X

        lea     eax, [esi+TScrollable._scrXY]
        stdcall _SliderPixels2, eax, scrollX, ecx

        cmp     eax, ecx
        cmovg   eax, ecx

        mov     ecx, [esi+TScrollable._scrXY.pos]
        cmp     ecx, [esi+TScrollable._scrXY.max]
        cmovg   ecx, [GUI.clScrollSliderOvf+4*edi]
        cmovle  ecx, [GUI.clScrollSlider+4*edi]

        stdcall BlendSolidRect, ebx, eax, 0, edx, [GUI.scrollWidth], ecx
        add     eax, edx
        stdcall BlendTriangle,  ebx, eax, 0, [GUI.scrollWidth], trtLower or trtLeft, ecx

.scrx_ok:
        popad
        return
endp



; returns:
;   EAX:
;       -1 - the coordinates are outside the scrollbars
;        0 - the coordinates are in the horizontal scrollbar
;        1 - the coordinates are in the vertical scrollbar

proc __FindScroller, .scrollable, .x, .y
begin
        push    esi ecx edx

        mov     esi, [.scrollable]

        xor     eax, eax
        dec     eax             ; -1

        mov     ecx, [esi+TScrollable._width]
        mov     edx, [esi+TScrollable._height]
        sub     ecx, [.x]
        sub     edx, [.y]

        cmp     ecx, [GUI.scrollWidth]
        jl      .y_scroller

        cmp     edx, [GUI.scrollWidth]
        jge     .finish

        cmp     ecx, edx
        jl      .yes_y_scroller

.yes_x_scroller:
        cmp     [esi+TScrollable._scrXY.max], 0
        je      .finish  ; hidden X scroller.

        inc     eax
        jmp     .finish

.y_scroller:

        cmp     ecx, edx
        jge     .yes_x_scroller

.yes_y_scroller:

        cmp     [esi+TScrollable._scrXY.max+4], 0
        je      .finish  ; hidden Y scroller.

        inc     eax
        inc     eax

.finish:
        pop     edx ecx esi
        return
endp




method TScrollable.EventMouseLeave
begin
        pushad

        mov     esi, [.self]
        cmp     [esi+TScrollable._state], 0
        jne     .finish                   ; there is a drag operation active.

        xor     ecx, ecx
        xor     edx, edx
        xchg    ecx, [esi+TScrollable._scrXY.state]
        xchg    edx, [esi+TScrollable._scrXY.state + 4]
        or      ecx, edx
        jz      .finish

        xor     edx, edx ; == scrollX
        exec    esi, TScrollable:__ClearScrollbar, edx
        exec    esi, TScrollable:__DrawScrollbar, edx
        exec    esi, TScrollable:__Invalidate, edx
        inc     edx      ; == scrollY
        exec    esi, TScrollable:__ClearScrollbar, edx
        exec    esi, TScrollable:__DrawScrollbar, edx
        exec    esi, TScrollable:__Invalidate, edx

.finish:
        inherited
        popad
        return
endp



method TScrollable.EventMouseMove
.dummy  dd ?
.stateH dd ?
.stateV dd ?
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [esi + TScrollable._state]

        test    ebx, ebx
        jnz     .process_drag

        xor     ecx, ecx
        mov     [.stateH], ecx
        mov     [.stateV], ecx

        stdcall __FindScroller, esi, [.x], [.y]
        inc     [.stateH+4*eax]         ; notice the .dummy variable for eax = -1

        mov     ecx, [esi+TWindow._cursor]
        inc     eax
        jz      @f
        mov     ecx, mcArrow
@@:
        get     edx, esi, TWindow:OSWindow
        stdcall GetStockCursor, ecx
        stdcall SetMouseCursor, [edx+TWindow.handle], eax

        xor     eax, eax
        mov     ebx, [.stateH]
        xchg    ebx, [esi+TScrollable._scrXY.state]
        xor     ebx, [esi+TScrollable._scrXY.state]
        jz      .statex_ok

        exec    esi, TScrollable:__ClearScrollbar, scrollX
        exec    esi, TScrollable:__DrawScrollbar, scrollX
        exec    esi, TScrollable:__Invalidate, scrollX

.statex_ok:
        mov     ebx, [.stateV]
        xchg    ebx, [esi+TScrollable._scrXY.state+4]
        xor     ebx, [esi+TScrollable._scrXY.state+4]
        or      eax, ebx
        jz      .statey_ok   ; if the state has not be changed.

        exec    esi, TScrollable:__ClearScrollbar, scrollY
        exec    esi, TScrollable:__DrawScrollbar, scrollY
        exec    esi, TScrollable:__Invalidate, scrollY

.statey_ok:
        inherited  [.x], [.y], [.kbdState]
        clc
        popad
        return


.process_drag:

        dec     ebx

        mov     eax, [.x + 4*ebx]
        mov     ecx, [esi+TScrollable._width + 4*ebx]
        sub     ecx, [GUI.scrollWidth]
        jle     .finish

        sub     eax, [esi+TScrollable._drag_ofs]
        lea     edx, [esi+TScrollable._scrXY]

        stdcall _ComputeSliderPos, edx, ebx, eax, ecx
        jc      .finish

        exec    esi, TScrollable:EventScroll, ebx, scTrack, eax

.finish:
        stc
        popad
        return
endp



; computes the position of the slider from screen pixel coordinates.
proc _ComputeSliderPos, .pScroller, .direction, .x, .lengthpx
begin
        push    ecx edx

        stdcall _SliderPixels2, [.pScroller], [.direction], [.lengthpx] ; the length of the slider.

        mov     ecx, [.direction]
        shl     ecx, 2
        add     ecx, [.pScroller]

        sub     [.lengthpx], edx
        jz      .zero

        mov     eax, [ecx + TScrollerXY.max]
        imul    [.x]
        idiv    [.lengthpx]

        xor     edx, edx

        cmp     eax, edx
        cmovl   eax, edx

        mov     edx, [ecx + TScrollerXY.max]
        cmp     eax, edx
        cmovg   eax, edx
        clc

.ok:
        pop     edx ecx
        return

.zero:
        stc
        xor     eax, eax
        jmp     .ok
endp




method TScrollable.EventButtonPress
begin
        pushad

        cmp     [.button], mbLeft
        jne     .not_processed

        mov     esi, [.self]

.again:
        stdcall __FindScroller, esi, [.x], [.y]
        test    eax, eax
        js      .not_processed

        mov     ebx, eax

        lea     eax, [esi + TScrollable._scrXY]
        stdcall _SliderPixels2, eax, ebx, [esi+TScrollable._width + 4*ebx]
        mov     edi, [.x + 4*ebx]

        mov     ecx, [esi + TScrollable._width + 4*ebx]   ; if pos is > max
        sub     ecx, edx
        cmp     eax, ecx
        cmovg   eax, ecx

        sub     edi, eax
        jl      .before

        cmp     edi, edx
        jg      .after

; inside the slider - capture the mouse.

        mov     [esi + TScrollable._drag_ofs], edi
        inc     ebx
        mov     [esi + TScrollable._state], ebx

        stdcall SetMouseCapture, esi

.processed:
        stc
        popad
        return

.after:
        lea     eax, [esi+TScrollable._scrXY]
        stdcall _ComputeSliderPos, eax, ebx, [.x+4*ebx], [esi+TScrollable._width+4*ebx]
        add     eax, [esi+TScrollable._scrXY.page+4*ebx]
        jmp     .teleport

.before:
        lea     eax, [esi+TScrollable._scrXY]
        stdcall _ComputeSliderPos, eax, ebx, [.x+4*ebx], [esi+TScrollable._width+4*ebx]

.teleport:
        mov     ecx, [esi+TScrollable._scrXY.page+4*ebx]
        shr     ecx, 1
        xor     edx, edx
        sub     eax, ecx
        cmovl   eax, edx
        cmp     eax, [esi+TScrollable._scrXY.max+4*ebx]
        cmova   eax, [esi+TScrollable._scrXY.max+4*ebx]

        cmp     eax, [esi+TScrollable._scrXY.pos+4*ebx]
        je      .processed

        exec    esi, TScrollable:EventScroll, ebx, scTrack, eax
        jmp     .again   ; possible hang...


.not_processed:
        inherited [.button], [.kbdState], [.x], [.y]

        clc
        popad
        return
endp



method TScrollable.EventButtonRelease
begin
        pushad

        mov     esi, [.self]
        xor     eax, eax
        cmp     [esi+TScrollable._state], eax
        je      .finish

        mov     [esi+TScrollable._drag_ofs], eax
        mov     [esi+TScrollable._state], eax
        stdcall SetMouseCapture, eax

        exec    esi, TScrollable:EventMouseMove, [.x], [.y], [.kbdState]

.finish:
        popad

        inherited [.button], [.kbdState], [.x], [.y]
        return
endp



method TScrollable.EventScroll
begin
        pushad

        mov     esi, [.self]

        cmp     [.direction], scrollX
        je      .horiz_scroll

        cmp     [.command], scWheelUp
        je      .scrollupy

        cmp     [.command], scWheelDn
        je      .scrolldny

        cmp     [.command], scTrack
        je      .track

        clc
        popad
        return


.finish:
        popad
        return

.track:
        set     esi, TScrollable:PosY, [.value]
        jmp     .finish


.scrollupy:
        get     ecx, esi, TScrollable:StepY
        get     eax, esi, TScrollable:PosY

        sub     eax, ecx
        jns     @f
        xor     eax, eax
@@:
        set     esi, TScrollable:PosY, eax
        jmp     .finish


.scrolldny:
        get     edx, esi, TScrollable:MaxY
        get     ecx, esi, TScrollable:StepY
        get     eax, esi, TScrollable:PosY

        add     eax, ecx
        cmp     eax, edx
        cmovg   eax, edx

        set     [.self], TScrollable:PosY, eax
        jmp     .finish


.horiz_scroll:
        cmp     [.command], scWheelUp
        je      .scrollupx

        cmp     [.command], scWheelDn
        je      .scrolldnx

        cmp     [.command], scTrack
        jne     .finish

        set     esi, TScrollable:PosX, [.value]
        jmp     .finish


.scrollupx:
        get     ecx, esi, TScrollable:StepX
        get     eax, esi, TScrollable:PosX

        sub     eax, ecx
        jns     @f
        xor     eax, eax
@@:
        set     esi, TScrollable:PosX, eax
        jmp     .finish

.scrolldnx:
        get     edx, esi, TScrollable:MaxX
        get     ecx, esi, TScrollable:StepX
        get     eax, esi, TScrollable:PosX

        add     eax, ecx
        cmp     eax, edx
        cmovg   eax, edx

        set     [.self], TScrollable:PosX, eax
        jmp     .finish
endp






; returns:
;   eax - position in pixels
;   edx - size in pixels


proc _SliderPixels2, .pScroller, .direction, .length
begin
        push    ecx esi

        mov     ecx, [.pScroller]
        mov     eax, [.direction]
        lea     ecx, [ecx+4*eax]

; page size in pixels.
        mov     esi, [ecx + TScrollerXY.max]
        mov     eax, [.length]

        add     esi, [ecx + TScrollerXY.page]
        test    esi, esi
        jz      .lengthok

        imul    [ecx + TScrollerXY.page]
        idiv    esi

.lengthok:
        cmp     eax, [GUI.minSliderHeight]
        cmovl   eax, [GUI.minSliderHeight]

        cmp     eax, [.length]
        cmovg   eax, [.length]

        push    eax  ; width

; position in pixels

        sub     eax, [.length]
        mov     esi, [ecx + TScrollerXY.max]
        test    esi, esi
        jnz     @f
        inc     esi
@@:
        neg     eax
        mul     [ecx + TScrollerXY.pos]
        div     esi

        pop     edx   ; width

        pop     esi ecx
        return
endp









endmodule



Added freshlib/gui/TTabBar.asm.

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TTabBar object class
;
;  Target OS: Any
;
;  Dependencies:
;_________________________________________________________________________________________
module "TTabBar library"


tsNeutral = 0
tsHovered = 1
tsSelected = 2


struct TTab
  .caption      dd ?
  .icon         dd ?
  ._width       dd ?
  ._x           dd ?
  .user_data    dd ?
ends


object TTabBar, TWindow

; private fields

  ._RequestHeight dd ?

  ._canvas       dd ?
  ._canvas_valid dd ?

  ._items        dd ?            ; TArray of TTab structures.

  ._hovered      dd ?
  ._selected     dd ?

  .x_start       dd ?

  ._on_sel_change dd ?

; params

  param  .Selected, ._selected, .SetSelected
  param  .Hovered,  ._hovered, .SetHovered

  param  .OnSelChange, ._on_sel_change, ._on_sel_change

; methods

  method .SetSelected, .value
  method .SetHovered, .value

  method .ScrollToSelected

  method .Next
  method .Prev

  method .Create, .Parent
  method .Destroy

  method .ForceRefresh

  method .HitTest, .x, .y

  method .InsertTab, .index, .caption, .icon, .userdata
  method .DeleteTab, .index, .userFreeCallback

  method .__UpdateImages
  method ._UpdateX, .from
  method ._UpdateW, .tab
  method ._RenderView

  method .DrawTab, .pTab, .state

  method .SelfPaint, .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height

  method .Autosize

  ; system events methods

  method .EventMouseLeave
  method .EventMouseMove, .x, .y, .kbdState
  method .EventButtonPress, .button, .kbdState, .x, .y
  method .EventScroll, .direction, .command, .value

endobj


interface TTabBar.OnSelChange, .self, .pTabUnselected, .iTabUnselected, .pTabSelected, .iTabSelected


; new

method TTabBar.Create
begin
        inherited [.Parent]
        push    esi

        mov     esi, [.self]
        mov     [esi+TTabBar._cursor], mcArrow
        set     esi, TTabBar:WantFocus, FALSE

        stdcall CreateArray, sizeof.TTab
        mov     [esi+TTabBar._items], eax

        xor     eax, eax
        dec     eax
        mov     [esi+TTabBar._selected], eax
        mov     [esi+TTabBar._hovered], eax

        mov     [esi+TTabBar._RequestHeight], 10        ; just as initial value. It will be recalculated in __UpdateImages.

        pop     esi
        return
endp


method TTabBar.Destroy
begin
        pushad

        mov     ebx, [.self]
        mov     edx, [ebx+TTabBar._items]
        test    edx, edx
        jz      .finish

        mov     ecx, [edx+TArray.count]
        lea     edx, [edx+TArray.array]

.free:
        dec     ecx
        js      .end_free

        stdcall StrDel, [edx+TTab.caption]   ; but how about the icons?
        add     edx, sizeof.TTab
        jmp     .free

.end_free:
        xor     eax, eax
        xchg    eax, [ebx+TTabBar._items]
        stdcall FreeMem, eax

.finish:
        popad
        inherited
        return
endp


method TTabBar.ForceRefresh
begin
        mov     eax, [.self]
        and     [eax+TTabBar._canvas_valid], 0
        inherited
        return
endp


method TTabBar.SelfPaint
begin
        pushad
        mov     esi, [.self]

        cmp     [esi+TTabBar._canvas_valid], 0
        jne     @f
        exec    esi, TTabBar:_RenderView
@@:
        mov     ebx, [esi+TTabBar._canvas]
        test    ebx, ebx
        jz      .finish

        stdcall DrawSolidRect, [.pDstImage], [.xDst], [.yDst], [.width], [.height], [GUI.clDialogBk]

        mov     eax, [esi+TTabBar.x_start]
        add     eax, [.xSrc]
        stdcall BlendImage, [.pDstImage], [.xDst], [.yDst], ebx, eax, [.ySrc], [.width], [.height]

.finish:
        popad
        inherited [.pDstImage], [.xDst], [.yDst], [.xSrc], [.ySrc], [.width], [.height]
        return
endp


method TTabBar.HitTest
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TTabBar._items]
        mov     eax, [esi+TTabBar.x_start]
        add     [.x], eax

        mov     ecx, [edi+TArray.count]
        lea     edi, [edi+TArray.array]
        xor     edx, edx

.loop:
        dec     ecx
        js      .not_found

        mov     eax, [edi+TTab._width]
        cmp     [.x], eax
        jl      .found

        sub     [.x], eax
        inc     edx
        add     edi, sizeof.TTab
        jmp     .loop

.found:
        mov     [esp+4*regEAX], edi
        mov     [esp+4*regEDX], edx
        clc
        popad
        return

.not_found:
        stc
        popad
        return
endp


method TTabBar.InsertTab
begin
        pushad

        mov     esi, [.self]
        mov     edx, [esi+TTabBar._items]
        mov     eax, [.index]
        cmp     eax, [edx+TArray.count]
        cmova   eax, [edx+TArray.count]
        mov     [.index], eax

        stdcall InsertArrayItems, edx, eax, 1
        mov     [esi+TTabBar._items], edx
        mov     edi, eax

        stdcall StrDup, [.caption]
        mov     [edi+TTab.caption], eax

        mov     eax, [.icon]
        mov     edx, [.userdata]
        mov     [edi+TTab.icon], eax
        mov     [edi+TTab.user_data], edx

        exec    esi, TTabBar:_UpdateW, edi
        exec    esi, TTabBar:_UpdateX, [.index]

        exec    esi, TTabBar:__UpdateImages

        and     [esi+TTabBar._canvas_valid], 0
        exec    esi, TTabBar:RectChanged2, 0
        popad
        return
endp




method TTabBar.DeleteTab      ;, .index, .userFreeCallback
begin
        pushad

        mov     esi, [.self]
        mov     ebx, [esi+TTabBar._selected]
        set     esi, TTabBar:Selected, -1

        mov     edx, [esi+TTabBar._items]

        stdcall GetArrayItem, edx, [.index]
        jc      .finish

        stdcall StrDel, [eax+TTab.caption]
        cmp     [.userFreeCallback], 0
        je      .element_empty

        pushad
        stdcall [.userFreeCallback], [eax+TTab.user_data]
        popad

        and     [eax+TTab.user_data], 0

.element_empty:

        stdcall DeleteArrayItems, edx, [.index], 1
        mov     [esi+TTabBar._items], edx

        cmp     ebx, [.index]
        jb      .selected_ok

        dec     ebx
        jns     .selected_ok

        xor     ebx, ebx
        cmp     [edx+TArray.count], ebx
        jne     .selected_ok

        dec     ebx

.selected_ok:
        set     esi, TTabBar:Selected, ebx

        exec    esi, TTabBar:_UpdateX, [.index]
        exec    esi, TTabBar:__UpdateImages

        and     [esi+TTabBar._canvas_valid], 0
        exec    esi, TTabBar:RectChanged2, 0

.finish:
        popad
        return
endp


method TTabBar._UpdateX
begin
        pushad
        mov     esi, [.self]
        mov     edx, [esi+TTabBar._items]
        mov     edi, [edx+TArray.count]

        xor     ecx, ecx

        mov     ebx, [.from]
        cmp     ebx, edi
        jae     .finish

        mov     eax, ebx
        imul    eax, sizeof.TTab
        sub     eax, sizeof.TTab
        lea     edx, [edx+TArray.array+eax]
        js      .set

        mov     ecx, [edx+TTab._x]

.loop:
        add     ecx, [edx+TTab._width]

.set:
        inc     ebx
        add     edx, sizeof.TTab
        mov     [edx+TTab._x], ecx
        cmp     ebx, edi
        jb      .loop

.finish:
        popad
        return
endp



method TTabBar._UpdateW
begin
        pushad
        mov     esi, [.tab]
        mov     eax, [esi+TTab.icon]

        xor     ecx, ecx
        xor     edx, edx
        mov     ebx, [GUI.tabMarginX]
        test    eax, eax
        jz      @f
        mov     ecx, [eax+TImage.wrapW]
        mov     edx, ebx
@@:
        shl     ebx, 1
        add     ecx, edx
        add     ecx, ebx
        mov     [edi+TTab._width], ecx

        stdcall StrPtr, [esi+TTab.caption]
        stdcall GetTextBounds, eax, -1, [GUI.DefaultFont]
        cmp     eax, [GUI.maxTabWidth]
        cmova   eax, [GUI.maxTabWidth]

        add     [edi+TTab._width], eax

        popad
        return
endp



method TTabBar._RenderView
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TTabBar._items]
        mov     ebx, [edi+TArray.count]

        mov     ecx, [esi+TTabBar._canvas]
        jecxz   .finish

        stdcall DrawSolidRect, ecx, 0, 0, [ecx+TImage.wrapW], [ecx+TImage.wrapH], 0

        lea     edi, [edi + TArray.array]
        xor     ecx, ecx
        dec     ecx

.loop:
        inc     ecx
        cmp     ecx, ebx
        jae     .finish

        mov     eax, tsSelected
        cmp     ecx, [esi+TTabBar._selected]
        je      .drawit

        mov     eax, tsHovered
        cmp     ecx, [esi+TTabBar._hovered]
        je      .drawit

        mov     eax, tsNeutral

.drawit:
        exec    esi, TTabBar:DrawTab, edi, eax

        add     edi, sizeof.TTab
        jmp     .loop


.finish:
        inc     [esi+TTabBar._canvas_valid]
        popad
        return
endp




method TTabBar.DrawTab;, .pTab, .state
.bounds TBounds
begin
        pushad

        mov     esi, [.pTab]
        mov     edi, [.self]
        mov     edi, [edi+TTabBar._canvas]
        test    edi, edi
        jz      .finish

        mov     eax, [esi+TTab._x]
        xor     ecx, ecx
        mov     [.bounds.x], eax
        mov     [.bounds.y], ecx

        mov     eax, [esi+TTab._width]
        mov     ecx, [edi+TImage.wrapH]
        mov     [.bounds.width], eax
        mov     [.bounds.height], ecx

        mov     ebx, [.state]
        stdcall DrawSolidRect, edi, [.bounds.x], [.bounds.y], [.bounds.width], [.bounds.height], [GUI.clTabBk+4*ebx]

        cmp     ebx, tsSelected
        jne     .selected_ok

        stdcall DrawSolidRect, edi, [.bounds.x], 0, [.bounds.width], 2, [GUI.clBorderFocused]

.selected_ok:
        add     [.bounds.y], 2
        sub     [.bounds.height], 2

        mov     eax, [GUI.tabMarginX]
        mov     ecx, [GUI.tabMarginY]
        add     [.bounds.x], eax
        add     [.bounds.y], ecx
        shl     eax, 1
        shl     ecx, 1
        sub     [.bounds.width], eax
        sub     [.bounds.height], ecx

        mov     ebx, [esi+TTab.icon]
        test    ebx, ebx
        jz      .icon_ok

        mov     ecx, [ebx+TImage.wrapW]
        stdcall BlendImage, edi, [.bounds.x], [.bounds.y], ebx, 0, 0, ecx, [ebx+TImage.wrapH]

        mov     eax, [GUI.tabMarginX]
        add     [.bounds.x], ecx
        add     [.bounds.x], eax
        sub     [.bounds.width], ecx

.icon_ok:

        stdcall DrawTextBox, edi, [esi+TTab.caption], [.bounds.x], [.bounds.y], [.bounds.width], [.bounds.height], 0, dtfAlignLeft or dtfAlignMiddle or dtfSingleLine, [GUI.DefaultFont], [GUI.clTabTxt]

.finish:
        popad
        return
endp



method TTabBar.Autosize
begin
        inherited
        xor     eax, eax
        mov     edx, [.self]
        mov     edx, [edx+TTabBar._items]
        mov     edx, [edx+TArray.count]
        test    edx, edx
        jz      .finish

        mov     edx, [.self]
        mov     edx, [edx+TTabBar._RequestHeight]

.finish:
        return
endp



method TTabBar.EventMouseLeave
begin
        set     [.self], TTabBar:Hovered, -1
        exec    [.self], TTabBar:ScrollToSelected
        return
endp


method TTabBar.EventMouseMove
begin
        push    eax edx
        or      edx, -1
        exec    [.self], TTabBar:HitTest, [.x], [.y]
        set     [.self], TTabBar:Hovered, edx
        pop     edx eax
        return
endp


method TTabBar.EventButtonPress
begin
        inherited [.button], [.kbdState], [.x], [.y]
        jnc     .process
        return
        
.process:
        push    eax edx

        exec    [.self], TTabBar:HitTest, [.x], [.y]
        jc      .finish

        set     [.self], TTabBar:Selected, edx
        clc
        
.finish:
        cmc
        pop     edx eax
        return
endp


method TTabBar.EventScroll
begin
        pushad
        mov     esi, [.self]
        mov     edx, [esi+TTabBar._items]

        mov     ecx, [esi+TTabBar.x_start]

        cmp     [.command], scWheelUp
        je      .scrollup

        cmp     [.command], scWheelDn
        je      .scrolldn

.finish:
        popad
        return

.scrolldn:
        mov     eax, [edx+TArray.count]
        dec     eax
        js      .finish

        imul    eax, sizeof.TTab
        lea     eax, [edx+eax+TArray.array]
        mov     ebx, [eax+TTab._x]
        add     ebx, [eax+TTab._width]
        sub     ebx, [esi+TTabBar._width]
        js      .finish

        add     ecx, 32
        cmp     ecx, ebx
        cmova   ecx, ebx

.set:
        mov     [esi+TTabBar.x_start], ecx
        exec    esi, TTabBar:RectChanged2, 0
        jmp     .finish


.scrollup:
        xor     eax, eax
        sub     ecx, 32
        cmovs   ecx, eax
        jmp     .set
endp



method TTabBar.SetHovered
begin
        pushad
        mov     esi, [.self]
        mov     edi, 64
        mov     eax, [esi+TTabBar._canvas]
        test    eax, eax
        jnz     .height_ok

        mov     edi, [eax+TImage.wrapH]

.height_ok:

        mov     edx, [.value]
        cmp     edx, [esi+TTabBar._hovered]
        je      .finish

        xchg    edx, [esi+TTabBar._hovered]
        test    edx, edx
        js      .old_ok

        cmp     edx, [esi+TTabBar._selected]
        je      .old_ok

        mov     eax, [esi+TTabBar._items]
        cmp     edx, [eax+TArray.count]
        jae     .old_ok

        imul    edx, sizeof.TTab
        lea     edx, [eax+edx+TArray.array]

        exec    esi, TTabBar:DrawTab, edx, tsNeutral

        mov     eax, [edx+TTab._x]
        sub     eax, [esi+TTabBar.x_start]
        exec    esi, TTabBar:RectChangedXY2, eax, 0, [edx+TTab._width], edi

.old_ok:
        mov     edx, [esi+TTabBar._hovered]
        test    edx, edx
        js      .finish

        cmp     edx, [esi+TTabBar._selected]
        je      .finish

        mov     eax, [esi+TTabBar._items]
        cmp     edx, [eax+TArray.count]
        jae     .finish

        imul    edx, sizeof.TTab
        lea     edx, [eax+edx+TArray.array]

        exec    esi, TTabBar:DrawTab, edx, tsHovered

        mov     eax, [edx+TTab._x]
        sub     eax, [esi+TTabBar.x_start]
        exec    esi, TTabBar:RectChangedXY2, eax, 0, [edx+TTab._width], edi

.finish:
        popad
        return
endp



method TTabBar.SetSelected
.tab_prev   dd ?
.tab_prev_i dd ?
.tab_new    dd ?
.tab_new_i  dd ?
begin
        pushad

        xor     eax, eax
        mov     [.tab_prev], eax
        mov     [.tab_new], eax
        dec     eax
        mov     [.tab_prev_i], eax
        mov     [.tab_new_i], eax

        mov     esi, [.self]
        mov     edi, 64
        mov     eax, [esi+TTabBar._canvas]
        test    eax, eax
        jz      .height_ok

        mov     edi, [eax+TImage.wrapH]

.height_ok:
        mov     edx, [.value]
;        cmp     edx, [esi+TTabBar._selected]
;        je      .finish

        test    edx, edx
        js      .value_ok

        mov     eax, [esi+TTabBar._items]
        cmp     edx, [eax+TArray.count]
        jae     .finish

.value_ok:
        xchg    edx, [esi+TTabBar._selected]
        test    edx, edx
        js      .old_ok

        mov     eax, [esi+TTabBar._items]
        cmp     edx, [eax+TArray.count]
        jae     .old_ok

        mov     ebx, edx
        imul    ebx, sizeof.TTab
        lea     ebx, [eax+ebx+TArray.array]

        exec    esi, TTabBar:DrawTab, ebx, tsNeutral

        mov     eax, [ebx+TTab._x]
        sub     eax, [esi+TTabBar.x_start]
        exec    esi, TTabBar:RectChangedXY2, eax, 0, [ebx+TTab._width], edi

        mov     [.tab_prev], ebx
        mov     [.tab_prev_i], edx

.old_ok:
        mov     edx, [esi+TTabBar._selected]
        test    edx, edx
        js      .finish

        mov     eax, [esi+TTabBar._items]
        cmp     edx, [eax+TArray.count]
        jae     .finish

        mov     ebx, edx
        imul    ebx, sizeof.TTab
        lea     ebx, [eax+ebx+TArray.array]

        exec    esi, TTabBar:DrawTab, ebx, tsSelected
        exec    esi, TTabBar:ScrollToSelected

        mov     eax, [ebx+TTab._x]
        sub     eax, [esi+TTabBar.x_start]
        exec    esi, TTabBar:RectChangedXY2, eax, 0, [ebx+TTab._width], edi

        mov     [.tab_new], ebx
        mov     [.tab_new_i], edx

.finish:
;        mov     eax, [.tab_prev]
;        or      eax, [.tab_new]
;        jz      .exit

        get     eax, esi, TTabBar:OnSelChange
        test    eax, eax
        jz      .exit

; interface TTabBar.OnSelChange, .self, .pTabUnselected, .iTabUnselected, .pTabSelected, .iTabSelected

        stdcall eax, esi, [.tab_prev], [.tab_prev_i], [.tab_new], [.tab_new_i]

.exit:
        popad
        return
endp


method TTabBar.Next
begin
        pushad

        mov     esi, [.self]
        mov     ecx, [esi+TTabBar._items]

        or      eax, -1
        mov     edx, [ecx+TArray.count] ; to
        test    edx, edx
        jz      .set

        xor     ebx, ebx        ; from

        mov     eax, [esi+TTabBar._selected]
        inc     eax

        cmp     eax, ebx
        cmovl   eax, ebx

        cmp     eax, edx
        cmovge  eax, ebx

.set:
        set     [.self], TTabBar:Selected, eax

        popad
        return
endp


method TTabBar.Prev
begin
        pushad

        mov     esi, [.self]
        mov     ecx, [esi+TTabBar._items]

        or      eax, -1
        mov     edx, [ecx+TArray.count] ; to
        test    edx, edx
        jz      .set

        dec     edx

        mov     eax, [esi+TTabBar._selected]
        dec     eax
        cmovs   eax, edx

.set:
        set     [.self], TTabBar:Selected, eax

        popad
        return
endp






method TTabBar.ScrollToSelected
begin
        pushad
        mov     esi, [.self]
        mov     edx, [esi+TTabBar._items]
        mov     ecx, [esi+TTabBar._selected]
        cmp     ecx, [edx+TArray.count]
        jae     .finish

        imul    ecx, sizeof.TTab
        lea     ecx, [edx+ecx+TArray.array]

        mov     eax, [ecx+TTab._x]
        sub     eax, [esi+TTabBar.x_start]
        js      .scroll_right
        cmp     eax, [esi+TTabBar._width]
        jge     .scroll_left

        add     eax, [ecx+TTab._width]
        cmp     eax, [esi+TTabBar._width]
        jge     .scroll_left

.finish:
        popad
        return

.scroll_right:

        mov     eax, [ecx+TTab._x]
        sub     eax, 32
        jns     .set_ofs
        xor     eax, eax

.set_ofs:
        mov     [esi+TTabBar.x_start], eax

        exec    esi, TTabBar:RectChanged2, 0
        jmp     .finish

.scroll_left:
        mov     eax, [ecx+TTab._x]
        add     eax, [ecx+TTab._width]
        sub     eax, [esi+TTabBar._width]

        mov     ebx, [edx+TArray.count]
        dec     ebx
        cmp     ebx, [esi+TTabBar._selected]
        jbe     .set_ofs
        add     eax, 32
        jmp     .set_ofs
endp



method TTabBar.__UpdateImages
begin
        inherited
        pushad

        mov     esi, [.self]

        stdcall GetFontMetrics, [GUI.DefaultFont]
        mov     edi, eax ; min tabbar height

        mov     edx, [esi+TTabBar._items]
        test    edx, edx
        jz      .finish

        mov     ecx, [edx+TArray.count]
        lea     edx, [edx+TArray.array]
        xor     ebx, ebx        ; total width

.loop:
        dec     ecx
        js      .endloop

        add     ebx, [edx+TTab._width]
        mov     eax, [edx+TTab.icon]

        add     edx, sizeof.TTab

        test    eax, eax
        jz      .loop

        cmp     edi, [eax+TImage.wrapH]
        cmovl   edi, [eax+TImage.wrapH]
        jmp     .loop

.endloop:
        add     edi, 2 ; for the select mark.
        add     edi, [GUI.tabMarginY]
        add     edi, [GUI.tabMarginY]   ; height

        mov     [esi+TTabBar._RequestHeight], edi

;        OutputValue "Tab height = ", edi, 10, -1

        mov     edx, [esi+TTabBar._canvas]
        test    edx, edx
        jz      .create_new

        cmp     ebx, [edx+TImage.wrapW]
        ja      .destroy

        cmp     edi, [edx+TImage.wrapH]
        ja      .destroy

        popad
        return

.destroy:

        stdcall DestroyImage, edx
        and     [esi+TTabBar._canvas], 0

.create_new:
        cmp     [esi+TTabBar._visible], 0
        je      .finish

        stdcall CreateImage2, ebx, edi, FALSE
        mov     [esi+TTabBar._canvas], eax
        and     [esi+TTabBar._canvas_valid], 0

.finish:
        popad
        return

endp




endmodule

Added freshlib/gui/TToolbar.asm.























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TToolbar object class
;
;  Target OS: Any
;
;  Dependencies:
;_________________________________________________________________________________________
module "TToolbar library"

tbbSeparator = 0

tbsNeutral  = bsNeutral
tbsHovered  = bsHovered
tbsPressed  = bsPressed


struct TToolButton
  .action dd ?          ; can be pointer to TAction object, or TMenu or tbbSeparator (0)
  .state  dd ?
  .width  dd ?
  .icon   dd ?          ; if the .action field contains TMenu
ends


object TToolbar, TWindow

; private fields

  ._canvas       dd ?
  ._canvas_valid dd ?

  ._btn_height   dd ?

  ._buttons     dd ?            ; TArray of TToolButton structures.

; methods

  method .Create, .Parent
  method .Destroy
  method .ForceRefresh

  method .SetAction, .value
  method .UpdateAction, .action

  method .HitTest, .x, .y
  method .ClearState

  method .AddButton, .action, .icon

  method ._RenderView

  method .SelfPaint, .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height

  method .Autosize

  ; system events methods

  method .EventMouseEnter
  method .EventMouseLeave
  method .EventMouseMove, .x, .y, .kbdState

  method .EventButtonPress, .button, .kbdState, .x, .y
  method .EventButtonRelease, .button, .kbdState, .x, .y

endobj


interface TToolbar.OnClick, .self, .button


; new

method TToolbar.Create
begin
        inherited [.Parent]
        push    esi

        mov     esi, [.self]
        mov     [esi+TToolbar._cursor], mcArrow
        set     esi, TToolbar:WantFocus, FALSE

        stdcall CreateArray, sizeof.TToolButton
        mov     [esi+TToolbar._buttons], eax
        mov     [esi+TToolbar._btn_height], 24

        pop     esi
        return
endp


method TToolbar.Destroy
begin
        pushad

        mov     esi, [.self]
        xor     eax, eax
        xchg    eax, [esi+TToolbar._canvas]
        stdcall DestroyImage, eax

        mov     edx, [esi+TToolbar._buttons]
        mov     ecx, [edx+TArray.count]
        lea     edx, [edx+TArray.array]

.loop:
        dec     ecx
        js      .end_loop

        mov     eax, [edx+TToolButton.action]
        add     edx, sizeof.TToolButton

        test    eax, eax
        jz      .loop

        istype  eax, TAction
        jne     .loop

        exec    eax, TAction:Detach, [.self]
        jmp     .loop

.end_loop:
        stdcall FreeMem, [esi+TToolbar._buttons]

        popad
        inherited
        return
endp



method TToolbar.SetAction
begin
        push    eax
        mov     eax, [.self]
        mov     [eax+TToolbar.__action], 0
        pop     eax
        return
endp



method TToolbar.UpdateAction
begin
        exec    [.self], TToolbar:ForceRefresh
        return
endp



method TToolbar.ForceRefresh
begin
        mov     eax, [.self]
        and     [eax+TToolbar._canvas_valid], 0
        inherited
        return
endp


method TToolbar.SelfPaint
begin
        pushad
        mov     esi, [.self]

        cmp     [esi+TToolbar._canvas_valid], 0
        jne     @f
        exec    esi, TToolbar:_RenderView
@@:
        mov     ebx, [esi+TToolbar._canvas]
        test    ebx, ebx
        jz      .finish

        stdcall DrawSolidRect, [.pDstImage], [.xDst], [.yDst], [.width], [.height], [GUI.clDialogBk]
        stdcall BlendImage, [.pDstImage], [.xDst], [.yDst], ebx, [.xSrc], [.ySrc], [.width], [.height]

.finish:
        popad
        inherited [.pDstImage], [.xDst], [.yDst], [.xSrc], [.ySrc], [.width], [.height]
        return
endp


method TToolbar.HitTest
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TToolbar._buttons]
        mov     ecx, [edi+TArray.count]
        lea     edi, [edi+TArray.array]

.loop:
        dec     ecx
        js      .not_found

        mov     eax, [edi+TToolButton.width]
        cmp     [.x], eax
        jl      .found

        sub     [.x], eax
        add     edi, sizeof.TToolButton
        jmp     .loop

.found:
        cmp     [edi+TToolButton.action], 0
        je      .not_found

        mov     [esp+4*regEAX], edi
        clc
        popad
        return

.not_found:
        stc
        popad
        return
endp


method TToolbar.AddButton
begin
        pushad

        mov     esi, [.self]
        mov     edx, [esi+TToolbar._buttons]
        mov     ecx, [.action]
        mov     ebx, [.icon]

        stdcall AddArrayItems, edx, 1
        mov     [esi+TToolbar._buttons], edx

        mov     [esp+4*regEAX], eax

        test    ecx, ecx
        cmovz   edx, [GUI.tbSeparatorWidth]
        cmovnz  edx, [esi+TToolbar._btn_height]

        mov     [eax+TToolButton.action], ecx
        mov     [eax+TToolButton.state], tbsNeutral
        mov     [eax+TToolButton.width], edx
        mov     [eax+TToolButton.icon], ebx

        jecxz   .action_ok

        istype  ecx, TAction
        jne     .action_ok

        exec    ecx, TAction:Attach, [.self]

.action_ok:
        exec    esi, TToolbar:ForceRefresh
        popad
        return
endp



method TToolbar.ClearState
begin
        pushad
        mov     esi, [.self]
        mov     edi, [esi+TToolbar._buttons]
        mov     ecx, [edi+TArray.count]
        lea     edi, [edi+TArray.array]

.loop:
        dec     ecx
        js      .finish

        mov     [edi+TToolButton.state], tbsNeutral
        add     edi, sizeof.TToolButton
        jmp     .loop

.finish:
        popad
        return
endp



method TToolbar._RenderView
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TToolbar._buttons]
        mov     ecx, [edi+TArray.count]
        jecxz   .finish

        mov     ebx, [esi+TToolbar._canvas]
        test    ebx, ebx
        jnz     .canvas_ok

        mov     eax, ecx
        imul    eax, [esi+TToolbar._btn_height]
        stdcall CreateImage2, eax, [esi+TToolbar._btn_height], FALSE
        mov     [esi+TToolbar._canvas], eax
        mov     ebx, eax

.canvas_ok:

        lea     edi, [edi + TArray.array]
        xor     edx, edx

.loop:
        dec     ecx
        js      .finish

        stdcall DrawToolbarBtn, ebx, edi, edx, 0, [esi+TToolbar._btn_height]

        add     edx, [edi+TToolButton.width]
        add     edi, sizeof.TToolButton
        jmp     .loop


.finish:
        inc     [esi+TToolbar._canvas_valid]
        popad
        return
endp


proc IsToolButtonDisabled, .btn
begin
        push    ecx
        mov     ecx, [.btn]
        jecxz   .done

        mov     ecx, [ecx+TToolButton.action]
        jecxz   .done

        istype  ecx, TMenu
        cmove   ecx, [ecx+TMenu._enabled]
        je      .done

        istype  ecx, TAction
        cmove   ecx, [ecx+TAction._enabled]
        je      .done

        xor     ecx, ecx

.done:
        shr     ecx, 1
        cmc
        pop     ecx
        return
endp



proc DrawToolbarBtn, .canvas, .pButton, .x, .y, .height
.bounds TBounds
begin
        pushad
        mov     edi, [.pButton]

        mov     eax, [.x]
        mov     ecx, [.y]
        mov     [.bounds.x], eax
        mov     [.bounds.y], ecx

        mov     eax, [edi+TToolButton.width]
        mov     ecx, [.height]
        mov     [.bounds.width], eax
        mov     [.bounds.height], ecx

        mov     ebx, [edi+TToolButton.state]

        lea     eax, [.bounds]
        stdcall [DrawBox], [.canvas], eax, [GUI.clToolBtnBk+4*ebx], [GUI.tbBorder+4*ebx], [GUI.tbBorderWidth]

        cmp     [edi+TToolButton.action], 0
        je      .draw_separator

        mov     eax, 4
        imul    eax, [edi+TToolButton.width]
        xor     edx, edx
        div     [esi+TToolbar._btn_height]
        
        add     [.bounds.x], eax
        add     [.bounds.y], 4

        mov     eax, [GUI.tbPressedOfsX]
        mov     edx, [GUI.tbPressedOfsY]

        cmp     [edi+TToolButton.state], tbsHovered
        jne     @f
        neg     eax
        neg     edx
@@:
        cmp     [edi+TToolButton.state], tbsPressed
        je      @f
        cmp     [edi+TToolButton.state], tbsHovered
        je      @f
        xor     eax, eax
        xor     edx, edx
@@:
        add     [.bounds.x], eax
        add     [.bounds.y], edx

        istype  [edi+TToolButton.action], TAction
        je      .action_icon

        mov     ecx, [edi+TToolButton.icon]
        test    ecx, ecx
        jz      .finish
        jmp     .draw_icon

.action_icon:
        get     ecx, [edi+TToolButton.action], TAction:Icon
        test    ecx, ecx
        jz      .finish

.draw_icon:
        stdcall BlendImage, [.canvas], [.bounds.x], [.bounds.y], ecx, 0, 0, [ecx+TImage.width], [ecx+TImage.height]

.finish:
        popad
        return

.draw_separator:

        mov     ecx, [edi+TToolButton.width]
        sub     ecx, 2
        sub     [.bounds.height], ecx
        shr     ecx, 1
        add     [.bounds.x], ecx
        add     [.bounds.y], ecx
        mov     [.bounds.width], 2

        lea     eax, [.bounds]
        stdcall DrawBoxDefault, [.canvas], eax, 0, [GUI.tbSeparatorType], 1
;        stdcall DrawSolidRect, [.canvas], ecx, [.bounds.y], 2, [.bounds.height], [GUI.clToolSeparator]
;        stdcall DrawSolidRect, [.canvas], [.bounds.x], 0, [edi+TToolButton.width], 2, clAlizarin

        jmp     .finish


endp



method TToolbar.Autosize
begin
        inherited
        mov     edx, [.self]
        mov     edx, [edx+TToolbar._btn_height]
        return
endp



method TToolbar.EventMouseEnter
begin
;        exec    [.self], TToolbar:SimpleSetParam, 0, TToolbar._state, tbsHovered
        inherited
        return
endp


method TToolbar.EventMouseLeave
begin
        exec    [.self], TToolbar:ClearState
        exec    [.self], TToolbar:ForceRefresh
        inherited
        return
endp


method TToolbar.EventMouseMove
begin
        test    [.kbdState], maskBtnLeft
        jnz     .exit

        exec    [.self], TToolbar:ClearState
        exec    [.self], TToolbar:HitTest, [.x], [.y]
        jc      .finish

        stdcall IsToolButtonDisabled, eax
        jc      .finish

        mov     [eax+TToolButton.state], tbsHovered

.finish:
        exec    [.self], TToolbar:ForceRefresh

.exit:
        inherited [.x], [.y], [.kbdState]
        return
endp


method TToolbar.EventButtonPress
begin
        exec    [.self], TToolbar:ClearState

        exec    [.self], TToolbar:HitTest, [.x], [.y]
        jc      .finish

        mov     ecx, [eax+TToolButton.action]
        jecxz   .finish

        stdcall IsToolButtonDisabled, eax
        jc      .finish

        mov     [eax+TToolButton.state], tbsPressed
        stdcall SetMouseCapture, [.self]

.finish:
        exec    [.self], TToolbar:ForceRefresh
        return
endp



method TToolbar.EventButtonRelease
begin
        pushad

        stdcall SetMouseCapture, 0

        mov     esi, [.self]
        mov     edi, [esi+TToolbar._buttons]
        mov     ecx, [edi+TArray.count]
        lea     edi, [edi+TArray.array]

        xor     edx, edx
        
.loop:
        dec     ecx
        js      .finish

        cmp     [edi+TToolButton.state], tbsPressed
        je      .end_scan

        add     edx, [edi+TToolButton.width]
        add     edi, sizeof.TToolButton
        jmp     .loop

.end_scan:
        exec    esi, TToolbar:HitTest, [.x], [.y]
        jc      .finish

        cmp     eax, edi
        jne     .finish

        mov     [edi+TToolButton.state], tbsHovered
        exec    esi, TToolbar:ForceRefresh

        istype  [edi+TToolButton.action], TAction
        jne     .maybe_menu

        exec    [edi+TToolButton.action], TAction:Execute, esi
        jmp     .finish

.maybe_menu:
        istype  [edi+TToolButton.action], TMenu
        jne     .finish

        exec    [edi+TToolButton.action], TMenu:Show, esi, edx, [esi+TToolbar._btn_height]

.finish:
        popad
        return
endp



endmodule

Added freshlib/gui/TTreeView.asm.





































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TTreeView object class
;
;  Target OS: Any
;
;  Dependencies:
;  Notes:
;_________________________________________________________________________________________
module "TreeView library"


; tree-view item state flags.
tvisExpanded = 1
tvisSelected = 2

; iterate visible items flags

iifViewport = 1         ; iterate only items that are in the viewport of the control.
                        ; if not set, the items that are "visible" because of the expanded parent items
                        ; will cause callback call as well.


; TTreeView:HitTest return flags

tvhtNone = 0
tvhtIndentation = 1
tvhtExpandIcon = 2
tvhtItemIcon = 3
tvhtItemText = 4


struct TTVItem
  .        TTItem

  .caption      dd ?
  .state        dd ?
  .imgNormal    dd ?    ; TImage
  .imgSelected  dd ?    ; TImage

  .xwidth       dd ?

  .UserData0    dd ?    ; 6 dword for user data.
  .UserData1    dd ?
  .UserData2    dd ?
  .UserData3    dd ?
  .UserData4    dd ?
  .UserData5    dd ?

  .shift = 6
ends



object TTreeView, TScrollable

  ._canvas        dd ?
  ._canvas_valid  dd ?

  ._root          dd ?    ; The first root TTVItem element. Its siblings stay on root.
  ._index         dd ?    ; TArray with dword index to the displayable items of ._items array.

  ._focused       dd ?

  ._line_height dd ?
  ._text_offset dd ?
  ._margin_top  dd ?
  ._margin_left dd ?

  ._max_width   dd ?    ; 0 means unknown

  ._on_focused_change dd ?

  ._free_item_proc    dd ?

  param  .root, ._root, .SetRoot

  param  .OnFocusItem, ._on_focused_change, ._on_focused_change
  param  .FocusedItem, ._focused, .SetFocused
  param  .FreeItemProc, ._free_item_proc, ._free_item_proc

  method .SetRoot, .value

  method .SetFocused, .value

  method .Create, .parent
  method .Destroy

  method .ClearSelection, .mask
  method .IterateVisibleItems, .start_item, .flags, .callback, .user
  method .HitTest, .x, .y

  method .ScrollToBottom

  method .ContentChanged

  method .__RebuildIndex
  method .__RebuildWidths

  method .ForceRefresh
  method .__UpdateImages
  method .SelfPaint, .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height    ; Paints itself on the caller provided TImage.

  method .__RenderTree
  method .UpdateScrollBar

  method .Resize, .newWidth, .newHeight

  method .EventKeyPress, .utf8, .scancode, .kbdState
  method .EventButtonPress, .button, .kbdState, .x, .y
  method .EventButtonDoubleClick, .button, .kbdState, .x, .y
  method .EventScroll, .direction, .command, .value

  method .EventFocusIn
  method .EventFocusOut

  method .SearchOrCreate, .MatchProc, .InitProc, .pParent, .UserParam     ; searches the children of the [.iParent] element and returns the first matched (according to the MatchProc)
                                                                          ; If none match adds new element and returns its index (in EAX) and pointer (in EDX)
endobj



interface TTreeView.IterateCallback, .pTreeView, .pItem, .yItem, .user
interface TTreeView.OnFocusItem, .pTreeView, .pFocused, .pUnfocused
interface TTreeView.ItemProcess, .pItem, .user_data


proc TTreeView.FreeItem, .pItem
begin
        push    eax

        mov     eax, [.pItem]
        stdcall StrDel, [eax+TTVItem.caption]
        stdcall FreeMem, eax

        pop     eax
        return
endp



method TTreeView.Create ; .parent
begin
        inherited [.parent]

        pushad
        mov     esi, [.self]

        mov     [esi+TTreeView._margin_top], 4
        mov     [esi+TTreeView._margin_left], 4

        stdcall GetFontMetrics, [GUI.DefaultFont]
        add     eax, 4
        add     ebx, 2
        mov     [esi+TTreeView._line_height], eax
        mov     [esi+TTreeView._text_offset], ebx

        set     esi, TTreeView:WantFocus, TRUE

        mov     [esi+TTreeView._free_item_proc], TTreeView.FreeItem
        popad
        return
endp




method TTreeView.Destroy
begin
        push    ebx

        mov     ebx, [.self]

        set     ebx, TTreeView:Visible, FALSE   ; in order to not try to update the view.

        stdcall FreeMem, [ebx+TTreeView._index]
        stdcall TreeTearAndFreeAll, [ebx+TTreeView._root], [ebx+TTreeView._free_item_proc]

        pop     ebx

        inherited
        return
endp


method TTreeView.ContentChanged
begin
        push    esi
        mov     esi, [.self]

        exec    esi, TTreeView:__RebuildWidths
        exec    esi, TTreeView:__RebuildIndex
        exec    esi, TTreeView:UpdateScrollBar

        and     [esi+TTreeView._canvas_valid], 0
        exec    esi, TTreeView:RectChanged2, 0

        pop     esi
        return
endp



method TTreeView.UpdateScrollBar
begin
        pushad

        mov     esi, [.self]
        mov     ecx, [esi+TWindow._width]
        mov     edx, [esi+TWindow._height]
        mov     edi, [GUI.boxBorderWidth]

        mov     ebx, edx

        sub     ecx, [GUI.scrollWidth]          ; width - scrollWidth
        sub     ebx, [GUI.scrollWidth]          ; height - scrollWidth

        sub     ecx, edi                        ; width - boxBorderWidth
        sub     ebx, edi                        ; height - boxBorderWidth

        shl     edi, 1

        sub     edx, edi                        ; total client height - borders.
        js      .finish

        set     esi, TTreeView:PageX, ecx

        mov     eax, [esi+TTreeView._max_width]
        sub     eax, ecx
        jns     @f
        xor     eax, eax
@@:
        cmp     eax, [esi + TTreeView._scrXY.pos]
        jge     .set_max_x

        set     esi, TTreeView:PosX, eax

.set_max_x:
        set     esi, TTreeView:MaxX, eax

        mov     ecx, [esi+TTreeView._line_height]
        mov     eax, edx
        cdq

        div     ecx
        test    edx, edx
        jz      @f
        inc     eax
@@:
        set     esi, TTreeView:PageY, eax

        mov     ebx, [esi+TTreeView._index]
        test    ebx, ebx
        jz      .finish

        mov     ebx, [ebx+TArray.count]
        sub     ebx, eax
        inc     ebx
        jns     @f
        xor     ebx, ebx
@@:
        cmp     ebx, [esi+TTreeView._scrXY.pos + 4]
        jge     .set_start_y

        set     esi, TTreeView:PosY, ebx

.set_start_y:
        set     esi, TTreeView:MaxY, ebx

.finish:
        popad
        return
endp



method TTreeView.ScrollToBottom
begin
        push    eax ebx

        mov     ebx, [.self]

        mov     eax, [ebx+TTreeView._index]
        mov     eax, [eax+TArray.count]
        sub     eax, [ebx+TTreeView._scrXY.page+4]
        jbe     .finish

        inc     eax
        set     ebx, TTreeView:PosY, eax

.finish:
        pop     ebx eax
        return
endp





method TTreeView.ForceRefresh
begin
        mov     eax, [.self]
        and     [eax+TTreeView._canvas_valid], 0
        inherited
        return
endp



method TTreeView.SelfPaint       ; .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height
begin
        pushad
        mov     esi, [.self]

        cmp     [esi+TTreeView._canvas_valid], 0
        jne     @f
        exec    esi, TTreeView:__RenderTree
@@:
        mov     ebx, [esi+TTreeView._canvas]
        test    ebx, ebx
        jz      .finish

        stdcall BlendImage, [.pDstImage], [.xDst], [.yDst], ebx, [.xSrc], [.ySrc], [.width], [.height]

.finish:
        popad
        inherited [.pDstImage], [.xDst], [.yDst], [.xSrc], [.ySrc], [.width], [.height]
        return
endp




method TTreeView.__UpdateImages
begin
        pushad
        mov     esi, [.self]

        mov     ebx, [esi+TTreeView._visible]
        mov     edi, [esi+TTreeView._canvas]

        mov     ecx, [esi+TTreeView._width]
        mov     edx, [esi+TTreeView._height]

        test    ebx, ebx
        jz      .destroy

        test    edi, edi
        jz      .create_new

; check the size

        cmp     ecx, [edi+TImage.width]
        ja      .destroy

        cmp     edx, [edi+TImage.height]
        jbe     .setwrap

.destroy:
        stdcall DestroyImage, edi                         ; canvas

        xor     eax, eax
        mov     [esi+TTreeView._canvas], eax

        test    ebx, ebx
        jz      .exit


.create_new:

; new size - make it a little bit bigger.

        lea     eax, [ecx+256]
        lea     ebx, [edx+256]

        stdcall CreateImage2, eax, ebx, FALSE
        mov     [esi+TTreeView._canvas], eax
        mov     edi, eax

.setwrap:
        mov     [edi+TImage.wrapW], ecx
        mov     [edi+TImage.wrapH], edx

.exit:
        and     [esi+TTreeView._canvas_valid], 0
        popad
        inherited
        return
endp





method TTreeView.Resize
begin
        inherited [.newWidth], [.newHeight]
        exec      [.self], TTreeView:UpdateScrollBar
        return
endp




method TTreeView.__RebuildIndex
begin
        pushad

        mov     esi, [.self]
        xor     ebx, ebx        ; max_width

        stdcall CreateArray, 4
        mov     edx, eax

        mov     edi, [esi+TTreeView._root]
        test    edi, edi
        jz      .finish

.loop:
        stdcall AddArrayItems, edx, 1
        mov     [eax], edi

        cmp     ebx, [edi+TTVItem.xwidth]
        cmovl   ebx, [edi+TTVItem.xwidth]

        test    [edi+TTVItem.state], tvisExpanded
        jz      .next

        mov     eax, [edi+TTVItem.firstChild]
        test    eax, eax
        cmovnz  edi, eax
        jnz     .loop

.next:
        mov     eax, [edi+TTVItem.next]
        test    eax, eax
        cmovnz  edi, eax
        jnz     .loop

        mov     eax, [edi+TTVItem.parent]
        test    eax, eax
        cmovnz  edi, eax
        jnz     .next

.finish:
        xchg    edx, [esi+TTreeView._index]
        stdcall FreeMem, edx

        mov     [esi+TTreeView._max_width], ebx


        popad
        return
endp



method TTreeView.__RebuildWidths
begin
        pushad
        mov     esi, [.self]
        mov     ebx, [esi+TTreeView._line_height]
        add     ebx, [esi+TTreeView._margin_left]

        mov     edi, [esi+TTreeView._root]
        test    edi, edi
        jz      .finish

.loop_in:
        add     ebx, [esi+TTreeView._line_height]
.loop:
;        cmp     [edi+TTVItem.xwidth], 0          ;
;        jne     .next

; compute xwidth
        stdcall StrPtr, [edi+TTVItem.caption]
        stdcall GetTextBounds, eax, [eax+string.len], [GUI.DefaultFont]
        add     eax, ebx
        mov     [edi+TTVItem.xwidth], eax

; go to the children

.next:
        mov     eax, [edi+TTVItem.firstChild]
        test    eax, eax
        cmovnz  edi, eax
        jnz     .loop_in

; go to next sibling.
.nexts:
        mov     eax, [edi+TTVItem.next]
        test    eax, eax
        cmovnz  edi, eax
        jnz     .loop

; go to the parent.
        sub     ebx, [esi+TTreeView._line_height]
        mov     eax, [edi+TTVItem.parent]
        test    eax, eax
        cmovnz  edi, eax
        jnz     .nexts

.finish:
        popad
        return
endp




method TTreeView.__RenderTree
.bounds TBounds
begin
        pushad
        mov     esi, [.self]

; clear the background
        xor     eax, eax
        mov     [.bounds.x], eax
        mov     [.bounds.y], eax

        mov     ecx, [esi+TTreeView._width]
        mov     edx, [esi+TTreeView._height]
        mov     [.bounds.width], ecx
        mov     [.bounds.height], edx

        lea     eax, [.bounds]
        stdcall [DrawBox], [esi+TTreeView._canvas], eax, [GUI.clTreeViewBack], bxNone, 0

; check the index
        mov     edi, [esi+TTreeView._index]
        test    edi, edi
        jz      .end_paint

        get     ecx, esi, TTreeView:PosY
        cmp     ecx, [edi+TArray.count]
        jae     .end_paint

        mov     edi, [edi + TArray.array + 4*ecx]       ; The first TTVItem

        mov     ebx, -2      ; current tree level -1 (at .loop_in it is incremented and becomes the exact value).
        mov     eax, edi
.lvl:
        inc     ebx
        mov     eax, [eax+TTVItem.parent]
        test    eax, eax
        jnz     .lvl

        mov     edx, [esi+TTreeView._margin_top]

.loop_in:
        inc     ebx

.loop:
        stdcall TTreeView.__PaintOneItem, esi, edi, ebx, edx
        add     edx, [esi+TTreeView._line_height]
        cmp     edx, [esi+TTreeView._height]
        jae     .end_paint

        test    [edi+TTVItem.state], tvisExpanded
        jz      .nexts

.next:
        mov     eax, [edi+TTVItem.firstChild]
        test    eax, eax
        cmovnz  edi, eax
        jnz     .loop_in

.nexts:
        mov     eax, [edi+TTVItem.next]
        test    eax, eax
        cmovnz  edi, eax
        jnz     .loop

        dec     ebx
        mov     eax, [edi+TTVItem.parent]
        test    eax, eax
        cmovnz  edi, eax
        jnz     .nexts

.end_paint:

        lea     eax, [.bounds]
        mov     ecx, [GUI.tvBorder]
        or      ecx, bxNoFill
        stdcall [DrawBox], [esi+TTreeView._canvas], eax, [GUI.clTreeViewBack], ecx, [GUI.boxBorderWidth]


        inc     [esi+TTreeView._canvas_valid]
        popad
        return
endp




proc TTreeView.__PaintOneItem, .pTreeView, .pItem, .Level, .y
.back dd ?
.text dd ?
begin
        pushad

        mov     esi, [.pTreeView]
        mov     edi, [.pItem]

        mov     ecx, [.Level]
        imul    ecx, [esi+TTreeView._line_height]
        add     ecx, [esi+TTreeView._margin_left]
        sub     ecx, [esi+TTreeView._scrXY.pos]          ; X coordinate of the text!

; choose colors
        mov     eax, [GUI.clTreeViewText]
        mov     ebx, [GUI.clTreeViewBack]

        test    [edi+TTVItem.state], tvisSelected
        jz      .sel_ok

        mov     eax, [GUI.clTreeSelectedTxt]
        mov     ebx, [GUI.clTreeSelected]

.sel_ok:

        cmp     edi, [esi+TTreeView._focused]
        jne     .focus_ok

        mov     eax, [GUI.clTreeFocusedTxt]
        mov     ebx, [GUI.clTreeFocused]

        cmp     esi, [__FocusedWindow]
        je      .focus_ok

        mov     eax, [GUI.clTreeFocused2Txt]
        mov     ebx, [GUI.clTreeFocused2]

.focus_ok:

        mov     [.text], eax
        mov     [.back], ebx

        mov     edx, [.y]

; draw lines

        push    ecx edx edi

        mov     eax, [esi+TTreeView._line_height]
        sar     eax, 1
        add     ecx, eax
        lea     ebx, [edx+eax]

;        cmp     [edi+TTVItem.firstChild], 0
;        jne     .skip_line

        stdcall BlendSolidRect, [esi+TTreeView._canvas], ecx, ebx, eax, 1, [GUI.clTreeViewLines]

        mov     ebx, eax
        cmp     [edi+TTVItem.next], 0
        cmovnz  ebx, [esi+TTreeView._line_height]

.line_loop:
        stdcall BlendSolidRect, [esi+TTreeView._canvas], ecx, edx, 1, ebx, [GUI.clTreeViewLines]

.skip_line:
        mov     ebx, [esi+TTreeView._line_height]
        sub     ecx, ebx
        js      .end_lines

        mov     edi, [edi+TTVItem.parent]
        test    edi, edi
        jz      .end_lines

        cmp     [edi+TTVItem.next], 0
        jne     .line_loop
        jmp     .skip_line

.end_lines:
        pop     edi edx ecx

; draw state icon

        cmp     [edi+TTVItem.firstChild], 0
        je      .state_icon_ok

; which icon
        mov     ebx, [edi+TTVItem.state]
        and     ebx, tvisExpanded
        mov     ebx, [GUI.tvIcons+8*ebx]                    ; TImage with the expand/collapse icon

        push    ecx edx

; center the icon in  X
        mov     eax, [esi+TTreeView._line_height]
        sub     eax, [ebx+TImage.width]
        sar     eax, 1
        adc     ecx, eax

; center the icon in Y
        mov     eax, [esi+TTreeView._line_height]
        sub     eax, [ebx+TImage.height]
        sar     eax, 1
        adc     edx, eax

        stdcall BlendImage, [esi+TTreeView._canvas], ecx, edx, ebx, 0, 0, [ebx+TImage.width], [ebx+TImage.height]
        pop     edx ecx

.state_icon_ok:

; draw item icon

        add     ecx, [esi+TTreeView._line_height]

        mov     ebx, [edi+TTVItem.imgSelected]
        test    ebx, ebx
        jz      .icon_normal

        test    [edi+TTVItem.state], tvisSelected
        jnz     .draw_icon

.icon_normal:
        mov     ebx, [edi+TTVItem.imgNormal]
        test    ebx, ebx
        jz      .icon_ok

.draw_icon:
        push    ecx edx

; center the icon
        mov     eax, [esi+TTreeView._line_height]
        sub     eax, [ebx+TImage.width]
        sar     eax, 1
        add     ecx, eax

        mov     eax, [esi+TTreeView._line_height]
        sub     eax, [ebx+TImage.height]
        sar     eax, 1
        add     edx, eax

        stdcall BlendImage, [esi+TTreeView._canvas], ecx, edx, ebx, 0, 0, [ebx+TImage.width], [ebx+TImage.height]

        pop     edx ecx

        add     ecx, [esi+TTreeView._line_height]

.icon_ok:
        stdcall StrPtr, [edi+TTVItem.caption]
        jc      .finish

        test    eax, eax
        jz      .finish

        push    edx
        stdcall GetTextBounds, eax, [eax+string.len], [GUI.DefaultFont]
        pop     edx
        add     eax, 4

        stdcall BlendSolidRect, [esi+TTreeView._canvas], ecx, edx, eax, [esi+TTreeView._line_height], [.back]

        add     edx, [esi+TTreeView._text_offset]
        add     ecx, 2

        stdcall StrPtr, [edi+TTVItem.caption]
        stdcall DrawString, [esi+TTreeView._canvas], eax, [eax+string.len], ecx, edx, [GUI.DefaultFont], [.text]

.finish:
        popad
        return
endp




method TTreeView.EventKeyPress  ;, .utf8, .scancode, .kbdState
begin
        inherited [.utf8], [.scancode], [.kbdState]
        jc        .exit

        pushad

        mov     esi, [.self]
        mov     edi, [esi+TTreeView._index]
        test    edi, edi
        jz      .not_processed

        mov     eax, [.utf8]
        test    eax, eax
        jz      .no_char

; search the treeview???

.not_processed:
        clc
        popad

.exit:
        return

.no_char:
        mov     eax, [.scancode]
        test    [.kbdState], maskCtrl
        jnz     .move_nodes

        cmp     eax, keyUpNumpad
        je      .up
        cmp     eax, keyUp
        je      .up

        cmp     eax, keyDownNumpad
        je      .down
        cmp     eax, keyDown
        je      .down

        cmp     eax, keyPgUpNumpad
        je      .pgup
        cmp     eax, keyPgUp
        je      .pgup

        cmp     eax, keyPgDnNumpad
        je      .pgdn
        cmp     eax, keyPgDown
        je      .pgdn

        cmp     eax, keyHomeNumpad
        je      .home
        cmp     eax, keyHome
        je      .home

        cmp     eax, keyEndNumpad
        je      .end
        cmp     eax, keyEnd
        je      .end

        cmp     eax, keyLeftNumpad
        je      .left
        cmp     eax, keyLeft
        je      .left

        cmp     eax, keyRightNumpad
        je      .right
        cmp     eax, keyRight
        je      .right

        jmp     .not_processed


.move_nodes:
        cmp     eax, keyUpNumpad
        je      .move_node_up
        cmp     eax, keyUp
        je      .move_node_up

        cmp     eax, keyDownNumpad
        je      .move_node_down
        cmp     eax, keyDown
        je      .move_node_down

        jmp     .not_processed


.move_node_up:
        mov     edx, [esi+TTreeView._focused]
        test    edx, edx
        jz      .processed

        cmp     edx, [esi+TTreeView._root]
        je      .processed

        stdcall ListIndexOf, edi, edx
        jc      .processed

        dec     eax
        js      .processed

        mov     ecx, [edi + TArray.array + 4*eax]
        test    ecx, ecx
        jz      .processed

        stdcall TreeTearItem, edx
        stdcall TreeInsBefore, edx, ecx

        cmp     ecx, [esi+TTreeView._root]
        jne     .refresh_after_move

        mov     [esi+TTreeView._root], edx

.refresh_after_move:
        exec    esi, TTreeView:ContentChanged
        jmp     .processed


.move_node_down:
        mov     edx, [esi+TTreeView._focused]
        test    edx, edx
        jz      .processed

        stdcall ListIndexOf, edi, edx
        jc      .processed

        inc     eax
        cmp     eax, [edi+TArray.count]
        jae     .processed

        mov     ecx, [edi + TArray.array + 4*eax]
        test    ecx, ecx
        jz      .processed

        stdcall TreeTearItem, edx
        stdcall TreeInsAfter, edx, ecx

        cmp     edx, [esi+TTreeView._root]
        jne     .refresh_after_move

        mov     [esi+TTreeView._root], ecx
        jmp     .refresh_after_move

;------------------------------------------------------------------

.left:
        mov     eax, [esi+TTreeView._focused]
        cmp     [eax+TTVItem.firstChild], 0
        je      .goto_parent

        test    [eax+TTVItem.state], tvisExpanded
        jnz     .collapse

.goto_parent:
        mov     eax, [eax+TTVItem.parent]
        test    eax, eax
        jz      .exit_processed

        push    eax
        stdcall ListIndexOf, edi, eax
        mov     ebx, eax
        pop     eax
        jmp     .set_focused

.collapse:
        and     [eax+TTVItem.state], not tvisExpanded

        and     [esi+TTreeView._canvas_valid], 0
        exec    esi, TTreeView:__RebuildIndex
        exec    esi, TTreeView:UpdateScrollBar
        jmp     .processed

.right:
        mov     eax, [esi+TTreeView._focused]
        cmp     [eax+TTVItem.firstChild], 0
        je      .down

        test    [eax+TTVItem.state], tvisExpanded
        jnz     .down

;expand
        call    .prev_selection

        or      [eax+TTVItem.state], tvisExpanded

        and     [esi+TTreeView._canvas_valid], 0
        exec    esi, TTreeView:__RebuildIndex
        exec    esi, TTreeView:UpdateScrollBar
        jmp     .processed


.home:
        mov     edx, [edi+TArray.count]
        jmp     .moveup

.up:
        mov     edx, 1
        jmp     .moveup

.pgup:
        get     edx, esi, TTreeView:PageY
        dec     edx


.moveup:
        mov     eax, [esi+TTreeView._focused]
        test    eax, eax
        jz      .focus_the_first

        stdcall ListIndexOf, edi, eax
        jc      .focus_the_first

        mov     ebx, eax
        sub     ebx, edx
        jns     .index_ok

.focus_the_first:
        xor     ebx, ebx

.index_ok:
        cmp     ebx, [edi+TArray.count]
        jae     .processed

        mov     eax, [edi + TArray.array + 4*ebx]
        test    eax, eax
        jz      .processed

.set_focused:
        call    .prev_selection
        set     esi, TTreeView:FocusedItem, eax

        mov     eax, [esi+TTreeView._scrXY.pos + 4]
        add     eax, [esi+TTreeView._scrXY.page + 4]

        cmp     ebx, eax
        jae     .scroll_y

        cmp     ebx, [esi+TTreeView._scrXY.pos + 4]
        jae     .processed

.scroll_y:
        set     esi, TTreeView:PosY, ebx

.processed:
        exec    esi, TTreeView:RectChanged2, 0

.exit_processed:
        stc
        popad
        return


.end:
        mov     edx, [edi+TArray.count]
        jmp     .move_down

.down:
        mov     edx, 1
        jmp     .move_down

.pgdn:
        get     edx, esi, TTreeView:PageY
        dec     edx


.move_down:
        mov     eax, [esi+TTreeView._focused]
        test    eax, eax
        jz      .focus_the_first

        stdcall ListIndexOf, edi, eax
        jc      .focus_the_first

        mov     ebx, eax
        add     ebx, edx
        jc      .processed

        cmp     ebx, [edi+TArray.count]
        jb      .posok

.focus_last:
        mov     ebx, [edi+TArray.count]
        dec     ebx
        js      .processed

.posok:
        call    .prev_selection

        mov     eax, [edi + TArray.array + 4*ebx]
        test    eax, eax
        jz      .processed

        set     esi, TTreeView:FocusedItem, eax

        get     ecx, esi, TTreeView:PageY
        jecxz   .processed

        sub     ecx, 2
        sub     ebx, ecx

        cmp     ebx, [esi+TTreeView._scrXY.pos + 4]
        jle     .processed

        set     esi, TTreeView:PosY, ebx
        jmp     .processed

; local procedure
.prev_selection:
        push    eax
        test    [.kbdState], maskShift
        jnz     .sel_up_ok

        exec    esi, TTreeView:ClearSelection, not tvisSelected

.sel_up_ok:
        pop     eax
        retn
endp



method TTreeView.EventButtonPress        ;, .button, .kbdState, .x, .y
begin
        inherited [.button], [.kbdState], [.x], [.y]
        jc        .processed

        pushad

        mov     esi, [.self]

        exec    esi, TTreeView:HitTest, [.x], [.y]

        cmp     eax, tvhtNone
        je      .finish

        cmp     eax, tvhtExpandIcon
        je      .expand_collapse

        test    [.kbdState], maskShift or maskCtrl
        jnz     @f

        exec    esi, TTreeView:ClearSelection, not tvisSelected

@@:
        set     esi, TTreeView:FocusedItem, edx
        jmp     .finish

.expand_collapse:

        xor     [edx+TTVItem.state], tvisExpanded

        and     [esi+TTreeView._canvas_valid], 0
        exec    esi, TTreeView:__RebuildIndex
        exec    esi, TTreeView:UpdateScrollBar

.finish:
        exec    [.self], TWindow:RectChanged2, 0

        popad

.processed:
        return
endp


method TTreeView.EventButtonDoubleClick    ;, .button, .kbdState, .x, .y
begin
        pushad

        mov     esi, [.self]

        exec    esi, TTreeView:HitTest, [.x], [.y]

        cmp     eax, tvhtNone
        je      .processed

        cmp     eax, tvhtExpandIcon
        je      .expand_collapse
        cmp     eax, tvhtItemIcon
        je      .expand_collapse
        cmp     eax, tvhtItemText
        jne     .processed

.expand_collapse:

        xor     [edx+TTVItem.state], tvisExpanded

        exec    [.self], TTreeView:ContentChanged
        popad

.processed:
        inherited [.button], [.kbdState], [.x], [.y]
        return
endp





;  method .IterateVisibleItems, .start_item, .flags, .callback, .user
method TTreeView.IterateVisibleItems
.end dd ?

.min_item dd ?
.maxy dd ?
begin
        pushad

;        mov     esi, [.self]
;
;        mov     eax, [esi+TTreeView._height]
;        mov     [.maxy], eax
;
;        mov     eax, [esi+TTreeView._items]
;        mov     eax, [eax+TArray.count]
;
;        mov     ecx, [.start_item]
;        get     edx, esi, TTreeView:PosY
;
;        shl     eax, TTVItem.shift
;        shl     ecx, TTVItem.shift
;        shl     edx, TTVItem.shift
;
;        add     eax, [esi+TTreeView._items]
;        add     ecx, [esi+TTreeView._items]
;        add     edx, [esi+TTreeView._items]
;
;        lea     eax, [eax+TArray.array]
;        lea     ecx, [ecx+TArray.array]
;        lea     edx, [edx+TArray.array]
;
;        mov     [.end], eax
;        mov     [.min_item], edx
;
;        xor     edx, edx
;        dec     edx        ; current level = $ffffffff - unsigned cmp
;
;        xor     edi, edi   ; current Y coordinate.
;        add     edi, [esi+TTreeView._margin_top]   ; top margin.
;
;.item_loop:
;        cmp     ecx, [.end]
;        jae     .end_items
;
;;        cmp     [ecx+TTVItem.level], edx
;        ja      .next_item
;        je      .equal
;
;; below
;;        mov     edx, [ecx+TTVItem.level]
;
;.equal:
;        test    [ecx+TTVItem.state], tvisExpanded
;        jz      .visible
;
;        inc     edx
;
;.visible:
;        test    [.flags], iifViewport
;        jz      .yes
;
;        cmp     ecx, [.min_item]
;        jb      .next_item
;
;        cmp     edi, [.maxy]
;        ja      .end_items
;
;.yes:
;        pushad
;        stdcall [.callback], esi, ecx, edi, [.user]
;        popad
;        jc      .found
;
;        add     edi, [esi+TTreeView._line_height]
;
;.next_item:
;        add     ecx, sizeof.TTVItem
;        jmp     .item_loop
;
;.end_items:
;        clc
;        popad
;        return
;
;.found:
;        mov     [esp+regEAX*4], ecx
        popad
        return
endp




; returns:
;   eax - hit test flag tvhtXXXXXXXXX
;   edx - TTVItem (if eax in [tvhtExpandIcon, tvhtItemIcon, tvhtItemText)
;   ecx - the index of the TTVItem in the _index array.

method TTreeView.HitTest
begin
        pushad

        mov     esi, [.self]

        mov     eax, [.y]
        sub     eax, [esi+TTreeView._margin_top]
        mov     ecx, [esi+TTreeView._line_height]

        xor     edx, edx

        div     [esi+TTreeView._line_height]
        mov     ecx, eax
        add     ecx, [esi+TTreeView._scrXY.pos + 4]  ; index

        mov     ebx, [esi+TTreeView._index]
        test    ebx, ebx
        jz      .not_found

        cmp     ecx, [ebx+TArray.count]
        jae     .not_found

        mov     edi, [ebx+4*ecx+TArray.array]   ; pointer to TTVItem

        or      edx, -1
        mov     eax, edi

.lvl_loop:
        inc     edx
        mov     eax, [eax+TTVItem.parent]
        test    eax, eax
        jnz     .lvl_loop

        imul    edx, [esi+TTreeView._line_height]
        add     edx, [esi+TTreeView._margin_left]

        mov     eax, tvhtIndentation

        cmp     [.x], edx
        jb      .finish

        add     edx, [esi+TTreeView._line_height]
        mov     eax, tvhtExpandIcon

        cmp     [.x], edx
        jb      .finish

        add     edx, [esi+TTreeView._line_height]

        mov     eax, tvhtItemIcon

        cmp     [.x], edx
        jb      .finish

        mov     eax, tvhtItemText

.finish:
        mov     [esp+regEDX*4], edi
        mov     [esp+regEAX*4], eax
        mov     [esp+regECX*4], ecx
        popad
        return

.not_found:
        xor     edi, edi
        mov     eax, tvhtNone
        jmp     .finish

endp



method TTreeView.ClearSelection
begin
        pushad

        mov     esi, [.self]
        mov     edi, [esi+TTreeView._root]
        test    edi, edi
        jz      .finish

        mov     ebx, [.mask]

.loop:
        and     [edi+TTVItem.state], ebx

        mov     eax, [edi+TTVItem.firstChild]
        test    eax, eax
        cmovnz  edi, eax
        jnz     .loop

.next:
        mov     eax, [edi+TTVItem.next]
        test    eax, eax
        cmovnz  edi, eax
        jnz     .loop

        mov     eax, [edi+TTVItem.parent]
        test    eax, eax
        cmovnz  edi, eax
        jnz     .next

.finish:
        and     [esi+TTreeView._canvas_valid], 0
        popad
        return
endp




method TTreeView.SetRoot ; , .value
begin
        pushad

        mov     esi, [.self]
        mov     edx, [.value]

        xchg    edx, [esi+TTreeView._root]

        stdcall TreeTearAndFreeAll, edx, [esi+TTreeView._free_item_proc]

        xor     eax, eax
        xchg    eax, [esi+TTreeView._focused]

        exec    esi, TTreeView:ContentChanged

        popad
        return
endp


method TTreeView.SetFocused     ;, .value
begin
        pushad
        mov     esi, [.self]
        mov     ecx, [.value]

        test    ecx, ecx
        jz      .selected_ok

        or      [ecx+TTVItem.state], tvisSelected

.selected_ok:
        xchg    ecx, [esi+TTreeView._focused]

        cmp     ecx, [esi+TTreeView._focused]
        je      .finish

        mov     eax, [esi+TTreeView._on_focused_change]
        test    eax, eax
        jz      .finish

        push    esi
        stdcall eax, esi, [esi+TTreeView._focused], ecx           ; interface TTreeView.OnFocusItem2, .pTreeView, .pFocused, .pUnfocused
        pop     esi

.finish:
        and     [esi+TTreeView._canvas_valid], 0
        exec    esi, TWindow:RectChanged2, 0

        popad
        return
endp


; method .SearchOrCreate, .MatchProc, .InitProc, .pParent, .UserParam
method TTreeView.SearchOrCreate
begin
        pushad

        mov     esi, [.self]
        mov     edx, [.pParent]

        test    edx, edx
        cmovz   edx, [esi+TTreeView._root]
        jz      @f
        mov    edx, [edx+TTVItem.firstChild]
@@:
        mov     ecx, edx        ; previous item

.search_loop:
        test    edx, edx
        jz      .not_found

        pushad
        stdcall [.MatchProc], edx, [.UserParam]
        popad
        jc      .found

        mov     ecx, edx
        mov     edx, [edx+TTVItem.next]
        jmp     .search_loop

.found:
        mov     [esp+4*regEAX], edx

        stc
        popad
        return


.not_found:
        stdcall GetMem, sizeof.TTVItem
        mov     [esp+4*regEAX], eax

        test    ecx, ecx
        jnz     .add_after

        cmp     [.pParent], ecx ; ecx == 0 here!
        jne     .add_child

        mov     ecx, [esi+TTreeView._root]
        test    ecx, ecx
        jnz     .append_to_root

; it is the first root element!
        mov     [esi+TTreeView._root], eax
        jmp     .do_init

.append_to_root:
        cmp     [ecx+TTVItem.next], 0
        cmovne  ecx, [ecx+TTVItem.next]
        jne     .append_to_root
        jmp     .add_after

.add_child:
        stdcall TreeAppendChild, eax, [.pParent]
        jmp     .do_init

.add_after:
        stdcall TreeInsAfter, eax, ecx

.do_init:
        pushad
        stdcall [.InitProc], eax, [.UserParam]
        popad

        clc
        popad
        return
endp



method TTreeView.EventScroll        ; , .direction, .command, .value
begin
        inherited [.direction], [.command], [.value]
        mov       eax, [.self]
        and       [eax+TTreeView._canvas_valid], 0
        exec      eax, TTreeView:RectChanged2, 0
        return
endp



method TTreeView.EventFocusIn
begin
        push    eax
        mov     eax, [.self]
        and     [eax+TTreeView._canvas_valid], 0
        exec    eax, TTreeView:RectChanged2, 0
        pop     eax
        inherited
        return
endp


method TTreeView.EventFocusOut
begin
        push    eax
        mov     eax, [.self]
        and     [eax+TTreeView._canvas_valid], 0
        exec    eax, TTreeView:RectChanged2, 0
        pop     eax
        inherited
        return
endp


endmodule

Added freshlib/gui/TWindow.asm.



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TWindow object class
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: TWindow is the common ancestor of all visible on the screen controls.
;         This file contains only OS independent part of the library and includes
;         the OS dependent files.
;_________________________________________________________________________________________
module "TWindow library"

; Interfaces for the OS dependent procedures

; NOTICE: Some of them are not needed, so can be removed.


;-----------------------------------------------------------------------------------------
; Creates OS window, according to the content of TWindow structure [.pWindow]
;
; Notice, that this OS windows are created ONLY for the visible top level windows.
;
;-----------------------------------------------------------------------------------------
interface _CreateWindow, .pWindow

;-----------------------------------------------------------------------------------------
; Destroy the OS window. The OS windows are actually destroyed when invisible and then
; recreated when needed.
;-----------------------------------------------------------------------------------------
interface _DestroyWindow, .hwnd


interface _RefreshWindowRect, .hwnd, .x, .y, .width, .height
interface _SetWindowTextUtf8, .hwnd, .hString
interface _SetModalTowards, .hwnd, .hwndParent
interface _FinalizeModal, .hwnd, .hwndParent

; Moves the window to the position from the TWindow._x, TWindow._y fields.
interface _MoveWindow, .pWindow
interface _ResizeWindow, .pWindow

interface _SetFocus, .hwnd

interface _SetWindowState, .pWindow

; returns in EAX:EBX X and Y size of the screen.
interface _GetScreenSize

; probably not needed, but will keep them for some time.

;interface _ClientToScreen, .hwnd, .x, .y
;interface _GetWindowStruct, .hwin
;interface _SetWindowStruct, .hwin, .value
;interface _ShowWindow, .hwnd, .flag
;interface _SetWindowBorder, .hwnd, .brdType
;interface _GetWindowBounds, .hwnd, .pBounds
;interface _SetWindowBounds, .hwnd, .pBounds
;interface _CreateNullWindow
;interface _GetParent, .hwnd
;interface _GetChildren, .hwnd
;interface _GetVisible, .hwnd
;interface _AddChild, .hwnd, .child
;interface _GetWindowTextUtf8, .hwnd, .ptrUtf8
;interface _EnableWindow, .hwnd, .flag
;interface _SetTransientTowards, .hwnd, .hwndParent


include '%TargetOS%/windows.asm'



; Border kind of window.
borderNone    = 0
borderFull    = 1
borderModal   = 2
borderToolbox = 3

; Window behavior flags for the param .Behavior / ._behavior

wbUseTabKeys = 1        ; if set, the Tab/Shift+Tab will not work for passing focus to the next/previous window.
wbUseEnterKey = 2       ; if set, Enter key will not be used for submitting forms.
wbUseEscapeKey = 4      ; if set, Escape key will not be used for canceling forms.

wstMaximizedVert = 1
wstMaximizedHorz = 2
wstMinimized     = 4

; SelfPaint operations

object TWindow, TObject

  .handle         dd ?   ; it is handle to the system provided window.

if TargetOS eq Linux
  .sync_counter dd ?
  .sync_valueLo dd ?
  .sync_valueHi dd ?
  .context      dd ?
end if

  ._x             dd ?
  ._y             dd ?
  ._width         dd ?
  ._height        dd ?

  ._border        dd ?    ; has meaning only for the top level windows!

  ._cursor        dd ?    ; mouse cursor.

  ._winicons      dd ?    ; TArray of pointers to TImage. How these images will be used is OS dependent.

  ._caption       dd ?    ; string handle with window caption.

  ._enabled       dd ?

  ._visible       dd ?
  ._window_state  dd ?    ; has meaning only for top-level windows. Constants wstXXXXXXX

  ._font          dd ?

  ._behavior      dd ?

  .__self_focus   dd ?
  .__focused_child dd ?    ; what child of the window is last focused.

  .__action       dd ?
  .__menu         dd ?

; window screen image

  ._screen        dd ?    ; TImage containing the image of the window with all children composited.
  ._rect_list     dd ?    ; array of rectangles containing all the changed rectangles of the window.

  ._user_data     dd ?

  if defined options.Threads & options.Threads
    ._rect_mx       TMutex
  end if

; window user event handlers

  ._OnSelfPaint    dd ?
  ._OnScroll       dd ?
  ._OnKeyPressed   dd ?
  ._OnKeyReleased  dd ?
  ._OnFocusIn      dd ?
  ._OnFocusOut     dd ?

; user mouse events handlers

  ._OnMouseMove      dd ?
  ._OnButtonPressed  dd ?
  ._OnButtonReleased dd ?
  ._OnDoubleClick    dd ?

; parameters

  param .OSWindow, .GetOSWindow, NONE           ; the first window down the tree, that has window handle.

  param .Action, .__action, .SetAction
  param .Menu, .__menu, .__menu

  param .x,      ._x,      .SetX
  param .y,      ._y,      .SetY
  param .width,  ._width,  .SetWidth
  param .height, ._height, .SetHeight
  param .SplitCell, NONE, .SetSplitCell

  param .border, ._border, ._border
  param .WinIcons, ._winicons, .AddWinIcon

  param .Cursor, ._cursor, ._cursor

  param .Font, ._font, ._font

  param .Visible, ._visible, .SetVisible
  param .Behavior, ._behavior, ._behavior
  param .WindowState, ._window_state, .SetWindowState

  param .OnScreen, .GetOnScreen, NONE
  param .Caption, .GetCaption, .SetCaption

  param .Enabled, .GetEnabled, .SetEnabled
  param .GlobalEnabled, .GetGlobalEnabled, NONE

  param .WantFocus, .GetWantFocus, .__self_focus

  param .Screen, .GetImgScreen, NONE

; Event handlers

  param .OnFocusIn, ._OnFocusIn, ._OnFocusIn
  param .OnFocusOut, ._OnFocusOut, ._OnFocusOut

  param .OnSelfPaint, ._OnSelfPaint, .SetSelfPaint

  param .OnScroll, ._OnScroll, ._OnScroll
  param .OnKeyPressed, ._OnKeyPressed, ._OnKeyPressed
  param .OnKeyReleased, ._OnKeyReleased, ._OnKeyReleased

  param .OnMouseMove, ._OnMouseMove, ._OnMouseMove
  param .OnButtonPressed, ._OnButtonPressed, ._OnButtonPressed
  param .OnButtonReleased, ._OnButtonReleased, ._OnButtonReleased
  param .OnDoubleClick, ._OnDoubleClick, ._OnDoubleClick

  param .UserData, ._user_data, ._user_data

; private methods

  method .__UpdateHandle
  method .__UpdateImages
  method .__UpdateFocus


; parameter methods

  method .SetParent, .value

  method .SetAction, .value

  abstract .UpdateAction, .action    ; to be defined only for controls that can be attached to TAction

  method .SetX, .value
  method .SetY, .value
  method .SetWidth, .value
  method .SetHeight, .value

  method .Move, .newX, .newY
  method .Resize, .newWidth, .newHeight

  method .ExtMove, .newX, .newY
  method .ExtResize, .newWidth, .newHeight

  method .GetOnScreen

  method .GetEnabled
  method .SetEnabled, .value

  method .GetGlobalEnabled

  method .GetCaption
  method .SetCaption, .value

  method .SetVisible, .value
  method .SetWindowState, .value
  method .SetSelfPaint, .value

  method .SetSplitCell, .value

  method .AddWinIcon, .value

  method .GetWantFocus

  method .GetImgScreen

  method .GetOSWindow


; other methods

  method .Create, .parent
  method .Destroy


  method .RemoveChild, .objchild

; Parent/child methods definitions of abstract methods, inherited from TObject

  method .ChildByXY, .x, .y, .onlyenabled

  method .RectChanged2, .pRect     ; invalidates the rectangle, so all children windows in this rectangle are
                                   ; to be redrawn. Called from the children window on any visual changes.
                                   ; notice, that if the child changed the size ot position, it needs special
                                   ; processing of the rectangle. Actually the changed rectangle is the
                                   ; bounding rectangle of the new and old rectangles.

  method .RectChangedXY2, .x, .y, .width, .height
;  method .RectChangedList, .pRectList

  method .ForceRefresh  ; Use this method only for serious refresh tasks, for example on global theme change.

  method  .ClientToScreenXY, .x, .y

; Painting methods

  method .HoleXY, .x, .y  ; Returns TRUE, if the specified point contains transparent "hole", alowing the control below to be seen/clicked.
  method .SelfPaint, .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height    ; Paints itself on the caller provided TImage.

; Layout methods

  method .Autosize      ; Returns in EAX the prefered width and in EDX the prefered height of the Window
                        ; By default (in TWindow) returns the width and height of the window
                        ; Called by the splitgrid layout library.

; System event methods

  method .EventFocusIn
  method .EventFocusOut

  method .EventMouseEnter
  method .EventMouseLeave

  method .EventMouseMove, .x, .y, .kbdState

  method .EventButtonPress, .button, .kbdState, .x, .y
  method .EventButtonRelease, .button, .kbdState, .x, .y
  method .EventButtonDoubleClick, .button, .kbdState, .x, .y

  method .EventScroll, .direction, .command, .value

  method .EventKeyPress, .utf8, .scancode, .kbdState
  method .EventKeyRelease, .utf8, .scancode, .kbdState

  method .CloseRequest, .reason

endobj


interface TWindow.OnFocus, .self
interface TWindow.OnSelfPaint, .self, .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height
interface TWindow.OnScroll, .self, .direction, .command, .value
interface TWindow.OnKeyEvent, .self, .utf8, .scancode, .kbdState
interface TWindow.OnMouseMove, .self, .x, .y, .kbdState
interface TWindow.OnMouseButton, .self, .button, .kbdState, .x, .y
interface TWindow.OnChange, .self       ; not used here, but it is general OnChange event handler.



; OS independent code.
;_________________________________________________________________________________________



method TWindow.Create
begin
        inherited [.parent]

        set     [.self], TWindow:Enabled, TRUE
        set     [.self], TWindow:Cursor, mcArrow
        set     [.self], TWindow:border, borderFull
        set     [.self], TWindow:Behavior, 0

if defined options.Threads & options.Threads
        push    esi
        mov     esi, [.self]
        lea     esi, [esi+TWindow._rect_mx]
        stdcall MutexCreate, 0, esi
        stdcall MutexRelease, esi
        pop     esi
end if
        return
endp


;_________________________________________________________________________________________



method TWindow.Destroy
begin
        pushad

        mov     esi, [.self]

; hide the window, destroy the handle and remove the focus.

        set     esi, TWindow:Visible, FALSE

        xor     edx, edx

        mov     eax, esi
        lock cmpxchg [__LastPointedWindow], edx

        mov     eax, esi
        lock cmpxchg [__ActiveForm], edx

        mov     eax, esi
        lock cmpxchg [__MouseTarget], edx
        jne  @f
        stdcall __MouseCapture, edx
@@:
        mov     eax, esi
        lock cmpxchg [__FocusedWindow], edx

; detach from action if any

        mov     ecx, [esi+TWindow.__action]
        jecxz   @f

        exec    ecx, TAction:Detach, esi

@@:

; Free the icons array.

        xor     eax, eax
        xchg    eax, [esi+TWindow._winicons]
        stdcall ListFree, eax, DestroyImage

; free the string handles

        stdcall StrDel, [esi+TWindow._caption]

if defined options.Threads & options.Threads
        lea     eax, [esi+TWindow._rect_mx]
        stdcall MutexDestroy, eax
end if

        popad

        inherited
        return
endp



method TWindow.RemoveChild
begin
        inherited [.objchild]

        jc      .finish

        push    eax edx
        mov     edx, [.objchild]
        mov     eax, [.self]

        cmp     [eax+TWindow.__focused_child], edx
        jne     .exit

.loop:
        mov     [eax+TWindow.__focused_child], 0
        get     eax, eax, TWindow:Parent
        test    eax, eax
        jnz     .loop

.exit:
        pop     edx eax

.finish:
        return
endp




method TWindow.HoleXY        ; .x, .y
begin
        xor     eax, eax
        return
endp

;_________________________________________________________________________________________

; Paints itself on the caller provided TImage.
; The base implementation in TWindow simply calls the user event handler TWindow:OnPaint and
; renders the children windows on the provided TImage/rectangle.
; The implementations for the controls can use any method of paint, but must to call
; "inherited" at the end;

method TWindow.SelfPaint  ; .pDstImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height
.src  RECT
.dest RECT
.ofsx dd ?
.ofsy dd ?
begin
        pushad

        mov     esi, [.self]
        stdcall LockImg, [.pDstImage]

        mov     eax, [esi+TWindow._OnSelfPaint]
        test    eax, eax
        jz      .user_event_processed

        push    esi
        stdcall eax, esi, [.pDstImage], [.xDst], [.yDst], [.xSrc], [.ySrc], [.width], [.height]
        pop     esi

.user_event_processed:

; The source rectangle:

        mov     ecx, [.xDst]
        mov     edx, [.yDst]
        sub     ecx, [.xSrc]
        sub     edx, [.ySrc]
        mov     [.ofsx], ecx    ; .ofsx and .ofsy actually are the X and Y position of the top-left corner
        mov     [.ofsy], edx    ; of the window on the destination image.

        mov     ecx, [.xDst]
        mov     edx, [.yDst]
        mov     [.src.left], ecx
        mov     [.src.top], edx
        add     ecx, [.width]
        add     edx, [.height]
        mov     [.src.right], ecx
        mov     [.src.bottom], edx
        lea     edi, [.src]

; then blend the children windows

        get     esi, esi, TObject:FirstChild

.children_loop:
        test    esi, esi
        jz      .end_loop

        istype  esi, TWindow
        jne     .next

        get     eax, esi, TWindow:Visible
        test    eax, eax
        jz      .next

        mov     eax, [esi+TWindow._x]
        mov     edx, [esi+TWindow._y]
        add     eax, [.ofsx]
        add     edx, [.ofsy]
        mov     [.dest.left], eax
        mov     [.dest.top], edx
        add     eax, [esi+TWindow._width]
        add     edx, [esi+TWindow._height]
        mov     [.dest.right], eax
        mov     [.dest.bottom], edx

        lea     eax, [.dest]
        stdcall RectIntersect, eax, eax, edi
        jc      .next

        mov     eax, [.dest.left]
        mov     edx, [.dest.top]
        sub     [.dest.right], eax      ; source rectangle width
        sub     [.dest.bottom], edx     ; source rectangle height

        sub     eax, [esi+TWindow._x]
        sub     edx, [esi+TWindow._y]
        sub     eax, [.ofsx]
        sub     edx, [.ofsy]

        exec    esi, TWindow:SelfPaint, [.pDstImage], [.dest.left], [.dest.top], eax, edx, [.dest.right], [.dest.bottom]

.next:
        mov     esi, [esi+TObject.__next]
        jmp     .children_loop

.end_loop:
        stdcall UnlockImg, [.pDstImage]
        popad
        return
endp


method TWindow.GetOnScreen
begin
        push    esi
        mov     esi, [.self]

.loop:
        get     eax, esi, TWindow:Visible
        test    eax, eax
        jz      .finish

        get     esi, esi, TWindow:Parent
        test    esi, esi
        jnz     .loop

.finish:
        pop     esi
        return
endp

;_________________________________________________________________________________________

method TWindow.GetWantFocus
begin
        push    esi
        mov     esi, [.self]
        mov     eax, [esi+TWindow.__self_focus]
        test    eax, eax
        jz      .check_children

        get     eax, esi, TWindow:OnScreen
        test    eax, eax
        jz      .finish

        get     eax, esi, TWindow:Enabled

.finish:
        pop     esi
        return


.check_children:
        get     esi, esi, TWindow:FirstChild

.loop:
        test    esi, esi
        jz      .finish

        get     eax, esi, TWindow:WantFocus
        test    eax, eax
        jnz     .finish

        mov     esi, [esi+TWindow.__next]
        jmp     .loop

endp


;_________________________________________________________________________________________

method TWindow.GetImgScreen
.client RECT
.rect   RECT
begin
        pushad

        mov     esi, [.self]

        mov     eax, [esi+TWindow._screen]
        test    eax, eax
        jz      .finish_screen

        stdcall LockImg, [esi+TWindow._screen]
        jc      .finish_screen

if defined options.Threads & options.Threads
        lea     eax, [esi+TWindow._rect_mx]
        stdcall WaitForMutex, eax, 1000
        jc      .finish_unlock
end if

        mov     edi, [esi+TWindow._rect_list]   ; list of the rectangles that need rendering.
        test    edi, edi
        jz      .finish_release                 ; no changes, the screen is up to date.

        mov     ecx, [edi+TArray.count]
        test    ecx, ecx
        jz      .finish_free

        lea     edi, [edi+TArray.array]

        xor     eax, eax
        mov     ebx, [esi+TWindow._width]
        mov     edx, [esi+TWindow._height]

        mov     [.client.left], eax
        mov     [.client.top], eax
        mov     [.client.right], ebx
        mov     [.client.bottom], edx

        lea     ebx, [.client]
        lea     edx, [.rect]

.rect_loop:
        stdcall RectIntersect, edx, ebx, edi
        jc      .next_rect

        mov     eax, [edx+RECT.left]
        sub     [edx+RECT.right], eax

        mov     eax, [edx+RECT.top]
        sub     [edx+RECT.bottom], eax

        exec    esi, TWindow:SelfPaint, [esi+TWindow._screen], [edx+RECT.left], [edx+RECT.top], [edx+RECT.left], [edx+RECT.top], [edx+RECT.right], [edx+RECT.bottom]

.next_rect:

        add     edi, sizeof.RECT
        loop    .rect_loop

.finish_free:

        xor     eax, eax
        xchg    eax, [esi+TWindow._rect_list]

        stdcall FreeMem, eax

.finish_release:

if defined options.Threads & options.Threads
        lea     eax, [esi+TWindow._rect_mx]
        stdcall MutexRelease, eax
end if

.finish_unlock:

        stdcall UnlockImg, [esi+TWindow._screen]

.finish_screen:
        mov     eax, [esi+TWindow._screen]
        mov     [esp+4*regEAX], eax
        popad
        return
endp

;_________________________________________________________________________________________



method TWindow.SetAction
begin
        pushad

        mov     esi, [.self]
        mov     ecx, [.value]
        mov     edx, [esi+TWindow.__action]

        cmp     ecx, edx
        je      .finish

        mov     [esi+TWindow.__action], ecx

        test    edx, edx
        jz      .old_ok

        exec    edx, TAction:Detach, esi

.old_ok:
        test    ecx, ecx
        jz      .new_ok

        exec    ecx, TAction:Attach, esi

.new_ok:
        getm    eax, esi, TWindow:UpdateAction
        test    eax, eax
        jz      .finish

        stdcall eax, esi, ecx

.finish:
        popad
        return
endp


;_________________________________________________________________________________________


method TWindow.GetCaption
begin
        mov     eax, [.self]
        mov     eax, [eax+TWindow._caption]
        test    eax, eax
        jz      .finish
        stdcall StrDup, eax
.finish:
        return
endp


;_________________________________________________________________________________________


method TWindow.SetCaption
begin
        push    eax esi

        mov     esi, [.self]

        lea     eax, [esi+TWindow._caption]
        stdcall SetString, eax, [.value]

        cmp     [esi+TWindow.handle], 0
        je      @f

        stdcall _SetWindowTextUtf8, [esi+TWindow.handle], [eax]

@@:
        pop     esi eax
        return
endp


;_________________________________________________________________________________________



method TWindow.SetVisible
begin
        push    eax esi

        mov     esi, [.self]

        mov     eax, [.value]
        cmp     eax, [esi+TWindow._visible]
        je      .finish

        mov     [esi+TWindow._visible], eax

        exec    esi, TWindow:__UpdateHandle
        exec    esi, TWindow:__UpdateImages
        exec    esi, TWindow:__UpdateFocus

        exec    esi, TWindow:RectChanged2, 0

.finish:
        pop     esi eax
        return
endp

;_________________________________________________________________________________________


method TWindow.SetWindowState
begin
        push    eax esi
        mov     esi, [.self]
        mov     eax, [.value]

        xchg    eax, [esi+TWindow._window_state]
        cmp     eax, [esi+TWindow._window_state]
        je      .finish

        stdcall _SetWindowState, esi

.finish:
        pop     esi eax
        return
endp

;_________________________________________________________________________________________

method TWindow.SetSelfPaint
begin
        push    esi eax

        mov     esi, [.self]
        mov     eax, [.value]
        cmp     eax, [esi+TWindow._OnSelfPaint]
        je      .finish

        mov     [esi+TWindow._OnSelfPaint], eax
        exec    esi, TWindow:RectChanged2, 0            ; repaint on change of the paint handler.

.finish:
        pop     eax esi
        return
endp

;_________________________________________________________________________________________


method TWindow.SetSplitCell
begin
        push    eax

        get     eax, [.self], TWindow:Parent
        istype  eax, TForm
        jne     .finish

        exec    eax, TForm:AttachControlToCell, [.self], [.value]

.finish:
        pop     eax
        return
endp


;_________________________________________________________________________________________


method TWindow.AddWinIcon
begin
        pushad

        mov     edi, [.self]

        stdcall CreateImagePNG, [.value], -1
        mov     esi, eax

        mov     edx, [edi+TWindow._winicons]
        test    edx, edx
        jnz     .addit

        stdcall CreateArray, 4
        mov     edx, eax

.addit:
        stdcall AddArrayItems, edx, 1
        mov     [eax], esi

        mov     [edi+TWindow._winicons], edx
        popad
        return
endp

;_________________________________________________________________________________________

method TWindow.GetGlobalEnabled
begin
        push    ecx

        mov     ecx, [.self]

        get     eax, ecx, TWindow:Action
        test    eax, eax
        jz      .action_ok

        get     eax, eax, TAction:Enabled
        jmp     .check_parent

.action_ok:
        mov     eax, [ecx+TWindow._enabled]

.check_parent:
        test    eax, eax
        jz      .finish

        get     ecx, [.self], TWindow:Parent
        jecxz   .finish

        get     eax, ecx, TWindow:GlobalEnabled

.finish:
        pop     ecx
        return
endp



;_________________________________________________________________________________________



method TWindow.GetEnabled
begin
        push    ecx

        mov     ecx, [.self]

        get     eax, ecx, TWindow:Action
        test    eax, eax
        jz      .action_ok

        get     eax, eax, TAction:Enabled
        jmp     .finish

.action_ok:
        mov     eax, [ecx+TWindow._enabled]

.finish:
        pop     ecx
        return
endp




method TWindow.SetEnabled
begin
        push    ecx eax
        mov     ecx, [.self]

        mov     eax, [.value]
        test    eax, eax
        setnz   al
        movzx   eax, al

        xchg    eax, [ecx+TWindow._enabled]
        cmp     eax, [ecx+TWindow._enabled]
        je      .finish

        exec    ecx, TWindow:__UpdateFocus

        get     eax, ecx, TWindow:OnScreen
        test    eax, eax
        jz      .finish

        exec    ecx, TWindow:ForceRefresh

.finish:
        pop     eax ecx
        return
endp





method TWindow.GetOSWindow
begin
        push    esi

        mov     esi, [.self]

.loop:
        cmp     [esi+TWindow.handle], 0
        jne     .finish

        get     esi, esi, TWindow:Parent
        test    esi, esi
        jnz     .loop

.finish:
        mov     eax, esi
        pop     esi
        return
endp


;_________________________________________________________________________________________

;---------------------------------------------------------------------------------
; Arguments:
;   .self
;   .x
;   .y
;   .onlyenabled
;
; Returns:
;   eax - pointer to TWindow
;   ecx - X coordinates, translated to the client coordinates of the child.
;   edx - Y coordinates, translated to the client coordinates of the child.
;
; If children window was not found, the method returns:
; eax = [.self]
; ecx = [.x]
; edx = [.y]
;---------------------------------------------------------------------------------

method TWindow.ChildByXY
.tmp TImage
.pixels rd 16
begin
        push    ebx

        mov     eax, [.self]
        mov     ecx, [.x]
        mov     edx, [.y]

        get     ebx, eax, TObject:LastChild

.loop:
        test    ebx, ebx
        jz      .finish

        istype  ebx, TWindow
        jne     .next

        cmp     [ebx+TWindow._visible], 0
        je      .next

        sub     ecx, [ebx+TWindow._x]
        jl      .no2

        sub     edx, [ebx+TWindow._y]
        jl      .no

        cmp     ecx, [ebx+TWindow._width]
        jge     .no

        cmp     edx, [ebx+TWindow._height]
        jge      .no

        cmp     [.onlyenabled], FALSE
        je      .enabled_ok

        push    eax
        get     eax, ebx, TWindow:GlobalEnabled
        test    eax, eax
        pop     eax
        jz      .no

.enabled_ok:
        exec    ebx, TWindow:HoleXY, ecx, edx
        test    eax, eax
        jz      .yes

.no:
        add     edx, [ebx+TWindow._y]
.no2:
        add     ecx, [ebx+TWindow._x]

.next:
        mov     ebx, [ebx+TObject.__prev]
        jmp     .loop

.yes:
        mov     eax, ebx
        exec    eax, TWindow:ChildByXY, ecx, edx, [.onlyenabled]

.finish:
        pop     ebx
        return

endp




;______________________________________________________________________________________________
;
; Includes the passed rectangle in the invalid rectangles list. Later this rectangle will need
; to be repainted, but only when the screen image is required.
;

method TWindow.RectChanged2      ;, .pRect

.prect  RECT
.rect   RECT
.client RECT

begin
        pushad

        mov     esi, [.self]

        mov     ecx, [.pRect]
        jecxz   .prect_ok

        lea     eax, [.prect]
        stdcall RectCopy, eax, [.pRect]
        mov     [.pRect], eax

.prect_ok:
        get     ecx, esi, TWindow:width
        get     edx, esi, TWindow:height
        xor     eax, eax

        mov     [.client.left], eax
        mov     [.client.top], eax
        mov     [.client.right], ecx
        mov     [.client.bottom], edx
        lea     edi, [.client]

        mov     eax, [.pRect]
        test    eax, eax
        jz      .rect_ok

        mov     eax, edi
        lea     edi, [.rect]
        stdcall RectIntersect, edi, eax, [.pRect]
        jc      .notify_parent

.rect_ok:
        cmp     [esi+TWindow._screen], 0
        je      .notify_parent

if defined options.Threads & options.Threads
        lea     eax, [esi+TWindow._rect_mx]
        stdcall WaitForMutex, eax, 1000
        jc      .finish
end if

        mov     edx, [esi+TWindow._rect_list]
        test    edx, edx
        jnz     .list_ok

        stdcall CreateArray, sizeof.RECT
        mov     edx, eax

.list_ok:
        stdcall RectListAdd, edx, edi

.rect_added_ok:
        mov     [esi+TWindow._rect_list], edx

if defined options.Threads & options.Threads
        lea     eax, [esi+TWindow._rect_mx]
        stdcall MutexRelease, eax
end if

; now send some redraw events if needed.

        mov     ecx, [esi+TWindow.handle]
        jecxz   .notify_parent

        mov     eax, [edi+RECT.right]  ;[.rect.right]
        mov     edx, [edi+RECT.bottom] ;[.rect.bottom]
        sub     eax, [edi+RECT.left]   ;[.rect.left]
        sub     edx, [edi+RECT.top]    ;[.rect.top]

        stdcall _RefreshWindowRect, ecx, [edi+RECT.left], [edi+RECT.top], eax, edx
        jmp     .finish  ; only root windows have handle, so no need to notify further.

; now do the same for the parent window

.notify_parent:

        get     ebx, esi, TWindow:Parent
        test    ebx, ebx
        jz      .finish

        get     ecx, esi, TWindow:x         ; shift the rectangle for the parent coordinates.
        get     edx, esi, TWindow:y

        mov     edi, [.pRect]
        lea     eax, [.client]
        test    edi, edi
        cmovz   edi, eax

        add     [edi+RECT.left], ecx
        add     [edi+RECT.top], edx
        add     [edi+RECT.right], ecx
        add     [edi+RECT.bottom], edx

        exec    ebx, TWindow:RectChanged2, edi

.finish:
        popad
        return
endp




method TWindow.RectChangedXY2
begin
        push    eax

        mov     eax, [.x]
        add     [.width], eax

        mov     eax, [.y]
        add     [.height], eax

        lea     eax, [.x]
        exec    [.self], TWindow:RectChanged2, eax

        pop     eax
        return
endp



method TWindow.ForceRefresh
begin
        pushad
        mov     esi, [.self]

        exec    esi, TWindow:RectChanged2, 0

        get     ebx, esi, TObject:LastChild


.children_loop:
        test    ebx, ebx
        jz      .end_loop

        istype  ebx, TWindow
        jne     .next

        exec    ebx, TWindow:ForceRefresh

.next:
        mov     ebx, [ebx+TObject.__next]
        jmp     .children_loop

.end_loop:
        popad
        return
endp




;method TWindow.RectChangedList  ;, .pRectList
;begin
;        pushad
;        mov     esi, [.self]
;        mov     edx, [.pRectList]
;        mov     ecx, [edx+TArray.count]
;        lea     edx, [edx+TArray.array]
;
;.loop:
;        dec     ecx
;        js      .end_loop
;
;        exec    esi, TWindow:RectChanged2, edx
;        add     edx, sizeof.RECT
;        jmp     .loop
;
;.end_loop:
;        popad
;        return
;endp



;_________________________________________________________________________________________



method TWindow.SetParent
begin
        inherited [.value]
        exec    [.self], TWindow:__UpdateHandle      ; create/destroy handle of the OS window, according to the  window state.
        return
endp


;_________________________________________________________________________________________



method TWindow.__UpdateHandle
begin
        pushad

        mov     esi, [.self]

        xor     ecx, ecx

        get     eax, esi, TWindow:Visible
        test    eax, eax
        jz      .no_handle

        get     eax, esi, TWindow:Parent
        test    eax, eax
        jnz     .no_handle

; need handle

        cmp     [esi+TWindow.handle], ecx
        jne     .finish                         ; the window needs OS handle and has one.

; The window has no handle, but needs it.


        stdcall _CreateWindow, esi
        mov     [esi+TWindow.handle], eax

.finish:
        popad
        return


.no_handle:

        cmp     [esi+TWindow.handle], ecx
        je      .finish                         ; no need for handle and there is no such.

        stdcall _DestroyWindow, [esi+TWindow.handle]    ; destroy not needed window handle.

        mov     [esi+TWindow.handle], ecx
        jmp     .finish

endp




method TWindow.__UpdateFocus
begin
        mov     eax, [.self]
        cmp     eax, [__FocusedWindow]
        jne     .finish

        get     eax, [.self], TWindow:Visible
        test    eax, eax
        jz      .clear

        get     eax, [.self], TWindow:Enabled
        test    eax, eax
        jz      .clear

        get     eax, [.self], TWindow:WantFocus
        test    eax, eax
        jz      .clear

.finish:
        return

.clear:
        stdcall FocusNext
        return
endp


SCREEN_MORE_X = 256
SCREEN_MORE_Y = 256


method TWindow.__UpdateImages
begin
        pushad

        xor     eax, eax
        mov     esi, [.self]

        mov     ebx, [esi+TWindow._visible]
        mov     edi, [esi+TWindow._screen]
        get     eax, esi, TWindow:Parent

        mov     ecx, [esi+TWindow._width]
        mov     edx, [esi+TWindow._height]

        xor     ebx, 1          ; ebx = FALSE, if the window is visible

        test    eax, eax
        cmovnz  ebx, eax        ; if the window has parent, it should have no screen image!

        test    edi, edi
        jz      .check_hidden

        test    ebx, ebx
        jnz     .destroy

; check the size

        cmp     ecx, [edi+TImage.width]
        ja      .destroy

        cmp     edx, [edi+TImage.height]
        ja      .destroy

.set_wrap:

        stdcall SetImageWrap, edi, ecx, edx

.exit:
        popad
        return


.destroy:
        stdcall DestroyImage, edi                         ; screen

        xor     eax, eax
        mov     [esi+TWindow._screen], eax

.check_hidden:

        test    ebx, ebx
        jnz     .exit


.create_new:

        lea     eax, [ecx + SCREEN_MORE_X]
        lea     ebx, [edx + SCREEN_MORE_Y]

        stdcall CreateImage2, eax, ebx, TRUE
        mov     edi, eax
        mov     [esi+TWindow._screen], edi

        exec    esi, TWindow:RectChanged2, 0
        jmp     .set_wrap

endp







;_________________________________________________________________________________________
;
; Geometry methods.


method TWindow.SetX
begin
        push    eax
        mov     eax, [.self]
        exec    eax, TWindow:Move, [.value], [eax+TWindow._y]
        pop     eax
        return
endp



method TWindow.SetY
begin
        push    eax
        mov     eax, [.self]
        exec    eax, TWindow:Move, [eax+TWindow._x], [.value]
        pop     eax
        return
endp



method TWindow.SetWidth
begin
        push    eax
        mov     eax, [.self]
        exec    eax, TWindow:Resize, [.value], [eax+TWindow._height]
        pop     eax
        return
endp



method TWindow.SetHeight
begin
        push    eax
        mov     eax, [.self]
        exec    eax, TWindow:Resize, [eax+TWindow._width], [.value]
        pop     eax
        return
endp




method TWindow.Move
begin
        exec    [.self], TWindow:ExtMove, [.newX], [.newY]
        stdcall _MoveWindow, [.self]
        return
endp



method TWindow.ExtMove
begin
        pushad
        mov     esi, [.self]

        mov     ebx, [.newX]
        mov     ecx, [.newY]
        xchg    ebx, [esi+TWindow._x]
        xchg    ecx, [esi+TWindow._y]

        cmp     ebx, [esi+TWindow._x]
        jne     .update

        cmp     ecx, [esi+TWindow._y]
        je      .finish

.update:
        get     edx, esi, TWindow:Parent
        test    edx, edx
        jz      .finish

        exec    edx, TWindow:RectChangedXY2, ebx, ecx, [esi+TWindow._width], [esi+TWindow._height]        ; previous position.
        exec    edx, TWindow:RectChangedXY2, [esi+TWindow._x], [esi+TWindow._y], [esi+TWindow._width], [esi+TWindow._height]       ; new position.

.finish:
        popad
        return
endp




method TWindow.Resize     ;, .newWidth, .newHeight
begin
        exec    [.self], TWindow:ExtResize, [.newWidth], [.newHeight]
        stdcall _ResizeWindow, [.self]
        return
endp



method TWindow.ExtResize     ;, .newWidth, .newHeight
begin
        pushad

        mov     esi, [.self]
        mov     ecx, [.newWidth]
        mov     ebx, [.newHeight]

        xchg    ecx, [esi+TWindow._width]
        xchg    ebx, [esi+TWindow._height]

        cmp     ecx, [esi+TWindow._width]    ; oldW, newW
        jne     .refresh

        cmp     ebx, [esi+TWindow._height]   ; oldH, newH
        je      .exit

.refresh:
        exec    esi, TWindow:__UpdateImages
        exec    esi, TWindow:RectChanged2, 0    ; refresh the window itself.

;now notify the parent window, if there are parts not covered by the new window size:

        get     edx, esi, TWindow:Parent
        test    edx, edx
        jz      .exit

        sub     ecx, [esi+TWindow._width]       ; oldW, newW
        jbe     .check_height

        mov     eax, [esi+TWindow._width]
        add     eax, [esi+TWindow._x]
        exec    edx, TWindow:RectChangedXY2, eax, [esi+TWindow._y], ecx, ebx

.check_height:
        sub     ebx, [esi+TWindow._height]
        jbe     .exit

        mov     eax, [esi+TWindow._height]
        add     eax, [esi+TWindow._y]
        exec    edx, TWindow:RectChangedXY2, [esi+TWindow._x], eax, [esi+TWindow._width], ebx

.exit:
        popad
        return
endp



method TWindow.EventFocusIn
begin
        push    esi eax
        mov     esi, [.self]

        cmp     [esi+TWindow._OnFocusIn], 0
        je      .user_event_ok

        pushad
        stdcall [esi+TWindow._OnFocusIn], esi
        popad

.user_event_ok:
        mov     eax, [esi+TWindow.__self_focus]
        test    eax, eax
        jz      .check_children

        get     eax, esi, TWindow:Visible
        test    eax, eax
        jz      .clear_focus

        get     eax, esi, TWindow:Enabled
        test    eax, eax
        jnz     .set_last_focused

.clear_focus:
        xor     esi, esi

.pass_focus:

        stdcall __SetIntFocused, esi

.finish:
        pop     eax esi
        return

;................................................

.set_last_focused:
        mov     eax, esi

.parent_loop:
        get     eax, eax, TWindow:Parent
        test    eax, eax
        jz      .finish

        mov     [eax+TWindow.__focused_child], esi
        jmp     .parent_loop

;................................................

.check_children:
        cmp     [esi+TWindow.__focused_child], 0
        cmove   esi, [esi+TWindow.__first_child]
        cmovne  esi, [esi+TWindow.__focused_child]

.loop:
        test    esi, esi
        jz      .pass_focus

        get     eax, esi, TWindow:WantFocus
        test    eax, eax
        jnz     .pass_focus

        mov     esi, [esi+TWindow.__next]
        jmp     .loop
endp



method TWindow.EventFocusOut
begin
        push    eax
        mov     eax, [.self]
        cmp     [eax+TWindow._OnFocusOut], 0
        je      .user_event_ok

        pushad
        stdcall [eax+TWindow._OnFocusOut], eax
        popad

.user_event_ok:
        pop     eax
        return
endp


method TWindow.EventMouseEnter
begin
        push    esi edx eax

        mov     esi, [.self]
        get     edx, esi, TWindow:OSWindow

        stdcall GetStockCursor, [esi+TWindow._cursor]
        stdcall SetMouseCursor, [edx+TWindow.handle], eax

        pop     eax edx esi
        return
endp




method TWindow.EventMouseLeave
begin

        return
endp




method TWindow.EventMouseMove   ;, .x, .y, .kbdState
begin
        push    ecx
        get     ecx, [.self], TWindow:OnMouseMove
        jecxz   .finish
        pushad
        stdcall ecx, [.self], [.x], [.y], [.kbdState]
        popad
.finish:
        pop     ecx
        return
endp




method TWindow.EventButtonPress        ;, .button, .kbdState, .x, .y
begin
        push    ecx
        get     ecx, [.self], TWindow:OnButtonPressed
        clc
        jecxz   .finish

        pushad
        stdcall ecx, [.self], [.button], [.kbdState], [.x], [.y]
        popad

.finish:
        pop     ecx
        return
endp



method TWindow.EventButtonRelease      ;, .button, .kbdState, .x, .y
begin
        push    ecx

        cmp     [.button], mbRight
        jne     .menu_ok
        
        get     ecx, [.self], TWindow:Menu
        jecxz   .menu_ok
        
        exec    ecx, TMenu:Show, [.self], [.x], [.y]

.menu_ok:
        get     ecx, [.self], TWindow:OnButtonReleased
        jecxz   .finish
        pushad
        stdcall ecx, [.self], [.button], [.kbdState], [.x], [.y]
        popad
.finish:
        pop     ecx
        return
endp


method TWindow.EventButtonDoubleClick   ;, .button, .kbdState, .x, .y
begin
        push    ecx
        get     ecx, [.self], TWindow:OnDoubleClick
        clc
        jecxz   .finish

        pushad
        stdcall ecx, [.self], [.button], [.kbdState], [.x], [.y]
        popad
.finish:
        pop     ecx
        return
endp



method TWindow.EventScroll     ;, .direction, .command, .value
begin
        mov     eax, [.self]
        cmp     [eax+TWindow._OnScroll], 0
        je      .finish

        pushad
        stdcall [eax+TWindow._OnScroll], [.self], [.direction], [.command], [.value]
        popad

.finish:
        return
endp




method TWindow.CloseRequest     ;, .reason
begin
        destroy [.self]
        return
endp




method TWindow.EventKeyPress    ;, .utf8, .scancode, .kbdState
begin
        push    eax ebx edx

        mov     edx, [.self]
        cmp     edx, [__FocusedWindow]
        jne     .focus_ok

        mov     ebx, [.kbdState]
        and     ebx, Ctrl+Alt+Shift
        jz      .mod_ok

        cmp     ebx, Shift
        jne     .focus_ok       ; other than Shift modifier is pressed.

.mod_ok:
        test    [edx+TWindow._behavior], wbUseTabKeys
        jnz     .focus_ok

if defined keyLeftTab
        cmp     [.scancode], keyLeftTab
        jne     .left_tab_ok

        test    ebx, ebx
        jnz     .prev
        jmp     .next

.left_tab_ok:
end if
        cmp     [.scancode], keyTab
        jne     .focus_ok

        test    ebx, ebx
        jz      .next

.prev:
        stdcall FocusPrev
        stc
        jmp     .finish

.next:
        stdcall FocusNext
        stc
        jmp     .finish

.focus_ok:
        cmp     [edx+TWindow._OnKeyPressed], 0
        je      .send_to_parent

        push    edx
        stdcall [edx+TWindow._OnKeyPressed], edx, [.utf8], [.scancode], [.kbdState]
        pop     edx
        jc      .finish

.send_to_parent:
        get     eax, edx, TWindow:Parent
        test    eax, eax
        jz      .finish   ; CF = 0 after "test eax, eax"

        exec    eax, TWindow:EventKeyPress, [.utf8], [.scancode], [.kbdState]

.finish:
        pop     edx ebx eax
        return
endp



method TWindow.EventKeyRelease    ;, .utf8, .scancode, .kbdState
begin
        push    eax
        mov     eax, [.self]
        cmp     [eax+TWindow._OnKeyReleased], 0
        je      .finish

        stdcall [eax+TWindow._OnKeyReleased], eax, [.utf8], [.scancode], [.kbdState]

.finish:
        pop     eax
        return
endp


; Utility procedures.


method  TWindow.ClientToScreenXY; , .window, .x, .y
begin
        push    eax esi

        mov     ecx, [.x]
        mov     edx, [.y]
        mov     esi, [.self]

.loop:
        add     ecx, [esi+TWindow._x]
        add     edx, [esi+TWindow._y]

        get     esi, esi, TWindow:Parent
        test    esi, esi
        jnz     .loop

        pop     esi eax
        return
endp



method TWindow.Autosize
begin
        mov     eax, [.self]
        mov     edx, [eax+TWindow._height]
        mov     eax, [eax+TWindow._width]
        return
endp



endmodule

Added freshlib/gui/Win32/Main.asm.



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Main procedure of GUI application library.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes: Organize the main message/event loop needed by every GUI engine.
;_________________________________________________________________________________________





body ProcessSystemEvents
.msg MSG
.msg2 MSG
begin
        push    ecx edx esi edi

.msgloop:
        lea     esi, [.msg]

        invoke  PeekMessageW, esi, [.msg.hwnd], WM_PAINT, WM_PAINT, PM_REMOVE
        test    eax, eax
        jnz     .processit

; eax is always 0 here because of the previous call...
;        xor     eax, eax
        invoke  PeekMessageW, esi, eax, eax, eax, PM_REMOVE
        test    eax, eax
        jz      .exitok

        cmp     [.msg.message], WM_TIMER
        jne     .timer_ok

        xor     eax, eax
        stdcall __TimerProc, eax, eax, eax, eax
        jmp     .msgloop

.timer_ok:
        cmp     [.msg.message], WM_MOUSEMOVE
        jne     .move_ok

.loop:
        invoke  PeekMessageW, esi, [.msg.hwnd], WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE
        test    eax, eax
        jnz     .loop
        jmp     .processit

.move_ok:
        cmp     [.msg.message], WM_KEYDOWN
        jne     .processit

; cleaning the message queue from the keyboard autorepeat messages.

        lea     edi, [.msg2]

.loop2:
        invoke  PeekMessageW, edi, [.msg.hwnd], WM_KEYDOWN, WM_KEYDOWN, PM_NOREMOVE
        test    eax, eax
        jz      .processit

        mov     eax, [.msg2.wParam]
        mov     ecx, [.msg2.lParam]

        cmp     eax, [.msg.wParam]
        jne     .processit

        cmp     ecx, [.msg.lParam]
        jne     .processit

        invoke  PeekMessageW, edi, [.msg.hwnd], WM_KEYDOWN, WM_KEYDOWN, PM_REMOVE
        jmp     .loop2


.processit:
        cmp     [.msg.message], WM_QUIT
        je      .terminate

        stdcall __ProcessOneSystemEvent, [.msg.hwnd], [.msg.message], [.msg.wParam], [.msg.lParam]
        jnc     .msgloop

        invoke  DefWindowProcW, [.msg.hwnd], [.msg.message], [.msg.wParam], [.msg.lParam]

;        invoke  TranslateMessage, esi
;        invoke  DispatchMessageW, esi

        jmp     .msgloop


.exitok:
        clc
        pop     edi esi edx ecx
        return


.terminate:
        mov     eax, [.msg.wParam]
        stc
        pop     edi esi edx ecx
        return
endp



proc WaitForSystemEvent
begin
        push    eax ecx edx

        invoke  MsgWaitForMultipleObjectsEx, 0, 0, 100, QS_ALLINPUT, MWMO_INPUTAVAILABLE
        cmp     eax, WAIT_TIMEOUT
        je      .timeout

        clc
        pop     edx ecx eax
        return

.timeout:
        stc
        pop     edx ecx eax
        return
endp




;----------------------------------------------------------------------------------------------------------
; This procedure makes following:
;   1. Takes as arguments one windows message
;   2. Analizes the message and finds the target child window for it (only top level windows receive messages)
;   3. Calls the respective event handling method of the target window object.
;   4. returns CF=0 if the event was properly processed.
;   5. returns CF=1 if the event was not processed.
;
; The event can be not processed in the following cases:
;   1. The window that receives the message is not FreshLib object.
;   2. The respective event handler refuse to process the event (return CF=1)
;----------------------------------------------------------------------------------------------------------

proc __ProcessOneSystemEvent, .hwnd, .wmsg, .wparam, .lparam
begin
        pushad

        invoke  GetWindowLongW, [.hwnd], ofsWindowStruct
        test    eax, eax
        jz      .ondefault

        mov     esi, eax

        dispatch [.wmsg]

.ondefault:
        popad
        stc
        return


.ret_null:
        xor     eax, eax

.processed:
        mov     [esp+4*regEAX], eax
        popad
        clc
        return

;.........................................................................................

oncase WM_NCACTIVATE
oncase WM_ACTIVATE
oncase WM_ACTIVATEAPP

        movzx   eax, word [.wparam]
        test    eax, eax
        jz      .ret_null

        istype  esi, TForm
        jne     @f
        mov     [__ActiveForm], esi
@@:
        jmp     .ret_null
;.........................................................................................


oncase WM_MOUSEWHEEL
locals
 .point POINT
endl
        movsx   ecx, word [.lparam]
        movsx   edx, word [.lparam+2]
        mov     [.point.x], ecx
        mov     [.point.y], edx

        lea     eax, [.point]
        invoke  ScreenToClient, [.hwnd], eax

        mov     ecx, [.point.y]
        shl     ecx, 16
        mov     cx, word [.point.x]

        mov     [.lparam], ecx

        movsx   ecx, word [.lparam]
        movsx   edx, word [.lparam+2]
        call    .get_mouse_target

        mov     eax, [.wparam]
        sar     eax, 16
        mov     ecx, scWheelUp
        test    eax, eax
        jns     @f
        mov     ecx, scWheelDn
        neg     eax
@@:
        mov     ebx, 120
        cdq
        div     ebx

        exec    edi, TWindow:EventScroll, scrollY, ecx, eax
        jmp     .ret_null

;.........................................................................................

oncase WM_WINDOWPOSCHANGED

locals
  .rect RECT
endl

; current state

        invoke  GetWindowLongW, [.hwnd], GWL_STYLE

        xor     ecx, ecx
        and     eax, WS_MAXIMIZE or WS_MINIMIZE
        jz      .state_ok

        mov     ecx, wstMaximizedVert or wstMaximizedHorz
        or      ecx, [esi+TWindow._window_state]
        test    eax, WS_MAXIMIZE
        jnz     .state_ok

        mov     ecx, wstMinimized
        or      ecx, [esi+TWindow._window_state]

.state_ok:
        mov     [esi+TWindow._window_state], ecx

; resize/move

        mov     ebx, [.lparam]

        test    [ebx+WINDOWPOS.flags], SWP_NOMOVE
        jnz     .move_ok

        xor     eax, eax
        mov     [.rect.left], eax
        mov     [.rect.top], eax
        lea     eax, [.rect]
        invoke  ClientToScreen, [.hwnd], eax

        exec    esi, TWindow:ExtMove, [.rect.left], [.rect.top]

.move_ok:
        test    [ebx+WINDOWPOS.flags], SWP_NOSIZE
        jnz     .ret_null

        lea     eax, [.rect]
        invoke  GetClientRect, [esi+TWindow.handle], eax

        exec    esi, TWindow:ExtResize, [.rect.right], [.rect.bottom]
        jmp     .ret_null

options.DebugMode = 0


;.........................................................................................

oncase WM_SYSKEYDOWN
oncase WM_SYSKEYUP
oncase WM_KEYDOWN
oncase WM_KEYUP

locals
  .keyboard rb 256
  .unicode  rw 16
  .utf8buff rb 16
  .scancode dd ?
endl

        lea     ebx, [.keyboard]
        invoke  GetKeyboardState, ebx

        mov     eax, [.lparam]
        mov     ecx, eax
        shr     eax, 16
        and     ecx, $80000000
        and     eax, $ff
        mov     [.scancode], eax

        mov     dword [.utf8buff], 0

        or      eax, ecx
        lea     edx, [.unicode]
        invoke  ToUnicode, [.wparam], eax, ebx, edx, 16, 0
        xor     ecx, ecx
        test    eax, eax
        jz      .key_translated    ; the key can not be translated.
        js      .key_translated    ; it is a dead key. What we have to do???

        lea     edx, [.utf8buff]
        xor     ecx, ecx
        mov     [edx], ecx
        mov     [edx+4], ecx
        lea     ecx, [.unicode]
        invoke  WideCharToMultiByte, CP_UTF8, 0, ecx, eax, edx, 8, 0, 0

.key_translated:
        xor     ebx, ebx

        test    [.keyboard+VK_CONTROL], $80
        jz      @f
        or      ebx, maskCtrl
@@:
        test    [.keyboard+VK_SHIFT], $80
        jz      @f
        or      ebx, maskShift
@@:
        test    [.keyboard+VK_MENU], $80
        jz      @f
        or      ebx, maskAlt
@@:
        test    [.keyboard+VK_SCROLL], $01
        jz      @f
        or      ebx, maskScrLk
@@:
        test    [.keyboard+VK_CAPITAL], $01
        jz      @f
        or      ebx, maskCapsLock
@@:
        test    [.keyboard+VK_LBUTTON], $80
        jz      @f
        or      ebx, maskBtnLeft
@@:
        test    [.keyboard+VK_RBUTTON], $80
        jz      @f
        or      ebx, maskBtnRight
@@:
        test    [.keyboard+VK_MBUTTON], $80
        jz      @f
        or      ebx, maskBtnMiddle
@@:

        cmp     [.wmsg], WM_KEYUP
        je      .key_up
        cmp     [.wmsg], WM_SYSKEYUP
        je      .key_up

        OutputValue "Scan code: ", [.scancode], 16, 8

;.key_down:

        mov     edi, [__ActiveMenu]
        test    edi, edi
        jnz     .send_key_event

        mov     edi, [__ActiveForm]
        test    edi, edi
        jz      .pass_to_focused

        get     edi, edi, TForm:ActionList
        test    edi, edi
        jz      .pass_to_focused

        exec    edi, TActionList:EventKeyPress, dword [.utf8buff], [.scancode], ebx
        jc      .end_key_msg

.pass_to_focused:
        mov     edi, [__FocusedWindow]
        test    edi, edi
        jz      .end_key_msg

.send_key_event:
        exec    edi, TWindow:EventKeyPress, dword [.utf8buff], [.scancode], ebx
        jmp     .end_key_msg

.key_up:
        cmp     [__FocusedWindow], 0
        jz      .end_key_msg

        exec    [__FocusedWindow], TWindow:EventKeyRelease, dword [.utf8buff], [.scancode], ebx

.end_key_msg:
        cmp     [.wmsg], WM_SYSKEYDOWN
        je      .ondefault

        cmp     [.wmsg], WM_SYSKEYUP
        je      .ondefault

        jmp     .ret_null

;.........................................................................................


oncase WM_SETFOCUS
        istype  esi, TForm
        jne     @f
        mov     [__ActiveForm], esi
@@:
        stdcall SetFocusedWindow, esi
        jmp     .ret_null

oncase WM_KILLFOCUS
        istype  esi, TForm
        jne     @f
        mov     [__ActiveForm], 0
@@:
        cmp     [.wparam], 0
        jne     .ret_null
        stdcall SetFocusedWindow, 0
        jmp     .ret_null

;.........................................................................................


oncase WM_MOUSEMOVE

        movsx   ecx, word [.lparam]
        movsx   edx, word [.lparam+2]

        stdcall ServeMenuMouseMove, esi, ecx, edx, 0
        jc      .ret_null

        call    .get_mouse_target

        get     eax, edi, TWindow:Enabled
        test    eax, eax
        jz      .ret_null

        cmp     edi, [__LastPointedWindow]
        je      .move_event

        cmp     [__LastPointedWindow], 0
        je      .leave_ok

        exec    [__LastPointedWindow], TWindow:EventMouseLeave

.leave_ok:

        mov     [__LastPointedWindow], edi
        exec    edi, TWindow:EventMouseEnter

.move_event:

        exec    edi, TWindow:EventMouseMove, ecx, edx, 0
        jmp     .ret_null


;.........................................................................................


oncase WM_PAINT

locals
  .ps     PAINTSTRUCT
  .hdc    dd ?
endl

        get     edi, esi, TWindow:Screen

        lea     eax, [.ps]
        invoke  BeginPaint, [.hwnd], eax
        mov     [.hdc], eax

        test    edi, edi
        jz      .paint_ok

if defined Caret
        stdcall __PaintCaret, esi, edi
end if

        mov     ecx, [.ps.rcPaint.right]
        mov     edx, [.ps.rcPaint.bottom]
        sub     ecx, [.ps.rcPaint.left]
        sub     edx, [.ps.rcPaint.top]

        stdcall DrawImageRect, [.hdc], edi, [.ps.rcPaint.left], [.ps.rcPaint.top], [.ps.rcPaint.left], [.ps.rcPaint.top], ecx, edx

if defined options.DebugMode.ComputeFPS & options.DebugMode.ComputeFPS
        stdcall FramesPerSecond
end if

.paint_ok:
        lea     eax, [.ps]
        invoke  EndPaint, [.hwnd], eax

        jmp     .ret_null


;.........................................................................................


oncase WM_CLOSE

        exec    esi, TWindow:CloseRequest, cerFromUser
        jmp     .ret_null


oncase WM_DESTROY
        mov     [esi+TWindow.handle], 0
        jmp     .ondefault

;.........................................................................................


oncase WM_LBUTTONUP
oncase WM_RBUTTONUP
oncase WM_MBUTTONUP
        movsx   ecx, word [.lparam]
        movsx   edx, word [.lparam+2]
        call    .get_mouse_target

        get     eax, edi, TWindow:Enabled
        test    eax, eax
        jz      .ret_null

        mov     ebx, [.wmsg]
        sub     ebx, WM_LBUTTONDOWN
        movzx   ebx, byte [.__mouse_button_table+ebx]

        stdcall __KeyStatus, [.wparam]

        exec    edi, TWindow:EventButtonRelease, ebx, eax, ecx, edx
        jmp     .ret_null


oncase WM_LBUTTONDOWN
oncase WM_RBUTTONDOWN
oncase WM_MBUTTONDOWN

locals
  .kbdState dd ?
endl

        movsx   ecx, word [.lparam]
        movsx   edx, word [.lparam+2]

        mov     ebx, [.wmsg]
        sub     ebx, WM_LBUTTONDOWN
        movzx   ebx, byte [.__mouse_button_table+ebx]

        stdcall __KeyStatus, [.wparam]
        mov     [.kbdState], eax

        stdcall ServeMenuButtonPress, esi, ebx, eax, ecx, edx
        jc      .ret_null

        call    .get_mouse_target

        get     eax, edi, TWindow:Enabled
        test    eax, eax
        jz      .ret_null

; deal with focus

        cmp     edi, [__FocusedWindow]
        je      .focusok

        get     eax, edi, TWindow:WantFocus
        test    eax, eax
        jz      .focusok

        mov     eax, [__FocusedWindow]
        mov     [__FocusedWindow], edi


        test    eax, eax
        jz      @f
        exec    eax, TWindow:EventFocusOut
@@:

        exec    edi, TWindow:EventFocusIn

.focusok:
        exec    edi, TWindow:EventButtonPress, ebx, [.kbdState], ecx, edx
        jmp     .ret_null


; Double clicks are not supported for now...

oncase WM_LBUTTONDBLCLK
oncase WM_RBUTTONDBLCLK
oncase WM_MBUTTONDBLCLK

        movsx   ecx, word [.lparam]
        movsx   edx, word [.lparam+2]

        mov     ebx, [.wmsg]
        sub     ebx, WM_LBUTTONDOWN
        movzx   ebx, byte [.__mouse_button_table+ebx]

        stdcall __KeyStatus, [.wparam]
        mov     [.kbdState], eax

        call    .get_mouse_target

        get     eax, edi, TWindow:Enabled
        test    eax, eax
        jz      .ret_null

        exec    edi, TWindow:EventButtonDoubleClick, ebx, [.kbdState], ecx, edx
        jmp     .ret_null

        enddispatch


.get_mouse_target:
        mov     edi, [__MouseTarget]
        test    edi, edi
        jz      .search_target_move

        stdcall __GetRelativeXY, edi, ecx, edx
        jmp     .target_move

.search_target_move:
        exec    esi, TWindow:ChildByXY, ecx, edx, FALSE
        mov     edi, eax

.target_move:
        retn


  .__mouse_button_table db mbLeft,        mbLeft,       mbLeft
                        db mbRight,       mbRight,      mbRight
                        db mbMiddle,      mbMiddle,     mbMiddle
endp


;.........................................................................................



proc __KeyStatus, .status
begin
        xor     eax, eax
        test    [.status], MK_LBUTTON
        jz      @f
        or      eax, maskBtnLeft
@@:
        test    [.status], MK_RBUTTON
        jz      @f
        or      eax, maskBtnRight
@@:
        test    [.status], MK_MBUTTON
        jz      @f
        or      eax, maskBtnMiddle
@@:
        test    [.status], MK_SHIFT
        jz      @f
        or      eax, maskShift
@@:
        test    [.status], MK_CONTROL
        jz      @f
        or      eax, maskCtrl
@@:
        return
endp

Added freshlib/gui/Win32/application.asm.





















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: TApplication object class.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes: TApplication by the idea is the base of GUI application, but the implementation
;         somehow need fixing...
;_________________________________________________________________________________________

uglobal
  if used hInstance
    hInstance dd ?
  end if
endg


proc InitGUIApplication
begin
        invoke  GetModuleHandleW, 0
        mov     [hInstance], eax
        clc
        return
endp


proc TerminateGUI
begin
        return
endp


proc CloseGUIApplication
begin
        invoke  PostQuitMessage, 0
        return
endp

Added freshlib/gui/Win32/clipboard.asm.









































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Clipboard management library.
;
;  Target OS: Win32
;
;  Dependencies:
;_________________________________________________________________________________________
uses kernel32, user32

clipboardNull   = 0    ; empty clipboard.
clipboardString = CF_UNICODETEXT
clipboardBinary = CF_BITMAP


; returns eax = handle to string with the clipboard data.

body ClipboardRead
.result dd ?
begin
        pushad
        xor     eax, eax
        mov     [.result], eax

        invoke  OpenClipboard, eax
        test    eax, eax
        jz      .finish

        invoke  GetClipboardData, CF_UNICODETEXT
        test    eax, eax
        jz      .close

        mov     ebx, eax

        invoke  GlobalSize, ebx
        mov     edi, eax

        invoke  GlobalLock, ebx
        mov     esi, eax

        lea     ecx, [8*edi]

        stdcall GetMem, ecx
        jc      .close3
        mov     edi, eax

        invoke  WideCharToMultiByte, CP_UTF8, 0, esi, -1, edi, ecx, 0, 0
        test    eax, eax
        jz      .close2

        mov     dword [edi+eax], 0

        stdcall StrDup, edi
        mov     [.result], eax

.close2:
        stdcall FreeMem, edi
.close3:
        invoke  GlobalUnlock, ebx
.close:
        invoke  CloseClipboard
        popad
.finish:
        mov     eax, [.result]
        return
endp



; writes the string .hstring to the clipboard.
; returns nothing.

body ClipboardWrite     ;, .hstring
begin
        pushad
        xor     eax, eax
        invoke  OpenClipboard, eax
        test    eax, eax
        jz      .finish

        invoke  EmptyClipboard

        stdcall utf8ToWideChar, [.hstring]
        mov     esi, eax
        shl     ecx, 3

        invoke  GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT or GMEM_DDESHARE, ecx
        test    eax, eax
        jz      .close
        mov     ebx, eax

        invoke  GlobalLock, ebx
        mov     edi, eax
        invoke  lstrcpyW, edi, esi
        invoke  GlobalUnlock, ebx

        invoke  SetClipboardData, CF_UNICODETEXT, ebx

.close:
        stdcall FreeMem, esi
        invoke  CloseClipboard
.finish:
        popad
        return
endp



body ClipboardType
begin
        mov     eax, 1
        return
endp

Added freshlib/gui/Win32/keycodes.inc.























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: This file contains scan code values for control keyboard keys.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

keyHomeNumpad  = $47
keyUpNumpad    = $48
keyPgUpNumpad  = $49
keyLeftNumpad  = $4b
key5Numpad     = $4c
keyRightNumpad = $4d
keyEndNumpad   = $4f
keyDownNumpad  = $50
keyPgDnNumpad  = $51
keyInsNumpad   = $52
keyDelNumpad   = $53
keyEnterNumpad = $1c    ; it is ASCII $0d
keyPlusNumpad  = $4e
keyMinusNumpad = $4a
keyAsteriskNumpad = $37
keySlashNumpad = $35

keyNumLock     = $45
keyScrollLock  = $46
keyPause       = $45
keyPrtScr      = $37


keyLeft =  $4b
keyRight = $4d
keyUp    = $48
keyDown  = $50

keyInsert  = $52
keyDelete  = $53
keyHome    = $47
keyEnd     = $4f
keyPgUp    = $49
keyPgDown  = $51

keyF1   =  $3b
keyF2   =  $3c
keyF3   =  $3d
keyF4   =  $3e

keyF5   =  $3f
keyF6   =  $40
keyF7   =  $41
keyF8   =  $42

keyF9   =  $43
keyF10  =  $44 ; used for menu and does not generate WM_KEYDOWN.
keyF11  =  $57
keyF12  =  $58

keyCapsLock   = $3a
keyShiftLeft  = $2a
keyCtrlLeft   = $1d
keyWndLeft    = $5b
keyWndRight   = $5c
keyAltLeft    = $38
keyAltRight   = $38
keyPopupMenu  = $5d
keyShiftRight = $36
keyCtrlRight  = $1d

keyBackSpace  = $0e
keyTab        = $0f
keyEscape     = $01
keyEnter      = $1c

keySpace        = $39
keyA            = $1e
keyB            = $30
keyC            = $2e
keyD            = $20
keyE            = $12
keyF            = $21
keyG            = $22
keyH            = $23
keyI            = $17
keyJ            = $24
keyK            = $25
keyL            = $26
keyM            = $32
keyN            = $31
keyO            = $18
keyP            = $19
keyQ            = $10
keyR            = $13
keyS            = $1f
keyT            = $14
keyU            = $16
keyV            = $2f
keyW            = $11
keyX            = $2d
keyY            = $15
keyZ            = $2c

Added freshlib/gui/Win32/mouse.asm.





























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Provides unified access to standard mouse cursors.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

; ToDo: Arbitrary mouse cursors, B&W for the begining.


body SetMouseCursor     ;, .hWindow, .hCursor
begin
        push    ecx edx
        invoke  SetCursor, [.hCursor]
        pop     edx ecx
        return
endp



body GetStockCursor     ;, .index
begin
        push    ecx edx
        mov     eax, [.index]
        cmp     eax, mcCount
        jb      @f
        xor     eax, eax
@@:
        movzx   eax, [_cursors+2*eax]
        invoke  LoadCursorW, 0, eax
        pop     edx ecx
        return
endp

if used _cursors
  _cursors dw IDC_ARROW, IDC_IBEAM, IDC_CROSS, IDC_SIZEWE, IDC_SIZENS, IDC_SIZENWSE, IDC_SIZENESW, IDC_WAIT, IDC_APPSTARTING, IDC_HAND, IDC_HAND, IDC_ARROW
end if



body __MouseCapture     ;, .hwnd
begin
        push    eax ecx edx
        cmp     [.hwnd], 0
        je      .release

        invoke  SetCapture, [.hwnd]

.finish:
        pop     edx ecx eax
        return

.release:
        invoke  ReleaseCapture
        jmp     .finish
endp


body ZeroMouseMove
.point POINT
begin
        pushad

        lea     eax, [.point]
        invoke  GetCursorPos, eax
        invoke  SetCursorPos, [.point.x], [.point.y]

        popad
        return
endp

Added freshlib/gui/Win32/windows.asm.











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Window management OS interface functions.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

iglobal
if used cWindowClassName
  cWindowClassName du 'FreshWin', 0
end if
endg

nWindowExtraBytes = 32
ofsWindowStruct = nWindowExtraBytes - 4

;_________________________________________________________________________________________
;
; Registers common window class
; Call only once
;_________________________________________________________________________________________

if used _CreateWindow
initialize __RegisterWindowClass

.wc WNDCLASS

begin
        xor     eax, eax
        lea     edi, [.wc]
        mov     ecx, sizeof.WNDCLASS / 4
        rep stosd

        mov     [.wc.style], CS_PARENTDC or CS_DBLCLKS ;or CS_VREDRAW or CS_HREDRAW
        mov     [.wc.lpfnWndProc], __CommonWindowProc
        mov     [.wc.cbWndExtra], nWindowExtraBytes

        mov     eax,[hInstance]
        mov     [.wc.hInstance],eax
        mov     [.wc.lpszClassName], cWindowClassName

        lea     eax, [.wc]
        invoke  RegisterClassW, eax

        return
endp
end if



;_________________________________________________________________________________________



body _CreateWindow

.pwc     dd ?
.charlen dd ?

.style dd ?
.exstyle dd ?

.rect RECT

begin
        pushad
        mov     esi, [.pWindow]

        mov     [.pwc], 0

        cmp     [esi+TWindow._caption], 0
        je      .caption_ok

        stdcall StrLen, [esi+TWindow._caption]
        lea     ecx, [eax*4]

        stdcall GetMem, ecx
        mov     [.pwc], eax

        stdcall StrPtr, [esi+TWindow._caption]

        invoke  MultiByteToWideChar, CP_UTF8, 0, eax, -1, [.pwc], ecx
        mov     [.charlen], eax

.caption_ok:

; now styles
        mov     eax, [esi+TWindow._border]
        and     eax, $3

        mov     ecx, [.styles+4*eax]
        mov     edx, [.exstyles+4*eax]

        mov     [.style], ecx
        mov     [.exstyle], edx

; the coordinates and size

        xor     eax, eax
        mov     [.rect.left], eax
        mov     [.rect.top],  eax
        mov     ecx, [esi+TWindow._width]
        mov     edx, [esi+TWindow._height]
        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     eax, [.rect]
        invoke  AdjustWindowRectEx, eax, [.style], 0, [.exstyle]

        mov     ecx, [.rect.right]
        mov     edx, [.rect.bottom]
        sub     ecx, [.rect.left]
        sub     edx, [.rect.top]

; the owner
        get     eax, esi, TWindow:Owner
        test    eax, eax
        jz      .owner_ok

        mov     eax, [eax+TWindow.handle]

.owner_ok:
        invoke  CreateWindowExW, [.exstyle], cWindowClassName, [.pwc], [.style], [esi+TWindow._x], [esi+TWindow._y], ecx, edx, eax, 0, [hInstance], 0
        mov     [esp+4*regEAX], eax
        mov     ebx, eax

        invoke  SetWindowLongW, ebx, ofsWindowStruct, esi

; set window icons if any

        mov     edx, [esi+TWindow._winicons]
        test    edx, edx
        jz      .icons_ok

        mov     ecx, [edx+TArray.count]

.loop:
        dec     ecx
        js      .icons_ok

        stdcall _AddWindowIcon, ebx, [edx+TArray.array + 4*ecx]
        jmp     .loop

.icons_ok:

        invoke  ShowWindow, ebx, SW_SHOWNORMAL
        invoke  SendMessageW, ebx, WM_ACTIVATE, TRUE, 0

        stdcall FreeMem, [.pwc]

        popad
        return


.styles dd WS_POPUP
        dd WS_BORDER  or WS_CAPTION or WS_SYSMENU or WS_SIZEBOX or WS_MINIMIZEBOX or WS_MAXIMIZEBOX
        dd WS_CAPTION or WS_SYSMENU or WS_VISIBLE
        dd WS_BORDER  or WS_CAPTION or WS_SYSMENU or WS_SIZEBOX

.exstyles dd WS_EX_TOPMOST or WS_EX_TOOLWINDOW or WS_EX_NOACTIVATE
          dd WS_EX_APPWINDOW
          dd WS_EX_DLGMODALFRAME
          dd WS_EX_TOOLWINDOW
endp



struct __ICONINFO
 .fIcon    dd ?
 .xHotSpot dd ?
 .yHotSpot dd ?
 .hbmMask  dd ?
 .hbmColor dd ?
ends


proc _AddWindowIcon, .hwnd, .pImage
.ii __ICONINFO
begin
        pushad

        mov     [.ii.fIcon], TRUE
        mov     [.ii.xHotSpot], 0
        mov     [.ii.yHotSpot], 0
        mov     [.ii.hbmMask], 0

        mov     esi, [.pImage]
        mov     eax, [esi+TWinImage.hBitmap]
        mov     [.ii.hbmMask], eax
        mov     [.ii.hbmColor], eax

        lea     eax, [.ii]
        invoke  CreateIconIndirect, eax
        mov     ebx, eax

        mov     eax, ICON_SMALL
        cmp     [esi+TWinImage.width], 24
        jb      @f
        mov     eax, ICON_BIG
@@:
        invoke  SendMessageW, [.hwnd], WM_SETICON, eax, ebx

        popad
        return
endp

;_________________________________________________________________________________________


body _MoveWindow
begin
        pushad
        mov     esi, [.pWindow]
        mov     eax, [esi+TWindow.handle]
        test    eax, eax
        jz      .error


        invoke  SetWindowPos, eax, 0, [esi+TWindow._x], [esi+TWindow._y], 0, 0, SWP_NOSIZE or SWP_NOREPOSITION


        clc
        popad
        return

.error:
        stc
        popad
        return
endp


body _ResizeWindow
.rect RECT
begin
        pushad
        mov     esi, [.pWindow]

        cmp     [esi+TWindow.handle], 0
        je      .error

; now styles
        mov     eax, [esi+TWindow._border]
        and     eax, $3

        mov     ebx, [_CreateWindow.styles+4*eax]
        mov     edi, [_CreateWindow.exstyles+4*eax]

        xor     eax, eax
        mov     [.rect.left], eax
        mov     [.rect.top],  eax
        mov     ecx, [esi+TWindow._width]
        mov     edx, [esi+TWindow._height]
        mov     [.rect.right], ecx
        mov     [.rect.bottom], edx

        lea     eax, [.rect]
        invoke  AdjustWindowRectEx, eax, ebx, 0, edi

        mov     ecx, [.rect.right]
        mov     edx, [.rect.bottom]
        sub     ecx, [.rect.left]
        sub     edx, [.rect.top]

        invoke  SetWindowPos, [esi+TWindow.handle], 0, 0, 0, ecx, edx, SWP_NOMOVE or SWP_NOREPOSITION

        clc
        popad
        return

.error:
        stc
        popad
        return
endp



;_________________________________________________________________________________________


body _DestroyWindow
begin
        push    eax ecx edx
        invoke  DestroyWindow, [.hwnd]
        pop     edx ecx eax
        return
endp


;_________________________________________________________________________________________


body _RefreshWindowRect
.rect RECT
begin
        push    eax ecx edx ebx

;; WAY 1 - direct paint on the window surface, without sending any messages.
;
;        invoke  GetDC, [.hwnd]
;        mov     ebx, eax
;
;        stdcall _GetWindowStruct, [.hwnd]
;        get     eax, eax, TWindow:Screen
;
;        stdcall DrawImageRect, ebx, eax, [.x], [.y], [.x], [.y], [.width], [.height]
;
;        invoke  ReleaseDC, [.hwnd], ebx

; Needed for WAY2 and WAY3

        mov     eax, [.x]
        mov     ecx, [.y]
        mov     [.rect.left], eax
        mov     [.rect.top], ecx
        add     eax, [.width]
        add     ecx, [.height]
        mov     [.rect.right], eax
        mov     [.rect.bottom], ecx

        lea     eax, [.rect]
        xor     ecx, ecx

;; WAY2 - generates messages before returning.
;
;        invoke  RedrawWindow, [.hwnd], eax, ecx, RDW_INVALIDATE or RDW_NOERASE or RDW_UPDATENOW

; WAY3 - returns immediately and posts messages to the queue.
; In the real Windows, on intensive changes it delays the update and that can be unwanted.
;
        invoke  InvalidateRect, [.hwnd], eax, ecx

        pop     ebx edx ecx eax
        return
endp


;_________________________________________________________________________________________



body _SetWindowTextUtf8
.pwc dd ?
.charlen dd ?
begin
        push    eax ecx edx

        cmp     [.hString], 0
        je      .finish

        stdcall StrLen, [.hString]
        lea     ecx, [eax*4]

        stdcall GetMem, ecx
        mov     [.pwc], eax

        stdcall StrPtr, [.hString]

        invoke  MultiByteToWideChar, CP_UTF8, 0, eax, -1, [.pwc], ecx
        mov     [.charlen], eax

        invoke  SendMessageW, [.hwnd], WM_SETTEXT, 0, [.pwc]
        stdcall FreeMem, [.pwc]

.finish:
        pop     edx ecx eax
        return
endp



;_________________________________________________________________________________________


body _SetModalTowards
begin
        push    eax ecx edx

        invoke  SetWindowLongW, [.hwnd], GWL_HWNDPARENT, [.hwndParent]
        invoke  EnableWindow, [.hwndParent], FALSE

        pop     edx ecx eax
        return
endp


;_________________________________________________________________________________________


body _FinalizeModal
begin
        push    eax ecx edx
        invoke  EnableWindow, [.hwndParent], TRUE
        invoke  SetFocus, [.hwndParent]
        pop     edx ecx eax
        return
endp

;_________________________________________________________________________________________


body _SetFocus
begin
        push    eax ecx edx
        invoke  SetFocus, [.hwnd]
        pop     edx ecx eax
        return
endp


;_________________________________________________________________________________________

body _SetWindowState
begin
        pushad

        mov     esi, [.pWindow]
        mov     edi, [esi+TWindow.handle]
        test    edi, edi
        jz      .error

        mov     ecx, SW_SHOWMAXIMIZED
        mov     ebx, SW_RESTORE
        test    [esi+TWindow._window_state], wstMaximizedVert or wstMaximizedHorz
        cmovz   ecx, ebx

        invoke  ShowWindowAsync, edi, ecx

        test    [esi+TWindow._window_state], wstMinimized
        jz      .finish

        invoke  ShowWindowAsync, edi, SW_SHOWMINIMIZED

.finish:
        clc
        popad
        return

.error:
        stc
        popad
        return
endp




body _GetScreenSize
begin
        pushad

        invoke  GetSystemMetrics, SM_CYSCREEN
        mov     [esp+4*regEBX], eax

        invoke  GetSystemMetrics, SM_CXSCREEN
        mov     [esp+4*regEAX], eax

        popad
        return
endp



;_________________________________________________________________________________________


proc __CommonWindowProc, .hwnd, .wmsg, .wparam, .lparam
begin
        stdcall __ProcessOneSystemEvent, [.hwnd], [.wmsg], [.wparam], [.lparam]         ; sometimes windows calls winproc directly instead of using postmessage.
        jnc     .finish

        invoke  DefWindowProcW, [.hwnd], [.wmsg], [.wparam], [.lparam]

.finish:
        return
endp

Added freshlib/gui/all.asm.

























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: All GUI libraries combined include.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Includes all GUI libraries at once.
;_________________________________________________________________________________________

AlignLeft   = 0
AlignRight  = 1
AlignTop    = 2
AlignBottom = 3

include 'sysevents.asm'

include 'mouse.asm'
include 'textcaret.asm'
include 'clipboard.asm'
include 'application.asm'

; OS independent support code

; Limited support for the old visual editor. Contains only macro definitions.
;include 'OldTemplates.inc'

; OS independent components

include 'TObject.asm'
include 'TAction.asm'
include 'TActionList.asm'

include 'TWindow.asm'
include 'TScrollable.asm'
include 'TCanvasWindow.asm'

include 'TForm.asm'
include 'TButton.asm'
include 'TCheckbox.asm'
include 'TEdit.asm'
include 'TLabel.asm'
include 'TImageLabel.asm'
include 'TMenu.asm'
include 'TProgressbar.asm'
include 'TTreeView.asm'
include 'TToolbar.asm'
include 'TTabBar.asm'
include 'TGrid.asm'
include 'TListView.asm'
include 'TColorSample.asm'

include 'dialogs.asm'
include 'file_dialogs.asm'

include 'SplitGrid.asm'

; OS independent main procedures.
include 'Main.asm'

; OS independent template engine.
include 'ObjTemplates.asm'

; Way to change the GUI themes in Runtime.
include 'themes.asm'

match theme, ThemeGUI {
  include 'themes/'#`theme#'.asm'
}

;include 'themes/flat_gui.asm'
;include 'themes/win_gui.asm'

Added freshlib/gui/application.asm.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: GUI Application global initialization.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________
module "Application library"

include '%TargetOS%/application.asm'

endmodule

Added freshlib/gui/clipboard.asm.









































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Clipboard functions for inter-program communications.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: This file contains the OS independent part of the library and includes the
;         respective OS dependent file.
;_________________________________________________________________________________________

module "Clipboard library"


; Returns EAX handle to string with the content of the clipboard.

interface ClipboardRead



interface ClipboardWrite, .hstring



interface ClipboardType


include '%TargetOS%/clipboard.asm'



endmodule

Added freshlib/gui/dialogs.asm.















































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Common dialogs procedures library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________
module "Common dialogs library"


iglobal
   if used _CommonDialogTemplate

     __defaultTitles dd ttlError, ttlInformation, ttlQuestion, ttlWarning

    _CommonDialogTemplate:
        ObjTemplate  tfParent or tfEnd, TForm, frmCommonDialog,  width = 480, height = 100, border = borderModal
           ObjTemplate tfChild, TImageLabel, .imgIcon, x = 4, y = 4, width = 70, height = 70, Visible = TRUE, ImageAlign = iaCenter or iaMiddle
           ObjTemplate tfChild, TLabel,  .LblText,   x = 74, y = 4, width = 10, height = 10, TextAlign = dtfAlignLeft or dtfAlignMiddle or dtfWordWrap or dtfCRLF, Visible = TRUE

           ObjTemplate tfChild, TButton, .btnOK,     x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter  or dtfAlignMiddle, Caption = 'OK',     ModalResult = mrOK
           ObjTemplate tfChild, TButton, .btnCancel, x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter  or dtfAlignMiddle, Caption = 'Cancel', ModalResult = mrCancel
           ObjTemplate tfChild, TButton, .btnAbort,  x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter  or dtfAlignMiddle, Caption = 'Abort',  ModalResult = mrAbort
           ObjTemplate tfChild, TButton, .btnRetry,  x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter  or dtfAlignMiddle, Caption = 'Retry',  ModalResult = mrRetry
           ObjTemplate tfChild, TButton, .btnIgnore, x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter  or dtfAlignMiddle, Caption = 'Ignore', ModalResult = mrIgnore
           ObjTemplate tfChild, TButton, .btnYes,    x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter  or dtfAlignMiddle, Caption = 'Yes',    ModalResult = mrYes
           ObjTemplate tfChild, TButton, .btnNo,     x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter  or dtfAlignMiddle, Caption = 'No',     ModalResult = mrNo
           ObjTemplate tfChild, TButton, .btnMaybe,  x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter  or dtfAlignMiddle, Caption = 'Maybe',  ModalResult = mrMaybe
           ObjTemplate tfEnd,   TButton, .btnHelp,   x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter  or dtfAlignMiddle, Caption = 'Help',   ModalResult = mrNone
   end if
endg

ttlError text "Error!"
ttlInformation text "Information"
ttlQuestion text "Question"
ttlWarning text "Warning!"



; buttons flags used:
smbOK     = $01
smbCancel = $02
smbAbort  = $04
smbRetry  = $08
smbIgnore = $10
smbYes    = $20
smbNo     = $40
smbMaybe  = $80
smbHelp   = $100
smbMaxButton = smbHelp

smiError       = 0
smiInformation = 1
smiQuestion    = 2
smiWarning     = 3



proc ShowMessage, .parent, .icon, .hTitle, .hMessage, .maskButtons
.xrow dd ?
.yrow dd ?
begin
        push    ebx ecx edx esi
        stdcall CreateFromTemplate, _CommonDialogTemplate, 0

; First set the position and size of the dialog box, depending on the flags, and the size of the message.

; Set the message text:
        set     [frmCommonDialog.LblText], TLabel:Caption, [.hMessage]

; Set the message title:

        mov     eax, [.hTitle]
        test    eax, eax
        jnz     .set_caption

        mov     eax, [.icon]
        and     eax, 3
        mov     eax, [__defaultTitles + 4*eax]

.set_caption:
        set     ebx, TForm:Caption, eax

; arrange the buttons
        mov     eax, [.maskButtons]
        mov     ecx, 32
        xor     edx, edx
.count:
        rol     eax, 1
        adc     edx, 0
        loop    .count

        mov     ecx, edx
        imul    edx, 64         ; button width
        jecxz   @f
        dec     ecx
        imul    ecx, 16
@@:
        add     edx, ecx        ; edx contains the width of the button row in pixels.

        get     eax, ebx, TForm:width
        cmp     eax, edx
        jge     .widthok

        lea     eax, [edx+32]
        set     ebx, TForm:width, eax

.widthok:

        sub     eax, edx
        sar     eax, 1  ; eax is the begin X coordinate of the row
        mov     [.xrow], eax

        get     eax, ebx, TForm:height
        sub     eax, 24+8
        mov     [.yrow], eax

        mov     edx, .btnTable
        mov     ecx, $1

.btnLoop:
        test    [.maskButtons], ecx
        jz      @f

        mov     esi, [edx]

        set     [esi], TButton:x, [.xrow]
        set     [esi], TButton:y, [.yrow]

        set     [esi], TButton:Visible, TRUE
        add     [.xrow], 64+16

@@:
        add     edx, 4
        shl     ecx, 1
        cmp     ecx, smbMaxButton
        jbe     .btnLoop

; set the icon
        mov     eax, [.icon]
        and     eax, $3         ;
        set     [frmCommonDialog.imgIcon], TImageLabel:Image, [GUI.iconDialogs+8*eax]

; set the text position and size.
        mov     ecx, [.yrow]
        sub     ecx, 8

        set     [frmCommonDialog.imgIcon], TImageLabel:height, ecx

        get     eax, [frmCommonDialog], TForm:width
        get     edx, [frmCommonDialog.LblText], TLabel:x
        sub     eax, edx

        exec    [frmCommonDialog.LblText], TLabel:Resize, eax, ecx
        exec    [frmCommonDialog.LblText], TWindow:RectChanged2, 0

        stdcall ShowModal, ebx, [.parent]

        destroy ebx

        pop     esi edx ecx ebx
        return

.btnTable dd frmCommonDialog.btnOK,     \
             frmCommonDialog.btnCancel, \
             frmCommonDialog.btnAbort,  \
             frmCommonDialog.btnRetry,  \
             frmCommonDialog.btnIgnore, \
             frmCommonDialog.btnYes,    \
             frmCommonDialog.btnNo,     \
             frmCommonDialog.btnMaybe,  \
             frmCommonDialog.btnHelp
endp






proc InputString, .parent
begin


        return
endp




iglobal
   if used _FontDialogTemplate

     _FontDialogTemplate:
        ObjTemplate  tfParent or tfEnd, TForm, frmFontDialog,   \
           width = 320, height = 240,                           \
           border = borderModal,                                \
           SplitGrid = _splitFontDialog,                        \
           PaddingLeft=8, PaddingRight=8,                       \
           PaddingTop=8,PaddingBottom=8,                        \
           Caption = "Select font",                             \
           Visible=FALSE

           ObjTemplate tfChild, TLabel,  NONE, SplitCell = _splitFontDialog.cellLabelFamily, Caption = "Font family:", TextAlign = dtfAlignLeft or dtfAlignMiddle
           ObjTemplate tfChild, TListView, .lvFamily, SplitCell = _splitFontDialog.cellListview, Style = lvsList, Flags = gfRowFocus or gfSingleCellSelect

           ObjTemplate tfChild, TLabel, NONE, SplitCell = _splitFontDialog.cellLabelWeight, Caption = "Weight: ", TextAlign = dtfAlignLeft or dtfAlignMiddle
           ObjTemplate tfChild, TListView, .lvWeight, SplitCell = _splitFontDialog.cellWeight, Style = lvsList, Flags = gfRowFocus or gfSingleCellSelect

           ObjTemplate tfChild, TLabel, NONE, SplitCell = _splitFontDialog.cellLabelSize, Caption = "Size:", TextAlign = dtfAlignLeft or dtfAlignMiddle
           ObjTemplate tfChild, TEdit, .editSize, SplitCell = _splitFontDialog.cellEditSize

           ObjTemplate tfChild, TButton, .btnOK, SplitCell = _splitFontDialog.cellOK, TextAlign = dtfAlignCenter  or dtfAlignMiddle, Caption = 'OK',     ModalResult = mrOK
           ObjTemplate tfChild or tfEnd, TButton, .btnCancel, SplitCell = _splitFontDialog.cellCancel, height = 24, TextAlign = dtfAlignCenter  or dtfAlignMiddle, Caption = 'Cancel', ModalResult = mrCancel

     SplitStart _splitFontDialog
       Split stHoriz or stOriginBR or stJustGap, 8, 140, 0, 1000
         Split stVert or stJustGap, 0, 21, 0, 100
           Cell cellLabelFamily
           Cell cellListview
         Split stVert or stJustGap, 0, 21, 0, 100
           Cell cellLabelSize
           Split stVert or stJustGap, 8, 21, 0, 100
             Cell cellEditSize
             Split stVert or stJustGap, 0, 21, 0, 100
               Cell cellLabelWeight
               Split stVert or stJustGap or stOriginBR, 8, 24, 0, 100
                  Cell cellWeight
                  Split stHoriz or stJustGap or stOriginBR, 8, 64, 0, 100
                    Split stHoriz or stJustGap or stOriginBR, 0, 64, 0, 100
                      Cell cellEmpty2
                      Cell cellCancel
                    Cell cellOK
     SplitEnd
   end if
endg




cFontWeights: IndexedStrings              \
               fwLight,     "Light",      \
               fwDemilight, "Demilight",  \
               fwNormal,    "Normal",     \
               fwMedium,    "Medium",     \
               fwDemibold,  "Demibold",   \
               fwBold,      "Bold",       \
               fwExtraBold, "Extra bold", \
               fwBlack,     "Black"


proc SelectFont, .parent, .pFontInfo
begin
        pushad

        mov     edi, [.pFontInfo]

        stdcall CreateFromTemplate, _FontDialogTemplate, 0

        mov     esi, cFontWeights
.wloop:
        lodsd
        test    eax, eax
        jz      .weights_ok
        exec    [frmFontDialog.lvWeight], TListView:InsertItem, -1, eax, 0, 0

        lea     esi, [esi+4]
        jmp     .wloop

.weights_ok:

        mov     edx, [edi+__TFont.weight]
        and     edx, fwMask
        exec    [frmFontDialog.lvWeight], TListView:SetFocused, 0, edx
        exec    [frmFontDialog.lvWeight], TListView:EnsureVisible, 0, edx


        stdcall GetFontList, [.pFontInfo]
        jc      .list_ok
        
        mov     esi, eax
        xor     ecx, ecx
        xor     edx, edx

.loop:
        cmp     ecx, [esi+TArray.count]
        jae     .end_list

        push    edx
        exec    [frmFontDialog.lvFamily], TListView:InsertItem, -1, [esi+4*ecx+TArray.array], 0, 0
        pop     edx

        cmp     [edi+__TFont.hFontFace], 0
        je      .next

        stdcall StrCompNoCase, [edi+__TFont.hFontFace], [esi+4*ecx+TArray.array]
        cmovc   edx, ecx

.next:
        inc     ecx
        jmp     .loop

.end_list:
        stdcall ListFree, esi, StrDel

        exec    [frmFontDialog.lvFamily], TListView:SetFocused, 0, edx
        exec    [frmFontDialog.lvFamily], TListView:EnsureVisible, 0, edx

.list_ok:
        stdcall NumToStr, [edi+__TFont.height], ntsDec or ntsUnsigned
        push    eax

        set     [frmFontDialog.editSize], TEdit:Text, eax
        stdcall StrDel ; from the stack.

        stdcall ShowModal, ebx, [.parent]
        cmp     eax, mrOK
        jne     .finish_NOK

; font family name

        mov     edi, [.pFontInfo]

        get     ecx, [frmFontDialog.lvFamily], TListView:FocusedY
        exec    [frmFontDialog.lvFamily], TListView:GetItem, ecx

        mov     eax, [eax+TLvItem.captions]
        stdcall StrDup, [eax+TArray.array]

        xchg    eax, [edi+__TFont.hFontFace]
        stdcall StrDel, eax

; size
        get     eax, [frmFontDialog.editSize], TEdit:Text
        push    eax
        stdcall StrToNumEx, eax
        stdcall StrDel ; from the stack
        jc      .size_ok

        mov     [edi+__TFont.height], eax

.size_ok:

; Weight
        get     eax, [frmFontDialog.lvWeight], TListView:FocusedY
        mov     [edi+__TFont.weight], eax

        destroy ebx

;.finish_OK:
        clc
        popad
        return

.finish_NOK:
        destroy ebx
        stc
        popad
        return
endp









endmodule

Added freshlib/gui/file_dialogs.asm.































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
iglobal
  if used _FileDialogTemplate

     __file_dialog_titles dd ttlOpenDialog, ttlSaveDialog

     ttlOpenDialog text "Open file"
     ttlSaveDialog text "Save file"

    _FileDialogTemplate:
        ObjTemplate  tfParent or tfEnd, TForm, frmFileDlg,   \
                     width = 640, height = 480, border = borderModal, \
                     SplitGrid = _filegrid,                           \
                     PaddingLeft = 8, PaddingRight = 8,               \
                     PaddingTop = 8, PaddingBottom = 8

           ObjTemplate tfChild, TTabBar, .tbPath, Visible = TRUE, SplitCell = _filegrid.cellPath
           ObjTemplate tfChild, TEdit, .editFilename, Visible = TRUE, SplitCell = _filegrid.cellEdit
           ObjTemplate tfChild, TListView, .lvFiles, SplitCell = _filegrid.cellList, Style = lvsDetails, OnFocusChange = __FileListFocusChange, OnDoubleClick = __FileListDoubleClick, OnKeyPressed = __FileListKeyPressed
           ObjTemplate tfChild, TButton, .btnOK, Visible = TRUE, SplitCell = _filegrid.cellOK, TextAlign = dtfAlignCenter  or dtfAlignMiddle, Caption = 'OK', ModalResult = mrOK
           ObjTemplate tfEnd,   TButton, .btnCancel, Visible = TRUE, SplitCell = _filegrid.cellCancel, TextAlign = dtfAlignCenter or dtfAlignMiddle, Caption = 'Cancel', ModalResult = mrCancel

    SplitStart _filegrid
      Split stVert or stJustGap, 8, 24, 0, 100
        Cell cellPath
        Split stVert or stJustGap, 8, 24, 0, 100
          Cell cellEdit
          Split stVert or stJustGap or stOriginBR, 8, 24, 0, 100
            Cell cellList
            Split stHoriz or stJustGap or stOriginBR, 8, 64, 0, 100
              Split stHoriz or stJustGap or stOriginBR, 8, 64, 0, 100
                Cell empty
                Cell cellCancel
              Cell cellOK
    SplitEnd
  end if
endg


; Used defined callback to return TImage for the file item icon.
; Returns:
;   CF = 0, eax = pointer to TImage
;   CF = 1, eax not changed.

interface FileIconCallback, .pDirItem

uglobal
  pFileIconsCallback  dd ?
endg



fdtOpenFile = 0
fdtSaveFile = 1
fdtMultipleSelect = 2

; Returns:
; 1. [.type] and fdtMultipleSelect == 0
;  eax - handle of a string with the full pathname of the file.
; 2. [.type] and fdtMultipleSelect <> 0
;  eax - pointer to TArray of dword with the filenames.

proc FileDialog, .pParent, .type, .start_filename, .filters_list
begin
        pushad
        stdcall CreateFromTemplate, _FileDialogTemplate, 0

        mov     eax, [.type]
        and     eax, 1
        set     ebx, TForm:UserData, eax
        set     ebx, TForm:Caption, [__file_dialog_titles+4*eax]

        xor     eax, eax
        mov     esi, [frmFileDlg.lvFiles]
        set     esi, TListView:FixedCols, eax
        inc     eax
        set     esi, TListView:FixedRows, eax

        mov     eax, gfGridLinesFixed or gfResizeColumns or gfRowFocus
        test    [.type], fdtMultipleSelect
        jnz     @f
        or      eax, gfSingleCellSelect
@@:
        set     esi, TListView:Flags, eax

        exec    esi, TListView:AddHeader, txt "Filename"
        exec    esi, TListView:AddHeader, txt "Size"
        exec    esi, TListView:AddHeader, txt "Type"
        exec    esi, TListView:AddHeader, txt "Modified"

        set     [frmFileDlg.tbPath], TTabBar:OnSelChange, __FileDlgPathChanged

        stdcall GetFullPathName, [.start_filename]
        push    eax eax eax

        stdcall StrSplitFilename, eax
        push    eax

        set     [frmFileDlg.editFilename], TEdit:Text, eax
        stdcall StrDel ; from the stack

        stdcall StrPtr ; from the stack
        cmp     byte [eax], DIR_SLASH
        jne     @f
        exec    [frmFileDlg.tbPath], TTabBar:InsertTab, -1, txt DIR_SLASH, 0, 0
@@:
        pop     eax
        stdcall StrSplitList, eax, DIR_SLASH, FALSE
        stdcall StrDel ; from the stack
        mov     edx, eax
        xor     ecx, ecx

.dir_loop:
        cmp     ecx, [edx+TArray.count]
        jae     .end_dir

        stdcall StrCat, [edx+TArray.array+4*ecx], txt DIR_SLASH
        exec    [frmFileDlg.tbPath], TTabBar:InsertTab, -1, [edx+TArray.array+4*ecx], 0, 0
        inc     ecx
        jmp     .dir_loop

.end_dir:
        stdcall ListFree, edx, StrDel

        mov     ecx, [frmFileDlg.tbPath]
        mov     ecx, [ecx+TTabBar._items]
        mov     ecx, [ecx+TArray.count]
        dec     ecx
        set     [frmFileDlg.tbPath], TTabBar:Selected, ecx

        stdcall ShowModal, ebx, [.pParent]
        cmp     eax, mrOK
        jne     .ignore

; finish ok:

        mov     edi, [frmFileDlg.tbPath]
        mov     edx, [edi+TTabBar._items]
        mov     ecx, [edi+TTabBar._selected]
        lea     edx, [edx+TArray.array]

        stdcall StrNew
        mov     edi, eax

.restore_path:
        stdcall StrCat, edi, [edx+TTab.caption]
        add     edx, sizeof.TTab
        dec     ecx
        jns     .restore_path

        test    [.type], fdtMultipleSelect
        jnz     .get_multiple

        get     eax, [frmFileDlg.editFilename], TEdit:Text
        push    eax

        stdcall StrCat, edi, eax
        stdcall StrDel ; from the stack.

        mov     [esp+4*regEAX], edi

.finish:
        destroy ebx
        clc
        popad
        return


.get_multiple:
locals
  .path dd ?
  .end  dd ?
endl

        stdcall CreateArray, 4
        jc      .cant_allocate_array

        push    ebx

        mov     edx, eax
        mov     [.path], edi

        mov     esi, [frmFileDlg.lvFiles]
        mov     ebx, [esi+TListView._items]
        lea     ebx, [ebx+TArray.array]

        mov     ecx, [esi+TListView.selection.top]
        mov     eax, [esi+TListView.selection.bottom]

        cmp     ecx, eax
        jle     .order_ok
        xchg    ecx, eax
.order_ok:

        dec     ecx
        js      .end_files

        dec     eax     ; because of the header line!
        js      .end_files

        mov     [.end], eax

        OutputValue "Item from: ", ecx, 10, -1
        OutputValue "Item to: ", [.end], 10, -1

        lea     ebx, [ebx+8*ecx]
        lea     ebx, [ebx+8*ecx]        ; sizeof.TLvItem = $10

.file_loop:
        cmp     ecx, [.end]
        jg      .end_files

        stdcall StrDup, [.path]
        mov     edi, [ebx+TLvItem.captions]
        stdcall StrCat, eax, [edi+TArray.array]
        push    eax

        stdcall AddArrayItems, edx, 1
        pop     dword [eax]

        add     ebx, sizeof.TLvItem
        inc     ecx
        jmp     .file_loop

.end_files:
        stdcall StrDel, [.path]

        pop     ebx
        mov     [esp+4*regEAX], edx
        jmp     .finish

.cant_allocate_array:

        stdcall StrDel, edi

.ignore:
        xor     eax, eax
        mov     [esp+4*regEAX], eax
        destroy ebx
        stc
        popad
        return

endp



; interface TTabBar.OnSelChange, .self, .pTabUnselected, .iTabUnselected, .pTabSelected, .iTabSelected

proc __FileDlgPathChanged as TTabBar.OnSelChange
begin
        cmp     [.pTabSelected], 0
        je      .finish

        mov     esi, [.self]

; create active path

        stdcall StrNew
        mov     ebx, eax

        mov     edi, [esi+TTabBar._items]
        mov     ecx, [edi+TArray.count]
        dec     ecx
        js      .dir_ok

        cmp     ecx, [esi+TTabBar._selected]
        cmova   ecx, [esi+TTabBar._selected]
        lea     edi, [edi+TArray.array]

.loop:
        stdcall StrCat, ebx, [edi + TTab.caption]
        add     edi, sizeof.TTab
        dec     ecx
        jns     .loop

.dir_ok:
        stdcall __FillListView, ebx, [frmFileDlg.lvFiles]
        stdcall StrDel, ebx

        exec    [frmFileDlg.lvFiles], TListView:SetFocused, 0, 1
        stdcall SetFocusedWindow, [frmFileDlg.lvFiles]

.finish:
        return
endp



proc __FillListView, .hDir, .list_view
.date_time TDateTime
begin
        pushad

        mov     edi, [.list_view]

        set     edi, TListView:Visible, FALSE
        exec    edi, TListView:Clear

        stdcall DirectoryRead, [.hDir]
        jc      .finish

        mov     esi, eax        ; TArray of TDirItem
        push    eax

        stdcall SortArray, esi, DirItemCompare, dsByName or fdsDirsFirst

        mov     ecx, [esi+TArray.count]
        lea     esi, [esi+TArray.array]

.loop:
        dec     ecx
        js      .end_of_files

        xor     eax, eax
        xor     ebx, ebx

        stdcall StrPtr, [esi+TDirItem.hFilename]
        cmp     word [eax], '.'
        je      .next

        mov     edx, [esi+TDirItem.Type]
        test    edx, ftLinkMask
        setnz   bl

        and     edx, not ftLinkMask

        cmp     [pFileIconsCallback], 0
        je      .default_icon

        stdcall [pFileIconsCallback], esi
        jnc     .icon_ok

.default_icon:
        cmp     edx, ftDirectory
        cmove   eax, [GUI.iconDirectory+8*ebx]

        cmp     edx, ftFile
        cmove   eax, [GUI.iconFile+8*ebx]

.icon_ok:
        exec    edi, TListView:InsertItem, -1, [esi+TDirItem.hFilename], eax, 0
        mov     ebx, eax

; size
        mov     edx, [esi+TDirItem.Type]
        and     edx, not ftLinkMask
        cmp     edx, ftDirectory
        jne     .get_size

        stdcall StrNew
        jmp     .set_size

.get_size:
        stdcall NumToStr64, dword [esi+TDirItem.Size], dword [esi+TDirItem.Size+4], ntsDec or ntsUnsigned

.set_size:
        push    eax
        exec    edi, TListView:AddSubItem, ebx, eax
        stdcall StrDel ; from the stack

; extension

        cmp     edx, ftDirectory
        jne     .get_ext

        stdcall StrDupMem, txt "DIR"
        jmp     .set_type

.get_ext:
        stdcall StrExtractExt, [esi+TDirItem.hFilename]
        jnc     .set_type

        stdcall StrNew

.set_type:
        mov     edx, eax
        exec    edi, TListView:AddSubItem, ebx, edx
        stdcall StrDel, edx

; time modified

        lea     eax, [.date_time]
        lea     edx, [esi+TDirItem.mTime]
        stdcall TimeToDateTime, edx, eax
        stdcall DateTimeToStr, eax, 0
        push    eax
        exec    edi, TListView:AddSubItem, ebx, eax
        stdcall StrDel ; from the stack

.next:
        add     esi, sizeof.TDirItem
        jmp     .loop

.end_of_files:

        stdcall FreeDirArray ; from the stack

.finish:
        set     edi, TListView:Visible, TRUE
        popad
        return
endp





proc __FileListFocusChange as TListView.OnFocusChange
begin
        pushad

        mov     esi, [.pListView]
        mov     edx, [esi+TListView._items]

        mov     ebx, [.y]
        sub     ebx, [esi+TListView._FixedRows]
        js      .finish

        test    [esi+TListView._flags], gfRowFocus
        jnz     @f
        imul    ebx, [esi+TListView.ColCount]
        add     ebx, [.x]
        sub     ebx, [esi+TListView._FixedCols]
@@:

; here ebx is the item index in TArray

        cmp     ebx, [edx+TArray.count]
        jae     .finish

        shl     ebx, TLvItem.shift
        lea     ebx, [edx+ebx+TArray.array]

        mov     edx, [ebx+TLvItem.captions]

        stdcall StrLen, [edx + TArray.array + 4]  ; is it a directory?
        test    eax, eax
        jz      .finish

        set     [frmFileDlg.editFilename], TEdit:Text, [edx+TArray.array]

.finish:
        popad
        return
endp




proc __FileDialogChangeDir
begin
        pushad

        mov     esi, [frmFileDlg.lvFiles]
        mov     edx, [esi+TListView._items]

        mov     ebx, [esi+TListView._focused.y]
        sub     ebx, [esi+TListView._FixedRows]
        js      .finish_false

        test    [esi+TListView._flags], gfRowFocus
        jnz     @f
        imul    ebx, [esi+TListView.ColCount]
        add     ebx, [esi+TListView._focused.x]
        sub     ebx, [esi+TListView._FixedCols]
@@:

; here ebx is the item index in TArray

        cmp     ebx, [edx+TArray.count]
        jae     .finish_false

        shl     ebx, TLvItem.shift
        lea     ebx, [edx+ebx+TArray.array]

; is it directory?

        mov     edx, [ebx+TLvItem.captions]
        cmp     [edx+TArray.count], 2
        jb      .finish_false

        stdcall StrLen, [edx + TArray.array + 4]
        test    eax, eax
        jnz     .finish_false

; directory!!!

        push    edx

        get     eax, [frmFileDlg], TForm:UserData
        test    eax, eax
        jnz     .filename_ok

        set     [frmFileDlg.editFilename], TEdit:Text, 0

.filename_ok:
        stdcall StrCompCase, [edx+TArray.array], txt '..'
        jnc     .change_up

        pop     edx

        exec    [frmFileDlg.tbPath], TTabBar:Prev
        jmp     .finish_true

.change_up:
; change directory.

        mov     edi, [frmFileDlg.tbPath]
        mov     edx, [edi+TTabBar._items]
        sub     eax, [edi+TTabBar._selected]
        mov     ecx, [edx+TArray.count]
        set     edi, TTabBar:OnSelChange, 0

.free_loop:
        dec     ecx
        cmp     ecx, [edi+TTabBar._selected]
        je      .add_new

        exec    edi, TTabBar:DeleteTab, ecx, 0
        jmp     .free_loop

.add_new:
        set     edi, TTabBar:OnSelChange, __FileDlgPathChanged
        pop     edx

        stdcall StrDup, [edx+TArray.array]
        stdcall StrCat, eax, txt DIR_SLASH
        push    eax

        exec    edi, TTabBar:InsertTab, -1, eax, 0, 0
        stdcall StrDel ; from the stack

        mov     eax, [edi+TTabBar._selected]
        inc     eax
        set     edi, TTabBar:Selected, eax

.finish_true:
        stc
        popad
        return

.finish_false:
        clc
        popad
        return
endp




proc __FileListDoubleClick as TWindow.OnMouseButton
begin
        stdcall __FileDialogChangeDir
        jc      .finish

        set     [frmFileDlg], TForm:ModalResult, mrOK

.finish:
        return
endp



proc __FileListKeyPressed as TWindow.OnKeyEvent
begin
        cmp     [.utf8], $08
        je      .directory_back_forward

        cmp     [.utf8], $0d
        clc
        jne     .finish

        stdcall __FileDialogChangeDir
        jmp     .finish

.directory_back_forward:
        test    [.kbdState], maskCtrl or maskShift
        jz      .directory_back

        exec    [frmFileDlg.tbPath], TTabBar:Next
        stc
        jmp     .finish

.directory_back:
        exec    [frmFileDlg.tbPath], TTabBar:Prev
        stc
        
.finish:
        return
endp

Added freshlib/gui/images/_theme_circle/error.png.

cannot compute difference between binary files

Added freshlib/gui/images/_theme_circle/information.png.

cannot compute difference between binary files

Added freshlib/gui/images/_theme_circle/question.png.

cannot compute difference between binary files

Added freshlib/gui/images/_theme_circle/warning.png.

cannot compute difference between binary files

Added freshlib/gui/images/_theme_rhomb/error.png.

cannot compute difference between binary files

Added freshlib/gui/images/_theme_rhomb/information.png.

cannot compute difference between binary files

Added freshlib/gui/images/_theme_rhomb/question.png.

cannot compute difference between binary files

Added freshlib/gui/images/_theme_rhomb/warning.png.

cannot compute difference between binary files

Added freshlib/gui/images/checkbox/check.png.

cannot compute difference between binary files

Added freshlib/gui/images/checkbox/check.svg.







































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="13"
   height="13"
   viewBox="0 0 13 13"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="check.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/checkbox/check.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90"><metadata
     id="metadata43"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
     id="defs41" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview39"
     showgrid="false"
     inkscape:zoom="43.153846"
     inkscape:cx="2.6648841"
     inkscape:cy="6.5"
     inkscape:current-layer="Capa_1" /><g
     id="g3"
     transform="matrix(0.22441969,0,0,0.22441969,1.4999414,1.5000527)"
     style="fill:#0000ff;fill-opacity:1"><g
       id="g5"
       style="fill:#0000ff;fill-opacity:1"><path
         d="m 23.297,38.74 c -1.17,1.588 -2.992,2.564 -4.962,2.661 -1.97,0.098 -3.878,-0.696 -5.198,-2.162 L 1.308,26.112 c -1.88,-2.085 -1.713,-5.299 0.372,-7.179 2.087,-1.88 5.299,-1.712 7.179,0.374 l 8.369,9.288 c 0.124,0.138 0.304,0.212 0.489,0.203 0.186,-0.009 0.356,-0.102 0.467,-0.25 L 35.386,5.217 c 1.665,-2.26 4.847,-2.741 7.108,-1.075 2.259,1.666 2.739,4.848 1.073,7.107 L 23.297,38.74 Z"
         id="path7"
         inkscape:connector-curvature="0"
         style="fill:#0000ff;fill-opacity:1" /></g></g><g
     id="g9"
     transform="translate(0,-31.560001)" /><g
     id="g11"
     transform="translate(0,-31.560001)" /><g
     id="g13"
     transform="translate(0,-31.560001)" /><g
     id="g15"
     transform="translate(0,-31.560001)" /><g
     id="g17"
     transform="translate(0,-31.560001)" /><g
     id="g19"
     transform="translate(0,-31.560001)" /><g
     id="g21"
     transform="translate(0,-31.560001)" /><g
     id="g23"
     transform="translate(0,-31.560001)" /><g
     id="g25"
     transform="translate(0,-31.560001)" /><g
     id="g27"
     transform="translate(0,-31.560001)" /><g
     id="g29"
     transform="translate(0,-31.560001)" /><g
     id="g31"
     transform="translate(0,-31.560001)" /><g
     id="g33"
     transform="translate(0,-31.560001)" /><g
     id="g35"
     transform="translate(0,-31.560001)" /><g
     id="g37"
     transform="translate(0,-31.560001)" /></svg>

Added freshlib/gui/images/checkbox/check_flat.png.

cannot compute difference between binary files

Added freshlib/gui/images/checkbox/check_flat.svg.

































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="13"
   height="13"
   viewBox="0 0 13 13"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="check_flat.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/checkbox/check_flat.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90"><metadata
     id="metadata43"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
     id="defs41" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview39"
     showgrid="false"
     inkscape:zoom="43.153846"
     inkscape:cx="6.5"
     inkscape:cy="6.5"
     inkscape:current-layer="Capa_1" /><g
     id="g9"
     transform="translate(0,-31.560001)" /><g
     id="g11"
     transform="translate(0,-31.560001)" /><g
     id="g13"
     transform="translate(0,-31.560001)" /><g
     id="g15"
     transform="translate(0,-31.560001)" /><g
     id="g17"
     transform="translate(0,-31.560001)" /><g
     id="g19"
     transform="translate(0,-31.560001)" /><g
     id="g21"
     transform="translate(0,-31.560001)" /><g
     id="g23"
     transform="translate(0,-31.560001)" /><g
     id="g25"
     transform="translate(0,-31.560001)" /><g
     id="g27"
     transform="translate(0,-31.560001)" /><g
     id="g29"
     transform="translate(0,-31.560001)" /><g
     id="g31"
     transform="translate(0,-31.560001)" /><g
     id="g33"
     transform="translate(0,-31.560001)" /><g
     id="g35"
     transform="translate(0,-31.560001)" /><g
     id="g37"
     transform="translate(0,-31.560001)" /><rect
     style="fill:#e74c3c;fill-opacity:1;stroke:none;stroke-width:1.02100003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
     id="rect4169"
     width="5"
     height="5"
     x="4"
     y="4" /></svg>

Added freshlib/gui/images/checkbox/check_flat_gray.png.

cannot compute difference between binary files

Added freshlib/gui/images/checkbox/check_flat_gray.svg.

































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="13"
   height="13"
   viewBox="0 0 13 13"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="check_flat_gray.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/checkbox/check_flat_gray.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90"><metadata
     id="metadata43"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
     id="defs41" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview39"
     showgrid="false"
     inkscape:zoom="96.432248"
     inkscape:cx="4.7837691"
     inkscape:cy="6.4536542"
     inkscape:current-layer="Capa_1" /><g
     id="g9"
     transform="translate(0,-31.560001)" /><g
     id="g11"
     transform="translate(0,-31.560001)" /><g
     id="g13"
     transform="translate(0,-31.560001)" /><g
     id="g15"
     transform="translate(0,-31.560001)" /><g
     id="g17"
     transform="translate(0,-31.560001)" /><g
     id="g19"
     transform="translate(0,-31.560001)" /><g
     id="g21"
     transform="translate(0,-31.560001)" /><g
     id="g23"
     transform="translate(0,-31.560001)" /><g
     id="g25"
     transform="translate(0,-31.560001)" /><g
     id="g27"
     transform="translate(0,-31.560001)" /><g
     id="g29"
     transform="translate(0,-31.560001)" /><g
     id="g31"
     transform="translate(0,-31.560001)" /><g
     id="g33"
     transform="translate(0,-31.560001)" /><g
     id="g35"
     transform="translate(0,-31.560001)" /><g
     id="g37"
     transform="translate(0,-31.560001)" /><rect
     style="fill:#6f6f6f;fill-opacity:1;stroke:none;stroke-width:1.02100003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
     id="rect4169"
     width="5"
     height="5"
     x="4"
     y="4" /></svg>

Added freshlib/gui/images/checkbox/check_gray.png.

cannot compute difference between binary files

Added freshlib/gui/images/checkbox/check_gray.svg.







































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="13"
   height="13"
   viewBox="0 0 13 13"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="check_gray.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/checkbox/check_gray.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90"><metadata
     id="metadata43"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
     id="defs41" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview39"
     showgrid="false"
     inkscape:zoom="43.153846"
     inkscape:cx="2.6648841"
     inkscape:cy="6.5"
     inkscape:current-layer="Capa_1" /><g
     id="g3"
     transform="matrix(0.22441969,0,0,0.22441969,1.4999414,1.5000527)"
     style="fill:#404040;fill-opacity:1"><g
       id="g5"
       style="fill:#404040;fill-opacity:1"><path
         d="m 23.297,38.74 c -1.17,1.588 -2.992,2.564 -4.962,2.661 -1.97,0.098 -3.878,-0.696 -5.198,-2.162 L 1.308,26.112 c -1.88,-2.085 -1.713,-5.299 0.372,-7.179 2.087,-1.88 5.299,-1.712 7.179,0.374 l 8.369,9.288 c 0.124,0.138 0.304,0.212 0.489,0.203 0.186,-0.009 0.356,-0.102 0.467,-0.25 L 35.386,5.217 c 1.665,-2.26 4.847,-2.741 7.108,-1.075 2.259,1.666 2.739,4.848 1.073,7.107 L 23.297,38.74 Z"
         id="path7"
         inkscape:connector-curvature="0"
         style="fill:#404040;fill-opacity:1" /></g></g><g
     id="g9"
     transform="translate(0,-31.560001)" /><g
     id="g11"
     transform="translate(0,-31.560001)" /><g
     id="g13"
     transform="translate(0,-31.560001)" /><g
     id="g15"
     transform="translate(0,-31.560001)" /><g
     id="g17"
     transform="translate(0,-31.560001)" /><g
     id="g19"
     transform="translate(0,-31.560001)" /><g
     id="g21"
     transform="translate(0,-31.560001)" /><g
     id="g23"
     transform="translate(0,-31.560001)" /><g
     id="g25"
     transform="translate(0,-31.560001)" /><g
     id="g27"
     transform="translate(0,-31.560001)" /><g
     id="g29"
     transform="translate(0,-31.560001)" /><g
     id="g31"
     transform="translate(0,-31.560001)" /><g
     id="g33"
     transform="translate(0,-31.560001)" /><g
     id="g35"
     transform="translate(0,-31.560001)" /><g
     id="g37"
     transform="translate(0,-31.560001)" /></svg>

Added freshlib/gui/images/error.png.

cannot compute difference between binary files

Added freshlib/gui/images/information.png.

cannot compute difference between binary files

Added freshlib/gui/images/menu/check.png.

cannot compute difference between binary files

Added freshlib/gui/images/menu/check.svg.









































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="8"
   height="16"
   viewBox="0 0 8 16"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="check.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/check.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90"><metadata
     id="metadata43"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
     id="defs41" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview39"
     showgrid="false"
     inkscape:zoom="35.0625"
     inkscape:cx="-0.7201426"
     inkscape:cy="8"
     inkscape:current-layer="Capa_1"
     inkscape:snap-page="true" /><g
     id="g3"
     transform="matrix(0.17953575,0,0,0.1795327,-4.6834361e-5,4.0001102)"
     style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><g
       id="g5"
       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><path
         d="m 23.297,38.74 c -1.17,1.588 -2.992,2.564 -4.962,2.661 -1.97,0.098 -3.878,-0.696 -5.198,-2.162 L 1.308,26.112 c -1.88,-2.085 -1.713,-5.299 0.372,-7.179 2.087,-1.88 5.299,-1.712 7.179,0.374 l 8.369,9.288 c 0.124,0.138 0.304,0.212 0.489,0.203 0.186,-0.009 0.356,-0.102 0.467,-0.25 L 35.386,5.217 c 1.665,-2.26 4.847,-2.741 7.108,-1.075 2.259,1.666 2.739,4.848 1.073,7.107 L 23.297,38.74 Z"
         id="path7"
         inkscape:connector-curvature="0"
         style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g></g><g
     id="g9"
     transform="translate(0,-28.560001)" /><g
     id="g11"
     transform="translate(0,-28.560001)" /><g
     id="g13"
     transform="translate(0,-28.560001)" /><g
     id="g15"
     transform="translate(0,-28.560001)" /><g
     id="g17"
     transform="translate(0,-28.560001)" /><g
     id="g19"
     transform="translate(0,-28.560001)" /><g
     id="g21"
     transform="translate(0,-28.560001)" /><g
     id="g23"
     transform="translate(0,-28.560001)" /><g
     id="g25"
     transform="translate(0,-28.560001)" /><g
     id="g27"
     transform="translate(0,-28.560001)" /><g
     id="g29"
     transform="translate(0,-28.560001)" /><g
     id="g31"
     transform="translate(0,-28.560001)" /><g
     id="g33"
     transform="translate(0,-28.560001)" /><g
     id="g35"
     transform="translate(0,-28.560001)" /><g
     id="g37"
     transform="translate(0,-28.560001)" /></svg>

Added freshlib/gui/images/menu/check_flat.png.

cannot compute difference between binary files

Added freshlib/gui/images/menu/check_flat.svg.













































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="7"
   height="16"
   viewBox="0 0 7 16"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="check_flat.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/check_flat.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90"><metadata
     id="metadata43"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
     id="defs41" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview39"
     showgrid="false"
     inkscape:zoom="33.519231"
     inkscape:cx="-0.93746414"
     inkscape:cy="8"
     inkscape:current-layer="Capa_1"
     inkscape:snap-page="true" /><g
     id="g3"
     transform="matrix(0.17953575,0,0,0.1795327,-4.6834361e-5,4.0001102)"
     style="fill:#e67e22;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><g
       id="g5"
       style="fill:#e67e22;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g><g
     id="g9"
     transform="translate(0,-28.560001)" /><g
     id="g11"
     transform="translate(0,-28.560001)" /><g
     id="g13"
     transform="translate(0,-28.560001)" /><g
     id="g15"
     transform="translate(0,-28.560001)" /><g
     id="g17"
     transform="translate(0,-28.560001)" /><g
     id="g19"
     transform="translate(0,-28.560001)" /><g
     id="g21"
     transform="translate(0,-28.560001)" /><g
     id="g23"
     transform="translate(0,-28.560001)" /><g
     id="g25"
     transform="translate(0,-28.560001)" /><g
     id="g27"
     transform="translate(0,-28.560001)" /><g
     id="g29"
     transform="translate(0,-28.560001)" /><g
     id="g31"
     transform="translate(0,-28.560001)" /><g
     id="g33"
     transform="translate(0,-28.560001)" /><g
     id="g35"
     transform="translate(0,-28.560001)" /><g
     id="g37"
     transform="translate(0,-28.560001)" /><rect
     style="fill:#e74c3c;fill-opacity:1;stroke:none;stroke-width:1.02100003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
     id="rect4169"
     width="7"
     height="7"
     x="0"
     y="4.5" /></svg>

Added freshlib/gui/images/menu/check_flat_gray.png.

cannot compute difference between binary files

Added freshlib/gui/images/menu/check_flat_gray.svg.













































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="7"
   height="16"
   viewBox="0 0 7 16"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="check_flat_gray.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/check_flat_gray.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90"><metadata
     id="metadata43"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
     id="defs41" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview39"
     showgrid="false"
     inkscape:zoom="33.519231"
     inkscape:cx="-0.93746414"
     inkscape:cy="8"
     inkscape:current-layer="Capa_1"
     inkscape:snap-page="true" /><g
     id="g3"
     transform="matrix(0.17953575,0,0,0.1795327,-4.6834361e-5,4.0001102)"
     style="fill:#e67e22;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><g
       id="g5"
       style="fill:#e67e22;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g><g
     id="g9"
     transform="translate(0,-28.560001)" /><g
     id="g11"
     transform="translate(0,-28.560001)" /><g
     id="g13"
     transform="translate(0,-28.560001)" /><g
     id="g15"
     transform="translate(0,-28.560001)" /><g
     id="g17"
     transform="translate(0,-28.560001)" /><g
     id="g19"
     transform="translate(0,-28.560001)" /><g
     id="g21"
     transform="translate(0,-28.560001)" /><g
     id="g23"
     transform="translate(0,-28.560001)" /><g
     id="g25"
     transform="translate(0,-28.560001)" /><g
     id="g27"
     transform="translate(0,-28.560001)" /><g
     id="g29"
     transform="translate(0,-28.560001)" /><g
     id="g31"
     transform="translate(0,-28.560001)" /><g
     id="g33"
     transform="translate(0,-28.560001)" /><g
     id="g35"
     transform="translate(0,-28.560001)" /><g
     id="g37"
     transform="translate(0,-28.560001)" /><rect
     style="fill:#6e6e6e;fill-opacity:1;stroke:none;stroke-width:1.02100003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
     id="rect4169"
     width="7"
     height="7"
     x="0"
     y="4.5" /></svg>

Added freshlib/gui/images/menu/check_gray.png.

cannot compute difference between binary files

Added freshlib/gui/images/menu/check_gray.svg.









































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="8"
   height="16"
   viewBox="0 0 8 16"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="check_gray.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/check_gray.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90"><metadata
     id="metadata43"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
     id="defs41" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview39"
     showgrid="false"
     inkscape:zoom="35.0625"
     inkscape:cx="-0.7201426"
     inkscape:cy="8"
     inkscape:current-layer="Capa_1"
     inkscape:snap-page="true" /><g
     id="g3"
     transform="matrix(0.17953575,0,0,0.1795327,-4.6834361e-5,4.0001102)"
     style="fill:#3f3f3f;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><g
       id="g5"
       style="fill:#3f3f3f;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><path
         d="m 23.297,38.74 c -1.17,1.588 -2.992,2.564 -4.962,2.661 -1.97,0.098 -3.878,-0.696 -5.198,-2.162 L 1.308,26.112 c -1.88,-2.085 -1.713,-5.299 0.372,-7.179 2.087,-1.88 5.299,-1.712 7.179,0.374 l 8.369,9.288 c 0.124,0.138 0.304,0.212 0.489,0.203 0.186,-0.009 0.356,-0.102 0.467,-0.25 L 35.386,5.217 c 1.665,-2.26 4.847,-2.741 7.108,-1.075 2.259,1.666 2.739,4.848 1.073,7.107 L 23.297,38.74 Z"
         id="path7"
         inkscape:connector-curvature="0"
         style="fill:#3f3f3f;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g></g><g
     id="g9"
     transform="translate(0,-28.560001)" /><g
     id="g11"
     transform="translate(0,-28.560001)" /><g
     id="g13"
     transform="translate(0,-28.560001)" /><g
     id="g15"
     transform="translate(0,-28.560001)" /><g
     id="g17"
     transform="translate(0,-28.560001)" /><g
     id="g19"
     transform="translate(0,-28.560001)" /><g
     id="g21"
     transform="translate(0,-28.560001)" /><g
     id="g23"
     transform="translate(0,-28.560001)" /><g
     id="g25"
     transform="translate(0,-28.560001)" /><g
     id="g27"
     transform="translate(0,-28.560001)" /><g
     id="g29"
     transform="translate(0,-28.560001)" /><g
     id="g31"
     transform="translate(0,-28.560001)" /><g
     id="g33"
     transform="translate(0,-28.560001)" /><g
     id="g35"
     transform="translate(0,-28.560001)" /><g
     id="g37"
     transform="translate(0,-28.560001)" /></svg>

Added freshlib/gui/images/menu/submenu.png.

cannot compute difference between binary files

Added freshlib/gui/images/menu/submenu.svg.



















































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="6"
   height="11"
   viewBox="0 0 5.9999999 11"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="submenu.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/submenu.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90"><metadata
     id="metadata42"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
     id="defs40" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="1920"
     inkscape:window-height="1061"
     id="namedview38"
     showgrid="false"
     inkscape:zoom="51"
     inkscape:cx="-0.24509804"
     inkscape:cy="5.5"
     inkscape:window-x="-4"
     inkscape:window-y="-4"
     inkscape:window-maximized="1"
     inkscape:current-layer="Capa_1"
     fit-margin-top="0"
     fit-margin-left="0"
     fit-margin-right="0"
     fit-margin-bottom="0" /><g
     id="g3"
     transform="matrix(0.02139037,0,0,0.03081232,-0.81818182,1.9073486e-6)"
     style="fill:#000000;fill-opacity:1"><g
       id="play-arrow"
       style="fill:#000000;fill-opacity:1"><polygon
         points="38.25,0 38.25,357 318.75,178.5 "
         id="polygon6"
         style="fill:#000000;fill-opacity:1" /></g></g><g
     id="g8"
     transform="translate(-7.9999995,-339)" /><g
     id="g10"
     transform="translate(-7.9999995,-339)" /><g
     id="g12"
     transform="translate(-7.9999995,-339)" /><g
     id="g14"
     transform="translate(-7.9999995,-339)" /><g
     id="g16"
     transform="translate(-7.9999995,-339)" /><g
     id="g18"
     transform="translate(-7.9999995,-339)" /><g
     id="g20"
     transform="translate(-7.9999995,-339)" /><g
     id="g22"
     transform="translate(-7.9999995,-339)" /><g
     id="g24"
     transform="translate(-7.9999995,-339)" /><g
     id="g26"
     transform="translate(-7.9999995,-339)" /><g
     id="g28"
     transform="translate(-7.9999995,-339)" /><g
     id="g30"
     transform="translate(-7.9999995,-339)" /><g
     id="g32"
     transform="translate(-7.9999995,-339)" /><g
     id="g34"
     transform="translate(-7.9999995,-339)" /><g
     id="g36"
     transform="translate(-7.9999995,-339)" /></svg>

Added freshlib/gui/images/menu/submenugray.png.

cannot compute difference between binary files

Added freshlib/gui/images/menu/submenugray.svg.



















































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="6"
   height="11"
   viewBox="0 0 5.9999999 11"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="submenugray.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/submenugray.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90"><metadata
     id="metadata42"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
     id="defs40" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="1920"
     inkscape:window-height="1061"
     id="namedview38"
     showgrid="false"
     inkscape:zoom="51"
     inkscape:cx="3"
     inkscape:cy="5.5"
     inkscape:window-x="-4"
     inkscape:window-y="-4"
     inkscape:window-maximized="1"
     inkscape:current-layer="Capa_1"
     fit-margin-top="0"
     fit-margin-left="0"
     fit-margin-right="0"
     fit-margin-bottom="0" /><g
     id="g3"
     transform="matrix(0.02139037,0,0,0.03081232,-0.81818182,1.9073486e-6)"
     style="fill:#95a5a6;fill-opacity:1"><g
       id="play-arrow"
       style="fill:#95a5a6;fill-opacity:1"><polygon
         points="318.75,178.5 38.25,0 38.25,357 "
         id="polygon6"
         style="fill:#95a5a6;fill-opacity:1" /></g></g><g
     id="g8"
     transform="translate(-7.9999994,-339)" /><g
     id="g10"
     transform="translate(-7.9999994,-339)" /><g
     id="g12"
     transform="translate(-7.9999994,-339)" /><g
     id="g14"
     transform="translate(-7.9999994,-339)" /><g
     id="g16"
     transform="translate(-7.9999994,-339)" /><g
     id="g18"
     transform="translate(-7.9999994,-339)" /><g
     id="g20"
     transform="translate(-7.9999994,-339)" /><g
     id="g22"
     transform="translate(-7.9999994,-339)" /><g
     id="g24"
     transform="translate(-7.9999994,-339)" /><g
     id="g26"
     transform="translate(-7.9999994,-339)" /><g
     id="g28"
     transform="translate(-7.9999994,-339)" /><g
     id="g30"
     transform="translate(-7.9999994,-339)" /><g
     id="g32"
     transform="translate(-7.9999994,-339)" /><g
     id="g34"
     transform="translate(-7.9999994,-339)" /><g
     id="g36"
     transform="translate(-7.9999994,-339)" /></svg>

Added freshlib/gui/images/menu/submenusel.png.

cannot compute difference between binary files

Added freshlib/gui/images/menu/submenusel.svg.



















































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="6"
   height="10.999998"
   viewBox="0 0 5.9999999 10.999998"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="submenusel.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/submenusel.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90"><metadata
     id="metadata42"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
     id="defs40" /><sodipodi:namedview
     pagecolor="#0000ff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="1920"
     inkscape:window-height="1061"
     id="namedview38"
     showgrid="false"
     inkscape:zoom="51.000009"
     inkscape:cx="3"
     inkscape:cy="5.499999"
     inkscape:window-x="-4"
     inkscape:window-y="-4"
     inkscape:window-maximized="1"
     inkscape:current-layer="Capa_1"
     fit-margin-top="0"
     fit-margin-left="0"
     fit-margin-right="0"
     fit-margin-bottom="0" /><g
     id="g3"
     transform="matrix(0.02139037,0,0,0.03081232,-0.81818182,-1.4734863e-7)"
     style="fill:#ffffff;fill-opacity:1"><g
       id="play-arrow"
       style="fill:#ffffff;fill-opacity:1"><polygon
         points="38.25,0 38.25,357 318.75,178.5 "
         id="polygon6"
         style="fill:#ffffff;fill-opacity:1" /></g></g><g
     id="g8"
     transform="translate(-7.9999995,-339)" /><g
     id="g10"
     transform="translate(-7.9999995,-339)" /><g
     id="g12"
     transform="translate(-7.9999995,-339)" /><g
     id="g14"
     transform="translate(-7.9999995,-339)" /><g
     id="g16"
     transform="translate(-7.9999995,-339)" /><g
     id="g18"
     transform="translate(-7.9999995,-339)" /><g
     id="g20"
     transform="translate(-7.9999995,-339)" /><g
     id="g22"
     transform="translate(-7.9999995,-339)" /><g
     id="g24"
     transform="translate(-7.9999995,-339)" /><g
     id="g26"
     transform="translate(-7.9999995,-339)" /><g
     id="g28"
     transform="translate(-7.9999995,-339)" /><g
     id="g30"
     transform="translate(-7.9999995,-339)" /><g
     id="g32"
     transform="translate(-7.9999995,-339)" /><g
     id="g34"
     transform="translate(-7.9999995,-339)" /><g
     id="g36"
     transform="translate(-7.9999995,-339)" /></svg>

Added freshlib/gui/images/question.png.

cannot compute difference between binary files

Added freshlib/gui/images/svg/error.svg.







































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   viewBox="0 0 310.285 310.285"
   style="enable-background:new 0 0 310.285 310.285;"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="error.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/svg/error.png"
   inkscape:export-xdpi="13.92"
   inkscape:export-ydpi="13.92"><metadata
     id="metadata39"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
     id="defs37" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview35"
     showgrid="false"
     inkscape:zoom="1.6820764"
     inkscape:cx="60.913725"
     inkscape:cy="152.51297"
     inkscape:current-layer="Capa_1" /><rect
     style="fill:#ffffff;fill-opacity:1"
     id="rect4167"
     width="183.70152"
     height="198.56412"
     x="67.773376"
     y="57.62109" /><path
     d="M264.845,45.441C235.542,16.139,196.582,0,155.143,0S74.743,16.139,45.44,45.441C16.138,74.743,0,113.703,0,155.143  c0,41.439,16.138,80.399,45.44,109.701c29.303,29.303,68.262,45.44,109.702,45.44s80.399-16.138,109.702-45.44  c29.302-29.302,45.44-68.262,45.44-109.701C310.285,113.703,294.147,74.743,264.845,45.441z M189.702,157.985l38.669,38.669  c3.12,3.119,3.12,8.194,0,11.313l-22.333,22.333c-1.507,1.507-3.516,2.337-5.657,2.337c-2.141,0-4.15-0.83-5.657-2.337  l-38.669-38.669c-0.748-0.746-2.08-0.746-2.829,0l-38.669,38.669c-1.507,1.507-3.516,2.337-5.657,2.337  c-2.141,0-4.149-0.83-5.657-2.336l-22.333-22.334c-1.507-1.507-2.337-3.516-2.337-5.656c0-2.142,0.83-4.15,2.337-5.657  l38.669-38.669c0.766-0.767,0.766-2.063-0.001-2.829l-40.302-40.302c-1.507-1.507-2.337-3.516-2.337-5.657  c0-2.141,0.83-4.149,2.337-5.656l22.333-22.333c1.507-1.507,3.516-2.337,5.657-2.337c2.141,0,4.149,0.83,5.656,2.337l40.303,40.303  c0.749,0.747,2.081,0.746,2.828,0l40.303-40.303c1.507-1.507,3.516-2.337,5.657-2.337c2.141,0,4.149,0.83,5.656,2.337l22.333,22.333  c1.507,1.507,2.337,3.516,2.337,5.656c0,2.142-0.83,4.15-2.337,5.658l-40.302,40.301  C188.936,155.923,188.936,157.219,189.702,157.985z"
     id="path3"
     style="fill:#e74c3c;fill-opacity:1" /><g
     id="g5" /><g
     id="g7" /><g
     id="g9" /><g
     id="g11" /><g
     id="g13" /><g
     id="g15" /><g
     id="g17" /><g
     id="g19" /><g
     id="g21" /><g
     id="g23" /><g
     id="g25" /><g
     id="g27" /><g
     id="g29" /><g
     id="g31" /><g
     id="g33" /></svg>

Added freshlib/gui/images/svg/information.svg.







































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   viewBox="0 0 315.772 315.772"
   style="enable-background:new 0 0 315.772 315.772;"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="information.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/svg/information.png"
   inkscape:export-xdpi="13.68"
   inkscape:export-ydpi="13.68"><metadata
     id="metadata39"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
     id="defs37" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview35"
     showgrid="false"
     inkscape:zoom="1.6528479"
     inkscape:cx="61.990908"
     inkscape:cy="155.20997"
     inkscape:current-layer="Capa_1" /><rect
     style="fill:#ffffff;fill-opacity:1"
     id="rect4167"
     width="183.70152"
     height="222.76477"
     x="60.613361"
     y="8.9693317" /><path
     d="M287.355,0H28.173C17.145,0,8.386,8.472,8.386,19.5v213.822c0,11.028,8.759,19.678,19.787,19.678h67.628  c5.514,0,9.585,4.809,9.585,10.322V302.5c0,9.169,5.476,13.272,10.697,13.272c3.053,0,6.293-1.282,9.423-3.813l62.314-50.482  c5.483-4.431,16.527-8.478,23.576-8.478h75.959c11.028,0,20.031-8.649,20.031-19.678V19.5C307.386,8.472,298.383,0,287.355,0z   M182.904,92.834l-26.124,90.563c-1.422,5.357-2.131,8.91-2.131,10.657c0,0.877,0.381,1.75,1.148,2.624  c0.763,0.876,1.583,1.311,2.459,1.311c1.529,0,3.005-0.656,4.427-1.967c3.781-3.067,8.186-8.43,13.213-16.087  c0.347-0.529,1.496-1.585,2.16-0.987l2.682,1.532c0.665,0.574,0.253,1.403-0.021,1.869c-13.096,22.234-26.977,33.347-41.643,33.347  c-5.685,0-10.222-1.614-13.608-4.836c-3.389-3.222-5.083-7.296-5.083-12.215c0-3.279,0.763-7.432,2.295-12.46l18.363-63.123  c1.747-6.009,2.623-10.546,2.623-13.608c0-1.967-0.848-3.714-2.541-5.246c-1.696-1.529-3.963-2.296-6.804-2.296  c-0.579,0-1.185,0.009-1.817,0.028c-0.922,0.026-2.655-0.706-2.359-1.632c0.25-0.779,0.509-1.617,0.618-2.063  c0.507-2.068,5.213-2.185,5.213-2.185l36.527-5.887c0,0,2.912-0.558,4.984-0.558c1.587,0,3.096,0.014,4.127,0  C184.41,89.577,182.904,92.834,182.904,92.834z M189.408,61.987c-3.827,3.771-8.418,5.656-13.772,5.656  c-5.247,0-9.755-1.885-13.526-5.656c-3.771-3.771-5.656-8.333-5.656-13.69c0-5.354,1.857-9.944,5.574-13.772  c3.715-3.825,8.251-5.739,13.608-5.739c5.464,0,10.083,1.914,13.854,5.739c3.771,3.828,5.656,8.419,5.656,13.772  C195.146,53.654,193.232,58.216,189.408,61.987z"
     id="path3"
     style="fill:#3498db;fill-opacity:1" /><g
     id="g5" /><g
     id="g7" /><g
     id="g9" /><g
     id="g11" /><g
     id="g13" /><g
     id="g15" /><g
     id="g17" /><g
     id="g19" /><g
     id="g21" /><g
     id="g23" /><g
     id="g25" /><g
     id="g27" /><g
     id="g29" /><g
     id="g31" /><g
     id="g33" /></svg>

Added freshlib/gui/images/svg/question.svg.































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   viewBox="0 0 45.333 45.333"
   style="enable-background:new 0 0 45.333 45.333;"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="question.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/svg/question.png"
   inkscape:export-xdpi="95.290001"
   inkscape:export-ydpi="95.290001"><metadata
     id="metadata41"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
     id="defs39" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview37"
     showgrid="false"
     inkscape:zoom="11.513094"
     inkscape:cx="8.8995661"
     inkscape:cy="22.282322"
     inkscape:current-layer="Capa_1" /><g
     id="g3"
     style="fill:#2ecc71;fill-opacity:1"><path
       style="fill:#2ecc71;fill-opacity:1"
       d="M38.291,4.927c-1.2-1.142-1.792-1.316-1.3-0.481c0.302,0.513,0.555,1.039,0.757,1.58   c0.543,1.457,0.815,2.814,0.815,4.074c0,2.087-0.272,3.803-0.815,5.15c-0.545,1.347-1.217,2.499-2.021,3.454   c-0.805,0.957-1.694,1.772-2.672,2.445c-0.978,0.675-1.903,1.347-2.771,2.021c-0.87,0.674-1.641,1.445-2.315,2.314   c-0.353,0.455-0.637,0.97-0.853,1.544c-0.344,0.915-0.419,2.27-0.419,2.954s-1.97,1.238-4.399,1.238s-4.399-0.657-4.399-1.467   v-1.467c0.131-1.867,0.488-3.432,1.075-4.693c0.587-1.26,1.271-2.336,2.053-3.227c0.783-0.889,1.607-1.662,2.477-2.314   c0.868-0.652,1.673-1.303,2.412-1.956c0.739-0.652,1.337-1.369,1.793-2.151c0.456-0.782,0.661-1.759,0.619-2.933   c0-1.999-0.488-3.476-1.466-4.433c-0.978-0.956-2.338-1.434-4.074-1.434c-1.174,0-2.184,0.228-3.033,0.684   c-0.847,0.456-1.542,1.065-2.085,1.826c-0.545,0.76-0.946,1.651-1.206,2.672c-0.134,0.525-0.234,1.07-0.299,1.635   c-0.105,0.912-2.237,1.658-4.883,1.658s-4.8-1.489-4.475-3.282c0.201-1.109,0.498-2.166,0.89-3.171   c0.759-1.956,1.825-3.651,3.193-5.085c0.047-0.05,0.098-0.096,0.148-0.142c0.084-0.076-1.022,0.527-2.327,1.548   C3.409,7.636,0,14.09,0,21.344c0,10.014,6.496,18.507,15.503,21.505c1.572,0.523,2.256,0.143,1.852-0.834   c-0.238-0.576-0.37-1.205-0.37-1.866c0-2.772,2.291-5.019,5.116-5.019s5.116,2.247,5.116,5.019c0,0.716-0.155,1.395-0.434,2.009   c-0.472,1.042,0.127,1.51,1.728,1.084c9.685-2.577,16.822-11.402,16.822-21.899C45.336,14.882,42.63,9.055,38.291,4.927z"
       id="path5" /></g><g
     id="g7" /><g
     id="g9" /><g
     id="g11" /><g
     id="g13" /><g
     id="g15" /><g
     id="g17" /><g
     id="g19" /><g
     id="g21" /><g
     id="g23" /><g
     id="g25" /><g
     id="g27" /><g
     id="g29" /><g
     id="g31" /><g
     id="g33" /><g
     id="g35" /></svg>

Added freshlib/gui/images/svg/warning.svg.



































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   viewBox="0 0 356.484 356.484"
   style="enable-background:new 0 0 356.484 356.484;"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="warning.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/svg/warning.png"
   inkscape:export-xdpi="12.12"
   inkscape:export-ydpi="12.12"><metadata
     id="metadata39"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
     id="defs37" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview35"
     showgrid="false"
     inkscape:zoom="1.4640855"
     inkscape:cx="15.341685"
     inkscape:cy="166.40318"
     inkscape:current-layer="Capa_1" /><path
     style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
     d="M 162.55881,58.687198 C 26.637788,317.55186 27.320808,318.9179 27.320808,318.9179 l 299.845872,5.46416 -1.36604,0 -124.9927,-262.962781 2.04906,1.36604"
     id="path3367"
     inkscape:connector-curvature="0" /><path
     d="M354.239,321.64L189.847,22.478c-2.79-5.078-7.01-7.991-11.578-7.991c-4.584,0-8.824,2.931-11.631,8.04L2.245,321.64  c-2.749,5.002-2.984,10.138-0.646,14.09c2.356,3.983,7.023,6.267,12.806,6.267H342.08c5.782,0,10.449-2.284,12.806-6.267  C357.224,331.778,356.988,326.642,354.239,321.64z M154.064,93.621c0.922-0.955,2.166-1.624,3.504-1.624h40.897  c1.338,0,2.581,0.669,3.501,1.624c0.92,0.955,1.4,2.289,1.35,3.627l-5.174,139.618c-0.102,2.735-2.411,5.132-5.147,5.132h-30.298  c-2.738,0-5.043-2.363-5.138-5.099l-4.851-139.584C152.661,95.977,153.143,94.575,154.064,93.621z M178.188,315.435  c-15.386,0-26.988-12.19-26.988-28.355c0-16.36,11.455-28.697,26.646-28.697c15.689,0,26.646,11.801,26.646,28.697  C204.491,303.775,193.675,315.435,178.188,315.435z"
     id="path3"
     style="fill:#f1c40f;fill-opacity:1" /><g
     id="g5" /><g
     id="g7" /><g
     id="g9" /><g
     id="g11" /><g
     id="g13" /><g
     id="g15" /><g
     id="g17" /><g
     id="g19" /><g
     id="g21" /><g
     id="g23" /><g
     id="g25" /><g
     id="g27" /><g
     id="g29" /><g
     id="g31" /><g
     id="g33" /></svg>

Added freshlib/gui/images/treeview/down_flat.png.

cannot compute difference between binary files

Added freshlib/gui/images/treeview/minus_flat.png.

cannot compute difference between binary files

Added freshlib/gui/images/treeview/minus_win.png.

cannot compute difference between binary files

Added freshlib/gui/images/treeview/plus_flat.png.

cannot compute difference between binary files

Added freshlib/gui/images/treeview/plus_win.png.

cannot compute difference between binary files

Added freshlib/gui/images/treeview/render.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

# Not skinned images.

cd svg/

for i in *.svg; do
  svgcleaner --indent 2 --convert-shapes no "$i" "$i"
  rsvg-convert -o "../${i%.*}.png" "$i"
done

cd ..

for i in *.png; do
    pngquant -v --ordered -s 1 --strip -f --ext .png 64 -- "$i" 
    printf "\n"
done

identify -format "%k colors in %f\n" ./*.png

Added freshlib/gui/images/treeview/right_flat.png.

cannot compute difference between binary files

Added freshlib/gui/images/treeview/svg/down_flat.svg.







>
>
>
1
2
3
<svg viewBox="0 0 11 11" xmlns="http://www.w3.org/2000/svg">
  <path d="m10.407477 2h-9.81495431l4.90747731 8.5z" fill="#95a5a6" stroke="#fff" stroke-width="2"/>
</svg>

Added freshlib/gui/images/treeview/svg/minus_flat.svg.











>
>
>
>
>
1
2
3
4
5
<svg height="13" viewBox="0 0 13 13" width="13" xmlns="http://www.w3.org/2000/svg">
  <rect fill="#fff" height="13" width="13"/>
  <rect fill="#95a5a6" height="1" width="5" x="4" y="6"/>
  <circle cx="6.5" cy="6.5" fill="none" r="5" stroke="#95a5a6"/>
</svg>

Added freshlib/gui/images/treeview/svg/plus_flat.svg.

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
<svg height="13" viewBox="0 0 13 13" width="13" xmlns="http://www.w3.org/2000/svg">
  <rect fill="#fff" height="13" width="13"/>
  <circle cx="6.5" cy="6.5" fill="none" r="5" stroke="#95a5a6"/>
  <g fill="#95a5a6">
    <rect height="5" width="1" x="6" y="4"/>
    <rect height="1" width="5" x="4" y="6"/>
  </g>
</svg>

Added freshlib/gui/images/treeview/svg/right_flat.svg.







>
>
>
1
2
3
<svg viewBox="0 0 11 11" xmlns="http://www.w3.org/2000/svg">
  <path d="m2 10.407477 8.5-4.907477-8.5-4.90747731z" fill="#95a5a6" stroke="#fff" stroke-linecap="square" stroke-width="2"/>
</svg>

Added freshlib/gui/images/warning.png.

cannot compute difference between binary files

Added freshlib/gui/mouse.asm.





























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Provides unified access to standard mouse cursors.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: This file contains OS independent part and includes OS dependent files.
;_________________________________________________________________________________________
module "Mouse library"

mcArrow = 0
mcText  = 1
mcCross = 2
mcSizeH = 3
mcSizeV = 4
mcSizeUL_LR = 5
mcSizeLL_UR = 6
mcWait      = 7
mcArrowWait = 8
mcHand      = 9
mcDragHand  = 10
mcPencil    = 11


mcCount = 12


; Captures the mouse to the given window.

interface __MouseCapture, .hwnd

; Sets a mouse cursor for the given window.

interface SetMouseCursor, .hWindow, .hCursor

; Returns a stock cursor defined by mcXXXXX constants.

interface GetStockCursor, .index


; This procedure does not actually moves the mouse pointer, but generates all events the same way it was moved.
; Useful for making automatic repeat of different things controlled by the mouse move. For example dragging
; objects with window area auto-scrolling when the pointer lieves the window area.

interface ZeroMouseMove


proc SetMouseCapture, .window
begin
        pushad

        xor     edi, edi

        mov     esi, [.window]
        cmp     [.window], edi
        je      .setit

        get     edi, esi, TWindow:OSWindow
        mov     edi, [edi+TWindow.handle]

.setit:
        mov     [__MouseTarget], esi
        stdcall __MouseCapture, edi

        popad
        return
endp



include '%TargetOS%/mouse.asm'

endmodule

Added freshlib/gui/syntax/SyntaxFASM.asm.

























































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: This file contains procedures and data, that form the appearance of the
;               TAsmEdit components.
;
;  Target OS: Any
;
;  Dependencies:
;_________________________________________________________________________________________

module "FASM syntax highlighter for TAsmEdit"

; syntax contexts.

ciText         = 0
ciComment      = 1
ciString       = 2
ciNumber       = 3
ciSymbol       = 4

ciExtended     = $80


;_________________________________________________________________________________________
;
; Arguments:
;   .pLineInfo - pointer to TTextLine structure.
;   .SynContext - input context of the highligher.
;
; Returns:
;       eax - output context of the highligher.
;
proc SyntaxFASM, .pTextLine, .SynContext
.quote_char dd ?
.word_start dd ?
begin
        pushad

        mov     esi, [.pTextLine]

        mov     edi, [esi+TTextLine.syn_array]
        test    edi, edi
        jnz     .array_ok

        stdcall CreateArray, sizeof.TTextChunk
        mov     edi, eax
        mov     [esi+TTextLine.syn_array], eax

.array_ok:

        xor     ebx, ebx                ; the offset inside the line.
        xor     edx, edx                ; the length of the previous character.
        xor     ecx, ecx                ; the current chunk start position.

        mov     [.quote_char], ebx
        mov     [edi+TArray.count], ebx

.loop:
        add     ebx, edx

        mov     eax, [esi+TTextLine.GapBegin]
        cmp     ebx, eax
        cmovae  eax, [esi+TTextLine.GapEnd]
        sub     eax, [esi+TTextLine.GapBegin]
        add     eax, ebx

        cmp     eax, [esi+TTextLine.Length]
        jae     .end_of_line

        movzx   eax, byte [esi+eax]
        mov     edx, eax

; compute the length of the UTF-8 character by its first byte.
        not     dl              ; utf-8 starts with one of: 0xxxxxxx, 110xxxxx, 1110xxxx, 11110xxx, 111110xx, 1111110x
        bsr     edx, edx        ; edx =                 7,  5,  4,  3,  2,  1
        sub     edx, 7          ; edx =                 0, -2, -3, -4, -5, -6
                                ; CF  =                 0,  1,  1,  1,  1,  1
        not     edx             ; eax =                -1, +1, +2, +3, +4, +5
        sbb     edx, -2         ; eax = eax + 2 - CF = +1, +2, +3, +4, +5, +6

        cmp     [.SynContext], ciString
        jne     .ifnotstr

        cmp     eax, [.quote_char]
        jne     .loop

; end of a quoted string.
        add     ebx, edx
        xor     edx, edx

        call    .end_chunk
        mov     [.SynContext], ciText
        jmp     .loop

.ifnotstr:
        cmp     eax, $7f
        ja      .text

        cmp     eax, ';'
        jne     .not_comment

; It is a comment. No need to scan anymore. Mark as comment to the end of the line.
        call    .end_chunk
        mov     [.SynContext], ciComment
        mov     ebx, [esi+TTextLine.Length]
        add     ebx, [esi+TTextLine.GapBegin]
        sub     ebx, [esi+TTextLine.GapEnd]
        jmp     .end_of_line

.not_comment:
        cmp     eax, '"'
        je      .string
        cmp     eax, "'"
        jne     .not_string

.string:
        call    .end_chunk
        mov     [.SynContext], ciString
        mov     [.quote_char], eax
        jmp     .loop

.not_string:
        call    .CharInSymbols
        jne     .notsym

        cmp     [.SynContext], ciSymbol
        je      .loop

        call    .end_chunk
        mov     [.SynContext], ciSymbol
        jmp     .loop

.notsym:
        cmp     [.SynContext], ciNumber
        je      .loop

        cmp     [.SynContext], ciSymbol
        jne     .text

; The number begins only after ciSymbol or at the begining of the line.
.maybenum:
        cmp     al, '$'
        je      .num_start

        cmp     al, '-'
        je      .num_start

        cmp     al, '+'
        je      .num_start

        cmp     al, '0'
        jb      .text
        cmp     al, '9'
        ja      .text

.num_start:
        call    .end_chunk
        mov     [.SynContext], ciNumber
        jmp     .loop

.text:
        cmp     [.SynContext], ciText
        je      .loop

        call    .end_chunk
        mov     [.SynContext], ciText
        jmp     .loop


.end_of_line:
        call    .end_chunk

;        mov     eax, [.SynContext]
        xor     eax, eax                ; the assembly lines always end with context of 0 ???

        mov     [esi+TTextLine.syn_array], edi
        mov     [esi+TTextLine.syn_context], eax
        mov     [esp+4*regEAX], eax
        popad
        return


.end_chunk:
        push    eax edx

        sub     ecx, ebx
        jz      .chunk_processed

        neg     ecx

        stdcall AddArrayItems, edi, 1
        mov     edi, edx

        mov     edx, [.SynContext]
        mov     [eax+TTextChunk.color], dl
        mov     [eax+TTextChunk.bytes], cx

        shr     ecx, 16
        jz      .chunk_processed

        or      [eax+TTextChunk.color], ciExtended

        stdcall AddArrayItems, edi, 1
        mov     edi, edx
        mov     [eax+TTextChunk.bytes], cx         ; in the second chunk the .bytes field is important.

.chunk_processed:
        mov     ecx, ebx        ; start new chunk.
        pop     edx eax
        retn

; Returns ZF=1 (je) if the char is in the symbols list.
;         ZF=0 (jne) otherwise.
.CharInSymbols:
        push    edi ecx

        mov     edi, .symbol_characters
        mov     ecx, .symbol_characters_len

        repne scasb
        pop     ecx edi
        ret

.symbol_characters db 20h,'/*=<>()[]{}:,|&~#`;\',09h,0Ah,0Dh,1Ah
.symbol_characters_len = $ - .symbol_characters

endp





endmodule

Added freshlib/gui/sysevents.asm.















































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Defines constants and structures for system events of FreshLib
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________
module "System events library"


mbLeft          = 1
mbMiddle        = 2
mbRight         = 3

mbScrollUp      = 4
mbScrollDn      = 5
mbScrollLeft    = 6
mbScrollRight   = 7


maskBtnLeft   = $0100
maskBtnMiddle = $0200
maskBtnRight  = $0400

maskShift     = $1
maskCapsLock  = $2
maskCtrl      = $4
maskAlt       = $8
maskNumLock   = $10
maskScrLk     = $20
maskLevel3    = $80     ; Mod5

; These are scan codes for the non character keys. They are OS dependent and should be used by
; their names.
include '%TargetOS%/keycodes.inc'


scTrack         = 1
scUp            = 2
scDown          = 3
scWheelUp       = 4
scWheelDn       = 5

scrollX = 0
scrollY = 1

cerFromUser = 0         ; user pressed X button on the window header, pressed alt+F4 from the keyboard, or choose "Close" from the title menu.
cerFromProgram = 1      ; Method Close was executed from the program.



; creates and returns a string with the textual identifier of the pressed/released key.

proc CreateKeyName, .keycode, .kbdStatus
begin
        push    ebx

        stdcall StrNew
        mov     ebx, eax

        test    [.kbdStatus], maskCtrl
        jz      @f
        stdcall StrCat, ebx, txt 'Ctrl+'
@@:
        test    [.kbdStatus], maskAlt
        jz      @f
        stdcall StrCat, ebx, txt 'Alt+'
@@:
        test    [.kbdStatus], maskShift
        jz      @f
        stdcall StrCat, ebx, txt 'Shift+'
@@:
        stdcall KbdCodeToName, [.keycode]
        jc      .finish

        stdcall StrCat, ebx, eax
        stdcall StrDel, eax
        mov     eax, ebx
        clc

.finish:
        pop     ebx
        return
endp


macro keynames lbl, [scancode, name] {
common
  label lbl word
forward
  local ..pname
        dw scancode
        dw ..pname - $ + 2
common
        dw 0
forward
  ..pname db name, 0
}


iglobal
  if used __FunctionalKeyNames
  keynames  __FunctionalKeyNames,                        \
            keyEscape,         'Esc',                    \
            keyEnter,          'Enter',                  \
            keyHomeNumpad,     'HomeNum',                   \
            keyUpNumpad,       'UpNum',                  \
            keyPgUpNumpad,     'PgUpNum',                   \
            keyLeftNumpad,     'Left',                   \
            key5Numpad,        'Num5',                   \
            keyRightNumpad,    'RightNum',                  \
            keyEndNumpad,      'EndNum',                    \
            keyDownNumpad,     'DownNum',                   \
            keyPgDnNumpad,     'PgDnNum',                   \
            keyInsNumpad,      'InsNum',                    \
            keyDelNumpad,      'DelNum',                    \
            keyEnterNumpad,    'EnterNum',                  \
            keyNumLock,        'NumLock',                \
            keyScrollLock,     'ScrLock',                \
            keyPause,          'Pause',                  \
            keyLeft,           'Left',                   \
            keyRight,          'Right',                  \
            keyUp,             'Up',                     \
            keyDown,           'Down',                   \
            keyInsert,         'Ins',                    \
            keyDelete,         'Del',                    \
            keyHome,           'Home',                   \
            keyEnd,            'End',                    \
            keyPgUp,           'PgUp',                   \
            keyPgDown,         'PgDn',                   \
            keyF1,             'F1',                     \
            keyF2,             'F2',                     \
            keyF3,             'F3',                     \
            keyF4,             'F4',                     \
            keyF5,             'F5',                     \
            keyF6,             'F6',                     \
            keyF7,             'F7',                     \
            keyF8,             'F8',                     \
            keyF9,             'F9',                     \
            keyF10,            'F10',                    \
            keyF11,            'F11',                    \
            keyF12,            'F12',                    \
            keyCapsLock,       'CapsLock',               \
            keyShiftLeft,      'ShiftL',                 \
            keyCtrlLeft,       'LeftCtrl',               \
            keyAltLeft,        'LeftAlt',                \
            keyAltRight,       'RightAlt',               \
            keyPopupMenu,      'PopupMenu',              \
            keyShiftRight,     'RightShift',             \
            keyCtrlRight,      'RightCtrl',              \
            keyBackSpace,      'BkSp',                   \
            keyTab,            'Tab',                    \
            keySpace,          'Space',                  \
            '1',               '1',                      \
            '2',               '2',                      \
            '3',               '3',                      \
            '4',               '4',                      \
            '5',               '5',                      \
            '6',               '6',                      \
            '7',               '7',                      \
            '8',               '8',                      \
            '9',               '9',                      \
            '0',               '0',                      \
            keyA,              'A',                      \
            keyB,              'B',                      \
            keyC,              'C',                      \
            keyD,              'D',                      \
            keyE,              'E',                      \
            keyF,              'F',                      \
            keyG,              'G',                      \
            keyH,              'H',                      \
            keyI,              'I',                      \
            keyJ,              'J',                      \
            keyK,              'K',                      \
            keyL,              'L',                      \
            keyM,              'M',                      \
            keyN,              'N',                      \
            keyO,              'O',                      \
            keyP,              'P',                      \
            keyQ,              'Q',                      \
            keyR,              'R',                      \
            keyS,              'S',                      \
            keyT,              'T',                      \
            keyU,              'U',                      \
            keyV,              'V',                      \
            keyW,              'W',                      \
            keyX,              'X',                      \
            keyY,              'Y',                      \
            keyZ,              'Z'
  end if
endg

endmodule





proc KbdCodeToName, .keycode
begin
        pushad
        mov     esi, __FunctionalKeyNames

.loop:
        movzx   ecx, word [esi]
        jecxz   .notfound

        cmp     ecx, [.keycode]
        je      .found
        add     esi, 4
        jmp     .loop

.found:
        movsx   eax, word [esi+2]
        add     esi, eax
        stdcall StrDupMem, esi
        mov     [esp+4*regEAX], eax
        clc
        popad
        return

.notfound:
        stc
        popad
        return
endp




proc KbdNameToCode, .hKeyname
begin
        pushad
        mov     esi, __FunctionalKeyNames

.loop:
        movzx   ecx, word [esi]
        jecxz   .notfound

        movsx   eax, word [esi+2]
        lea     eax, [esi+eax]

        add     esi, 4
        stdcall StrCompNoCase, eax, [.hKeyname]
        jnc     .loop

.found:
        mov     [esp+4*regEAX], ecx
        clc
        popad
        return

.notfound:
        stc
        popad
        return
endp

Added freshlib/gui/textcaret.asm.



























































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Text caret control library.
;
;  Target OS: Any
;
;  Dependencies: timers.asm; graphics libraries.
;
;  Notes: Text caret have always only one instance.
;_________________________________________________________________________________________
module "Text caret library"

CARET_MUTEX_WAIT = 2000 ; ms

; the caret is shared resource and can exists only in one instance
struct TCaret
  .pWindow    dd ?

  .pTopWindow dd ?
  .xOffs      dd ?      ; the offset between the caret owner window and its top level parent window
  .yOffs      dd ?      ;

  .state      dd ?       ; 1 if the caret is displayed 0 if not.
  .visible    dd ?
  .next_time  dd ?

  .Pos       TBounds
  .mxLock    TMutex
ends



uglobal
  if used CaretAttach
    Caret TCaret
  end if
endg


if used CaretAttach
initialize InitTextCaret
begin
        stdcall MutexCreate, 0, Caret.mxLock
        stdcall MutexRelease, Caret.mxLock
        return
endp

finalize FinalizeTextCaret
begin
        stdcall MutexDestroy, Caret.mxLock
        return
endp


end if




proc __CaretUpdateTopLevel, .pWindow
begin
        pushad

        stdcall WaitForMutex, Caret.mxLock, CARET_MUTEX_WAIT
        jc      .exit

        mov     esi, [.pWindow]
        cmp     esi, [Caret.pWindow]
        jne     .finish

        xor     ecx, ecx
        xor     edx, edx

        test    esi, esi
        jz      .found

.loop:
        get     ebx, esi, TWindow:Parent
        test    ebx, ebx
        jz      .found

        add     ecx, [esi+TWindow._x]
        add     edx, [esi+TWindow._y]
        mov     esi, ebx
        jmp     .loop

.found:
        mov     [Caret.xOffs], ecx
        mov     [Caret.yOffs], edx
        mov     [Caret.pTopWindow], esi

.finish:
        stdcall MutexRelease, Caret.mxLock
        clc

.exit:
        popad
        return
endp




; Attaches the caret to the window, if the window needs caret.
proc CaretAttach, .pWindow
begin
        push    ecx

        mov     eax,[.pWindow]
        cmp     eax, [Caret.pWindow]
        je      .exit

        stdcall WaitForMutex, Caret.mxLock, CARET_MUTEX_WAIT
        jc      .exit

        stdcall __ClearCaret

        mov     eax, [.pWindow]
        xchg    [Caret.pWindow], eax
        push    eax

        xor     eax, eax
        mov     [Caret.Pos.x], eax
        mov     [Caret.Pos.y], eax
        mov     [Caret.Pos.height], eax
        mov     [Caret.Pos.width], eax

        stdcall __CaretUpdateTopLevel, [Caret.pWindow]

        stdcall MutexRelease, Caret.mxLock
        pop     eax                             ; the old window.
        clc

.exit:
        pop     ecx
        return
endp




proc CaretChange, .window, .x, .y, .width, .height, .visible
begin
        pushad

        mov     eax, [Caret.pWindow]
        cmp     eax, [.window]
        jne     .exit

        stdcall WaitForMutex, Caret.mxLock, CARET_MUTEX_WAIT
        jc      .exit

        stdcall __ClearCaret

        mov     ecx, [.x]
        mov     edx, [.y]

        mov     [Caret.Pos.x], ecx
        mov     [Caret.Pos.y], edx

        xor     eax, eax
        mov     ecx, [.width]
        mov     edx, [.height]

        inc     eax

        test    ecx, ecx
        cmovz   ecx, eax

        test    edx, edx
        cmovz   edx, eax

        mov     [Caret.Pos.width], ecx
        mov     [Caret.Pos.height], edx

        mov     eax, [.visible]
        mov     [Caret.visible], eax

; restart the visible state from the beginning in order to make the moved
; caret move visible.

        mov     [Caret.state], 1
        stdcall GetTimestamp
        add     eax, [GUI.caretTimes+4]
        mov     [Caret.next_time], eax

        cmp     [Caret.pWindow], 0
        je      .release

        exec    [Caret.pWindow], TWindow:RectChangedXY2, [Caret.Pos.x], [Caret.Pos.y], [Caret.Pos.width], [Caret.Pos.height]

.release:
        stdcall MutexRelease, Caret.mxLock
        clc

.exit:
        popad
        return
endp




proc __CaretTimerProc
begin
        pushad

        stdcall WaitForMutex, Caret.mxLock, CARET_MUTEX_WAIT
        jc      .exit

        stdcall GetTimestamp
        mov     ebx, eax

        cmp     ebx, [Caret.next_time]
        jb      .release

        cmp     [Caret.pWindow], 0
        je      .release

        xor     [Caret.state], 1
        stdcall __ClearCaret

        mov     eax, [Caret.state]
        and     eax, 1
        add     ebx, [GUI.caretTimes+4*eax]
        mov     [Caret.next_time], ebx

.release:
        stdcall MutexRelease, Caret.mxLock

.exit:
        popad
        return
endp


; Clears the caret at its present place.

proc __ClearCaret
begin
        stdcall WaitForMutex, Caret.mxLock, CARET_MUTEX_WAIT
        jc      .exit

        cmp     [Caret.pWindow], 0
        je      .finish

        exec    [Caret.pWindow], TWindow:RectChangedXY2, [Caret.Pos.x], [Caret.Pos.y], [Caret.Pos.width], [Caret.Pos.height]

.finish:
        stdcall MutexRelease, Caret.mxLock
.exit:
        return
endp


proc __PaintCaret, .topWindow, .screen
begin
        stdcall WaitForMutex, Caret.mxLock, CARET_MUTEX_WAIT
        jc      .exit

        push    ebx

        mov     ebx, [.topWindow]
        cmp     ebx, [Caret.pTopWindow]
        jne     .release

        mov     ebx, [.screen]
        test    ebx, ebx
        jz      .release

        cmp     [Caret.state], 0
        je      .release

        cmp     [Caret.visible], 0
        je      .release

        push    ecx edx
        mov     ecx, [Caret.Pos.x]
        mov     edx, [Caret.Pos.y]
        add     ecx, [Caret.xOffs]
        add     edx, [Caret.yOffs]
;        stdcall XorRect, ebx, ecx, edx, [Caret.Pos.width], [Caret.Pos.height], [GUI.clTextCaret]

        stdcall BlendSolidRect, ebx, ecx, edx, [Caret.Pos.width], [Caret.Pos.height], [GUI.clTextCaret]  ; ????????? does not look good this way...
        pop     edx ecx

.release:
        stdcall MutexRelease, Caret.mxLock
        pop     ebx

.exit:
        return
endp


endmodule


Added freshlib/gui/themes.asm.































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: This file contains procedures and data, that form the appearance of the
;               FreshLib GUI application. Colors, control borders, backgrownd drawing etc.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: The user should be able to change these settings and if he uses external
;         procedures, then the code from this library should not be compiled.
;_________________________________________________________________________________________

module "Runtime GUI themes support"

match =ThemeGUI, ThemeGUI {
  ThemeGUI equ flat_gui
}

; Box border type
bxNone   = 0
bxRaised = 1
bxSunken = 2
bxFlat   = 3
bxFocused = 4
bxNoFill = $80000000
bxDisabled = $40000000


iglobal
; drawing functions.

  var DrawBox = DrawBoxDefault
  var DrawSlider = DrawSliderDefault

  var DrawSplitter = DrawSplitterDefault
endg



proc DrawBoxDefault, .pImage, .pBounds, .bkground, .border, .brd_width
.bounds TBounds
begin
        pushad

        lea     esi, [.bounds]
        stdcall RectCopy, esi, [.pBounds]

        mov     edx, [.border]
        and     edx, $ff
        jz      .borderok

        mov     eax, [GUI.clBorderLight]
        mov     ecx, [GUI.clBorderDark]

        test    [.border], bxDisabled
        jz      .enabled_ok

        mov     eax, [GUI.clBorderLightGray]
        mov     ecx, [GUI.clBorderDarkGray]

.enabled_ok:
        cmp     edx, bxRaised
        je      .colorok

        xchg    eax, ecx

        cmp     edx, bxSunken
        je      .colorok

        mov     eax, [GUI.clBorderNeutralGray]

        test    [.border], bxDisabled
        jnz     .flat_ok

        mov     eax, [GUI.clBorderNeutral]

.flat_ok:
        mov     ecx, eax
        cmp     edx, bxFlat
        je      .colorok

        mov     eax, [GUI.clBorderFocused]
        mov     ecx, eax

.colorok:
        mov     ebx, [.brd_width]

; left border line
        stdcall DrawSolidRect, [.pImage], [esi+TBounds.x],[esi+TBounds.y], ebx, [esi+TBounds.height], eax

; top
        add     [esi+TBounds.x], ebx
        sub     [esi+TBounds.width], ebx

        stdcall DrawSolidRect, [.pImage], [esi+TBounds.x], [esi+TBounds.y], [esi+TBounds.width], ebx, eax

; right
        sub     [esi+TBounds.width], ebx
        add     [esi+TBounds.y], ebx
        sub     [esi+TBounds.height], ebx

        mov     edx, [esi+TBounds.width]
        add     edx, [esi+TBounds.x]
        stdcall DrawSolidRect, [.pImage], edx, [esi+TBounds.y], ebx, [esi+TBounds.height], ecx

; bottom
        sub     [esi+TBounds.height], ebx

        mov     edx, [esi+TBounds.y]
        add     edx, [esi+TBounds.height]
        stdcall DrawSolidRect, [.pImage], [esi+TBounds.x], edx, [esi+TBounds.width], ebx, ecx

.borderok:
        bt      [.border], 31
        jc      .fillok

        stdcall DrawSolidRect, [.pImage], [esi+TBounds.x], [esi+TBounds.y], [esi+TBounds.width], [esi+TBounds.height], [.bkground]

.fillok:

        popad
        return
endp



sliderHorizontal = 0
sliderVertical   = 1

proc DrawSliderDefault, .pImage, .pBounds, .bkground, .type
begin
        stdcall DrawBoxDefault, [.pImage], [.pBounds], [.bkground], [scrollBorder], 2
        return
endp





proc DrawSplitterDefault, .pImage, .pRect, .type, .pClipRect
.rect RECT
begin
        pushad

        lea     eax, [.rect]
        stdcall RectIntersect, eax, [.pRect], [.pClipRect]
        jc      .finish

        mov     eax, [.rect.right]
        mov     edx, [.rect.bottom]
        sub     eax, [.rect.left]
        sub     edx, [.rect.top]

        stdcall DrawSolidRect, [.pImage], [.rect.left], [.rect.top], eax, edx, [GUI.clSplitter]

.finish:
;        mov     esi, [.pRect]
;        mov     eax, [esi+RECT.right]
;        mov     ecx, [esi+RECT.bottom]
;        sub     eax, [esi+RECT.left]
;        sub     ecx, [esi+RECT.top]
;
;        stdcall DrawSolidRect, [.pImage], [esi+RECT.left], [esi+RECT.top], eax, ecx, [GUI.clSplitter]
        popad
        return
endp


proc DrawSplitterDefault2, .pImage, .pRect, .type, .pClipRect
.bounds TBounds
begin
        pushad

        mov     esi, [.pRect]
        mov     eax, [esi+RECT.left]
        mov     ecx, [esi+RECT.top]
        mov     edx, [esi+RECT.right]
        mov     ebx, [esi+RECT.bottom]
        sub     edx, eax
        sub     ebx, ecx
        mov     [.bounds.x], eax
        mov     [.bounds.y], ecx
        mov     [.bounds.width], edx
        mov     [.bounds.height], ebx
        lea     eax, [.bounds]

        stdcall DrawBoxDefault, [.pImage], eax, [GUI.clDialogBk], bxSunken, [GUI.boxBorderWidth]

        popad
        return
endp






endmodule





Added freshlib/gui/themes/asmedit.asm.































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: This file contains procedures and data, that form the appearance of the
;               TAsmEdit components.
;
;  Target OS: Any
;
;  Dependencies:
;_________________________________________________________________________________________

;ciText         = 0
;ciComment      = 1
;ciString       = 2
;ciNumber       = 3
;ciSymbol       = 4
;ciRegister     = 5
;ciInstruction  = 6
;ciDerective    = 7
;ciPreprocessor = 8
;ciMacro        = 9

iglobal
        NamedArray      ASM,                                            \
\
\ ; Widgets border colors and width
                clBackground,     HEX, <$ffffffff, $fff8f8f8, $ffff0000, $ff00a0ff>, \
                clText,           HEX, <$ff000000, $ff8E908C, $ff718C00, $ffDE935F, $ff4080a0, $fff5871f, $ffc82829, $ff4271ae, $ff895Fa8, $ff000000, $ff000000, $ff000000, $ff000000, $ff000000, $ff000000, $ff000000, $ff000000>, \
                clProtectedText,  HEX, $ffa0a000,                       \
                clSelection,      HEX, $602980b9,                       \
\
                clLeftMargin,     HEX, $ff404040,                       \
                clLeftMarginEdge, HEX, $ffffffff,                       \
                clLeftMarginText, HEX, $ffffffff,                       \
                clLeftMarginTree, HEX, $ffff0000,                       \
                xspcLMPadding,    NUM, 4,                               \
\
                clBookmarkBack,   HEX, $ffffd000,                       \
\
                clWrapColumn,     HEX, $800000ff,                       \
\
                MouseWheel,       NUM, 3,                               \
\
                iconBreakpoints,  PNG, <'%lib%/gui/themes/images/asmedit/breakpoint_inactive_light.png', '%lib%/gui/themes/images/asmedit/breakpoint_light.png'>,       \
                iconDebugInfo,    PNG, '%lib%/gui/themes/images/asmedit/debug_icon.png',                                                                                \
                iconFoldings,     PNG, <'%lib%/gui/themes/images/asmedit/unfold.png', '%lib%/gui/themes/images/asmedit/fold.png'>,                                      \
                iconBookmark,     PNG, '%lib%/gui/themes/images/asmedit/bookmark_light.png',                                                                            \
\
                xSpcIcons,        NUM, 3,                                                                                                                               \
\
                Options,          HEX, aeoDefault,                                                                                                                      \
\
\ ; Default mono font
\
                Font,             FONT, "Liberation Mono": 13 : fwBold : ffMonospaced,      \ ;
                NumFont,          FONT, "Liberation Mono": 12 : fwLight : 0

        DispSize "ASM theme data", $ - ASM

endg

Added freshlib/gui/themes/flat_gui.asm.

























































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: This file contains procedures and data, that form the appearance of the
;               FreshLib GUI application. Colors, control borders, backgrownd drawing etc.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: The user should be able to change these settings and if he uses external
;         procedures, then the code from this library should not be compiled.
;_________________________________________________________________________________________
module "GUI theme data and code library"

; Named theme colors

; cyan
clTurquoise = $ff1abc9c
clTurquoiseL = $ff31e2bf
clTurquoiseD = $ff138670

clGreenSea  = $ff16A085

; green
clEmerald   = $ff2ecc71
clNephritis = $ff27ae60

; blue

clPetermann = $ff3498db
clBelizeHole = $ff2980b9

; purple

clAmethyst = $ff9b59b6
clWisteria = $ff8e44ad

; black
clBlack      = $ff000000
clWetAsphalt = $ff34495e
clMidnight = $ff2c3e50

; gray

clConcrete = $ff95a5a6
clAsbestos = $ff7f8c8d

; light gray / white

clClouds = $ffecf0f1
clSilver = $ffbdc3c7
clWhite  = $ffffffff

; Yellow / orange

clSunflower = $fff1c40f
clOrange = $fff39c12

; Brown / orange

clCarrot = $ffe67e22
clPumpkin = $ffd35400

; Red

clAlizarin =    $ffe74c3c
clPomegranate = $ffc0392b

clBelizeClouds = $ffc9dce7 ; a blend between clBelizeHole and clClouds

iglobal

        NamedArray      GUI,                                           \
\
\ ; Text caret color
                clTextCaret,       HEX, clAlizarin,                     \       ;(clAlizarin and $00ffffff) or $e0000000,                    \
                caretTimes,        NUM, <250, 250>,                    \
\ ; Widgets border colors and width
                clBorderNeutral,   HEX, clTurquoise,                   \
                clBorderLight,     HEX, clTurquoiseL,                      \
                clBorderDark,      HEX, clTurquoiseD,                  \
                clBorderNeutralGray, HEX, $ff606060,                   \
                clBorderLightGray, HEX, $ff808080,                     \
                clBorderDarkGray,  HEX, $ff404040,                     \
                clBorderFocused,   HEX, clAlizarin,                    \
\
                boxBorderWidth,  NUM, 2,                               \
\
\ ; TButton colors and styles. The multivalue fields are for Neutral, Hovered and Pressed states.
\
               clBtnBk,         HEX, <clTurquoise, $ff48c9b0, clGreenSea, $ff7b7b7b>,   \
               clBtnTxt,        HEX, <clWhite, clWhite, clSilver, $d0ffffff>,           \
               btnBorder,       NUM, <bxNone, bxNone, bxNone, bxNone or bxDisabled>,    \
               btnPressedOfsX,  NUM, 0,                                      \
               btnPressedOfsY,  NUM, 2,                                      \
               btnMarginX,      NUM, 4,                                      \
               btnMarginY,      NUM, 4,                                      \
\
\ ; Toolbar buttons colors and styles
               clToolBtnBk,     HEX, <clClouds, clBelizeClouds, clBelizeClouds, clClouds>,   \
               clToolBtnTxt,    HEX, <$ff000000, $ff000000, $ff000000, $80000000>,           \
               tbBorder,        NUM, <bxNone, bxNone, bxNone, bxNone or bxDisabled>,         \
               tbBorderWidth,   NUM, 1,                                      \
               tbPressedOfsX,   NUM, 0,                                      \
               tbPressedOfsY,   NUM, 2,                                      \
               tbSeparatorType,  HEX, bxFlat or bxDisabled,                  \
               tbSeparatorWidth, NUM, 10,                                     \
\
\ ; TEdit colors and styles.
\
               clEditBk,          HEX, clWhite,                                 \
               clEditBkFocused,   HEX, clWhite,                                 \
               clEditTxt,         HEX, $ff000000,                               \
               clEditSel,         HEX, clBelizeHole and $00ffffff or $60000000, \
               clEditSelTxt,      HEX, $ffffffff,                               \
               editBorder,        NUM, bxFlat,                                  \
               editBorderFocused, NUM, bxFlat,                                  \
\
\ ; Dialog boxes and TForm color and styles
\
               clDialogBk,        HEX, clClouds,                             \
               clDialogTxt,       HEX, $ff000000,                            \
               clSplitter,        HEX, $ff3A7BBB,          \ ;clWetAsphalt,                          \
\
\ ; TProgress colors and styles
\
              clProgressBk,       HEX, clClouds,                             \
              clProgressBar,      HEX, clAmethyst,                          \
              progressBorder,     NUM, bxFlat,                               \
\
\ ; TScrollbar colors and styles
\
              clScrollBk,         HEX, <clSilver and $3fffffff, clSilver and $a0ffffff>,     \
              clScrollSlider,     HEX, <clAsbestos and $7fffffff, clTurquoise>,              \
              clScrollSliderOvf,  HEX, <clOrange and $3fffffff, clOrange>,                \
              borderScroll,       NUM, bxNone,                                               \
              scrollWidth,        NUM, 12,                                                   \
              minSliderHeight,    NUM, 24,                                                   \
\
\ ; TLabel colors and styles
\
              clLabelBk,          HEX, clClouds,                                             \
              clLabelTxt,         HEX, $ff000000,                                            \
\
\ ; TTreeView colors and styles.
\
              clTreeViewBack,     HEX, $ffffffff,                                            \
              clTreeViewText,     HEX, clBlack,                                              \
              clTreeSelected,     HEX, clBelizeClouds,                                       \
              clTreeSelectedTxt,  HEX, clBlack,                                              \
              clTreeFocused,      HEX, clBelizeHole,                                         \
              clTreeFocusedTxt,   HEX, clWhite,                                              \
              clTreeFocused2,     HEX, clWetAsphalt,                                         \
              clTreeFocused2Txt,  HEX, clWhite,                                              \
              clTreeViewLines,    HEX, clSilver,                                             \
\
              tvBorder,           NUM, bxFlat,                                               \
\
              tvIcons,            PNG, <"%lib%/gui/images/treeview/plus_flat.png", "%lib%/gui/images/treeview/minus_flat.png">,     \
\
\ ; TMenu colors and styles
\
              clMenuBack,         HEX, clClouds,                                             \
              clMenuText,         HEX, $ff000000,                                            \
              clMenuTextGray,     HEX, $90000000,                                            \
              clMenuSelection,    HEX, clBelizeHole,                                         \
              clMenuSelIcon,      HEX, clBelizeClouds,                                       \
              borderMenu,         NUM, bxFlat,                                               \
              menuIconMargin,     NUM, 4,                                                    \
              menuSeparatorHeight,NUM, 12,                                                   \
              menuMinTextDist,    NUM, 32,                                                   \
              menuSubIcon,        PNG, "%lib%/gui/images/menu/submenu.png",                  \
              menuSubIconSel,     PNG, "%lib%/gui/images/menu/submenusel.png",               \
              menuSubIconGray,    PNG, "%lib%/gui/images/menu/submenugray.png",              \
\
\ ; Menu graphics
\
              iconMenuChecked,    PNG, "%lib%/gui/images/menu/check_flat.png",               \
              iconMenuCheckedGray, PNG, "%lib%/gui/images/menu/check_flat_gray.png",         \
\
\ ; Checkbox colors
\
              clCheckboxBack,     HEX, <$ffffffff, $ffffffff, $ffc0c0c0, $80c0c0c0>,         \
              clCheckboxTxt,      HEX, $ff000000,                                            \
              clCheckboxTxtGray,  HEX, $ff606060,                                            \
              cbIconSize,         NUM, 13,                                                   \
              cbMargin,           NUM, 2,                                                    \
              borderCheckbox,     NUM, bxFlat,                                               \
              iconChecked,        PNG, "%lib%/gui/images/checkbox/check_flat.png",           \
              iconCheckedGray,    PNG, "%lib%/gui/images/checkbox/check_flat_gray.png",      \
\
\ ; TabBar control
\
              maxTabWidth,        NUM, 180,                                                  \
              tabMarginX,         NUM, 4,                                                    \
              tabMarginY,         NUM, 4,                                                    \
              clTabBk,            HEX, <clClouds, clBelizeClouds, clBelizeClouds>,           \
              clTabTxt,           HEX, $ff000000,                                            \
\
\ ; Grid control
              clGridCellBk,       HEX, <$ffffffff, clClouds, clBelizeClouds, clBelizeHole, clWetAsphalt>,   \ ; <regular, fixed, selected, focused, focused2> background color.
              clGridCellTxt,      HEX, <$ff000000, $ff000000, $ff000000, $ffffffff, $ffffffff>,         \ ; <regular, fixed, selected, focused, focused2> foreground color.
              clGridLines,        HEX, <$00000000, $ffc0c0c0, $00000000, clTurquoise>,       \ ;top-left data, bottom-right data, top-left fixed, bottom-right fixed.
\
\ ; ListView control
              lvIconMargin,       NUM, 2,                                                    \
\
\ ; Dialogs images
\
              iconDialogs,        PNG, <"%lib%/gui/themes/images/msgbox/error.png", "%lib%/gui/themes/images/msgbox/information.png", "%lib%/gui/themes/images/msgbox/question.png", "%lib%/gui/themes/images/msgbox/warning.png">, \
              iconDirectory,      PNG, <"%lib%/gui/themes/images/files/dir_light.png", "%lib%/gui/themes/images/files/dir_link_light.png">,                                                                                         \
              iconFile,           PNG, <"%lib%/gui/themes/images/files/file_light.png", "%lib%/gui/themes/images/files/file_link_light.png">,                                                                                       \
              bgChessboard,       PNG, "%lib%/gui/themes/images/chessboard.png",                                                                                                                                              \
\
\ ; Default font
\
              DefaultFont,        FONT, "Inter": 12 : fwMedium : 0,                  \
              HintFont,           FONT, "Liberation Sans": 12 : fwNormal : 0,                    \
              DefaultMono,        FONT, "Liberation Mono": 11 : fwNormal : ffMonospaced,         \
\
\ ; Mouse settings
\
              DoubleClickTime,     NUM,  600,                                                    \
              DoubleClickDistance, NUM,  8

endg






endmodule

Added freshlib/gui/themes/images/asmedit/bookmark_dark.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/asmedit/bookmark_light.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/asmedit/breakpoint_dark.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/asmedit/breakpoint_inactive_dark.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/asmedit/breakpoint_inactive_light.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/asmedit/breakpoint_light.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/asmedit/debug_icon.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/asmedit/fold.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/asmedit/render.





























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
#!/bin/bash

# Not skinned images.

cd src/

# The dark skin

ln -s -f ./skin_dark.css ./skin.css

rsvg-convert -o ../bookmark_dark.png bookmark.svg
rsvg-convert -o ../breakpoint_dark.png breakpoint.svg
rsvg-convert -o ../breakpoint_inactive_dark.png breakpoint_inactive.svg

# The light skin

ln -s -f ./skin_light.css ./skin.css

rsvg-convert -o ../bookmark_light.png bookmark.svg
rsvg-convert -o ../breakpoint_light.png breakpoint.svg
rsvg-convert -o ../breakpoint_inactive_light.png breakpoint_inactive.svg

rm ./skin.css
cd ..

for i in *.png; do
     optipng -o6 -strip all -- "$i"
#    pngquant -v -s 1 --strip -f --ext .png -- "$i"
    printf "\n"
done

Added freshlib/gui/themes/images/asmedit/src/bookmark.svg.









>
>
>
>
1
2
3
4
<?xml-stylesheet href="./skin.css" type="text/css"?>
<svg version="1.1" viewBox="0 0 14 8" xmlns="http://www.w3.org/2000/svg">
  <path id="bookmark_toggle" class="primary" d="m0 8v-8h13.5l-4 4 4 4z"/>
</svg>

Added freshlib/gui/themes/images/asmedit/src/breakpoint.svg.









>
>
>
>
1
2
3
4
<?xml-stylesheet href="./skin.css" type="text/css"?>
<svg version="1.1" viewBox="0 0 6 6" xmlns="http://www.w3.org/2000/svg">
  <rect class="important" width="6" height="6"/>
</svg>

Added freshlib/gui/themes/images/asmedit/src/breakpoint_inactive.svg.









>
>
>
>
1
2
3
4
<?xml-stylesheet href="./skin.css" type="text/css"?>
<svg version="1.1" viewBox="0 0 6 6" xmlns="http://www.w3.org/2000/svg">
  <rect class="gray" width="6" height="6"/>
</svg>

Added freshlib/gui/themes/images/asmedit/src/skin_dark.css.





























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
.fresh {
  background-color:#303030;
  stroke: none;
}

/* The main outline/fill color of the skin.*/

.primary {
  fill: #ffcc00;
}

.back {
  fill: #000000;
}


/* The color that need to stay "grayed" (less emphasize) */

.gray {
  fill: #a0a0a0;
}

/* The color that need to stay some kind of emphasized. */

.emphasize {
  fill: #00ccff;
}

/* Very important color */

.important {
  fill: #ff0084;
}


/* Colors with meaning */

.error {
  fill: #ff1800;
}

.warning {
  fill: #e3ff00;
}

.info {
  fill: #00ccff;
}

.always_light {
  fill: #ffffff;
}

/* Categories icons */

.cat1 {
  fill: #00ffff;
}

.cat2 {
  fill: #cc80ff;
}

.cat3 {
  fill: #00FF00;
}

.cat4 {
  fill: #FFC0C0;
}

.cat5 {
  fill: #FF9000;
}

.cat6 {
  fill: #ffffff;
}

Added freshlib/gui/themes/images/asmedit/src/skin_light.css.































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
.fresh {
  background-color:#d4d0c8;
  stroke: none;
}


/* The main outline/fill color of the light skin.*/

.primary {
  fill: #3A7BBB;
}

.back {
  fill: #ffffff;
}

/* The color that need to stay "grayed" (less emphasize) */

.gray {
  fill: #606060;
}

/* The color that need to stay some kind of emphasized. */

.emphasize {
  fill: #5730FF;
}

/* Very important color */

.important {
  fill: #ff005d;
}

/* Colors with meaning */

.error {
  fill: #ff0000;
}

.warning {
  fill: #009000;
}

.info {
  fill: #0000ff;
}

.always_light {
  fill: #ffffff;
}



/* Categories icons */

.cat1 {
  fill: #388FA1;
}

.cat2 {
  fill: #8d2ea1;
}

.cat3 {
  fill: #39a139;
}

.cat4 {
  fill: #FF4C26;
}

.cat5 {
  fill: #FFA233;
}

.cat6 {
  fill: #212121;
}

Added freshlib/gui/themes/images/asmedit/unfold.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/chessboard.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/files/dir_dark.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/files/dir_light.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/files/dir_link_dark.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/files/dir_link_light.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/files/file_dark.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/files/file_light.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/files/file_link_dark.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/files/file_link_light.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/files/render.



































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
#!/bin/bash

# Not skinned images.

cd src/

# The dark skin

ln -s -f ./skin_dark.css ./skin.css 

rsvg-convert -h 16 -o ../dir_dark.png dir.svg
rsvg-convert -h 16 -o ../file_dark.png file.svg
rsvg-convert -h 16 -o ../dir_link_dark.png dir_link.svg
rsvg-convert -h 16 -o ../file_link_dark.png file_link.svg

# The light skin

ln -s -f ./skin_light.css ./skin.css

rsvg-convert -h 16 -o ../dir_light.png dir.svg
rsvg-convert -h 16 -o ../file_light.png file.svg
rsvg-convert -h 16 -o ../dir_link_light.png dir_link.svg
rsvg-convert -h 16 -o ../file_link_light.png file_link.svg

rm ./skin.css
cd ..

for i in *.png; do
    pngquant -v --ordered -s 1 --strip -f --ext .png 64 -- "$i" 
    printf "\n"
done

identify -format "%k colors in %f\n" ./*.png

Added freshlib/gui/themes/images/files/src/dir.svg.

































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet href="./skin.css" type="text/css"?><svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="16"
   height="16"
   viewBox="0 0 16 16"
   class="fresh"
   style="fill:#c0c0c0;stroke:none"
   version="1.1"
   id="svg6"
   sodipodi:docname="directory.svg"
   inkscape:version="0.92.4 5da689c313, 2019-01-14"
   inkscape:export-filename="/work/asmwork/FreshFs/trunk/source/images/svg/feather/ready/messages.svg.png"
   inkscape:export-xdpi="96"
   inkscape:export-ydpi="96">
  <metadata
     id="metadata12">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs10" />
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#00b764"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="1"
     inkscape:pageshadow="2"
     inkscape:window-width="2560"
     inkscape:window-height="1418"
     id="namedview8"
     showgrid="true"
     inkscape:current-layer="svg6"
     inkscape:showpageshadow="false"
     showborder="true"
     showguides="true"
     inkscape:lockguides="true"
     inkscape:snap-others="false"
     inkscape:object-nodes="false"
     inkscape:snap-nodes="true"
     inkscape:snap-global="true"
     inkscape:snap-to-guides="true"
     inkscape:snap-bbox="true"
     inkscape:bbox-paths="true"
     inkscape:snap-grids="true"
     inkscape:snap-page="true"
     inkscape:snap-object-midpoints="true"
     inkscape:snap-text-baseline="true"
     inkscape:bbox-nodes="true"
     inkscape:snap-bbox-edge-midpoints="true"
     inkscape:snap-bbox-midpoints="true"
     inkscape:object-paths="false"
     inkscape:snap-intersection-paths="false"
     inkscape:snap-smooth-nodes="false"
     inkscape:snap-midpoints="false"
     inkscape:snap-center="true"
     inkscape:guide-bbox="true"
     inkscape:zoom="51.208333"
     inkscape:cx="7.2965927"
     inkscape:cy="8.199566"
     inkscape:window-x="1366"
     inkscape:window-y="0"
     inkscape:window-maximized="1"
     fit-margin-top="2"
     fit-margin-left="1"
     fit-margin-right="1"
     fit-margin-bottom="2">
    <inkscape:grid
       type="xygrid"
       id="grid142"
       spacingx="1"
       spacingy="1"
       dotted="false"
       empspacing="16"
       snapvisiblegridlinesonly="false"
       color="#3f3fff"
       opacity="0.25098039"
       empcolor="#3f3fff"
       empopacity="0.75294118"
       originx="-128"
       originy="0" />
  </sodipodi:namedview>
  <path
     id="path166"
     d="M 1,2 H 8 V 4 H 1 Z m 0,3 h 14 v 9 H 1 Z"
     inkscape:connector-curvature="0"
     class="cat5"
     sodipodi:nodetypes="cccccccccc"
     style="stroke-width:1px" />
  <path
     class="back"
     d="M 1,4 H 8 V 5 H 1 Z"
     id="path168"
     inkscape:connector-curvature="0"
     sodipodi:nodetypes="ccccc" />
</svg>

Added freshlib/gui/themes/images/files/src/dir_link.svg.

















































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet href="./skin.css" type="text/css"?><svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="16"
   height="16"
   viewBox="0 0 16 16"
   class="fresh"
   style="fill:#c0c0c0;stroke:none"
   version="1.1"
   id="svg6"
   sodipodi:docname="dir_link.svg"
   inkscape:version="0.92.4 5da689c313, 2019-01-14"
   inkscape:export-filename="/work/asmwork/FreshFs/trunk/source/images/svg/feather/ready/messages.svg.png"
   inkscape:export-xdpi="96"
   inkscape:export-ydpi="96">
  <metadata
     id="metadata12">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title />
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs10" />
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#00b764"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="1"
     inkscape:pageshadow="2"
     inkscape:window-width="1366"
     inkscape:window-height="746"
     id="namedview8"
     showgrid="true"
     inkscape:current-layer="svg6"
     inkscape:showpageshadow="false"
     showborder="true"
     showguides="true"
     inkscape:lockguides="true"
     inkscape:snap-others="false"
     inkscape:object-nodes="false"
     inkscape:snap-nodes="true"
     inkscape:snap-global="true"
     inkscape:snap-to-guides="true"
     inkscape:snap-bbox="true"
     inkscape:bbox-paths="true"
     inkscape:snap-grids="true"
     inkscape:snap-page="true"
     inkscape:snap-object-midpoints="true"
     inkscape:snap-text-baseline="true"
     inkscape:bbox-nodes="true"
     inkscape:snap-bbox-edge-midpoints="true"
     inkscape:snap-bbox-midpoints="true"
     inkscape:object-paths="false"
     inkscape:snap-intersection-paths="false"
     inkscape:snap-smooth-nodes="false"
     inkscape:snap-midpoints="false"
     inkscape:snap-center="true"
     inkscape:guide-bbox="true"
     inkscape:zoom="18.10488"
     inkscape:cx="0.49269966"
     inkscape:cy="7.2331573"
     inkscape:window-x="0"
     inkscape:window-y="0"
     inkscape:window-maximized="1"
     fit-margin-top="2"
     fit-margin-left="1"
     fit-margin-right="1"
     fit-margin-bottom="2">
    <inkscape:grid
       type="xygrid"
       id="grid142"
       spacingx="1"
       spacingy="1"
       dotted="false"
       empspacing="16"
       snapvisiblegridlinesonly="false"
       color="#3f3fff"
       opacity="0.25098039"
       empcolor="#3f3fff"
       empopacity="0.75294118"
       originx="-128"
       originy="0" />
  </sodipodi:namedview>
  <path
     id="path166"
     d="M 1,2 H 8 V 4 H 1 Z m 0,3 h 14 v 9 H 1 Z"
     inkscape:connector-curvature="0"
     class="cat5"
     sodipodi:nodetypes="cccccccccc"
     style="stroke-width:1px" />
  <path
     class="back"
     d="M 1,4 H 8 V 5 H 1 Z"
     id="path168"
     inkscape:connector-curvature="0"
     sodipodi:nodetypes="ccccc" />
  <rect
     id="rect11"
     width="6"
     height="1"
     x="6"
     y="9"
     class="back"
     style="stroke-width:0.81649661" />
  <rect
     y="14.349242"
     x="-2.3786798"
     height="1"
     width="4"
     id="rect22"
     transform="rotate(-45)"
     class="back" />
  <rect
     id="rect24"
     width="4"
     height="1"
     x="11.056349"
     y="-1.9142135"
     transform="rotate(45)"
     class="back" />
</svg>

Added freshlib/gui/themes/images/files/src/file.svg.

























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet href="./skin.css" type="text/css"?><svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="16"
   height="16"
   viewBox="0 0 16 16"
   class="fresh"
   style="fill:#c0c0c0;stroke:none"
   version="1.1"
   id="svg6"
   sodipodi:docname="file.svg"
   inkscape:version="0.92.4 5da689c313, 2019-01-14"
   inkscape:export-filename="/work/asmwork/FreshFs/trunk/source/images/svg/feather/ready/messages.svg.png"
   inkscape:export-xdpi="96"
   inkscape:export-ydpi="96">
  <metadata
     id="metadata12">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs10" />
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#00b764"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="1"
     inkscape:pageshadow="2"
     inkscape:window-width="2560"
     inkscape:window-height="1418"
     id="namedview8"
     showgrid="true"
     inkscape:current-layer="svg6"
     inkscape:showpageshadow="false"
     showborder="true"
     showguides="true"
     inkscape:lockguides="true"
     inkscape:snap-others="false"
     inkscape:object-nodes="false"
     inkscape:snap-nodes="true"
     inkscape:snap-global="true"
     inkscape:snap-to-guides="true"
     inkscape:snap-bbox="true"
     inkscape:bbox-paths="true"
     inkscape:snap-grids="true"
     inkscape:snap-page="true"
     inkscape:snap-object-midpoints="true"
     inkscape:snap-text-baseline="true"
     inkscape:bbox-nodes="true"
     inkscape:snap-bbox-edge-midpoints="true"
     inkscape:snap-bbox-midpoints="true"
     inkscape:object-paths="false"
     inkscape:snap-intersection-paths="false"
     inkscape:snap-smooth-nodes="false"
     inkscape:snap-midpoints="false"
     inkscape:snap-center="true"
     inkscape:guide-bbox="true"
     inkscape:zoom="3.925"
     inkscape:cx="-12.181479"
     inkscape:cy="-0.0067102485"
     inkscape:window-x="1366"
     inkscape:window-y="0"
     inkscape:window-maximized="1">
    <inkscape:grid
       type="xygrid"
       id="grid142"
       spacingx="1"
       spacingy="1"
       dotted="false"
       empspacing="16"
       snapvisiblegridlinesonly="false"
       color="#3f3fff"
       opacity="0.25098039"
       empcolor="#3f3fff"
       empopacity="0.75294118" />
  </sodipodi:namedview>
  <g
     id="new">
    <path
       sodipodi:nodetypes="ccccccccccc"
       inkscape:connector-curvature="0"
       d="m 9,1 4,4 H 9 Z M 3,1 V 15 H 13 V 6 H 8 V 1 Z"
       id="new1"
       class="primary" />
    <path
       class="back"
       inkscape:connector-curvature="0"
       id="new2"
       d="m 8,1 v 5 h 5 V 5 H 9 V 1 Z"
       sodipodi:nodetypes="ccccccc" />
  </g>
</svg>

Added freshlib/gui/themes/images/files/src/file_link.svg.







































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet href="./skin.css" type="text/css"?><svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="16"
   height="16"
   viewBox="0 0 16 16"
   class="fresh"
   style="fill:#c0c0c0;stroke:none"
   version="1.1"
   id="svg6"
   sodipodi:docname="file_link.svg"
   inkscape:version="0.92.4 5da689c313, 2019-01-14"
   inkscape:export-filename="/work/asmwork/FreshFs/trunk/source/images/svg/feather/ready/messages.svg.png"
   inkscape:export-xdpi="96"
   inkscape:export-ydpi="96">
  <metadata
     id="metadata12">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title />
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs10" />
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#00b764"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="1"
     inkscape:pageshadow="2"
     inkscape:window-width="1366"
     inkscape:window-height="746"
     id="namedview8"
     showgrid="true"
     inkscape:current-layer="svg6"
     inkscape:showpageshadow="false"
     showborder="true"
     showguides="true"
     inkscape:lockguides="true"
     inkscape:snap-others="false"
     inkscape:object-nodes="false"
     inkscape:snap-nodes="true"
     inkscape:snap-global="true"
     inkscape:snap-to-guides="true"
     inkscape:snap-bbox="true"
     inkscape:bbox-paths="true"
     inkscape:snap-grids="true"
     inkscape:snap-page="true"
     inkscape:snap-object-midpoints="true"
     inkscape:snap-text-baseline="true"
     inkscape:bbox-nodes="true"
     inkscape:snap-bbox-edge-midpoints="true"
     inkscape:snap-bbox-midpoints="true"
     inkscape:object-paths="false"
     inkscape:snap-intersection-paths="false"
     inkscape:snap-smooth-nodes="false"
     inkscape:snap-midpoints="false"
     inkscape:snap-center="true"
     inkscape:guide-bbox="true"
     inkscape:zoom="31.4"
     inkscape:cx="1.6850614"
     inkscape:cy="7.4953033"
     inkscape:window-x="0"
     inkscape:window-y="0"
     inkscape:window-maximized="1">
    <inkscape:grid
       type="xygrid"
       id="grid142"
       spacingx="1"
       spacingy="1"
       dotted="false"
       empspacing="16"
       snapvisiblegridlinesonly="false"
       color="#3f3fff"
       opacity="0.25098039"
       empcolor="#3f3fff"
       empopacity="0.75294118" />
  </sodipodi:namedview>
  <g
     id="new">
    <path
       sodipodi:nodetypes="ccccccccccc"
       inkscape:connector-curvature="0"
       d="m 9,1 4,4 H 9 Z M 3,1 V 15 H 13 V 6 H 8 V 1 Z"
       id="new1"
       class="primary" />
    <path
       class="back"
       inkscape:connector-curvature="0"
       id="new2"
       d="m 8,1 v 5 h 5 V 5 H 9 V 1 Z"
       sodipodi:nodetypes="ccccccc" />
  </g>
  <rect
     id="rect11"
     width="6"
     height="1"
     x="5"
     y="10"
     class="back" />
  <rect
     y="14.349241"
     x="-3.7928934"
     height="1"
     width="4"
     id="rect22"
     transform="rotate(-45)"
     class="back" />
  <rect
     id="rect24"
     width="4"
     height="1"
     x="11.056348"
     y="-0.5"
     transform="rotate(45)"
     class="back" />
</svg>

Added freshlib/gui/themes/images/files/src/set-dark.





>
>
1
2
#!/bin/bash
ln -s -f ./skin_dark.css ./skin.css

Added freshlib/gui/themes/images/files/src/set-light.





>
>
1
2
#!/bin/bash
ln -s -f ./skin_light.css ./skin.css

Added freshlib/gui/themes/images/files/src/skin_dark.css.





























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
.fresh {
  background-color:#303030;
  stroke: none;
}

/* The main outline/fill color of the skin.*/

.primary {
  fill: #ffcc00;
}

.back {
  fill: #000000;
}


/* The color that need to stay "grayed" (less emphasize) */

.gray {
  fill: #a0a0a0;
}

/* The color that need to stay some kind of emphasized. */

.emphasize {
  fill: #00ccff;
}

/* Very important color */

.important {
  fill: #ff0084;
}


/* Colors with meaning */

.error {
  fill: #ff1800;
}

.warning {
  fill: #e3ff00;
}

.info {
  fill: #00ccff;
}

.always_light {
  fill: #ffffff;
}

/* Categories icons */

.cat1 {
  fill: #00ffff;
}

.cat2 {
  fill: #cc80ff;
}

.cat3 {
  fill: #00FF00;
}

.cat4 {
  fill: #FFC0C0;
}

.cat5 {
  fill: #FF9000;
}

.cat6 {
  fill: #ffffff;
}

Added freshlib/gui/themes/images/files/src/skin_light.css.































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
.fresh {
  background-color:#d4d0c8;
  stroke: none;
}


/* The main outline/fill color of the light skin.*/

.primary {
  fill: #3A7BBB;
}

.back {
  fill: #ffffff;
}

/* The color that need to stay "grayed" (less emphasize) */

.gray {
  fill: #606060;
}

/* The color that need to stay some kind of emphasized. */

.emphasize {
  fill: #5730FF;
}

/* Very important color */

.important {
  fill: #ff005d;
}

/* Colors with meaning */

.error {
  fill: #ff0000;
}

.warning {
  fill: #009000;
}

.info {
  fill: #0000ff;
}

.always_light {
  fill: #ffffff;
}



/* Categories icons */

.cat1 {
  fill: #388FA1;
}

.cat2 {
  fill: #8d2ea1;
}

.cat3 {
  fill: #39a139;
}

.cat4 {
  fill: #FF4C26;
}

.cat5 {
  fill: #FFA233;
}

.cat6 {
  fill: #212121;
}

Added freshlib/gui/themes/images/msgbox/error.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/msgbox/information.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/msgbox/question.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/msgbox/warning.png.

cannot compute difference between binary files

Added freshlib/gui/themes/images/src/chessboard.svg.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
<?xml-stylesheet href="./skin.css" type="text/css"?>
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" >
  <rect x="0" y="0" width="8" height="8" fill="#606060"/>
  <rect x="8" y="8" width="8" height="8" fill="#606060"/>
  <rect x="8" y="0" width="8" height="8" fill="#b0b0b0"/>
  <rect x="0" y="8" width="8" height="8" fill="#b0b0b0"/>
</svg>

Added freshlib/gui/themes/win_gui.asm.









































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
172
173
174
175
176
177
178
179
180
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: This file contains procedures and data, that form the appearance of the
;               FreshLib GUI application. Colors, control borders, backgrownd drawing etc.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: The user should be able to change these settings and if he uses external
;         procedures, then the code from this library should not be compiled.
;_________________________________________________________________________________________
module "GUI theme data and code library"


; Theme colors and other parameters as margins, offsets, fonts, etc.
iglobal


        NamedArray      GUI,                                    \
\
\ ; Text caret color
                clTextCaret,       HEX, $ffff0000,              \        ;$0000ffff,                   \
                caretTimes,        NUM, <250, 250>,                  \
\ ; Widgets border colors and width
                clBorderNeutral, HEX, $ffa0a0a0,                     \
                clBorderLight,   HEX, $ffffffff,                     \
                clBorderDark,    HEX, $ff404040,                     \
                clBorderNeutralGray, HEX, $ff909090,                   \
                clBorderLightGray, HEX, $ffe0e0e0,                     \
                clBorderDarkGray,  HEX, $ff808080,                     \
                clBorderFocused, HEX, $ffff8000,                     \
\
                boxBorderWidth,  NUM, 1,                             \
\
\ ; TButton colors and styles. The multivalue fields are for Neutral, Hovered and Pressed states.
\
               clBtnBk,         HEX, <$ffd4d0c8, $ffe0e0e0, $ffa0a0a0, $80d4d0c8>,      \
               clBtnTxt,        HEX, <$ff000000, $ff000000, $ff000000, $ff606060>,           \
               btnBorder,       NUM, <bxRaised, bxRaised, bxSunken, bxRaised or bxDisabled>,               \
               btnPressedOfsX,  NUM, 1,                                      \
               btnPressedOfsY,  NUM, 1,                                      \
               btnMarginX,      NUM, 4,                                      \
               btnMarginY,      NUM, 4,                                      \
\
\ ; Toolbar buttons colors and styles
               clToolBtnBk,     HEX, <$ffd4d0c8, $ffe0e0e0, $ffa0a0a0, $80d4d0c8>,              \
               clToolBtnTxt,    HEX, <$ff000000, $ff000000, $ff000000, $ff606060>,              \
               tbBorder,        NUM, <bxNone, bxRaised, bxSunken, bxNone or bxDisabled>,        \
               tbBorderWidth,   NUM, 1,                                      \
               tbPressedOfsX,   NUM, 1,                                      \
               tbPressedOfsY,   NUM, 1,                                      \
               tbSeparatorType,  HEX, bxSunken,                              \
               tbSeparatorWidth, NUM, 10,                                    \
\
\ ; TEdit colors and styles.
\
               clEditBk,          HEX, $ffffffff,                            \
               clEditBkFocused,   HEX, $ffffffff,                            \
               clEditTxt,         HEX, $ff000000,                            \
               clEditSel,         HEX, $600a246c,                            \
               clEditSelTxt,      HEX, $ffffffff,                            \
               editBorder,        NUM, bxSunken,                             \
               editBorderFocused, NUM, bxSunken,                             \
\
\ ; Dialog boxes and TForm color and styles
\
               clDialogBk,        HEX, $ffd4d0c8,                            \
               clDialogTxt,       HEX, $ff000000,                            \
               clSplitter,        HEX, $ff606060,                            \
\
\ ; TProgress colors and styles
\
              clProgressBk,       HEX, $ffd4d0c8,                            \
              clProgressBar,      HEX, $ff0a246c,                            \
              progressBorder,     NUM, bxSunken,                             \
\
\ ; TScrollbar colors and styles
\
              clScrollBk,         HEX, <$c0808080, $ff808080>,                               \
              clScrollSlider,     HEX, <$c0e0e0e0, $ffe0e0e0>,                               \
              clScrollSliderOvf,  HEX, <$c0ff8080, $ffff8080>,                               \
              borderScroll,       NUM, bxRaised,                                             \
              scrollWidth,        NUM, 12,                                                   \
              minSliderHeight,    NUM, 24,                                                   \
\
\ ; TLabel colors and styles
\
              clLabelBk,          HEX, $00ffffff,                                            \
              clLabelTxt,         HEX, $ff000000,                                            \
\
\ ; TTreeView colors and styles.
\
              clTreeViewBack,     HEX, $ffffffff,                                            \
              clTreeViewText,     HEX, $ff000000,                                            \
              clTreeSelected,     HEX, $ff0a246c,                                            \
              clTreeSelectedTxt,  HEX, $ffffffff,                                            \
              clTreeFocused,      HEX, $ff0a246c,                                            \
              clTreeFocusedTxt,   HEX, $ffffff00,                                            \
              clTreeFocused2,     HEX, $ff808080,                                            \
              clTreeFocused2Txt,  HEX, $ffffffff,                                            \
              clTreeViewLines,    HEX, $ffd0d0d0,                                            \
\
              tvBorder,           NUM, bxSunken,                                             \
\
              tvIcons,            PNG, <"%lib%/gui/images/treeview/plus_win.png", "%lib%/gui/images/treeview/minus_win.png">,     \
\
\ ; TMenu colors and styles
\
              clMenuBack,         HEX, $ffd4d0c8,                                            \
              clMenuText,         HEX, $ff000000,                                            \
              clMenuTextGray,     HEX, $80000000,                                            \
              clMenuSelection,    HEX, $ff000080,                                            \
              clMenuSelIcon,      HEX, $ffadaabb,                                            \
              borderMenu,         NUM, bxRaised,                                             \
              menuIconMargin,     NUM, 4,                                                    \
              menuSeparatorHeight,NUM, 10,                                                   \
              menuMinTextDist,    NUM, 32,                                                   \
              menuSubIcon,        PNG, "%lib%/gui/images/menu/submenu.png",                  \
              menuSubIconSel,     PNG, "%lib%/gui/images/menu/submenusel.png",               \
              menuSubIconGray,    PNG, "%lib%/gui/images/menu/submenugray.png",              \
\
\ ; Menu graphics
\
              iconMenuChecked,    PNG, "%lib%/gui/images/menu/check.png",                    \
              iconMenuCheckedGray,PNG, "%lib%/gui/images/menu/check_gray.png",               \
\
\ ; Checkbox colors
\
              clCheckboxBack,     HEX, <$ffffffff, $ffffffff, $ffffffff, $ffc0c0c0>,         \
              clCheckboxTxt,      HEX, $ff000000,                                            \
              clCheckboxTxtGray,  HEX, $ff808080,                                            \
              cbIconSize,         NUM, 13,                                                   \
              cbMargin,           NUM, 2,                                                    \
              borderCheckbox,     NUM, bxSunken,                                             \
              iconChecked,        PNG, "%lib%/gui/images/checkbox/check.png",                \
              iconCheckedGray,    PNG, "%lib%/gui/images/checkbox/check_gray.png",           \
\
\ ; TabBar control
\
              maxTabWidth,        NUM, 180,                                                  \
              tabMarginX,         NUM, 4,                                                    \
              tabMarginY,         NUM, 4,                                                    \
              clTabBk,            HEX, <$ffd4d0c8, $ffe0e0e0, $ffe0e0e0>,                    \
              clTabTxt,           HEX, $ff000000,                                            \
\
\ ; Grid control
              clGridCellBk,       HEX, <$ffffffff, $ffd4d0c8, $ff82C8FC, $ff0a246c, $ff808080>,         \  ; <regular, fixed, selected, focused> background color.
              clGridCellTxt,      HEX, <$ff000000, $ff000000, $ff000000, $ffffffff, $ffffffff>,         \  ; <regular, fixed, selected, focused> text color.
              clGridLines,        HEX, <$00000000, $ffd4d0c8, $ffffffff, $ff000000>,         \  ;top-left data, bottom-right data, top-left fixed, bottom-right fixed.
\
\ ; ListView control
              lvIconMargin,       NUM, 3,                                                    \
\
\ ; Dialogs images
\
              iconDialogs,        PNG, <"%lib%/gui/themes/images/msgbox/error.png", "%lib%/gui/themes/images/msgbox/information.png", "%lib%/gui/themes/images/msgbox/question.png", "%lib%/gui/themes/images/msgbox/warning.png">, \
              iconDirectory,      PNG, <"%lib%/gui/themes/images/files/dir_light.png", "%lib%/gui/themes/images/files/dir_link_light.png">,                                                                                         \
              iconFile,           PNG, <"%lib%/gui/themes/images/files/file_light.png", "%lib%/gui/themes/images/files/file_link_light.png">,                                                                                       \
              bgChessboard,       PNG, "%lib%/gui/themes/images/chessboard.png",                                                                                                                                              \
\
\ ; Default font
\
              DefaultFont,        FONT, "Tahoma":11:fwNormal:0,                        \
              HintFont,           FONT, "Tahoma": 12 : fwNormal : 0,                    \
              DefaultMono,        FONT, "Courier New": 11 : fwNormal : ffMonospaced,         \
\
\ ; Mouse settings
\
              DoubleClickTime,     NUM,  600,                                                    \
              DoubleClickDistance, NUM,  8

endg



endmodule

Deleted freshlib/imports/Linux/_libX11.inc.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
        XActivateScreenSaver                    ,\
        XAddConnectionWatch                     ,\
        XAddExtension                           ,\
        XAddHost                                ,\
        XAddHosts                               ,\
        XAddPixel                               ,\
        XAddToExtensionList                     ,\
        XAddToSaveSet                           ,\
        XAllPlanes                              ,\
        XAllocClassHint                         ,\
        XAllocColor                             ,\
        XAllocColorCells                        ,\
        XAllocColorPlanes                       ,\
        XAllocIconSize                          ,\
        XAllocNamedColor                        ,\
        XAllocSizeHints                         ,\
        XAllocStandardColormap                  ,\
        XAllocWMHints                           ,\
        XAllowEvents                            ,\
        XAutoRepeatOff                          ,\
        XAutoRepeatOn                           ,\
        XBaseFontNameListOfFontSet              ,\
        XBell                                   ,\
        XBitmapBitOrder                         ,\
        XBitmapPad                              ,\
        XBitmapUnit                             ,\
        XBlackPixel                             ,\
        XBlackPixelOfScreen                     ,\
        XCellsOfScreen                          ,\
        XChangeActivePointerGrab                ,\
        XChangeGC                               ,\
        XChangeKeyboardControl                  ,\
        XChangeKeyboardMapping                  ,\
        XChangePointerControl                   ,\
        XChangeProperty                         ,\
        XChangeSaveSet                          ,\
        XChangeWindowAttributes                 ,\
        XCheckIfEvent                           ,\
        XCheckMaskEvent                         ,\
        XCheckTypedEvent                        ,\
        XCheckTypedWindowEvent                  ,\
        XCheckWindowEvent                       ,\
        XCirculateSubwindows                    ,\
        XCirculateSubwindowsDown                ,\
        XCirculateSubwindowsUp                  ,\
        XClearArea                              ,\
        XClearWindow                            ,\
        XClipBox                                ,\
        XCloseDisplay                           ,\
        XCloseIM                                ,\
        XCloseOM                                ,\
        XConfigureWindow                        ,\
        XConnectionNumber                       ,\
        XContextDependentDrawing                ,\
        XContextualDrawing                      ,\
        XConvertCase                            ,\
        XConvertSelection                       ,\
        XCopyArea                               ,\
        XCopyColormapAndFree                    ,\
        XCopyGC                                 ,\
        XCopyPlane                              ,\
        XCreateBitmapFromData                   ,\
        XCreateColormap                         ,\
        XCreateFontCursor                       ,\
        XCreateFontSet                          ,\
        XCreateGC                               ,\
        XCreateGlyphCursor                      ,\
        XCreateIC                               ,\
        XCreateImage                            ,\
        XCreateOC                               ,\
        XCreatePixmap                           ,\
        XCreatePixmapCursor                     ,\
        XCreatePixmapFromBitmapData             ,\
        XCreateRegion                           ,\
        XCreateSimpleWindow                     ,\
        XCreateWindow                           ,\
        XDefaultColormap                        ,\
        XDefaultColormapOfScreen                ,\
        XDefaultDepth                           ,\
        XDefaultDepthOfScreen                   ,\
        XDefaultGC                              ,\
        XDefaultGCOfScreen                      ,\
        XDefaultRootWindow                      ,\
        XDefaultScreen                          ,\
        XDefaultScreenOfDisplay                 ,\
        XDefaultString                          ,\
        XDefaultVisual                          ,\
        XDefaultVisualOfScreen                  ,\
        XDefineCursor                           ,\
        XDeleteContext                          ,\
        XDeleteModifiermapEntry                 ,\
        XDeleteProperty                         ,\
        XDestroyIC                              ,\
        XDestroyImage                           ,\
        XDestroyOC                              ,\
        XDestroyRegion                          ,\
        XDestroySubwindows                      ,\
        XDestroyWindow                          ,\
        XDirectionalDependentDrawing            ,\
        XDisableAccessControl                   ,\
        XDisplayCells                           ,\
        XDisplayHeight                          ,\
        XDisplayHeightMM                        ,\
        XDisplayKeycodes                        ,\
        XDisplayMotionBufferSize                ,\
        XDisplayName                            ,\
        XDisplayOfIM                            ,\
        XDisplayOfOM                            ,\
        XDisplayOfScreen                        ,\
        XDisplayPlanes                          ,\
        XDisplayString                          ,\
        XDisplayWidth                           ,\
        XDisplayWidthMM                         ,\
        XDoesBackingStore                       ,\
        XDoesSaveUnders                         ,\
        XDrawArc                                ,\
        XDrawArcs                               ,\
        XDrawImageString                        ,\
        XDrawImageString16                      ,\
        XDrawLine                               ,\
        XDrawLines                              ,\
        XDrawPoint                              ,\
        XDrawPoints                             ,\
        XDrawRectangle                          ,\
        XDrawRectangles                         ,\
        XDrawSegments                           ,\
        XDrawString                             ,\
        XDrawString16                           ,\
        XDrawText                               ,\
        XDrawText16                             ,\
        XEHeadOfExtensionList                   ,\
        XESetBeforeFlush                        ,\
        XESetCloseDisplay                       ,\
        XESetCopyGC                             ,\
        XESetCreateFont                         ,\
        XESetCreateGC                           ,\
        XESetError                              ,\
        XESetErrorString                        ,\
        XESetEventToWire                        ,\
        XESetFlushGC                            ,\
        XESetFreeFont                           ,\
        XESetFreeGC                             ,\
        XESetPrintErrorValues                   ,\
        XESetWireToError                        ,\
        XESetWireToEvent                        ,\
        XEmptyRegion                            ,\
        XEnableAccessControl                    ,\
        XEqualRegion                            ,\
        XEventMaskOfScreen                      ,\
        XEventsQueued                           ,\
        XExtendedMaxRequestSize                 ,\
        XExtentsOfFontSet                       ,\
        XFetchBuffer                            ,\
        XFetchBytes                             ,\
        XFetchName                              ,\
        XFillArc                                ,\
        XFillArcs                               ,\
        XFillPolygon                            ,\
        XFillRectangle                          ,\
        XFillRectangles                         ,\
        XFilterEvent                            ,\
        XFindContext                            ,\
        XFindOnExtensionList                    ,\
        XFlush                                  ,\
        XFlushGC                                ,\
        XFontsOfFontSet                         ,\
        XForceScreenSaver                       ,\
        XFree                                   ,\
        XFreeColormap                           ,\
        XFreeColors                             ,\
        XFreeCursor                             ,\
        XFreeExtensionList                      ,\
        XFreeFont                               ,\
        XFreeFontInfo                           ,\
        XFreeFontNames                          ,\
        XFreeFontPath                           ,\
        XFreeFontSet                            ,\
        XFreeGC                                 ,\
        XFreeModifiermap                        ,\
        XFreePixmap                             ,\
        XFreeStringList                         ,\
        XGContextFromGC                         ,\
        XGeometry                               ,\
        XGetAtomName                            ,\
        XGetAtomNames                           ,\
        XGetClassHint                           ,\
        XGetCommand                             ,\
        XGetDefault                             ,\
        XGetErrorDatabaseText                   ,\
        XGetErrorText                           ,\
        XGetFontPath                            ,\
        XGetFontProperty                        ,\
        XGetGCValues                            ,\
        XGetGeometry                            ,\
        XGetICValues                            ,\
        XGetIMValues                            ,\
        XGetIconName                            ,\
        XGetIconSizes                           ,\
        XGetImage                               ,\
        XGetInputFocus                          ,\
        XGetKeyboardControl                     ,\
        XGetKeyboardMapping                     ,\
        XGetModifierMapping                     ,\
        XGetMotionEvents                        ,\
        XGetNormalHints                         ,\
        XGetOCValues                            ,\
        XGetOMValues                            ,\
        XGetPixel                               ,\
        XGetPointerControl                      ,\
        XGetPointerMapping                      ,\
        XGetRGBColormaps                        ,\
        XGetScreenSaver                         ,\
        XGetSelectionOwner                      ,\
        XGetSizeHints                           ,\
        XGetStandardColormap                    ,\
        XGetSubImage                            ,\
        XGetTextProperty                        ,\
        XGetTransientForHint                    ,\
        XGetVisualInfo                          ,\
        XGetWMClientMachine                     ,\
        XGetWMColormapWindows                   ,\
        XGetWMHints                             ,\
        XGetWMIconName                          ,\
        XGetWMName                              ,\
        XGetWMNormalHints                       ,\
        XGetWMProtocols                         ,\
        XGetWMSizeHints                         ,\
        XGetWindowAttributes                    ,\
        XGetWindowProperty                      ,\
        XGetZoomHints                           ,\
        XGrabButton                             ,\
        XGrabKey                                ,\
        XGrabKeyboard                           ,\
        XGrabPointer                            ,\
        XGrabServer                             ,\
        XHeightMMOfScreen                       ,\
        XHeightOfScreen                         ,\
        XIMOfIC                                 ,\
        XIconifyWindow                          ,\
        XIfEvent                                ,\
        XImageByteOrder                         ,\
        XInitExtension                          ,\
        XInitImage                              ,\
        XInitThreads                            ,\
        XInsertModifiermapEntry                 ,\
        XInstallColormap                        ,\
        XInternAtom                             ,\
        XInternAtoms                            ,\
        XInternalConnectionNumbers              ,\
        XIntersectRegion                        ,\
        XKeycodeToKeysym                        ,\
        XKeysymToKeycode                        ,\
        XKeysymToString                         ,\
        XKillClient                             ,\
        XLastKnownRequestProcessed              ,\
        XListDepths                             ,\
        XListExtensions                         ,\
        XListFonts                              ,\
        XListFontsWithInfo                      ,\
        XListHosts                              ,\
        XListInstalledColormaps                 ,\
        XListPixmapFormats                      ,\
        XListProperties                         ,\
        XLoadFont                               ,\
        XLoadQueryFont                          ,\
        XLocaleOfFontSet                        ,\
        XLocaleOfIM                             ,\
        XLocaleOfOM                             ,\
        XLockDisplay                            ,\
        XLookupColor                            ,\
        XLookupKeysym                           ,\
        XLookupString                           ,\
        XLowerWindow                            ,\
        XMapRaised                              ,\
        XMapSubwindows                          ,\
        XMapWindow                              ,\
        XMaskEvent                              ,\
        XMatchVisualInfo                        ,\
        XMaxCmapsOfScreen                       ,\
        XMaxRequestSize                         ,\
        XMinCmapsOfScreen                       ,\
        XMoveResizeWindow                       ,\
        XMoveWindow                             ,\
        XNewModifiermap                         ,\
        XNextEvent                              ,\
        XNextRequest                            ,\
        XNoOp                                   ,\
        XOMOfOC                                 ,\
        XOffsetRegion                           ,\
        XOpenDisplay                            ,\
        XOpenIM                                 ,\
        XOpenOM                                 ,\
        XParseColor                             ,\
        XParseGeometry                          ,\
        XPeekEvent                              ,\
        XPeekIfEvent                            ,\
        XPending                                ,\
        XPlanesOfScreen                         ,\
        XPointInRegion                          ,\
        XPolygonRegion                          ,\
        XProcessInternalConnection              ,\
        XProtocolRevision                       ,\
        XProtocolVersion                        ,\
        XPutBackEvent                           ,\
        XPutImage                               ,\
        XPutPixel                               ,\
        XQLength                                ,\
        XQueryBestCursor                        ,\
        XQueryBestSize                          ,\
        XQueryBestStipple                       ,\
        XQueryBestTile                          ,\
        XQueryColor                             ,\
        XQueryColors                            ,\
        XQueryExtension                         ,\
        XQueryFont                              ,\
        XQueryKeymap                            ,\
        XQueryPointer                           ,\
        XQueryTextExtents                       ,\
        XQueryTextExtents16                     ,\
        XQueryTree                              ,\
        XRaiseWindow                            ,\
        XReadBitmapFile                         ,\
        XReadBitmapFileData                     ,\
        XRebindKeysym                           ,\
        XRecolorCursor                          ,\
        XReconfigureWMWindow                    ,\
        XRectInRegion                           ,\
        XRefreshKeyboardMapping                 ,\
        XRegisterIMInstantiateCallback          ,\
        XRemoveConnectionWatch                  ,\
        XRemoveFromSaveSet                      ,\
        XRemoveHost                             ,\
        XRemoveHosts                            ,\
        XReparentWindow                         ,\
        XResetScreenSaver                       ,\
        XResizeWindow                           ,\
        XResourceManagerString                  ,\
        XRestackWindows                         ,\
        XRootWindow                             ,\
        XRootWindowOfScreen                     ,\
        XRotateBuffers                          ,\
        XRotateWindowProperties                 ,\
        XSaveContext                            ,\
        XScreenCount                            ,\
        XScreenNumberOfScreen                   ,\
        XScreenOfDisplay                        ,\
        XScreenResourceString                   ,\
        XSelectInput                            ,\
        XSendEvent                              ,\
        XServerVendor                           ,\
        XSetAccessControl                       ,\
        XSetAfterFunction                       ,\
        XSetArcMode                             ,\
        XSetAuthorization                       ,\
        XSetBackground                          ,\
        XSetClassHint                           ,\
        XSetClipMask                            ,\
        XSetClipOrigin                          ,\
        XSetClipRectangles                      ,\
        XSetCloseDownMode                       ,\
        XSetCommand                             ,\
        XSetDashes                              ,\
        XSetErrorHandler                        ,\
        XSetFillRule                            ,\
        XSetFillStyle                           ,\
        XSetFont                                ,\
        XSetFontPath                            ,\
        XSetForeground                          ,\
        XSetFunction                            ,\
        XSetGraphicsExposures                   ,\
        XSetICFocus                             ,\
        XSetICValues                            ,\
        XSetIMValues                            ,\
        XSetIOErrorHandler                      ,\
        XSetIconName                            ,\
        XSetIconSizes                           ,\
        XSetInputFocus                          ,\
        XSetLineAttributes                      ,\
        XSetLocaleModifiers                     ,\
        XSetModifierMapping                     ,\
        XSetNormalHints                         ,\
        XSetOCValues                            ,\
        XSetOMValues                            ,\
        XSetPlaneMask                           ,\
        XSetPointerMapping                      ,\
        XSetRGBColormaps                        ,\
        XSetRegion                              ,\
        XSetScreenSaver                         ,\
        XSetSelectionOwner                      ,\
        XSetSizeHints                           ,\
        XSetStandardColormap                    ,\
        XSetStandardProperties                  ,\
        XSetState                               ,\
        XSetStipple                             ,\
        XSetSubwindowMode                       ,\
        XSetTSOrigin                            ,\
        XSetTextProperty                        ,\
        XSetTile                                ,\
        XSetTransientForHint                    ,\
        XSetWMClientMachine                     ,\
        XSetWMColormapWindows                   ,\
        XSetWMHints                             ,\
        XSetWMIconName                          ,\
        XSetWMName                              ,\
        XSetWMNormalHints                       ,\
        XSetWMProperties                        ,\
        XSetWMProtocols                         ,\
        XSetWMSizeHints                         ,\
        XSetWindowBackground                    ,\
        XSetWindowBackgroundPixmap              ,\
        XSetWindowBorder                        ,\
        XSetWindowBorderPixmap                  ,\
        XSetWindowBorderWidth                   ,\
        XSetWindowColormap                      ,\
        XSetZoomHints                           ,\
        XShrinkRegion                           ,\
        XStoreBuffer                            ,\
        XStoreBytes                             ,\
        XStoreColor                             ,\
        XStoreColors                            ,\
        XStoreName                              ,\
        XStoreNamedColor                        ,\
        XStringListToTextProperty               ,\
        XStringToKeysym                         ,\
        XSubImage                               ,\
        XSubtractRegion                         ,\
        XSupportsLocale                         ,\
        XSync                                   ,\
        XSynchronize                            ,\
        XTextExtents                            ,\
        XTextExtents16                          ,\
        XTextPropertyToStringList               ,\
        XTextWidth                              ,\
        XTextWidth16                            ,\
        XTranslateCoordinates                   ,\
        XUndefineCursor                         ,\
        XUngrabButton                           ,\
        XUngrabKey                              ,\
        XUngrabKeyboard                         ,\
        XUngrabPointer                          ,\
        XUngrabServer                           ,\
        XUninstallColormap                      ,\
        XUnionRectWithRegion                    ,\
        XUnionRegion                            ,\
        XUnloadFont                             ,\
        XUnlockDisplay                          ,\
        XUnmapSubwindows                        ,\
        XUnmapWindow                            ,\
        XUnregisterIMInstantiateCallback        ,\
        XUnsetICFocus                           ,\
        XVaCreateNestedList                     ,\
        XVendorRelease                          ,\
        XVisualIDFromVisual                     ,\
        XWMGeometry                             ,\
        XWarpPointer                            ,\
        XWhitePixel                             ,\
        XWhitePixelOfScreen                     ,\
        XWidthMMOfScreen                        ,\
        XWidthOfScreen                          ,\
        XWindowEvent                            ,\
        XWithdrawWindow                         ,\
        XWriteBitmapFile                        ,\
        XXorRegion                              ,\
        XcmsAddColorSpace                       ,\
        XcmsAddFunctionSet                      ,\
        XcmsAllocColor                          ,\
        XcmsAllocNamedColor                     ,\
        XcmsCCCOfColormap                       ,\
        XcmsCIELabClipL                         ,\
        XcmsCIELabClipLab                       ,\
        XcmsCIELabClipab                        ,\
        XcmsCIELabColorSpace                    ,\
        XcmsCIELabQueryMaxC                     ,\
        XcmsCIELabQueryMaxL                     ,\
        XcmsCIELabQueryMaxLC                    ,\
        XcmsCIELabQueryMinL                     ,\
        XcmsCIELabToCIEXYZ                      ,\
        XcmsCIELabWhiteShiftColors              ,\
        XcmsCIELuvClipL                         ,\
        XcmsCIELuvClipLuv                       ,\
        XcmsCIELuvClipuv                        ,\
        XcmsCIELuvColorSpace                    ,\
        XcmsCIELuvQueryMaxC                     ,\
        XcmsCIELuvQueryMaxL                     ,\
        XcmsCIELuvQueryMaxLC                    ,\
        XcmsCIELuvQueryMinL                     ,\
        XcmsCIELuvToCIEuvY                      ,\
        XcmsCIELuvWhiteShiftColors              ,\
        XcmsCIEXYZColorSpace                    ,\
        XcmsCIEXYZToCIELab                      ,\
        XcmsCIEXYZToCIEuvY                      ,\
        XcmsCIEXYZToCIExyY                      ,\
        XcmsCIEXYZToRGBi                        ,\
        XcmsCIEuvYColorSpace                    ,\
        XcmsCIEuvYToCIELuv                      ,\
        XcmsCIEuvYToCIEXYZ                      ,\
        XcmsCIEuvYToTekHVC                      ,\
        XcmsCIExyYColorSpace                    ,\
        XcmsCIExyYToCIEXYZ                      ,\
        XcmsClientWhitePointOfCCC               ,\
        XcmsConvertColors                       ,\
        XcmsCreateCCC                           ,\
        XcmsDefaultCCC                          ,\
        XcmsDisplayOfCCC                        ,\
        XcmsFormatOfPrefix                      ,\
        XcmsFreeCCC                             ,\
        XcmsLinearRGBFunctionSet                ,\
        XcmsLookupColor                         ,\
        XcmsPrefixOfFormat                      ,\
        XcmsQueryBlack                          ,\
        XcmsQueryBlue                           ,\
        XcmsQueryColor                          ,\
        XcmsQueryColors                         ,\
        XcmsQueryGreen                          ,\
        XcmsQueryRed                            ,\
        XcmsQueryWhite                          ,\
        XcmsRGBColorSpace                       ,\
        XcmsRGBToRGBi                           ,\
        XcmsRGBiColorSpace                      ,\
        XcmsRGBiToCIEXYZ                        ,\
        XcmsRGBiToRGB                           ,\
        XcmsScreenNumberOfCCC                   ,\
        XcmsScreenWhitePointOfCCC               ,\
        XcmsSetCCCOfColormap                    ,\
        XcmsSetCompressionProc                  ,\
        XcmsSetWhiteAdjustProc                  ,\
        XcmsSetWhitePoint                       ,\
        XcmsStoreColor                          ,\
        XcmsStoreColors                         ,\
        XcmsTekHVCClipC                         ,\
        XcmsTekHVCClipV                         ,\
        XcmsTekHVCClipVC                        ,\
        XcmsTekHVCColorSpace                    ,\
        XcmsTekHVCQueryMaxC                     ,\
        XcmsTekHVCQueryMaxV                     ,\
        XcmsTekHVCQueryMaxVC                    ,\
        XcmsTekHVCQueryMaxVSamples              ,\
        XcmsTekHVCQueryMinV                     ,\
        XcmsTekHVCToCIEuvY                      ,\
        XcmsTekHVCWhiteShiftColors              ,\
        XcmsUNDEFINEDColorSpace                 ,\
        XcmsVisualOfCCC                         ,\
        XkbAddDeviceLedInfo                     ,\
        XkbAddGeomColor                         ,\
        XkbAddGeomDoodad                        ,\
        XkbAddGeomKey                           ,\
        XkbAddGeomKeyAlias                      ,\
        XkbAddGeomOutline                       ,\
        XkbAddGeomOverlay                       ,\
        XkbAddGeomOverlayKey                    ,\
        XkbAddGeomOverlayRow                    ,\
        XkbAddGeomProperty                      ,\
        XkbAddGeomRow                           ,\
        XkbAddGeomSection                       ,\
        XkbAddGeomShape                         ,\
        XkbAddKeyType                           ,\
        XkbAllocClientMap                       ,\
        XkbAllocCompatMap                       ,\
        XkbAllocControls                        ,\
        XkbAllocDeviceInfo                      ,\
        XkbAllocGeomColors                      ,\
        XkbAllocGeomDoodads                     ,\
        XkbAllocGeomKeyAliases                  ,\
        XkbAllocGeomKeys                        ,\
        XkbAllocGeomOutlines                    ,\
        XkbAllocGeomOverlayKeys                 ,\
        XkbAllocGeomOverlayRows                 ,\
        XkbAllocGeomOverlays                    ,\
        XkbAllocGeomPoints                      ,\
        XkbAllocGeomProps                       ,\
        XkbAllocGeomRows                        ,\
        XkbAllocGeomSectionDoodads              ,\
        XkbAllocGeomSections                    ,\
        XkbAllocGeomShapes                      ,\
        XkbAllocGeometry                        ,\
        XkbAllocIndicatorMaps                   ,\
        XkbAllocKeyboard                        ,\
        XkbAllocNames                           ,\
        XkbAllocServerMap                       ,\
        XkbApplyCompatMapToKey                  ,\
        XkbApplyVirtualModChanges               ,\
        XkbBell                                 ,\
        XkbBellEvent                            ,\
        XkbChangeDeviceInfo                     ,\
        XkbChangeEnabledControls                ,\
        XkbChangeKeycodeRange                   ,\
        XkbChangeMap                            ,\
        XkbChangeNames                          ,\
        XkbChangeTypesOfKey                     ,\
        XkbComputeEffectiveMap                  ,\
        XkbComputeRowBounds                     ,\
        XkbComputeSectionBounds                 ,\
        XkbComputeShapeBounds                   ,\
        XkbComputeShapeTop                      ,\
        XkbCopyKeyType                          ,\
        XkbCopyKeyTypes                         ,\
        XkbDeviceBell                           ,\
        XkbDeviceBellEvent                      ,\
        XkbFindOverlayForKey                    ,\
        XkbForceBell                            ,\
        XkbForceDeviceBell                      ,\
        XkbFreeClientMap                        ,\
        XkbFreeCompatMap                        ,\
        XkbFreeComponentList                    ,\
        XkbFreeControls                         ,\
        XkbFreeDeviceInfo                       ,\
        XkbFreeGeomColors                       ,\
        XkbFreeGeomDoodads                      ,\
        XkbFreeGeomKeyAliases                   ,\
        XkbFreeGeomKeys                         ,\
        XkbFreeGeomOutlines                     ,\
        XkbFreeGeomOverlayKeys                  ,\
        XkbFreeGeomOverlayRows                  ,\
        XkbFreeGeomOverlays                     ,\
        XkbFreeGeomPoints                       ,\
        XkbFreeGeomProperties                   ,\
        XkbFreeGeomRows                         ,\
        XkbFreeGeomSections                     ,\
        XkbFreeGeomShapes                       ,\
        XkbFreeGeometry                         ,\
        XkbFreeIndicatorMaps                    ,\
        XkbFreeKeyboard                         ,\
        XkbFreeNames                            ,\
        XkbFreeServerMap                        ,\
        XkbGetAutoRepeatRate                    ,\
        XkbGetAutoResetControls                 ,\
        XkbGetCompatMap                         ,\
        XkbGetControls                          ,\
        XkbGetDetectableAutoRepeat              ,\
        XkbGetDeviceButtonActions               ,\
        XkbGetDeviceInfo                        ,\
        XkbGetDeviceInfoChanges                 ,\
        XkbGetDeviceLedInfo                     ,\
        XkbGetGeometry                          ,\
        XkbGetIndicatorMap                      ,\
        XkbGetIndicatorState                    ,\
        XkbGetKeyActions                        ,\
        XkbGetKeyBehaviors                      ,\
        XkbGetKeyExplicitComponents             ,\
        XkbGetKeyModifierMap                    ,\
        XkbGetKeySyms                           ,\
        XkbGetKeyTypes                          ,\
        XkbGetKeyVirtualModMap                  ,\
        XkbGetKeyboard                          ,\
        XkbGetKeyboardByName                    ,\
        XkbGetMap                               ,\
        XkbGetMapChanges                        ,\
        XkbGetNamedDeviceIndicator              ,\
        XkbGetNamedGeometry                     ,\
        XkbGetNamedIndicator                    ,\
        XkbGetNames                             ,\
        XkbGetPerClientControls                 ,\
        XkbGetState                             ,\
        XkbGetUpdatedMap                        ,\
        XkbGetVirtualMods                       ,\
        XkbGetXlibControls                      ,\
        XkbIgnoreExtension                      ,\
        XkbInitCanonicalKeyTypes                ,\
        XkbKeyTypesForCoreSymbols               ,\
        XkbKeycodeToKeysym                      ,\
        XkbKeysymToModifiers                    ,\
        XkbLatchGroup                           ,\
        XkbLatchModifiers                       ,\
        XkbLibraryVersion                       ,\
        XkbListComponents                       ,\
        XkbLockGroup                            ,\
        XkbLockModifiers                        ,\
        XkbLookupKeyBinding                     ,\
        XkbLookupKeySym                         ,\
        XkbNoteControlsChanges                  ,\
        XkbNoteDeviceChanges                    ,\
        XkbNoteMapChanges                       ,\
        XkbNoteNameChanges                      ,\
        XkbOpenDisplay                          ,\
        XkbQueryExtension                       ,\
        XkbRefreshKeyboardMapping               ,\
        XkbResizeDeviceButtonActions            ,\
        XkbResizeKeyActions                     ,\
        XkbResizeKeySyms                        ,\
        XkbResizeKeyType                        ,\
        XkbSelectEventDetails                   ,\
        XkbSelectEvents                         ,\
        XkbSetAtomFuncs                         ,\
        XkbSetAutoRepeatRate                    ,\
        XkbSetAutoResetControls                 ,\
        XkbSetCompatMap                         ,\
        XkbSetControls                          ,\
        XkbSetDebuggingFlags                    ,\
        XkbSetDetectableAutoRepeat              ,\
        XkbSetDeviceButtonActions               ,\
        XkbSetDeviceInfo                        ,\
        XkbSetDeviceLedInfo                     ,\
        XkbSetGeometry                          ,\
        XkbSetIgnoreLockMods                    ,\
        XkbSetIndicatorMap                      ,\
        XkbSetMap                               ,\
        XkbSetNamedDeviceIndicator              ,\
        XkbSetNamedIndicator                    ,\
        XkbSetNames                             ,\
        XkbSetPerClientControls                 ,\
        XkbSetServerInternalMods                ,\
        XkbSetXlibControls                      ,\
        XkbToControl                            ,\
        XkbTranslateKey                         ,\
        XkbTranslateKeyCode                     ,\
        XkbTranslateKeySym                      ,\
        XkbUpdateActionVirtualMods              ,\
        XkbUpdateKeyTypeVirtualMods             ,\
        XkbUpdateMapFromCore                    ,\
        XkbUseExtension                         ,\
        XkbVirtualModsToReal                    ,\
        XkbXlibControlsImplemented              ,\
        XmbDrawImageString                      ,\
        XmbDrawString                           ,\
        XmbDrawText                             ,\
        XmbLookupString                         ,\
        XmbResetIC                              ,\
        XmbSetWMProperties                      ,\
        XmbTextEscapement                       ,\
        XmbTextExtents                          ,\
        XmbTextListToTextProperty               ,\
        XmbTextPerCharExtents                   ,\
        XmbTextPropertyToTextList               ,\
        Xpermalloc                              ,\
        XrmCombineDatabase                      ,\
        XrmCombineFileDatabase                  ,\
        XrmDestroyDatabase                      ,\
        XrmEnumerateDatabase                    ,\
        XrmGetDatabase                          ,\
        XrmGetFileDatabase                      ,\
        XrmGetResource                          ,\
        XrmGetStringDatabase                    ,\
        XrmInitialize                           ,\
        XrmLocaleOfDatabase                     ,\
        XrmMergeDatabases                       ,\
        XrmParseCommand                         ,\
        XrmPermStringToQuark                    ,\
        XrmPutFileDatabase                      ,\
        XrmPutLineResource                      ,\
        XrmPutResource                          ,\
        XrmPutStringResource                    ,\
        XrmQGetResource                         ,\
        XrmQGetSearchList                       ,\
        XrmQGetSearchResource                   ,\
        XrmQPutResource                         ,\
        XrmQPutStringResource                   ,\
        XrmQuarkToString                        ,\
        XrmSetDatabase                          ,\
        XrmStringToBindingQuarkList             ,\
        XrmStringToQuark                        ,\
        XrmStringToQuarkList                    ,\
        XrmUniqueQuark                          ,\
        Xutf8DrawImageString                    ,\
        Xutf8DrawString                         ,\
        Xutf8DrawText                           ,\
        Xutf8LookupString                       ,\
        Xutf8ResetIC                            ,\
        Xutf8SetWMProperties                    ,\
        Xutf8TextEscapement                     ,\
        Xutf8TextExtents                        ,\
        Xutf8TextListToTextProperty             ,\
        Xutf8TextPerCharExtents                 ,\
        Xutf8TextPropertyToTextList             ,\
        XwcDrawImageString                      ,\
        XwcDrawString                           ,\
        XwcDrawText                             ,\
        XwcFreeStringList                       ,\
        XwcLookupString                         ,\
        XwcResetIC                              ,\
        XwcTextEscapement                       ,\
        XwcTextExtents                          ,\
        XwcTextListToTextProperty               ,\
        XwcTextPerCharExtents                   ,\
        XwcTextPropertyToTextList
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted freshlib/imports/Linux/_libXft.inc.

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
XftCharExists
XftCharFontSpecRender
XftCharIndex
XftCharSpecRender
XftColorAllocName
XftColorAllocValue
XftColorFree
XftDefaultHasRender
XftDefaultSet
XftDefaultSubstitute
XftDrawChange
XftDrawCharFontSpec
XftDrawCharSpec
XftDrawColormap
XftDrawCreate
XftDrawCreateAlpha
XftDrawCreateBitmap
XftDrawDestroy
XftDrawDisplay
XftDrawDrawable
XftDrawGlyphFontSpec
XftDrawGlyphSpec
XftDrawGlyphs
XftDrawPicture
XftDrawRect
XftDrawSetClip
XftDrawSetClipRectangles
XftDrawSetSubwindowMode
XftDrawSrcPicture
XftDrawString16
XftDrawString32
XftDrawString8
XftDrawStringUtf16
XftDrawStringUtf8
XftDrawVisual
XftFontCheckGlyph
XftFontClose
XftFontCopy
XftFontInfoCreate
XftFontInfoDestroy
XftFontInfoEqual
XftFontInfoHash
XftFontLoadGlyphs
XftFontMatch
XftFontOpen
XftFontOpenInfo
XftFontOpenName
XftFontOpenPattern
XftFontOpenXlfd
XftFontUnloadGlyphs
XftGetVersion
XftGlyphExtents
XftGlyphFontSpecRender
XftGlyphRender
XftGlyphSpecRender
XftInit
XftInitFtLibrary
XftListFonts
XftLockFace
XftNameParse
XftNameUnparse
XftTextExtents16
XftTextExtents32
XftTextExtents8
XftTextExtentsUtf16
XftTextExtentsUtf8
XftTextRender16
XftTextRender16BE
XftTextRender16LE
XftTextRender32
XftTextRender32BE
XftTextRender32LE
XftTextRender8
XftTextRenderUtf16
XftTextRenderUtf8
XftUnlockFace
XftXlfdParse
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































Deleted freshlib/imports/Linux/allimports.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
_importdata:

interpreter '/lib/ld-linux.so.2'
needed 'libc.so.6'
needed 'libX11.so.6'
needed 'libXft.so.2'

import                                           \
\; libX11
        XActivateScreenSaver                    ,\
        XAddConnectionWatch                     ,\
        XAddExtension                           ,\
        XAddHost                                ,\
        XAddHosts                               ,\
        XAddPixel                               ,\
        XAddToExtensionList                     ,\
        XAddToSaveSet                           ,\
        XAllPlanes                              ,\
        XAllocClassHint                         ,\
        XAllocColor                             ,\
        XAllocColorCells                        ,\
        XAllocColorPlanes                       ,\
        XAllocIconSize                          ,\
        XAllocNamedColor                        ,\
        XAllocSizeHints                         ,\
        XAllocStandardColormap                  ,\
        XAllocWMHints                           ,\
        XAllowEvents                            ,\
        XAutoRepeatOff                          ,\
        XAutoRepeatOn                           ,\
        XBaseFontNameListOfFontSet              ,\
        XBell                                   ,\
        XBitmapBitOrder                         ,\
        XBitmapPad                              ,\
        XBitmapUnit                             ,\
        XBlackPixel                             ,\
        XBlackPixelOfScreen                     ,\
        XCellsOfScreen                          ,\
        XChangeActivePointerGrab                ,\
        XChangeGC                               ,\
        XChangeKeyboardControl                  ,\
        XChangeKeyboardMapping                  ,\
        XChangePointerControl                   ,\
        XChangeProperty                         ,\
        XChangeSaveSet                          ,\
        XChangeWindowAttributes                 ,\
        XCheckIfEvent                           ,\
        XCheckMaskEvent                         ,\
        XCheckTypedEvent                        ,\
        XCheckTypedWindowEvent                  ,\
        XCheckWindowEvent                       ,\
        XCirculateSubwindows                    ,\
        XCirculateSubwindowsDown                ,\
        XCirculateSubwindowsUp                  ,\
        XClearArea                              ,\
        XClearWindow                            ,\
        XClipBox                                ,\
        XCloseDisplay                           ,\
        XCloseIM                                ,\
        XCloseOM                                ,\
        XConfigureWindow                        ,\
        XConnectionNumber                       ,\
        XContextDependentDrawing                ,\
        XContextualDrawing                      ,\
        XConvertCase                            ,\
        XConvertSelection                       ,\
        XCopyArea                               ,\
        XCopyColormapAndFree                    ,\
        XCopyGC                                 ,\
        XCopyPlane                              ,\
        XCreateBitmapFromData                   ,\
        XCreateColormap                         ,\
        XCreateFontCursor                       ,\
        XCreateFontSet                          ,\
        XCreateGC                               ,\
        XCreateGlyphCursor                      ,\
        XCreateIC                               ,\
        XCreateImage                            ,\
        XCreateOC                               ,\
        XCreatePixmap                           ,\
        XCreatePixmapCursor                     ,\
        XCreatePixmapFromBitmapData             ,\
        XCreateRegion                           ,\
        XCreateSimpleWindow                     ,\
        XCreateWindow                           ,\
        XDefaultColormap                        ,\
        XDefaultColormapOfScreen                ,\
        XDefaultDepth                           ,\
        XDefaultDepthOfScreen                   ,\
        XDefaultGC                              ,\
        XDefaultGCOfScreen                      ,\
        XDefaultRootWindow                      ,\
        XDefaultScreen                          ,\
        XDefaultScreenOfDisplay                 ,\
        XDefaultString                          ,\
        XDefaultVisual                          ,\
        XDefaultVisualOfScreen                  ,\
        XDefineCursor                           ,\
        XDeleteContext                          ,\
        XDeleteModifiermapEntry                 ,\
        XDeleteProperty                         ,\
        XDestroyIC                              ,\
        XDestroyImage                           ,\
        XDestroyOC                              ,\
        XDestroyRegion                          ,\
        XDestroySubwindows                      ,\
        XDestroyWindow                          ,\
        XDirectionalDependentDrawing            ,\
        XDisableAccessControl                   ,\
        XDisplayCells                           ,\
        XDisplayHeight                          ,\
        XDisplayHeightMM                        ,\
        XDisplayKeycodes                        ,\
        XDisplayMotionBufferSize                ,\
        XDisplayName                            ,\
        XDisplayOfIM                            ,\
        XDisplayOfOM                            ,\
        XDisplayOfScreen                        ,\
        XDisplayPlanes                          ,\
        XDisplayString                          ,\
        XDisplayWidth                           ,\
        XDisplayWidthMM                         ,\
        XDoesBackingStore                       ,\
        XDoesSaveUnders                         ,\
        XDrawArc                                ,\
        XDrawArcs                               ,\
        XDrawImageString                        ,\
        XDrawImageString16                      ,\
        XDrawLine                               ,\
        XDrawLines                              ,\
        XDrawPoint                              ,\
        XDrawPoints                             ,\
        XDrawRectangle                          ,\
        XDrawRectangles                         ,\
        XDrawSegments                           ,\
        XDrawString                             ,\
        XDrawString16                           ,\
        XDrawText                               ,\
        XDrawText16                             ,\
        XEHeadOfExtensionList                   ,\
        XESetBeforeFlush                        ,\
        XESetCloseDisplay                       ,\
        XESetCopyGC                             ,\
        XESetCreateFont                         ,\
        XESetCreateGC                           ,\
        XESetError                              ,\
        XESetErrorString                        ,\
        XESetEventToWire                        ,\
        XESetFlushGC                            ,\
        XESetFreeFont                           ,\
        XESetFreeGC                             ,\
        XESetPrintErrorValues                   ,\
        XESetWireToError                        ,\
        XESetWireToEvent                        ,\
        XEmptyRegion                            ,\
        XEnableAccessControl                    ,\
        XEqualRegion                            ,\
        XEventMaskOfScreen                      ,\
        XEventsQueued                           ,\
        XExtendedMaxRequestSize                 ,\
        XExtentsOfFontSet                       ,\
        XFetchBuffer                            ,\
        XFetchBytes                             ,\
        XFetchName                              ,\
        XFillArc                                ,\
        XFillArcs                               ,\
        XFillPolygon                            ,\
        XFillRectangle                          ,\
        XFillRectangles                         ,\
        XFilterEvent                            ,\
        XFindContext                            ,\
        XFindOnExtensionList                    ,\
        XFlush                                  ,\
        XFlushGC                                ,\
        XFontsOfFontSet                         ,\
        XForceScreenSaver                       ,\
        XFree                                   ,\
        XFreeColormap                           ,\
        XFreeColors                             ,\
        XFreeCursor                             ,\
        XFreeExtensionList                      ,\
        XFreeFont                               ,\
        XFreeFontInfo                           ,\
        XFreeFontNames                          ,\
        XFreeFontPath                           ,\
        XFreeFontSet                            ,\
        XFreeGC                                 ,\
        XFreeModifiermap                        ,\
        XFreePixmap                             ,\
        XFreeStringList                         ,\
        XGContextFromGC                         ,\
        XGeometry                               ,\
        XGetAtomName                            ,\
        XGetAtomNames                           ,\
        XGetClassHint                           ,\
        XGetCommand                             ,\
        XGetDefault                             ,\
        XGetErrorDatabaseText                   ,\
        XGetErrorText                           ,\
        XGetFontPath                            ,\
        XGetFontProperty                        ,\
        XGetGCValues                            ,\
        XGetGeometry                            ,\
        XGetICValues                            ,\
        XGetIMValues                            ,\
        XGetIconName                            ,\
        XGetIconSizes                           ,\
        XGetImage                               ,\
        XGetInputFocus                          ,\
        XGetKeyboardControl                     ,\
        XGetKeyboardMapping                     ,\
        XGetModifierMapping                     ,\
        XGetMotionEvents                        ,\
        XGetNormalHints                         ,\
        XGetOCValues                            ,\
        XGetOMValues                            ,\
        XGetPixel                               ,\
        XGetPointerControl                      ,\
        XGetPointerMapping                      ,\
        XGetRGBColormaps                        ,\
        XGetScreenSaver                         ,\
        XGetSelectionOwner                      ,\
        XGetSizeHints                           ,\
        XGetStandardColormap                    ,\
        XGetSubImage                            ,\
        XGetTextProperty                        ,\
        XGetTransientForHint                    ,\
        XGetVisualInfo                          ,\
        XGetWMClientMachine                     ,\
        XGetWMColormapWindows                   ,\
        XGetWMHints                             ,\
        XGetWMIconName                          ,\
        XGetWMName                              ,\
        XGetWMNormalHints                       ,\
        XGetWMProtocols                         ,\
        XGetWMSizeHints                         ,\
        XGetWindowAttributes                    ,\
        XGetWindowProperty                      ,\
        XGetZoomHints                           ,\
        XGrabButton                             ,\
        XGrabKey                                ,\
        XGrabKeyboard                           ,\
        XGrabPointer                            ,\
        XGrabServer                             ,\
        XHeightMMOfScreen                       ,\
        XHeightOfScreen                         ,\
        XIMOfIC                                 ,\
        XIconifyWindow                          ,\
        XIfEvent                                ,\
        XImageByteOrder                         ,\
        XInitExtension                          ,\
        XInitImage                              ,\
        XInitThreads                            ,\
        XInsertModifiermapEntry                 ,\
        XInstallColormap                        ,\
        XInternAtom                             ,\
        XInternAtoms                            ,\
        XInternalConnectionNumbers              ,\
        XIntersectRegion                        ,\
        XKeycodeToKeysym                        ,\
        XKeysymToKeycode                        ,\
        XKeysymToString                         ,\
        XKillClient                             ,\
        XLastKnownRequestProcessed              ,\
        XListDepths                             ,\
        XListExtensions                         ,\
        XListFonts                              ,\
        XListFontsWithInfo                      ,\
        XListHosts                              ,\
        XListInstalledColormaps                 ,\
        XListPixmapFormats                      ,\
        XListProperties                         ,\
        XLoadFont                               ,\
        XLoadQueryFont                          ,\
        XLocaleOfFontSet                        ,\
        XLocaleOfIM                             ,\
        XLocaleOfOM                             ,\
        XLockDisplay                            ,\
        XLookupColor                            ,\
        XLookupKeysym                           ,\
        XLookupString                           ,\
        XLowerWindow                            ,\
        XMapRaised                              ,\
        XMapSubwindows                          ,\
        XMapWindow                              ,\
        XMaskEvent                              ,\
        XMatchVisualInfo                        ,\
        XMaxCmapsOfScreen                       ,\
        XMaxRequestSize                         ,\
        XMinCmapsOfScreen                       ,\
        XMoveResizeWindow                       ,\
        XMoveWindow                             ,\
        XNewModifiermap                         ,\
        XNextEvent                              ,\
        XNextRequest                            ,\
        XNoOp                                   ,\
        XOMOfOC                                 ,\
        XOffsetRegion                           ,\
        XOpenDisplay                            ,\
        XOpenIM                                 ,\
        XOpenOM                                 ,\
        XParseColor                             ,\
        XParseGeometry                          ,\
        XPeekEvent                              ,\
        XPeekIfEvent                            ,\
        XPending                                ,\
        XPlanesOfScreen                         ,\
        XPointInRegion                          ,\
        XPolygonRegion                          ,\
        XProcessInternalConnection              ,\
        XProtocolRevision                       ,\
        XProtocolVersion                        ,\
        XPutBackEvent                           ,\
        XPutImage                               ,\
        XPutPixel                               ,\
        XQLength                                ,\
        XQueryBestCursor                        ,\
        XQueryBestSize                          ,\
        XQueryBestStipple                       ,\
        XQueryBestTile                          ,\
        XQueryColor                             ,\
        XQueryColors                            ,\
        XQueryExtension                         ,\
        XQueryFont                              ,\
        XQueryKeymap                            ,\
        XQueryPointer                           ,\
        XQueryTextExtents                       ,\
        XQueryTextExtents16                     ,\
        XQueryTree                              ,\
        XRaiseWindow                            ,\
        XReadBitmapFile                         ,\
        XReadBitmapFileData                     ,\
        XRebindKeysym                           ,\
        XRecolorCursor                          ,\
        XReconfigureWMWindow                    ,\
        XRectInRegion                           ,\
        XRefreshKeyboardMapping                 ,\
        XRegisterIMInstantiateCallback          ,\
        XRemoveConnectionWatch                  ,\
        XRemoveFromSaveSet                      ,\
        XRemoveHost                             ,\
        XRemoveHosts                            ,\
        XReparentWindow                         ,\
        XResetScreenSaver                       ,\
        XResizeWindow                           ,\
        XResourceManagerString                  ,\
        XRestackWindows                         ,\
        XRootWindow                             ,\
        XRootWindowOfScreen                     ,\
        XRotateBuffers                          ,\
        XRotateWindowProperties                 ,\
        XSaveContext                            ,\
        XScreenCount                            ,\
        XScreenNumberOfScreen                   ,\
        XScreenOfDisplay                        ,\
        XScreenResourceString                   ,\
        XSelectInput                            ,\
        XSendEvent                              ,\
        XServerVendor                           ,\
        XSetAccessControl                       ,\
        XSetAfterFunction                       ,\
        XSetArcMode                             ,\
        XSetAuthorization                       ,\
        XSetBackground                          ,\
        XSetClassHint                           ,\
        XSetClipMask                            ,\
        XSetClipOrigin                          ,\
        XSetClipRectangles                      ,\
        XSetCloseDownMode                       ,\
        XSetCommand                             ,\
        XSetDashes                              ,\
        XSetErrorHandler                        ,\
        XSetFillRule                            ,\
        XSetFillStyle                           ,\
        XSetFont                                ,\
        XSetFontPath                            ,\
        XSetForeground                          ,\
        XSetFunction                            ,\
        XSetGraphicsExposures                   ,\
        XSetICFocus                             ,\
        XSetICValues                            ,\
        XSetIMValues                            ,\
        XSetIOErrorHandler                      ,\
        XSetIconName                            ,\
        XSetIconSizes                           ,\
        XSetInputFocus                          ,\
        XSetLineAttributes                      ,\
        XSetLocaleModifiers                     ,\
        XSetModifierMapping                     ,\
        XSetNormalHints                         ,\
        XSetOCValues                            ,\
        XSetOMValues                            ,\
        XSetPlaneMask                           ,\
        XSetPointerMapping                      ,\
        XSetRGBColormaps                        ,\
        XSetRegion                              ,\
        XSetScreenSaver                         ,\
        XSetSelectionOwner                      ,\
        XSetSizeHints                           ,\
        XSetStandardColormap                    ,\
        XSetStandardProperties                  ,\
        XSetState                               ,\
        XSetStipple                             ,\
        XSetSubwindowMode                       ,\
        XSetTSOrigin                            ,\
        XSetTextProperty                        ,\
        XSetTile                                ,\
        XSetTransientForHint                    ,\
        XSetWMClientMachine                     ,\
        XSetWMColormapWindows                   ,\
        XSetWMHints                             ,\
        XSetWMIconName                          ,\
        XSetWMName                              ,\
        XSetWMNormalHints                       ,\
        XSetWMProperties                        ,\
        XSetWMProtocols                         ,\
        XSetWMSizeHints                         ,\
        XSetWindowBackground                    ,\
        XSetWindowBackgroundPixmap              ,\
        XSetWindowBorder                        ,\
        XSetWindowBorderPixmap                  ,\
        XSetWindowBorderWidth                   ,\
        XSetWindowColormap                      ,\
        XSetZoomHints                           ,\
        XShrinkRegion                           ,\
        XStoreBuffer                            ,\
        XStoreBytes                             ,\
        XStoreColor                             ,\
        XStoreColors                            ,\
        XStoreName                              ,\
        XStoreNamedColor                        ,\
        XStringListToTextProperty               ,\
        XStringToKeysym                         ,\
        XSubImage                               ,\
        XSubtractRegion                         ,\
        XSupportsLocale                         ,\
        XSync                                   ,\
        XSynchronize                            ,\
        XTextExtents                            ,\
        XTextExtents16                          ,\
        XTextPropertyToStringList               ,\
        XTextWidth                              ,\
        XTextWidth16                            ,\
        XTranslateCoordinates                   ,\
        XUndefineCursor                         ,\
        XUngrabButton                           ,\
        XUngrabKey                              ,\
        XUngrabKeyboard                         ,\
        XUngrabPointer                          ,\
        XUngrabServer                           ,\
        XUninstallColormap                      ,\
        XUnionRectWithRegion                    ,\
        XUnionRegion                            ,\
        XUnloadFont                             ,\
        XUnlockDisplay                          ,\
        XUnmapSubwindows                        ,\
        XUnmapWindow                            ,\
        XUnregisterIMInstantiateCallback        ,\
        XUnsetICFocus                           ,\
        XVaCreateNestedList                     ,\
        XVendorRelease                          ,\
        XVisualIDFromVisual                     ,\
        XWMGeometry                             ,\
        XWarpPointer                            ,\
        XWhitePixel                             ,\
        XWhitePixelOfScreen                     ,\
        XWidthMMOfScreen                        ,\
        XWidthOfScreen                          ,\
        XWindowEvent                            ,\
        XWithdrawWindow                         ,\
        XWriteBitmapFile                        ,\
        XXorRegion                              ,\
        XcmsAddColorSpace                       ,\
        XcmsAddFunctionSet                      ,\
        XcmsAllocColor                          ,\
        XcmsAllocNamedColor                     ,\
        XcmsCCCOfColormap                       ,\
        XcmsCIELabClipL                         ,\
        XcmsCIELabClipLab                       ,\
        XcmsCIELabClipab                        ,\
        XcmsCIELabColorSpace                    ,\
        XcmsCIELabQueryMaxC                     ,\
        XcmsCIELabQueryMaxL                     ,\
        XcmsCIELabQueryMaxLC                    ,\
        XcmsCIELabQueryMinL                     ,\
        XcmsCIELabToCIEXYZ                      ,\
        XcmsCIELabWhiteShiftColors              ,\
        XcmsCIELuvClipL                         ,\
        XcmsCIELuvClipLuv                       ,\
        XcmsCIELuvClipuv                        ,\
        XcmsCIELuvColorSpace                    ,\
        XcmsCIELuvQueryMaxC                     ,\
        XcmsCIELuvQueryMaxL                     ,\
        XcmsCIELuvQueryMaxLC                    ,\
        XcmsCIELuvQueryMinL                     ,\
        XcmsCIELuvToCIEuvY                      ,\
        XcmsCIELuvWhiteShiftColors              ,\
        XcmsCIEXYZColorSpace                    ,\
        XcmsCIEXYZToCIELab                      ,\
        XcmsCIEXYZToCIEuvY                      ,\
        XcmsCIEXYZToCIExyY                      ,\
        XcmsCIEXYZToRGBi                        ,\
        XcmsCIEuvYColorSpace                    ,\
        XcmsCIEuvYToCIELuv                      ,\
        XcmsCIEuvYToCIEXYZ                      ,\
        XcmsCIEuvYToTekHVC                      ,\
        XcmsCIExyYColorSpace                    ,\
        XcmsCIExyYToCIEXYZ                      ,\
        XcmsClientWhitePointOfCCC               ,\
        XcmsConvertColors                       ,\
        XcmsCreateCCC                           ,\
        XcmsDefaultCCC                          ,\
        XcmsDisplayOfCCC                        ,\
        XcmsFormatOfPrefix                      ,\
        XcmsFreeCCC                             ,\
        XcmsLinearRGBFunctionSet                ,\
        XcmsLookupColor                         ,\
        XcmsPrefixOfFormat                      ,\
        XcmsQueryBlack                          ,\
        XcmsQueryBlue                           ,\
        XcmsQueryColor                          ,\
        XcmsQueryColors                         ,\
        XcmsQueryGreen                          ,\
        XcmsQueryRed                            ,\
        XcmsQueryWhite                          ,\
        XcmsRGBColorSpace                       ,\
        XcmsRGBToRGBi                           ,\
        XcmsRGBiColorSpace                      ,\
        XcmsRGBiToCIEXYZ                        ,\
        XcmsRGBiToRGB                           ,\
        XcmsScreenNumberOfCCC                   ,\
        XcmsScreenWhitePointOfCCC               ,\
        XcmsSetCCCOfColormap                    ,\
        XcmsSetCompressionProc                  ,\
        XcmsSetWhiteAdjustProc                  ,\
        XcmsSetWhitePoint                       ,\
        XcmsStoreColor                          ,\
        XcmsStoreColors                         ,\
        XcmsTekHVCClipC                         ,\
        XcmsTekHVCClipV                         ,\
        XcmsTekHVCClipVC                        ,\
        XcmsTekHVCColorSpace                    ,\
        XcmsTekHVCQueryMaxC                     ,\
        XcmsTekHVCQueryMaxV                     ,\
        XcmsTekHVCQueryMaxVC                    ,\
        XcmsTekHVCQueryMaxVSamples              ,\
        XcmsTekHVCQueryMinV                     ,\
        XcmsTekHVCToCIEuvY                      ,\
        XcmsTekHVCWhiteShiftColors              ,\
        XcmsUNDEFINEDColorSpace                 ,\
        XcmsVisualOfCCC                         ,\
        XkbAddDeviceLedInfo                     ,\
        XkbAddGeomColor                         ,\
        XkbAddGeomDoodad                        ,\
        XkbAddGeomKey                           ,\
        XkbAddGeomKeyAlias                      ,\
        XkbAddGeomOutline                       ,\
        XkbAddGeomOverlay                       ,\
        XkbAddGeomOverlayKey                    ,\
        XkbAddGeomOverlayRow                    ,\
        XkbAddGeomProperty                      ,\
        XkbAddGeomRow                           ,\
        XkbAddGeomSection                       ,\
        XkbAddGeomShape                         ,\
        XkbAddKeyType                           ,\
        XkbAllocClientMap                       ,\
        XkbAllocCompatMap                       ,\
        XkbAllocControls                        ,\
        XkbAllocDeviceInfo                      ,\
        XkbAllocGeomColors                      ,\
        XkbAllocGeomDoodads                     ,\
        XkbAllocGeomKeyAliases                  ,\
        XkbAllocGeomKeys                        ,\
        XkbAllocGeomOutlines                    ,\
        XkbAllocGeomOverlayKeys                 ,\
        XkbAllocGeomOverlayRows                 ,\
        XkbAllocGeomOverlays                    ,\
        XkbAllocGeomPoints                      ,\
        XkbAllocGeomProps                       ,\
        XkbAllocGeomRows                        ,\
        XkbAllocGeomSectionDoodads              ,\
        XkbAllocGeomSections                    ,\
        XkbAllocGeomShapes                      ,\
        XkbAllocGeometry                        ,\
        XkbAllocIndicatorMaps                   ,\
        XkbAllocKeyboard                        ,\
        XkbAllocNames                           ,\
        XkbAllocServerMap                       ,\
        XkbApplyCompatMapToKey                  ,\
        XkbApplyVirtualModChanges               ,\
        XkbBell                                 ,\
        XkbBellEvent                            ,\
        XkbChangeDeviceInfo                     ,\
        XkbChangeEnabledControls                ,\
        XkbChangeKeycodeRange                   ,\
        XkbChangeMap                            ,\
        XkbChangeNames                          ,\
        XkbChangeTypesOfKey                     ,\
        XkbComputeEffectiveMap                  ,\
        XkbComputeRowBounds                     ,\
        XkbComputeSectionBounds                 ,\
        XkbComputeShapeBounds                   ,\
        XkbComputeShapeTop                      ,\
        XkbCopyKeyType                          ,\
        XkbCopyKeyTypes                         ,\
        XkbDeviceBell                           ,\
        XkbDeviceBellEvent                      ,\
        XkbFindOverlayForKey                    ,\
        XkbForceBell                            ,\
        XkbForceDeviceBell                      ,\
        XkbFreeClientMap                        ,\
        XkbFreeCompatMap                        ,\
        XkbFreeComponentList                    ,\
        XkbFreeControls                         ,\
        XkbFreeDeviceInfo                       ,\
        XkbFreeGeomColors                       ,\
        XkbFreeGeomDoodads                      ,\
        XkbFreeGeomKeyAliases                   ,\
        XkbFreeGeomKeys                         ,\
        XkbFreeGeomOutlines                     ,\
        XkbFreeGeomOverlayKeys                  ,\
        XkbFreeGeomOverlayRows                  ,\
        XkbFreeGeomOverlays                     ,\
        XkbFreeGeomPoints                       ,\
        XkbFreeGeomProperties                   ,\
        XkbFreeGeomRows                         ,\
        XkbFreeGeomSections                     ,\
        XkbFreeGeomShapes                       ,\
        XkbFreeGeometry                         ,\
        XkbFreeIndicatorMaps                    ,\
        XkbFreeKeyboard                         ,\
        XkbFreeNames                            ,\
        XkbFreeServerMap                        ,\
        XkbGetAutoRepeatRate                    ,\
        XkbGetAutoResetControls                 ,\
        XkbGetCompatMap                         ,\
        XkbGetControls                          ,\
        XkbGetDetectableAutoRepeat              ,\
        XkbGetDeviceButtonActions               ,\
        XkbGetDeviceInfo                        ,\
        XkbGetDeviceInfoChanges                 ,\
        XkbGetDeviceLedInfo                     ,\
        XkbGetGeometry                          ,\
        XkbGetIndicatorMap                      ,\
        XkbGetIndicatorState                    ,\
        XkbGetKeyActions                        ,\
        XkbGetKeyBehaviors                      ,\
        XkbGetKeyExplicitComponents             ,\
        XkbGetKeyModifierMap                    ,\
        XkbGetKeySyms                           ,\
        XkbGetKeyTypes                          ,\
        XkbGetKeyVirtualModMap                  ,\
        XkbGetKeyboard                          ,\
        XkbGetKeyboardByName                    ,\
        XkbGetMap                               ,\
        XkbGetMapChanges                        ,\
        XkbGetNamedDeviceIndicator              ,\
        XkbGetNamedGeometry                     ,\
        XkbGetNamedIndicator                    ,\
        XkbGetNames                             ,\
        XkbGetPerClientControls                 ,\
        XkbGetState                             ,\
        XkbGetUpdatedMap                        ,\
        XkbGetVirtualMods                       ,\
        XkbGetXlibControls                      ,\
        XkbIgnoreExtension                      ,\
        XkbInitCanonicalKeyTypes                ,\
        XkbKeyTypesForCoreSymbols               ,\
        XkbKeycodeToKeysym                      ,\
        XkbKeysymToModifiers                    ,\
        XkbLatchGroup                           ,\
        XkbLatchModifiers                       ,\
        XkbLibraryVersion                       ,\
        XkbListComponents                       ,\
        XkbLockGroup                            ,\
        XkbLockModifiers                        ,\
        XkbLookupKeyBinding                     ,\
        XkbLookupKeySym                         ,\
        XkbNoteControlsChanges                  ,\
        XkbNoteDeviceChanges                    ,\
        XkbNoteMapChanges                       ,\
        XkbNoteNameChanges                      ,\
        XkbOpenDisplay                          ,\
        XkbQueryExtension                       ,\
        XkbRefreshKeyboardMapping               ,\
        XkbResizeDeviceButtonActions            ,\
        XkbResizeKeyActions                     ,\
        XkbResizeKeySyms                        ,\
        XkbResizeKeyType                        ,\
        XkbSelectEventDetails                   ,\
        XkbSelectEvents                         ,\
        XkbSetAtomFuncs                         ,\
        XkbSetAutoRepeatRate                    ,\
        XkbSetAutoResetControls                 ,\
        XkbSetCompatMap                         ,\
        XkbSetControls                          ,\
        XkbSetDebuggingFlags                    ,\
        XkbSetDetectableAutoRepeat              ,\
        XkbSetDeviceButtonActions               ,\
        XkbSetDeviceInfo                        ,\
        XkbSetDeviceLedInfo                     ,\
        XkbSetGeometry                          ,\
        XkbSetIgnoreLockMods                    ,\
        XkbSetIndicatorMap                      ,\
        XkbSetMap                               ,\
        XkbSetNamedDeviceIndicator              ,\
        XkbSetNamedIndicator                    ,\
        XkbSetNames                             ,\
        XkbSetPerClientControls                 ,\
        XkbSetServerInternalMods                ,\
        XkbSetXlibControls                      ,\
        XkbToControl                            ,\
        XkbTranslateKey                         ,\
        XkbTranslateKeyCode                     ,\
        XkbTranslateKeySym                      ,\
        XkbUpdateActionVirtualMods              ,\
        XkbUpdateKeyTypeVirtualMods             ,\
        XkbUpdateMapFromCore                    ,\
        XkbUseExtension                         ,\
        XkbVirtualModsToReal                    ,\
        XkbXlibControlsImplemented              ,\
        XmbDrawImageString                      ,\
        XmbDrawString                           ,\
        XmbDrawText                             ,\
        XmbLookupString                         ,\
        XmbResetIC                              ,\
        XmbSetWMProperties                      ,\
        XmbTextEscapement                       ,\
        XmbTextExtents                          ,\
        XmbTextListToTextProperty               ,\
        XmbTextPerCharExtents                   ,\
        XmbTextPropertyToTextList               ,\
        Xpermalloc                              ,\
        XrmCombineDatabase                      ,\
        XrmCombineFileDatabase                  ,\
        XrmDestroyDatabase                      ,\
        XrmEnumerateDatabase                    ,\
        XrmGetDatabase                          ,\
        XrmGetFileDatabase                      ,\
        XrmGetResource                          ,\
        XrmGetStringDatabase                    ,\
        XrmInitialize                           ,\
        XrmLocaleOfDatabase                     ,\
        XrmMergeDatabases                       ,\
        XrmParseCommand                         ,\
        XrmPermStringToQuark                    ,\
        XrmPutFileDatabase                      ,\
        XrmPutLineResource                      ,\
        XrmPutResource                          ,\
        XrmPutStringResource                    ,\
        XrmQGetResource                         ,\
        XrmQGetSearchList                       ,\
        XrmQGetSearchResource                   ,\
        XrmQPutResource                         ,\
        XrmQPutStringResource                   ,\
        XrmQuarkToString                        ,\
        XrmSetDatabase                          ,\
        XrmStringToBindingQuarkList             ,\
        XrmStringToQuark                        ,\
        XrmStringToQuarkList                    ,\
        XrmUniqueQuark                          ,\
        Xutf8DrawImageString                    ,\
        Xutf8DrawString                         ,\
        Xutf8DrawText                           ,\
        Xutf8LookupString                       ,\
        Xutf8ResetIC                            ,\
        Xutf8SetWMProperties                    ,\
        Xutf8TextEscapement                     ,\
        Xutf8TextExtents                        ,\
        Xutf8TextListToTextProperty             ,\
        Xutf8TextPerCharExtents                 ,\
        Xutf8TextPropertyToTextList             ,\
        XwcDrawImageString                      ,\
        XwcDrawString                           ,\
        XwcDrawText                             ,\
        XwcFreeStringList                       ,\
        XwcLookupString                         ,\
        XwcResetIC                              ,\
        XwcTextEscapement                       ,\
        XwcTextExtents                          ,\
        XwcTextListToTextProperty               ,\
        XwcTextPerCharExtents                   ,\
        XwcTextPropertyToTextList               ,\
        XUniqueContext                          ,\
\; LibC
        puts                                    ,\
        exit                                    ,\
        malloc                                  ,\
        free                                    ,\
        realloc                                 ,\
        stime                                   ,\
\; Xft library
        XftDrawString8                          ,\
        XftTextExtents8                         ,\
        XftFontOpenName                         ,\
        XftDrawSetClip                          ,\
        XftDrawDestroy                          ,\
        XftDrawCreate                           ,\
        XftFontOpenXlfd                         ,\
        XftFontOpenPattern




DispSize 'ELF Import data:', $-_importdata
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Added freshlib/imports/Linux/libFC.inc.



































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: FontConfig import library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________



import_proto 'libfontconfig.so.1',                                                                              \
             FcInit,                   <VOID>,                          'FcInit',                               \
             FcFini,                   <VOID>,                          'FcFini',                               \
             FcInitLoadConfigAndFonts, <VOID>,                          'FcInitLoadConfigAndFonts',             \
             FcPatternCreate,          <VOID>,                          'FcPatternCreate',                      \
             FcObjectSetBuild,         <.first, ...>,                   'FcObjectSetBuild',                     \
             FcObjectSetDestroy,       <.pObjectSet>,                   'FcObjectSetDestroy',                   \
             FcFontList,               <.config, .pPattern, .ObjSet>,   'FcFontList',                           \
             FcPatternGetString,       <.pPattern, .obj, .n, .pBuffer>, 'FcPatternGetString',                   \
             FcPatternGetInteger,      <.pPattern, .obj, .n, .pInt>,    'FcPatternGetInteger',                  \
             FcFontSetDestroy,         <.pFontSet>,                     'FcFontSetDestroy',                     \
             FcNameParse,              <.name>,                         'FcNameParse',                          \
             FcConfigSubstitute,       <.config, .pattern, .matchkind>, 'FcConfigSubstitute',                   \
             FcDefaultSubstitute,      <.pattern>,                      'FcDefaultSubstitute',                  \
             FcFontMatch,              <.config, .pattern, .pResult>,   'FcFontMatch',                          \
             FcPatternDestroy,         <.pattern>,                      'FcPatternDestroy',                     \
             FcPatternPrint,           <.pattern>,                      'FcPatternPrint'

Added freshlib/imports/Linux/libFT.inc.



























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: MIT_SHM extension import library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto 'libfreetype.so.6',                                                                                            \
             FT_Init_FreeType,   <.pLibrary>,                                'FT_Init_FreeType',                            \
             FT_New_Face,        <.library, .filename, .idxFace, .pFace>,    'FT_New_Face',                                 \
             FT_Set_Char_Size,   <.pFace, .width, .height, .hRes, .vRes>,    'FT_Set_Char_Size',                            \
             FT_Set_Pixel_Sizes, <.pFace, .pxWidth, .pxHeight>,              'FT_Set_Pixel_Sizes',                          \
             FT_Request_Size,    <.pFace, .pReq>,                            'FT_Request_Size',                             \
             FT_Select_Size,     <.pFace, .i>,                               'FT_Select_Size',                              \
             FT_Get_Char_Index,  <.pFace, .char>,                            'FT_Get_Char_Index',                           \
             FT_Load_Glyph,      <.pFace, .idxGlyph, .flags>,                'FT_Load_Glyph',                               \
             FT_Render_Glyph,    <.pSlot, .RenderMode>,                      'FT_Render_Glyph',                             \
             FT_Done_Face,       <.pFace>,                                   'FT_Done_Face',                                \
             FT_Glyph_To_Bitmap, <.pGlyph, .render_mode, .pOrigin, .destroy>, 'FT_Glyph_To_Bitmap',                         \
             FT_Get_Kerning,     <.face, .left_glyph, .right_glyph, .kern_mode, .pKerning>, 'FT_Get_Kerning',               \
             FT_Get_Advance,     <.face, .gindex, .load_flags, .pAdvance>,   'FT_Get_Advance',                              \
             FTC_Manager_New,    <.library, .max_faces, .max_sizes,                                                         \
                                  .max_bytes, .requester, .req_data, .pManager>, 'FTC_Manager_New',                         \
             FTC_Manager_LookupFace, <.manager, .face_id, .pFace>,           'FTC_Manager_LookupFace',                      \
             FTC_Manager_LookupSize, <.manager, .scaler, .pSize>,            'FTC_Manager_LookupSize',                      \
             FTC_Manager_RemoveFaceID, <.manager, .face_id>,                 'FTC_Manager_RemoveFaceID',                    \
             FTC_ImageCache_New, <.manager, .pImageCache>,                   'FTC_ImageCache_New',                          \
             FTC_ImageCache_Lookup, <.cache, .type, .glyph_index,                                                           \
                                     .pGlyph, .pNode>,                       'FTC_ImageCache_Lookup',                       \
             FTC_ImageCache_LookupScaler, <.cache, .scaler, .load_flags,                                                    \
                                           .gindex, .pGlyph, .pNode>,        'FTC_ImageCache_LookupScaler',                 \
             FTC_CMapCache_New,  <.manager, .pCMapCache>,                    'FTC_CMapCache_New',                           \
             FTC_CMapCache_Lookup, <.cache, .face_id, .cmap_index, .char_code>, 'FTC_CMapCache_Lookup'




Added freshlib/imports/Linux/libX11.inc.























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: libX11 (XLib) import library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes: Needs editing of the function arguments
;_________________________________________________________________________________________


import_proto 'libX11.so',                                                                                                                             \
        XActivateScreenSaver                    ,<NONE>,                                    'XActivateScreenSaver',                                     \
        XAddConnectionWatch                     ,<NONE>,                                    'XAddConnectionWatch',                                      \
        XAddExtension                           ,<NONE>,                                    'XAddExtension',                                            \
        XAddHost                                ,<NONE>,                                    'XAddHost',                                                 \
        XAddHosts                               ,<NONE>,                                    'XAddHosts',                                                \
        XAddPixel                               ,<NONE>,                                    'XAddPixel',                                                \
        XAddToExtensionList                     ,<NONE>,                                    'XAddToExtensionList',                                      \
        XAddToSaveSet                           ,<NONE>,                                    'XAddToSaveSet',                                            \
        XAllPlanes                              ,<NONE>,                                    'XAllPlanes',                                               \
        XAllocClassHint                         ,<NONE>,                                    'XAllocClassHint',                                          \
        XAllocColor                             ,<NONE>,                                    'XAllocColor',                                              \
        XAllocColorCells                        ,<NONE>,                                    'XAllocColorCells',                                         \
        XAllocColorPlanes                       ,<NONE>,                                    'XAllocColorPlanes',                                        \
        XAllocIconSize                          ,<NONE>,                                    'XAllocIconSize',                                           \
        XAllocNamedColor                        ,<NONE>,                                    'XAllocNamedColor',                                         \
        XAllocSizeHints                         ,<NONE>,                                    'XAllocSizeHints',                                          \
        XAllocStandardColormap                  ,<NONE>,                                    'XAllocStandardColormap',                                   \
        XAllocWMHints                           ,<NONE>,                                    'XAllocWMHints',                                            \
        XAllowEvents                            ,<NONE>,                                    'XAllowEvents',                                             \
        XAutoRepeatOff                          ,<NONE>,                                    'XAutoRepeatOff',                                           \
        XAutoRepeatOn                           ,<NONE>,                                    'XAutoRepeatOn',                                            \
        XBaseFontNameListOfFontSet              ,<NONE>,                                    'XBaseFontNameListOfFontSet',                               \
        XBell                                   ,<NONE>,                                    'XBell',                                                    \
        XBitmapBitOrder                         ,<NONE>,                                    'XBitmapBitOrder',                                          \
        XBitmapPad                              ,<NONE>,                                    'XBitmapPad',                                               \
        XBitmapUnit                             ,<NONE>,                                    'XBitmapUnit',                                              \
        XBlackPixel                             ,<NONE>,                                    'XBlackPixel',                                              \
        XBlackPixelOfScreen                     ,<NONE>,                                    'XBlackPixelOfScreen',                                      \
        XCellsOfScreen                          ,<NONE>,                                    'XCellsOfScreen',                                           \
        XChangeActivePointerGrab                ,<NONE>,                                    'XChangeActivePointerGrab',                                 \
        XChangeGC                               ,<NONE>,                                    'XChangeGC',                                                \
        XChangeKeyboardControl                  ,<NONE>,                                    'XChangeKeyboardControl',                                   \
        XChangeKeyboardMapping                  ,<NONE>,                                    'XChangeKeyboardMapping',                                   \
        XChangePointerControl                   ,<NONE>,                                    'XChangePointerControl',                                    \
        XChangeProperty                         ,<.display, .wnd, .property, .type, .format, .mode, .pData, .n_elements>, 'XChangeProperty',            \
        XChangeSaveSet                          ,<NONE>,                                    'XChangeSaveSet',                                           \
        XChangeWindowAttributes                 ,<.display, .hwnd, .valmask, .pSetWinAttr>, 'XChangeWindowAttributes',                                  \
        XCheckIfEvent                           ,<.display, .pEvent, .ProcIf, .Param>,      'XCheckIfEvent',                                            \
        XCheckMaskEvent                         ,<.display, .event_mask, .pEvent>,          'XCheckMaskEvent',                                          \
        XCheckTypedEvent                        ,<.display, .event_type, .pEvent>,          'XCheckTypedEvent',                                         \
        XCheckTypedWindowEvent                  ,<NONE>,                                    'XCheckTypedWindowEvent',                                   \
        XCheckWindowEvent                       ,<NONE>,                                    'XCheckWindowEvent',                                        \
        XCirculateSubwindows                    ,<NONE>,                                    'XCirculateSubwindows',                                     \
        XCirculateSubwindowsDown                ,<NONE>,                                    'XCirculateSubwindowsDown',                                 \
        XCirculateSubwindowsUp                  ,<NONE>,                                    'XCirculateSubwindowsUp',                                   \
        XClearArea                              ,<.display, .window, .x, .y, .width, .height, .exposures>, 'XClearArea',                                \
        XClearWindow                            ,<NONE>,                                    'XClearWindow',                                             \
        XClipBox                                ,<NONE>,                                    'XClipBox',                                                 \
        XCloseDisplay                           ,<NONE>,                                    'XCloseDisplay',                                            \
        XCloseIM                                ,<NONE>,                                    'XCloseIM',                                                 \
        XCloseOM                                ,<NONE>,                                    'XCloseOM',                                                 \
        XConfigureWindow                        ,<NONE>,                                    'XConfigureWindow',                                         \
        XConnectionNumber                       ,<.display>,                                    'XConnectionNumber',                                    \
        XContextDependentDrawing                ,<NONE>,                                    'XContextDependentDrawing',                                 \
        XContextualDrawing                      ,<NONE>,                                    'XContextualDrawing',                                       \
        XConvertCase                            ,<.keysym, .pLowerRet, .pUpperRet>,         'XConvertCase',                                             \
        XConvertSelection                       ,<.display, .selection, .target, .property, .requestor, .time>, 'XConvertSelection',                    \
        XCopyArea                               ,<.display, .src, .dst, .context, .SrcX, .SrcY, .width, .height, .destX, .destY>, 'XCopyArea',           \
        XCopyColormapAndFree                    ,<NONE>,                                    'XCopyColormapAndFree',                         \
        XCopyGC                                 ,<NONE>,                                    'XCopyGC',                                      \
        XCopyPlane                              ,<NONE>,                                    'XCopyPlane',                                   \
        XCreateBitmapFromData                   ,<NONE>,                                    'XCreateBitmapFromData',                        \
        XCreateColormap                         ,<NONE>,                                    'XCreateColormap',                              \
        XCreateFontCursor                       ,<NONE>,                                    'XCreateFontCursor',                            \
        XCreateFontSet                          ,<NONE>,                                    'XCreateFontSet',                               \
        XCreateGC                               ,<.display, .drawable, .mask, .pValues>,    'XCreateGC',                                    \
        XCreateGlyphCursor                      ,<NONE>,                                    'XCreateGlyphCursor',                           \
        XCreateIC                               ,<NONE>,                                    'XCreateIC',                                    \
        XCreateImage                            ,<NONE>,                                    'XCreateImage',                                 \
        XCreateOC                               ,<NONE>,                                    'XCreateOC',                                    \
        XCreatePixmap                           ,<.display, .drawable, .width, .height, .depth>,        'XCreatePixmap',                                \
        XCreatePixmapCursor                     ,<NONE>,                                    'XCreatePixmapCursor',                          \
        XCreatePixmapFromBitmapData             ,<NONE>,                                    'XCreatePixmapFromBitmapData',                  \
        XCreateRegion                           ,<NONE>,                                    'XCreateRegion',                                \
        XCreateSimpleWindow                     ,<.display, .parent, .x, .y, .width, .height, .widthBorder, .clBorder, .clBackground>, 'XCreateSimpleWindow',                    \
        XCreateWindow                           ,<.display, .parent, .x, .y, .width, .height, .widthBorder, .depth, .class, .visual, .valuemask, .pAttributes>, 'XCreateWindow', \
        XDefaultColormap                        ,<NONE>,                                    'XDefaultColormap',                             \
        XDefaultColormapOfScreen                ,<NONE>,                                    'XDefaultColormapOfScreen',                     \
        XDefaultDepth                           ,<NONE>,                                    'XDefaultDepth',                                \
        XDefaultDepthOfScreen                   ,<NONE>,                                    'XDefaultDepthOfScreen',                        \
        XDefaultGC                              ,<NONE>,                                    'XDefaultGC',                                   \
        XDefaultGCOfScreen                      ,<NONE>,                                    'XDefaultGCOfScreen',                           \
        XDefaultRootWindow                      ,<NONE>,                                    'XDefaultRootWindow',                           \
        XDefaultScreen                          ,<NONE>,                                    'XDefaultScreen',                               \
        XDefaultScreenOfDisplay                 ,<NONE>,                                    'XDefaultScreenOfDisplay',                      \
        XDefaultString                          ,<NONE>,                                    'XDefaultString',                               \
        XDefaultVisual                          ,<NONE>,                                    'XDefaultVisual',                               \
        XDefaultVisualOfScreen                  ,<NONE>,                                    'XDefaultVisualOfScreen',                       \
        XDefineCursor                           ,<NONE>,                                    'XDefineCursor',                                \
        XDeleteContext                          ,<NONE>,                                    'XDeleteContext',                               \
        XDeleteModifiermapEntry                 ,<NONE>,                                    'XDeleteModifiermapEntry',                      \
        XDeleteProperty                         ,<NONE>,                                    'XDeleteProperty',                              \
        XDestroyIC                              ,<NONE>,                                    'XDestroyIC',                                   \
        XDestroyImage                           ,<NONE>,                                    'XDestroyImage',                                \
        XDestroyOC                              ,<NONE>,                                    'XDestroyOC',                                   \
        XDestroyRegion                          ,<NONE>,                                    'XDestroyRegion',                               \
        XDestroySubwindows                      ,<NONE>,                                    'XDestroySubwindows',                           \
        XDestroyWindow                          ,<NONE>,                                    'XDestroyWindow',                               \
        XDirectionalDependentDrawing            ,<NONE>,                                    'XDirectionalDependentDrawing',                 \
        XDisableAccessControl                   ,<NONE>,                                    'XDisableAccessControl',                        \
        XDisplayCells                           ,<NONE>,                                    'XDisplayCells',                                \
        XDisplayHeight                          ,<NONE>,                                    'XDisplayHeight',                               \
        XDisplayHeightMM                        ,<NONE>,                                    'XDisplayHeightMM',                             \
        XDisplayKeycodes                        ,<NONE>,                                    'XDisplayKeycodes',                             \
        XDisplayMotionBufferSize                ,<NONE>,                                    'XDisplayMotionBufferSize',                     \
        XDisplayName                            ,<NONE>,                                    'XDisplayName',                                 \
        XDisplayOfIM                            ,<NONE>,                                    'XDisplayOfIM',                                 \
        XDisplayOfOM                            ,<NONE>,                                    'XDisplayOfOM',                                 \
        XDisplayOfScreen                        ,<NONE>,                                    'XDisplayOfScreen',                             \
        XDisplayPlanes                          ,<NONE>,                                    'XDisplayPlanes',                               \
        XDisplayString                          ,<NONE>,                                    'XDisplayString',                               \
        XDisplayWidth                           ,<NONE>,                                    'XDisplayWidth',                                \
        XDisplayWidthMM                         ,<NONE>,                                    'XDisplayWidthMM',                              \
        XDoesBackingStore                       ,<NONE>,                                    'XDoesBackingStore',                            \
        XDoesSaveUnders                         ,<NONE>,                                    'XDoesSaveUnders',                              \
        XDrawArc                                ,<NONE>,                                    'XDrawArc',                                     \
        XDrawArcs                               ,<NONE>,                                    'XDrawArcs',                                    \
        XDrawImageString                        ,<NONE>,                                    'XDrawImageString',                             \
        XDrawImageString16                      ,<NONE>,                                    'XDrawImageString16',                           \
        XDrawLine                               ,<NONE>,                                    'XDrawLine',                                    \
        XDrawLines                              ,<NONE>,                                    'XDrawLines',                                   \
        XDrawPoint                              ,<NONE>,                                    'XDrawPoint',                                   \
        XDrawPoints                             ,<NONE>,                                    'XDrawPoints',                                  \
        XDrawRectangle                          ,<NONE>,                                    'XDrawRectangle',                               \
        XDrawRectangles                         ,<NONE>,                                    'XDrawRectangles',                              \
        XDrawSegments                           ,<NONE>,                                    'XDrawSegments',                                \
        XDrawString                             ,<NONE>,                                    'XDrawString',                                  \
        XDrawString16                           ,<NONE>,                                    'XDrawString16',                                \
        XDrawText                               ,<NONE>,                                    'XDrawText',                                    \
        XDrawText16                             ,<NONE>,                                    'XDrawText16',                                  \
        XEHeadOfExtensionList                   ,<NONE>,                                    'XEHeadOfExtensionList',                        \
        XESetBeforeFlush                        ,<NONE>,                                    'XESetBeforeFlush',                             \
        XESetCloseDisplay                       ,<NONE>,                                    'XESetCloseDisplay',                            \
        XESetCopyGC                             ,<NONE>,                                    'XESetCopyGC',                                  \
        XESetCreateFont                         ,<NONE>,                                    'XESetCreateFont',                              \
        XESetCreateGC                           ,<NONE>,                                    'XESetCreateGC',                                \
        XESetError                              ,<NONE>,                                    'XESetError',                                   \
        XESetErrorString                        ,<NONE>,                                    'XESetErrorString',                             \
        XESetEventToWire                        ,<NONE>,                                    'XESetEventToWire',                             \
        XESetFlushGC                            ,<NONE>,                                    'XESetFlushGC',                                 \
        XESetFreeFont                           ,<NONE>,                                    'XESetFreeFont',                                \
        XESetFreeGC                             ,<NONE>,                                    'XESetFreeGC',                                  \
        XESetPrintErrorValues                   ,<NONE>,                                    'XESetPrintErrorValues',                        \
        XESetWireToError                        ,<NONE>,                                    'XESetWireToError',                             \
        XESetWireToEvent                        ,<NONE>,                                    'XESetWireToEvent',                             \
        XEmptyRegion                            ,<NONE>,                                    'XEmptyRegion',                                 \
        XEnableAccessControl                    ,<NONE>,                                    'XEnableAccessControl',                         \
        XEqualRegion                            ,<NONE>,                                    'XEqualRegion',                                 \
        XEventMaskOfScreen                      ,<NONE>,                                    'XEventMaskOfScreen',                           \
        XEventsQueued                           ,<NONE>,                                    'XEventsQueued',                                \
        XExtendedMaxRequestSize                 ,<NONE>,                                    'XExtendedMaxRequestSize',                      \
        XExtentsOfFontSet                       ,<NONE>,                                    'XExtentsOfFontSet',                            \
        XFetchBuffer                            ,<.display, .nbytes_return, .buffer>,       'XFetchBuffer',                                 \
        XFetchBytes                             ,<.display, .nbytes_return>,                'XFetchBytes',                                  \
        XFetchName                              ,<.display, .window, .window_name_return>,  'XFetchName',                                   \
        XFillArc                                ,<NONE>,                                    'XFillArc',                                     \
        XFillArcs                               ,<NONE>,                                    'XFillArcs',                                    \
        XFillPolygon                            ,<NONE>,                                    'XFillPolygon',                                 \
        XFillRectangle                          ,<NONE>,                                    'XFillRectangle',                               \
        XFillRectangles                         ,<NONE>,                                    'XFillRectangles',                              \
        XFilterEvent                            ,<NONE>,                                    'XFilterEvent',                                 \
        XFindContext                            ,<NONE>,                                    'XFindContext',                                 \
        XFindOnExtensionList                    ,<NONE>,                                    'XFindOnExtensionList',                         \
        XFlush                                  ,<.display>,                                'XFlush',                                       \
        XFlushGC                                ,<NONE>,                                    'XFlushGC',                                     \
        XFontsOfFontSet                         ,<NONE>,                                    'XFontsOfFontSet',                              \
        XForceScreenSaver                       ,<NONE>,                                    'XForceScreenSaver',                            \
        XFree                                   ,<.ptr>,                                    'XFree',                                        \
        XFreeColormap                           ,<NONE>,                                    'XFreeColormap',                                \
        XFreeColors                             ,<NONE>,                                    'XFreeColors',                                  \
        XFreeCursor                             ,<NONE>,                                    'XFreeCursor',                                  \
        XFreeExtensionList                      ,<NONE>,                                    'XFreeExtensionList',                           \
        XFreeFont                               ,<NONE>,                                    'XFreeFont',                                    \
        XFreeFontInfo                           ,<NONE>,                                    'XFreeFontInfo',                                \
        XFreeFontNames                          ,<NONE>,                                    'XFreeFontNames',                               \
        XFreeFontPath                           ,<NONE>,                                    'XFreeFontPath',                                \
        XFreeFontSet                            ,<NONE>,                                    'XFreeFontSet',                                 \
        XFreeGC                                 ,<NONE>,                                    'XFreeGC',                                      \
        XFreeModifiermap                        ,<NONE>,                                    'XFreeModifiermap',                             \
        XFreePixmap                             ,<NONE>,                                    'XFreePixmap',                                  \
        XFreeStringList                         ,<NONE>,                                    'XFreeStringList',                              \
        XGContextFromGC                         ,<NONE>,                                    'XGContextFromGC',                              \
        XGeometry                               ,<NONE>,                                    'XGeometry',                                    \
        XGetAtomName                            ,<NONE>,                                    'XGetAtomName',                                 \
        XGetAtomNames                           ,<NONE>,                                    'XGetAtomNames',                                \
        XGetClassHint                           ,<NONE>,                                    'XGetClassHint',                                \
        XGetCommand                             ,<NONE>,                                    'XGetCommand',                                  \
        XGetDefault                             ,<NONE>,                                    'XGetDefault',                                  \
        XGetErrorDatabaseText                   ,<NONE>,                                    'XGetErrorDatabaseText',                        \
        XGetErrorText                           ,<NONE>,                                    'XGetErrorText',                                \
        XGetFontPath                            ,<NONE>,                                    'XGetFontPath',                                 \
        XGetFontProperty                        ,<NONE>,                                    'XGetFontProperty',                             \
        XGetGCValues                            ,<NONE>,                                    'XGetGCValues',                                 \
        XGetGeometry                            ,<NONE>,                                    'XGetGeometry',                                 \
        XGetICValues                            ,<NONE>,                                    'XGetICValues',                                 \
        XGetIMValues                            ,<NONE>,                                    'XGetIMValues',                                 \
        XGetIconName                            ,<NONE>,                                    'XGetIconName',                                 \
        XGetIconSizes                           ,<NONE>,                                    'XGetIconSizes',                                \
        XGetImage                               ,<NONE>,                                    'XGetImage',                                    \
        XGetInputFocus                          ,<NONE>,                                    'XGetInputFocus',                               \
        XGetKeyboardControl                     ,<NONE>,                                    'XGetKeyboardControl',                          \
        XGetKeyboardMapping                     ,<NONE>,                                    'XGetKeyboardMapping',                          \
        XGetModifierMapping                     ,<NONE>,                                    'XGetModifierMapping',                          \
        XGetMotionEvents                        ,<NONE>,                                    'XGetMotionEvents',                             \
        XGetNormalHints                         ,<NONE>,                                    'XGetNormalHints',                              \
        XGetOCValues                            ,<NONE>,                                    'XGetOCValues',                                 \
        XGetOMValues                            ,<NONE>,                                    'XGetOMValues',                                 \
        XGetPixel                               ,<NONE>,                                    'XGetPixel',                                    \
        XGetPointerControl                      ,<NONE>,                                    'XGetPointerControl',                           \
        XGetPointerMapping                      ,<NONE>,                                    'XGetPointerMapping',                           \
        XGetRGBColormaps                        ,<NONE>,                                    'XGetRGBColormaps',                             \
        XGetScreenSaver                         ,<NONE>,                                    'XGetScreenSaver',                              \
        XGetSelectionOwner                      ,<.display, .selection>,                    'XGetSelectionOwner',                           \
        XGetSizeHints                           ,<NONE>,                                    'XGetSizeHints',                                \
        XGetStandardColormap                    ,<NONE>,                                    'XGetStandardColormap',                         \
        XGetSubImage                            ,<NONE>,                                    'XGetSubImage',                                 \
        XGetTextProperty                        ,<NONE>,                                    'XGetTextProperty',                             \
        XGetTransientForHint                    ,<NONE>,                                    'XGetTransientForHint',                         \
        XGetVisualInfo                          ,<NONE>,                                    'XGetVisualInfo',                               \
        XGetWMClientMachine                     ,<NONE>,                                    'XGetWMClientMachine',                          \
        XGetWMColormapWindows                   ,<NONE>,                                    'XGetWMColormapWindows',                        \
        XGetWMHints                             ,<NONE>,                                    'XGetWMHints',                                  \
        XGetWMIconName                          ,<NONE>,                                    'XGetWMIconName',                               \
        XGetWMName                              ,<NONE>,                                    'XGetWMName',                                   \
        XGetWMNormalHints                       ,<NONE>,                                    'XGetWMNormalHints',                            \
        XGetWMProtocols                         ,<NONE>,                                    'XGetWMProtocols',                              \
        XGetWMSizeHints                         ,<NONE>,                                    'XGetWMSizeHints',                              \
        XGetWindowAttributes                    ,<.display, .hwin, .pWinAttr>,              'XGetWindowAttributes',                         \
        XGetWindowProperty                      ,<.display, .hwin, .property, .offset, .length, .delete, .req_type, .pTypeRet, .pFormatRet, .pNItemsRet, .pRemainsRet, .pDataRet>, 'XGetWindowProperty', \
        XGetZoomHints                           ,<NONE>,                                    'XGetZoomHints',                                \
        XGrabButton                             ,<NONE>,                                    'XGrabButton',                                  \
        XGrabKey                                ,<NONE>,                                    'XGrabKey',                                     \
        XGrabKeyboard                           ,<NONE>,                                    'XGrabKeyboard',                                \
        XGrabPointer                            ,<NONE>,                                    'XGrabPointer',                                 \
        XGrabServer                             ,<NONE>,                                    'XGrabServer',                                  \
        XHeightMMOfScreen                       ,<NONE>,                                    'XHeightMMOfScreen',                            \
        XHeightOfScreen                         ,<NONE>,                                    'XHeightOfScreen',                              \
        XIMOfIC                                 ,<NONE>,                                    'XIMOfIC',                                      \
        XIconifyWindow                          ,<NONE>,                                    'XIconifyWindow',                               \
        XIfEvent                                ,<.display, .pEvent, .IfProc, .user>,       'XIfEvent',                                     \
        XImageByteOrder                         ,<NONE>,                                    'XImageByteOrder',                              \
        XInitExtension                          ,<NONE>,                                    'XInitExtension',                               \
        XInitImage                              ,<NONE>,                                    'XInitImage',                                   \
        XInitThreads                            ,<NONE>,                                    'XInitThreads',                                 \
        XInsertModifiermapEntry                 ,<NONE>,                                    'XInsertModifiermapEntry',                      \
        XInstallColormap                        ,<NONE>,                                    'XInstallColormap',                             \
        XInternAtom                             ,<.display, .atom_name, .only_if_exists>,    'XInternAtom',                                 \
        XInternAtoms                            ,<.display, .names, .count, .only_if_exists, .atoms_return>,'XInternAtoms',                             \
        XInternalConnectionNumbers              ,<NONE>,                                    'XInternalConnectionNumbers',                   \
        XIntersectRegion                        ,<NONE>,                                    'XIntersectRegion',                             \
        XKeycodeToKeysym                        ,<.display, .keycode, .index>,              'XKeycodeToKeysym',                             \
        XKeysymToKeycode                        ,<.display, .keysym>,                       'XKeysymToKeycode',                             \
        XKeysymToString                         ,<.keysym>,                                 'XKeysymToString',                              \
        XKillClient                             ,<NONE>,                                    'XKillClient',                                  \
        XLastKnownRequestProcessed              ,<NONE>,                                    'XLastKnownRequestProcessed',                   \
        XListDepths                             ,<NONE>,                                    'XListDepths',                                  \
        XListExtensions                         ,<NONE>,                                    'XListExtensions',                              \
        XListFonts                              ,<NONE>,                                    'XListFonts',                                   \
        XListFontsWithInfo                      ,<NONE>,                                    'XListFontsWithInfo',                           \
        XListHosts                              ,<NONE>,                                    'XListHosts',                                   \
        XListInstalledColormaps                 ,<NONE>,                                    'XListInstalledColormaps',                      \
        XListPixmapFormats                      ,<NONE>,                                    'XListPixmapFormats',                           \
        XListProperties                         ,<NONE>,                                    'XListProperties',                              \
        XLoadFont                               ,<NONE>,                                    'XLoadFont',                                    \
        XLoadQueryFont                          ,<NONE>,                                    'XLoadQueryFont',                               \
        XLocaleOfFontSet                        ,<NONE>,                                    'XLocaleOfFontSet',                             \
        XLocaleOfIM                             ,<NONE>,                                    'XLocaleOfIM',                                  \
        XLocaleOfOM                             ,<NONE>,                                    'XLocaleOfOM',                                  \
        XLockDisplay                            ,<NONE>,                                    'XLockDisplay',                                 \
        XLookupColor                            ,<NONE>,                                    'XLookupColor',                                 \
        XLookupKeysym                           ,<NONE>,                                    'XLookupKeysym',                                \
        XLookupString                           ,<NONE>,                                    'XLookupString',                                \
        XLowerWindow                            ,<NONE>,                                    'XLowerWindow',                                 \
        XMapRaised                              ,<NONE>,                                    'XMapRaised',                                   \
        XMapSubwindows                          ,<NONE>,                                    'XMapSubwindows',                               \
        XMapWindow                              ,<NONE>,                                    'XMapWindow',                                   \
        XMaskEvent                              ,<.display, .event_mask, .pEventReturn>,    'XMaskEvent',                                   \
        XMatchVisualInfo                        ,<NONE>,                                    'XMatchVisualInfo',                             \
        XMaxCmapsOfScreen                       ,<NONE>,                                    'XMaxCmapsOfScreen',                            \
        XMaxRequestSize                         ,<NONE>,                                    'XMaxRequestSize',                              \
        XMinCmapsOfScreen                       ,<NONE>,                                    'XMinCmapsOfScreen',                            \
        XMoveResizeWindow                       ,<NONE>,                                    'XMoveResizeWindow',                            \
        XMoveWindow                             ,<NONE>,                                    'XMoveWindow',                                  \
        XNewModifiermap                         ,<NONE>,                                    'XNewModifiermap',                              \
        XNextEvent                              ,<NONE>,                                    'XNextEvent',                                   \
        XNextRequest                            ,<NONE>,                                    'XNextRequest',                                 \
        XNoOp                                   ,<NONE>,                                    'XNoOp',                                        \
        XOMOfOC                                 ,<NONE>,                                    'XOMOfOC',                                      \
        XOffsetRegion                           ,<NONE>,                                    'XOffsetRegion',                                \
        XOpenDisplay                            ,<NONE>,                                    'XOpenDisplay',                                 \
        XOpenIM                                 ,<NONE>,                                    'XOpenIM',                                      \
        XOpenOM                                 ,<NONE>,                                    'XOpenOM',                                      \
        XParseColor                             ,<NONE>,                                    'XParseColor',                                  \
        XParseGeometry                          ,<NONE>,                                    'XParseGeometry',                               \
        XPeekEvent                              ,<NONE>,                                    'XPeekEvent',                                   \
        XPeekIfEvent                            ,<NONE>,                                    'XPeekIfEvent',                                 \
        XPending                                ,<NONE>,                                    'XPending',                                     \
        XPlanesOfScreen                         ,<NONE>,                                    'XPlanesOfScreen',                              \
        XPointInRegion                          ,<NONE>,                                    'XPointInRegion',                               \
        XPolygonRegion                          ,<NONE>,                                    'XPolygonRegion',                               \
        XProcessInternalConnection              ,<NONE>,                                    'XProcessInternalConnection',                   \
        XProtocolRevision                       ,<NONE>,                                    'XProtocolRevision',                            \
        XProtocolVersion                        ,<NONE>,                                    'XProtocolVersion',                             \
        XPutBackEvent                           ,<.Disp, .pEvent>,                          'XPutBackEvent',                                \
        XPutImage                               ,<.Disp, .Drawable, .context, .pXImage, .SrcX, .SrcY, .DestX, .DestY, .width, .height>, 'XPutImage',    \
        XPutPixel                               ,<NONE>,                                    'XPutPixel',                                    \
        XQLength                                ,<NONE>,                                    'XQLength',                                     \
        XQueryBestCursor                        ,<NONE>,                                    'XQueryBestCursor',                             \
        XQueryBestSize                          ,<NONE>,                                    'XQueryBestSize',                               \
        XQueryBestStipple                       ,<NONE>,                                    'XQueryBestStipple',                            \
        XQueryBestTile                          ,<NONE>,                                    'XQueryBestTile',                               \
        XQueryColor                             ,<NONE>,                                    'XQueryColor',                                  \
        XQueryColors                            ,<NONE>,                                    'XQueryColors',                                 \
        XQueryExtension                         ,<NONE>,                                    'XQueryExtension',                              \
        XQueryFont                              ,<NONE>,                                    'XQueryFont',                                   \
        XQueryKeymap                            ,<NONE>,                                    'XQueryKeymap',                                 \
        XQueryPointer                           ,<NONE>,                                    'XQueryPointer',                                \
        XQueryTextExtents                       ,<NONE>,                                    'XQueryTextExtents',                            \
        XQueryTextExtents16                     ,<NONE>,                                    'XQueryTextExtents16',                          \
        XQueryTree                              ,<.display, .window, .root_ret, .parent_ret, .children_ret, .nchildren_ret>, 'XQueryTree',                                   \
        XRaiseWindow                            ,<NONE>,                                    'XRaiseWindow',                                 \
        XReadBitmapFile                         ,<NONE>,                                    'XReadBitmapFile',                              \
        XReadBitmapFileData                     ,<NONE>,                                    'XReadBitmapFileData',                          \
        XRebindKeysym                           ,<NONE>,                                    'XRebindKeysym',                                \
        XRecolorCursor                          ,<NONE>,                                    'XRecolorCursor',                               \
        XReconfigureWMWindow                    ,<NONE>,                                    'XReconfigureWMWindow',                         \
        XRectInRegion                           ,<NONE>,                                    'XRectInRegion',                                \
        XRefreshKeyboardMapping                 ,<NONE>,                                    'XRefreshKeyboardMapping',                      \
        XRegisterIMInstantiateCallback          ,<NONE>,                                    'XRegisterIMInstantiateCallback',               \
        XRemoveConnectionWatch                  ,<NONE>,                                    'XRemoveConnectionWatch',                       \
        XRemoveFromSaveSet                      ,<NONE>,                                    'XRemoveFromSaveSet',                           \
        XRemoveHost                             ,<NONE>,                                    'XRemoveHost',                                  \
        XRemoveHosts                            ,<NONE>,                                    'XRemoveHosts',                                 \
        XReparentWindow                         ,<NONE>,                                    'XReparentWindow',                              \
        XResetScreenSaver                       ,<NONE>,                                    'XResetScreenSaver',                            \
        XResizeWindow                           ,<NONE>,                                    'XResizeWindow',                                \
        XResourceManagerString                  ,<NONE>,                                    'XResourceManagerString',                       \
        XRestackWindows                         ,<NONE>,                                    'XRestackWindows',                              \
        XRootWindow                             ,<.Disp, .ScrNum>,                          'XRootWindow',                                  \
        XRootWindowOfScreen                     ,<.ScrNum>,                                 'XRootWindowOfScreen',                          \
        XRotateBuffers                          ,<NONE>,                                    'XRotateBuffers',                               \
        XRotateWindowProperties                 ,<NONE>,                                    'XRotateWindowProperties',                      \
        XSaveContext                            ,<NONE>,                                    'XSaveContext',                                 \
        XScreenCount                            ,<NONE>,                                    'XScreenCount',                                 \
        XScreenNumberOfScreen                   ,<NONE>,                                    'XScreenNumberOfScreen',                        \
        XScreenOfDisplay                        ,<NONE>,                                    'XScreenOfDisplay',                             \
        XScreenResourceString                   ,<NONE>,                                    'XScreenResourceString',                        \
        XSelectInput                            ,<NONE>,                                    'XSelectInput',                                 \
        XSendEvent                              ,<.display, .window, .propagate, .event_mask, .event_send>, 'XSendEvent',                               \
        XServerVendor                           ,<NONE>,                                    'XServerVendor',                                \
        XSetAccessControl                       ,<NONE>,                                    'XSetAccessControl',                            \
        XSetAfterFunction                       ,<NONE>,                                    'XSetAfterFunction',                            \
        XSetArcMode                             ,<NONE>,                                    'XSetArcMode',                                  \
        XSetAuthorization                       ,<NONE>,                                    'XSetAuthorization',                            \
        XSetBackground                          ,<NONE>,                                    'XSetBackground',                               \
        XSetClassHint                           ,<NONE>,                                    'XSetClassHint',                                \
        XSetClipMask                            ,<NONE>,                                    'XSetClipMask',                                 \
        XSetClipOrigin                          ,<NONE>,                                    'XSetClipOrigin',                               \
        XSetClipRectangles                      ,<NONE>,                                    'XSetClipRectangles',                           \
        XSetCloseDownMode                       ,<NONE>,                                    'XSetCloseDownMode',                            \
        XSetCommand                             ,<NONE>,                                    'XSetCommand',                                  \
        XSetDashes                              ,<NONE>,                                    'XSetDashes',                                   \
        XSetErrorHandler                        ,<NONE>,                                    'XSetErrorHandler',                             \
        XSetFillRule                            ,<NONE>,                                    'XSetFillRule',                                 \
        XSetFillStyle                           ,<NONE>,                                    'XSetFillStyle',                                \
        XSetFont                                ,<NONE>,                                    'XSetFont',                                     \
        XSetFontPath                            ,<NONE>,                                    'XSetFontPath',                                 \
        XSetForeground                          ,<NONE>,                                    'XSetForeground',                               \
        XSetFunction                            ,<NONE>,                                    'XSetFunction',                                 \
        XSetGraphicsExposures                   ,<NONE>,                                    'XSetGraphicsExposures',                        \
        XSetICFocus                             ,<NONE>,                                    'XSetICFocus',                                  \
        XSetICValues                            ,<NONE>,                                    'XSetICValues',                                 \
        XSetIMValues                            ,<NONE>,                                    'XSetIMValues',                                 \
        XSetIOErrorHandler                      ,<NONE>,                                    'XSetIOErrorHandler',                           \
        XSetIconName                            ,<NONE>,                                    'XSetIconName',                                 \
        XSetIconSizes                           ,<NONE>,                                    'XSetIconSizes',                                \
        XSetInputFocus                          ,<NONE>,                                    'XSetInputFocus',                               \
        XSetLineAttributes                      ,<NONE>,                                    'XSetLineAttributes',                           \
        XSetLocaleModifiers                     ,<NONE>,                                    'XSetLocaleModifiers',                          \
        XSetModifierMapping                     ,<NONE>,                                    'XSetModifierMapping',                          \
        XSetNormalHints                         ,<NONE>,                                    'XSetNormalHints',                              \
        XSetOCValues                            ,<NONE>,                                    'XSetOCValues',                                 \
        XSetOMValues                            ,<NONE>,                                    'XSetOMValues',                                 \
        XSetPlaneMask                           ,<NONE>,                                    'XSetPlaneMask',                                \
        XSetPointerMapping                      ,<NONE>,                                    'XSetPointerMapping',                           \
        XSetRGBColormaps                        ,<NONE>,                                    'XSetRGBColormaps',                             \
        XSetRegion                              ,<NONE>,                                    'XSetRegion',                                   \
        XSetScreenSaver                         ,<NONE>,                                    'XSetScreenSaver',                              \
        XSetSelectionOwner                      ,<.display, .selection, .owner, .time>,     'XSetSelectionOwner',                           \
        XSetSizeHints                           ,<NONE>,                                    'XSetSizeHints',                                \
        XSetStandardColormap                    ,<NONE>,                                    'XSetStandardColormap',                         \
        XSetStandardProperties                  ,<NONE>,                                    'XSetStandardProperties',                       \
        XSetState                               ,<NONE>,                                    'XSetState',                                    \
        XSetStipple                             ,<NONE>,                                    'XSetStipple',                                  \
        XSetSubwindowMode                       ,<NONE>,                                    'XSetSubwindowMode',                            \
        XSetTSOrigin                            ,<NONE>,                                    'XSetTSOrigin',                                 \
        XSetTextProperty                        ,<NONE>,                                    'XSetTextProperty',                             \
        XSetTile                                ,<NONE>,                                    'XSetTile',                                     \
        XSetTransientForHint                    ,<NONE>,                                    'XSetTransientForHint',                         \
        XSetWMClientMachine                     ,<NONE>,                                    'XSetWMClientMachine',                          \
        XSetWMColormapWindows                   ,<NONE>,                                    'XSetWMColormapWindows',                        \
        XSetWMHints                             ,<NONE>,                                    'XSetWMHints',                                  \
        XSetWMIconName                          ,<NONE>,                                    'XSetWMIconName',                               \
        XSetWMName                              ,<NONE>,                                    'XSetWMName',                                   \
        XSetWMNormalHints                       ,<NONE>,                                    'XSetWMNormalHints',                            \
        XSetWMProperties                        ,<NONE>,                                    'XSetWMProperties',                             \
        XSetWMProtocols                         ,<NONE>,                                    'XSetWMProtocols',                              \
        XSetWMSizeHints                         ,<NONE>,                                    'XSetWMSizeHints',                              \
        XSetWindowBackground                    ,<NONE>,                                    'XSetWindowBackground',                         \
        XSetWindowBackgroundPixmap              ,<NONE>,                                    'XSetWindowBackgroundPixmap',                   \
        XSetWindowBorder                        ,<NONE>,                                    'XSetWindowBorder',                             \
        XSetWindowBorderPixmap                  ,<NONE>,                                    'XSetWindowBorderPixmap',                       \
        XSetWindowBorderWidth                   ,<NONE>,                                    'XSetWindowBorderWidth',                        \
        XSetWindowColormap                      ,<NONE>,                                    'XSetWindowColormap',                           \
        XSetZoomHints                           ,<NONE>,                                    'XSetZoomHints',                                \
        XShrinkRegion                           ,<NONE>,                                    'XShrinkRegion',                                \
        XStoreBuffer                            ,<NONE>,                                    'XStoreBuffer',                                 \
        XStoreBytes                             ,<NONE>,                                    'XStoreBytes',                                  \
        XStoreColor                             ,<NONE>,                                    'XStoreColor',                                  \
        XStoreColors                            ,<NONE>,                                    'XStoreColors',                                 \
        XStoreName                              ,<NONE>,                                    'XStoreName',                                   \
        XStoreNamedColor                        ,<NONE>,                                    'XStoreNamedColor',                             \
        XStringListToTextProperty               ,<NONE>,                                    'XStringListToTextProperty',                    \
        XStringToKeysym                         ,<.string>,                                 'XStringToKeysym',                              \
        XSubImage                               ,<NONE>,                                    'XSubImage',                                    \
        XSubtractRegion                         ,<NONE>,                                    'XSubtractRegion',                              \
        XSupportsLocale                         ,<NONE>,                                    'XSupportsLocale',                              \
        XSync                                   ,<NONE>,                                    'XSync',                                        \
        XSynchronize                            ,<NONE>,                                    'XSynchronize',                                 \
        XTextExtents                            ,<NONE>,                                    'XTextExtents',                                 \
        XTextExtents16                          ,<NONE>,                                    'XTextExtents16',                               \
        XTextPropertyToStringList               ,<NONE>,                                    'XTextPropertyToStringList',                    \
        XTextWidth                              ,<NONE>,                                    'XTextWidth',                                   \
        XTextWidth16                            ,<NONE>,                                    'XTextWidth16',                                 \
        XTranslateCoordinates                   ,<NONE>,                                    'XTranslateCoordinates',                        \
        XUndefineCursor                         ,<NONE>,                                    'XUndefineCursor',                              \
        XUngrabButton                           ,<NONE>,                                    'XUngrabButton',                                \
        XUngrabKey                              ,<NONE>,                                    'XUngrabKey',                                   \
        XUngrabKeyboard                         ,<NONE>,                                    'XUngrabKeyboard',                              \
        XUngrabPointer                          ,<NONE>,                                    'XUngrabPointer',                               \
        XUngrabServer                           ,<NONE>,                                    'XUngrabServer',                                \
        XUninstallColormap                      ,<NONE>,                                    'XUninstallColormap',                           \
        XUnionRectWithRegion                    ,<NONE>,                                    'XUnionRectWithRegion',                         \
        XUnionRegion                            ,<NONE>,                                    'XUnionRegion',                                 \
        XUnloadFont                             ,<NONE>,                                    'XUnloadFont',                                  \
        XUnlockDisplay                          ,<NONE>,                                    'XUnlockDisplay',                               \
        XUnmapSubwindows                        ,<NONE>,                                    'XUnmapSubwindows',                             \
        XUnmapWindow                            ,<NONE>,                                    'XUnmapWindow',                                 \
        XUnregisterIMInstantiateCallback        ,<NONE>,                                    'XUnregisterIMInstantiateCallback',             \
        XUnsetICFocus                           ,<NONE>,                                    'XUnsetICFocus',                                \
        XVaCreateNestedList                     ,<NONE>,                                    'XVaCreateNestedList',                          \
        XVendorRelease                          ,<NONE>,                                    'XVendorRelease',                               \
        XVisualIDFromVisual                     ,<NONE>,                                    'XVisualIDFromVisual',                          \
        XWMGeometry                             ,<NONE>,                                    'XWMGeometry',                                  \
        XWarpPointer                            ,<.display, .srcWnd, .dstWnd, .srcX, .srcY, .srcW, .srcH, .dstX, .dstY>,  'XWarpPointer',               \
        XWhitePixel                             ,<NONE>,                                    'XWhitePixel',                                  \
        XWhitePixelOfScreen                     ,<NONE>,                                    'XWhitePixelOfScreen',                          \
        XWidthMMOfScreen                        ,<NONE>,                                    'XWidthMMOfScreen',                             \
        XWidthOfScreen                          ,<NONE>,                                    'XWidthOfScreen',                               \
        XWindowEvent                            ,<.display, .hwin, .event_mask, .pEvent>,   'XWindowEvent',                                 \
        XWithdrawWindow                         ,<NONE>,                                    'XWithdrawWindow',                              \
        XWriteBitmapFile                        ,<NONE>,                                    'XWriteBitmapFile',                             \
        XXorRegion                              ,<NONE>,                                    'XXorRegion',                                   \
        XcmsAddColorSpace                       ,<NONE>,                                    'XcmsAddColorSpace',                            \
        XcmsAddFunctionSet                      ,<NONE>,                                    'XcmsAddFunctionSet',                           \
        XcmsAllocColor                          ,<NONE>,                                    'XcmsAllocColor',                               \
        XcmsAllocNamedColor                     ,<NONE>,                                    'XcmsAllocNamedColor',                          \
        XcmsCCCOfColormap                       ,<NONE>,                                    'XcmsCCCOfColormap',                            \
        XcmsCIELabClipL                         ,<NONE>,                                    'XcmsCIELabClipL',                              \
        XcmsCIELabClipLab                       ,<NONE>,                                    'XcmsCIELabClipLab',                            \
        XcmsCIELabClipab                        ,<NONE>,                                    'XcmsCIELabClipab',                             \
        XcmsCIELabColorSpace                    ,<NONE>,                                    'XcmsCIELabColorSpace',                         \
        XcmsCIELabQueryMaxC                     ,<NONE>,                                    'XcmsCIELabQueryMaxC',                          \
        XcmsCIELabQueryMaxL                     ,<NONE>,                                    'XcmsCIELabQueryMaxL',                          \
        XcmsCIELabQueryMaxLC                    ,<NONE>,                                    'XcmsCIELabQueryMaxLC',                         \
        XcmsCIELabQueryMinL                     ,<NONE>,                                    'XcmsCIELabQueryMinL',                          \
        XcmsCIELabToCIEXYZ                      ,<NONE>,                                    'XcmsCIELabToCIEXYZ',                           \
        XcmsCIELabWhiteShiftColors              ,<NONE>,                                    'XcmsCIELabWhiteShiftColors',                   \
        XcmsCIELuvClipL                         ,<NONE>,                                    'XcmsCIELuvClipL',                              \
        XcmsCIELuvClipLuv                       ,<NONE>,                                    'XcmsCIELuvClipLuv',                            \
        XcmsCIELuvClipuv                        ,<NONE>,                                    'XcmsCIELuvClipuv',                             \
        XcmsCIELuvColorSpace                    ,<NONE>,                                    'XcmsCIELuvColorSpace',                         \
        XcmsCIELuvQueryMaxC                     ,<NONE>,                                    'XcmsCIELuvQueryMaxC',                          \
        XcmsCIELuvQueryMaxL                     ,<NONE>,                                    'XcmsCIELuvQueryMaxL',                          \
        XcmsCIELuvQueryMaxLC                    ,<NONE>,                                    'XcmsCIELuvQueryMaxLC',                         \
        XcmsCIELuvQueryMinL                     ,<NONE>,                                    'XcmsCIELuvQueryMinL',                          \
        XcmsCIELuvToCIEuvY                      ,<NONE>,                                    'XcmsCIELuvToCIEuvY',                           \
        XcmsCIELuvWhiteShiftColors              ,<NONE>,                                    'XcmsCIELuvWhiteShiftColors',                   \
        XcmsCIEXYZColorSpace                    ,<NONE>,                                    'XcmsCIEXYZColorSpace',                         \
        XcmsCIEXYZToCIELab                      ,<NONE>,                                    'XcmsCIEXYZToCIELab',                           \
        XcmsCIEXYZToCIEuvY                      ,<NONE>,                                    'XcmsCIEXYZToCIEuvY',                           \
        XcmsCIEXYZToCIExyY                      ,<NONE>,                                    'XcmsCIEXYZToCIExyY',                           \
        XcmsCIEXYZToRGBi                        ,<NONE>,                                    'XcmsCIEXYZToRGBi',                             \
        XcmsCIEuvYColorSpace                    ,<NONE>,                                    'XcmsCIEuvYColorSpace',                         \
        XcmsCIEuvYToCIELuv                      ,<NONE>,                                    'XcmsCIEuvYToCIELuv',                           \
        XcmsCIEuvYToCIEXYZ                      ,<NONE>,                                    'XcmsCIEuvYToCIEXYZ',                           \
        XcmsCIEuvYToTekHVC                      ,<NONE>,                                    'XcmsCIEuvYToTekHVC',                           \
        XcmsCIExyYColorSpace                    ,<NONE>,                                    'XcmsCIExyYColorSpace',                         \
        XcmsCIExyYToCIEXYZ                      ,<NONE>,                                    'XcmsCIExyYToCIEXYZ',                           \
        XcmsClientWhitePointOfCCC               ,<NONE>,                                    'XcmsClientWhitePointOfCCC',                    \
        XcmsConvertColors                       ,<NONE>,                                    'XcmsConvertColors',                            \
        XcmsCreateCCC                           ,<NONE>,                                    'XcmsCreateCCC',                                \
        XcmsDefaultCCC                          ,<NONE>,                                    'XcmsDefaultCCC',                               \
        XcmsDisplayOfCCC                        ,<NONE>,                                    'XcmsDisplayOfCCC',                             \
        XcmsFormatOfPrefix                      ,<NONE>,                                    'XcmsFormatOfPrefix',                           \
        XcmsFreeCCC                             ,<NONE>,                                    'XcmsFreeCCC',                                  \
        XcmsLinearRGBFunctionSet                ,<NONE>,                                    'XcmsLinearRGBFunctionSet',                     \
        XcmsLookupColor                         ,<NONE>,                                    'XcmsLookupColor',                              \
        XcmsPrefixOfFormat                      ,<NONE>,                                    'XcmsPrefixOfFormat',                           \
        XcmsQueryBlack                          ,<NONE>,                                    'XcmsQueryBlack',                               \
        XcmsQueryBlue                           ,<NONE>,                                    'XcmsQueryBlue',                                \
        XcmsQueryColor                          ,<NONE>,                                    'XcmsQueryColor',                               \
        XcmsQueryColors                         ,<NONE>,                                    'XcmsQueryColors',                              \
        XcmsQueryGreen                          ,<NONE>,                                    'XcmsQueryGreen',                               \
        XcmsQueryRed                            ,<NONE>,                                    'XcmsQueryRed',                                 \
        XcmsQueryWhite                          ,<NONE>,                                    'XcmsQueryWhite',                               \
        XcmsRGBColorSpace                       ,<NONE>,                                    'XcmsRGBColorSpace',                            \
        XcmsRGBToRGBi                           ,<NONE>,                                    'XcmsRGBToRGBi',                                \
        XcmsRGBiColorSpace                      ,<NONE>,                                    'XcmsRGBiColorSpace',                           \
        XcmsRGBiToCIEXYZ                        ,<NONE>,                                    'XcmsRGBiToCIEXYZ',                             \
        XcmsRGBiToRGB                           ,<NONE>,                                    'XcmsRGBiToRGB',                                \
        XcmsScreenNumberOfCCC                   ,<NONE>,                                    'XcmsScreenNumberOfCCC',                        \
        XcmsScreenWhitePointOfCCC               ,<NONE>,                                    'XcmsScreenWhitePointOfCCC',                    \
        XcmsSetCCCOfColormap                    ,<NONE>,                                    'XcmsSetCCCOfColormap',                         \
        XcmsSetCompressionProc                  ,<NONE>,                                    'XcmsSetCompressionProc',                       \
        XcmsSetWhiteAdjustProc                  ,<NONE>,                                    'XcmsSetWhiteAdjustProc',                       \
        XcmsSetWhitePoint                       ,<NONE>,                                    'XcmsSetWhitePoint',                            \
        XcmsStoreColor                          ,<NONE>,                                    'XcmsStoreColor',                               \
        XcmsStoreColors                         ,<NONE>,                                    'XcmsStoreColors',                              \
        XcmsTekHVCClipC                         ,<NONE>,                                    'XcmsTekHVCClipC',                              \
        XcmsTekHVCClipV                         ,<NONE>,                                    'XcmsTekHVCClipV',                              \
        XcmsTekHVCClipVC                        ,<NONE>,                                    'XcmsTekHVCClipVC',                             \
        XcmsTekHVCColorSpace                    ,<NONE>,                                    'XcmsTekHVCColorSpace',                         \
        XcmsTekHVCQueryMaxC                     ,<NONE>,                                    'XcmsTekHVCQueryMaxC',                          \
        XcmsTekHVCQueryMaxV                     ,<NONE>,                                    'XcmsTekHVCQueryMaxV',                          \
        XcmsTekHVCQueryMaxVC                    ,<NONE>,                                    'XcmsTekHVCQueryMaxVC',                         \
        XcmsTekHVCQueryMaxVSamples              ,<NONE>,                                    'XcmsTekHVCQueryMaxVSamples',                   \
        XcmsTekHVCQueryMinV                     ,<NONE>,                                    'XcmsTekHVCQueryMinV',                          \
        XcmsTekHVCToCIEuvY                      ,<NONE>,                                    'XcmsTekHVCToCIEuvY',                           \
        XcmsTekHVCWhiteShiftColors              ,<NONE>,                                    'XcmsTekHVCWhiteShiftColors',                   \
        XcmsUNDEFINEDColorSpace                 ,<NONE>,                                    'XcmsUNDEFINEDColorSpace',                      \
        XcmsVisualOfCCC                         ,<NONE>,                                    'XcmsVisualOfCCC',                              \
        XkbAddDeviceLedInfo                     ,<NONE>,                                    'XkbAddDeviceLedInfo',                          \
        XkbAddGeomColor                         ,<NONE>,                                    'XkbAddGeomColor',                              \
        XkbAddGeomDoodad                        ,<NONE>,                                    'XkbAddGeomDoodad',                             \
        XkbAddGeomKey                           ,<NONE>,                                    'XkbAddGeomKey',                                \
        XkbAddGeomKeyAlias                      ,<NONE>,                                    'XkbAddGeomKeyAlias',                           \
        XkbAddGeomOutline                       ,<NONE>,                                    'XkbAddGeomOutline',                            \
        XkbAddGeomOverlay                       ,<NONE>,                                    'XkbAddGeomOverlay',                            \
        XkbAddGeomOverlayKey                    ,<NONE>,                                    'XkbAddGeomOverlayKey',                         \
        XkbAddGeomOverlayRow                    ,<NONE>,                                    'XkbAddGeomOverlayRow',                         \
        XkbAddGeomProperty                      ,<NONE>,                                    'XkbAddGeomProperty',                           \
        XkbAddGeomRow                           ,<NONE>,                                    'XkbAddGeomRow',                                \
        XkbAddGeomSection                       ,<NONE>,                                    'XkbAddGeomSection',                            \
        XkbAddGeomShape                         ,<NONE>,                                    'XkbAddGeomShape',                              \
        XkbAddKeyType                           ,<NONE>,                                    'XkbAddKeyType',                                \
        XkbAllocClientMap                       ,<NONE>,                                    'XkbAllocClientMap',                            \
        XkbAllocCompatMap                       ,<NONE>,                                    'XkbAllocCompatMap',                            \
        XkbAllocControls                        ,<NONE>,                                    'XkbAllocControls',                             \
        XkbAllocDeviceInfo                      ,<NONE>,                                    'XkbAllocDeviceInfo',                           \
        XkbAllocGeomColors                      ,<NONE>,                                    'XkbAllocGeomColors',                           \
        XkbAllocGeomDoodads                     ,<NONE>,                                    'XkbAllocGeomDoodads',                          \
        XkbAllocGeomKeyAliases                  ,<NONE>,                                    'XkbAllocGeomKeyAliases',                       \
        XkbAllocGeomKeys                        ,<NONE>,                                    'XkbAllocGeomKeys',                             \
        XkbAllocGeomOutlines                    ,<NONE>,                                    'XkbAllocGeomOutlines',                         \
        XkbAllocGeomOverlayKeys                 ,<NONE>,                                    'XkbAllocGeomOverlayKeys',                      \
        XkbAllocGeomOverlayRows                 ,<NONE>,                                    'XkbAllocGeomOverlayRows',                      \
        XkbAllocGeomOverlays                    ,<NONE>,                                    'XkbAllocGeomOverlays',                         \
        XkbAllocGeomPoints                      ,<NONE>,                                    'XkbAllocGeomPoints',                           \
        XkbAllocGeomProps                       ,<NONE>,                                    'XkbAllocGeomProps',                            \
        XkbAllocGeomRows                        ,<NONE>,                                    'XkbAllocGeomRows',                             \
        XkbAllocGeomSectionDoodads              ,<NONE>,                                    'XkbAllocGeomSectionDoodads',                   \
        XkbAllocGeomSections                    ,<NONE>,                                    'XkbAllocGeomSections',                         \
        XkbAllocGeomShapes                      ,<NONE>,                                    'XkbAllocGeomShapes',                           \
        XkbAllocGeometry                        ,<NONE>,                                    'XkbAllocGeometry',                             \
        XkbAllocIndicatorMaps                   ,<NONE>,                                    'XkbAllocIndicatorMaps',                        \
        XkbAllocKeyboard                        ,<NONE>,                                    'XkbAllocKeyboard',                             \
        XkbAllocNames                           ,<NONE>,                                    'XkbAllocNames',                                \
        XkbAllocServerMap                       ,<NONE>,                                    'XkbAllocServerMap',                            \
        XkbApplyCompatMapToKey                  ,<NONE>,                                    'XkbApplyCompatMapToKey',                       \
        XkbApplyVirtualModChanges               ,<NONE>,                                    'XkbApplyVirtualModChanges',                    \
        XkbBell                                 ,<NONE>,                                    'XkbBell',                                      \
        XkbBellEvent                            ,<NONE>,                                    'XkbBellEvent',                                 \
        XkbChangeDeviceInfo                     ,<NONE>,                                    'XkbChangeDeviceInfo',                          \
        XkbChangeEnabledControls                ,<NONE>,                                    'XkbChangeEnabledControls',                     \
        XkbChangeKeycodeRange                   ,<NONE>,                                    'XkbChangeKeycodeRange',                        \
        XkbChangeMap                            ,<NONE>,                                    'XkbChangeMap',                                 \
        XkbChangeNames                          ,<NONE>,                                    'XkbChangeNames',                               \
        XkbChangeTypesOfKey                     ,<NONE>,                                    'XkbChangeTypesOfKey',                          \
        XkbComputeEffectiveMap                  ,<NONE>,                                    'XkbComputeEffectiveMap',                       \
        XkbComputeRowBounds                     ,<NONE>,                                    'XkbComputeRowBounds',                          \
        XkbComputeSectionBounds                 ,<NONE>,                                    'XkbComputeSectionBounds',                      \
        XkbComputeShapeBounds                   ,<NONE>,                                    'XkbComputeShapeBounds',                        \
        XkbComputeShapeTop                      ,<NONE>,                                    'XkbComputeShapeTop',                           \
        XkbCopyKeyType                          ,<NONE>,                                    'XkbCopyKeyType',                               \
        XkbCopyKeyTypes                         ,<NONE>,                                    'XkbCopyKeyTypes',                              \
        XkbDeviceBell                           ,<NONE>,                                    'XkbDeviceBell',                                \
        XkbDeviceBellEvent                      ,<NONE>,                                    'XkbDeviceBellEvent',                           \
        XkbFindOverlayForKey                    ,<NONE>,                                    'XkbFindOverlayForKey',                         \
        XkbForceBell                            ,<NONE>,                                    'XkbForceBell',                                 \
        XkbForceDeviceBell                      ,<NONE>,                                    'XkbForceDeviceBell',                           \
        XkbFreeClientMap                        ,<NONE>,                                    'XkbFreeClientMap',                             \
        XkbFreeCompatMap                        ,<NONE>,                                    'XkbFreeCompatMap',                             \
        XkbFreeComponentList                    ,<NONE>,                                    'XkbFreeComponentList',                         \
        XkbFreeControls                         ,<NONE>,                                    'XkbFreeControls',                              \
        XkbFreeDeviceInfo                       ,<NONE>,                                    'XkbFreeDeviceInfo',                            \
        XkbFreeGeomColors                       ,<NONE>,                                    'XkbFreeGeomColors',                            \
        XkbFreeGeomDoodads                      ,<NONE>,                                    'XkbFreeGeomDoodads',                           \
        XkbFreeGeomKeyAliases                   ,<NONE>,                                    'XkbFreeGeomKeyAliases',                        \
        XkbFreeGeomKeys                         ,<NONE>,                                    'XkbFreeGeomKeys',                              \
        XkbFreeGeomOutlines                     ,<NONE>,                                    'XkbFreeGeomOutlines',                          \
        XkbFreeGeomOverlayKeys                  ,<NONE>,                                    'XkbFreeGeomOverlayKeys',                       \
        XkbFreeGeomOverlayRows                  ,<NONE>,                                    'XkbFreeGeomOverlayRows',                       \
        XkbFreeGeomOverlays                     ,<NONE>,                                    'XkbFreeGeomOverlays',                          \
        XkbFreeGeomPoints                       ,<NONE>,                                    'XkbFreeGeomPoints',                            \
        XkbFreeGeomProperties                   ,<NONE>,                                    'XkbFreeGeomProperties',                        \
        XkbFreeGeomRows                         ,<NONE>,                                    'XkbFreeGeomRows',                              \
        XkbFreeGeomSections                     ,<NONE>,                                    'XkbFreeGeomSections',                          \
        XkbFreeGeomShapes                       ,<NONE>,                                    'XkbFreeGeomShapes',                            \
        XkbFreeGeometry                         ,<NONE>,                                    'XkbFreeGeometry',                              \
        XkbFreeIndicatorMaps                    ,<NONE>,                                    'XkbFreeIndicatorMaps',                         \
        XkbFreeKeyboard                         ,<NONE>,                                    'XkbFreeKeyboard',                              \
        XkbFreeNames                            ,<NONE>,                                    'XkbFreeNames',                                 \
        XkbFreeServerMap                        ,<NONE>,                                    'XkbFreeServerMap',                             \
        XkbGetAutoRepeatRate                    ,<NONE>,                                    'XkbGetAutoRepeatRate',                         \
        XkbGetAutoResetControls                 ,<NONE>,                                    'XkbGetAutoResetControls',                      \
        XkbGetCompatMap                         ,<NONE>,                                    'XkbGetCompatMap',                              \
        XkbGetControls                          ,<NONE>,                                    'XkbGetControls',                               \
        XkbGetDetectableAutoRepeat              ,<NONE>,                                    'XkbGetDetectableAutoRepeat',                   \
        XkbGetDeviceButtonActions               ,<NONE>,                                    'XkbGetDeviceButtonActions',                    \
        XkbGetDeviceInfo                        ,<NONE>,                                    'XkbGetDeviceInfo',                             \
        XkbGetDeviceInfoChanges                 ,<NONE>,                                    'XkbGetDeviceInfoChanges',                      \
        XkbGetDeviceLedInfo                     ,<NONE>,                                    'XkbGetDeviceLedInfo',                          \
        XkbGetGeometry                          ,<NONE>,                                    'XkbGetGeometry',                               \
        XkbGetIndicatorMap                      ,<NONE>,                                    'XkbGetIndicatorMap',                           \
        XkbGetIndicatorState                    ,<NONE>,                                    'XkbGetIndicatorState',                         \
        XkbGetKeyActions                        ,<NONE>,                                    'XkbGetKeyActions',                             \
        XkbGetKeyBehaviors                      ,<NONE>,                                    'XkbGetKeyBehaviors',                           \
        XkbGetKeyExplicitComponents             ,<NONE>,                                    'XkbGetKeyExplicitComponents',                  \
        XkbGetKeyModifierMap                    ,<NONE>,                                    'XkbGetKeyModifierMap',                         \
        XkbGetKeySyms                           ,<NONE>,                                    'XkbGetKeySyms',                                \
        XkbGetKeyTypes                          ,<NONE>,                                    'XkbGetKeyTypes',                               \
        XkbGetKeyVirtualModMap                  ,<NONE>,                                    'XkbGetKeyVirtualModMap',                       \
        XkbGetKeyboard                          ,<NONE>,                                    'XkbGetKeyboard',                               \
        XkbGetKeyboardByName                    ,<NONE>,                                    'XkbGetKeyboardByName',                         \
        XkbGetMap                               ,<NONE>,                                    'XkbGetMap',                                    \
        XkbGetMapChanges                        ,<NONE>,                                    'XkbGetMapChanges',                             \
        XkbGetNamedDeviceIndicator              ,<NONE>,                                    'XkbGetNamedDeviceIndicator',                   \
        XkbGetNamedGeometry                     ,<NONE>,                                    'XkbGetNamedGeometry',                          \
        XkbGetNamedIndicator                    ,<NONE>,                                    'XkbGetNamedIndicator',                         \
        XkbGetNames                             ,<NONE>,                                    'XkbGetNames',                                  \
        XkbGetPerClientControls                 ,<NONE>,                                    'XkbGetPerClientControls',                      \
        XkbGetState                             ,<NONE>,                                    'XkbGetState',                                  \
        XkbGetUpdatedMap                        ,<NONE>,                                    'XkbGetUpdatedMap',                             \
        XkbGetVirtualMods                       ,<NONE>,                                    'XkbGetVirtualMods',                            \
        XkbGetXlibControls                      ,<NONE>,                                    'XkbGetXlibControls',                           \
        XkbIgnoreExtension                      ,<NONE>,                                    'XkbIgnoreExtension',                           \
        XkbInitCanonicalKeyTypes                ,<NONE>,                                    'XkbInitCanonicalKeyTypes',                     \
        XkbKeyTypesForCoreSymbols               ,<NONE>,                                    'XkbKeyTypesForCoreSymbols',                    \
        XkbKeycodeToKeysym                      ,<NONE>,                                    'XkbKeycodeToKeysym',                           \
        XkbKeysymToModifiers                    ,<NONE>,                                    'XkbKeysymToModifiers',                         \
        XkbLatchGroup                           ,<NONE>,                                    'XkbLatchGroup',                                \
        XkbLatchModifiers                       ,<NONE>,                                    'XkbLatchModifiers',                            \
        XkbLibraryVersion                       ,<NONE>,                                    'XkbLibraryVersion',                            \
        XkbListComponents                       ,<NONE>,                                    'XkbListComponents',                            \
        XkbLockGroup                            ,<NONE>,                                    'XkbLockGroup',                                 \
        XkbLockModifiers                        ,<NONE>,                                    'XkbLockModifiers',                             \
        XkbLookupKeyBinding                     ,<NONE>,                                    'XkbLookupKeyBinding',                          \
        XkbLookupKeySym                         ,<NONE>,                                    'XkbLookupKeySym',                              \
        XkbNoteControlsChanges                  ,<NONE>,                                    'XkbNoteControlsChanges',                       \
        XkbNoteDeviceChanges                    ,<NONE>,                                    'XkbNoteDeviceChanges',                         \
        XkbNoteMapChanges                       ,<NONE>,                                    'XkbNoteMapChanges',                            \
        XkbNoteNameChanges                      ,<NONE>,                                    'XkbNoteNameChanges',                           \
        XkbOpenDisplay                          ,<NONE>,                                    'XkbOpenDisplay',                               \
        XkbQueryExtension                       ,<NONE>,                                    'XkbQueryExtension',                            \
        XkbRefreshKeyboardMapping               ,<NONE>,                                    'XkbRefreshKeyboardMapping',                    \
        XkbResizeDeviceButtonActions            ,<NONE>,                                    'XkbResizeDeviceButtonActions',                 \
        XkbResizeKeyActions                     ,<NONE>,                                    'XkbResizeKeyActions',                          \
        XkbResizeKeySyms                        ,<NONE>,                                    'XkbResizeKeySyms',                             \
        XkbResizeKeyType                        ,<NONE>,                                    'XkbResizeKeyType',                             \
        XkbSelectEventDetails                   ,<NONE>,                                    'XkbSelectEventDetails',                        \
        XkbSelectEvents                         ,<NONE>,                                    'XkbSelectEvents',                              \
        XkbSetAtomFuncs                         ,<NONE>,                                    'XkbSetAtomFuncs',                              \
        XkbSetAutoRepeatRate                    ,<NONE>,                                    'XkbSetAutoRepeatRate',                         \
        XkbSetAutoResetControls                 ,<NONE>,                                    'XkbSetAutoResetControls',                      \
        XkbSetCompatMap                         ,<NONE>,                                    'XkbSetCompatMap',                              \
        XkbSetControls                          ,<NONE>,                                    'XkbSetControls',                               \
        XkbSetDebuggingFlags                    ,<NONE>,                                    'XkbSetDebuggingFlags',                         \
        XkbSetDetectableAutoRepeat              ,<NONE>,                                    'XkbSetDetectableAutoRepeat',                   \
        XkbSetDeviceButtonActions               ,<NONE>,                                    'XkbSetDeviceButtonActions',                    \
        XkbSetDeviceInfo                        ,<NONE>,                                    'XkbSetDeviceInfo',                             \
        XkbSetDeviceLedInfo                     ,<NONE>,                                    'XkbSetDeviceLedInfo',                          \
        XkbSetGeometry                          ,<NONE>,                                    'XkbSetGeometry',                               \
        XkbSetIgnoreLockMods                    ,<NONE>,                                    'XkbSetIgnoreLockMods',                         \
        XkbSetIndicatorMap                      ,<NONE>,                                    'XkbSetIndicatorMap',                           \
        XkbSetMap                               ,<NONE>,                                    'XkbSetMap',                                    \
        XkbSetNamedDeviceIndicator              ,<NONE>,                                    'XkbSetNamedDeviceIndicator',                   \
        XkbSetNamedIndicator                    ,<NONE>,                                    'XkbSetNamedIndicator',                         \
        XkbSetNames                             ,<NONE>,                                    'XkbSetNames',                                  \
        XkbSetPerClientControls                 ,<NONE>,                                    'XkbSetPerClientControls',                      \
        XkbSetServerInternalMods                ,<NONE>,                                    'XkbSetServerInternalMods',                     \
        XkbSetXlibControls                      ,<NONE>,                                    'XkbSetXlibControls',                           \
        XkbToControl                            ,<NONE>,                                    'XkbToControl',                                 \
        XkbTranslateKey                         ,<NONE>,                                    'XkbTranslateKey',                              \
        XkbTranslateKeyCode                     ,<NONE>,                                    'XkbTranslateKeyCode',                          \
        XkbTranslateKeySym                      ,<NONE>,                                    'XkbTranslateKeySym',                           \
        XkbUpdateActionVirtualMods              ,<NONE>,                                    'XkbUpdateActionVirtualMods',                   \
        XkbUpdateKeyTypeVirtualMods             ,<NONE>,                                    'XkbUpdateKeyTypeVirtualMods',                  \
        XkbUpdateMapFromCore                    ,<NONE>,                                    'XkbUpdateMapFromCore',                         \
        XkbUseExtension                         ,<NONE>,                                    'XkbUseExtension',                              \
        XkbVirtualModsToReal                    ,<NONE>,                                    'XkbVirtualModsToReal',                         \
        XkbXlibControlsImplemented              ,<NONE>,                                    'XkbXlibControlsImplemented',                   \
        XmbDrawImageString                      ,<NONE>,                                    'XmbDrawImageString',                           \
        XmbDrawString                           ,<NONE>,                                    'XmbDrawString',                                \
        XmbDrawText                             ,<NONE>,                                    'XmbDrawText',                                  \
        XmbLookupString                         ,<NONE>,                                    'XmbLookupString',                              \
        XmbResetIC                              ,<NONE>,                                    'XmbResetIC',                                   \
        XmbSetWMProperties                      ,<NONE>,                                    'XmbSetWMProperties',                           \
        XmbTextEscapement                       ,<NONE>,                                    'XmbTextEscapement',                            \
        XmbTextExtents                          ,<NONE>,                                    'XmbTextExtents',                               \
        XmbTextListToTextProperty               ,<NONE>,                                    'XmbTextListToTextProperty',                    \
        XmbTextPerCharExtents                   ,<NONE>,                                    'XmbTextPerCharExtents',                        \
        XmbTextPropertyToTextList               ,<NONE>,                                    'XmbTextPropertyToTextList',                    \
        Xpermalloc                              ,<NONE>,                                    'Xpermalloc',                                   \
        XrmCombineDatabase                      ,<NONE>,                                    'XrmCombineDatabase',                           \
        XrmCombineFileDatabase                  ,<NONE>,                                    'XrmCombineFileDatabase',                       \
        XrmDestroyDatabase                      ,<NONE>,                                    'XrmDestroyDatabase',                           \
        XrmEnumerateDatabase                    ,<NONE>,                                    'XrmEnumerateDatabase',                         \
        XrmGetDatabase                          ,<NONE>,                                    'XrmGetDatabase',                               \
        XrmGetFileDatabase                      ,<NONE>,                                    'XrmGetFileDatabase',                           \
        XrmGetResource                          ,<NONE>,                                    'XrmGetResource',                               \
        XrmGetStringDatabase                    ,<NONE>,                                    'XrmGetStringDatabase',                         \
        XrmInitialize                           ,<NONE>,                                    'XrmInitialize',                                \
        XrmLocaleOfDatabase                     ,<NONE>,                                    'XrmLocaleOfDatabase',                          \
        XrmMergeDatabases                       ,<NONE>,                                    'XrmMergeDatabases',                            \
        XrmParseCommand                         ,<NONE>,                                    'XrmParseCommand',                              \
        XrmPermStringToQuark                    ,<NONE>,                                    'XrmPermStringToQuark',                         \
        XrmPutFileDatabase                      ,<NONE>,                                    'XrmPutFileDatabase',                           \
        XrmPutLineResource                      ,<NONE>,                                    'XrmPutLineResource',                           \
        XrmPutResource                          ,<NONE>,                                    'XrmPutResource',                               \
        XrmPutStringResource                    ,<NONE>,                                    'XrmPutStringResource',                         \
        XrmQGetResource                         ,<NONE>,                                    'XrmQGetResource',                              \
        XrmQGetSearchList                       ,<NONE>,                                    'XrmQGetSearchList',                            \
        XrmQGetSearchResource                   ,<NONE>,                                    'XrmQGetSearchResource',                        \
        XrmQPutResource                         ,<NONE>,                                    'XrmQPutResource',                              \
        XrmQPutStringResource                   ,<NONE>,                                    'XrmQPutStringResource',                        \
        XrmQuarkToString                        ,<NONE>,                                    'XrmQuarkToString',                             \
        XrmSetDatabase                          ,<NONE>,                                    'XrmSetDatabase',                               \
        XrmStringToBindingQuarkList             ,<NONE>,                                    'XrmStringToBindingQuarkList',                  \
        XrmStringToQuark                        ,<NONE>,                                    'XrmStringToQuark',                             \
        XrmStringToQuarkList                    ,<NONE>,                                    'XrmStringToQuarkList',                         \
        XrmUniqueQuark                          ,<NONE>,                                    'XrmUniqueQuark',                               \
        Xutf8DrawImageString                    ,<NONE>,                                    'Xutf8DrawImageString',                         \
        Xutf8DrawString                         ,<NONE>,                                    'Xutf8DrawString',                              \
        Xutf8DrawText                           ,<NONE>,                                    'Xutf8DrawText',                                \
        Xutf8LookupString                       ,<NONE>,                                    'Xutf8LookupString',                            \
        Xutf8ResetIC                            ,<NONE>,                                    'Xutf8ResetIC',                                 \
        Xutf8SetWMProperties                    ,<NONE>,                                    'Xutf8SetWMProperties',                         \
        Xutf8TextEscapement                     ,<NONE>,                                    'Xutf8TextEscapement',                          \
        Xutf8TextExtents                        ,<NONE>,                                    'Xutf8TextExtents',                             \
        Xutf8TextListToTextProperty             ,<NONE>,                                    'Xutf8TextListToTextProperty',                  \
        Xutf8TextPerCharExtents                 ,<NONE>,                                    'Xutf8TextPerCharExtents',                      \
        Xutf8TextPropertyToTextList             ,<NONE>,                                    'Xutf8TextPropertyToTextList',                  \
        XwcDrawImageString                      ,<NONE>,                                    'XwcDrawImageString',                           \
        XwcDrawString                           ,<NONE>,                                    'XwcDrawString',                                \
        XwcDrawText                             ,<NONE>,                                    'XwcDrawText',                                  \
        XwcFreeStringList                       ,<NONE>,                                    'XwcFreeStringList',                            \
        XwcLookupString                         ,<NONE>,                                    'XwcLookupString',                              \
        XwcResetIC                              ,<NONE>,                                    'XwcResetIC',                                   \
        XwcTextEscapement                       ,<NONE>,                                    'XwcTextEscapement',                            \
        XwcTextExtents                          ,<NONE>,                                    'XwcTextExtents',                               \
        XwcTextListToTextProperty               ,<NONE>,                                    'XwcTextListToTextProperty',                    \
        XwcTextPerCharExtents                   ,<NONE>,                                    'XwcTextPerCharExtents',                        \
        XwcTextPropertyToTextList               ,<NONE>,                                    'XwcTextPropertyToTextList',                    \
        XUniqueContext                          ,<NONE>,                                    'XUniqueContext'




Added freshlib/imports/Linux/libXft.inc.





























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: libXft import library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes: Needs editing of the function arguments
;_________________________________________________________________________________________

import_proto  'libXft.so.2',                                    \
    XftCharExists           ,<NONE>, 'XftCharExists',           \
    XftCharFontSpecRender   ,<NONE>, 'XftCharFontSpecRender',   \
    XftCharIndex            ,<NONE>, 'XftCharIndex',            \
    XftCharSpecRender       ,<NONE>, 'XftCharSpecRender',       \
    XftColorAllocName       ,<NONE>, 'XftColorAllocName',       \
    XftColorAllocValue      ,<NONE>, 'XftColorAllocValue',      \
    XftColorFree            ,<NONE>, 'XftColorFree',            \
    XftDefaultHasRender     ,<NONE>, 'XftDefaultHasRender',     \
    XftDefaultSet           ,<NONE>, 'XftDefaultSet',           \
    XftDefaultSubstitute    ,<NONE>, 'XftDefaultSubstitute',    \
    XftDrawChange           ,<NONE>, 'XftDrawChange',           \
    XftDrawCharFontSpec     ,<NONE>, 'XftDrawCharFontSpec',     \
    XftDrawCharSpec         ,<NONE>, 'XftDrawCharSpec',         \
    XftDrawColormap         ,<NONE>, 'XftDrawColormap',         \
    XftDrawCreate           ,<NONE>, 'XftDrawCreate',           \
    XftDrawCreateAlpha      ,<NONE>, 'XftDrawCreateAlpha',      \
    XftDrawCreateBitmap     ,<NONE>, 'XftDrawCreateBitmap',     \
    XftDrawDestroy          ,<NONE>, 'XftDrawDestroy',          \
    XftDrawDisplay          ,<NONE>, 'XftDrawDisplay',          \
    XftDrawDrawable         ,<NONE>, 'XftDrawDrawable',         \
    XftDrawGlyphFontSpec    ,<NONE>, 'XftDrawGlyphFontSpec',    \
    XftDrawGlyphSpec        ,<NONE>, 'XftDrawGlyphSpec',        \
    XftDrawGlyphs           ,<NONE>, 'XftDrawGlyphs',           \
    XftDrawPicture          ,<NONE>, 'XftDrawPicture',          \
    XftDrawRect             ,<NONE>, 'XftDrawRect',             \
    XftDrawSetClip          ,<NONE>, 'XftDrawSetClip',          \
    XftDrawSetClipRectangles,<NONE>, 'XftDrawSetClipRectangles',\
    XftDrawSetSubwindowMode ,<NONE>, 'XftDrawSetSubwindowMode', \
    XftDrawSrcPicture       ,<NONE>, 'XftDrawSrcPicture',       \
    XftDrawString16         ,<NONE>, 'XftDrawString16',         \
    XftDrawString32         ,<NONE>, 'XftDrawString32',         \
    XftDrawString8          ,<NONE>, 'XftDrawString8',          \
    XftDrawStringUtf16      ,<NONE>, 'XftDrawStringUtf16',      \
    XftDrawStringUtf8       ,<NONE>, 'XftDrawStringUtf8',       \
    XftDrawVisual           ,<NONE>, 'XftDrawVisual',           \
    XftFontCheckGlyph       ,<NONE>, 'XftFontCheckGlyph',       \
    XftFontClose            ,<NONE>, 'XftFontClose',            \
    XftFontCopy             ,<NONE>, 'XftFontCopy',             \
    XftFontInfoCreate       ,<NONE>, 'XftFontInfoCreate',       \
    XftFontInfoDestroy      ,<NONE>, 'XftFontInfoDestroy',      \
    XftFontInfoEqual        ,<NONE>, 'XftFontInfoEqual',        \
    XftFontInfoHash         ,<NONE>, 'XftFontInfoHash',         \
    XftFontLoadGlyphs       ,<NONE>, 'XftFontLoadGlyphs',       \
    XftFontMatch            ,<NONE>, 'XftFontMatch',            \
    XftFontOpen             ,<NONE>, 'XftFontOpen',             \
    XftFontOpenInfo         ,<NONE>, 'XftFontOpenInfo',         \
    XftFontOpenName         ,<NONE>, 'XftFontOpenName',         \
    XftFontOpenPattern      ,<NONE>, 'XftFontOpenPattern',      \
    XftFontOpenXlfd         ,<NONE>, 'XftFontOpenXlfd',         \
    XftFontUnloadGlyphs     ,<NONE>, 'XftFontUnloadGlyphs',     \
    XftGetVersion           ,<NONE>, 'XftGetVersion',           \
    XftGlyphExtents         ,<NONE>, 'XftGlyphExtents',         \
    XftGlyphFontSpecRender  ,<NONE>, 'XftGlyphFontSpecRender',  \
    XftGlyphRender          ,<NONE>, 'XftGlyphRender',          \
    XftGlyphSpecRender      ,<NONE>, 'XftGlyphSpecRender',      \
    XftInit                 ,<NONE>, 'XftInit',                 \
    XftInitFtLibrary        ,<NONE>, 'XftInitFtLibrary',        \
    XftListFonts            ,<NONE>, 'XftListFonts',            \
    XftLockFace             ,<NONE>, 'XftLockFace',             \
    XftNameParse            ,<NONE>, 'XftNameParse',            \
    XftNameUnparse          ,<NONE>, 'XftNameUnparse',          \
    XftTextExtents16        ,<NONE>, 'XftTextExtents16',        \
    XftTextExtents32        ,<NONE>, 'XftTextExtents32',        \
    XftTextExtents8         ,<NONE>, 'XftTextExtents8',         \
    XftTextExtentsUtf16     ,<NONE>, 'XftTextExtentsUtf16',     \
    XftTextExtentsUtf8      ,<NONE>, 'XftTextExtentsUtf8',      \
    XftTextRender16         ,<NONE>, 'XftTextRender16',         \
    XftTextRender16BE       ,<NONE>, 'XftTextRender16BE',       \
    XftTextRender16LE       ,<NONE>, 'XftTextRender16LE',       \
    XftTextRender32         ,<NONE>, 'XftTextRender32',         \
    XftTextRender32BE       ,<NONE>, 'XftTextRender32BE',       \
    XftTextRender32LE       ,<NONE>, 'XftTextRender32LE',       \
    XftTextRender8          ,<NONE>, 'XftTextRender8',          \
    XftTextRenderUtf16      ,<NONE>, 'XftTextRenderUtf16',      \
    XftTextRenderUtf8       ,<NONE>, 'XftTextRenderUtf8',       \
    XftUnlockFace           ,<NONE>, 'XftUnlockFace',           \
    XftXlfdParse            ,<NONE>, 'XftXlfdParse'


Added freshlib/imports/Linux/libXrender.inc.































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: libXrender import library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto 'libXrender.so.1',                                                                                                                             \
        XRenderAddGlyphs,                <.display, .glyphset, .gids, .glyphs, .nglyphs, .images, .nbyte_images>,                               'XRenderAddGlyphs',                                                                 \
        XRenderAddTraps,                 <.display, .picture, .xOff, .yOff, .pTraps, .nTraps>,                                                  'XRenderAddTraps',
        XRenderChangePicture,            <.display, .picture, .valuemask, .attributes>,                                                         'XRenderChangePicture',                                                             \
        XRenderComposite,                <.display, .op, .src, .mask, .dst, .src_x, .src_y, .mask_x, .mask_y, .dst_x, .dst_y, .wodth, .height>, 'XRenderComposite',                                                                 \
        XRenderCompositeDoublePoly,      <.display, .op, .src, .dst, .maskFormat, .xSrc, .ySrc, .xDst, .yDst, .fpoints, .npoints, .winding>,    'XRenderCompositeDoublePoly',                                                       \
        XRenderCompositeString16,        <.display, .op, .src, .dst, .maskFormat, .glyphset, .xSrc, .ySrc, .xDst, .yDst, .string, .nchar>,      'XRenderCompositeString16',                                                         \
        XRenderCompositeString32,        <.display, .op, .src, .dst, .maskFormat, .glyphset, .xSrc, .ySrc, .xDst, .yDst, .string, .nchar>,      'XRenderCompositeString32',                                                         \
        XRenderCompositeString8,         <.display, .op, .src, .dst, .maskFormat, .glyphset, .xSrc, .ySrc, .xDst, .yDst, .string, .nchar>,      'XRenderCompositeString8',                                                          \
        XRenderCompositeText16,          <.display, .op, .src, .dst, .maskFormat, .glyphset, .xSrc, .ySrc, .xDst, .yDst, .elts, .nelt>,         'XRenderCompositeText16',                                                           \
        XRenderCompositeText32,          <.display, .op, .src, .dst, .maskFormat, .glyphset, .xSrc, .ySrc, .xDst, .yDst, .elts, .nelt>,         'XRenderCompositeText32',                                                           \
        XRenderCompositeText8,           <.display, .op, .src, .dst, .maskFormat, .glyphset, .xSrc, .ySrc, .xDst, .yDst, .elts, .nelt>,         'XRenderCompositeText8',                                                            \
        XRenderCompositeTrapezoids,      <.display, .op, .src, .dsp, .maskFormat, .xSrc, .ySrc, .traps, .ntrap>,                                'XRenderCompositeTrapezoids',                                                       \
        XRenderCompositeTriFan,          <.display, .op, .src, .dsp, .maskFormat, .xSrc, .ySrc, .points, .npoint>,                              'XRenderCompositeTriFan',                                                           \
        XRenderCompositeTriStrip,        <.display, .op, .src, .dsp, .maskFormat, .xSrc, .ySrc, .points, .npoint>,                              'XRenderCompositeTriStrip',                                                         \
        XRenderCompositeTriangles,       <.display, .op, .src, .dsp, .maskFormat, .xSrc, .ySrc, .triangles, .ntriangles>,                       'XRenderCompositeTriangles',                                                        \
        XRenderCreateAnimCursor,         <.display, .ncursor, .cursors>,                                                                        'XRenderCreateAnimCursor',                                                          \
        XRenderCreateConicalGradient,    <.display, .pGradient, .pStops, .pColors, .nStops>,                                                    'XRenderCreateConicalGradient',                                                     \
        XRenderCreateCursor,             <.display, .source, .x, .y>,                                                                           'XRenderCreateCursor',                                                              \
        XRenderCreateGlyphSet,           <.display, .format>,                                                                                   'XRenderCreateGlyphSet',                                                            \
        XRenderCreateLinearGradient,     <.display, .pGradient, .pStops, .pColors, .nStops>,                                                    'XRenderCreateLinearGradient',                                                      \
        XRenderCreatePicture,            <.display, .Drawable, .format, .valuemask, .attributes>,                                               'XRenderCreatePicture',                                                             \
        XRenderCreateRadialGradient,     <.display, .pGradient, .pStops, .pColors, .nStops>,                                                    'XRenderCreateRadialGradient',                                                      \
        XRenderCreateSolidFill,          <.display, .pColor>,                                                                                   'XRenderCreateSolidFill',                                                           \
        XRenderFillRectangle,            <.display, .op, .dst, .pColor, .x, .y, .width, .height>,                                               'XRenderFillRectangle',                                                             \
        XRenderFillRectangles,           <.display, .op, .dst, .pColor, .pRectangles, .nRectangles>,                                            'XRenderFillRectangles',                                                            \
        XRenderFindDisplay,              <NONE>,                                                                                                'XRenderFindDisplay',                                                               \
        XRenderFindFormat,               <.display, .mask, .templ, .count>,                                                                     'XRenderFindFormat',                                                                \
        XRenderFindStandardFormat,       <.display, .format>,                                                                                   'XRenderFindStandardFormat',                                                        \
        XRenderFindVisualFormat,         <.display, .visual>,                                                                                   'XRenderFindVisualFormat',                                                          \
        XRenderFreeGlyphSet,             <.display, .glyphset>,                                                                                 'XRenderFreeGlyphSet',                                                              \
        XRenderFreeGlyphs,               <.display, .glyphset, .pGids, .nGlyphs>,                                                               'XRenderFreeGlyphs',                                                                \
        XRenderFreePicture,              <.display, .picture>,                                                                                  'XRenderFreePicture',                                                               \
        XRenderParseColor,               <.display, .spec, .def>,                                                                               'XRenderParseColor',                                                                \
        XRenderQueryExtension,           <.display, .event_basep, .error_basep>,                                                                'XRenderQueryExtension',                                                            \
        XRenderQueryFilters,             <.display, .drawable>,                                                                                 'XRenderQueryFilters',                                                              \
        XRenderQueryFormats,             <.display>,                                                                                            'XRenderQueryFormats',                                                              \
        XRenderQueryPictIndexValues,     <.display, .format, .num>,                                                                             'XRenderQueryPictIndexValues',                                                      \
        XRenderQuerySubpixelOrder,       <.display, .screen>,                                                                                   'XRenderQuerySubpixelOrder',                                                        \
        XRenderQueryVersion,             <.display, .major_versionp, .minor_versionp>,                                                          'XRenderQueryVersion',                                                              \
        XRenderReferenceGlyphSet,        <.display, .existing>,                                                                                 'XRenderReferenceGlyphSet',                                                         \
        XRenderSetPictureClipRectangles, <.display, .picture, .xOrigin, .yOrigin, .rects, .n>,                                                  'XRenderSetPictureClipRectangles',                                                  \
        XRenderSetPictureClipRegion,     <.display, .picture, .region>,                                                                         'XRenderSetPictureClipRegion',                                                      \
        XRenderSetPictureFilter,         <.display, .picture, .pFilter, .pParams, .nParams>,                                                    'XRenderSetPictureFilter',                                                          \
        XRenderSetPictureTransform,      <.display, .picture, .pTransform>,                                                                     'XRenderSetPictureTransform',                                                       \
        XRenderSetSubpixelOrder,         <.display, .screen, .subpixel>,                                                                        'XRenderSetSubpixelOrder'


Added freshlib/imports/Linux/libc.inc.



























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: LibC import library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes: Include only small amount of exported functions.
;_________________________________________________________________________________________

import_proto 'libc.so.6',                                                               \ ; LibC
  puts                                    ,<NONE>,                      'puts',         \
  exit                                    ,<.exit_code>,                'exit',         \
  malloc                                  ,<.size>,                     'malloc',       \
  free                                    ,<.ptr>,                      'free',         \
  realloc                                 ,<.ptr, .newsize>,            'realloc',      \
  stime                                   ,<NONE>,                      'stime',        \
  strerror_r                              ,<.errnum, .pBuff, .BufLen>,  'strerror_r',   \
  shmget                                  ,<.key, .size, .flags>,       'shmget',       \
  shmat                                   ,<.shmid, .addr, .flags>,     'shmat',        \
  shmdt                                   ,<.addr>,                     'shmdt',        \
  shmctl                                  ,<.shmid, .cmd, .shmid_ds>,   'shmctl',       \
  getaddrinfo                             ,<.pHostName, .pService, .pHints, .pVarResult>, 'getaddrinfo',        \
  freeaddrinfo                            ,<.pAddrInfo>,                                  'freeaddrinfo',       \
  crypt                                   ,<.pKey, .pSalt>,             'crypt'

Added freshlib/imports/Linux/libdl.inc.









































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: LibC import library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes: Include only small amount of exported functions.
;_________________________________________________________________________________________

import_proto 'libdl.so',                                                                 \
  dlopen                                  ,<.pFilename, .flags>,        'dlopen',       \
  dlclose                                 ,<.hLib>,                     'dlclose',      \
  dlsym                                   ,<.hLib, .pObjName>,          'dlsym',        \
  dlerror                                 ,<NONE>,                      'dlerror'

Added freshlib/imports/Linux/libxcb-shm.inc.















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import_proto 'libxcb.so'                                                                                                                                                  ,\
        xcb_shm_attach                      ,<.con, .shmseg. .shmid, .readonly>,               'xcb_shm_attach'                                                           ,\
        xcb_shm_attach_checked              ,<NONE>,                                           'xcb_shm_attach_checked'                                                   ,\
        xcb_shm_attach_fd                   ,<NONE>,                                           'xcb_shm_attach_fd'                                                        ,\
        xcb_shm_attach_fd_checked           ,<NONE>,                                           'xcb_shm_attach_fd_checked'                                                ,\
        xcb_shm_create_pixmap               ,<NONE>,                                           'xcb_shm_create_pixmap'                                                    ,\
        xcb_shm_create_pixmap_checked       ,<NONE>,                                           'xcb_shm_create_pixmap_checked'                                            ,\
        xcb_shm_create_segment              ,<NONE>,                                           'xcb_shm_create_segment'                                                   ,\
        xcb_shm_create_segment_reply        ,<NONE>,                                           'xcb_shm_create_segment_reply'                                             ,\
        xcb_shm_create_segment_reply_fds    ,<NONE>,                                           'xcb_shm_create_segment_reply_fds'                                         ,\
        xcb_shm_create_segment_unchecked    ,<NONE>,                                           'xcb_shm_create_segment_unchecked'                                         ,\
        xcb_shm_detach                      ,<NONE>,                                           'xcb_shm_detach'                                                           ,\
        xcb_shm_detach_checked              ,<NONE>,                                           'xcb_shm_detach_checked'                                                   ,\
        xcb_shm_get_image                   ,<NONE>,                                           'xcb_shm_get_image'                                                        ,\
        xcb_shm_get_image_reply             ,<NONE>,                                           'xcb_shm_get_image_reply'                                                  ,\
        xcb_shm_get_image_unchecked         ,<NONE>,                                           'xcb_shm_get_image_unchecked'                                              ,\
        xcb_shm_put_image                   ,<NONE>,                                           'xcb_shm_put_image'                                                        ,\
        xcb_shm_put_image_checked           ,<NONE>,                                           'xcb_shm_put_image_checked'                                                ,\
        xcb_shm_query_version               ,<NONE>,                                           'xcb_shm_query_version'                                                    ,\
        xcb_shm_query_version_reply         ,<NONE>,                                           'xcb_shm_query_version_reply'                                              ,\
        xcb_shm_query_version_unchecked     ,<NONE>,                                           'xcb_shm_query_version_unchecked'                                          ,\
        xcb_shm_seg_end                     ,<NONE>,                                           'xcb_shm_seg_end'                                                          ,\
        xcb_shm_seg_next                    ,<NONE>,                                           'xcb_shm_seg_next'

Added freshlib/imports/Linux/libxcb.inc.















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
import_proto 'libxcb.so'                                                                                                                                                   ,\
        xcb_alloc_color                                         ,<NONE>,                                           'xcb_alloc_color'                                       ,\
        xcb_alloc_color_cells                                   ,<NONE>,                                           'xcb_alloc_color_cells'                                 ,\
        xcb_alloc_color_cells_masks                             ,<NONE>,                                           'xcb_alloc_color_cells_masks'                           ,\
        xcb_alloc_color_cells_masks_end                         ,<NONE>,                                           'xcb_alloc_color_cells_masks_end'                       ,\
        xcb_alloc_color_cells_masks_length                      ,<NONE>,                                           'xcb_alloc_color_cells_masks_length'                    ,\
        xcb_alloc_color_cells_pixels                            ,<NONE>,                                           'xcb_alloc_color_cells_pixels'                          ,\
        xcb_alloc_color_cells_pixels_end                        ,<NONE>,                                           'xcb_alloc_color_cells_pixels_end'                      ,\
        xcb_alloc_color_cells_pixels_length                     ,<NONE>,                                           'xcb_alloc_color_cells_pixels_length'                   ,\
        xcb_alloc_color_cells_reply                             ,<NONE>,                                           'xcb_alloc_color_cells_reply'                           ,\
        xcb_alloc_color_cells_sizeof                            ,<NONE>,                                           'xcb_alloc_color_cells_sizeof'                          ,\
        xcb_alloc_color_cells_unchecked                         ,<NONE>,                                           'xcb_alloc_color_cells_unchecked'                       ,\
        xcb_alloc_color_planes                                  ,<NONE>,                                           'xcb_alloc_color_planes'                                ,\
        xcb_alloc_color_planes_pixels                           ,<NONE>,                                           'xcb_alloc_color_planes_pixels'                         ,\
        xcb_alloc_color_planes_pixels_end                       ,<NONE>,                                           'xcb_alloc_color_planes_pixels_end'                     ,\
        xcb_alloc_color_planes_pixels_length                    ,<NONE>,                                           'xcb_alloc_color_planes_pixels_length'                  ,\
        xcb_alloc_color_planes_reply                            ,<NONE>,                                           'xcb_alloc_color_planes_reply'                          ,\
        xcb_alloc_color_planes_sizeof                           ,<NONE>,                                           'xcb_alloc_color_planes_sizeof'                         ,\
        xcb_alloc_color_planes_unchecked                        ,<NONE>,                                           'xcb_alloc_color_planes_unchecked'                      ,\
        xcb_alloc_color_reply                                   ,<NONE>,                                           'xcb_alloc_color_reply'                                 ,\
        xcb_alloc_color_unchecked                               ,<NONE>,                                           'xcb_alloc_color_unchecked'                             ,\
        xcb_alloc_named_color                                   ,<NONE>,                                           'xcb_alloc_named_color'                                 ,\
        xcb_alloc_named_color_reply                             ,<NONE>,                                           'xcb_alloc_named_color_reply'                           ,\
        xcb_alloc_named_color_sizeof                            ,<NONE>,                                           'xcb_alloc_named_color_sizeof'                          ,\
        xcb_alloc_named_color_unchecked                         ,<NONE>,                                           'xcb_alloc_named_color_unchecked'                       ,\
        xcb_allow_events                                        ,<NONE>,                                           'xcb_allow_events'                                      ,\
        xcb_allow_events_checked                                ,<NONE>,                                           'xcb_allow_events_checked'                              ,\
        xcb_arc_end                                             ,<NONE>,                                           'xcb_arc_end'                                           ,\
        xcb_arc_next                                            ,<NONE>,                                           'xcb_arc_next'                                          ,\
        xcb_atom_end                                            ,<NONE>,                                           'xcb_atom_end'                                          ,\
        xcb_atom_next                                           ,<NONE>,                                           'xcb_atom_next'                                         ,\
        xcb_bell                                                ,<NONE>,                                           'xcb_bell'                                              ,\
        xcb_bell_checked                                        ,<NONE>,                                           'xcb_bell_checked'                                      ,\
        xcb_big_requests_enable                                 ,<NONE>,                                           'xcb_big_requests_enable'                               ,\
        xcb_big_requests_enable_reply                           ,<NONE>,                                           'xcb_big_requests_enable_reply'                         ,\
        xcb_big_requests_enable_unchecked                       ,<NONE>,                                           'xcb_big_requests_enable_unchecked'                     ,\
        xcb_big_requests_id                                     ,<NONE>,                                           'xcb_big_requests_id'                                   ,\
        xcb_bool32_end                                          ,<NONE>,                                           'xcb_bool32_end'                                        ,\
        xcb_bool32_next                                         ,<NONE>,                                           'xcb_bool32_next'                                       ,\
        xcb_button_end                                          ,<NONE>,                                           'xcb_button_end'                                        ,\
        xcb_button_next                                         ,<NONE>,                                           'xcb_button_next'                                       ,\
        xcb_change_active_pointer_grab                          ,<NONE>,                                           'xcb_change_active_pointer_grab'                        ,\
        xcb_change_active_pointer_grab_checked                  ,<NONE>,                                           'xcb_change_active_pointer_grab_checked'                ,\
        xcb_change_gc                                           ,<NONE>,                                           'xcb_change_gc'                                         ,\
        xcb_change_gc_aux                                       ,<NONE>,                                           'xcb_change_gc_aux'                                     ,\
        xcb_change_gc_aux_checked                               ,<NONE>,                                           'xcb_change_gc_aux_checked'                             ,\
        xcb_change_gc_checked                                   ,<NONE>,                                           'xcb_change_gc_checked'                                 ,\
        xcb_change_gc_sizeof                                    ,<NONE>,                                           'xcb_change_gc_sizeof'                                  ,\
        xcb_change_gc_value_list                                ,<NONE>,                                           'xcb_change_gc_value_list'                              ,\
        xcb_change_gc_value_list_serialize                      ,<NONE>,                                           'xcb_change_gc_value_list_serialize'                    ,\
        xcb_change_gc_value_list_sizeof                         ,<NONE>,                                           'xcb_change_gc_value_list_sizeof'                       ,\
        xcb_change_gc_value_list_unpack                         ,<NONE>,                                           'xcb_change_gc_value_list_unpack'                       ,\
        xcb_change_hosts                                        ,<NONE>,                                           'xcb_change_hosts'                                      ,\
        xcb_change_hosts_address                                ,<NONE>,                                           'xcb_change_hosts_address'                              ,\
        xcb_change_hosts_address_end                            ,<NONE>,                                           'xcb_change_hosts_address_end'                          ,\
        xcb_change_hosts_address_length                         ,<NONE>,                                           'xcb_change_hosts_address_length'                       ,\
        xcb_change_hosts_checked                                ,<NONE>,                                           'xcb_change_hosts_checked'                              ,\
        xcb_change_hosts_sizeof                                 ,<NONE>,                                           'xcb_change_hosts_sizeof'                               ,\
        xcb_change_keyboard_control                             ,<NONE>,                                           'xcb_change_keyboard_control'                           ,\
        xcb_change_keyboard_control_aux                         ,<NONE>,                                           'xcb_change_keyboard_control_aux'                       ,\
        xcb_change_keyboard_control_aux_checked                 ,<NONE>,                                           'xcb_change_keyboard_control_aux_checked'               ,\
        xcb_change_keyboard_control_checked                     ,<NONE>,                                           'xcb_change_keyboard_control_checked'                   ,\
        xcb_change_keyboard_control_sizeof                      ,<NONE>,                                           'xcb_change_keyboard_control_sizeof'                    ,\
        xcb_change_keyboard_control_value_list                  ,<NONE>,                                           'xcb_change_keyboard_control_value_list'                ,\
        xcb_change_keyboard_control_value_list_serialize        ,<NONE>,                                           'xcb_change_keyboard_control_value_list_serialize'      ,\
        xcb_change_keyboard_control_value_list_sizeof           ,<NONE>,                                           'xcb_change_keyboard_control_value_list_sizeof'         ,\
        xcb_change_keyboard_control_value_list_unpack           ,<NONE>,                                           'xcb_change_keyboard_control_value_list_unpack'         ,\
        xcb_change_keyboard_mapping                             ,<NONE>,                                           'xcb_change_keyboard_mapping'                           ,\
        xcb_change_keyboard_mapping_checked                     ,<NONE>,                                           'xcb_change_keyboard_mapping_checked'                   ,\
        xcb_change_keyboard_mapping_keysyms                     ,<NONE>,                                           'xcb_change_keyboard_mapping_keysyms'                   ,\
        xcb_change_keyboard_mapping_keysyms_end                 ,<NONE>,                                           'xcb_change_keyboard_mapping_keysyms_end'               ,\
        xcb_change_keyboard_mapping_keysyms_length              ,<NONE>,                                           'xcb_change_keyboard_mapping_keysyms_length'            ,\
        xcb_change_keyboard_mapping_sizeof                      ,<NONE>,                                           'xcb_change_keyboard_mapping_sizeof'                    ,\
        xcb_change_pointer_control                              ,<NONE>,                                           'xcb_change_pointer_control'                            ,\
        xcb_change_pointer_control_checked                      ,<NONE>,                                           'xcb_change_pointer_control_checked'                    ,\
        xcb_change_property                                     ,<NONE>,                                           'xcb_change_property'                                   ,\
        xcb_change_property_checked                             ,<NONE>,                                           'xcb_change_property_checked'                           ,\
        xcb_change_property_data                                ,<NONE>,                                           'xcb_change_property_data'                              ,\
        xcb_change_property_data_end                            ,<NONE>,                                           'xcb_change_property_data_end'                          ,\
        xcb_change_property_data_length                         ,<NONE>,                                           'xcb_change_property_data_length'                       ,\
        xcb_change_property_sizeof                              ,<NONE>,                                           'xcb_change_property_sizeof'                            ,\
        xcb_change_save_set                                     ,<NONE>,                                           'xcb_change_save_set'                                   ,\
        xcb_change_save_set_checked                             ,<NONE>,                                           'xcb_change_save_set_checked'                           ,\
        xcb_change_window_attributes                            ,<NONE>,                                           'xcb_change_window_attributes'                          ,\
        xcb_change_window_attributes_aux                        ,<NONE>,                                           'xcb_change_window_attributes_aux'                      ,\
        xcb_change_window_attributes_aux_checked                ,<NONE>,                                           'xcb_change_window_attributes_aux_checked'              ,\
        xcb_change_window_attributes_checked                    ,<NONE>,                                           'xcb_change_window_attributes_checked'                  ,\
        xcb_change_window_attributes_sizeof                     ,<NONE>,                                           'xcb_change_window_attributes_sizeof'                   ,\
        xcb_change_window_attributes_value_list                 ,<NONE>,                                           'xcb_change_window_attributes_value_list'               ,\
        xcb_change_window_attributes_value_list_serialize       ,<NONE>,                                           'xcb_change_window_attributes_value_list_serialize'     ,\
        xcb_change_window_attributes_value_list_sizeof          ,<NONE>,                                           'xcb_change_window_attributes_value_list_sizeof'        ,\
        xcb_change_window_attributes_value_list_unpack          ,<NONE>,                                           'xcb_change_window_attributes_value_list_unpack'        ,\
        xcb_char2b_end                                          ,<NONE>,                                           'xcb_char2b_end'                                        ,\
        xcb_char2b_next                                         ,<NONE>,                                           'xcb_char2b_next'                                       ,\
        xcb_charinfo_end                                        ,<NONE>,                                           'xcb_charinfo_end'                                      ,\
        xcb_charinfo_next                                       ,<NONE>,                                           'xcb_charinfo_next'                                     ,\
        xcb_circulate_window                                    ,<NONE>,                                           'xcb_circulate_window'                                  ,\
        xcb_circulate_window_checked                            ,<NONE>,                                           'xcb_circulate_window_checked'                          ,\
        xcb_clear_area                                          ,<NONE>,                                           'xcb_clear_area'                                        ,\
        xcb_clear_area_checked                                  ,<NONE>,                                           'xcb_clear_area_checked'                                ,\
        xcb_client_message_data_end                             ,<NONE>,                                           'xcb_client_message_data_end'                           ,\
        xcb_client_message_data_next                            ,<NONE>,                                           'xcb_client_message_data_next'                          ,\
        xcb_close_font                                          ,<NONE>,                                           'xcb_close_font'                                        ,\
        xcb_close_font_checked                                  ,<NONE>,                                           'xcb_close_font_checked'                                ,\
        xcb_coloritem_end                                       ,<NONE>,                                           'xcb_coloritem_end'                                     ,\
        xcb_coloritem_next                                      ,<NONE>,                                           'xcb_coloritem_next'                                    ,\
        xcb_colormap_end                                        ,<NONE>,                                           'xcb_colormap_end'                                      ,\
        xcb_colormap_next                                       ,<NONE>,                                           'xcb_colormap_next'                                     ,\
        xcb_configure_window                                    ,<NONE>,                                           'xcb_configure_window'                                  ,\
        xcb_configure_window_aux                                ,<NONE>,                                           'xcb_configure_window_aux'                              ,\
        xcb_configure_window_aux_checked                        ,<NONE>,                                           'xcb_configure_window_aux_checked'                      ,\
        xcb_configure_window_checked                            ,<NONE>,                                           'xcb_configure_window_checked'                          ,\
        xcb_configure_window_sizeof                             ,<NONE>,                                           'xcb_configure_window_sizeof'                           ,\
        xcb_configure_window_value_list                         ,<NONE>,                                           'xcb_configure_window_value_list'                       ,\
        xcb_configure_window_value_list_serialize               ,<NONE>,                                           'xcb_configure_window_value_list_serialize'             ,\
        xcb_configure_window_value_list_sizeof                  ,<NONE>,                                           'xcb_configure_window_value_list_sizeof'                ,\
        xcb_configure_window_value_list_unpack                  ,<NONE>,                                           'xcb_configure_window_value_list_unpack'                ,\
        xcb_connect                                             ,<.pStrDispName, .pIntScreen>,                     'xcb_connect'                                           ,\
        xcb_connection_has_error                                ,<NONE>,                                           'xcb_connection_has_error'                              ,\
        xcb_connect_to_display_with_auth_info                   ,<NONE>,                                           'xcb_connect_to_display_with_auth_info'                 ,\
        xcb_connect_to_fd                                       ,<NONE>,                                           'xcb_connect_to_fd'                                     ,\
        xcb_convert_selection                                   ,<NONE>,                                           'xcb_convert_selection'                                 ,\
        xcb_convert_selection_checked                           ,<NONE>,                                           'xcb_convert_selection_checked'                         ,\
        xcb_copy_area                                           ,<NONE>,                                           'xcb_copy_area'                                         ,\
        xcb_copy_area_checked                                   ,<NONE>,                                           'xcb_copy_area_checked'                                 ,\
        xcb_copy_colormap_and_free                              ,<NONE>,                                           'xcb_copy_colormap_and_free'                            ,\
        xcb_copy_colormap_and_free_checked                      ,<NONE>,                                           'xcb_copy_colormap_and_free_checked'                    ,\
        xcb_copy_gc                                             ,<NONE>,                                           'xcb_copy_gc'                                           ,\
        xcb_copy_gc_checked                                     ,<NONE>,                                           'xcb_copy_gc_checked'                                   ,\
        xcb_copy_plane                                          ,<NONE>,                                           'xcb_copy_plane'                                        ,\
        xcb_copy_plane_checked                                  ,<NONE>,                                           'xcb_copy_plane_checked'                                ,\
        xcb_create_colormap                                     ,<.conn, .alloc, .id, .window, .visual>,           'xcb_create_colormap'                                   ,\
        xcb_create_colormap_checked                             ,<.conn, .alloc, .id, .window, .visual>,           'xcb_create_colormap_checked'                           ,\
        xcb_create_cursor                                       ,<NONE>,                                           'xcb_create_cursor'                                     ,\
        xcb_create_cursor_checked                               ,<NONE>,                                           'xcb_create_cursor_checked'                             ,\
        xcb_create_gc                                           ,<NONE>,                                           'xcb_create_gc'                                         ,\
        xcb_create_gc_aux                                       ,<NONE>,                                           'xcb_create_gc_aux'                                     ,\
        xcb_create_gc_aux_checked                               ,<NONE>,                                           'xcb_create_gc_aux_checked'                             ,\
        xcb_create_gc_checked                                   ,<NONE>,                                           'xcb_create_gc_checked'                                 ,\
        xcb_create_gc_sizeof                                    ,<NONE>,                                           'xcb_create_gc_sizeof'                                  ,\
        xcb_create_gc_value_list                                ,<NONE>,                                           'xcb_create_gc_value_list'                              ,\
        xcb_create_gc_value_list_serialize                      ,<NONE>,                                           'xcb_create_gc_value_list_serialize'                    ,\
        xcb_create_gc_value_list_sizeof                         ,<NONE>,                                           'xcb_create_gc_value_list_sizeof'                       ,\
        xcb_create_gc_value_list_unpack                         ,<NONE>,                                           'xcb_create_gc_value_list_unpack'                       ,\
        xcb_create_glyph_cursor                                 ,<NONE>,                                           'xcb_create_glyph_cursor'                               ,\
        xcb_create_glyph_cursor_checked                         ,<NONE>,                                           'xcb_create_glyph_cursor_checked'                       ,\
        xcb_create_pixmap                                       ,<NONE>,                                           'xcb_create_pixmap'                                     ,\
        xcb_create_pixmap_checked                               ,<NONE>,                                           'xcb_create_pixmap_checked'                             ,\
        xcb_create_window                                       ,<NONE>,                                           'xcb_create_window'                                     ,\
        xcb_create_window_aux                                   ,<NONE>,                                           'xcb_create_window_aux'                                 ,\
        xcb_create_window_aux_checked                           ,<NONE>,                                           'xcb_create_window_aux_checked'                         ,\
        xcb_create_window_checked                               ,<NONE>,                                           'xcb_create_window_checked'                             ,\
        xcb_create_window_sizeof                                ,<NONE>,                                           'xcb_create_window_sizeof'                              ,\
        xcb_create_window_value_list                            ,<NONE>,                                           'xcb_create_window_value_list'                          ,\
        xcb_create_window_value_list_serialize                  ,<NONE>,                                           'xcb_create_window_value_list_serialize'                ,\
        xcb_create_window_value_list_sizeof                     ,<NONE>,                                           'xcb_create_window_value_list_sizeof'                   ,\
        xcb_create_window_value_list_unpack                     ,<NONE>,                                           'xcb_create_window_value_list_unpack'                   ,\
        xcb_cursor_end                                          ,<NONE>,                                           'xcb_cursor_end'                                        ,\
        xcb_cursor_next                                         ,<NONE>,                                           'xcb_cursor_next'                                       ,\
        xcb_delete_property                                     ,<NONE>,                                           'xcb_delete_property'                                   ,\
        xcb_delete_property_checked                             ,<NONE>,                                           'xcb_delete_property_checked'                           ,\
        xcb_depth_end                                           ,<NONE>,                                           'xcb_depth_end'                                         ,\
        xcb_depth_next                                          ,<NONE>,                                           'xcb_depth_next'                                        ,\
        xcb_depth_sizeof                                        ,<NONE>,                                           'xcb_depth_sizeof'                                      ,\
        xcb_depth_visuals                                       ,<NONE>,                                           'xcb_depth_visuals'                                     ,\
        xcb_depth_visuals_iterator                              ,<NONE>,                                           'xcb_depth_visuals_iterator'                            ,\
        xcb_depth_visuals_length                                ,<NONE>,                                           'xcb_depth_visuals_length'                              ,\
        xcb_destroy_subwindows                                  ,<NONE>,                                           'xcb_destroy_subwindows'                                ,\
        xcb_destroy_subwindows_checked                          ,<NONE>,                                           'xcb_destroy_subwindows_checked'                        ,\
        xcb_destroy_window                                      ,<NONE>,                                           'xcb_destroy_window'                                    ,\
        xcb_destroy_window_checked                              ,<NONE>,                                           'xcb_destroy_window_checked'                            ,\
        xcb_discard_reply                                       ,<NONE>,                                           'xcb_discard_reply'                                     ,\
        xcb_discard_reply64                                     ,<NONE>,                                           'xcb_discard_reply64'                                   ,\
        xcb_disconnect                                          ,<NONE>,                                           'xcb_disconnect'                                        ,\
        xcb_drawable_end                                        ,<NONE>,                                           'xcb_drawable_end'                                      ,\
        xcb_drawable_next                                       ,<NONE>,                                           'xcb_drawable_next'                                     ,\
        xcb_fill_poly                                           ,<NONE>,                                           'xcb_fill_poly'                                         ,\
        xcb_fill_poly_checked                                   ,<NONE>,                                           'xcb_fill_poly_checked'                                 ,\
        xcb_fill_poly_points                                    ,<NONE>,                                           'xcb_fill_poly_points'                                  ,\
        xcb_fill_poly_points_iterator                           ,<NONE>,                                           'xcb_fill_poly_points_iterator'                         ,\
        xcb_fill_poly_points_length                             ,<NONE>,                                           'xcb_fill_poly_points_length'                           ,\
        xcb_fill_poly_sizeof                                    ,<NONE>,                                           'xcb_fill_poly_sizeof'                                  ,\
        xcb_flush                                               ,<.conn>,                                          'xcb_flush'                                             ,\
        xcb_fontable_end                                        ,<NONE>,                                           'xcb_fontable_end'                                      ,\
        xcb_fontable_next                                       ,<NONE>,                                           'xcb_fontable_next'                                     ,\
        xcb_font_end                                            ,<NONE>,                                           'xcb_font_end'                                          ,\
        xcb_font_next                                           ,<NONE>,                                           'xcb_font_next'                                         ,\
        xcb_fontprop_end                                        ,<NONE>,                                           'xcb_fontprop_end'                                      ,\
        xcb_fontprop_next                                       ,<NONE>,                                           'xcb_fontprop_next'                                     ,\
        xcb_force_screen_saver                                  ,<NONE>,                                           'xcb_force_screen_saver'                                ,\
        xcb_force_screen_saver_checked                          ,<NONE>,                                           'xcb_force_screen_saver_checked'                        ,\
        xcb_format_end                                          ,<NONE>,                                           'xcb_format_end'                                        ,\
        xcb_format_next                                         ,<NONE>,                                           'xcb_format_next'                                       ,\
        xcb_free_colormap                                       ,<NONE>,                                           'xcb_free_colormap'                                     ,\
        xcb_free_colormap_checked                               ,<NONE>,                                           'xcb_free_colormap_checked'                             ,\
        xcb_free_colors                                         ,<NONE>,                                           'xcb_free_colors'                                       ,\
        xcb_free_colors_checked                                 ,<NONE>,                                           'xcb_free_colors_checked'                               ,\
        xcb_free_colors_pixels                                  ,<NONE>,                                           'xcb_free_colors_pixels'                                ,\
        xcb_free_colors_pixels_end                              ,<NONE>,                                           'xcb_free_colors_pixels_end'                            ,\
        xcb_free_colors_pixels_length                           ,<NONE>,                                           'xcb_free_colors_pixels_length'                         ,\
        xcb_free_colors_sizeof                                  ,<NONE>,                                           'xcb_free_colors_sizeof'                                ,\
        xcb_free_cursor                                         ,<NONE>,                                           'xcb_free_cursor'                                       ,\
        xcb_free_cursor_checked                                 ,<NONE>,                                           'xcb_free_cursor_checked'                               ,\
        xcb_free_gc                                             ,<NONE>,                                           'xcb_free_gc'                                           ,\
        xcb_free_gc_checked                                     ,<NONE>,                                           'xcb_free_gc_checked'                                   ,\
        xcb_free_pixmap                                         ,<NONE>,                                           'xcb_free_pixmap'                                       ,\
        xcb_free_pixmap_checked                                 ,<NONE>,                                           'xcb_free_pixmap_checked'                               ,\
        xcb_gcontext_end                                        ,<NONE>,                                           'xcb_gcontext_end'                                      ,\
        xcb_gcontext_next                                       ,<NONE>,                                           'xcb_gcontext_next'                                     ,\
        xcb_generate_id                                         ,<.conn>,                                          'xcb_generate_id'                                       ,\
        xcb_get_atom_name                                       ,<NONE>,                                           'xcb_get_atom_name'                                     ,\
        xcb_get_atom_name_name                                  ,<NONE>,                                           'xcb_get_atom_name_name'                                ,\
        xcb_get_atom_name_name_end                              ,<NONE>,                                           'xcb_get_atom_name_name_end'                            ,\
        xcb_get_atom_name_name_length                           ,<NONE>,                                           'xcb_get_atom_name_name_length'                         ,\
        xcb_get_atom_name_reply                                 ,<NONE>,                                           'xcb_get_atom_name_reply'                               ,\
        xcb_get_atom_name_sizeof                                ,<NONE>,                                           'xcb_get_atom_name_sizeof'                              ,\
        xcb_get_atom_name_unchecked                             ,<NONE>,                                           'xcb_get_atom_name_unchecked'                           ,\
        xcb_get_extension_data                                  ,<NONE>,                                           'xcb_get_extension_data'                                ,\
        xcb_get_file_descriptor                                 ,<.conn>,                                          'xcb_get_file_descriptor'                               ,\
        xcb_get_font_path                                       ,<NONE>,                                           'xcb_get_font_path'                                     ,\
        xcb_get_font_path_path_iterator                         ,<NONE>,                                           'xcb_get_font_path_path_iterator'                       ,\
        xcb_get_font_path_path_length                           ,<NONE>,                                           'xcb_get_font_path_path_length'                         ,\
        xcb_get_font_path_reply                                 ,<NONE>,                                           'xcb_get_font_path_reply'                               ,\
        xcb_get_font_path_sizeof                                ,<NONE>,                                           'xcb_get_font_path_sizeof'                              ,\
        xcb_get_font_path_unchecked                             ,<NONE>,                                           'xcb_get_font_path_unchecked'                           ,\
        xcb_get_geometry                                        ,<NONE>,                                           'xcb_get_geometry'                                      ,\
        xcb_get_geometry_reply                                  ,<NONE>,                                           'xcb_get_geometry_reply'                                ,\
        xcb_get_geometry_unchecked                              ,<NONE>,                                           'xcb_get_geometry_unchecked'                            ,\
        xcb_get_image                                           ,<NONE>,                                           'xcb_get_image'                                         ,\
        xcb_get_image_data                                      ,<NONE>,                                           'xcb_get_image_data'                                    ,\
        xcb_get_image_data_end                                  ,<NONE>,                                           'xcb_get_image_data_end'                                ,\
        xcb_get_image_data_length                               ,<NONE>,                                           'xcb_get_image_data_length'                             ,\
        xcb_get_image_reply                                     ,<NONE>,                                           'xcb_get_image_reply'                                   ,\
        xcb_get_image_sizeof                                    ,<NONE>,                                           'xcb_get_image_sizeof'                                  ,\
        xcb_get_image_unchecked                                 ,<NONE>,                                           'xcb_get_image_unchecked'                               ,\
        xcb_get_input_focus                                     ,<NONE>,                                           'xcb_get_input_focus'                                   ,\
        xcb_get_input_focus_reply                               ,<NONE>,                                           'xcb_get_input_focus_reply'                             ,\
        xcb_get_input_focus_unchecked                           ,<NONE>,                                           'xcb_get_input_focus_unchecked'                         ,\
        xcb_get_keyboard_control                                ,<NONE>,                                           'xcb_get_keyboard_control'                              ,\
        xcb_get_keyboard_control_reply                          ,<NONE>,                                           'xcb_get_keyboard_control_reply'                        ,\
        xcb_get_keyboard_control_unchecked                      ,<NONE>,                                           'xcb_get_keyboard_control_unchecked'                    ,\
        xcb_get_keyboard_mapping                                ,<NONE>,                                           'xcb_get_keyboard_mapping'                              ,\
        xcb_get_keyboard_mapping_keysyms                        ,<NONE>,                                           'xcb_get_keyboard_mapping_keysyms'                      ,\
        xcb_get_keyboard_mapping_keysyms_end                    ,<NONE>,                                           'xcb_get_keyboard_mapping_keysyms_end'                  ,\
        xcb_get_keyboard_mapping_keysyms_length                 ,<NONE>,                                           'xcb_get_keyboard_mapping_keysyms_length'               ,\
        xcb_get_keyboard_mapping_reply                          ,<NONE>,                                           'xcb_get_keyboard_mapping_reply'                        ,\
        xcb_get_keyboard_mapping_sizeof                         ,<NONE>,                                           'xcb_get_keyboard_mapping_sizeof'                       ,\
        xcb_get_keyboard_mapping_unchecked                      ,<NONE>,                                           'xcb_get_keyboard_mapping_unchecked'                    ,\
        xcb_get_maximum_request_length                          ,<NONE>,                                           'xcb_get_maximum_request_length'                        ,\
        xcb_get_modifier_mapping                                ,<NONE>,                                           'xcb_get_modifier_mapping'                              ,\
        xcb_get_modifier_mapping_keycodes                       ,<NONE>,                                           'xcb_get_modifier_mapping_keycodes'                     ,\
        xcb_get_modifier_mapping_keycodes_end                   ,<NONE>,                                           'xcb_get_modifier_mapping_keycodes_end'                 ,\
        xcb_get_modifier_mapping_keycodes_length                ,<NONE>,                                           'xcb_get_modifier_mapping_keycodes_length'              ,\
        xcb_get_modifier_mapping_reply                          ,<NONE>,                                           'xcb_get_modifier_mapping_reply'                        ,\
        xcb_get_modifier_mapping_sizeof                         ,<NONE>,                                           'xcb_get_modifier_mapping_sizeof'                       ,\
        xcb_get_modifier_mapping_unchecked                      ,<NONE>,                                           'xcb_get_modifier_mapping_unchecked'                    ,\
        xcb_get_motion_events                                   ,<NONE>,                                           'xcb_get_motion_events'                                 ,\
        xcb_get_motion_events_events                            ,<NONE>,                                           'xcb_get_motion_events_events'                          ,\
        xcb_get_motion_events_events_iterator                   ,<NONE>,                                           'xcb_get_motion_events_events_iterator'                 ,\
        xcb_get_motion_events_events_length                     ,<NONE>,                                           'xcb_get_motion_events_events_length'                   ,\
        xcb_get_motion_events_reply                             ,<NONE>,                                           'xcb_get_motion_events_reply'                           ,\
        xcb_get_motion_events_sizeof                            ,<NONE>,                                           'xcb_get_motion_events_sizeof'                          ,\
        xcb_get_motion_events_unchecked                         ,<NONE>,                                           'xcb_get_motion_events_unchecked'                       ,\
        xcb_get_pointer_control                                 ,<NONE>,                                           'xcb_get_pointer_control'                               ,\
        xcb_get_pointer_control_reply                           ,<NONE>,                                           'xcb_get_pointer_control_reply'                         ,\
        xcb_get_pointer_control_unchecked                       ,<NONE>,                                           'xcb_get_pointer_control_unchecked'                     ,\
        xcb_get_pointer_mapping                                 ,<NONE>,                                           'xcb_get_pointer_mapping'                               ,\
        xcb_get_pointer_mapping_map                             ,<NONE>,                                           'xcb_get_pointer_mapping_map'                           ,\
        xcb_get_pointer_mapping_map_end                         ,<NONE>,                                           'xcb_get_pointer_mapping_map_end'                       ,\
        xcb_get_pointer_mapping_map_length                      ,<NONE>,                                           'xcb_get_pointer_mapping_map_length'                    ,\
        xcb_get_pointer_mapping_reply                           ,<NONE>,                                           'xcb_get_pointer_mapping_reply'                         ,\
        xcb_get_pointer_mapping_sizeof                          ,<NONE>,                                           'xcb_get_pointer_mapping_sizeof'                        ,\
        xcb_get_pointer_mapping_unchecked                       ,<NONE>,                                           'xcb_get_pointer_mapping_unchecked'                     ,\
        xcb_get_property                                        ,<NONE>,                                           'xcb_get_property'                                      ,\
        xcb_get_property_reply                                  ,<NONE>,                                           'xcb_get_property_reply'                                ,\
        xcb_get_property_sizeof                                 ,<NONE>,                                           'xcb_get_property_sizeof'                               ,\
        xcb_get_property_unchecked                              ,<NONE>,                                           'xcb_get_property_unchecked'                            ,\
        xcb_get_property_value                                  ,<NONE>,                                           'xcb_get_property_value'                                ,\
        xcb_get_property_value_end                              ,<NONE>,                                           'xcb_get_property_value_end'                            ,\
        xcb_get_property_value_length                           ,<NONE>,                                           'xcb_get_property_value_length'                         ,\
        xcb_get_reply_fds                                       ,<NONE>,                                           'xcb_get_reply_fds'                                     ,\
        xcb_get_screen_saver                                    ,<NONE>,                                           'xcb_get_screen_saver'                                  ,\
        xcb_get_screen_saver_reply                              ,<NONE>,                                           'xcb_get_screen_saver_reply'                            ,\
        xcb_get_screen_saver_unchecked                          ,<NONE>,                                           'xcb_get_screen_saver_unchecked'                        ,\
        xcb_get_selection_owner                                 ,<NONE>,                                           'xcb_get_selection_owner'                               ,\
        xcb_get_selection_owner_reply                           ,<NONE>,                                           'xcb_get_selection_owner_reply'                         ,\
        xcb_get_selection_owner_unchecked                       ,<NONE>,                                           'xcb_get_selection_owner_unchecked'                     ,\
        xcb_get_setup                                           ,<.conn>,                                          'xcb_get_setup'                                         ,\
        xcb_get_window_attributes                               ,<NONE>,                                           'xcb_get_window_attributes'                             ,\
        xcb_get_window_attributes_reply                         ,<NONE>,                                           'xcb_get_window_attributes_reply'                       ,\
        xcb_get_window_attributes_unchecked                     ,<NONE>,                                           'xcb_get_window_attributes_unchecked'                   ,\
        xcb_grab_button                                         ,<NONE>,                                           'xcb_grab_button'                                       ,\
        xcb_grab_button_checked                                 ,<NONE>,                                           'xcb_grab_button_checked'                               ,\
        xcb_grab_key                                            ,<NONE>,                                           'xcb_grab_key'                                          ,\
        xcb_grab_keyboard                                       ,<NONE>,                                           'xcb_grab_keyboard'                                     ,\
        xcb_grab_keyboard_reply                                 ,<NONE>,                                           'xcb_grab_keyboard_reply'                               ,\
        xcb_grab_keyboard_unchecked                             ,<NONE>,                                           'xcb_grab_keyboard_unchecked'                           ,\
        xcb_grab_key_checked                                    ,<NONE>,                                           'xcb_grab_key_checked'                                  ,\
        xcb_grab_pointer                                        ,<NONE>,                                           'xcb_grab_pointer'                                      ,\
        xcb_grab_pointer_reply                                  ,<NONE>,                                           'xcb_grab_pointer_reply'                                ,\
        xcb_grab_pointer_unchecked                              ,<NONE>,                                           'xcb_grab_pointer_unchecked'                            ,\
        xcb_grab_server                                         ,<NONE>,                                           'xcb_grab_server'                                       ,\
        xcb_grab_server_checked                                 ,<NONE>,                                           'xcb_grab_server_checked'                               ,\
        xcb_host_address                                        ,<NONE>,                                           'xcb_host_address'                                      ,\
        xcb_host_address_end                                    ,<NONE>,                                           'xcb_host_address_end'                                  ,\
        xcb_host_address_length                                 ,<NONE>,                                           'xcb_host_address_length'                               ,\
        xcb_host_end                                            ,<NONE>,                                           'xcb_host_end'                                          ,\
        xcb_host_next                                           ,<NONE>,                                           'xcb_host_next'                                         ,\
        xcb_host_sizeof                                         ,<NONE>,                                           'xcb_host_sizeof'                                       ,\
        xcb_image_text_16                                       ,<NONE>,                                           'xcb_image_text_16'                                     ,\
        xcb_image_text_16_checked                               ,<NONE>,                                           'xcb_image_text_16_checked'                             ,\
        xcb_image_text_16_sizeof                                ,<NONE>,                                           'xcb_image_text_16_sizeof'                              ,\
        xcb_image_text_16_string                                ,<NONE>,                                           'xcb_image_text_16_string'                              ,\
        xcb_image_text_16_string_iterator                       ,<NONE>,                                           'xcb_image_text_16_string_iterator'                     ,\
        xcb_image_text_16_string_length                         ,<NONE>,                                           'xcb_image_text_16_string_length'                       ,\
        xcb_image_text_8                                        ,<NONE>,                                           'xcb_image_text_8'                                      ,\
        xcb_image_text_8_checked                                ,<NONE>,                                           'xcb_image_text_8_checked'                              ,\
        xcb_image_text_8_sizeof                                 ,<NONE>,                                           'xcb_image_text_8_sizeof'                               ,\
        xcb_image_text_8_string                                 ,<NONE>,                                           'xcb_image_text_8_string'                               ,\
        xcb_image_text_8_string_end                             ,<NONE>,                                           'xcb_image_text_8_string_end'                           ,\
        xcb_image_text_8_string_length                          ,<NONE>,                                           'xcb_image_text_8_string_length'                        ,\
        xcb_install_colormap                                    ,<NONE>,                                           'xcb_install_colormap'                                  ,\
        xcb_install_colormap_checked                            ,<NONE>,                                           'xcb_install_colormap_checked'                          ,\
        xcb_intern_atom                                         ,<NONE>,                                           'xcb_intern_atom'                                       ,\
        xcb_intern_atom_reply                                   ,<NONE>,                                           'xcb_intern_atom_reply'                                 ,\
        xcb_intern_atom_sizeof                                  ,<NONE>,                                           'xcb_intern_atom_sizeof'                                ,\
        xcb_intern_atom_unchecked                               ,<NONE>,                                           'xcb_intern_atom_unchecked'                             ,\
        xcb_keycode32_end                                       ,<NONE>,                                           'xcb_keycode32_end'                                     ,\
        xcb_keycode32_next                                      ,<NONE>,                                           'xcb_keycode32_next'                                    ,\
        xcb_keycode_end                                         ,<NONE>,                                           'xcb_keycode_end'                                       ,\
        xcb_keycode_next                                        ,<NONE>,                                           'xcb_keycode_next'                                      ,\
        xcb_keysym_end                                          ,<NONE>,                                           'xcb_keysym_end'                                        ,\
        xcb_keysym_next                                         ,<NONE>,                                           'xcb_keysym_next'                                       ,\
        xcb_kill_client                                         ,<NONE>,                                           'xcb_kill_client'                                       ,\
        xcb_kill_client_checked                                 ,<NONE>,                                           'xcb_kill_client_checked'                               ,\
        xcb_list_extensions                                     ,<NONE>,                                           'xcb_list_extensions'                                   ,\
        xcb_list_extensions_names_iterator                      ,<NONE>,                                           'xcb_list_extensions_names_iterator'                    ,\
        xcb_list_extensions_names_length                        ,<NONE>,                                           'xcb_list_extensions_names_length'                      ,\
        xcb_list_extensions_reply                               ,<NONE>,                                           'xcb_list_extensions_reply'                             ,\
        xcb_list_extensions_sizeof                              ,<NONE>,                                           'xcb_list_extensions_sizeof'                            ,\
        xcb_list_extensions_unchecked                           ,<NONE>,                                           'xcb_list_extensions_unchecked'                         ,\
        xcb_list_fonts                                          ,<NONE>,                                           'xcb_list_fonts'                                        ,\
        xcb_list_fonts_names_iterator                           ,<NONE>,                                           'xcb_list_fonts_names_iterator'                         ,\
        xcb_list_fonts_names_length                             ,<NONE>,                                           'xcb_list_fonts_names_length'                           ,\
        xcb_list_fonts_reply                                    ,<NONE>,                                           'xcb_list_fonts_reply'                                  ,\
        xcb_list_fonts_sizeof                                   ,<NONE>,                                           'xcb_list_fonts_sizeof'                                 ,\
        xcb_list_fonts_unchecked                                ,<NONE>,                                           'xcb_list_fonts_unchecked'                              ,\
        xcb_list_fonts_with_info                                ,<NONE>,                                           'xcb_list_fonts_with_info'                              ,\
        xcb_list_fonts_with_info_name                           ,<NONE>,                                           'xcb_list_fonts_with_info_name'                         ,\
        xcb_list_fonts_with_info_name_end                       ,<NONE>,                                           'xcb_list_fonts_with_info_name_end'                     ,\
        xcb_list_fonts_with_info_name_length                    ,<NONE>,                                           'xcb_list_fonts_with_info_name_length'                  ,\
        xcb_list_fonts_with_info_properties                     ,<NONE>,                                           'xcb_list_fonts_with_info_properties'                   ,\
        xcb_list_fonts_with_info_properties_iterator            ,<NONE>,                                           'xcb_list_fonts_with_info_properties_iterator'          ,\
        xcb_list_fonts_with_info_properties_length              ,<NONE>,                                           'xcb_list_fonts_with_info_properties_length'            ,\
        xcb_list_fonts_with_info_reply                          ,<NONE>,                                           'xcb_list_fonts_with_info_reply'                        ,\
        xcb_list_fonts_with_info_sizeof                         ,<NONE>,                                           'xcb_list_fonts_with_info_sizeof'                       ,\
        xcb_list_fonts_with_info_unchecked                      ,<NONE>,                                           'xcb_list_fonts_with_info_unchecked'                    ,\
        xcb_list_hosts                                          ,<NONE>,                                           'xcb_list_hosts'                                        ,\
        xcb_list_hosts_hosts_iterator                           ,<NONE>,                                           'xcb_list_hosts_hosts_iterator'                         ,\
        xcb_list_hosts_hosts_length                             ,<NONE>,                                           'xcb_list_hosts_hosts_length'                           ,\
        xcb_list_hosts_reply                                    ,<NONE>,                                           'xcb_list_hosts_reply'                                  ,\
        xcb_list_hosts_sizeof                                   ,<NONE>,                                           'xcb_list_hosts_sizeof'                                 ,\
        xcb_list_hosts_unchecked                                ,<NONE>,                                           'xcb_list_hosts_unchecked'                              ,\
        xcb_list_installed_colormaps                            ,<NONE>,                                           'xcb_list_installed_colormaps'                          ,\
        xcb_list_installed_colormaps_cmaps                      ,<NONE>,                                           'xcb_list_installed_colormaps_cmaps'                    ,\
        xcb_list_installed_colormaps_cmaps_end                  ,<NONE>,                                           'xcb_list_installed_colormaps_cmaps_end'                ,\
        xcb_list_installed_colormaps_cmaps_length               ,<NONE>,                                           'xcb_list_installed_colormaps_cmaps_length'             ,\
        xcb_list_installed_colormaps_reply                      ,<NONE>,                                           'xcb_list_installed_colormaps_reply'                    ,\
        xcb_list_installed_colormaps_sizeof                     ,<NONE>,                                           'xcb_list_installed_colormaps_sizeof'                   ,\
        xcb_list_installed_colormaps_unchecked                  ,<NONE>,                                           'xcb_list_installed_colormaps_unchecked'                ,\
        xcb_list_properties                                     ,<NONE>,                                           'xcb_list_properties'                                   ,\
        xcb_list_properties_atoms                               ,<NONE>,                                           'xcb_list_properties_atoms'                             ,\
        xcb_list_properties_atoms_end                           ,<NONE>,                                           'xcb_list_properties_atoms_end'                         ,\
        xcb_list_properties_atoms_length                        ,<NONE>,                                           'xcb_list_properties_atoms_length'                      ,\
        xcb_list_properties_reply                               ,<NONE>,                                           'xcb_list_properties_reply'                             ,\
        xcb_list_properties_sizeof                              ,<NONE>,                                           'xcb_list_properties_sizeof'                            ,\
        xcb_list_properties_unchecked                           ,<NONE>,                                           'xcb_list_properties_unchecked'                         ,\
        xcb_lookup_color                                        ,<NONE>,                                           'xcb_lookup_color'                                      ,\
        xcb_lookup_color_reply                                  ,<NONE>,                                           'xcb_lookup_color_reply'                                ,\
        xcb_lookup_color_sizeof                                 ,<NONE>,                                           'xcb_lookup_color_sizeof'                               ,\
        xcb_lookup_color_unchecked                              ,<NONE>,                                           'xcb_lookup_color_unchecked'                            ,\
        xcb_map_subwindows                                      ,<NONE>,                                           'xcb_map_subwindows'                                    ,\
        xcb_map_subwindows_checked                              ,<NONE>,                                           'xcb_map_subwindows_checked'                            ,\
        xcb_map_window                                          ,<NONE>,                                           'xcb_map_window'                                        ,\
        xcb_map_window_checked                                  ,<NONE>,                                           'xcb_map_window_checked'                                ,\
        xcb_no_operation                                        ,<NONE>,                                           'xcb_no_operation'                                      ,\
        xcb_no_operation_checked                                ,<NONE>,                                           'xcb_no_operation_checked'                              ,\
        xcb_open_font                                           ,<NONE>,                                           'xcb_open_font'                                         ,\
        xcb_open_font_checked                                   ,<NONE>,                                           'xcb_open_font_checked'                                 ,\
        xcb_open_font_name                                      ,<NONE>,                                           'xcb_open_font_name'                                    ,\
        xcb_open_font_name_end                                  ,<NONE>,                                           'xcb_open_font_name_end'                                ,\
        xcb_open_font_name_length                               ,<NONE>,                                           'xcb_open_font_name_length'                             ,\
        xcb_open_font_sizeof                                    ,<NONE>,                                           'xcb_open_font_sizeof'                                  ,\
        xcb_parse_display                                       ,<NONE>,                                           'xcb_parse_display'                                     ,\
        xcb_pixmap_end                                          ,<NONE>,                                           'xcb_pixmap_end'                                        ,\
        xcb_pixmap_next                                         ,<NONE>,                                           'xcb_pixmap_next'                                       ,\
        xcb_point_end                                           ,<NONE>,                                           'xcb_point_end'                                         ,\
        xcb_point_next                                          ,<NONE>,                                           'xcb_point_next'                                        ,\
        xcb_poll_for_event                                      ,<NONE>,                                           'xcb_poll_for_event'                                    ,\
        xcb_poll_for_queued_event                               ,<NONE>,                                           'xcb_poll_for_queued_event'                             ,\
        xcb_poll_for_reply                                      ,<NONE>,                                           'xcb_poll_for_reply'                                    ,\
        xcb_poll_for_reply64                                    ,<NONE>,                                           'xcb_poll_for_reply64'                                  ,\
        xcb_poll_for_special_event                              ,<NONE>,                                           'xcb_poll_for_special_event'                            ,\
        xcb_poly_arc                                            ,<NONE>,                                           'xcb_poly_arc'                                          ,\
        xcb_poly_arc_arcs                                       ,<NONE>,                                           'xcb_poly_arc_arcs'                                     ,\
        xcb_poly_arc_arcs_iterator                              ,<NONE>,                                           'xcb_poly_arc_arcs_iterator'                            ,\
        xcb_poly_arc_arcs_length                                ,<NONE>,                                           'xcb_poly_arc_arcs_length'                              ,\
        xcb_poly_arc_checked                                    ,<NONE>,                                           'xcb_poly_arc_checked'                                  ,\
        xcb_poly_arc_sizeof                                     ,<NONE>,                                           'xcb_poly_arc_sizeof'                                   ,\
        xcb_poly_fill_arc                                       ,<NONE>,                                           'xcb_poly_fill_arc'                                     ,\
        xcb_poly_fill_arc_arcs                                  ,<NONE>,                                           'xcb_poly_fill_arc_arcs'                                ,\
        xcb_poly_fill_arc_arcs_iterator                         ,<NONE>,                                           'xcb_poly_fill_arc_arcs_iterator'                       ,\
        xcb_poly_fill_arc_arcs_length                           ,<NONE>,                                           'xcb_poly_fill_arc_arcs_length'                         ,\
        xcb_poly_fill_arc_checked                               ,<NONE>,                                           'xcb_poly_fill_arc_checked'                             ,\
        xcb_poly_fill_arc_sizeof                                ,<NONE>,                                           'xcb_poly_fill_arc_sizeof'                              ,\
        xcb_poly_fill_rectangle                                 ,<NONE>,                                           'xcb_poly_fill_rectangle'                               ,\
        xcb_poly_fill_rectangle_checked                         ,<NONE>,                                           'xcb_poly_fill_rectangle_checked'                       ,\
        xcb_poly_fill_rectangle_rectangles                      ,<NONE>,                                           'xcb_poly_fill_rectangle_rectangles'                    ,\
        xcb_poly_fill_rectangle_rectangles_iterator             ,<NONE>,                                           'xcb_poly_fill_rectangle_rectangles_iterator'           ,\
        xcb_poly_fill_rectangle_rectangles_length               ,<NONE>,                                           'xcb_poly_fill_rectangle_rectangles_length'             ,\
        xcb_poly_fill_rectangle_sizeof                          ,<NONE>,                                           'xcb_poly_fill_rectangle_sizeof'                        ,\
        xcb_poly_line                                           ,<NONE>,                                           'xcb_poly_line'                                         ,\
        xcb_poly_line_checked                                   ,<NONE>,                                           'xcb_poly_line_checked'                                 ,\
        xcb_poly_line_points                                    ,<NONE>,                                           'xcb_poly_line_points'                                  ,\
        xcb_poly_line_points_iterator                           ,<NONE>,                                           'xcb_poly_line_points_iterator'                         ,\
        xcb_poly_line_points_length                             ,<NONE>,                                           'xcb_poly_line_points_length'                           ,\
        xcb_poly_line_sizeof                                    ,<NONE>,                                           'xcb_poly_line_sizeof'                                  ,\
        xcb_poly_point                                          ,<NONE>,                                           'xcb_poly_point'                                        ,\
        xcb_poly_point_checked                                  ,<NONE>,                                           'xcb_poly_point_checked'                                ,\
        xcb_poly_point_points                                   ,<NONE>,                                           'xcb_poly_point_points'                                 ,\
        xcb_poly_point_points_iterator                          ,<NONE>,                                           'xcb_poly_point_points_iterator'                        ,\
        xcb_poly_point_points_length                            ,<NONE>,                                           'xcb_poly_point_points_length'                          ,\
        xcb_poly_point_sizeof                                   ,<NONE>,                                           'xcb_poly_point_sizeof'                                 ,\
        xcb_poly_rectangle                                      ,<NONE>,                                           'xcb_poly_rectangle'                                    ,\
        xcb_poly_rectangle_checked                              ,<NONE>,                                           'xcb_poly_rectangle_checked'                            ,\
        xcb_poly_rectangle_rectangles                           ,<NONE>,                                           'xcb_poly_rectangle_rectangles'                         ,\
        xcb_poly_rectangle_rectangles_iterator                  ,<NONE>,                                           'xcb_poly_rectangle_rectangles_iterator'                ,\
        xcb_poly_rectangle_rectangles_length                    ,<NONE>,                                           'xcb_poly_rectangle_rectangles_length'                  ,\
        xcb_poly_rectangle_sizeof                               ,<NONE>,                                           'xcb_poly_rectangle_sizeof'                             ,\
        xcb_poly_segment                                        ,<NONE>,                                           'xcb_poly_segment'                                      ,\
        xcb_poly_segment_checked                                ,<NONE>,                                           'xcb_poly_segment_checked'                              ,\
        xcb_poly_segment_segments                               ,<NONE>,                                           'xcb_poly_segment_segments'                             ,\
        xcb_poly_segment_segments_iterator                      ,<NONE>,                                           'xcb_poly_segment_segments_iterator'                    ,\
        xcb_poly_segment_segments_length                        ,<NONE>,                                           'xcb_poly_segment_segments_length'                      ,\
        xcb_poly_segment_sizeof                                 ,<NONE>,                                           'xcb_poly_segment_sizeof'                               ,\
        xcb_poly_text_16                                        ,<NONE>,                                           'xcb_poly_text_16'                                      ,\
        xcb_poly_text_16_checked                                ,<NONE>,                                           'xcb_poly_text_16_checked'                              ,\
        xcb_poly_text_16_items                                  ,<NONE>,                                           'xcb_poly_text_16_items'                                ,\
        xcb_poly_text_16_items_end                              ,<NONE>,                                           'xcb_poly_text_16_items_end'                            ,\
        xcb_poly_text_16_items_length                           ,<NONE>,                                           'xcb_poly_text_16_items_length'                         ,\
        xcb_poly_text_16_sizeof                                 ,<NONE>,                                           'xcb_poly_text_16_sizeof'                               ,\
        xcb_poly_text_8                                         ,<NONE>,                                           'xcb_poly_text_8'                                       ,\
        xcb_poly_text_8_checked                                 ,<NONE>,                                           'xcb_poly_text_8_checked'                               ,\
        xcb_poly_text_8_items                                   ,<NONE>,                                           'xcb_poly_text_8_items'                                 ,\
        xcb_poly_text_8_items_end                               ,<NONE>,                                           'xcb_poly_text_8_items_end'                             ,\
        xcb_poly_text_8_items_length                            ,<NONE>,                                           'xcb_poly_text_8_items_length'                          ,\
        xcb_poly_text_8_sizeof                                  ,<NONE>,                                           'xcb_poly_text_8_sizeof'                                ,\
        xcb_popcount                                            ,<NONE>,                                           'xcb_popcount'                                          ,\
        xcb_prefetch_extension_data                             ,<NONE>,                                           'xcb_prefetch_extension_data'                           ,\
        xcb_prefetch_maximum_request_length                     ,<NONE>,                                           'xcb_prefetch_maximum_request_length'                   ,\
        xcb_put_image                                           ,<NONE>,                                           'xcb_put_image'                                         ,\
        xcb_put_image_checked                                   ,<NONE>,                                           'xcb_put_image_checked'                                 ,\
        xcb_put_image_data                                      ,<NONE>,                                           'xcb_put_image_data'                                    ,\
        xcb_put_image_data_end                                  ,<NONE>,                                           'xcb_put_image_data_end'                                ,\
        xcb_put_image_data_length                               ,<NONE>,                                           'xcb_put_image_data_length'                             ,\
        xcb_put_image_sizeof                                    ,<NONE>,                                           'xcb_put_image_sizeof'                                  ,\
        xcb_query_best_size                                     ,<NONE>,                                           'xcb_query_best_size'                                   ,\
        xcb_query_best_size_reply                               ,<NONE>,                                           'xcb_query_best_size_reply'                             ,\
        xcb_query_best_size_unchecked                           ,<NONE>,                                           'xcb_query_best_size_unchecked'                         ,\
        xcb_query_colors                                        ,<NONE>,                                           'xcb_query_colors'                                      ,\
        xcb_query_colors_colors                                 ,<NONE>,                                           'xcb_query_colors_colors'                               ,\
        xcb_query_colors_colors_iterator                        ,<NONE>,                                           'xcb_query_colors_colors_iterator'                      ,\
        xcb_query_colors_colors_length                          ,<NONE>,                                           'xcb_query_colors_colors_length'                        ,\
        xcb_query_colors_reply                                  ,<NONE>,                                           'xcb_query_colors_reply'                                ,\
        xcb_query_colors_sizeof                                 ,<NONE>,                                           'xcb_query_colors_sizeof'                               ,\
        xcb_query_colors_unchecked                              ,<NONE>,                                           'xcb_query_colors_unchecked'                            ,\
        xcb_query_extension                                     ,<NONE>,                                           'xcb_query_extension'                                   ,\
        xcb_query_extension_reply                               ,<NONE>,                                           'xcb_query_extension_reply'                             ,\
        xcb_query_extension_sizeof                              ,<NONE>,                                           'xcb_query_extension_sizeof'                            ,\
        xcb_query_extension_unchecked                           ,<NONE>,                                           'xcb_query_extension_unchecked'                         ,\
        xcb_query_font                                          ,<NONE>,                                           'xcb_query_font'                                        ,\
        xcb_query_font_char_infos                               ,<NONE>,                                           'xcb_query_font_char_infos'                             ,\
        xcb_query_font_char_infos_iterator                      ,<NONE>,                                           'xcb_query_font_char_infos_iterator'                    ,\
        xcb_query_font_char_infos_length                        ,<NONE>,                                           'xcb_query_font_char_infos_length'                      ,\
        xcb_query_font_properties                               ,<NONE>,                                           'xcb_query_font_properties'                             ,\
        xcb_query_font_properties_iterator                      ,<NONE>,                                           'xcb_query_font_properties_iterator'                    ,\
        xcb_query_font_properties_length                        ,<NONE>,                                           'xcb_query_font_properties_length'                      ,\
        xcb_query_font_reply                                    ,<NONE>,                                           'xcb_query_font_reply'                                  ,\
        xcb_query_font_sizeof                                   ,<NONE>,                                           'xcb_query_font_sizeof'                                 ,\
        xcb_query_font_unchecked                                ,<NONE>,                                           'xcb_query_font_unchecked'                              ,\
        xcb_query_keymap                                        ,<NONE>,                                           'xcb_query_keymap'                                      ,\
        xcb_query_keymap_reply                                  ,<NONE>,                                           'xcb_query_keymap_reply'                                ,\
        xcb_query_keymap_unchecked                              ,<NONE>,                                           'xcb_query_keymap_unchecked'                            ,\
        xcb_query_pointer                                       ,<NONE>,                                           'xcb_query_pointer'                                     ,\
        xcb_query_pointer_reply                                 ,<NONE>,                                           'xcb_query_pointer_reply'                               ,\
        xcb_query_pointer_unchecked                             ,<NONE>,                                           'xcb_query_pointer_unchecked'                           ,\
        xcb_query_text_extents                                  ,<NONE>,                                           'xcb_query_text_extents'                                ,\
        xcb_query_text_extents_reply                            ,<NONE>,                                           'xcb_query_text_extents_reply'                          ,\
        xcb_query_text_extents_sizeof                           ,<NONE>,                                           'xcb_query_text_extents_sizeof'                         ,\
        xcb_query_text_extents_unchecked                        ,<NONE>,                                           'xcb_query_text_extents_unchecked'                      ,\
        xcb_query_tree                                          ,<NONE>,                                           'xcb_query_tree'                                        ,\
        xcb_query_tree_children                                 ,<NONE>,                                           'xcb_query_tree_children'                               ,\
        xcb_query_tree_children_end                             ,<NONE>,                                           'xcb_query_tree_children_end'                           ,\
        xcb_query_tree_children_length                          ,<NONE>,                                           'xcb_query_tree_children_length'                        ,\
        xcb_query_tree_reply                                    ,<NONE>,                                           'xcb_query_tree_reply'                                  ,\
        xcb_query_tree_sizeof                                   ,<NONE>,                                           'xcb_query_tree_sizeof'                                 ,\
        xcb_query_tree_unchecked                                ,<NONE>,                                           'xcb_query_tree_unchecked'                              ,\
        xcb_recolor_cursor                                      ,<NONE>,                                           'xcb_recolor_cursor'                                    ,\
        xcb_recolor_cursor_checked                              ,<NONE>,                                           'xcb_recolor_cursor_checked'                            ,\
        xcb_rectangle_end                                       ,<NONE>,                                           'xcb_rectangle_end'                                     ,\
        xcb_rectangle_next                                      ,<NONE>,                                           'xcb_rectangle_next'                                    ,\
        xcb_register_for_special_xge                            ,<NONE>,                                           'xcb_register_for_special_xge'                          ,\
        xcb_reparent_window                                     ,<NONE>,                                           'xcb_reparent_window'                                   ,\
        xcb_reparent_window_checked                             ,<NONE>,                                           'xcb_reparent_window_checked'                           ,\
        xcb_request_check                                       ,<NONE>,                                           'xcb_request_check'                                     ,\
        xcb_rgb_end                                             ,<NONE>,                                           'xcb_rgb_end'                                           ,\
        xcb_rgb_next                                            ,<NONE>,                                           'xcb_rgb_next'                                          ,\
        xcb_rotate_properties                                   ,<NONE>,                                           'xcb_rotate_properties'                                 ,\
        xcb_rotate_properties_atoms                             ,<NONE>,                                           'xcb_rotate_properties_atoms'                           ,\
        xcb_rotate_properties_atoms_end                         ,<NONE>,                                           'xcb_rotate_properties_atoms_end'                       ,\
        xcb_rotate_properties_atoms_length                      ,<NONE>,                                           'xcb_rotate_properties_atoms_length'                    ,\
        xcb_rotate_properties_checked                           ,<NONE>,                                           'xcb_rotate_properties_checked'                         ,\
        xcb_rotate_properties_sizeof                            ,<NONE>,                                           'xcb_rotate_properties_sizeof'                          ,\
        xcb_screen_allowed_depths_iterator                      ,<NONE>,                                           'xcb_screen_allowed_depths_iterator'                    ,\
        xcb_screen_allowed_depths_length                        ,<NONE>,                                           'xcb_screen_allowed_depths_length'                      ,\
        xcb_screen_end                                          ,<NONE>,                                           'xcb_screen_end'                                        ,\
        xcb_screen_next                                         ,<NONE>,                                           'xcb_screen_next'                                       ,\
        xcb_screen_sizeof                                       ,<NONE>,                                           'xcb_screen_sizeof'                                     ,\
        xcb_segment_end                                         ,<NONE>,                                           'xcb_segment_end'                                       ,\
        xcb_segment_next                                        ,<NONE>,                                           'xcb_segment_next'                                      ,\
        xcb_send_event                                          ,<NONE>,                                           'xcb_send_event'                                        ,\
        xcb_send_event_checked                                  ,<NONE>,                                           'xcb_send_event_checked'                                ,\
        xcb_send_fd                                             ,<NONE>,                                           'xcb_send_fd'                                           ,\
        xcb_send_request                                        ,<NONE>,                                           'xcb_send_request'                                      ,\
        xcb_send_request64                                      ,<NONE>,                                           'xcb_send_request64'                                    ,\
        xcb_send_request_with_fds                               ,<NONE>,                                           'xcb_send_request_with_fds'                             ,\
        xcb_send_request_with_fds64                             ,<NONE>,                                           'xcb_send_request_with_fds64'                           ,\
        xcb_set_access_control                                  ,<NONE>,                                           'xcb_set_access_control'                                ,\
        xcb_set_access_control_checked                          ,<NONE>,                                           'xcb_set_access_control_checked'                        ,\
        xcb_set_clip_rectangles                                 ,<NONE>,                                           'xcb_set_clip_rectangles'                               ,\
        xcb_set_clip_rectangles_checked                         ,<NONE>,                                           'xcb_set_clip_rectangles_checked'                       ,\
        xcb_set_clip_rectangles_rectangles                      ,<NONE>,                                           'xcb_set_clip_rectangles_rectangles'                    ,\
        xcb_set_clip_rectangles_rectangles_iterator             ,<NONE>,                                           'xcb_set_clip_rectangles_rectangles_iterator'           ,\
        xcb_set_clip_rectangles_rectangles_length               ,<NONE>,                                           'xcb_set_clip_rectangles_rectangles_length'             ,\
        xcb_set_clip_rectangles_sizeof                          ,<NONE>,                                           'xcb_set_clip_rectangles_sizeof'                        ,\
        xcb_set_close_down_mode                                 ,<NONE>,                                           'xcb_set_close_down_mode'                               ,\
        xcb_set_close_down_mode_checked                         ,<NONE>,                                           'xcb_set_close_down_mode_checked'                       ,\
        xcb_set_dashes                                          ,<NONE>,                                           'xcb_set_dashes'                                        ,\
        xcb_set_dashes_checked                                  ,<NONE>,                                           'xcb_set_dashes_checked'                                ,\
        xcb_set_dashes_dashes                                   ,<NONE>,                                           'xcb_set_dashes_dashes'                                 ,\
        xcb_set_dashes_dashes_end                               ,<NONE>,                                           'xcb_set_dashes_dashes_end'                             ,\
        xcb_set_dashes_dashes_length                            ,<NONE>,                                           'xcb_set_dashes_dashes_length'                          ,\
        xcb_set_dashes_sizeof                                   ,<NONE>,                                           'xcb_set_dashes_sizeof'                                 ,\
        xcb_set_font_path                                       ,<NONE>,                                           'xcb_set_font_path'                                     ,\
        xcb_set_font_path_checked                               ,<NONE>,                                           'xcb_set_font_path_checked'                             ,\
        xcb_set_font_path_font_iterator                         ,<NONE>,                                           'xcb_set_font_path_font_iterator'                       ,\
        xcb_set_font_path_font_length                           ,<NONE>,                                           'xcb_set_font_path_font_length'                         ,\
        xcb_set_font_path_sizeof                                ,<NONE>,                                           'xcb_set_font_path_sizeof'                              ,\
        xcb_set_input_focus                                     ,<NONE>,                                           'xcb_set_input_focus'                                   ,\
        xcb_set_input_focus_checked                             ,<NONE>,                                           'xcb_set_input_focus_checked'                           ,\
        xcb_set_modifier_mapping                                ,<NONE>,                                           'xcb_set_modifier_mapping'                              ,\
        xcb_set_modifier_mapping_reply                          ,<NONE>,                                           'xcb_set_modifier_mapping_reply'                        ,\
        xcb_set_modifier_mapping_sizeof                         ,<NONE>,                                           'xcb_set_modifier_mapping_sizeof'                       ,\
        xcb_set_modifier_mapping_unchecked                      ,<NONE>,                                           'xcb_set_modifier_mapping_unchecked'                    ,\
        xcb_set_pointer_mapping                                 ,<NONE>,                                           'xcb_set_pointer_mapping'                               ,\
        xcb_set_pointer_mapping_reply                           ,<NONE>,                                           'xcb_set_pointer_mapping_reply'                         ,\
        xcb_set_pointer_mapping_sizeof                          ,<NONE>,                                           'xcb_set_pointer_mapping_sizeof'                        ,\
        xcb_set_pointer_mapping_unchecked                       ,<NONE>,                                           'xcb_set_pointer_mapping_unchecked'                     ,\
        xcb_set_screen_saver                                    ,<NONE>,                                           'xcb_set_screen_saver'                                  ,\
        xcb_set_screen_saver_checked                            ,<NONE>,                                           'xcb_set_screen_saver_checked'                          ,\
        xcb_set_selection_owner                                 ,<NONE>,                                           'xcb_set_selection_owner'                               ,\
        xcb_set_selection_owner_checked                         ,<NONE>,                                           'xcb_set_selection_owner_checked'                       ,\
        xcb_setup_authenticate_end                              ,<NONE>,                                           'xcb_setup_authenticate_end'                            ,\
        xcb_setup_authenticate_next                             ,<NONE>,                                           'xcb_setup_authenticate_next'                           ,\
        xcb_setup_authenticate_reason                           ,<NONE>,                                           'xcb_setup_authenticate_reason'                         ,\
        xcb_setup_authenticate_reason_end                       ,<NONE>,                                           'xcb_setup_authenticate_reason_end'                     ,\
        xcb_setup_authenticate_reason_length                    ,<NONE>,                                           'xcb_setup_authenticate_reason_length'                  ,\
        xcb_setup_authenticate_sizeof                           ,<NONE>,                                           'xcb_setup_authenticate_sizeof'                         ,\
        xcb_setup_end                                           ,<NONE>,                                           'xcb_setup_end'                                         ,\
        xcb_setup_failed_end                                    ,<NONE>,                                           'xcb_setup_failed_end'                                  ,\
        xcb_setup_failed_next                                   ,<NONE>,                                           'xcb_setup_failed_next'                                 ,\
        xcb_setup_failed_reason                                 ,<NONE>,                                           'xcb_setup_failed_reason'                               ,\
        xcb_setup_failed_reason_end                             ,<NONE>,                                           'xcb_setup_failed_reason_end'                           ,\
        xcb_setup_failed_reason_length                          ,<NONE>,                                           'xcb_setup_failed_reason_length'                        ,\
        xcb_setup_failed_sizeof                                 ,<NONE>,                                           'xcb_setup_failed_sizeof'                               ,\
        xcb_setup_next                                          ,<NONE>,                                           'xcb_setup_next'                                        ,\
        xcb_setup_pixmap_formats                                ,<NONE>,                                           'xcb_setup_pixmap_formats'                              ,\
        xcb_setup_pixmap_formats_iterator                       ,<NONE>,                                           'xcb_setup_pixmap_formats_iterator'                     ,\
        xcb_setup_pixmap_formats_length                         ,<NONE>,                                           'xcb_setup_pixmap_formats_length'                       ,\
        xcb_setup_request_authorization_protocol_data           ,<NONE>,                                           'xcb_setup_request_authorization_protocol_data'         ,\
        xcb_setup_request_authorization_protocol_data_end       ,<NONE>,                                           'xcb_setup_request_authorization_protocol_data_end'     ,\
        xcb_setup_request_authorization_protocol_data_length    ,<NONE>,                                           'xcb_setup_request_authorization_protocol_data_length'  ,\
        xcb_setup_request_authorization_protocol_name           ,<NONE>,                                           'xcb_setup_request_authorization_protocol_name'         ,\
        xcb_setup_request_authorization_protocol_name_end       ,<NONE>,                                           'xcb_setup_request_authorization_protocol_name_end'     ,\
        xcb_setup_request_authorization_protocol_name_length    ,<NONE>,                                           'xcb_setup_request_authorization_protocol_name_length'  ,\
        xcb_setup_request_end                                   ,<NONE>,                                           'xcb_setup_request_end'                                 ,\
        xcb_setup_request_next                                  ,<NONE>,                                           'xcb_setup_request_next'                                ,\
        xcb_setup_request_sizeof                                ,<NONE>,                                           'xcb_setup_request_sizeof'                              ,\
        xcb_setup_roots_iterator                                ,<NONE>,                                           'xcb_setup_roots_iterator'                              ,\
        xcb_setup_roots_length                                  ,<NONE>,                                           'xcb_setup_roots_length'                                ,\
        xcb_setup_sizeof                                        ,<NONE>,                                           'xcb_setup_sizeof'                                      ,\
        xcb_setup_vendor                                        ,<NONE>,                                           'xcb_setup_vendor'                                      ,\
        xcb_setup_vendor_end                                    ,<NONE>,                                           'xcb_setup_vendor_end'                                  ,\
        xcb_setup_vendor_length                                 ,<NONE>,                                           'xcb_setup_vendor_length'                               ,\
        xcb_store_colors                                        ,<NONE>,                                           'xcb_store_colors'                                      ,\
        xcb_store_colors_checked                                ,<NONE>,                                           'xcb_store_colors_checked'                              ,\
        xcb_store_colors_items                                  ,<NONE>,                                           'xcb_store_colors_items'                                ,\
        xcb_store_colors_items_iterator                         ,<NONE>,                                           'xcb_store_colors_items_iterator'                       ,\
        xcb_store_colors_items_length                           ,<NONE>,                                           'xcb_store_colors_items_length'                         ,\
        xcb_store_colors_sizeof                                 ,<NONE>,                                           'xcb_store_colors_sizeof'                               ,\
        xcb_store_named_color                                   ,<NONE>,                                           'xcb_store_named_color'                                 ,\
        xcb_store_named_color_checked                           ,<NONE>,                                           'xcb_store_named_color_checked'                         ,\
        xcb_store_named_color_name                              ,<NONE>,                                           'xcb_store_named_color_name'                            ,\
        xcb_store_named_color_name_end                          ,<NONE>,                                           'xcb_store_named_color_name_end'                        ,\
        xcb_store_named_color_name_length                       ,<NONE>,                                           'xcb_store_named_color_name_length'                     ,\
        xcb_store_named_color_sizeof                            ,<NONE>,                                           'xcb_store_named_color_sizeof'                          ,\
        xcb_str_end                                             ,<NONE>,                                           'xcb_str_end'                                           ,\
        xcb_str_name                                            ,<NONE>,                                           'xcb_str_name'                                          ,\
        xcb_str_name_end                                        ,<NONE>,                                           'xcb_str_name_end'                                      ,\
        xcb_str_name_length                                     ,<NONE>,                                           'xcb_str_name_length'                                   ,\
        xcb_str_next                                            ,<NONE>,                                           'xcb_str_next'                                          ,\
        xcb_str_sizeof                                          ,<NONE>,                                           'xcb_str_sizeof'                                        ,\
        xcb_sumof                                               ,<NONE>,                                           'xcb_sumof'                                             ,\
        xcb_take_socket                                         ,<NONE>,                                           'xcb_take_socket'                                       ,\
        xcb_timecoord_end                                       ,<NONE>,                                           'xcb_timecoord_end'                                     ,\
        xcb_timecoord_next                                      ,<NONE>,                                           'xcb_timecoord_next'                                    ,\
        xcb_timestamp_end                                       ,<NONE>,                                           'xcb_timestamp_end'                                     ,\
        xcb_timestamp_next                                      ,<NONE>,                                           'xcb_timestamp_next'                                    ,\
        xcb_total_read                                          ,<NONE>,                                           'xcb_total_read'                                        ,\
        xcb_total_written                                       ,<NONE>,                                           'xcb_total_written'                                     ,\
        xcb_translate_coordinates                               ,<NONE>,                                           'xcb_translate_coordinates'                             ,\
        xcb_translate_coordinates_reply                         ,<NONE>,                                           'xcb_translate_coordinates_reply'                       ,\
        xcb_translate_coordinates_unchecked                     ,<NONE>,                                           'xcb_translate_coordinates_unchecked'                   ,\
        xcb_ungrab_button                                       ,<NONE>,                                           'xcb_ungrab_button'                                     ,\
        xcb_ungrab_button_checked                               ,<NONE>,                                           'xcb_ungrab_button_checked'                             ,\
        xcb_ungrab_key                                          ,<NONE>,                                           'xcb_ungrab_key'                                        ,\
        xcb_ungrab_keyboard                                     ,<NONE>,                                           'xcb_ungrab_keyboard'                                   ,\
        xcb_ungrab_keyboard_checked                             ,<NONE>,                                           'xcb_ungrab_keyboard_checked'                           ,\
        xcb_ungrab_key_checked                                  ,<NONE>,                                           'xcb_ungrab_key_checked'                                ,\
        xcb_ungrab_pointer                                      ,<NONE>,                                           'xcb_ungrab_pointer'                                    ,\
        xcb_ungrab_pointer_checked                              ,<NONE>,                                           'xcb_ungrab_pointer_checked'                            ,\
        xcb_ungrab_server                                       ,<NONE>,                                           'xcb_ungrab_server'                                     ,\
        xcb_ungrab_server_checked                               ,<NONE>,                                           'xcb_ungrab_server_checked'                             ,\
        xcb_uninstall_colormap                                  ,<NONE>,                                           'xcb_uninstall_colormap'                                ,\
        xcb_uninstall_colormap_checked                          ,<NONE>,                                           'xcb_uninstall_colormap_checked'                        ,\
        xcb_unmap_subwindows                                    ,<NONE>,                                           'xcb_unmap_subwindows'                                  ,\
        xcb_unmap_subwindows_checked                            ,<NONE>,                                           'xcb_unmap_subwindows_checked'                          ,\
        xcb_unmap_window                                        ,<NONE>,                                           'xcb_unmap_window'                                      ,\
        xcb_unmap_window_checked                                ,<NONE>,                                           'xcb_unmap_window_checked'                              ,\
        xcb_unregister_for_special_event                        ,<NONE>,                                           'xcb_unregister_for_special_event'                      ,\
        xcb_visualid_end                                        ,<NONE>,                                           'xcb_visualid_end'                                      ,\
        xcb_visualid_next                                       ,<NONE>,                                           'xcb_visualid_next'                                     ,\
        xcb_visualtype_end                                      ,<NONE>,                                           'xcb_visualtype_end'                                    ,\
        xcb_visualtype_next                                     ,<NONE>,                                           'xcb_visualtype_next'                                   ,\
        xcb_wait_for_event                                      ,<NONE>,                                           'xcb_wait_for_event'                                    ,\
        xcb_wait_for_reply                                      ,<NONE>,                                           'xcb_wait_for_reply'                                    ,\
        xcb_wait_for_reply64                                    ,<NONE>,                                           'xcb_wait_for_reply64'                                  ,\
        xcb_wait_for_special_event                              ,<NONE>,                                           'xcb_wait_for_special_event'                            ,\
        xcb_warp_pointer                                        ,<NONE>,                                           'xcb_warp_pointer'                                      ,\
        xcb_warp_pointer_checked                                ,<NONE>,                                           'xcb_warp_pointer_checked'                              ,\
        xcb_window_end                                          ,<NONE>,                                           'xcb_window_end'                                        ,\
        xcb_window_next                                         ,<NONE>,                                           'xcb_window_next'                                       ,\
        xcb_writev                                              ,<NONE>,                                           'xcb_writev'                                            ,\
        xcb_xc_misc_get_version                                 ,<NONE>,                                           'xcb_xc_misc_get_version'                               ,\
        xcb_xc_misc_get_version_reply                           ,<NONE>,                                           'xcb_xc_misc_get_version_reply'                         ,\
        xcb_xc_misc_get_version_unchecked                       ,<NONE>,                                           'xcb_xc_misc_get_version_unchecked'                     ,\
        xcb_xc_misc_get_xid_list                                ,<NONE>,                                           'xcb_xc_misc_get_xid_list'                              ,\
        xcb_xc_misc_get_xid_list_ids                            ,<NONE>,                                           'xcb_xc_misc_get_xid_list_ids'                          ,\
        xcb_xc_misc_get_xid_list_ids_end                        ,<NONE>,                                           'xcb_xc_misc_get_xid_list_ids_end'                      ,\
        xcb_xc_misc_get_xid_list_ids_length                     ,<NONE>,                                           'xcb_xc_misc_get_xid_list_ids_length'                   ,\
        xcb_xc_misc_get_xid_list_reply                          ,<NONE>,                                           'xcb_xc_misc_get_xid_list_reply'                        ,\
        xcb_xc_misc_get_xid_list_sizeof                         ,<NONE>,                                           'xcb_xc_misc_get_xid_list_sizeof'                       ,\
        xcb_xc_misc_get_xid_list_unchecked                      ,<NONE>,                                           'xcb_xc_misc_get_xid_list_unchecked'                    ,\
        xcb_xc_misc_get_xid_range                               ,<NONE>,                                           'xcb_xc_misc_get_xid_range'                             ,\
        xcb_xc_misc_get_xid_range_reply                         ,<NONE>,                                           'xcb_xc_misc_get_xid_range_reply'                       ,\
        xcb_xc_misc_get_xid_range_unchecked                     ,<NONE>,                                           'xcb_xc_misc_get_xid_range_unchecked'                   ,\
        xcb_xc_misc_id                                          ,<NONE>,                                           'xcb_xc_misc_id'




import_proto 'libxcb-shm.so'                                                                                                                                                   ,\
        xcb_shm_attach                                         ,<NONE>,                                           'xcb_shm_attach'                                             ,\
        xcb_shm_attach_checked                                 ,<NONE>,                                           'xcb_shm_attach_checked'                                     ,\
        xcb_shm_attach_fd                                      ,<NONE>,                                           'xcb_shm_attach_fd'                                          ,\
        xcb_shm_attach_fd_checked                              ,<NONE>,                                           'xcb_shm_attach_fd_checked'                                  ,\
        xcb_shm_create_pixmap                                  ,<NONE>,                                           'xcb_shm_create_pixmap'                                      ,\
        xcb_shm_create_pixmap_checked                          ,<NONE>,                                           'xcb_shm_create_pixmap_checked'                              ,\
        xcb_shm_create_segment                                 ,<NONE>,                                           'xcb_shm_create_segment'                                     ,\
        xcb_shm_create_segment_reply                           ,<NONE>,                                           'xcb_shm_create_segment_reply'                               ,\
        xcb_shm_create_segment_reply_fds                       ,<NONE>,                                           'xcb_shm_create_segment_reply_fds'                           ,\
        xcb_shm_create_segment_unchecked                       ,<NONE>,                                           'xcb_shm_create_segment_unchecked'                           ,\
        xcb_shm_detach                                         ,<NONE>,                                           'xcb_shm_detach'                                             ,\
        xcb_shm_detach_checked                                 ,<NONE>,                                           'xcb_shm_detach_checked'                                     ,\
        xcb_shm_get_image                                      ,<NONE>,                                           'xcb_shm_get_image'                                          ,\
        xcb_shm_get_image_reply                                ,<NONE>,                                           'xcb_shm_get_image_reply'                                    ,\
        xcb_shm_get_image_unchecked                            ,<NONE>,                                           'xcb_shm_get_image_unchecked'                                ,\
        xcb_shm_put_image                                      ,<NONE>,                                           'xcb_shm_put_image'                                          ,\
        xcb_shm_put_image_checked                              ,<NONE>,                                           'xcb_shm_put_image_checked'                                  ,\
        xcb_shm_query_version                                  ,<NONE>,                                           'xcb_shm_query_version'                                      ,\
        xcb_shm_query_version_reply                            ,<NONE>,                                           'xcb_shm_query_version_reply'                                ,\
        xcb_shm_query_version_unchecked                        ,<NONE>,                                           'xcb_shm_query_version_unchecked'                            ,\
        xcb_shm_seg_end                                        ,<NONE>,                                           'xcb_shm_seg_end'                                            ,\
        xcb_shm_seg_next                                       ,<NONE>,                                           'xcb_shm_seg_next'                                           ,\
        xcb_shm_id                                             ,<NONE>,                                           'xcb_shm_id'          ;<< This is variable!






















Added freshlib/imports/Linux/pthreads.inc.







































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: libpthread (posix threads) import library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes: Needs editing of the function arguments
;_________________________________________________________________________________________

import_proto  'libpthread.so.0',                                                                                         \
fork                              ,<NONE>,                                      'fork',                                  \
longjmp                           ,<NONE>,                                      'longjmp',                               \
pthread_atfork                    ,<NONE>,                                      'pthread_atfork',                        \
pthread_attr_destroy              ,<NONE>,                                      'pthread_attr_destroy',                  \
pthread_attr_getaffinity_np       ,<NONE>,                                      'pthread_attr_getaffinity_np',           \
pthread_attr_getdetachstate       ,<NONE>,                                      'pthread_attr_getdetachstate',           \
pthread_attr_getguardsize         ,<NONE>,                                      'pthread_attr_getguardsize',             \
pthread_attr_getinheritsched      ,<NONE>,                                      'pthread_attr_getinheritsched',          \
pthread_attr_getschedparam        ,<NONE>,                                      'pthread_attr_getschedparam',            \
pthread_attr_getschedpolicy       ,<NONE>,                                      'pthread_attr_getschedpolicy',           \
pthread_attr_getscope             ,<NONE>,                                      'pthread_attr_getscope',                 \
pthread_attr_getstack             ,<NONE>,                                      'pthread_attr_getstack',                 \
pthread_attr_getstackaddr         ,<NONE>,                                      'pthread_attr_getstackaddr',             \
pthread_attr_getstacksize         ,<NONE>,                                      'pthread_attr_getstacksize',             \
pthread_attr_init                 ,<NONE>,                                      'pthread_attr_init',                     \
pthread_attr_setaffinity_np       ,<NONE>,                                      'pthread_attr_setaffinity_np',           \
pthread_attr_setdetachstate       ,<NONE>,                                      'pthread_attr_setdetachstate',           \
pthread_attr_setguardsize         ,<NONE>,                                      'pthread_attr_setguardsize',             \
pthread_attr_setinheritsched      ,<NONE>,                                      'pthread_attr_setinheritsched',          \
pthread_attr_setschedparam        ,<NONE>,                                      'pthread_attr_setschedparam',            \
pthread_attr_setschedpolicy       ,<NONE>,                                      'pthread_attr_setschedpolicy',           \
pthread_attr_setscope             ,<NONE>,                                      'pthread_attr_setscope',                 \
pthread_attr_setstack             ,<NONE>,                                      'pthread_attr_setstack',                 \
pthread_attr_setstackaddr         ,<NONE>,                                      'pthread_attr_setstackaddr',             \
pthread_attr_setstacksize         ,<NONE>,                                      'pthread_attr_setstacksize',             \
pthread_barrier_destroy           ,<NONE>,                                      'pthread_barrier_destroy',               \
pthread_barrier_init              ,<NONE>,                                      'pthread_barrier_init',                  \
pthread_barrier_wait              ,<NONE>,                                      'pthread_barrier_wait',                  \
pthread_barrierattr_destroy       ,<NONE>,                                      'pthread_barrierattr_destroy',           \
pthread_barrierattr_getpshared    ,<NONE>,                                      'pthread_barrierattr_getpshared',        \
pthread_barrierattr_init          ,<NONE>,                                      'pthread_barrierattr_init',              \
pthread_barrierattr_setpshared    ,<NONE>,                                      'pthread_barrierattr_setpshared',        \
pthread_cancel                    ,<NONE>,                                      'pthread_cancel',                        \
pthread_cond_broadcast            ,<NONE>,                                      'pthread_cond_broadcast',                \
pthread_cond_destroy              ,<NONE>,                                      'pthread_cond_destroy',                  \
pthread_cond_init                 ,<NONE>,                                      'pthread_cond_init',                     \
pthread_cond_signal               ,<NONE>,                                      'pthread_cond_signal',                   \
pthread_cond_timedwait            ,<NONE>,                                      'pthread_cond_timedwait',                \
pthread_cond_wait                 ,<NONE>,                                      'pthread_cond_wait',                     \
pthread_condattr_destroy          ,<NONE>,                                      'pthread_condattr_destroy',              \
pthread_condattr_getclock         ,<NONE>,                                      'pthread_condattr_getclock',             \
pthread_condattr_getpshared       ,<NONE>,                                      'pthread_condattr_getpshared',           \
pthread_condattr_init             ,<NONE>,                                      'pthread_condattr_init',                 \
pthread_condattr_setclock         ,<NONE>,                                      'pthread_condattr_setclock',             \
pthread_condattr_setpshared       ,<NONE>,                                      'pthread_condattr_setpshared',           \
pthread_create                    ,<.pThreadID, .attr, .pThreadProc, .argument>,'pthread_create',                        \
pthread_detach                    ,<NONE>,                                      'pthread_detach',                        \
pthread_equal                     ,<NONE>,                                      'pthread_equal',                         \
pthread_exit                      ,<.retval>,                                   'pthread_exit',                          \
pthread_getaffinity_np            ,<NONE>,                                      'pthread_getaffinity_np',                \
pthread_getattr_np                ,<NONE>,                                      'pthread_getattr_np',                    \
pthread_getconcurrency            ,<NONE>,                                      'pthread_getconcurrency',                \
pthread_getcpuclockid             ,<NONE>,                                      'pthread_getcpuclockid',                 \
pthread_getschedparam             ,<NONE>,                                      'pthread_getschedparam',                 \
pthread_getspecific               ,<NONE>,                                      'pthread_getspecific',                   \
pthread_join                      ,<NONE>,                                      'pthread_join',                          \
pthread_key_create                ,<NONE>,                                      'pthread_key_create',                    \
pthread_key_delete                ,<NONE>,                                      'pthread_key_delete',                    \
pthread_kill                      ,<.ThreadID, .signal>,                        'pthread_kill',                          \
pthread_kill_other_threads_np     ,<NONE>,                                      'pthread_kill_other_threads_np',         \
pthread_mutex_consistent_np       ,<NONE>,                                      'pthread_mutex_consistent_np',           \
pthread_mutex_destroy             ,<.pMutex>,                                   'pthread_mutex_destroy',                 \
pthread_mutex_getprioceiling      ,<NONE>,                                      'pthread_mutex_getprioceiling',          \
pthread_mutex_init                ,<.pMutex, .pAttr>,                           'pthread_mutex_init',                    \
pthread_mutex_lock                ,<.pMutex>,                                   'pthread_mutex_lock',                    \
pthread_mutex_setprioceiling      ,<NONE>,                                      'pthread_mutex_setprioceiling',          \
pthread_mutex_timedlock           ,<.pMutex, .pTimeout>,                        'pthread_mutex_timedlock',               \
pthread_mutex_trylock             ,<.pMutex>,                                   'pthread_mutex_trylock',                 \
pthread_mutex_unlock              ,<.pMutex>,                                   'pthread_mutex_unlock',                  \
pthread_mutexattr_destroy         ,<.pAttr>,                                    'pthread_mutexattr_destroy',             \
pthread_mutexattr_getkind_np      ,<NONE>,                                      'pthread_mutexattr_getkind_np',          \
pthread_mutexattr_getprioceiling  ,<NONE>,                                      'pthread_mutexattr_getprioceiling',      \
pthread_mutexattr_getprotocol     ,<NONE>,                                      'pthread_mutexattr_getprotocol',         \
pthread_mutexattr_getpshared      ,<NONE>,                                      'pthread_mutexattr_getpshared',          \
pthread_mutexattr_getrobust_np    ,<NONE>,                                      'pthread_mutexattr_getrobust_np',        \
pthread_mutexattr_gettype         ,<NONE>,                                      'pthread_mutexattr_gettype',             \
pthread_mutexattr_init            ,<.pAttr>,                                    'pthread_mutexattr_init',                \
pthread_mutexattr_setkind_np      ,<NONE>,                                      'pthread_mutexattr_setkind_np',          \
pthread_mutexattr_setprioceiling  ,<NONE>,                                      'pthread_mutexattr_setprioceiling',      \
pthread_mutexattr_setprotocol     ,<NONE>,                                      'pthread_mutexattr_setprotocol',         \
pthread_mutexattr_setpshared      ,<NONE>,                                      'pthread_mutexattr_setpshared',          \
pthread_mutexattr_setrobust_np    ,<NONE>,                                      'pthread_mutexattr_setrobust_np',        \
pthread_mutexattr_settype         ,<NONE>,                                      'pthread_mutexattr_settype',             \
pthread_once                      ,<NONE>,                                      'pthread_once',                          \
pthread_rwlock_destroy            ,<NONE>,                                      'pthread_rwlock_destroy',                \
pthread_rwlock_init               ,<NONE>,                                      'pthread_rwlock_init',                   \
pthread_rwlock_rdlock             ,<NONE>,                                      'pthread_rwlock_rdlock',                 \
pthread_rwlock_timedrdlock        ,<NONE>,                                      'pthread_rwlock_timedrdlock',            \
pthread_rwlock_timedwrlock        ,<NONE>,                                      'pthread_rwlock_timedwrlock',            \
pthread_rwlock_tryrdlock          ,<NONE>,                                      'pthread_rwlock_tryrdlock',              \
pthread_rwlock_trywrlock          ,<NONE>,                                      'pthread_rwlock_trywrlock',              \
pthread_rwlock_unlock             ,<NONE>,                                      'pthread_rwlock_unlock',                 \
pthread_rwlock_wrlock             ,<NONE>,                                      'pthread_rwlock_wrlock',                 \
pthread_rwlockattr_destroy        ,<NONE>,                                      'pthread_rwlockattr_destroy',            \
pthread_rwlockattr_getkind_np     ,<NONE>,                                      'pthread_rwlockattr_getkind_np',         \
pthread_rwlockattr_getpshared     ,<NONE>,                                      'pthread_rwlockattr_getpshared',         \
pthread_rwlockattr_init           ,<NONE>,                                      'pthread_rwlockattr_init',               \
pthread_rwlockattr_setkind_np     ,<NONE>,                                      'pthread_rwlockattr_setkind_np',         \
pthread_rwlockattr_setpshared     ,<NONE>,                                      'pthread_rwlockattr_setpshared',         \
pthread_self                      ,<NONE>,                                      'pthread_self',                          \
pthread_setaffinity_np            ,<NONE>,                                      'pthread_setaffinity_np',                \
pthread_setcancelstate            ,<NONE>,                                      'pthread_setcancelstate',                \
pthread_setcanceltype             ,<NONE>,                                      'pthread_setcanceltype',                 \
pthread_setconcurrency            ,<NONE>,                                      'pthread_setconcurrency',                \
pthread_setschedparam             ,<NONE>,                                      'pthread_setschedparam',                 \
pthread_setschedprio              ,<NONE>,                                      'pthread_setschedprio',                  \
pthread_setspecific               ,<NONE>,                                      'pthread_setspecific',                   \
pthread_sigmask                   ,<NONE>,                                      'pthread_sigmask',                       \
pthread_spin_destroy              ,<NONE>,                                      'pthread_spin_destroy',                  \
pthread_spin_init                 ,<NONE>,                                      'pthread_spin_init',                     \
pthread_spin_lock                 ,<NONE>,                                      'pthread_spin_lock',                     \
pthread_spin_trylock              ,<NONE>,                                      'pthread_spin_trylock',                  \
pthread_spin_unlock               ,<NONE>,                                      'pthread_spin_unlock',                   \
pthread_testcancel                ,<NONE>,                                      'pthread_testcancel',                    \
pthread_timedjoin_np              ,<NONE>,                                      'pthread_timedjoin_np',                  \
pthread_tryjoin_np                ,<NONE>,                                      'pthread_tryjoin_np',                    \
pthread_yield                     ,<NONE>,                                      'pthread_yield',                         \
pwrite                            ,<NONE>,                                      'pwrite',                                \
pwrite64                          ,<NONE>,                                      'pwrite64',                              \
raise                             ,<NONE>,                                      'raise',                                 \
\;read                              ,<NONE>,                                      'read',                                  \
recv                              ,<NONE>,                                      'recv',                                  \
recvfrom                          ,<NONE>,                                      'recvfrom',                              \
recvmsg                           ,<NONE>,                                      'recvmsg',                               \
sem_close                         ,<NONE>,                                      'sem_close',                             \
sem_destroy                       ,<NONE>,                                      'sem_destroy',                           \
sem_getvalue                      ,<NONE>,                                      'sem_getvalue',                          \
sem_init                          ,<NONE>,                                      'sem_init',                              \
sem_open                          ,<NONE>,                                      'sem_open',                              \
sem_post                          ,<NONE>,                                      'sem_post',                              \
sem_timedwait                     ,<NONE>,                                      'sem_timedwait',                         \
sem_trywait                       ,<NONE>,                                      'sem_trywait',                           \
sem_unlink                        ,<NONE>,                                      'sem_unlink',                            \
sem_wait                          ,<NONE>,                                      'sem_wait',                              \
send                              ,<NONE>,                                      'send',                                  \
sendmsg                           ,<NONE>,                                      'sendmsg',                               \
sendto                            ,<NONE>,                                      'sendto',                                \
sigaction                         ,<NONE>,                                      'sigaction',                             \
siglongjmp                        ,<NONE>,                                      'siglongjmp',                            \
sigwait                           ,<NONE>,                                      'sigwait',                               \
system                            ,<NONE>,                                      'system',                                \
tcdrain                           ,<NONE>,                                      'tcdrain',                               \
vfork                             ,<NONE>,                                      'vfork',                                 \
waitpid                           ,<NONE>,                                      'waitpid';,                               \
\;write                             ,<NONE>,                                      'write'



Added freshlib/imports/Linux/sdl.inc.

















































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: SDL v1.2.11 API functions.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;
; SDL 1.2.11 includes written by Raedwulf
; a.k.a. Tai Chi Minh Ralph Eastwood
;
; There's no warranty for the correctness nor completeness of this file
; However, please mail me at tcmreastwood@ntlworld.com if you spot
; any errors in here.
;
; Version Date: 07/11/2006 (dd/mm/yyyy)
;_________________________________________________________________________________________

import_proto 'libSDL-1.2.so.0',                         \
    SDL_AddTimer, <NONE>, 'SDL_AddTimer',               \
    SDL_AllocRW, <NONE>, 'SDL_AllocRW',                 \
    SDL_AudioDriverName, <NONE>, 'SDL_AudioDriverName', \
    SDL_AudioInit, <NONE>, 'SDL_AudioInit',             \
    SDL_AudioQuit, <NONE>, 'SDL_AudioQuit',             \
    SDL_BuildAudioCVT, <NONE>, 'SDL_BuildAudioCVT',     \
    SDL_CDClose, <NONE>, 'SDL_CDClose',                 \
    SDL_CDEject, <NONE>, 'SDL_CDEject',                 \
    SDL_CDName, <NONE>, 'SDL_CDName',                   \
    SDL_CDNumDrives, <NONE>, 'SDL_CDNumDrives',         \
    SDL_CDOpen, <NONE>, 'SDL_CDOpen',                   \
    SDL_CDPause, <NONE>, 'SDL_CDPause',                 \
    SDL_CDPlay, <NONE>, 'SDL_CDPlay',                   \
    SDL_CDPlayTracks, <NONE>, 'SDL_CDPlayTracks',\
    SDL_CDResume, <NONE>, 'SDL_CDResume',\
    SDL_CDStatus, <NONE>, 'SDL_CDStatus',\
    SDL_CDStop, <NONE>, 'SDL_CDStop',\
    SDL_ClearError, <NONE>, 'SDL_ClearError',\
    SDL_CloseAudio, <NONE>, 'SDL_CloseAudio',\
    SDL_CondBroadcast, <NONE>, 'SDL_CondBroadcast',\
    SDL_CondSignal, <NONE>, 'SDL_CondSignal',\
    SDL_CondWait, <NONE>, 'SDL_CondWait',\
    SDL_CondWaitTimeout, <NONE>, 'SDL_CondWaitTimeout',\
    SDL_ConvertAudio, <NONE>, 'SDL_ConvertAudio',\
    SDL_ConvertSurface, <NONE>, 'SDL_ConvertSurface',\
    SDL_CreateCond, <NONE>, 'SDL_CreateCond',\
    SDL_CreateCursor, <NONE>, 'SDL_CreateCursor',\
    SDL_CreateMutex, <NONE>, 'SDL_CreateMutex',\
    SDL_CreateRGBSurface, <NONE>, 'SDL_CreateRGBSurface',\
    SDL_CreateRGBSurfaceFrom, <NONE>, 'SDL_CreateRGBSurfaceFrom',\
    SDL_CreateSemaphore, <NONE>, 'SDL_CreateSemaphore',\
    SDL_CreateThread, <NONE>, 'SDL_CreateThread',\
    SDL_CreateYUVOverlay, <NONE>, 'SDL_CreateYUVOverlay',\
    SDL_Delay, <NONE>, 'SDL_Delay',\
    SDL_DestroyCond, <NONE>, 'SDL_DestroyCond',\
    SDL_DestroyMutex, <NONE>, 'SDL_DestroyMutex',\
    SDL_DestroySemaphore, <NONE>, 'SDL_DestroySemaphore',\
    SDL_DisplayFormat, <NONE>, 'SDL_DisplayFormat',\
    SDL_DisplayFormatAlpha, <NONE>, 'SDL_DisplayFormatAlpha',\
    SDL_DisplayYUVOverlay, <NONE>, 'SDL_DisplayYUVOverlay',\
    SDL_EnableKeyRepeat, <NONE>, 'SDL_EnableKeyRepeat',\
    SDL_EnableUNICODE, <NONE>, 'SDL_EnableUNICODE',\
    SDL_Error, <NONE>, 'SDL_Error',\
    SDL_EventState, <NONE>, 'SDL_EventState',\
    SDL_FillRect, <NONE>, 'SDL_FillRect',\
    SDL_Flip, <NONE>, 'SDL_Flip',\
    SDL_FreeCursor, <NONE>, 'SDL_FreeCursor',\
    SDL_FreeRW, <NONE>, 'SDL_FreeRW',\
    SDL_FreeSurface, <NONE>, 'SDL_FreeSurface',\
    SDL_FreeWAV, <NONE>, 'SDL_FreeWAV',\
    SDL_FreeYUVOverlay, <NONE>, 'SDL_FreeYUVOverlay',\
    SDL_GL_GetAttribute, <NONE>, 'SDL_GL_GetAttribute',\
    SDL_GL_GetProcAddress, <NONE>, 'SDL_GL_GetProcAddress',\
    SDL_GL_LoadLibrary, <NONE>, 'SDL_GL_LoadLibrary',\
    SDL_GL_Lock, <NONE>, 'SDL_GL_Lock',\
    SDL_GL_SetAttribute, <NONE>, 'SDL_GL_SetAttribute',\
    SDL_GL_SwapBuffers, <NONE>, 'SDL_GL_SwapBuffers',\
    SDL_GL_Unlock, <NONE>, 'SDL_GL_Unlock',\
    SDL_GL_UpdateRects, <NONE>, 'SDL_GL_UpdateRects',\
    SDL_GetAppState, <NONE>, 'SDL_GetAppState',\
    SDL_GetAudioStatus, <NONE>, 'SDL_GetAudioStatus',\
    SDL_GetClipRect, <NONE>, 'SDL_GetClipRect',\
    SDL_GetCursor, <NONE>, 'SDL_GetCursor',\
    SDL_GetError, <NONE>, 'SDL_GetError',\
    SDL_GetEventFilter, <NONE>, 'SDL_GetEventFilter',\
    SDL_GetGammaRamp, <NONE>, 'SDL_GetGammaRamp',\
    SDL_GetKeyName, <NONE>, 'SDL_GetKeyName',\
    SDL_GetKeyRepeat, <NONE>, 'SDL_GetKeyRepeat',\
    SDL_GetKeyState, <NONE>, 'SDL_GetKeyState',\
    SDL_GetModState, <NONE>, 'SDL_GetModState',\
    SDL_GetMouseState, <NONE>, 'SDL_GetMouseState',\
    SDL_GetRGB, <NONE>, 'SDL_GetRGB',\
    SDL_GetRGBA, <NONE>, 'SDL_GetRGBA',\
    SDL_GetRelativeMouseState, <NONE>, 'SDL_GetRelativeMouseState',\
    SDL_GetThreadID, <NONE>, 'SDL_GetThreadID',\
    SDL_GetTicks, <NONE>, 'SDL_GetTicks',\
    SDL_GetVideoInfo, <NONE>, 'SDL_GetVideoInfo',\
    SDL_GetVideoSurface, <NONE>, 'SDL_GetVideoSurface',\
    SDL_GetWMInfo, <NONE>, 'SDL_GetWMInfo',\
    SDL_Has3DNow, <NONE>, 'SDL_Has3DNow',\
    SDL_Has3DNowExt, <NONE>, 'SDL_Has3DNowExt',\
    SDL_HasAltiVec, <NONE>, 'SDL_HasAltiVec',\
    SDL_HasMMX, <NONE>, 'SDL_HasMMX',\
    SDL_HasMMXExt, <NONE>, 'SDL_HasMMXExt',\
    SDL_HasRDTSC, <NONE>, 'SDL_HasRDTSC',\
    SDL_HasSSE, <NONE>, 'SDL_HasSSE',\
    SDL_HasSSE2, <NONE>, 'SDL_HasSSE2',\
    SDL_Init, <NONE>, 'SDL_Init',\
    SDL_InitSubSystem, <NONE>, 'SDL_InitSubSystem',\
    SDL_JoystickClose, <NONE>, 'SDL_JoystickClose',\
    SDL_JoystickEventState, <NONE>, 'SDL_JoystickEventState',\
    SDL_JoystickGetAxis, <NONE>, 'SDL_JoystickGetAxis',\
    SDL_JoystickGetBall, <NONE>, 'SDL_JoystickGetBall',\
    SDL_JoystickGetButton, <NONE>, 'SDL_JoystickGetButton',\
    SDL_JoystickGetHat, <NONE>, 'SDL_JoystickGetHat',\
    SDL_JoystickIndex, <NONE>, 'SDL_JoystickIndex',\
    SDL_JoystickName, <NONE>, 'SDL_JoystickName',\
    SDL_JoystickNumAxes, <NONE>, 'SDL_JoystickNumAxes',\
    SDL_JoystickNumBalls, <NONE>, 'SDL_JoystickNumBalls',\
    SDL_JoystickNumButtons, <NONE>, 'SDL_JoystickNumButtons',\
    SDL_JoystickNumHats, <NONE>, 'SDL_JoystickNumHats',\
    SDL_JoystickOpen, <NONE>, 'SDL_JoystickOpen',\
    SDL_JoystickOpened, <NONE>, 'SDL_JoystickOpened',\
    SDL_JoystickUpdate, <NONE>, 'SDL_JoystickUpdate',\
    SDL_KillThread, <NONE>, 'SDL_KillThread',\
    SDL_Linked_Version, <NONE>, 'SDL_Linked_Version',\
    SDL_ListModes, <NONE>, 'SDL_ListModes',\
    SDL_LoadBMP_RW, <NONE>, 'SDL_LoadBMP_RW',\
    SDL_LoadFunction, <NONE>, 'SDL_LoadFunction',\
    SDL_LoadObject, <NONE>, 'SDL_LoadObject',\
    SDL_LoadWAV_RW, <NONE>, 'SDL_LoadWAV_RW',\
    SDL_LockAudio, <NONE>, 'SDL_LockAudio',\
    SDL_LockSurface, <NONE>, 'SDL_LockSurface',\
    SDL_LockYUVOverlay, <NONE>, 'SDL_LockYUVOverlay',\
    SDL_LowerBlit, <NONE>, 'SDL_LowerBlit',\
    SDL_MapRGB, <NONE>, 'SDL_MapRGB',\
    SDL_MapRGBA, <NONE>, 'SDL_MapRGBA',\
    SDL_MixAudio, <NONE>, 'SDL_MixAudio',\
    SDL_NumJoysticks, <NONE>, 'SDL_NumJoysticks',\
    SDL_OpenAudio, <NONE>, 'SDL_OpenAudio',\
    SDL_PauseAudio, <NONE>, 'SDL_PauseAudio',\
    SDL_PeepEvents, <NONE>, 'SDL_PeepEvents',\
    SDL_PollEvent, <NONE>, 'SDL_PollEvent',\
    SDL_PumpEvents, <NONE>, 'SDL_PumpEvents',\
    SDL_PushEvent, <NONE>, 'SDL_PushEvent',\
    SDL_Quit, <NONE>, 'SDL_Quit',\
    SDL_QuitSubSystem, <NONE>, 'SDL_QuitSubSystem',\
    SDL_RWFromConstMem, <NONE>, 'SDL_RWFromConstMem',\
    SDL_RWFromFP, <NONE>, 'SDL_RWFromFP',\
    SDL_RWFromFile, <NONE>, 'SDL_RWFromFile',\
    SDL_RWFromMem, <NONE>, 'SDL_RWFromMem',\
    SDL_ReadBE16, <NONE>, 'SDL_ReadBE16',\
    SDL_ReadBE32, <NONE>, 'SDL_ReadBE32',\
    SDL_ReadBE64, <NONE>, 'SDL_ReadBE64',\
    SDL_ReadLE16, <NONE>, 'SDL_ReadLE16',\
    SDL_ReadLE32, <NONE>, 'SDL_ReadLE32',\
    SDL_ReadLE64, <NONE>, 'SDL_ReadLE64',\
    SDL_RegisterApp, <NONE>, 'SDL_RegisterApp',\
    SDL_RemoveTimer, <NONE>, 'SDL_RemoveTimer',\
    SDL_SaveBMP_RW, <NONE>, 'SDL_SaveBMP_RW',\
    SDL_SemPost, <NONE>, 'SDL_SemPost',\
    SDL_SemTryWait, <NONE>, 'SDL_SemTryWait',\
    SDL_SemValue, <NONE>, 'SDL_SemValue',\
    SDL_SemWait, <NONE>, 'SDL_SemWait',\
    SDL_SemWaitTimeout, <NONE>, 'SDL_SemWaitTimeout',\
    SDL_SetAlpha, <NONE>, 'SDL_SetAlpha',\
    SDL_SetClipRect, <NONE>, 'SDL_SetClipRect',\
    SDL_SetColorKey, <NONE>, 'SDL_SetColorKey',\
    SDL_SetColors, <NONE>, 'SDL_SetColors',\
    SDL_SetCursor, <NONE>, 'SDL_SetCursor',\
    SDL_SetError, <NONE>, 'SDL_SetError',\
    SDL_SetEventFilter, <NONE>, 'SDL_SetEventFilter',\
    SDL_SetGamma, <NONE>, 'SDL_SetGamma',\
    SDL_SetGammaRamp, <NONE>, 'SDL_SetGammaRamp',\
    SDL_SetModState, <NONE>, 'SDL_SetModState',\
    SDL_SetModuleHandle, <NONE>, 'SDL_SetModuleHandle',\
    SDL_SetPalette, <NONE>, 'SDL_SetPalette',\
    SDL_SetTimer, <NONE>, 'SDL_SetTimer',\
    SDL_SetVideoMode, <NONE>, 'SDL_SetVideoMode',\
    SDL_ShowCursor, <NONE>, 'SDL_ShowCursor',\
    SDL_SoftStretch, <NONE>, 'SDL_SoftStretch',\
    SDL_ThreadID, <NONE>, 'SDL_ThreadID',\
    SDL_UnloadObject, <NONE>, 'SDL_UnloadObject',\
    SDL_UnlockAudio, <NONE>, 'SDL_UnlockAudio',\
    SDL_UnlockSurface, <NONE>, 'SDL_UnlockSurface',\
    SDL_UnlockYUVOverlay, <NONE>, 'SDL_UnlockYUVOverlay',\
    SDL_UnregisterApp, <NONE>, 'SDL_UnregisterApp',\
    SDL_UpdateRect, <NONE>, 'SDL_UpdateRect',\
    SDL_UpdateRects, <NONE>, 'SDL_UpdateRects',\
    SDL_UpperBlit, <NONE>, 'SDL_UpperBlit',\
    SDL_VideoDriverName, <NONE>, 'SDL_VideoDriverName',\
    SDL_VideoInit, <NONE>, 'SDL_VideoInit',\
    SDL_VideoModeOK, <NONE>, 'SDL_VideoModeOK',\
    SDL_VideoQuit, <NONE>, 'SDL_VideoQuit',\
    SDL_WM_GetCaption, <NONE>, 'SDL_WM_GetCaption',\
    SDL_WM_GrabInput, <NONE>, 'SDL_WM_GrabInput',\
    SDL_WM_IconifyWindow, <NONE>, 'SDL_WM_IconifyWindow',\
    SDL_WM_SetCaption, <NONE>, 'SDL_WM_SetCaption',\
    SDL_WM_SetIcon, <NONE>, 'SDL_WM_SetIcon',\
    SDL_WM_ToggleFullScreen, <NONE>, 'SDL_WM_ToggleFullScreen',\
    SDL_WaitEvent, <NONE>, 'SDL_WaitEvent',\
    SDL_WaitThread, <NONE>, 'SDL_WaitThread',\
    SDL_WarpMouse, <NONE>, 'SDL_WarpMouse',\
    SDL_WasInit, <NONE>, 'SDL_WasInit',\
    SDL_WriteBE16, <NONE>, 'SDL_WriteBE16',\
    SDL_WriteBE32, <NONE>, 'SDL_WriteBE32',\
    SDL_WriteBE64, <NONE>, 'SDL_WriteBE64',\
    SDL_WriteLE16, <NONE>, 'SDL_WriteLE16',\
    SDL_WriteLE32, <NONE>, 'SDL_WriteLE32',\
    SDL_WriteLE64, <NONE>, 'SDL_WriteLE64',\
    SDL_getenv, <NONE>, 'SDL_getenv',\
    SDL_iconv, <NONE>, 'SDL_iconv',\
    SDL_iconv_close, <NONE>, 'SDL_iconv_close',\
    SDL_iconv_open, <NONE>, 'SDL_iconv_open',\
    SDL_iconv_string, <NONE>, 'SDL_iconv_string',\
    SDL_lltoa, <NONE>, 'SDL_lltoa',\
    SDL_mutexP, <NONE>, 'SDL_mutexP',\
    SDL_mutexV, <NONE>, 'SDL_mutexV',\
    SDL_putenv, <NONE>, 'SDL_putenv',\
    SDL_revcpy, <NONE>, 'SDL_revcpy',\
    SDL_snprintf, <NONE>, 'SDL_snprintf',\
    SDL_strdup, <NONE>, 'SDL_strdup',\
    SDL_strlcat, <NONE>, 'SDL_strlcat',\
    SDL_strlcpy, <NONE>, 'SDL_strlcpy',\
    SDL_strtoull, <NONE>, 'SDL_strtoull',\
    SDL_ulltoa, <NONE>, 'SDL_ulltoa',\
    SDL_vsnprintf, <NONE>, 'SDL_vsnprintf'

Added freshlib/imports/Linux/sdl_image.inc.

































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: SDL_image v1.2 API functions.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
; _______________________________________________________________________________________

import_proto 'libSDL_image-1.2.so.0',                         \
    IMG_Load, <NONE>, 'IMG_Load'

Added freshlib/imports/Linux/sqleet.inc.



























































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: sqlite3.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto './libsqleet.so',  \
    sqliteAggregateContext, <.context, .nbytes>,  'sqlite3_aggregate_context',  \
    sqliteAutoExtension, <.ptrCallback>,  'sqlite3_auto_extension',  \
    sqliteBackupFinish, <.ptrBackup>,  'sqlite3_backup_finish',  \
    sqliteBackupInit, <.ptrDestDB, .ptrDestName, .ptrSourceDB, .ptrSourceName>,  'sqlite3_backup_init',  \
    sqliteBackupPageCount, <.ptrBackup>,  'sqlite3_backup_pagecount',  \
    sqliteBackupRemaining, <.ptrBackup>,  'sqlite3_backup_remaining',  \
    sqliteBackupStep, <.ptrBackup, .nPage>,  'sqlite3_backup_step',  \
    sqliteBindBlob, <.stmt, .index, .ptrData, .nbytes, .destructor>,  'sqlite3_bind_blob',  \
    sqliteBindDouble, <.stmt, .index, .value>,  'sqlite3_bind_double',  \
    sqliteBindInt, <.stmt, .index, .value>,  'sqlite3_bind_int',  \
    sqliteBindInt64, <.stmt, .index, .valueLo, .valueHi>,  'sqlite3_bind_int64',  \
    sqliteBindNull, <.stmt, .index>,  'sqlite3_bind_null',  \
    sqliteBindParameterCount, <.stmt>,  'sqlite3_bind_parameter_count',  \
    sqliteBindParameterIndex, <.stmt, .paramName>,  'sqlite3_bind_parameter_index',  \
    sqliteBindParameterName, <.stmt, .paramIndex>,  'sqlite3_bind_parameter_name',  \
    sqliteBindText, <.stmt, .index, .ptrText, .nbytes, .destructor>,  'sqlite3_bind_text',  \
    sqliteBindText16, <.stmt, .index, .ptrText, .nbytes, .destructor>,  'sqlite3_bind_text16',  \
    sqliteBindValue, <.stmt, .index, .ptrValue>,  'sqlite3_bind_value',  \
    sqliteBindZeroblob, <.stmt, .index, .size>,  'sqlite3_bind_zeroblob',  \
    sqliteBlobBytes, <.hBlob>,  'sqlite3_blob_bytes',  \
    sqliteBlobClose, <.hBlob>,  'sqlite3_blob_close',  \
    sqliteBlobOpen, <.ptrDB, .DBname, .Table, .Column, .iRow, .flags, .ptrVarBlob>,  'sqlite3_blob_open',  \
    sqliteBlobRead, <.hBlob, .ptrBuffer, .bytes, .iOffset>,  'sqlite3_blob_read',  \
    sqliteBlobWrite, <.hBlob, .ptrBuffer, .bytes, .iOffset>,  'sqlite3_blob_write',  \
    sqliteBusyHandler, <.ptrDB, .ptrProc, .lParam>,  'sqlite3_busy_handler',  \
    sqliteBusyTimeout, <.ptrDB, .time_ms>,  'sqlite3_busy_timeout',  \
    sqliteChanges, <.ptrDB>,  'sqlite3_changes',  \
    sqliteClearBindings, <.stmt>,  'sqlite3_clear_bindings',  \
    sqliteClose, <.ptrDatabase>,  'sqlite3_close',  \
    sqliteCollationNeeded, <.ptrDB, .lparam, .ptrCallback>,  'sqlite3_collation_needed',  \
    sqliteCollationNeeded16, <.ptrDB, .lparam, .ptrCallback>,  'sqlite3_collation_needed16',  \
    sqliteColumnBlob, <.stmt, .iCol>,  'sqlite3_column_blob',  \
    sqliteColumnBytes, <.stmt, .iCol>,  'sqlite3_column_bytes',  \
    sqliteColumnBytes16, <.stmt, .iCol>,  'sqlite3_column_bytes16',  \
    sqliteColumnCount, <.stmt>,  'sqlite3_column_count',  \
    sqliteColumnDatabaseName, <.stmt, .index>,  'sqlite3_column_database_name',  \
    sqliteColumnDatabaseName16, <.stmt, .index>,  'sqlite3_column_database_name16',  \
    sqliteColumnDeclType, <.stmt, .index>,  'sqlite3_column_decltype',  \
    sqliteColumnDeclType16, <.stmt, .index>,  'sqlite3_column_decltype16',  \
    sqliteColumnDouble, <.stmt, .iCol>,  'sqlite3_column_double',  \
    sqliteColumnInt, <.stmt, .iCol>,  'sqlite3_column_int',  \
    sqliteColumnInt64, <.stmt, .iCol>,  'sqlite3_column_int64',  \
    sqliteColumnName, <.stmt, .index>,  'sqlite3_column_name',  \
    sqliteColumnName16, <.stmt, .index>,  'sqlite3_column_name16',  \
    sqliteColumnOriginName, <.stmt, .index>,  'sqlite3_column_origin_name',  \
    sqliteColumnOriginName16, <.stmt, .index>,  'sqlite3_column_origin_name16',  \
    sqliteColumnTableName, <.stmt, .index>,  'sqlite3_column_table_name',  \
    sqliteColumnTableName16, <.stmt, .index>,  'sqlite3_column_table_name16',  \
    sqliteColumnText, <.stmt, .iCol>,  'sqlite3_column_text',  \
    sqliteColumnText16, <.stmt, .iCol>,  'sqlite3_column_text16',  \
    sqliteColumnType, <.stmt, .iCol>,  'sqlite3_column_type',  \
    sqliteColumnValue, <.stmt, .iCol>,  'sqlite3_column_value',  \
    sqliteCommitHook, <.ptrDB, .ptrHook, .lparam>,  'sqlite3_commit_hook',  \
    sqliteCompileOptionGet, <.N>,  'sqlite3_compileoption_get',  \
    sqliteCompileOptionUsed, <.ptrOptName>,  'sqlite3_compileoption_used',  \
    sqliteComplete, <.ptrSQL>,  'sqlite3_complete',  \
    sqliteComplete16, <.ptrSQL>,  'sqlite3_complete16',  \
    sqliteConfig, <.index, ...>,  'sqlite3_config',  \
    sqliteContextDBHandle, <.context>,  'sqlite3_context_db_handle',  \
    sqliteCreateCollation, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare>,  'sqlite3_create_collation',  \
    sqliteCreateCollation16, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare>,  'sqlite3_create_collation16',  \
    sqliteCreateCollation_v2, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare, .ptrDestroy>,  'sqlite3_create_collation_v2',  \
    sqliteCreateFunction, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal>,  'sqlite3_create_function',  \
    sqliteCreateFunction16, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal>,  'sqlite3_create_function16',  \
    sqliteCreateFunction_v2, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal, .procDestroy>,  'sqlite3_create_function_v2',  \
    sqliteCreateModule, <.ptrDB, .ptrModuleName, .ptrVTableModule, .lparam>,  'sqlite3_create_module',  \
    sqliteCreateModule_v2, <.ptrDB, .ptrModuleName, .ptrVTableModule, .lparam, .procDestroy>,  'sqlite3_create_module_v2',  \
    sqliteDBConfig, <.ptrDB, .index, ...>,  'sqlite3_db_config',  \
    sqliteDBHandle, <.stmt>,  'sqlite3_db_handle',  \
    sqliteDBMutex, <.ptrDB>,  'sqlite3_db_mutex',  \
    sqliteDBStatus, <.ptrDB, .index, .ptrRetCurrent, .ptrRetHighest, .flagReset>,  'sqlite3_db_status',  \
    sqliteDataCount, <.stmt>,  'sqlite3_data_count',  \
    sqliteDeclareVtab, <.ptrDB, .ptrSQL>,  'sqlite3_declare_vtab',  \
    sqliteEnableLoadExtension, <.ptrDB, .flagEnable>,  'sqlite3_enable_load_extension',  \
    sqliteEnableSharedCache, <.flagEnable>,  'sqlite3_enable_shared_cache',  \
    sqliteErrCode, <.ptrDB>,  'sqlite3_errcode',  \
    sqliteErrMsg, <.ptrDB>,  'sqlite3_errmsg',  \
    sqliteErrMsg16, <.ptrDB>,  'sqlite3_errmsg16',  \
    sqliteErrStr, <.err_code>, 'sqlite3_errstr',    \
    sqliteExec, <.ptrDB, .ptrSQL, .procCallback, .lparam, .ptrVarErrMsg>,  'sqlite3_exec',  \
    sqliteExtendedErrCode, <.ptrDB>,  'sqlite3_extended_errcode',  \
    sqliteExtendedResultCodes, <.ptrDB, .flagEnable>,  'sqlite3_extended_result_codes',  \
    sqliteFileControl, <.ptrDB, .ptrDBName, .wparam, .lparam>,  'sqlite3_file_control',  \
    _sqliteFinalize, <.stmt>,  'sqlite3_finalize',  \
    sqliteFree, <.ptrmem>,  'sqlite3_free',  \
    sqliteFreeTable, <.ptrVarResult>,  'sqlite3_free_table',  \
    sqliteGetAutocommit, <.ptrDB>,  'sqlite3_get_autocommit',  \
    sqliteGetAuxdata, <.context, .N>,  'sqlite3_get_auxdata',  \
    sqliteGetTable, <.ptrDB, .ptrSQL, .ptrVarResult, .ptrVarRows, .ptrVarColumns, .ptrVarErrorMsg>,  'sqlite3_get_table',  \
    sqliteInitialize, <VOID>,  'sqlite3_initialize',  \
    sqliteInterrupt, <.ptrDB>,  'sqlite3_interrupt',  \
    sqliteLastInsertRowID, <.ptrDB>,  'sqlite3_last_insert_rowid',  \
    sqliteLibVersion, <VOID>,  'sqlite3_libversion',  \
    sqliteLibversionNumber, <VOID>,  'sqlite3_libversion_number',  \
    sqliteLimit, <.ptrDB, .idLimit, .newVal>,  'sqlite3_limit',  \
    sqliteLoadExtension, <.ptrDB, .nameDLL, .entryProc, .ptrVarErrMsg>,  'sqlite3_load_extension',  \
    sqliteLog, <.iErrCode, .ptrFormat, ...>,  'sqlite3_log',  \
    sqliteKey, <.ptrDB, .pKey, .pKeyLen>, 'sqlite3_key',                     \
    sqliteKey_v2, <.ptrDB, .pDbName, .pKey, .pKeyLen>, 'sqlite3_key_v2',     \
    sqliteMAlloc, <.size>,  'sqlite3_malloc',  \
    sqliteMemoryHighWater, <.flagReset>,  'sqlite3_memory_highwater',  \
    sqliteMemoryUsed, <VOID>,  'sqlite3_memory_used',  \
    sqliteMprintf, <.ptrString, ...>,  'sqlite3_mprintf',  \
    sqliteMutexAlloc, <.type>,  'sqlite3_mutex_alloc',  \
    sqliteMutexEnter, <.hMutex>,  'sqlite3_mutex_enter',  \
    sqliteMutexFree, <.hMutex>,  'sqlite3_mutex_free',  \
    sqliteMutexLeave, <.hMutex>,  'sqlite3_mutex_leave',  \
    sqliteMutexTry, <.hMutex>,  'sqlite3_mutex_try',  \
    sqliteNextStmt, <.ptrDB, .stmt>,  'sqlite3_next_stmt',  \
    sqliteOSEnd, <VOID>,  'sqlite3_os_end',  \
    sqliteOSInit, <VOID>,  'sqlite3_os_init',  \
    sqliteOpen, <.ptrFileName, .ptrVarDB>,  'sqlite3_open',  \
    sqliteOpen16, <.ptrFileName, .ptrVarDB>,  'sqlite3_open16',  \
    sqliteOpen_v2, <.ptrFileName, .ptrVarDB, .flags, .ptrVFSName>,  'sqlite3_open_v2',  \
    sqliteOverloadFunction, <.ptrDB, .ptrFuncName, .lparam>,  'sqlite3_overload_function',  \
    sqlitePrepare, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare',  \
    sqlitePrepare16, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare16',  \
    sqlitePrepare16_v2, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare16_v2',  \
    _sqlitePrepare_v2, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare_v2',  \
    sqliteProfile, <.ptrDB, .procProfiler, .lparam>,  'sqlite3_profile',  \
    sqliteProgressHandler, <.ptrDB, .N, .procProgress, .lparam>,  'sqlite3_progress_handler',  \
    sqliteRandomness, <.bytes, .buffer>,  'sqlite3_randomness',  \
    sqliteReAlloc, <.ptrmem, .newsize>,  'sqlite3_realloc',  \
    sqliteRekey, <.ptrDB, .pNewKey, .nKeyLen>, 'sqlite3_rekey',                            \
    sqliteRekey_v2, <.ptrDB, .pDbName, .pNewKey, .nKeyLen>, 'sqlite3_rekey_v2',         \
    sqliteReleaseMemory, <.bytes>,  'sqlite3_release_memory',  \
    sqliteReset, <.stmt>,  'sqlite3_reset',  \
    sqliteResetAutoExtension, <VOID>,  'sqlite3_reset_auto_extension',  \
    sqliteResultBlob, <.context, .ptrdata, .size, .procDestroy>,  'sqlite3_result_blob',  \
    sqliteResultDouble, <.context, .double>,  'sqlite3_result_double',  \
    sqliteResultError, <.context, .ptrErrMsg, .size>,  'sqlite3_result_error',  \
    sqliteResultError16, <.context, .ptrErrMsg, .size>,  'sqlite3_result_error16',  \
    sqliteResultErrorCode, <.context, .errcode>,  'sqlite3_result_error_code',  \
    sqliteResultErrorNoMem, <.context>,  'sqlite3_result_error_nomem',  \
    sqliteResultErrorTooBig, <.context>,  'sqlite3_result_error_toobig',  \
    sqliteResultInt, <.context, .integer>,  'sqlite3_result_int',  \
    sqliteResultInt64, <.context, .int64Lo, .int64Hi>,  'sqlite3_result_int64',  \
    sqliteResultNULL, <.context>,  'sqlite3_result_null',  \
    sqliteResultText, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text',  \
    sqliteResultText16, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16',  \
    sqliteResultText16be, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16be',  \
    sqliteResultText16le, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16le',  \
    sqliteResultValue, <.context, .ptrValue>,  'sqlite3_result_value',  \
    sqliteResultZeroBlob, <.context, .size>,  'sqlite3_result_zeroblob',  \
    sqliteRollbackHook, <.ptrDB, .ptrHook, .lparam>,  'sqlite3_rollback_hook',  \
    sqliteRtreeGeometryCallback, <NONE>,  'sqlite3_rtree_geometry_callback',  \
    sqliteSQL, <.stmt>,  'sqlite3_sql',  \
    sqliteSetAuthorizer, <.ptrDB, .procAuthorizer, .lparam>,  'sqlite3_set_authorizer',  \
    sqliteSetAuxdata, <.context, .N, .ptrData, .procDestructor>,  'sqlite3_set_auxdata',  \
    sqliteShutdown, <VOID>,  'sqlite3_shutdown',  \
    sqliteSleep, <.sleep_ms>,  'sqlite3_sleep',  \
    sqliteSnprintf, <.size, .ptrBuffer, .ptrString, ...>,  'sqlite3_snprintf',  \
    sqliteSoftHeapLimit, <.N>,  'sqlite3_soft_heap_limit',  \
    sqliteSoftHeapLimit64, <.sizeLo, .sizeHi>,  'sqlite3_soft_heap_limit64',  \
    sqliteSourceID, <VOID>,  'sqlite3_sourceid',  \
    sqliteStatus, <.paramIndex, .ptrVarResult, .ptrVarHighwater, .flagReset>,  'sqlite3_status',  \
    sqliteStep, <.stmt>,  'sqlite3_step',  \
    sqliteStmtStatus, <.stmt, .paramIndex, .flagReset>,  'sqlite3_stmt_status',  \
    sqliteStrnicmp, <.ptrStr1, .ptrStr2, .size>,  'sqlite3_strnicmp',  \
    sqliteTableColumnMetadata, <.ptrDB, .ptrDBName, .ptrTableName, .ptrColumnName, .ptrVarDataType, .ptrVarCollSeq, .ptrVarNotNull,  \
        .ptrVarPrimaryKey, .ptrVarAutoInc>,  'sqlite3_table_column_metadata',  \
    sqliteTestControl, <.opCode, ...>,  'sqlite3_test_control',  \
    sqliteThreadsafe, <VOID>,  'sqlite3_threadsafe',  \
    sqliteTotalChanges, <.ptrDB>,  'sqlite3_total_changes',  \
    sqliteTrace, <.ptrDB, .procTrace, .lparam>,  'sqlite3_trace',  \
    sqliteUpdateHook, <.ptrDB, .procUpdateHook, .lparam>,  'sqlite3_update_hook',  \
    sqliteUserData, <.context>,  'sqlite3_user_data',  \
    sqliteValueBlob, <.ptrValue>,  'sqlite3_value_blob',  \
    sqliteValueBytes, <.ptrValue>,  'sqlite3_value_bytes',  \
    sqliteValueBytes16, <.ptrValue>,  'sqlite3_value_bytes16',  \
    sqliteValueDouble, <.ptrValue>,  'sqlite3_value_double',  \
    sqliteValueInt, <.ptrValue>,  'sqlite3_value_int',  \
    sqliteValueInt64, <.ptrValue>,  'sqlite3_value_int64',  \
    sqliteValueNumericType, <.ptrValue>,  'sqlite3_value_numeric_type',  \
    sqliteValueText, <.ptrValue>,  'sqlite3_value_text',  \
    sqliteValueText16, <.ptrValue>,  'sqlite3_value_text16',  \
    sqliteValueText16be, <.ptrValue>,  'sqlite3_value_text16be',  \
    sqliteValueText16le, <.ptrValue>,  'sqlite3_value_text16le',  \
    sqliteValueType, <.ptrValue>,  'sqlite3_value_type',  \
    sqliteVersion, <VOID>,  'sqlite3_version',  \
    sqliteVfsFind, <.ptrVFSName>,  'sqlite3_vfs_find',  \
    sqliteVfsRegister, <.hVFS, .flagDefault>,  'sqlite3_vfs_register',  \
    sqliteVfsUnregister, <.hVFS>,  'sqlite3_vfs_unregister',  \
    sqliteVmprintf, <.ptrString, .va_list>,  'sqlite3_vmprintf',  \
    sqliteWalAutocheckpoint, <.ptrDB, .N>,  'sqlite3_wal_autocheckpoint',  \
    sqliteWalCheckpoint, <.ptrDB, .ptrDBName>,  'sqlite3_wal_checkpoint',  \
    sqliteWalCheckpoint_v2, <.ptrDB, .ptrDBName, .eMode, .pvarLog, .pvarCkpt>,  'sqlite3_wal_checkpoint_v2',  \
    sqliteWalHook, <.ptrDB, .procCommitHook, .lparam>,  'sqlite3_wal_hook',  \
    sqliteWin32_MbcsToUtf8, <NONE>,  'sqlite3_win32_mbcs_to_utf8'

Added freshlib/imports/Linux/sqlite3.inc.





























































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: sqlite3.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto 'libsqlite3.so.0',  \
    sqliteAggregateContext, <.context, .nbytes>,  'sqlite3_aggregate_context',  \
    sqliteAggregateCount_OLD, <VOID>,  'sqlite3_aggregate_count',  \
    sqliteAutoExtension, <.ptrCallback>,  'sqlite3_auto_extension',  \
    sqliteBackupFinish, <.ptrBackup>,  'sqlite3_backup_finish',  \
    sqliteBackupInit, <.ptrDestDB, .ptrDestName, .ptrSourceDB, .ptrSourceName>,  'sqlite3_backup_init',  \
    sqliteBackupPageCount, <.ptrBackup>,  'sqlite3_backup_pagecount',  \
    sqliteBackupRemaining, <.ptrBackup>,  'sqlite3_backup_remaining',  \
    sqliteBackupStep, <.ptrBackup, .nPage>,  'sqlite3_backup_step',  \
    sqliteBindBlob, <.stmt, .index, .ptrData, .nbytes, .destructor>,  'sqlite3_bind_blob',  \
    sqliteBindDouble, <.stmt, .index, .value>,  'sqlite3_bind_double',  \
    sqliteBindInt, <.stmt, .index, .value>,  'sqlite3_bind_int',  \
    sqliteBindInt64, <.stmt, .index, .valueLo, .valueHi>,  'sqlite3_bind_int64',  \
    sqliteBindNull, <.stmt, .index>,  'sqlite3_bind_null',  \
    sqliteBindParameterCount, <.stmt>,  'sqlite3_bind_parameter_count',  \
    sqliteBindParameterIndex, <.stmt, .paramName>,  'sqlite3_bind_parameter_index',  \
    sqliteBindParameterName, <.stmt, .paramIndex>,  'sqlite3_bind_parameter_name',  \
    sqliteBindText, <.stmt, .index, .ptrText, .nbytes, .destructor>,  'sqlite3_bind_text',  \
    sqliteBindText16, <.stmt, .index, .ptrText, .nbytes, .destructor>,  'sqlite3_bind_text16',  \
    sqliteBindValue, <.stmt, .index, .ptrValue>,  'sqlite3_bind_value',  \
    sqliteBindZeroblob, <.stmt, .index, .size>,  'sqlite3_bind_zeroblob',  \
    sqliteBlobBytes, <.hBlob>,  'sqlite3_blob_bytes',  \
    sqliteBlobClose, <.hBlob>,  'sqlite3_blob_close',  \
    sqliteBlobOpen, <.ptrDB, .DBname, .Table, .Column, .iRow, .flags, .ptrVarBlob>,  'sqlite3_blob_open',  \
    sqliteBlobRead, <.hBlob, .ptrBuffer, .bytes, .iOffset>,  'sqlite3_blob_read',  \
    sqliteBlobWrite, <.hBlob, .ptrBuffer, .bytes, .iOffset>,  'sqlite3_blob_write',  \
    sqliteBusyHandler, <.ptrDB, .ptrProc, .lParam>,  'sqlite3_busy_handler',  \
    sqliteBusyTimeout, <.ptrDB, .time_ms>,  'sqlite3_busy_timeout',  \
    sqliteChanges, <.ptrDB>,  'sqlite3_changes',  \
    sqliteClearBindings, <.stmt>,  'sqlite3_clear_bindings',  \
    sqliteClose, <.ptrDatabase>,  'sqlite3_close',  \
    sqliteCollationNeeded, <.ptrDB, .lparam, .ptrCallback>,  'sqlite3_collation_needed',  \
    sqliteCollationNeeded16, <.ptrDB, .lparam, .ptrCallback>,  'sqlite3_collation_needed16',  \
    sqliteColumnBlob, <.stmt, .iCol>,  'sqlite3_column_blob',  \
    sqliteColumnBytes, <.stmt, .iCol>,  'sqlite3_column_bytes',  \
    sqliteColumnBytes16, <.stmt, .iCol>,  'sqlite3_column_bytes16',  \
    sqliteColumnCount, <.stmt>,  'sqlite3_column_count',  \
    sqliteColumnDatabaseName, <.stmt, .index>,  'sqlite3_column_database_name',  \
    sqliteColumnDatabaseName16, <.stmt, .index>,  'sqlite3_column_database_name16',  \
    sqliteColumnDeclType, <.stmt, .index>,  'sqlite3_column_decltype',  \
    sqliteColumnDeclType16, <.stmt, .index>,  'sqlite3_column_decltype16',  \
    sqliteColumnDouble, <.stmt, .iCol>,  'sqlite3_column_double',  \
    sqliteColumnInt, <.stmt, .iCol>,  'sqlite3_column_int',  \
    sqliteColumnInt64, <.stmt, .iCol>,  'sqlite3_column_int64',  \
    sqliteColumnName, <.stmt, .index>,  'sqlite3_column_name',  \
    sqliteColumnName16, <.stmt, .index>,  'sqlite3_column_name16',  \
    sqliteColumnOriginName, <.stmt, .index>,  'sqlite3_column_origin_name',  \
    sqliteColumnOriginName16, <.stmt, .index>,  'sqlite3_column_origin_name16',  \
    sqliteColumnTableName, <.stmt, .index>,  'sqlite3_column_table_name',  \
    sqliteColumnTableName16, <.stmt, .index>,  'sqlite3_column_table_name16',  \
    sqliteColumnText, <.stmt, .iCol>,  'sqlite3_column_text',  \
    sqliteColumnText16, <.stmt, .iCol>,  'sqlite3_column_text16',  \
    sqliteColumnType, <.stmt, .iCol>,  'sqlite3_column_type',  \
    sqliteColumnValue, <.stmt, .iCol>,  'sqlite3_column_value',  \
    sqliteCommitHook, <.ptrDB, .ptrHook, .lparam>,  'sqlite3_commit_hook',  \
    sqliteCompileOptionGet, <.N>,  'sqlite3_compileoption_get',  \
    sqliteCompileOptionUsed, <.ptrOptName>,  'sqlite3_compileoption_used',  \
    sqliteComplete, <.ptrSQL>,  'sqlite3_complete',  \
    sqliteComplete16, <.ptrSQL>,  'sqlite3_complete16',  \
    sqliteConfig, <.index, ...>,  'sqlite3_config',  \
    sqliteContextDBHandle, <.context>,  'sqlite3_context_db_handle',  \
    sqliteCreateCollation, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare>,  'sqlite3_create_collation',  \
    sqliteCreateCollation16, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare>,  'sqlite3_create_collation16',  \
    sqliteCreateCollation_v2, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare, .ptrDestroy>,  'sqlite3_create_collation_v2',  \
    sqliteCreateFunction, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal>,  'sqlite3_create_function',  \
    sqliteCreateFunction16, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal>,  'sqlite3_create_function16',  \
    sqliteCreateFunction_v2, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal, .procDestroy>,  'sqlite3_create_function_v2',  \
    sqliteCreateModule, <.ptrDB, .ptrModuleName, .ptrVTableModule, .lparam>,  'sqlite3_create_module',  \
    sqliteCreateModule_v2, <.ptrDB, .ptrModuleName, .ptrVTableModule, .lparam, .procDestroy>,  'sqlite3_create_module_v2',  \
    sqliteDBConfig, <.ptrDB, .index, ...>,  'sqlite3_db_config',  \
    sqliteDBHandle, <.stmt>,  'sqlite3_db_handle',  \
    sqliteDBMutex, <.ptrDB>,  'sqlite3_db_mutex',  \
    sqliteDBStatus, <.ptrDB, .index, .ptrRetCurrent, .ptrRetHighest, .flagReset>,  'sqlite3_db_status',  \
    sqliteDataCount, <.stmt>,  'sqlite3_data_count',  \
    sqliteDeclareVtab, <.ptrDB, .ptrSQL>,  'sqlite3_declare_vtab',  \
    sqliteEnableLoadExtension, <.ptrDB, .flagEnable>,  'sqlite3_enable_load_extension',  \
    sqliteEnableSharedCache, <.flagEnable>,  'sqlite3_enable_shared_cache',  \
    sqliteErrCode, <.ptrDB>,  'sqlite3_errcode',  \
    sqliteErrMsg, <.ptrDB>,  'sqlite3_errmsg',  \
    sqliteErrMsg16, <.ptrDB>,  'sqlite3_errmsg16',  \
    sqliteErrStr, <.err_code>, 'sqlite3_errstr',    \
    sqliteExec, <.ptrDB, .ptrSQL, .procCallback, .lparam, .ptrVarErrMsg>,  'sqlite3_exec',  \
    sqliteExpired, <VOID>,  'sqlite3_expired',  \
    sqliteExtendedErrCode, <.ptrDB>,  'sqlite3_extended_errcode',  \
    sqliteExtendedResultCodes, <.ptrDB, .flagEnable>,  'sqlite3_extended_result_codes',  \
    sqliteFileControl, <.ptrDB, .ptrDBName, .wparam, .lparam>,  'sqlite3_file_control',  \
    sqliteFinalize, <.stmt>,  'sqlite3_finalize',  \
    sqliteFree, <.ptrmem>,  'sqlite3_free',  \
    sqliteFreeTable, <.ptrVarResult>,  'sqlite3_free_table',  \
    sqliteGetAutocommit, <.ptrDB>,  'sqlite3_get_autocommit',  \
    sqliteGetAuxdata, <.context, .N>,  'sqlite3_get_auxdata',  \
    sqliteGetTable, <.ptrDB, .ptrSQL, .ptrVarResult, .ptrVarRows, .ptrVarColumns, .ptrVarErrorMsg>,  'sqlite3_get_table',  \
    sqliteGlobalRecover_OLD, <VOID>,  'sqlite3_global_recover',  \
    sqliteInitialize, <VOID>,  'sqlite3_initialize',  \
    sqliteInterrupt, <.ptrDB>,  'sqlite3_interrupt',  \
    sqliteLastInsertRowID, <.ptrDB>,  'sqlite3_last_insert_rowid',  \
    sqliteLibVersion, <VOID>,  'sqlite3_libversion',  \
    sqliteLibversionNumber, <VOID>,  'sqlite3_libversion_number',  \
    sqliteLimit, <.ptrDB, .idLimit, .newVal>,  'sqlite3_limit',  \
    sqliteLoadExtension, <.ptrDB, .nameDLL, .entryProc, .ptrVarErrMsg>,  'sqlite3_load_extension',  \
    sqliteLog, <.iErrCode, .ptrFormat, ...>,  'sqlite3_log',  \
    sqliteMAlloc, <.size>,  'sqlite3_malloc',  \
    sqliteMemoryHighWater, <.flagReset>,  'sqlite3_memory_highwater',  \
    sqliteMemoryUsed, <VOID>,  'sqlite3_memory_used',  \
    sqliteMprintf, <.ptrString, ...>,  'sqlite3_mprintf',  \
    sqliteMutexAlloc, <.type>,  'sqlite3_mutex_alloc',  \
    sqliteMutexEnter, <.hMutex>,  'sqlite3_mutex_enter',  \
    sqliteMutexFree, <.hMutex>,  'sqlite3_mutex_free',  \
    sqliteMutexLeave, <.hMutex>,  'sqlite3_mutex_leave',  \
    sqliteMutexTry, <.hMutex>,  'sqlite3_mutex_try',  \
    sqliteNextStmt, <.ptrDB, .stmt>,  'sqlite3_next_stmt',  \
    sqliteOSEnd, <VOID>,  'sqlite3_os_end',  \
    sqliteOSInit, <VOID>,  'sqlite3_os_init',  \
    sqliteOpen, <.ptrFileName, .ptrVarDB>,  'sqlite3_open',  \
    sqliteOpen16, <.ptrFileName, .ptrVarDB>,  'sqlite3_open16',  \
    sqliteOpen_v2, <.ptrFileName, .ptrVarDB, .flags, .ptrVFSName>,  'sqlite3_open_v2',  \
    sqliteOverloadFunction, <.ptrDB, .ptrFuncName, .lparam>,  'sqlite3_overload_function',  \
    sqlitePrepare, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare',  \
    sqlitePrepare16, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare16',  \
    sqlitePrepare16_v2, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare16_v2',  \
    _sqlitePrepare_v2, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare_v2',  \
    sqliteProfile, <.ptrDB, .procProfiler, .lparam>,  'sqlite3_profile',  \
    sqliteProgressHandler, <.ptrDB, .N, .procProgress, .lparam>,  'sqlite3_progress_handler',  \
    sqliteRandomness, <.bytes, .buffer>,  'sqlite3_randomness',  \
    sqliteReAlloc, <.ptrmem, .newsize>,  'sqlite3_realloc',  \
    sqliteReleaseMemory, <.bytes>,  'sqlite3_release_memory',  \
    sqliteReset, <.stmt>,  'sqlite3_reset',  \
    sqliteResetAutoExtension, <VOID>,  'sqlite3_reset_auto_extension',  \
    sqliteResultBlob, <.context, .ptrdata, .size, .procDestroy>,  'sqlite3_result_blob',  \
    sqliteResultDouble, <.context, .double>,  'sqlite3_result_double',  \
    sqliteResultError, <.context, .ptrErrMsg, .size>,  'sqlite3_result_error',  \
    sqliteResultError16, <.context, .ptrErrMsg, .size>,  'sqlite3_result_error16',  \
    sqliteResultErrorCode, <.context, .errcode>,  'sqlite3_result_error_code',  \
    sqliteResultErrorNoMem, <.context>,  'sqlite3_result_error_nomem',  \
    sqliteResultErrorTooBig, <.context>,  'sqlite3_result_error_toobig',  \
    sqliteResultInt, <.context, .integer>,  'sqlite3_result_int',  \
    sqliteResultInt64, <.context, .int64Lo, .int64Hi>,  'sqlite3_result_int64',  \
    sqliteResultNULL, <.context>,  'sqlite3_result_null',  \
    sqliteResultText, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text',  \
    sqliteResultText16, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16',  \
    sqliteResultText16be, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16be',  \
    sqliteResultText16le, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16le',  \
    sqliteResultValue, <.context, .ptrValue>,  'sqlite3_result_value',  \
    sqliteResultZeroBlob, <.context, .size>,  'sqlite3_result_zeroblob',  \
    sqliteRollbackHook, <.ptrDB, .ptrHook, .lparam>,  'sqlite3_rollback_hook',  \
    sqliteRtreeGeometryCallback, <NONE>,  'sqlite3_rtree_geometry_callback',  \
    sqliteSQL, <.stmt>,  'sqlite3_sql',  \
    sqliteSetAuthorizer, <.ptrDB, .procAuthorizer, .lparam>,  'sqlite3_set_authorizer',  \
    sqliteSetAuxdata, <.context, .N, .ptrData, .procDestructor>,  'sqlite3_set_auxdata',  \
    sqliteShutdown, <VOID>,  'sqlite3_shutdown',  \
    sqliteSleep, <.sleep_ms>,  'sqlite3_sleep',  \
    sqliteSnprintf, <.size, .ptrBuffer, .ptrString, ...>,  'sqlite3_snprintf',  \
    sqliteSoftHeapLimit, <.N>,  'sqlite3_soft_heap_limit',  \
    sqliteSoftHeapLimit64, <.sizeLo, .sizeHi>,  'sqlite3_soft_heap_limit64',  \
    sqliteSourceID, <VOID>,  'sqlite3_sourceid',  \
    sqliteStatus, <.paramIndex, .ptrVarResult, .ptrVarHighwater, .flagReset>,  'sqlite3_status',  \
    sqliteStep, <.stmt>,  'sqlite3_step',  \
    sqliteStmtStatus, <.stmt, .paramIndex, .flagReset>,  'sqlite3_stmt_status',  \
    sqliteStrnicmp, <.ptrStr1, .ptrStr2, .size>,  'sqlite3_strnicmp',  \
    sqliteTableColumnMetadata, <.ptrDB, .ptrDBName, .ptrTableName, .ptrColumnName, .ptrVarDataType, .ptrVarCollSeq, .ptrVarNotNull,  \
        .ptrVarPrimaryKey, .ptrVarAutoInc>,  'sqlite3_table_column_metadata',  \
    sqliteTestControl, <.opCode, ...>,  'sqlite3_test_control',  \
    sqliteThreadCleanup, <VOID>,  'sqlite3_thread_cleanup',  \
    sqliteThreadsafe, <VOID>,  'sqlite3_threadsafe',  \
    sqliteTotalChanges, <.ptrDB>,  'sqlite3_total_changes',  \
    sqliteTrace, <.ptrDB, .procTrace, .lparam>,  'sqlite3_trace',  \
    sqliteTransferBindings, <VOID>,  'sqlite3_transfer_bindings',  \
    sqliteUpdateHook, <.ptrDB, .procUpdateHook, .lparam>,  'sqlite3_update_hook',  \
    sqliteUserData, <.context>,  'sqlite3_user_data',  \
    sqliteValueBlob, <.ptrValue>,  'sqlite3_value_blob',  \
    sqliteValueBytes, <.ptrValue>,  'sqlite3_value_bytes',  \
    sqliteValueBytes16, <.ptrValue>,  'sqlite3_value_bytes16',  \
    sqliteValueDouble, <.ptrValue>,  'sqlite3_value_double',  \
    sqliteValueInt, <.ptrValue>,  'sqlite3_value_int',  \
    sqliteValueInt64, <.ptrValue>,  'sqlite3_value_int64',  \
    sqliteValueNumericType, <.ptrValue>,  'sqlite3_value_numeric_type',  \
    sqliteValueText, <.ptrValue>,  'sqlite3_value_text',  \
    sqliteValueText16, <.ptrValue>,  'sqlite3_value_text16',  \
    sqliteValueText16be, <.ptrValue>,  'sqlite3_value_text16be',  \
    sqliteValueText16le, <.ptrValue>,  'sqlite3_value_text16le',  \
    sqliteValueType, <.ptrValue>,  'sqlite3_value_type',  \
    sqliteVersion, <VOID>,  'sqlite3_version',  \
    sqliteVfsFind, <.ptrVFSName>,  'sqlite3_vfs_find',  \
    sqliteVfsRegister, <.hVFS, .flagDefault>,  'sqlite3_vfs_register',  \
    sqliteVfsUnregister, <.hVFS>,  'sqlite3_vfs_unregister',  \
    sqliteVmprintf, <.ptrString, .va_list>,  'sqlite3_vmprintf',  \
    sqliteWalAutocheckpoint, <.ptrDB, .N>,  'sqlite3_wal_autocheckpoint',  \
    sqliteWalCheckpoint, <.ptrDB, .ptrDBName>,  'sqlite3_wal_checkpoint',  \
    sqliteWalCheckpoint_v2, <.ptrDB, .ptrDBName, .eMode, .pvarLog, .pvarCkpt>,  'sqlite3_wal_checkpoint_v2',  \
    sqliteWalHook, <.ptrDB, .procCommitHook, .lparam>,  'sqlite3_wal_hook',  \
    sqliteWin32_MbcsToUtf8, <NONE>,  'sqlite3_win32_mbcs_to_utf8'

Added freshlib/imports/Linux/xcursor.inc.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: XCursors import library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto 'libXcursor.so',                                                                           \
             XcursorShapeLoadImage  ,<.shape, .theme, .size>,  'XcursorShapeLoadImage',                 \
             XcursorShapeLoadImages, <.shape, .theme, .size>,  'XcursorShapeLoadImages'

Added freshlib/imports/Linux/xshm.inc.











































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: MIT_SHM extension import library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto 'libXext.so.6',                                                                                            \
             XShmQueryExtension,        <.Disp>,                                     'XShmQueryExtension',              \
             XShmQueryVersion,          <.Disp, .piMajor, .piMinor, .pfPixmaps>,     'XShmQueryVersion',                \
             XShmPixmapFormat,          <.Disp>,                                     'XShmPixmapFormat',                \
             XShmAttach,                <.Disp, .pSegmentInfo>,                      'XShmAttach',                      \
             XShmDetach,                <.Disp, .pSegmentInfo>,                      'XShmDetach',                      \
             XShmCreateImage,           <.Disp, .Visual, .depth, .format,                                               \
                                         .pData, .pShmInfo, .width, .height>,        'XShmCreateImage',                 \
             XShmPutImage,              <.Disp, .Drawable, .context, .pImage,                                           \
                                         .SrcX, .SrcY, .DestX, .DestY,                                                  \
                                         .width, .height, .fSendEvent >,             'XShmPutImage',                    \
             XShmGetImage,              <.Disp, .Drawable, .pImage,                                                     \
                                         .X, .Y, .PlaneMask>,                        'XShmGetImage',                    \
             XShmCreatePixmap,          <.Disp, .Drawable, .pData, .pShmInfo,                                           \
                                         .width, .height, .depth>,                   'XShmCreatePixmap',                \
             XShmGetEventBase,           <.Disp>,                                    'XShmGetEventBase',                \
             XSyncInitialize,            <.Disp, .p_major, .p_minor>,                'XSyncInitialize',                 \
             XSyncCreateCounter,         <.Disp, .valueHi, .valueLo>,                'XSyncCreateCounter',              \
             XSyncDestroyCounter,        <.Disp, .counter>,                          'XSyncDestroyCounter',             \
             XSyncSetCounter,            <.Disp, .counter, .valueHi, .valueLo>,      'XSyncSetCounter',                 \
             XSyncQueryCounter,          <.Disp, .counter, .p_return>,               'XSyncQueryCounter',               \
             XSyncChangeCounter,         <.Disp, .counter, .valueHi, .valueLo>,      'XSyncChangeCounter'

Added freshlib/imports/Win32/advapi32.inc.







































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: advapi32.dll API functions.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

;   advapi32.dll API calls (ASCII)
import_proto advapi32,  \
    A_SHAFinal, <NONE>,  'A_SHAFinal',  \
    A_SHAInit, <NONE>,  'A_SHAInit',  \
    A_SHAUpdate, <NONE>,  'A_SHAUpdate',  \
    AbortSystemShutdownA, <.lpMachineName>,  'AbortSystemShutdownA',  \
    AbortSystemShutdownW, <.lpMachineName>,  'AbortSystemShutdownW',  \
    AccessCheck, <.pSecurityDescriptor, .ClientToken, .DesiredAccess, .GenericMapping, .PrivilegeSet, .PrivilegeSetLength, .GrantedAccess,  \
        .Status>,  'AccessCheck',  \
    AccessCheckAndAuditAlarmA, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .SecurityDescriptor, .DesiredAccess, .GenericMapping,  \
        .ObjectCreation, .GrantedAccess, .AccessStatus, .pfGenerateOnClose>,  'AccessCheckAndAuditAlarmA',  \
    AccessCheckAndAuditAlarmW, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .SecurityDescriptor, .DesiredAccess, .GenericMapping,  \
        .ObjectCreation, .GrantedAccess, .AccessStatus, .pfGenerateOnClose>,  'AccessCheckAndAuditAlarmW',  \
    AccessCheckByType, <.pSecurityDescriptor, .PrincipalSelfSid, .ClientToken, .DesiredAccess, .ObjectTypeList, .ObjectTypeListLength,  \
        .GenericMapping, .PrivilegeSet, .PrivilegeSetLength, .GrantedAccess, .AccessStatus>,  'AccessCheckByType',  \
    AccessCheckByTypeAndAuditAlarmA, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .SecurityDescriptor, .PrincipalSelfSid,  \
        .DesiredAccess, .AuditType, .Flags, .ObjectTypeList, .ObjectTypeListLength, .GenericMapping, .ObjectCreation, .GrantedAccess,  \
        .AccessStatus, .pfGenerateOnClose>,  'AccessCheckByTypeAndAuditAlarmA',  \
    AccessCheckByTypeAndAuditAlarmW, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .SecurityDescriptor, .PrincipalSelfSid,  \
        .DesiredAccess, .AuditType, .Flags, .ObjectTypeList, .ObjectTypeListLength, .GenericMapping, .ObjectCreation, .GrantedAccess,  \
        .AccessStatus, .pfGenerateOnClose>,  'AccessCheckByTypeAndAuditAlarmW',  \
    AccessCheckByTypeResultList, <.pSecurityDescriptor, .PrincipalSelfSid, .ClientToken, .DesiredAccess, .ObjectTypeList, .ObjectTypeListLength,  \
        .GenericMapping, .PrivilegeSet, .PrivilegeSetLength, .GrantedAccessList, .AccessStatusList>,  'AccessCheckByTypeResultList',  \
    AccessCheckByTypeResultListAndAuditAlarmA, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .SecurityDescriptor, .PrincipalSelfSid,  \
        .DesiredAccess, .AuditType, .Flags, .ObjectTypeList, .ObjectTypeListLength, .GenericMapping, .ObjectCreation, .GrantedAccess,  \
        .AccessStatusList, .pfG>,  'AccessCheckByTypeResultListAndAuditAlarmA',  \
    AccessCheckByTypeResultListAndAuditAlarmByHandleA, <.SubsystemName, .HandleId, .ClientToken, .ObjectTypeName, .ObjectName, .SecurityDescriptor,  \
        .PrincipalSelfSid, .DesiredAccess, .AuditType, .flags, .ObjectTypeList, .ObjectTypeListLength, .GenericMapping, .ObjectCreation,  \
        .GrantedAccess, .AccessibleChildren, .paccContainer, .iChildStart, .cChildren, .rgvarChildren, .pcObtained>,  'AccessCheckByTypeResultListAndAuditAlarmByHandleA',  \
    AccessCheckByTypeResultListAndAuditAlarmByHandleW, <.SubsystemName, .HandleId, .ClientToken, .ObjectTypeName, .ObjectName, .SecurityDescriptor,  \
        .PrincipalSelfSid, .DesiredAccess, .AuditType, .flags, .ObjectTypeList, .ObjectTypeListLength, .GenericMapping, .ObjectCreation,  \
        .GrantedAccess, .AccessibleChildren, .paccContainer, .iChildStart, .cChildren, .rgvarChildren, .pcObtained>,  'AccessCheckByTypeResultListAndAuditAlarmByHandleW',  \
    AccessCheckByTypeResultListAndAuditAlarmW, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .SecurityDescriptor, .PrincipalSelfSid,  \
        .DesiredAccess, .AuditType, .Flags, .ObjectTypeList, .ObjectTypeListLength, .GenericMapping, .ObjectCreation, .GrantedAccess,  \
        .AccessStatusList, .pfG>,  'AccessCheckByTypeResultListAndAuditAlarmW',  \
    AddAccessAllowedAce, <.pAcl, .dwAceRevision, .AccessMask, .pSid>,  'AddAccessAllowedAce',  \
    AddAccessAllowedAceEx, <.pAcl, .dwAceRevision, .AceFlags, .AccessMask, .pSid>,  'AddAccessAllowedAceEx',  \
    AddAccessAllowedObjectAce, <.pAcl, .dwAceRevision, .AceFlags, .AccessMask, .ObjectTypeGuid, .ByRefheritedObjectTypeGuid, .pSid,  \
      >,  'AddAccessAllowedObjectAce',  \
    AddAccessDeniedAce, <.pAcl, .dwAceRevision, .AccessMask, .pSid>,  'AddAccessDeniedAce',  \
    AddAccessDeniedAceEx, <.pAcl, .dwAceRevision, .AceFlags, .AccessMask, .pSid>,  'AddAccessDeniedAceEx',  \
    AddAccessDeniedObjectAce, <.pAcl, .dwAceRevision, .AceFlags, .AccessMask, .ObjectTypeGuid, .ByRefheritedObjectTypeGuid, .pSid,  \
      >,  'AddAccessDeniedObjectAce',  \
    AddAce, <.pAcl, .dwAceRevision, .dwStartingAceIndex, .pAceList, .nAceListLength>,  'AddAce',  \
    AddAuditAccessAce, <.pAcl, .dwAceRevision, .dwAccessMask, .pSid, .bAuditSuccess, .bAuditFailure>,  'AddAuditAccessAce',  \
    AddAuditAccessAceEx, <.pAcl, .dwAceRevision, .AceFlags, .dwAccessMask, .pSid, .bAuditSuccess, .bAuditFailure>,  'AddAuditAccessAceEx',  \
    AddAuditAccessObjectAce, <.pAcl, .dwAceRevision, .AceFlags, .AccessMask, .ObjectTypeGuid, .ByRefheritedObjectTypeGuid, .pSid, .bAuditSuccess,  \
        .bAuditFailure>,  'AddAuditAccessObjectAce',  \
    AddUsersToEncryptedFile, <.lpFileName, .pUsers>,  'AddUsersToEncryptedFile',  \
    AdjustTokenGroups, <.TokenHandle, .ResetToDefault, .NewState, .BufferLength, .PreviousState, .ReturnLength>,  'AdjustTokenGroups',  \
    AdjustTokenPrivileges, <.TokenHandle, .DisableAllPrivileges, .NewState, .BufferLength, .PreviousState, .ReturnLength>,  'AdjustTokenPrivileges',  \
    AllocateAndInitializeSid, <.pIdentifierAuthority, .nSubAuthorityCount, .nSubAuthority0, .nSubAuthority1, .nSubAuthority2, .nSubAuthority3,  \
        .nSubAuthority4, .nSubAuthority5, .nSubAuthority6, .nSubAuthority7, .lpPSid>,  'AllocateAndInitializeSid',  \
    AllocateLocallyUniqueId, <.Luid>,  'AllocateLocallyUniqueId',  \
    AreAllAccessesGranted, <.GrantedAccess, .DesiredAccess>,  'AreAllAccessesGranted',  \
    AreAnyAccessesGranted, <.GrantedAccess, .DesiredAccess>,  'AreAnyAccessesGranted',  \
    BackupEventLogA, <.hEventLog, .lpBackupFileName>,  'BackupEventLogA',  \
    BackupEventLogW, <.hEventLog, .lpBackupFileName>,  'BackupEventLogW',  \
    BuildExplicitAccessWithNameA, <.pExplicitAccess, .pTrusteeName, .AccessPermissions, .AccessMode, .Inheritance>,  'BuildExplicitAccessWithNameA',  \
    BuildExplicitAccessWithNameW, <.pExplicitAccess, .pTrusteeName, .AccessPermissions, .AccessMode, .Inheritance>,  'BuildExplicitAccessWithNameW',  \
    BuildImpersonateExplicitAccessWithNameA, <.pExplicitAccess, .pTrusteeName, .pTrustee, .AccessPermissions, .AccessMode, .Inheritance,  \
      >,  'BuildImpersonateExplicitAccessWithNameA',  \
    BuildImpersonateExplicitAccessWithNameW, <.pExplicitAccess, .pTrusteeName, .pTrustee, .AccessPermissions, .AccessMode, .Inheritance,  \
      >,  'BuildImpersonateExplicitAccessWithNameW',  \
    BuildImpersonateTrusteeA, <.pTrustee, .pImpersonateTrustee>,  'BuildImpersonateTrusteeA',  \
    BuildImpersonateTrusteeW, <.pTrustee, .pImpersonateTrustee>,  'BuildImpersonateTrusteeW',  \
    BuildSecurityDescriptorA, <.pOwner, .pGroup, .cCountOfAccessEntries, .pListOfAccessEntries, .cCountOfAuditEntries, .pListOfAuditEntries,  \
        .pOldSD, .pSizeNewSD, .pNewSD>,  'BuildSecurityDescriptorA',  \
    BuildSecurityDescriptorW, <.pOwner, .pGroup, .cCountOfAccessEntries, .pListOfAccessEntries, .cCountOfAuditEntries, .pListOfAuditEntries,  \
        .pOldSD, .pSizeNewSD, .pNewSD>,  'BuildSecurityDescriptorW',  \
    BuildTrusteeWithNameA, <.pTrustee, .pname>,  'BuildTrusteeWithNameA',  \
    BuildTrusteeWithNameW, <.pTrustee, .pname>,  'BuildTrusteeWithNameW',  \
    BuildTrusteeWithObjectsAndNameA, <.pTrustee, .pObjName, .ObjectType, .ObjectTypeName, .InheritedObjectTypeName, .name>,  'BuildTrusteeWithObjectsAndNameA',  \
    BuildTrusteeWithObjectsAndNameW, <.pTrustee, .pObjName, .ObjectType, .ObjectTypeName, .InheritedObjectTypeName, .name>,  'BuildTrusteeWithObjectsAndNameW',  \
    BuildTrusteeWithObjectsAndSidA, <.pTrustee, .pObjSid, .pObjectGuid, .pInheritedObjectGuid, .pSid>,  'BuildTrusteeWithObjectsAndSidA',  \
    BuildTrusteeWithObjectsAndSidW, <.pTrustee, .pObjSid, .pObjectGuid, .pInheritedObjectGuid, .pSid>,  'BuildTrusteeWithObjectsAndSidW',  \
    BuildTrusteeWithSidA, <.pTrustee, .pSid>,  'BuildTrusteeWithSidA',  \
    BuildTrusteeWithSidW, <.pTrustee, .pSid>,  'BuildTrusteeWithSidW',  \
    CancelOverlappedAccess, <NONE>,  'CancelOverlappedAccess',  \
    ChangeServiceConfig2A, <.hService, .dwInfoLevel, .lpInfo>,  'ChangeServiceConfig2A',  \
    ChangeServiceConfig2W, <.hService, .dwInfoLevel, .lpInfo>,  'ChangeServiceConfig2W',  \
    ChangeServiceConfigA, <.hService, .dwServiceType, .dwStartType, .dwErrorControl, .lpBinaryPathName, .lpLoadOrderGroup, .lpdwTagId,  \
        .lpDependencies, .lpServiceStartName, .lpPassword, .lpDisplayName>,  'ChangeServiceConfigA',  \
    ChangeServiceConfigW, <.hService, .dwServiceType, .dwStartType, .dwErrorControl, .lpBinaryPathName, .lpLoadOrderGroup, .lpdwTagId,  \
        .lpDependencies, .lpServiceStartName, .lpPassword, .lpDisplayName>,  'ChangeServiceConfigW',  \
    CheckTokenMembership, <.TokenHandle, .SidToCheck, .IsMember>,  'CheckTokenMembership',  \
    ClearEventLogA, <.hEventLog, .lpBackupFileName>,  'ClearEventLogA',  \
    ClearEventLogW, <.hEventLog, .lpBackupFileName>,  'ClearEventLogW',  \
    CloseCodeAuthzLevel, <NONE>,  'CloseCodeAuthzLevel',  \
    CloseEncryptedFileRaw, <.pvContext>,  'CloseEncryptedFileRaw',  \
    CloseEventLog, <.hEventLog>,  'CloseEventLog',  \
    CloseServiceHandle, <.hSCObject>,  'CloseServiceHandle',  \
    CloseTrace, <NONE>,  'CloseTrace',  \
    CommandLineFromMsiDescriptor, <NONE>,  'CommandLineFromMsiDescriptor',  \
    ComputeAccessTokenFromCodeAuthzLevel, <NONE>,  'ComputeAccessTokenFromCodeAuthzLevel',  \
    ControlService, <.hService, .dwControl, .lpServiceStatus>,  'ControlService',  \
    ControlTraceA, <NONE>,  'ControlTraceA',  \
    ControlTraceW, <NONE>,  'ControlTraceW',  \
    ConvertAccessToSecurityDescriptorA, <NONE>,  'ConvertAccessToSecurityDescriptorA',  \
    ConvertAccessToSecurityDescriptorW, <NONE>,  'ConvertAccessToSecurityDescriptorW',  \
    ConvertSDToStringSDRootDomainA, <NONE>,  'ConvertSDToStringSDRootDomainA',  \
    ConvertSDToStringSDRootDomainW, <NONE>,  'ConvertSDToStringSDRootDomainW',  \
    ConvertSecurityDescriptorToAccessA, <NONE>,  'ConvertSecurityDescriptorToAccessA',  \
    ConvertSecurityDescriptorToAccessNamedA, <NONE>,  'ConvertSecurityDescriptorToAccessNamedA',  \
    ConvertSecurityDescriptorToAccessNamedW, <NONE>,  'ConvertSecurityDescriptorToAccessNamedW',  \
    ConvertSecurityDescriptorToAccessW, <NONE>,  'ConvertSecurityDescriptorToAccessW',  \
    ConvertSecurityDescriptorToStringSecurityDescriptorA, <.SecurityDescriptor, .RequestedStringSDRevision, .SecurityInformation, .StringSecurityDescriptor,  \
        .StringSecurityDescriptorLen>,  'ConvertSecurityDescriptorToStringSecurityDescriptorA',  \
    ConvertSecurityDescriptorToStringSecurityDescriptorW, <.SecurityDescriptor, .RequestedStringSDRevision, .SecurityInformation, .StringSecurityDescriptor,  \
        .StringSecurityDescriptorLen>,  'ConvertSecurityDescriptorToStringSecurityDescriptorW',  \
    ConvertSidToStringSidA, <.Sid, .StringSid>,  'ConvertSidToStringSidA',  \
    ConvertSidToStringSidW, <.Sid, .StringSid>,  'ConvertSidToStringSidW',  \
    ConvertStringSDToSDDomainA, <NONE>,  'ConvertStringSDToSDDomainA',  \
    ConvertStringSDToSDDomainW, <NONE>,  'ConvertStringSDToSDDomainW',  \
    ConvertStringSDToSDRootDomainA, <NONE>,  'ConvertStringSDToSDRootDomainA',  \
    ConvertStringSDToSDRootDomainW, <NONE>,  'ConvertStringSDToSDRootDomainW',  \
    ConvertStringSecurityDescriptorToSecurityDescriptorA, <.StringSecurityDescriptor, .StringSDRevision, .SecurityDescriptor, .SecurityDescriptorSize,  \
      >,  'ConvertStringSecurityDescriptorToSecurityDescriptorA',  \
    ConvertStringSecurityDescriptorToSecurityDescriptorW, <.StringSecurityDescriptor, .StringSDRevision, .SecurityDescriptor, .SecurityDescriptorSize,  \
      >,  'ConvertStringSecurityDescriptorToSecurityDescriptorW',  \
    ConvertStringSidToSidA, <.StringSid, .Sid>,  'ConvertStringSidToSidA',  \
    ConvertStringSidToSidW, <.StringSid, .Sid>,  'ConvertStringSidToSidW',  \
    ConvertToAutoInheritPrivateObjectSecurity, <.ParentDescriptor, .CurrentSecurityDescriptor, .NewSecurityDescriptor, .ObjectType,  \
        .IsDirectoryObject, .GenericMapping>,  'ConvertToAutoInheritPrivateObjectSecurity',  \
    CopySid, <.nDestinationSidLength, .pDestinationSid, .pSourceSid>,  'CopySid',  \
    CreateCodeAuthzLevel, <NONE>,  'CreateCodeAuthzLevel',  \
    CreatePrivateObjectSecurity, <.ParentDescriptor, .CreatorDescriptor, .NewDescriptor, .IsDirectoryObject, .Token, .GenericMapping,  \
      >,  'CreatePrivateObjectSecurity',  \
    CreatePrivateObjectSecurityEx, <.ParentDescriptor, .CreatorDescriptor, .NewDescriptor, .ObjectType, .IsContainerObject, .AutoInheritFlags,  \
        .Token, .GenericMapping>,  'CreatePrivateObjectSecurityEx',  \
    CreatePrivateObjectSecurityWithMultipleInheritance, <NONE>,  'CreatePrivateObjectSecurityWithMultipleInheritance',  \
    CreateProcessAsUserA, <.hToken, .lpApplicationName, .lpCommandLine, .lpProcessAttributes, .lpThreadAttributes, .bInheritHandles,  \
        .dwCreationFlags, .lpEnvironment, .lpCurrentDirectory, .lpStartupInfo, .lpProcessInformation>,  'CreateProcessAsUserA',  \
    CreateProcessAsUserSecure, <NONE>,  'CreateProcessAsUserSecure',  \
    CreateProcessAsUserW, <.hToken, .lpApplicationName, .lpCommandLine, .lpProcessAttributes, .lpThreadAttributes, .bInheritHandles,  \
        .dwCreationFlags, .lpEnvironment, .lpCurrentDirectory, .lpStartupInfo, .lpProcessInformation>,  'CreateProcessAsUserW',  \
    CreateProcessWithLogonW, <NONE>,  'CreateProcessWithLogonW',  \
    CreateRestrictedToken, <.ExistingTokenHandle, .Flags, .DisableSidCount, .SidsToDisable, .DeletePrivilegeCount, .PrivilegesToDelete,  \
        .RestrictedSidCount, .SidsToRestrict, .NewTokenHandle>,  'CreateRestrictedToken',  \
    CreateServiceA, <.hSCManager, .lpServiceName, .lpDisplayName, .dwDesiredAccess, .dwServiceType, .dwStartType, .dwErrorControl,  \
        .lpBinaryPathName, .lpLoadOrderGroup, .lpdwTagId, .lpDependencies, .lp, .lpPassword>,  'CreateServiceA',  \
    CreateServiceW, <.hSCManager, .lpServiceName, .lpDisplayName, .dwDesiredAccess, .dwServiceType, .dwStartType, .dwErrorControl,  \
        .lpBinaryPathName, .lpLoadOrderGroup, .lpdwTagId, .lpDependencies, .lp, .lpPassword>,  'CreateServiceW',  \
    CreateTraceInstanceId, <NONE>,  'CreateTraceInstanceId',  \
    CreateWellKnownSid, <NONE>,  'CreateWellKnownSid',  \
    CredDeleteA, <NONE>,  'CredDeleteA',  \
    CredDeleteW, <NONE>,  'CredDeleteW',  \
    CredEnumerateA, <NONE>,  'CredEnumerateA',  \
    CredEnumerateW, <NONE>,  'CredEnumerateW',  \
    CredFree, <NONE>,  'CredFree',  \
    CredGetSessionTypes, <NONE>,  'CredGetSessionTypes',  \
    CredGetTargetInfoA, <NONE>,  'CredGetTargetInfoA',  \
    CredGetTargetInfoW, <NONE>,  'CredGetTargetInfoW',  \
    CredIsMarshaledCredentialA, <NONE>,  'CredIsMarshaledCredentialA',  \
    CredIsMarshaledCredentialW, <NONE>,  'CredIsMarshaledCredentialW',  \
    CredMarshalCredentialA, <NONE>,  'CredMarshalCredentialA',  \
    CredMarshalCredentialW, <NONE>,  'CredMarshalCredentialW',  \
    CredProfileLoaded, <NONE>,  'CredProfileLoaded',  \
    CredReadA, <NONE>,  'CredReadA',  \
    CredReadDomainCredentialsA, <NONE>,  'CredReadDomainCredentialsA',  \
    CredReadDomainCredentialsW, <NONE>,  'CredReadDomainCredentialsW',  \
    CredReadW, <NONE>,  'CredReadW',  \
    CredRenameA, <NONE>,  'CredRenameA',  \
    CredRenameW, <NONE>,  'CredRenameW',  \
    CredUnmarshalCredentialA, <NONE>,  'CredUnmarshalCredentialA',  \
    CredUnmarshalCredentialW, <NONE>,  'CredUnmarshalCredentialW',  \
    CredWriteA, <NONE>,  'CredWriteA',  \
    CredWriteDomainCredentialsA, <NONE>,  'CredWriteDomainCredentialsA',  \
    CredWriteDomainCredentialsW, <NONE>,  'CredWriteDomainCredentialsW',  \
    CredWriteW, <NONE>,  'CredWriteW',  \
    CredpConvertCredential, <NONE>,  'CredpConvertCredential',  \
    CredpConvertTargetInfo, <NONE>,  'CredpConvertTargetInfo',  \
    CredpDecodeCredential, <NONE>,  'CredpDecodeCredential',  \
    CredpEncodeCredential, <NONE>,  'CredpEncodeCredential',  \
    CryptAcquireContextA, <.phProv, .pszContainer, .pszProvider, .dwProvType, .dwFlags>,  'CryptAcquireContextA',  \
    CryptAcquireContextW, <.phProv, .pszContainer, .pszProvider, .dwProvType, .dwFlags>,  'CryptAcquireContextW',  \
    CryptContextAddRef, <.hProv, .pdwReserved, .dwFlags>,  'CryptContextAddRef',  \
    CryptCreateHash, <.hProv, .Algid, .hKey, .dwFlags, .phHash>,  'CryptCreateHash',  \
    CryptDecrypt, <.hKey, .hHash, .Final, .dwFlags, .pbData, .pdwDataLen>,  'CryptDecrypt',  \
    CryptDeriveKey, <.hProv, .Algid, .hBaseData, .dwFlags, .phKey>,  'CryptDeriveKey',  \
    CryptDestroyHash, <.hHash>,  'CryptDestroyHash',  \
    CryptDestroyKey, <.hKey>,  'CryptDestroyKey',  \
    CryptDuplicateHash, <.hHash, .pdwReserved, .dwFlags, .phHash>,  'CryptDuplicateHash',  \
    CryptDuplicateKey, <.hKey, .pdwReserved, .dwFlags, .phKey>,  'CryptDuplicateKey',  \
    CryptEncrypt, <.hKey, .hHash, .Final, .dwFlags, .pbData, .pdwDataLen, .dwBufLen>,  'CryptEncrypt',  \
    CryptEnumProviderTypesA, <.dwIndex, .pdwReserved, .dwFlags, .pdwProvType, .pszTypeName, .pcbTypeName>,  'CryptEnumProviderTypesA',  \
    CryptEnumProviderTypesW, <.dwIndex, .pdwReserved, .dwFlags, .pdwProvType, .pszTypeName, .pcbTypeName>,  'CryptEnumProviderTypesW',  \
    CryptEnumProvidersA, <.dwIndex, .pdwReserved, .dwFlags, .pdwProvType, .pszProvName, .pcbProvName>,  'CryptEnumProvidersA',  \
    CryptEnumProvidersW, <.dwIndex, .pdwReserved, .dwFlags, .pdwProvType, .pszProvName, .pcbProvName>,  'CryptEnumProvidersW',  \
    CryptExportKey, <.hKey, .hExpKey, .dwBlobType, .dwFlags, .pbData, .pdwDataLen>,  'CryptExportKey',  \
    CryptGenKey, <.hProv, .Algid, .dwFlags, .phKey>,  'CryptGenKey',  \
    CryptGenRandom, <.hProv, .dwLen, .pbBuffer>,  'CryptGenRandom',  \
    CryptGetDefaultProviderA, <.dwProvType, .pdwReserved, .dwFlags, .pszProvName, .pcbProvName>,  'CryptGetDefaultProviderA',  \
    CryptGetDefaultProviderW, <.dwProvType, .pdwReserved, .dwFlags, .pszProvName, .pcbProvName>,  'CryptGetDefaultProviderW',  \
    CryptGetHashParam, <.hHash, .dwParam, .pbData, .pdwDataLen, .dwFlags>,  'CryptGetHashParam',  \
    CryptGetKeyParam, <.hKey, .dwParam, .pbData, .pdwDataLen, .dwFlags>,  'CryptGetKeyParam',  \
    CryptGetProvParam, <.hProv, .dwParam, .pbData, .pdwDataLen, .dwFlags>,  'CryptGetProvParam',  \
    CryptGetUserKey, <.hProv, .dwKeySpec, .phUserKey>,  'CryptGetUserKey',  \
    CryptHashData, <.hHash, .pbData, .dwDataLen, .dwFlags>,  'CryptHashData',  \
    CryptHashSessionKey, <.hHash, .hKey, .dwFlags>,  'CryptHashSessionKey',  \
    CryptImportKey, <.hProv, .pbData, .dwDataLen, .hPubKey, .dwFlags, .phKey>,  'CryptImportKey',  \
    CryptReleaseContext, <.hProv, .dwFlags>,  'CryptReleaseContext',  \
    CryptSetHashParam, <.hHash, .dwParam, .pbData, .dwFlags>,  'CryptSetHashParam',  \
    CryptSetKeyParam, <.hKey, .dwParam, .pbData, .dwFlags>,  'CryptSetKeyParam',  \
    CryptSetProvParam, <.hProv, .dwParam, .pbData, .dwFlags>,  'CryptSetProvParam',  \
    CryptSetProviderA, <.pszProvName, .dwProvType>,  'CryptSetProviderA',  \
    CryptSetProviderExA, <.pszProvName, .dwProvType, .pdwReserved, .dwFlags>,  'CryptSetProviderExA',  \
    CryptSetProviderExW, <.pszProvName, .dwProvType, .pdwReserved, .dwFlags>,  'CryptSetProviderExW',  \
    CryptSetProviderW, <.pszProvName, .dwProvType>,  'CryptSetProviderW',  \
    CryptSignHashA, <.hHash, .dwKeySpec, .sDescription, .dwFlags, .pbSignature, .pdwSigLen>,  'CryptSignHashA',  \
    CryptSignHashW, <.hHash, .dwKeySpec, .sDescription, .dwFlags, .pbSignature, .pdwSigLen>,  'CryptSignHashW',  \
    CryptVerifySignatureA, <.hHash, .pbSignature, .dwSigLen, .hPubKey, .sDescription, .dwFlags>,  'CryptVerifySignatureA',  \
    CryptVerifySignatureW, <.hHash, .pbSignature, .dwSigLen, .hPubKey, .sDescription, .dwFlags>,  'CryptVerifySignatureW',  \
    DecryptFileA, <.lpFileName, .dwReserved>,  'DecryptFileA',  \
    DecryptFileW, <.lpFileName, .dwReserved>,  'DecryptFileW',  \
    DeleteAce, <.pAcl, .dwAceIndex>,  'DeleteAce',  \
    DeleteService, <.hService>,  'DeleteService',  \
    DeregisterEventSource, <.hEventLog>,  'DeregisterEventSource',  \
    DestroyPrivateObjectSecurity, <.ObjectDescriptor>,  'DestroyPrivateObjectSecurity',  \
    DuplicateEncryptionInfoFile, <NONE>,  'DuplicateEncryptionInfoFile',  \
    DuplicateToken, <.ExistingTokenHandle, .ImpersonationLevel, .DuplicateTokenHandle>,  'DuplicateToken',  \
    DuplicateTokenEx, <.hExistingToken, .dwDesiredAccess, .lpTokenAttributes, .ImpersonationLevel, .TokenType, .phNewToken>,  'DuplicateTokenEx',  \
    ElfBackupEventLogFileA, <NONE>,  'ElfBackupEventLogFileA',  \
    ElfBackupEventLogFileW, <NONE>,  'ElfBackupEventLogFileW',  \
    ElfChangeNotify, <NONE>,  'ElfChangeNotify',  \
    ElfClearEventLogFileA, <NONE>,  'ElfClearEventLogFileA',  \
    ElfClearEventLogFileW, <NONE>,  'ElfClearEventLogFileW',  \
    ElfCloseEventLog, <NONE>,  'ElfCloseEventLog',  \
    ElfDeregisterEventSource, <NONE>,  'ElfDeregisterEventSource',  \
    ElfFlushEventLog, <NONE>,  'ElfFlushEventLog',  \
    ElfNumberOfRecords, <NONE>,  'ElfNumberOfRecords',  \
    ElfOldestRecord, <NONE>,  'ElfOldestRecord',  \
    ElfOpenBackupEventLogA, <NONE>,  'ElfOpenBackupEventLogA',  \
    ElfOpenBackupEventLogW, <NONE>,  'ElfOpenBackupEventLogW',  \
    ElfOpenEventLogA, <NONE>,  'ElfOpenEventLogA',  \
    ElfOpenEventLogW, <NONE>,  'ElfOpenEventLogW',  \
    ElfReadEventLogA, <NONE>,  'ElfReadEventLogA',  \
    ElfReadEventLogW, <NONE>,  'ElfReadEventLogW',  \
    ElfRegisterEventSourceA, <NONE>,  'ElfRegisterEventSourceA',  \
    ElfRegisterEventSourceW, <NONE>,  'ElfRegisterEventSourceW',  \
    ElfReportEventA, <NONE>,  'ElfReportEventA',  \
    ElfReportEventW, <NONE>,  'ElfReportEventW',  \
    EnableTrace, <NONE>,  'EnableTrace',  \
    EncryptFileA, <.lpFileName>,  'EncryptFileA',  \
    EncryptFileW, <.lpFileName>,  'EncryptFileW',  \
    EncryptedFileKeyInfo, <NONE>,  'EncryptedFileKeyInfo',  \
    EncryptionDisable, <.DirPath, .Disable>,  'EncryptionDisable',  \
    EnumDependentServicesA, <.hService, .dwServiceState, .lpServices, .cbBufSize, .pcbBytesNeeded, .lpServicesReturned>,  'EnumDependentServicesA',  \
    EnumDependentServicesW, <.hService, .dwServiceState, .lpServices, .cbBufSize, .pcbBytesNeeded, .lpServicesReturned>,  'EnumDependentServicesW',  \
    EnumServiceGroupW, <NONE>,  'EnumServiceGroupW',  \
    EnumServicesStatusA, <.hSCManager, .dwServiceType, .dwServiceState, .lpServices, .cbBufSize, .pcbBytesNeeded, .lpServicesReturned,  \
        .lpResumeHandle>,  'EnumServicesStatusA',  \
    EnumServicesStatusExA, <.hSCManager, .InfoLevel, .dwServiceType, .dwServiceState, .lpServices, .cbBufSize, .pcbBytesNeeded, .lpServicesReturned,  \
        .lpResumeHandle, .pszGroupName>,  'EnumServicesStatusExA',  \
    EnumServicesStatusExW, <.hSCManager, .InfoLevel, .dwServiceType, .dwServiceState, .lpServices, .cbBufSize, .pcbBytesNeeded, .lpServicesReturned,  \
        .lpResumeHandle, .pszGroupName>,  'EnumServicesStatusExW',  \
    EnumServicesStatusW, <.hSCManager, .dwServiceType, .dwServiceState, .lpServices, .cbBufSize, .pcbBytesNeeded, .lpServicesReturned,  \
        .lpResumeHandle>,  'EnumServicesStatusW',  \
    EnumerateTraceGuids, <NONE>,  'EnumerateTraceGuids',  \
    EqualDomainSid, <NONE>,  'EqualDomainSid',  \
    EqualPrefixSid, <.pSid1, .pSid2>,  'EqualPrefixSid',  \
    EqualSid, <.pSid1, .pSid2>,  'EqualSid',  \
    FileEncryptionStatusA, <.lpFileName, .lpStatus>,  'FileEncryptionStatusA',  \
    FileEncryptionStatusW, <.lpFileName, .lpStatus>,  'FileEncryptionStatusW',  \
    FindFirstFreeAce, <.pAcl, .pAce>,  'FindFirstFreeAce',  \
    FlushTraceA, <NONE>,  'FlushTraceA',  \
    FlushTraceW, <NONE>,  'FlushTraceW',  \
    FreeEncryptedFileKeyInfo, <NONE>,  'FreeEncryptedFileKeyInfo',  \
    FreeEncryptionCertificateHashList, <.pHashes>,  'FreeEncryptionCertificateHashList',  \
    FreeInheritedFromArray, <.pInheritArray, .AceCnt, .pfnArray>,  'FreeInheritedFromArray',  \
    FreeSid, <.pSid>,  'FreeSid',  \
    GetAccessPermissionsForObjectA, <NONE>,  'GetAccessPermissionsForObjectA',  \
    GetAccessPermissionsForObjectW, <NONE>,  'GetAccessPermissionsForObjectW',  \
    GetAce, <.pAcl, .dwAceIndex, .pAce>,  'GetAce',  \
    GetAclInformation, <.pAcl, .pAclInformation, .nAclInformationLength, .dwAclInformationClass>,  'GetAclInformation',  \
    GetAuditedPermissionsFromAclA, <.pAcl, .pTrustee, .pSuccessfulAuditedRights, .pFailedAuditRights>,  'GetAuditedPermissionsFromAclA',  \
    GetAuditedPermissionsFromAclW, <.pAcl, .pTrustee, .pSuccessfulAuditedRights, .pFailedAuditRights>,  'GetAuditedPermissionsFromAclW',  \
    GetCurrentHwProfileA, <.lpHwProfileInfo>,  'GetCurrentHwProfileA',  \
    GetCurrentHwProfileW, <.lpHwProfileInfo>,  'GetCurrentHwProfileW',  \
    GetEffectiveRightsFromAclA, <.pAcl, .pTrustee, .pAccessRights>,  'GetEffectiveRightsFromAclA',  \
    GetEffectiveRightsFromAclW, <.pAcl, .pTrustee, .pAccessRights>,  'GetEffectiveRightsFromAclW',  \
    GetEventLogInformation, <.hEventLog, .dwInfoLevel, .lpBuffer, .cbBufSize, .pcbBytesNeeded>,  'GetEventLogInformation',  \
    GetExplicitEntriesFromAclA, <.pAcl, .pcCountOfExplicitEntries, .pListOfExplicitEntries>,  'GetExplicitEntriesFromAclA',  \
    GetExplicitEntriesFromAclW, <.pAcl, .pcCountOfExplicitEntries, .pListOfExplicitEntries>,  'GetExplicitEntriesFromAclW',  \
    GetFileSecurityA, <.lpFileName, .RequestedInformation, .pSecurityDescriptor, .nLength, .lpnLengthNeeded>,  'GetFileSecurityA',  \
    GetFileSecurityW, <.lpFileName, .RequestedInformation, .pSecurityDescriptor, .nLength, .lpnLengthNeeded>,  'GetFileSecurityW',  \
    GetInformationCodeAuthzLevelW, <NONE>,  'GetInformationCodeAuthzLevelW',  \
    GetInformationCodeAuthzPolicyW, <NONE>,  'GetInformationCodeAuthzPolicyW',  \
    GetInheritanceSourceA, <.pObjectName, .ObjectType, .SecurityInfo, .Container, .ObjectTypeGuid, .pAcl, .pfnArray, .pGenericMapping,  \
        .pInheritArray>,  'GetInheritanceSourceA',  \
    GetInheritanceSourceW, <.pObjectName, .ObjectType, .SecurityInfo, .Container, .ObjectTypeGuid, .pAcl, .pfnArray, .pGenericMapping,  \
        .pInheritArray>,  'GetInheritanceSourceW',  \
    GetKernelObjectSecurity, <.Handle, .RequestedInformation, .pSecurityDescriptor, .nLength, .lpnLengthNeeded>,  'GetKernelObjectSecurity',  \
    GetLengthSid, <.pSid>,  'GetLengthSid',  \
    GetLocalManagedApplicationData, <NONE>,  'GetLocalManagedApplicationData',  \
    GetLocalManagedApplications, <NONE>,  'GetLocalManagedApplications',  \
    GetManagedApplicationCategories, <NONE>,  'GetManagedApplicationCategories',  \
    GetManagedApplications, <NONE>,  'GetManagedApplications',  \
    GetMultipleTrusteeA, <.pTrustee>,  'GetMultipleTrusteeA',  \
    GetMultipleTrusteeOperationA, <.pTrustee>,  'GetMultipleTrusteeOperationA',  \
    GetMultipleTrusteeOperationW, <.pTrustee>,  'GetMultipleTrusteeOperationW',  \
    GetMultipleTrusteeW, <.pTrustee>,  'GetMultipleTrusteeW',  \
    GetNamedSecurityInfoA, <.pObjectName, .ObjectType, .SecurityInfo, .ppsidOwner, .ppsidGroup, .ppDacl, .ppSacl, .ppSecurityDescriptor,  \
      >,  'GetNamedSecurityInfoA',  \
    GetNamedSecurityInfoExA, <NONE>,  'GetNamedSecurityInfoExA',  \
    GetNamedSecurityInfoExW, <NONE>,  'GetNamedSecurityInfoExW',  \
    GetNamedSecurityInfoW, <.pObjectName, .ObjectType, .SecurityInfo, .ppsidOwner, .ppsidGroup, .ppDacl, .ppSacl, .ppSecurityDescriptor,  \
      >,  'GetNamedSecurityInfoW',  \
    GetNumberOfEventLogRecords, <.hEventLog, .NumberOfRecords>,  'GetNumberOfEventLogRecords',  \
    GetOldestEventLogRecord, <.hEventLog, .OldestRecord>,  'GetOldestEventLogRecord',  \
    GetOverlappedAccessResults, <NONE>,  'GetOverlappedAccessResults',  \
    GetPrivateObjectSecurity, <.ObjectDescriptor, .SecurityInformation, .ResultantDescriptor, .DescriptorLength, .ReturnLength>,  'GetPrivateObjectSecurity',  \
    GetSecurityDescriptorControl, <.pSecurityDescriptor, .pControl, .lpdwRevision>,  'GetSecurityDescriptorControl',  \
    GetSecurityDescriptorDacl, <.pSecurityDescriptor, .lpbDaclPresent, .pDacl, .lpbDaclDefaulted>,  'GetSecurityDescriptorDacl',  \
    GetSecurityDescriptorGroup, <.pSecurityDescriptor, .pGroup, .lpbGroupDefaulted>,  'GetSecurityDescriptorGroup',  \
    GetSecurityDescriptorLength, <.pSecurityDescriptor>,  'GetSecurityDescriptorLength',  \
    GetSecurityDescriptorOwner, <.pSecurityDescriptor, .pOwner, .lpbOwnerDefaulted>,  'GetSecurityDescriptorOwner',  \
    GetSecurityDescriptorRMControl, <.SecurityDescriptor, .RMControl>,  'GetSecurityDescriptorRMControl',  \
    GetSecurityDescriptorSacl, <.pSecurityDescriptor, .lpbSaclPresent, .pSacl, .lpbSaclDefaulted>,  'GetSecurityDescriptorSacl',  \
    GetSecurityInfo, <.Handle, .ObjectType, .SecurityInfo, .ppsidOwner, .ppsidGroup, .ppDacl, .ppSacl, .ppSecurityDescriptor>,  'GetSecurityInfo',  \
    GetSecurityInfoExA, <NONE>,  'GetSecurityInfoExA',  \
    GetSecurityInfoExW, <NONE>,  'GetSecurityInfoExW',  \
    GetServiceDisplayNameA, <.hSCManager, .lpServiceName, .lpDisplayName, .lpcchBuffer>,  'GetServiceDisplayNameA',  \
    GetServiceDisplayNameW, <.hSCManager, .lpServiceName, .lpDisplayName, .lpcchBuffer>,  'GetServiceDisplayNameW',  \
    GetServiceKeyNameA, <.hSCManager, .lpDisplayName, .lpServiceName, .lpcchBuffer>,  'GetServiceKeyNameA',  \
    GetServiceKeyNameW, <.hSCManager, .lpDisplayName, .lpServiceName, .lpcchBuffer>,  'GetServiceKeyNameW',  \
    GetSidIdentifierAuthority, <.pSid>,  'GetSidIdentifierAuthority',  \
    GetSidLengthRequired, <.nSubAuthorityCount>,  'GetSidLengthRequired',  \
    GetSidSubAuthority, <.pSid, .nSubAuthority>,  'GetSidSubAuthority',  \
    GetSidSubAuthorityCount, <.pSid>,  'GetSidSubAuthorityCount',  \
    GetTokenInformation, <.TokenHandle, .TokenInformationClass, .TokenInformation, .TokenInformationLength, .ReturnLength>,  'GetTokenInformation',  \
    GetTraceEnableFlags, <NONE>,  'GetTraceEnableFlags',  \
    GetTraceEnableLevel, <NONE>,  'GetTraceEnableLevel',  \
    GetTraceLoggerHandle, <NONE>,  'GetTraceLoggerHandle',  \
    GetTrusteeFormA, <.pTrustee>,  'GetTrusteeFormA',  \
    GetTrusteeFormW, <.pTrustee>,  'GetTrusteeFormW',  \
    GetTrusteeNameA, <.pTrustee>,  'GetTrusteeNameA',  \
    GetTrusteeNameW, <.pTrustee>,  'GetTrusteeNameW',  \
    GetTrusteeTypeA, <.pTrustee>,  'GetTrusteeTypeA',  \
    GetTrusteeTypeW, <.pTrustee>,  'GetTrusteeTypeW',  \
    GetUserNameA, <.lpBuffer, .nSize>,  'GetUserNameA',  \
    GetUserNameW, <.lpBuffer, .nSize>,  'GetUserNameW',  \
    GetWindowsAccountDomainSid, <NONE>,  'GetWindowsAccountDomainSid',  \
    I_ScGetCurrentGroupStateW, <NONE>,  'I_ScGetCurrentGroupStateW',  \
    I_ScIsSecurityProcess, <NONE>,  'I_ScIsSecurityProcess',  \
    I_ScPnPGetServiceName, <NONE>,  'I_ScPnPGetServiceName',  \
    I_ScSendTSMessage, <NONE>,  'I_ScSendTSMessage',  \
    I_ScSetServiceBitsA, <NONE>,  'I_ScSetServiceBitsA',  \
    I_ScSetServiceBitsW, <NONE>,  'I_ScSetServiceBitsW',  \
    IdentifyCodeAuthzLevelW, <NONE>,  'IdentifyCodeAuthzLevelW',  \
    ImpersonateAnonymousToken, <.ThreadHandle>,  'ImpersonateAnonymousToken',  \
    ImpersonateLoggedOnUser, <.hToken>,  'ImpersonateLoggedOnUser',  \
    ImpersonateNamedPipeClient, <.hNamedPipe>,  'ImpersonateNamedPipeClient',  \
    ImpersonateSelf, <.ImpersonationLevel>,  'ImpersonateSelf',  \
    InitializeAcl, <.pAcl, .nAclLength, .dwAclRevision>,  'InitializeAcl',  \
    InitializeSecurityDescriptor, <.pSecurityDescriptor, .dwRevision>,  'InitializeSecurityDescriptor',  \
    InitializeSid, <.Sid, .pIdentifierAuthority, .nSubAuthorityCount>,  'InitializeSid',  \
    InitiateSystemShutdownA, <.lpMachineName, .lpMessage, .dwTimeout, .bForceAppsClosed, .bRebootAfterShutdown>,  'InitiateSystemShutdownA',  \
    InitiateSystemShutdownExA, <.lpMachineName, .lpMessage, .dwTimeout, .bForceAppsClosed, .bRebootAfterShutdown, .dwReason>,  'InitiateSystemShutdownExA',  \
    InitiateSystemShutdownExW, <.lpMachineName, .lpMessage, .dwTimeout, .bForceAppsClosed, .bRebootAfterShutdown, .dwReason>,  'InitiateSystemShutdownExW',  \
    InitiateSystemShutdownW, <.lpMachineName, .lpMessage, .dwTimeout, .bForceAppsClosed, .bRebootAfterShutdown>,  'InitiateSystemShutdownW',  \
    InstallApplication, <NONE>,  'InstallApplication',  \
    IsTextUnicode, <.lpBuffer, .cb, .lpi>,  'IsTextUnicode',  \
    IsTokenRestricted, <.TokenHandle>,  'IsTokenRestricted',  \
    IsTokenUntrusted, <NONE>,  'IsTokenUntrusted',  \
    IsValidAcl, <.pAcl>,  'IsValidAcl',  \
    IsValidSecurityDescriptor, <.pSecurityDescriptor>,  'IsValidSecurityDescriptor',  \
    IsValidSid, <.pSid>,  'IsValidSid',  \
    IsWellKnownSid, <NONE>,  'IsWellKnownSid',  \
    LockServiceDatabase, <.hSCManager>,  'LockServiceDatabase',  \
    LogonUserA, <.lpszUsername, .lpszDomain, .lpszPassword, .dwLogonType, .dwLogonProvider, .phToken>,  'LogonUserA',  \
    LogonUserExA, <NONE>,  'LogonUserExA',  \
    LogonUserExW, <NONE>,  'LogonUserExW',  \
    LogonUserW, <.lpszUsername, .lpszDomain, .lpszPassword, .dwLogonType, .dwLogonProvider, .phToken>,  'LogonUserW',  \
    LookupAccountNameA, <.lpSystemName, .lpAccountName, .Sid, .cbSid, .ReferencedDomainName, .cbReferencedDomainName, .peUse>,  'LookupAccountNameA',  \
    LookupAccountNameW, <.lpSystemName, .lpAccountName, .Sid, .cbSid, .ReferencedDomainName, .cbReferencedDomainName, .peUse>,  'LookupAccountNameW',  \
    LookupAccountSidA, <.lpSystemName, .Sid, .Name, .cbName, .ReferencedDomainName, .cbReferencedDomainName, .peUse>,  'LookupAccountSidA',  \
    LookupAccountSidW, <.lpSystemName, .Sid, .Name, .cbName, .ReferencedDomainName, .cbReferencedDomainName, .peUse>,  'LookupAccountSidW',  \
    LookupPrivilegeDisplayNameA, <.lpSystemName, .lpName, .lpDisplayName, .cbDisplayName, .lpLanguageID>,  'LookupPrivilegeDisplayNameA',  \
    LookupPrivilegeDisplayNameW, <.lpSystemName, .lpName, .lpDisplayName, .cbDisplayName, .lpLanguageID>,  'LookupPrivilegeDisplayNameW',  \
    LookupPrivilegeNameA, <.lpSystemName, .lpLuid, .lpName, .cbName>,  'LookupPrivilegeNameA',  \
    LookupPrivilegeNameW, <.lpSystemName, .lpLuid, .lpName, .cbName>,  'LookupPrivilegeNameW',  \
    LookupPrivilegeValueA, <.lpSystemName, .lpName, .lpLuid>,  'LookupPrivilegeValueA',  \
    LookupPrivilegeValueW, <.lpSystemName, .lpName, .lpLuid>,  'LookupPrivilegeValueW',  \
    LookupSecurityDescriptorPartsA, <.pOwner, .pGroup, .cCountOfAccessEntries, .pListOfAccessEntries, .cCountOfAuditEntries, .pListOfAuditEntries,  \
        .pSD>,  'LookupSecurityDescriptorPartsA',  \
    LookupSecurityDescriptorPartsW, <.pOwner, .pGroup, .cCountOfAccessEntries, .pListOfAccessEntries, .cCountOfAuditEntries, .pListOfAuditEntries,  \
        .pSD>,  'LookupSecurityDescriptorPartsW',  \
    LsaAddAccountRights, <.PolicyHandle, .AccountSid, .UserRights, .CountOfRights>,  'LsaAddAccountRights',  \
    LsaAddPrivilegesToAccount, <NONE>,  'LsaAddPrivilegesToAccount',  \
    LsaClearAuditLog, <NONE>,  'LsaClearAuditLog',  \
    LsaClose, <.ObjectHandle>,  'LsaClose',  \
    LsaCreateAccount, <NONE>,  'LsaCreateAccount',  \
    LsaCreateSecret, <NONE>,  'LsaCreateSecret',  \
    LsaCreateTrustedDomain, <NONE>,  'LsaCreateTrustedDomain',  \
    LsaCreateTrustedDomainEx, <.PolicyHandle, .TrustedDomainInformation, .AuthenticationInformation, .DesiredAccess, .TrustedDomainHandle,  \
      >,  'LsaCreateTrustedDomainEx',  \
    LsaDelete, <NONE>,  'LsaDelete',  \
    LsaDeleteTrustedDomain, <.PolicyHandle, .TrustedDomainSid>,  'LsaDeleteTrustedDomain',  \
    LsaEnumerateAccountRights, <.PolicyHandle, .AccountSid, .UserRights, .CountOfRights>,  'LsaEnumerateAccountRights',  \
    LsaEnumerateAccounts, <NONE>,  'LsaEnumerateAccounts',  \
    LsaEnumerateAccountsWithUserRight, <.PolicyHandle, .UserRights, .EnumerationBuffer, .CountReturned>,  'LsaEnumerateAccountsWithUserRight',  \
    LsaEnumeratePrivileges, <NONE>,  'LsaEnumeratePrivileges',  \
    LsaEnumeratePrivilegesOfAccount, <NONE>,  'LsaEnumeratePrivilegesOfAccount',  \
    LsaEnumerateTrustedDomains, <.PolicyHandle, .EnumerationContext, .buffer, .PreferedMaximumLength, .CountReturned>,  'LsaEnumerateTrustedDomains',  \
    LsaEnumerateTrustedDomainsEx, <.PolicyHandle, .EnumerationContext, .buffer, .PreferedMaximumLength, .CountReturned>,  'LsaEnumerateTrustedDomainsEx',  \
    LsaFreeMemory, <.buffer>,  'LsaFreeMemory',  \
    LsaGetQuotasForAccount, <NONE>,  'LsaGetQuotasForAccount',  \
    LsaGetRemoteUserName, <NONE>,  'LsaGetRemoteUserName',  \
    LsaGetSystemAccessAccount, <NONE>,  'LsaGetSystemAccessAccount',  \
    LsaGetUserName, <NONE>,  'LsaGetUserName',  \
    LsaICLookupNames, <NONE>,  'LsaICLookupNames',  \
    LsaICLookupNamesWithCreds, <NONE>,  'LsaICLookupNamesWithCreds',  \
    LsaICLookupSids, <NONE>,  'LsaICLookupSids',  \
    LsaICLookupSidsWithCreds, <NONE>,  'LsaICLookupSidsWithCreds',  \
    LsaLookupNames, <.PolicyHandle, .count, .Names, .ReferencedDomains, .Sids>,  'LsaLookupNames',  \
    LsaLookupNames2, <NONE>,  'LsaLookupNames2',  \
    LsaLookupPrivilegeDisplayName, <NONE>,  'LsaLookupPrivilegeDisplayName',  \
    LsaLookupPrivilegeName, <NONE>,  'LsaLookupPrivilegeName',  \
    LsaLookupPrivilegeValue, <NONE>,  'LsaLookupPrivilegeValue',  \
    LsaLookupSids, <.PolicyHandle, .count, .Sids, .ReferencedDomains, .Names>,  'LsaLookupSids',  \
    LsaNtStatusToWinError, <.Status>,  'LsaNtStatusToWinError',  \
    LsaOpenAccount, <NONE>,  'LsaOpenAccount',  \
    LsaOpenPolicy, <.SystemName, .ObjectAttributes, .DesiredAccess, .PolicyHandle>,  'LsaOpenPolicy',  \
    LsaOpenPolicySce, <NONE>,  'LsaOpenPolicySce',  \
    LsaOpenSecret, <NONE>,  'LsaOpenSecret',  \
    LsaOpenTrustedDomain, <NONE>,  'LsaOpenTrustedDomain',  \
    LsaOpenTrustedDomainByName, <.PolicyHandle, .TrustedDomainName, .DesiredAccess, .TrustedDomainHandle>,  'LsaOpenTrustedDomainByName',  \
    LsaQueryDomainInformationPolicy, <.PolicyHandle, .InformationClass, .buffer>,  'LsaQueryDomainInformationPolicy',  \
    LsaQueryForestTrustInformation, <NONE>,  'LsaQueryForestTrustInformation',  \
    LsaQueryInfoTrustedDomain, <NONE>,  'LsaQueryInfoTrustedDomain',  \
    LsaQueryInformationPolicy, <.PolicyHandle, .InformationClass, .buffer>,  'LsaQueryInformationPolicy',  \
    LsaQuerySecret, <NONE>,  'LsaQuerySecret',  \
    LsaQuerySecurityObject, <NONE>,  'LsaQuerySecurityObject',  \
    LsaQueryTrustedDomainInfo, <.PolicyHandle, .TrustedDomainSid, .InformationClass, .buffer>,  'LsaQueryTrustedDomainInfo',  \
    LsaQueryTrustedDomainInfoByName, <.PolicyHandle, .TrustedDomainName, .InformationClass, .buffer>,  'LsaQueryTrustedDomainInfoByName',  \
    LsaRemoveAccountRights, <.PolicyHandle, .AccountSid, .AllRights, .UserRights, .CountOfRights>,  'LsaRemoveAccountRights',  \
    LsaRemovePrivilegesFromAccount, <NONE>,  'LsaRemovePrivilegesFromAccount',  \
    LsaRetrievePrivateData, <.PolicyHandle, .KeyName, .PrivateData>,  'LsaRetrievePrivateData',  \
    LsaSetDomainInformationPolicy, <.PolicyHandle, .InformationClass, .buffer>,  'LsaSetDomainInformationPolicy',  \
    LsaSetForestTrustInformation, <NONE>,  'LsaSetForestTrustInformation',  \
    LsaSetInformationPolicy, <.PolicyHandle, .InformationClass, .buffer>,  'LsaSetInformationPolicy',  \
    LsaSetInformationTrustedDomain, <NONE>,  'LsaSetInformationTrustedDomain',  \
    LsaSetQuotasForAccount, <NONE>,  'LsaSetQuotasForAccount',  \
    LsaSetSecret, <NONE>,  'LsaSetSecret',  \
    LsaSetSecurityObject, <NONE>,  'LsaSetSecurityObject',  \
    LsaSetSystemAccessAccount, <NONE>,  'LsaSetSystemAccessAccount',  \
    LsaSetTrustedDomainInfoByName, <.PolicyHandle, .TrustedDomainName, .InformationClass, .buffer>,  'LsaSetTrustedDomainInfoByName',  \
    LsaSetTrustedDomainInformation, <.PolicyHandle, .TrustedDomainSid, .InformationClass, .buffer>,  'LsaSetTrustedDomainInformation',  \
    LsaStorePrivateData, <.PolicyHandle, .KeyName, .PrivateData>,  'LsaStorePrivateData',  \
    MD4Final, <NONE>,  'MD4Final',  \
    MD4Init, <NONE>,  'MD4Init',  \
    MD4Update, <NONE>,  'MD4Update',  \
    MD5Final, <NONE>,  'MD5Final',  \
    MD5Init, <NONE>,  'MD5Init',  \
    MD5Update, <NONE>,  'MD5Update',  \
    MSChapSrvChangePassword, <NONE>,  'MSChapSrvChangePassword',  \
    MSChapSrvChangePassword2, <NONE>,  'MSChapSrvChangePassword2',  \
    MakeAbsoluteSD, <.pSelfRelativeSecurityDescriptor, .pAbsoluteSecurityDescriptor, .lpdwAbsoluteSecurityDescriptorSize, .pDacl, .lpdwDaclSize,  \
        .pSacl, .lpdwSaclSize, .pOwner, .lpdwOwnerSize, .pPrimaryGroup, .lpdwPrimaryGroupSize>,  'MakeAbsoluteSD',  \
    MakeAbsoluteSD2, <.pSelfRelativeSecurityDescriptor, .lpdwBufferSize>,  'MakeAbsoluteSD2',  \
    MakeSelfRelativeSD, <.pAbsoluteSecurityDescriptor, .pSelfRelativeSecurityDescriptor, .lpdwBufferLength>,  'MakeSelfRelativeSD',  \
    MapGenericMask, <.AccessMask, .GenericMapping>,  'MapGenericMask',  \
    NotifyBootConfigStatus, <.BootAcceptable>,  'NotifyBootConfigStatus',  \
    NotifyChangeEventLog, <.hEventLog, .hEvent>,  'NotifyChangeEventLog',  \
    ObjectCloseAuditAlarmA, <.SubsystemName, .HandleId, .GenerateOnClose>,  'ObjectCloseAuditAlarmA',  \
    ObjectCloseAuditAlarmW, <.SubsystemName, .HandleId, .GenerateOnClose>,  'ObjectCloseAuditAlarmW',  \
    ObjectDeleteAuditAlarmA, <.SubsystemName, .HandleId, .GenerateOnClose>,  'ObjectDeleteAuditAlarmA',  \
    ObjectDeleteAuditAlarmW, <.SubsystemName, .HandleId, .GenerateOnClose>,  'ObjectDeleteAuditAlarmW',  \
    ObjectOpenAuditAlarmA, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .pSecurityDescriptor, .ClientToken, .DesiredAccess,  \
        .GrantedAccess, .Privileges, .ObjectCreation, .AccessGranted, .GenerateOnClose>,  'ObjectOpenAuditAlarmA',  \
    ObjectOpenAuditAlarmW, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .pSecurityDescriptor, .ClientToken, .DesiredAccess,  \
        .GrantedAccess, .Privileges, .ObjectCreation, .AccessGranted, .GenerateOnClose>,  'ObjectOpenAuditAlarmW',  \
    ObjectPrivilegeAuditAlarmA, <.SubsystemName, .HandleId, .ClientToken, .DesiredAccess, .Privileges, .AccessGranted>,  'ObjectPrivilegeAuditAlarmA',  \
    ObjectPrivilegeAuditAlarmW, <.SubsystemName, .HandleId, .ClientToken, .DesiredAccess, .Privileges, .AccessGranted>,  'ObjectPrivilegeAuditAlarmW',  \
    OpenBackupEventLogA, <.lpUNCServerName, .lpFileName>,  'OpenBackupEventLogA',  \
    OpenBackupEventLogW, <.lpUNCServerName, .lpFileName>,  'OpenBackupEventLogW',  \
    OpenEncryptedFileRawA, <.lpFileName, .ulFlags, .pvContext>,  'OpenEncryptedFileRawA',  \
    OpenEncryptedFileRawW, <.lpFileName, .ulFlags, .pvContext>,  'OpenEncryptedFileRawW',  \
    OpenEventLogA, <.lpUNCServerName, .lpSourceName>,  'OpenEventLogA',  \
    OpenEventLogW, <.lpUNCServerName, .lpSourceName>,  'OpenEventLogW',  \
    OpenProcessToken, <.ProcessHandle, .DesiredAccess, .TokenHandle>,  'OpenProcessToken',  \
    OpenSCManagerA, <.lpMachineName, .lpDatabaseName, .dwDesiredAccess>,  'OpenSCManagerA',  \
    OpenSCManagerW, <.lpMachineName, .lpDatabaseName, .dwDesiredAccess>,  'OpenSCManagerW',  \
    OpenServiceA, <.hSCManager, .lpServiceName, .dwDesiredAccess>,  'OpenServiceA',  \
    OpenServiceW, <.hSCManager, .lpServiceName, .dwDesiredAccess>,  'OpenServiceW',  \
    OpenThreadToken, <.ThreadHandle, .DesiredAccess, .OpenAsSelf, .TokenHandle>,  'OpenThreadToken',  \
    OpenTraceA, <NONE>,  'OpenTraceA',  \
    OpenTraceW, <NONE>,  'OpenTraceW',  \
    PrivilegeCheck, <.ClientToken, .RequiredPrivileges, .pfResult>,  'PrivilegeCheck',  \
    PrivilegedServiceAuditAlarmA, <.SubsystemName, .ServiceName, .ClientToken, .Privileges, .AccessGranted>,  'PrivilegedServiceAuditAlarmA',  \
    PrivilegedServiceAuditAlarmW, <.SubsystemName, .ServiceName, .ClientToken, .Privileges, .AccessGranted>,  'PrivilegedServiceAuditAlarmW',  \
    ProcessIdleTasks, <NONE>,  'ProcessIdleTasks',  \
    ProcessTrace, <NONE>,  'ProcessTrace',  \
    QueryAllTracesA, <NONE>,  'QueryAllTracesA',  \
    QueryAllTracesW, <NONE>,  'QueryAllTracesW',  \
    QueryRecoveryAgentsOnEncryptedFile, <.lpFileName, .pRecoveryAgents>,  'QueryRecoveryAgentsOnEncryptedFile',  \
    QueryServiceConfig2A, <.hService, .dwInfoLevel, .lpBuffer, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceConfig2A',  \
    QueryServiceConfig2W, <.hService, .dwInfoLevel, .lpBuffer, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceConfig2W',  \
    QueryServiceConfigA, <.hService, .lpServiceConfig, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceConfigA',  \
    QueryServiceConfigW, <.hService, .lpServiceConfig, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceConfigW',  \
    QueryServiceLockStatusA, <.hSCManager, .lpLockStatus, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceLockStatusA',  \
    QueryServiceLockStatusW, <.hSCManager, .lpLockStatus, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceLockStatusW',  \
    QueryServiceObjectSecurity, <.hService, .dwSecurityInformation, .lpSecurityDescriptor, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceObjectSecurity',  \
    QueryServiceStatus, <.hService, .lpServiceStatus>,  'QueryServiceStatus',  \
    QueryServiceStatusEx, <.hService, .InfoLevel, .lpBuffer, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceStatusEx',  \
    QueryTraceA, <NONE>,  'QueryTraceA',  \
    QueryTraceW, <NONE>,  'QueryTraceW',  \
    QueryUsersOnEncryptedFile, <.lpFileName, .pUsers>,  'QueryUsersOnEncryptedFile',  \
    QueryWindows31FilesMigration, <NONE>,  'QueryWindows31FilesMigration',  \
    ReadEncryptedFileRaw, <.pfExportCallback, .pvCallbackContext, .pvContext>,  'ReadEncryptedFileRaw',  \
    ReadEventLogA, <.hEventLog, .dwReadFlags, .dwRecordOffset, .lpBuffer, .nNumberOfBytesToRead, .pnBytesRead, .pnMinNumberOfBytesNeeded,  \
      >,  'ReadEventLogA',  \
    ReadEventLogW, <.hEventLog, .dwReadFlags, .dwRecordOffset, .lpBuffer, .nNumberOfBytesToRead, .pnBytesRead, .pnMinNumberOfBytesNeeded,  \
      >,  'ReadEventLogW',  \
    RegCloseKey, <.hKey>,  'RegCloseKey',  \
    RegConnectRegistryA, <.lpMachineName, .hKey, .phkResult>,  'RegConnectRegistryA',  \
    RegConnectRegistryW, <.lpMachineName, .hKey, .phkResult>,  'RegConnectRegistryW',  \
    RegCreateKeyA, <.hKey, .lpSubKey, .phkResult>,  'RegCreateKeyA',  \
    RegCreateKeyExA, <.hKey, .lpSubKey, .Reserved, .lpClass, .dwOptions, .samDesired, .lpSecurityAttributes, .phkResult, .lpdwDisposition,  \
      >,  'RegCreateKeyExA',  \
    RegCreateKeyExW, <.hKey, .lpSubKey, .Reserved, .lpClass, .dwOptions, .samDesired, .lpSecurityAttributes, .phkResult, .lpdwDisposition,  \
      >,  'RegCreateKeyExW',  \
    RegCreateKeyW, <.hKey, .lpSubKey, .phkResult>,  'RegCreateKeyW',  \
    RegDeleteKeyA, <.hKey, .lpSubKey>,  'RegDeleteKeyA',  \
    RegDeleteKeyW, <.hKey, .lpSubKey>,  'RegDeleteKeyW',  \
    RegDeleteValueA, <.hKey, .lpValueName>,  'RegDeleteValueA',  \
    RegDeleteValueW, <.hKey, .lpValueName>,  'RegDeleteValueW',  \
    RegDisablePredefinedCache, <VOID>,  'RegDisablePredefinedCache',  \
    RegDisablePredefinedCacheEx, <NONE>,  'RegDisablePredefinedCacheEx',  \
    RegEnumKeyA, <.hKey, .dwIndex, .lpName, .cbName>,  'RegEnumKeyA',  \
    RegEnumKeyExA, <.hKey, .dwIndex, .lpName, .lpcbName, .lpReserved, .lpClass, .lpcbClass, .lpftLastWriteTime>,  'RegEnumKeyExA',  \
    RegEnumKeyExW, <.hKey, .dwIndex, .lpName, .lpcbName, .lpReserved, .lpClass, .lpcbClass, .lpftLastWriteTime>,  'RegEnumKeyExW',  \
    RegEnumKeyW, <.hKey, .dwIndex, .lpName, .cbName>,  'RegEnumKeyW',  \
    RegEnumValueA, <.hKey, .dwIndex, .lpValueName, .lpcbValueName, .lpReserved, .lpType, .lpData, .lpcbData>,  'RegEnumValueA',  \
    RegEnumValueW, <.hKey, .dwIndex, .lpValueName, .lpcbValueName, .lpReserved, .lpType, .lpData, .lpcbData>,  'RegEnumValueW',  \
    RegFlushKey, <.hKey>,  'RegFlushKey',  \
    RegGetKeySecurity, <.hKey, .SecurityInformation, .pSecurityDescriptor, .lpcbSecurityDescriptor>,  'RegGetKeySecurity',  \
    RegLoadKeyA, <.hKey, .lpSubKey, .lpFile>,  'RegLoadKeyA',  \
    RegLoadKeyW, <.hKey, .lpSubKey, .lpFile>,  'RegLoadKeyW',  \
    RegNotifyChangeKeyValue, <.hKey, .bWatchSubtree, .dwNotifyFilter, .hEvent, .fAsynchronus>,  'RegNotifyChangeKeyValue',  \
    RegOpenCurrentUser, <.samDesired, .phkResult>,  'RegOpenCurrentUser',  \
    RegOpenKeyA, <.hKey, .lpSubKey, .phkResult>,  'RegOpenKeyA',  \
    RegOpenKeyExA, <.hKey, .lpSubKey, .ulOptions, .samDesired, .phkResult>,  'RegOpenKeyExA',  \
    RegOpenKeyExW, <.hKey, .lpSubKey, .ulOptions, .samDesired, .phkResult>,  'RegOpenKeyExW',  \
    RegOpenKeyW, <.hKey, .lpSubKey, .phkResult>,  'RegOpenKeyW',  \
    RegOpenUserClassesRoot, <.hToken, .dwOptions, .samDesired, .phkResult>,  'RegOpenUserClassesRoot',  \
    RegOverridePredefKey, <.hKey, .hNewHKey>,  'RegOverridePredefKey',  \
    RegQueryInfoKeyA, <.hKey, .lpClass, .lpcbClass, .lpReserved, .lpcSubKeys, .lpcbMaxSubKeyLen, .lpcbMaxClassLen, .lpcValues, .lpcbMaxValueNameLen,  \
        .lpcbMaxValueLen, .lpcbSecurityDescriptor, .lpftLastWriteTime>,  'RegQueryInfoKeyA',  \
    RegQueryInfoKeyW, <.hKey, .lpClass, .lpcbClass, .lpReserved, .lpcSubKeys, .lpcbMaxSubKeyLen, .lpcbMaxClassLen, .lpcValues, .lpcbMaxValueNameLen,  \
        .lpcbMaxValueLen, .lpcbSecurityDescriptor, .lpftLastWriteTime>,  'RegQueryInfoKeyW',  \
    RegQueryMultipleValuesA, <.hKey, .val_list, .num_vals, .lpValueBuf, .ldwTotsize>,  'RegQueryMultipleValuesA',  \
    RegQueryMultipleValuesW, <.hKey, .val_list, .num_vals, .lpValueBuf, .ldwTotsize>,  'RegQueryMultipleValuesW',  \
    RegQueryValueA, <.hKey, .lpSubKey, .lpValue, .lpcbValue>,  'RegQueryValueA',  \
    RegQueryValueExA, <.hKey, .lpValueName, .lpReserved, .lpType, .lpData, .lpcbData>,  'RegQueryValueExA',  \
    RegQueryValueExW, <.hKey, .lpValueName, .lpReserved, .lpType, .lpData, .lpcbData>,  'RegQueryValueExW',  \
    RegQueryValueW, <.hKey, .lpSubKey, .lpValue, .lpcbValue>,  'RegQueryValueW',  \
    RegReplaceKeyA, <.hKey, .lpSubKey, .lpNewFile, .lpOldFile>,  'RegReplaceKeyA',  \
    RegReplaceKeyW, <.hKey, .lpSubKey, .lpNewFile, .lpOldFile>,  'RegReplaceKeyW',  \
    RegRestoreKeyA, <.hKey, .lpFile, .dwFlags>,  'RegRestoreKeyA',  \
    RegRestoreKeyW, <.hKey, .lpFile, .dwFlags>,  'RegRestoreKeyW',  \
    RegSaveKeyA, <.hKey, .lpFile, .lpSecurityAttributes>,  'RegSaveKeyA',  \
    RegSaveKeyExA, <NONE>,  'RegSaveKeyExA',  \
    RegSaveKeyExW, <NONE>,  'RegSaveKeyExW',  \
    RegSaveKeyW, <.hKey, .lpFile, .lpSecurityAttributes>,  'RegSaveKeyW',  \
    RegSetKeySecurity, <.hKey, .SecurityInformation, .pSecurityDescriptor>,  'RegSetKeySecurity',  \
    RegSetValueA, <.hKey, .lpSubKey, .dwType, .lpData, .cbData>,  'RegSetValueA',  \
    RegSetValueExA, <.hKey, .lpValueName, .Reserved, .dwType, .lpData, .cbData>,  'RegSetValueExA',  \
    RegSetValueExW, <.hKey, .lpValueName, .Reserved, .dwType, .lpData, .cbData>,  'RegSetValueExW',  \
    RegSetValueW, <.hKey, .lpSubKey, .dwType, .lpData, .cbData>,  'RegSetValueW',  \
    RegUnLoadKeyA, <.hKey, .lpSubKey>,  'RegUnLoadKeyA',  \
    RegUnLoadKeyW, <.hKey, .lpSubKey>,  'RegUnLoadKeyW',  \
    RegisterEventSourceA, <.lpUNCServerName, .lpSourceName>,  'RegisterEventSourceA',  \
    RegisterEventSourceW, <.lpUNCServerName, .lpSourceName>,  'RegisterEventSourceW',  \
    RegisterIdleTask, <NONE>,  'RegisterIdleTask',  \
    RegisterServiceCtrlHandlerA, <.lpServiceName, .lpHandlerProc>,  'RegisterServiceCtrlHandlerA',  \
    RegisterServiceCtrlHandlerExA, <.lpServiceName, .lpHandlerProc, .lpContext>,  'RegisterServiceCtrlHandlerExA',  \
    RegisterServiceCtrlHandlerExW, <.lpServiceName, .lpHandlerProc, .lpContext>,  'RegisterServiceCtrlHandlerExW',  \
    RegisterServiceCtrlHandlerW, <.lpServiceName, .lpHandlerProc>,  'RegisterServiceCtrlHandlerW',  \
    RegisterTraceGuidsA, <NONE>,  'RegisterTraceGuidsA',  \
    RegisterTraceGuidsW, <NONE>,  'RegisterTraceGuidsW',  \
    RemoveTraceCallback, <NONE>,  'RemoveTraceCallback',  \
    RemoveUsersFromEncryptedFile, <.lpFileName, .pHashes>,  'RemoveUsersFromEncryptedFile',  \
    ReportEventA, <.hEventLog, .wType, .wCategory, .dwEventID, .lpUserSid, .wNumStrings, .dwDataSize, .lpStrings, .lpRawData>,  'ReportEventA',  \
    ReportEventW, <.hEventLog, .wType, .wCategory, .dwEventID, .lpUserSid, .wNumStrings, .dwDataSize, .lpStrings, .lpRawData>,  'ReportEventW',  \
    RevertToSelf, <VOID>,  'RevertToSelf',  \
    SaferCloseLevel, <NONE>,  'SaferCloseLevel',  \
    SaferComputeTokenFromLevel, <NONE>,  'SaferComputeTokenFromLevel',  \
    SaferCreateLevel, <NONE>,  'SaferCreateLevel',  \
    SaferGetLevelInformation, <NONE>,  'SaferGetLevelInformation',  \
    SaferGetPolicyInformation, <NONE>,  'SaferGetPolicyInformation',  \
    SaferIdentifyLevel, <NONE>,  'SaferIdentifyLevel',  \
    SaferRecordEventLogEntry, <NONE>,  'SaferRecordEventLogEntry',  \
    SaferSetLevelInformation, <NONE>,  'SaferSetLevelInformation',  \
    SaferSetPolicyInformation, <NONE>,  'SaferSetPolicyInformation',  \
    SaferiChangeRegistryScope, <NONE>,  'SaferiChangeRegistryScope',  \
    SaferiCompareTokenLevels, <NONE>,  'SaferiCompareTokenLevels',  \
    SaferiIsExecutableFileType, <NONE>,  'SaferiIsExecutableFileType',  \
    SaferiPopulateDefaultsInRegistry, <NONE>,  'SaferiPopulateDefaultsInRegistry',  \
    SaferiRecordEventLogEntry, <NONE>,  'SaferiRecordEventLogEntry',  \
    SaferiReplaceProcessThreadTokens, <NONE>,  'SaferiReplaceProcessThreadTokens',  \
    SaferiSearchMatchingHashRules, <NONE>,  'SaferiSearchMatchingHashRules',  \
    SetAclInformation, <.pAcl, .pAclInformation, .nAclInformationLength, .dwAclInformationClass>,  'SetAclInformation',  \
    SetEntriesInAccessListA, <NONE>,  'SetEntriesInAccessListA',  \
    SetEntriesInAccessListW, <NONE>,  'SetEntriesInAccessListW',  \
    SetEntriesInAclA, <.cCountOfExplicitEntries, .pListOfExplicitEntries, .OldAcl, .NewAcl>,  'SetEntriesInAclA',  \
    SetEntriesInAclW, <.cCountOfExplicitEntries, .pListOfExplicitEntries, .OldAcl, .NewAcl>,  'SetEntriesInAclW',  \
    SetEntriesInAuditListA, <NONE>,  'SetEntriesInAuditListA',  \
    SetEntriesInAuditListW, <NONE>,  'SetEntriesInAuditListW',  \
    SetFileSecurityA, <.lpFileName, .SecurityInformation, .pSecurityDescriptor>,  'SetFileSecurityA',  \
    SetFileSecurityW, <.lpFileName, .SecurityInformation, .pSecurityDescriptor>,  'SetFileSecurityW',  \
    SetInformationCodeAuthzLevelW, <NONE>,  'SetInformationCodeAuthzLevelW',  \
    SetInformationCodeAuthzPolicyW, <NONE>,  'SetInformationCodeAuthzPolicyW',  \
    SetKernelObjectSecurity, <.Handle, .SecurityInformation, .SecurityDescriptor>,  'SetKernelObjectSecurity',  \
    SetNamedSecurityInfoA, <.pObjectName, .ObjectType, .SecurityInfo, .psidOwner, .psidGroup, .pDacl, .pSacl>,  'SetNamedSecurityInfoA',  \
    SetNamedSecurityInfoExA, <NONE>,  'SetNamedSecurityInfoExA',  \
    SetNamedSecurityInfoExW, <NONE>,  'SetNamedSecurityInfoExW',  \
    SetNamedSecurityInfoW, <.pObjectName, .ObjectType, .SecurityInfo, .psidOwner, .psidGroup, .pDacl, .pSacl>,  'SetNamedSecurityInfoW',  \
    SetPrivateObjectSecurity, <.SecurityInformation, .ModificationDescriptor, .ObjectsSecurityDescriptor, .GenericMapping, .Token,  \
      >,  'SetPrivateObjectSecurity',  \
    SetPrivateObjectSecurityEx, <.SecurityInformation, .ModificationDescriptor, .ObjectsSecurityDescriptor, .AutoInheritFlags, .GenericMapping,  \
        .Token>,  'SetPrivateObjectSecurityEx',  \
    SetSecurityDescriptorControl, <.pSecurityDescriptor, .ControlBitsOfInterest, .ControlBitsToSet>,  'SetSecurityDescriptorControl',  \
    SetSecurityDescriptorDacl, <.pSecurityDescriptor, .bDaclPresent, .pDacl, .bDaclDefaulted>,  'SetSecurityDescriptorDacl',  \
    SetSecurityDescriptorGroup, <.pSecurityDescriptor, .pGroup, .bGroupDefaulted>,  'SetSecurityDescriptorGroup',  \
    SetSecurityDescriptorOwner, <.pSecurityDescriptor, .pOwner, .bOwnerDefaulted>,  'SetSecurityDescriptorOwner',  \
    SetSecurityDescriptorRMControl, <.SecurityDescriptor, .RMControl>,  'SetSecurityDescriptorRMControl',  \
    SetSecurityDescriptorSacl, <.pSecurityDescriptor, .bSaclPresent, .pSacl, .bSaclDefaulted>,  'SetSecurityDescriptorSacl',  \
    SetSecurityInfo, <.handle, .ObjectType, .SecurityInfo, .psidOwner, .psidGroup, .pDacl, .pSacl>,  'SetSecurityInfo',  \
    SetSecurityInfoExA, <NONE>,  'SetSecurityInfoExA',  \
    SetSecurityInfoExW, <NONE>,  'SetSecurityInfoExW',  \
    SetServiceBits, <.hServiceStatus, .dwServiceBits, .bSetBitsOn, .bUpdateImmediately>,  'SetServiceBits',  \
    SetServiceObjectSecurity, <.hService, .dwSecurityInformation, .lpSecurityDescriptor>,  'SetServiceObjectSecurity',  \
    SetServiceStatus, <.hServiceStatus, .lpServiceStatus>,  'SetServiceStatus',  \
    SetThreadToken, <.Thread, .Token>,  'SetThreadToken',  \
    SetTokenInformation, <.TokenHandle, .TokenInformationClass, .TokenInformation, .TokenInformationLength>,  'SetTokenInformation',  \
    SetTraceCallback, <NONE>,  'SetTraceCallback',  \
    SetUserFileEncryptionKey, <.pEncryptionCertificate>,  'SetUserFileEncryptionKey',  \
    StartServiceA, <.hService, .dwNumServiceArgs, .lpServiceArgVectors>,  'StartServiceA',  \
    StartServiceCtrlDispatcherA, <.lpServiceStartTable>,  'StartServiceCtrlDispatcherA',  \
    StartServiceCtrlDispatcherW, <.lpServiceStartTable>,  'StartServiceCtrlDispatcherW',  \
    StartServiceW, <.hService, .dwNumServiceArgs, .lpServiceArgVectors>,  'StartServiceW',  \
    StartTraceA, <NONE>,  'StartTraceA',  \
    StartTraceW, <NONE>,  'StartTraceW',  \
    StopTraceA, <NONE>,  'StopTraceA',  \
    StopTraceW, <NONE>,  'StopTraceW',  \
    SynchronizeWindows31FilesAndWindowsNTRegistry, <NONE>,  'SynchronizeWindows31FilesAndWindowsNTRegistry',  \
    SystemFunction001, <NONE>,  'SystemFunction001',  \
    SystemFunction002, <NONE>,  'SystemFunction002',  \
    SystemFunction003, <NONE>,  'SystemFunction003',  \
    SystemFunction004, <NONE>,  'SystemFunction004',  \
    SystemFunction005, <NONE>,  'SystemFunction005',  \
    SystemFunction006, <NONE>,  'SystemFunction006',  \
    SystemFunction007, <NONE>,  'SystemFunction007',  \
    SystemFunction008, <NONE>,  'SystemFunction008',  \
    SystemFunction009, <NONE>,  'SystemFunction009',  \
    SystemFunction010, <NONE>,  'SystemFunction010',  \
    SystemFunction011, <NONE>,  'SystemFunction011',  \
    SystemFunction012, <NONE>,  'SystemFunction012',  \
    SystemFunction013, <NONE>,  'SystemFunction013',  \
    SystemFunction014, <NONE>,  'SystemFunction014',  \
    SystemFunction015, <NONE>,  'SystemFunction015',  \
    SystemFunction016, <NONE>,  'SystemFunction016',  \
    SystemFunction017, <NONE>,  'SystemFunction017',  \
    SystemFunction018, <NONE>,  'SystemFunction018',  \
    SystemFunction019, <NONE>,  'SystemFunction019',  \
    SystemFunction020, <NONE>,  'SystemFunction020',  \
    SystemFunction021, <NONE>,  'SystemFunction021',  \
    SystemFunction022, <NONE>,  'SystemFunction022',  \
    SystemFunction023, <NONE>,  'SystemFunction023',  \
    SystemFunction024, <NONE>,  'SystemFunction024',  \
    SystemFunction025, <NONE>,  'SystemFunction025',  \
    SystemFunction026, <NONE>,  'SystemFunction026',  \
    SystemFunction027, <NONE>,  'SystemFunction027',  \
    SystemFunction028, <NONE>,  'SystemFunction028',  \
    SystemFunction029, <NONE>,  'SystemFunction029',  \
    SystemFunction030, <NONE>,  'SystemFunction030',  \
    SystemFunction031, <NONE>,  'SystemFunction031',  \
    SystemFunction032, <NONE>,  'SystemFunction032',  \
    SystemFunction033, <NONE>,  'SystemFunction033',  \
    SystemFunction034, <NONE>,  'SystemFunction034',  \
    SystemFunction035, <NONE>,  'SystemFunction035',  \
    SystemFunction036, <NONE>,  'SystemFunction036',  \
    SystemFunction040, <NONE>,  'SystemFunction040',  \
    SystemFunction041, <NONE>,  'SystemFunction041',  \
    TraceEvent, <NONE>,  'TraceEvent',  \
    TraceEventInstance, <NONE>,  'TraceEventInstance',  \
    TraceMessage, <NONE>,  'TraceMessage',  \
    TraceMessageVa, <NONE>,  'TraceMessageVa',  \
    TreeResetNamedSecurityInfoA, <.pObjectName, .ObjectType, .SecurityInfo, .pOwner, .pGroup, .pDacl, .pSacl, .KeepExplicit, .fnProgress,  \
        .ProgressInvokeSetting, .Args>,  'TreeResetNamedSecurityInfoA',  \
    TreeResetNamedSecurityInfoW, <.pObjectName, .ObjectType, .SecurityInfo, .pOwner, .pGroup, .pDacl, .pSacl, .KeepExplicit, .fnProgress,  \
        .ProgressInvokeSetting, .Args>,  'TreeResetNamedSecurityInfoW',  \
    TrusteeAccessToObjectA, <NONE>,  'TrusteeAccessToObjectA',  \
    TrusteeAccessToObjectW, <NONE>,  'TrusteeAccessToObjectW',  \
    UninstallApplication, <NONE>,  'UninstallApplication',  \
    UnlockServiceDatabase, <.ScLock>,  'UnlockServiceDatabase',  \
    UnregisterIdleTask, <NONE>,  'UnregisterIdleTask',  \
    UnregisterTraceGuids, <NONE>,  'UnregisterTraceGuids',  \
    UpdateTraceA, <NONE>,  'UpdateTraceA',  \
    UpdateTraceW, <NONE>,  'UpdateTraceW',  \
    WdmWmiServiceMain, <NONE>,  'WdmWmiServiceMain',  \
    WmiCloseBlock, <NONE>,  'WmiCloseBlock',  \
    WmiCloseTraceWithCursor, <NONE>,  'WmiCloseTraceWithCursor',  \
    WmiConvertTimestamp, <NONE>,  'WmiConvertTimestamp',  \
    WmiDevInstToInstanceNameA, <NONE>,  'WmiDevInstToInstanceNameA',  \
    WmiDevInstToInstanceNameW, <NONE>,  'WmiDevInstToInstanceNameW',  \
    WmiEnumerateGuids, <NONE>,  'WmiEnumerateGuids',  \
    WmiExecuteMethodA, <NONE>,  'WmiExecuteMethodA',  \
    WmiExecuteMethodW, <NONE>,  'WmiExecuteMethodW',  \
    WmiFileHandleToInstanceNameA, <NONE>,  'WmiFileHandleToInstanceNameA',  \
    WmiFileHandleToInstanceNameW, <NONE>,  'WmiFileHandleToInstanceNameW',  \
    WmiFreeBuffer, <NONE>,  'WmiFreeBuffer',  \
    WmiGetFirstTraceOffset, <NONE>,  'WmiGetFirstTraceOffset',  \
    WmiGetNextEvent, <NONE>,  'WmiGetNextEvent',  \
    WmiGetTraceHeader, <NONE>,  'WmiGetTraceHeader',  \
    WmiMofEnumerateResourcesA, <NONE>,  'WmiMofEnumerateResourcesA',  \
    WmiMofEnumerateResourcesW, <NONE>,  'WmiMofEnumerateResourcesW',  \
    WmiNotificationRegistrationA, <NONE>,  'WmiNotificationRegistrationA',  \
    WmiNotificationRegistrationW, <NONE>,  'WmiNotificationRegistrationW',  \
    WmiOpenBlock, <NONE>,  'WmiOpenBlock',  \
    WmiOpenTraceWithCursor, <NONE>,  'WmiOpenTraceWithCursor',  \
    WmiParseTraceEvent, <NONE>,  'WmiParseTraceEvent',  \
    WmiQueryAllDataA, <NONE>,  'WmiQueryAllDataA',  \
    WmiQueryAllDataMultipleA, <NONE>,  'WmiQueryAllDataMultipleA',  \
    WmiQueryAllDataMultipleW, <NONE>,  'WmiQueryAllDataMultipleW',  \
    WmiQueryAllDataW, <NONE>,  'WmiQueryAllDataW',  \
    WmiQueryGuidInformation, <NONE>,  'WmiQueryGuidInformation',  \
    WmiQuerySingleInstanceA, <NONE>,  'WmiQuerySingleInstanceA',  \
    WmiQuerySingleInstanceMultipleA, <NONE>,  'WmiQuerySingleInstanceMultipleA',  \
    WmiQuerySingleInstanceMultipleW, <NONE>,  'WmiQuerySingleInstanceMultipleW',  \
    WmiQuerySingleInstanceW, <NONE>,  'WmiQuerySingleInstanceW',  \
    WmiReceiveNotificationsA, <NONE>,  'WmiReceiveNotificationsA',  \
    WmiReceiveNotificationsW, <NONE>,  'WmiReceiveNotificationsW',  \
    WmiSetSingleInstanceA, <NONE>,  'WmiSetSingleInstanceA',  \
    WmiSetSingleInstanceW, <NONE>,  'WmiSetSingleInstanceW',  \
    WmiSetSingleItemA, <NONE>,  'WmiSetSingleItemA',  \
    WmiSetSingleItemW, <NONE>,  'WmiSetSingleItemW',  \
    Wow64Win32ApiEntry, <NONE>,  'Wow64Win32ApiEntry',  \
    WriteEncryptedFileRaw, <.pfImportCallback, .pvCallbackContext, .pvContext>,  'WriteEncryptedFileRaw'

Deleted freshlib/imports/Win32/allimports.asm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 library kernel32, 'KERNEL32.DLL',\
          user32,  'USER32.DLL',  \
          gdi32,   'gdi32.dll',   \
          comctl32,'comctl32.dll',\
          comdlg32,'comdlg32.dll',\
          shell32, 'shell32.dll', \
          ole32,   'ole32.dll',   \
          advapi32,'advapi32.dll',\
          sqlite3, 'sqlite3.dll',\
          wsock32, 'wsock32.dll'


  include 'api/kernel32.inc'
  include 'api/user32.inc'
  include 'api/gdi32.inc'
  include 'api/ComCtl32.inc'
  include 'api/ComDlg32.inc'
  include 'api/Shell32.inc'
  include 'api/ole32.inc'
  include 'api/advapi32.inc'
  include 'api/sqlite3.inc'
  include 'api/wsock32.inc'

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































Deleted freshlib/imports/Win32/api/advapi32.inc.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
;   advapi32.dll API calls (ASCII) 
import_proto advapi32,  \
    A_SHAFinal, N, <NONE>,  'A_SHAFinal',  \
    A_SHAInit, N, <NONE>,  'A_SHAInit',  \
    A_SHAUpdate, N, <NONE>,  'A_SHAUpdate',  \
    AbortSystemShutdown, A, <.lpMachineName>,  'AbortSystemShutdownA',  \
    AbortSystemShutdown, W, <.lpMachineName>,  'AbortSystemShutdownW',  \
    AccessCheck, N, <.pSecurityDescriptor, .ClientToken, .DesiredAccess, .GenericMapping, .PrivilegeSet, .PrivilegeSetLength, .GrantedAccess,  \
        .Status>,  'AccessCheck',  \
    AccessCheckAndAuditAlarm, A, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .SecurityDescriptor, .DesiredAccess, .GenericMapping,  \
        .ObjectCreation, .GrantedAccess, .AccessStatus, .pfGenerateOnClose>,  'AccessCheckAndAuditAlarmA',  \
    AccessCheckAndAuditAlarm, W, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .SecurityDescriptor, .DesiredAccess, .GenericMapping,  \
        .ObjectCreation, .GrantedAccess, .AccessStatus, .pfGenerateOnClose>,  'AccessCheckAndAuditAlarmW',  \
    AccessCheckByType, N, <.pSecurityDescriptor, .PrincipalSelfSid, .ClientToken, .DesiredAccess, .ObjectTypeList, .ObjectTypeListLength,  \
        .GenericMapping, .PrivilegeSet, .PrivilegeSetLength, .GrantedAccess, .AccessStatus>,  'AccessCheckByType',  \
    AccessCheckByTypeAndAuditAlarm, A, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .SecurityDescriptor, .PrincipalSelfSid,  \
        .DesiredAccess, .AuditType, .Flags, .ObjectTypeList, .ObjectTypeListLength, .GenericMapping, .ObjectCreation, .GrantedAccess,  \
        .AccessStatus, .pfGenerateOnClose>,  'AccessCheckByTypeAndAuditAlarmA',  \
    AccessCheckByTypeAndAuditAlarm, W, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .SecurityDescriptor, .PrincipalSelfSid,  \
        .DesiredAccess, .AuditType, .Flags, .ObjectTypeList, .ObjectTypeListLength, .GenericMapping, .ObjectCreation, .GrantedAccess,  \
        .AccessStatus, .pfGenerateOnClose>,  'AccessCheckByTypeAndAuditAlarmW',  \
    AccessCheckByTypeResultList, N, <.pSecurityDescriptor, .PrincipalSelfSid, .ClientToken, .DesiredAccess, .ObjectTypeList, .ObjectTypeListLength,  \
        .GenericMapping, .PrivilegeSet, .PrivilegeSetLength, .GrantedAccessList, .AccessStatusList>,  'AccessCheckByTypeResultList',  \
    AccessCheckByTypeResultListAndAuditAlarm, A, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .SecurityDescriptor, .PrincipalSelfSid,  \
        .DesiredAccess, .AuditType, .Flags, .ObjectTypeList, .ObjectTypeListLength, .GenericMapping, .ObjectCreation, .GrantedAccess,  \
        .AccessStatusList, .pfG>,  'AccessCheckByTypeResultListAndAuditAlarmA',  \
    AccessCheckByTypeResultListAndAuditAlarmByHandle, A, <.SubsystemName, .HandleId, .ClientToken, .ObjectTypeName, .ObjectName, .SecurityDescriptor,  \
        .PrincipalSelfSid, .DesiredAccess, .AuditType, .flags, .ObjectTypeList, .ObjectTypeListLength, .GenericMapping, .ObjectCreation,  \
        .GrantedAccess, .AccessibleChildren, .paccContainer, .iChildStart, .cChildren, .rgvarChildren, .pcObtained>,  'AccessCheckByTypeResultListAndAuditAlarmByHandleA',  \
    AccessCheckByTypeResultListAndAuditAlarmByHandle, W, <.SubsystemName, .HandleId, .ClientToken, .ObjectTypeName, .ObjectName, .SecurityDescriptor,  \
        .PrincipalSelfSid, .DesiredAccess, .AuditType, .flags, .ObjectTypeList, .ObjectTypeListLength, .GenericMapping, .ObjectCreation,  \
        .GrantedAccess, .AccessibleChildren, .paccContainer, .iChildStart, .cChildren, .rgvarChildren, .pcObtained>,  'AccessCheckByTypeResultListAndAuditAlarmByHandleW',  \
    AccessCheckByTypeResultListAndAuditAlarm, W, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .SecurityDescriptor, .PrincipalSelfSid,  \
        .DesiredAccess, .AuditType, .Flags, .ObjectTypeList, .ObjectTypeListLength, .GenericMapping, .ObjectCreation, .GrantedAccess,  \
        .AccessStatusList, .pfG>,  'AccessCheckByTypeResultListAndAuditAlarmW',  \
    AddAccessAllowedAce, N, <.pAcl, .dwAceRevision, .AccessMask, .pSid>,  'AddAccessAllowedAce',  \
    AddAccessAllowedAceEx, N, <.pAcl, .dwAceRevision, .AceFlags, .AccessMask, .pSid>,  'AddAccessAllowedAceEx',  \
    AddAccessAllowedObjectAce, N, <.pAcl, .dwAceRevision, .AceFlags, .AccessMask, .ObjectTypeGuid, .ByRefheritedObjectTypeGuid, .pSid,  \
      >,  'AddAccessAllowedObjectAce',  \
    AddAccessDeniedAce, N, <.pAcl, .dwAceRevision, .AccessMask, .pSid>,  'AddAccessDeniedAce',  \
    AddAccessDeniedAceEx, N, <.pAcl, .dwAceRevision, .AceFlags, .AccessMask, .pSid>,  'AddAccessDeniedAceEx',  \
    AddAccessDeniedObjectAce, N, <.pAcl, .dwAceRevision, .AceFlags, .AccessMask, .ObjectTypeGuid, .ByRefheritedObjectTypeGuid, .pSid,  \
      >,  'AddAccessDeniedObjectAce',  \
    AddAce, N, <.pAcl, .dwAceRevision, .dwStartingAceIndex, .pAceList, .nAceListLength>,  'AddAce',  \
    AddAuditAccessAce, N, <.pAcl, .dwAceRevision, .dwAccessMask, .pSid, .bAuditSuccess, .bAuditFailure>,  'AddAuditAccessAce',  \
    AddAuditAccessAceEx, N, <.pAcl, .dwAceRevision, .AceFlags, .dwAccessMask, .pSid, .bAuditSuccess, .bAuditFailure>,  'AddAuditAccessAceEx',  \
    AddAuditAccessObjectAce, N, <.pAcl, .dwAceRevision, .AceFlags, .AccessMask, .ObjectTypeGuid, .ByRefheritedObjectTypeGuid, .pSid, .bAuditSuccess,  \
        .bAuditFailure>,  'AddAuditAccessObjectAce',  \
    AddUsersToEncryptedFile, N, <.lpFileName, .pUsers>,  'AddUsersToEncryptedFile',  \
    AdjustTokenGroups, N, <.TokenHandle, .ResetToDefault, .NewState, .BufferLength, .PreviousState, .ReturnLength>,  'AdjustTokenGroups',  \
    AdjustTokenPrivileges, N, <.TokenHandle, .DisableAllPrivileges, .NewState, .BufferLength, .PreviousState, .ReturnLength>,  'AdjustTokenPrivileges',  \
    AllocateAndInitializeSid, N, <.pIdentifierAuthority, .nSubAuthorityCount, .nSubAuthority0, .nSubAuthority1, .nSubAuthority2, .nSubAuthority3,  \
        .nSubAuthority4, .nSubAuthority5, .nSubAuthority6, .nSubAuthority7, .lpPSid>,  'AllocateAndInitializeSid',  \
    AllocateLocallyUniqueId, N, <.Luid>,  'AllocateLocallyUniqueId',  \
    AreAllAccessesGranted, N, <.GrantedAccess, .DesiredAccess>,  'AreAllAccessesGranted',  \
    AreAnyAccessesGranted, N, <.GrantedAccess, .DesiredAccess>,  'AreAnyAccessesGranted',  \
    BackupEventLog, A, <.hEventLog, .lpBackupFileName>,  'BackupEventLogA',  \
    BackupEventLog, W, <.hEventLog, .lpBackupFileName>,  'BackupEventLogW',  \
    BuildExplicitAccessWithName, A, <.pExplicitAccess, .pTrusteeName, .AccessPermissions, .AccessMode, .Inheritance>,  'BuildExplicitAccessWithNameA',  \
    BuildExplicitAccessWithName, W, <.pExplicitAccess, .pTrusteeName, .AccessPermissions, .AccessMode, .Inheritance>,  'BuildExplicitAccessWithNameW',  \
    BuildImpersonateExplicitAccessWithName, A, <.pExplicitAccess, .pTrusteeName, .pTrustee, .AccessPermissions, .AccessMode, .Inheritance,  \
      >,  'BuildImpersonateExplicitAccessWithNameA',  \
    BuildImpersonateExplicitAccessWithName, W, <.pExplicitAccess, .pTrusteeName, .pTrustee, .AccessPermissions, .AccessMode, .Inheritance,  \
      >,  'BuildImpersonateExplicitAccessWithNameW',  \
    BuildImpersonateTrustee, A, <.pTrustee, .pImpersonateTrustee>,  'BuildImpersonateTrusteeA',  \
    BuildImpersonateTrustee, W, <.pTrustee, .pImpersonateTrustee>,  'BuildImpersonateTrusteeW',  \
    BuildSecurityDescriptor, A, <.pOwner, .pGroup, .cCountOfAccessEntries, .pListOfAccessEntries, .cCountOfAuditEntries, .pListOfAuditEntries,  \
        .pOldSD, .pSizeNewSD, .pNewSD>,  'BuildSecurityDescriptorA',  \
    BuildSecurityDescriptor, W, <.pOwner, .pGroup, .cCountOfAccessEntries, .pListOfAccessEntries, .cCountOfAuditEntries, .pListOfAuditEntries,  \
        .pOldSD, .pSizeNewSD, .pNewSD>,  'BuildSecurityDescriptorW',  \
    BuildTrusteeWithName, A, <.pTrustee, .pname>,  'BuildTrusteeWithNameA',  \
    BuildTrusteeWithName, W, <.pTrustee, .pname>,  'BuildTrusteeWithNameW',  \
    BuildTrusteeWithObjectsAndName, A, <.pTrustee, .pObjName, .ObjectType, .ObjectTypeName, .InheritedObjectTypeName, .name>,  'BuildTrusteeWithObjectsAndNameA',  \
    BuildTrusteeWithObjectsAndName, W, <.pTrustee, .pObjName, .ObjectType, .ObjectTypeName, .InheritedObjectTypeName, .name>,  'BuildTrusteeWithObjectsAndNameW',  \
    BuildTrusteeWithObjectsAndSid, A, <.pTrustee, .pObjSid, .pObjectGuid, .pInheritedObjectGuid, .pSid>,  'BuildTrusteeWithObjectsAndSidA',  \
    BuildTrusteeWithObjectsAndSid, W, <.pTrustee, .pObjSid, .pObjectGuid, .pInheritedObjectGuid, .pSid>,  'BuildTrusteeWithObjectsAndSidW',  \
    BuildTrusteeWithSid, A, <.pTrustee, .pSid>,  'BuildTrusteeWithSidA',  \
    BuildTrusteeWithSid, W, <.pTrustee, .pSid>,  'BuildTrusteeWithSidW',  \
    CancelOverlappedAccess, N, <NONE>,  'CancelOverlappedAccess',  \
    ChangeServiceConfig2, A, <.hService, .dwInfoLevel, .lpInfo>,  'ChangeServiceConfig2A',  \
    ChangeServiceConfig2, W, <.hService, .dwInfoLevel, .lpInfo>,  'ChangeServiceConfig2W',  \
    ChangeServiceConfig, A, <.hService, .dwServiceType, .dwStartType, .dwErrorControl, .lpBinaryPathName, .lpLoadOrderGroup, .lpdwTagId,  \
        .lpDependencies, .lpServiceStartName, .lpPassword, .lpDisplayName>,  'ChangeServiceConfigA',  \
    ChangeServiceConfig, W, <.hService, .dwServiceType, .dwStartType, .dwErrorControl, .lpBinaryPathName, .lpLoadOrderGroup, .lpdwTagId,  \
        .lpDependencies, .lpServiceStartName, .lpPassword, .lpDisplayName>,  'ChangeServiceConfigW',  \
    CheckTokenMembership, N, <.TokenHandle, .SidToCheck, .IsMember>,  'CheckTokenMembership',  \
    ClearEventLog, A, <.hEventLog, .lpBackupFileName>,  'ClearEventLogA',  \
    ClearEventLog, W, <.hEventLog, .lpBackupFileName>,  'ClearEventLogW',  \
    CloseCodeAuthzLevel, N, <NONE>,  'CloseCodeAuthzLevel',  \
    CloseEncryptedFileRaw, N, <.pvContext>,  'CloseEncryptedFileRaw',  \
    CloseEventLog, N, <.hEventLog>,  'CloseEventLog',  \
    CloseServiceHandle, N, <.hSCObject>,  'CloseServiceHandle',  \
    CloseTrace, N, <NONE>,  'CloseTrace',  \
    CommandLineFromMsiDescriptor, N, <NONE>,  'CommandLineFromMsiDescriptor',  \
    ComputeAccessTokenFromCodeAuthzLevel, N, <NONE>,  'ComputeAccessTokenFromCodeAuthzLevel',  \
    ControlService, N, <.hService, .dwControl, .lpServiceStatus>,  'ControlService',  \
    ControlTrace, A, <NONE>,  'ControlTraceA',  \
    ControlTrace, W, <NONE>,  'ControlTraceW',  \
    ConvertAccessToSecurityDescriptor, A, <NONE>,  'ConvertAccessToSecurityDescriptorA',  \
    ConvertAccessToSecurityDescriptor, W, <NONE>,  'ConvertAccessToSecurityDescriptorW',  \
    ConvertSDToStringSDRootDomain, A, <NONE>,  'ConvertSDToStringSDRootDomainA',  \
    ConvertSDToStringSDRootDomain, W, <NONE>,  'ConvertSDToStringSDRootDomainW',  \
    ConvertSecurityDescriptorToAccess, A, <NONE>,  'ConvertSecurityDescriptorToAccessA',  \
    ConvertSecurityDescriptorToAccessNamed, A, <NONE>,  'ConvertSecurityDescriptorToAccessNamedA',  \
    ConvertSecurityDescriptorToAccessNamed, W, <NONE>,  'ConvertSecurityDescriptorToAccessNamedW',  \
    ConvertSecurityDescriptorToAccess, W, <NONE>,  'ConvertSecurityDescriptorToAccessW',  \
    ConvertSecurityDescriptorToStringSecurityDescriptor, A, <.SecurityDescriptor, .RequestedStringSDRevision, .SecurityInformation, .StringSecurityDescriptor,  \
        .StringSecurityDescriptorLen>,  'ConvertSecurityDescriptorToStringSecurityDescriptorA',  \
    ConvertSecurityDescriptorToStringSecurityDescriptor, W, <.SecurityDescriptor, .RequestedStringSDRevision, .SecurityInformation, .StringSecurityDescriptor,  \
        .StringSecurityDescriptorLen>,  'ConvertSecurityDescriptorToStringSecurityDescriptorW',  \
    ConvertSidToStringSid, A, <.Sid, .StringSid>,  'ConvertSidToStringSidA',  \
    ConvertSidToStringSid, W, <.Sid, .StringSid>,  'ConvertSidToStringSidW',  \
    ConvertStringSDToSDDomain, A, <NONE>,  'ConvertStringSDToSDDomainA',  \
    ConvertStringSDToSDDomain, W, <NONE>,  'ConvertStringSDToSDDomainW',  \
    ConvertStringSDToSDRootDomain, A, <NONE>,  'ConvertStringSDToSDRootDomainA',  \
    ConvertStringSDToSDRootDomain, W, <NONE>,  'ConvertStringSDToSDRootDomainW',  \
    ConvertStringSecurityDescriptorToSecurityDescriptor, A, <.StringSecurityDescriptor, .StringSDRevision, .SecurityDescriptor, .SecurityDescriptorSize,  \
      >,  'ConvertStringSecurityDescriptorToSecurityDescriptorA',  \
    ConvertStringSecurityDescriptorToSecurityDescriptor, W, <.StringSecurityDescriptor, .StringSDRevision, .SecurityDescriptor, .SecurityDescriptorSize,  \
      >,  'ConvertStringSecurityDescriptorToSecurityDescriptorW',  \
    ConvertStringSidToSid, A, <.StringSid, .Sid>,  'ConvertStringSidToSidA',  \
    ConvertStringSidToSid, W, <.StringSid, .Sid>,  'ConvertStringSidToSidW',  \
    ConvertToAutoInheritPrivateObjectSecurity, N, <.ParentDescriptor, .CurrentSecurityDescriptor, .NewSecurityDescriptor, .ObjectType,  \
        .IsDirectoryObject, .GenericMapping>,  'ConvertToAutoInheritPrivateObjectSecurity',  \
    CopySid, N, <.nDestinationSidLength, .pDestinationSid, .pSourceSid>,  'CopySid',  \
    CreateCodeAuthzLevel, N, <NONE>,  'CreateCodeAuthzLevel',  \
    CreatePrivateObjectSecurity, N, <.ParentDescriptor, .CreatorDescriptor, .NewDescriptor, .IsDirectoryObject, .Token, .GenericMapping,  \
      >,  'CreatePrivateObjectSecurity',  \
    CreatePrivateObjectSecurityEx, N, <.ParentDescriptor, .CreatorDescriptor, .NewDescriptor, .ObjectType, .IsContainerObject, .AutoInheritFlags,  \
        .Token, .GenericMapping>,  'CreatePrivateObjectSecurityEx',  \
    CreatePrivateObjectSecurityWithMultipleInheritance, N, <NONE>,  'CreatePrivateObjectSecurityWithMultipleInheritance',  \
    CreateProcessAsUser, A, <.hToken, .lpApplicationName, .lpCommandLine, .lpProcessAttributes, .lpThreadAttributes, .bInheritHandles,  \
        .dwCreationFlags, .lpEnvironment, .lpCurrentDirectory, .lpStartupInfo, .lpProcessInformation>,  'CreateProcessAsUserA',  \
    CreateProcessAsUserSecure, N, <NONE>,  'CreateProcessAsUserSecure',  \
    CreateProcessAsUser, W, <.hToken, .lpApplicationName, .lpCommandLine, .lpProcessAttributes, .lpThreadAttributes, .bInheritHandles,  \
        .dwCreationFlags, .lpEnvironment, .lpCurrentDirectory, .lpStartupInfo, .lpProcessInformation>,  'CreateProcessAsUserW',  \
    CreateProcessWithLogon, W, <NONE>,  'CreateProcessWithLogonW',  \
    CreateRestrictedToken, N, <.ExistingTokenHandle, .Flags, .DisableSidCount, .SidsToDisable, .DeletePrivilegeCount, .PrivilegesToDelete,  \
        .RestrictedSidCount, .SidsToRestrict, .NewTokenHandle>,  'CreateRestrictedToken',  \
    CreateService, A, <.hSCManager, .lpServiceName, .lpDisplayName, .dwDesiredAccess, .dwServiceType, .dwStartType, .dwErrorControl, .lpBinaryPathName,  \
        .lpLoadOrderGroup, .lpdwTagId, .lpDependencies, .lp, .lpPassword>,  'CreateServiceA',  \
    CreateService, W, <.hSCManager, .lpServiceName, .lpDisplayName, .dwDesiredAccess, .dwServiceType, .dwStartType, .dwErrorControl, .lpBinaryPathName,  \
        .lpLoadOrderGroup, .lpdwTagId, .lpDependencies, .lp, .lpPassword>,  'CreateServiceW',  \
    CreateTraceInstanceId, N, <NONE>,  'CreateTraceInstanceId',  \
    CreateWellKnownSid, N, <NONE>,  'CreateWellKnownSid',  \
    CredDelete, A, <NONE>,  'CredDeleteA',  \
    CredDelete, W, <NONE>,  'CredDeleteW',  \
    CredEnumerate, A, <NONE>,  'CredEnumerateA',  \
    CredEnumerate, W, <NONE>,  'CredEnumerateW',  \
    CredFree, N, <NONE>,  'CredFree',  \
    CredGetSessionTypes, N, <NONE>,  'CredGetSessionTypes',  \
    CredGetTargetInfo, A, <NONE>,  'CredGetTargetInfoA',  \
    CredGetTargetInfo, W, <NONE>,  'CredGetTargetInfoW',  \
    CredIsMarshaledCredential, A, <NONE>,  'CredIsMarshaledCredentialA',  \
    CredIsMarshaledCredential, W, <NONE>,  'CredIsMarshaledCredentialW',  \
    CredMarshalCredential, A, <NONE>,  'CredMarshalCredentialA',  \
    CredMarshalCredential, W, <NONE>,  'CredMarshalCredentialW',  \
    CredProfileLoaded, N, <NONE>,  'CredProfileLoaded',  \
    CredRead, A, <NONE>,  'CredReadA',  \
    CredReadDomainCredentials, A, <NONE>,  'CredReadDomainCredentialsA',  \
    CredReadDomainCredentials, W, <NONE>,  'CredReadDomainCredentialsW',  \
    CredRead, W, <NONE>,  'CredReadW',  \
    CredRename, A, <NONE>,  'CredRenameA',  \
    CredRename, W, <NONE>,  'CredRenameW',  \
    CredUnmarshalCredential, A, <NONE>,  'CredUnmarshalCredentialA',  \
    CredUnmarshalCredential, W, <NONE>,  'CredUnmarshalCredentialW',  \
    CredWrite, A, <NONE>,  'CredWriteA',  \
    CredWriteDomainCredentials, A, <NONE>,  'CredWriteDomainCredentialsA',  \
    CredWriteDomainCredentials, W, <NONE>,  'CredWriteDomainCredentialsW',  \
    CredWrite, W, <NONE>,  'CredWriteW',  \
    CredpConvertCredential, N, <NONE>,  'CredpConvertCredential',  \
    CredpConvertTargetInfo, N, <NONE>,  'CredpConvertTargetInfo',  \
    CredpDecodeCredential, N, <NONE>,  'CredpDecodeCredential',  \
    CredpEncodeCredential, N, <NONE>,  'CredpEncodeCredential',  \
    CryptAcquireContext, A, <.phProv, .pszContainer, .pszProvider, .dwProvType, .dwFlags>,  'CryptAcquireContextA',  \
    CryptAcquireContext, W, <.phProv, .pszContainer, .pszProvider, .dwProvType, .dwFlags>,  'CryptAcquireContextW',  \
    CryptContextAddRef, N, <.hProv, .pdwReserved, .dwFlags>,  'CryptContextAddRef',  \
    CryptCreateHash, N, <.hProv, .Algid, .hKey, .dwFlags, .phHash>,  'CryptCreateHash',  \
    CryptDecrypt, N, <.hKey, .hHash, .Final, .dwFlags, .pbData, .pdwDataLen>,  'CryptDecrypt',  \
    CryptDeriveKey, N, <.hProv, .Algid, .hBaseData, .dwFlags, .phKey>,  'CryptDeriveKey',  \
    CryptDestroyHash, N, <.hHash>,  'CryptDestroyHash',  \
    CryptDestroyKey, N, <.hKey>,  'CryptDestroyKey',  \
    CryptDuplicateHash, N, <.hHash, .pdwReserved, .dwFlags, .phHash>,  'CryptDuplicateHash',  \
    CryptDuplicateKey, N, <.hKey, .pdwReserved, .dwFlags, .phKey>,  'CryptDuplicateKey',  \
    CryptEncrypt, N, <.hKey, .hHash, .Final, .dwFlags, .pbData, .pdwDataLen, .dwBufLen>,  'CryptEncrypt',  \
    CryptEnumProviderTypes, A, <.dwIndex, .pdwReserved, .dwFlags, .pdwProvType, .pszTypeName, .pcbTypeName>,  'CryptEnumProviderTypesA',  \
    CryptEnumProviderTypes, W, <.dwIndex, .pdwReserved, .dwFlags, .pdwProvType, .pszTypeName, .pcbTypeName>,  'CryptEnumProviderTypesW',  \
    CryptEnumProviders, A, <.dwIndex, .pdwReserved, .dwFlags, .pdwProvType, .pszProvName, .pcbProvName>,  'CryptEnumProvidersA',  \
    CryptEnumProviders, W, <.dwIndex, .pdwReserved, .dwFlags, .pdwProvType, .pszProvName, .pcbProvName>,  'CryptEnumProvidersW',  \
    CryptExportKey, N, <.hKey, .hExpKey, .dwBlobType, .dwFlags, .pbData, .pdwDataLen>,  'CryptExportKey',  \
    CryptGenKey, N, <.hProv, .Algid, .dwFlags, .phKey>,  'CryptGenKey',  \
    CryptGenRandom, N, <.hProv, .dwLen, .pbBuffer>,  'CryptGenRandom',  \
    CryptGetDefaultProvider, A, <.dwProvType, .pdwReserved, .dwFlags, .pszProvName, .pcbProvName>,  'CryptGetDefaultProviderA',  \
    CryptGetDefaultProvider, W, <.dwProvType, .pdwReserved, .dwFlags, .pszProvName, .pcbProvName>,  'CryptGetDefaultProviderW',  \
    CryptGetHashParam, N, <.hHash, .dwParam, .pbData, .pdwDataLen, .dwFlags>,  'CryptGetHashParam',  \
    CryptGetKeyParam, N, <.hKey, .dwParam, .pbData, .pdwDataLen, .dwFlags>,  'CryptGetKeyParam',  \
    CryptGetProvParam, N, <.hProv, .dwParam, .pbData, .pdwDataLen, .dwFlags>,  'CryptGetProvParam',  \
    CryptGetUserKey, N, <.hProv, .dwKeySpec, .phUserKey>,  'CryptGetUserKey',  \
    CryptHashData, N, <.hHash, .pbData, .dwDataLen, .dwFlags>,  'CryptHashData',  \
    CryptHashSessionKey, N, <.hHash, .hKey, .dwFlags>,  'CryptHashSessionKey',  \
    CryptImportKey, N, <.hProv, .pbData, .dwDataLen, .hPubKey, .dwFlags, .phKey>,  'CryptImportKey',  \
    CryptReleaseContext, N, <.hProv, .dwFlags>,  'CryptReleaseContext',  \
    CryptSetHashParam, N, <.hHash, .dwParam, .pbData, .dwFlags>,  'CryptSetHashParam',  \
    CryptSetKeyParam, N, <.hKey, .dwParam, .pbData, .dwFlags>,  'CryptSetKeyParam',  \
    CryptSetProvParam, N, <.hProv, .dwParam, .pbData, .dwFlags>,  'CryptSetProvParam',  \
    CryptSetProvider, A, <.pszProvName, .dwProvType>,  'CryptSetProviderA',  \
    CryptSetProviderEx, A, <.pszProvName, .dwProvType, .pdwReserved, .dwFlags>,  'CryptSetProviderExA',  \
    CryptSetProviderEx, W, <.pszProvName, .dwProvType, .pdwReserved, .dwFlags>,  'CryptSetProviderExW',  \
    CryptSetProvider, W, <.pszProvName, .dwProvType>,  'CryptSetProviderW',  \
    CryptSignHash, A, <.hHash, .dwKeySpec, .sDescription, .dwFlags, .pbSignature, .pdwSigLen>,  'CryptSignHashA',  \
    CryptSignHash, W, <.hHash, .dwKeySpec, .sDescription, .dwFlags, .pbSignature, .pdwSigLen>,  'CryptSignHashW',  \
    CryptVerifySignature, A, <.hHash, .pbSignature, .dwSigLen, .hPubKey, .sDescription, .dwFlags>,  'CryptVerifySignatureA',  \
    CryptVerifySignature, W, <.hHash, .pbSignature, .dwSigLen, .hPubKey, .sDescription, .dwFlags>,  'CryptVerifySignatureW',  \
    DecryptFile, A, <.lpFileName, .dwReserved>,  'DecryptFileA',  \
    DecryptFile, W, <.lpFileName, .dwReserved>,  'DecryptFileW',  \
    DeleteAce, N, <.pAcl, .dwAceIndex>,  'DeleteAce',  \
    DeleteService, N, <.hService>,  'DeleteService',  \
    DeregisterEventSource, N, <.hEventLog>,  'DeregisterEventSource',  \
    DestroyPrivateObjectSecurity, N, <.ObjectDescriptor>,  'DestroyPrivateObjectSecurity',  \
    DuplicateEncryptionInfoFile, N, <NONE>,  'DuplicateEncryptionInfoFile',  \
    DuplicateToken, N, <.ExistingTokenHandle, .ImpersonationLevel, .DuplicateTokenHandle>,  'DuplicateToken',  \
    DuplicateTokenEx, N, <.hExistingToken, .dwDesiredAccess, .lpTokenAttributes, .ImpersonationLevel, .TokenType, .phNewToken>,  'DuplicateTokenEx',  \
    ElfBackupEventLogFile, A, <NONE>,  'ElfBackupEventLogFileA',  \
    ElfBackupEventLogFile, W, <NONE>,  'ElfBackupEventLogFileW',  \
    ElfChangeNotify, N, <NONE>,  'ElfChangeNotify',  \
    ElfClearEventLogFile, A, <NONE>,  'ElfClearEventLogFileA',  \
    ElfClearEventLogFile, W, <NONE>,  'ElfClearEventLogFileW',  \
    ElfCloseEventLog, N, <NONE>,  'ElfCloseEventLog',  \
    ElfDeregisterEventSource, N, <NONE>,  'ElfDeregisterEventSource',  \
    ElfFlushEventLog, N, <NONE>,  'ElfFlushEventLog',  \
    ElfNumberOfRecords, N, <NONE>,  'ElfNumberOfRecords',  \
    ElfOldestRecord, N, <NONE>,  'ElfOldestRecord',  \
    ElfOpenBackupEventLog, A, <NONE>,  'ElfOpenBackupEventLogA',  \
    ElfOpenBackupEventLog, W, <NONE>,  'ElfOpenBackupEventLogW',  \
    ElfOpenEventLog, A, <NONE>,  'ElfOpenEventLogA',  \
    ElfOpenEventLog, W, <NONE>,  'ElfOpenEventLogW',  \
    ElfReadEventLog, A, <NONE>,  'ElfReadEventLogA',  \
    ElfReadEventLog, W, <NONE>,  'ElfReadEventLogW',  \
    ElfRegisterEventSource, A, <NONE>,  'ElfRegisterEventSourceA',  \
    ElfRegisterEventSource, W, <NONE>,  'ElfRegisterEventSourceW',  \
    ElfReportEvent, A, <NONE>,  'ElfReportEventA',  \
    ElfReportEvent, W, <NONE>,  'ElfReportEventW',  \
    EnableTrace, N, <NONE>,  'EnableTrace',  \
    EncryptFile, A, <.lpFileName>,  'EncryptFileA',  \
    EncryptFile, W, <.lpFileName>,  'EncryptFileW',  \
    EncryptedFileKeyInfo, N, <NONE>,  'EncryptedFileKeyInfo',  \
    EncryptionDisable, N, <.DirPath, .Disable>,  'EncryptionDisable',  \
    EnumDependentServices, A, <.hService, .dwServiceState, .lpServices, .cbBufSize, .pcbBytesNeeded, .lpServicesReturned>,  'EnumDependentServicesA',  \
    EnumDependentServices, W, <.hService, .dwServiceState, .lpServices, .cbBufSize, .pcbBytesNeeded, .lpServicesReturned>,  'EnumDependentServicesW',  \
    EnumServiceGroup, W, <NONE>,  'EnumServiceGroupW',  \
    EnumServicesStatus, A, <.hSCManager, .dwServiceType, .dwServiceState, .lpServices, .cbBufSize, .pcbBytesNeeded, .lpServicesReturned,  \
        .lpResumeHandle>,  'EnumServicesStatusA',  \
    EnumServicesStatusEx, A, <.hSCManager, .InfoLevel, .dwServiceType, .dwServiceState, .lpServices, .cbBufSize, .pcbBytesNeeded, .lpServicesReturned,  \
        .lpResumeHandle, .pszGroupName>,  'EnumServicesStatusExA',  \
    EnumServicesStatusEx, W, <.hSCManager, .InfoLevel, .dwServiceType, .dwServiceState, .lpServices, .cbBufSize, .pcbBytesNeeded, .lpServicesReturned,  \
        .lpResumeHandle, .pszGroupName>,  'EnumServicesStatusExW',  \
    EnumServicesStatus, W, <.hSCManager, .dwServiceType, .dwServiceState, .lpServices, .cbBufSize, .pcbBytesNeeded, .lpServicesReturned,  \
        .lpResumeHandle>,  'EnumServicesStatusW',  \
    EnumerateTraceGuids, N, <NONE>,  'EnumerateTraceGuids',  \
    EqualDomainSid, N, <NONE>,  'EqualDomainSid',  \
    EqualPrefixSid, N, <.pSid1, .pSid2>,  'EqualPrefixSid',  \
    EqualSid, N, <.pSid1, .pSid2>,  'EqualSid',  \
    FileEncryptionStatus, A, <.lpFileName, .lpStatus>,  'FileEncryptionStatusA',  \
    FileEncryptionStatus, W, <.lpFileName, .lpStatus>,  'FileEncryptionStatusW',  \
    FindFirstFreeAce, N, <.pAcl, .pAce>,  'FindFirstFreeAce',  \
    FlushTrace, A, <NONE>,  'FlushTraceA',  \
    FlushTrace, W, <NONE>,  'FlushTraceW',  \
    FreeEncryptedFileKeyInfo, N, <NONE>,  'FreeEncryptedFileKeyInfo',  \
    FreeEncryptionCertificateHashList, N, <.pHashes>,  'FreeEncryptionCertificateHashList',  \
    FreeInheritedFromArray, N, <.pInheritArray, .AceCnt, .pfnArray>,  'FreeInheritedFromArray',  \
    FreeSid, N, <.pSid>,  'FreeSid',  \
    GetAccessPermissionsForObject, A, <NONE>,  'GetAccessPermissionsForObjectA',  \
    GetAccessPermissionsForObject, W, <NONE>,  'GetAccessPermissionsForObjectW',  \
    GetAce, N, <.pAcl, .dwAceIndex, .pAce>,  'GetAce',  \
    GetAclInformation, N, <.pAcl, .pAclInformation, .nAclInformationLength, .dwAclInformationClass>,  'GetAclInformation',  \
    GetAuditedPermissionsFromAcl, A, <.pAcl, .pTrustee, .pSuccessfulAuditedRights, .pFailedAuditRights>,  'GetAuditedPermissionsFromAclA',  \
    GetAuditedPermissionsFromAcl, W, <.pAcl, .pTrustee, .pSuccessfulAuditedRights, .pFailedAuditRights>,  'GetAuditedPermissionsFromAclW',  \
    GetCurrentHwProfile, A, <.lpHwProfileInfo>,  'GetCurrentHwProfileA',  \
    GetCurrentHwProfile, W, <.lpHwProfileInfo>,  'GetCurrentHwProfileW',  \
    GetEffectiveRightsFromAcl, A, <.pAcl, .pTrustee, .pAccessRights>,  'GetEffectiveRightsFromAclA',  \
    GetEffectiveRightsFromAcl, W, <.pAcl, .pTrustee, .pAccessRights>,  'GetEffectiveRightsFromAclW',  \
    GetEventLogInformation, N, <.hEventLog, .dwInfoLevel, .lpBuffer, .cbBufSize, .pcbBytesNeeded>,  'GetEventLogInformation',  \
    GetExplicitEntriesFromAcl, A, <.pAcl, .pcCountOfExplicitEntries, .pListOfExplicitEntries>,  'GetExplicitEntriesFromAclA',  \
    GetExplicitEntriesFromAcl, W, <.pAcl, .pcCountOfExplicitEntries, .pListOfExplicitEntries>,  'GetExplicitEntriesFromAclW',  \
    GetFileSecurity, A, <.lpFileName, .RequestedInformation, .pSecurityDescriptor, .nLength, .lpnLengthNeeded>,  'GetFileSecurityA',  \
    GetFileSecurity, W, <.lpFileName, .RequestedInformation, .pSecurityDescriptor, .nLength, .lpnLengthNeeded>,  'GetFileSecurityW',  \
    GetInformationCodeAuthzLevel, W, <NONE>,  'GetInformationCodeAuthzLevelW',  \
    GetInformationCodeAuthzPolicy, W, <NONE>,  'GetInformationCodeAuthzPolicyW',  \
    GetInheritanceSource, A, <.pObjectName, .ObjectType, .SecurityInfo, .Container, .ObjectTypeGuid, .pAcl, .pfnArray, .pGenericMapping,  \
        .pInheritArray>,  'GetInheritanceSourceA',  \
    GetInheritanceSource, W, <.pObjectName, .ObjectType, .SecurityInfo, .Container, .ObjectTypeGuid, .pAcl, .pfnArray, .pGenericMapping,  \
        .pInheritArray>,  'GetInheritanceSourceW',  \
    GetKernelObjectSecurity, N, <.Handle, .RequestedInformation, .pSecurityDescriptor, .nLength, .lpnLengthNeeded>,  'GetKernelObjectSecurity',  \
    GetLengthSid, N, <.pSid>,  'GetLengthSid',  \
    GetLocalManagedApplicationData, N, <NONE>,  'GetLocalManagedApplicationData',  \
    GetLocalManagedApplications, N, <NONE>,  'GetLocalManagedApplications',  \
    GetManagedApplicationCategories, N, <NONE>,  'GetManagedApplicationCategories',  \
    GetManagedApplications, N, <NONE>,  'GetManagedApplications',  \
    GetMultipleTrustee, A, <.pTrustee>,  'GetMultipleTrusteeA',  \
    GetMultipleTrusteeOperation, A, <.pTrustee>,  'GetMultipleTrusteeOperationA',  \
    GetMultipleTrusteeOperation, W, <.pTrustee>,  'GetMultipleTrusteeOperationW',  \
    GetMultipleTrustee, W, <.pTrustee>,  'GetMultipleTrusteeW',  \
    GetNamedSecurityInfo, A, <.pObjectName, .ObjectType, .SecurityInfo, .ppsidOwner, .ppsidGroup, .ppDacl, .ppSacl, .ppSecurityDescriptor,  \
      >,  'GetNamedSecurityInfoA',  \
    GetNamedSecurityInfoEx, A, <NONE>,  'GetNamedSecurityInfoExA',  \
    GetNamedSecurityInfoEx, W, <NONE>,  'GetNamedSecurityInfoExW',  \
    GetNamedSecurityInfo, W, <.pObjectName, .ObjectType, .SecurityInfo, .ppsidOwner, .ppsidGroup, .ppDacl, .ppSacl, .ppSecurityDescriptor,  \
      >,  'GetNamedSecurityInfoW',  \
    GetNumberOfEventLogRecords, N, <.hEventLog, .NumberOfRecords>,  'GetNumberOfEventLogRecords',  \
    GetOldestEventLogRecord, N, <.hEventLog, .OldestRecord>,  'GetOldestEventLogRecord',  \
    GetOverlappedAccessResults, N, <NONE>,  'GetOverlappedAccessResults',  \
    GetPrivateObjectSecurity, N, <.ObjectDescriptor, .SecurityInformation, .ResultantDescriptor, .DescriptorLength, .ReturnLength>,  'GetPrivateObjectSecurity',  \
    GetSecurityDescriptorControl, N, <.pSecurityDescriptor, .pControl, .lpdwRevision>,  'GetSecurityDescriptorControl',  \
    GetSecurityDescriptorDacl, N, <.pSecurityDescriptor, .lpbDaclPresent, .pDacl, .lpbDaclDefaulted>,  'GetSecurityDescriptorDacl',  \
    GetSecurityDescriptorGroup, N, <.pSecurityDescriptor, .pGroup, .lpbGroupDefaulted>,  'GetSecurityDescriptorGroup',  \
    GetSecurityDescriptorLength, N, <.pSecurityDescriptor>,  'GetSecurityDescriptorLength',  \
    GetSecurityDescriptorOwner, N, <.pSecurityDescriptor, .pOwner, .lpbOwnerDefaulted>,  'GetSecurityDescriptorOwner',  \
    GetSecurityDescriptorRMControl, N, <.SecurityDescriptor, .RMControl>,  'GetSecurityDescriptorRMControl',  \
    GetSecurityDescriptorSacl, N, <.pSecurityDescriptor, .lpbSaclPresent, .pSacl, .lpbSaclDefaulted>,  'GetSecurityDescriptorSacl',  \
    GetSecurityInfo, N, <.Handle, .ObjectType, .SecurityInfo, .ppsidOwner, .ppsidGroup, .ppDacl, .ppSacl, .ppSecurityDescriptor>,  'GetSecurityInfo',  \
    GetSecurityInfoEx, A, <NONE>,  'GetSecurityInfoExA',  \
    GetSecurityInfoEx, W, <NONE>,  'GetSecurityInfoExW',  \
    GetServiceDisplayName, A, <.hSCManager, .lpServiceName, .lpDisplayName, .lpcchBuffer>,  'GetServiceDisplayNameA',  \
    GetServiceDisplayName, W, <.hSCManager, .lpServiceName, .lpDisplayName, .lpcchBuffer>,  'GetServiceDisplayNameW',  \
    GetServiceKeyName, A, <.hSCManager, .lpDisplayName, .lpServiceName, .lpcchBuffer>,  'GetServiceKeyNameA',  \
    GetServiceKeyName, W, <.hSCManager, .lpDisplayName, .lpServiceName, .lpcchBuffer>,  'GetServiceKeyNameW',  \
    GetSidIdentifierAuthority, N, <.pSid>,  'GetSidIdentifierAuthority',  \
    GetSidLengthRequired, N, <.nSubAuthorityCount>,  'GetSidLengthRequired',  \
    GetSidSubAuthority, N, <.pSid, .nSubAuthority>,  'GetSidSubAuthority',  \
    GetSidSubAuthorityCount, N, <.pSid>,  'GetSidSubAuthorityCount',  \
    GetTokenInformation, N, <.TokenHandle, .TokenInformationClass, .TokenInformation, .TokenInformationLength, .ReturnLength>,  'GetTokenInformation',  \
    GetTraceEnableFlags, N, <NONE>,  'GetTraceEnableFlags',  \
    GetTraceEnableLevel, N, <NONE>,  'GetTraceEnableLevel',  \
    GetTraceLoggerHandle, N, <NONE>,  'GetTraceLoggerHandle',  \
    GetTrusteeForm, A, <.pTrustee>,  'GetTrusteeFormA',  \
    GetTrusteeForm, W, <.pTrustee>,  'GetTrusteeFormW',  \
    GetTrusteeName, A, <.pTrustee>,  'GetTrusteeNameA',  \
    GetTrusteeName, W, <.pTrustee>,  'GetTrusteeNameW',  \
    GetTrusteeType, A, <.pTrustee>,  'GetTrusteeTypeA',  \
    GetTrusteeType, W, <.pTrustee>,  'GetTrusteeTypeW',  \
    GetUserName, A, <.lpBuffer, .nSize>,  'GetUserNameA',  \
    GetUserName, W, <.lpBuffer, .nSize>,  'GetUserNameW',  \
    GetWindowsAccountDomainSid, N, <NONE>,  'GetWindowsAccountDomainSid',  \
    I_ScGetCurrentGroupState, W, <NONE>,  'I_ScGetCurrentGroupStateW',  \
    I_ScIsSecurityProcess, N, <NONE>,  'I_ScIsSecurityProcess',  \
    I_ScPnPGetServiceName, N, <NONE>,  'I_ScPnPGetServiceName',  \
    I_ScSendTSMessage, N, <NONE>,  'I_ScSendTSMessage',  \
    I_ScSetServiceBits, A, <NONE>,  'I_ScSetServiceBitsA',  \
    I_ScSetServiceBits, W, <NONE>,  'I_ScSetServiceBitsW',  \
    IdentifyCodeAuthzLevel, W, <NONE>,  'IdentifyCodeAuthzLevelW',  \
    ImpersonateAnonymousToken, N, <.ThreadHandle>,  'ImpersonateAnonymousToken',  \
    ImpersonateLoggedOnUser, N, <.hToken>,  'ImpersonateLoggedOnUser',  \
    ImpersonateNamedPipeClient, N, <.hNamedPipe>,  'ImpersonateNamedPipeClient',  \
    ImpersonateSelf, N, <.ImpersonationLevel>,  'ImpersonateSelf',  \
    InitializeAcl, N, <.pAcl, .nAclLength, .dwAclRevision>,  'InitializeAcl',  \
    InitializeSecurityDescriptor, N, <.pSecurityDescriptor, .dwRevision>,  'InitializeSecurityDescriptor',  \
    InitializeSid, N, <.Sid, .pIdentifierAuthority, .nSubAuthorityCount>,  'InitializeSid',  \
    InitiateSystemShutdown, A, <.lpMachineName, .lpMessage, .dwTimeout, .bForceAppsClosed, .bRebootAfterShutdown>,  'InitiateSystemShutdownA',  \
    InitiateSystemShutdownEx, A, <.lpMachineName, .lpMessage, .dwTimeout, .bForceAppsClosed, .bRebootAfterShutdown, .dwReason>,  'InitiateSystemShutdownExA',  \
    InitiateSystemShutdownEx, W, <.lpMachineName, .lpMessage, .dwTimeout, .bForceAppsClosed, .bRebootAfterShutdown, .dwReason>,  'InitiateSystemShutdownExW',  \
    InitiateSystemShutdown, W, <.lpMachineName, .lpMessage, .dwTimeout, .bForceAppsClosed, .bRebootAfterShutdown>,  'InitiateSystemShutdownW',  \
    InstallApplication, N, <NONE>,  'InstallApplication',  \
    IsTextUnicode, N, <.lpBuffer, .cb, .lpi>,  'IsTextUnicode',  \
    IsTokenRestricted, N, <.TokenHandle>,  'IsTokenRestricted',  \
    IsTokenUntrusted, N, <NONE>,  'IsTokenUntrusted',  \
    IsValidAcl, N, <.pAcl>,  'IsValidAcl',  \
    IsValidSecurityDescriptor, N, <.pSecurityDescriptor>,  'IsValidSecurityDescriptor',  \
    IsValidSid, N, <.pSid>,  'IsValidSid',  \
    IsWellKnownSid, N, <NONE>,  'IsWellKnownSid',  \
    LockServiceDatabase, N, <.hSCManager>,  'LockServiceDatabase',  \
    LogonUser, A, <.lpszUsername, .lpszDomain, .lpszPassword, .dwLogonType, .dwLogonProvider, .phToken>,  'LogonUserA',  \
    LogonUserEx, A, <NONE>,  'LogonUserExA',  \
    LogonUserEx, W, <NONE>,  'LogonUserExW',  \
    LogonUser, W, <.lpszUsername, .lpszDomain, .lpszPassword, .dwLogonType, .dwLogonProvider, .phToken>,  'LogonUserW',  \
    LookupAccountName, A, <.lpSystemName, .lpAccountName, .Sid, .cbSid, .ReferencedDomainName, .cbReferencedDomainName, .peUse>,  'LookupAccountNameA',  \
    LookupAccountName, W, <.lpSystemName, .lpAccountName, .Sid, .cbSid, .ReferencedDomainName, .cbReferencedDomainName, .peUse>,  'LookupAccountNameW',  \
    LookupAccountSid, A, <.lpSystemName, .Sid, .Name, .cbName, .ReferencedDomainName, .cbReferencedDomainName, .peUse>,  'LookupAccountSidA',  \
    LookupAccountSid, W, <.lpSystemName, .Sid, .Name, .cbName, .ReferencedDomainName, .cbReferencedDomainName, .peUse>,  'LookupAccountSidW',  \
    LookupPrivilegeDisplayName, A, <.lpSystemName, .lpName, .lpDisplayName, .cbDisplayName, .lpLanguageID>,  'LookupPrivilegeDisplayNameA',  \
    LookupPrivilegeDisplayName, W, <.lpSystemName, .lpName, .lpDisplayName, .cbDisplayName, .lpLanguageID>,  'LookupPrivilegeDisplayNameW',  \
    LookupPrivilegeName, A, <.lpSystemName, .lpLuid, .lpName, .cbName>,  'LookupPrivilegeNameA',  \
    LookupPrivilegeName, W, <.lpSystemName, .lpLuid, .lpName, .cbName>,  'LookupPrivilegeNameW',  \
    LookupPrivilegeValue, A, <.lpSystemName, .lpName, .lpLuid>,  'LookupPrivilegeValueA',  \
    LookupPrivilegeValue, W, <.lpSystemName, .lpName, .lpLuid>,  'LookupPrivilegeValueW',  \
    LookupSecurityDescriptorParts, A, <.pOwner, .pGroup, .cCountOfAccessEntries, .pListOfAccessEntries, .cCountOfAuditEntries, .pListOfAuditEntries,  \
        .pSD>,  'LookupSecurityDescriptorPartsA',  \
    LookupSecurityDescriptorParts, W, <.pOwner, .pGroup, .cCountOfAccessEntries, .pListOfAccessEntries, .cCountOfAuditEntries, .pListOfAuditEntries,  \
        .pSD>,  'LookupSecurityDescriptorPartsW',  \
    LsaAddAccountRights, N, <.PolicyHandle, .AccountSid, .UserRights, .CountOfRights>,  'LsaAddAccountRights',  \
    LsaAddPrivilegesToAccount, N, <NONE>,  'LsaAddPrivilegesToAccount',  \
    LsaClearAuditLog, N, <NONE>,  'LsaClearAuditLog',  \
    LsaClose, N, <.ObjectHandle>,  'LsaClose',  \
    LsaCreateAccount, N, <NONE>,  'LsaCreateAccount',  \
    LsaCreateSecret, N, <NONE>,  'LsaCreateSecret',  \
    LsaCreateTrustedDomain, N, <NONE>,  'LsaCreateTrustedDomain',  \
    LsaCreateTrustedDomainEx, N, <.PolicyHandle, .TrustedDomainInformation, .AuthenticationInformation, .DesiredAccess, .TrustedDomainHandle,  \
      >,  'LsaCreateTrustedDomainEx',  \
    LsaDelete, N, <NONE>,  'LsaDelete',  \
    LsaDeleteTrustedDomain, N, <.PolicyHandle, .TrustedDomainSid>,  'LsaDeleteTrustedDomain',  \
    LsaEnumerateAccountRights, N, <.PolicyHandle, .AccountSid, .UserRights, .CountOfRights>,  'LsaEnumerateAccountRights',  \
    LsaEnumerateAccounts, N, <NONE>,  'LsaEnumerateAccounts',  \
    LsaEnumerateAccountsWithUserRight, N, <.PolicyHandle, .UserRights, .EnumerationBuffer, .CountReturned>,  'LsaEnumerateAccountsWithUserRight',  \
    LsaEnumeratePrivileges, N, <NONE>,  'LsaEnumeratePrivileges',  \
    LsaEnumeratePrivilegesOfAccount, N, <NONE>,  'LsaEnumeratePrivilegesOfAccount',  \
    LsaEnumerateTrustedDomains, N, <.PolicyHandle, .EnumerationContext, .buffer, .PreferedMaximumLength, .CountReturned>,  'LsaEnumerateTrustedDomains',  \
    LsaEnumerateTrustedDomainsEx, N, <.PolicyHandle, .EnumerationContext, .buffer, .PreferedMaximumLength, .CountReturned>,  'LsaEnumerateTrustedDomainsEx',  \
    LsaFreeMemory, N, <.buffer>,  'LsaFreeMemory',  \
    LsaGetQuotasForAccount, N, <NONE>,  'LsaGetQuotasForAccount',  \
    LsaGetRemoteUserName, N, <NONE>,  'LsaGetRemoteUserName',  \
    LsaGetSystemAccessAccount, N, <NONE>,  'LsaGetSystemAccessAccount',  \
    LsaGetUserName, N, <NONE>,  'LsaGetUserName',  \
    LsaICLookupNames, N, <NONE>,  'LsaICLookupNames',  \
    LsaICLookupNamesWithCreds, N, <NONE>,  'LsaICLookupNamesWithCreds',  \
    LsaICLookupSids, N, <NONE>,  'LsaICLookupSids',  \
    LsaICLookupSidsWithCreds, N, <NONE>,  'LsaICLookupSidsWithCreds',  \
    LsaLookupNames, N, <.PolicyHandle, .count, .Names, .ReferencedDomains, .Sids>,  'LsaLookupNames',  \
    LsaLookupNames2, N, <NONE>,  'LsaLookupNames2',  \
    LsaLookupPrivilegeDisplayName, N, <NONE>,  'LsaLookupPrivilegeDisplayName',  \
    LsaLookupPrivilegeName, N, <NONE>,  'LsaLookupPrivilegeName',  \
    LsaLookupPrivilegeValue, N, <NONE>,  'LsaLookupPrivilegeValue',  \
    LsaLookupSids, N, <.PolicyHandle, .count, .Sids, .ReferencedDomains, .Names>,  'LsaLookupSids',  \
    LsaNtStatusToWinError, N, <.Status>,  'LsaNtStatusToWinError',  \
    LsaOpenAccount, N, <NONE>,  'LsaOpenAccount',  \
    LsaOpenPolicy, N, <.SystemName, .ObjectAttributes, .DesiredAccess, .PolicyHandle>,  'LsaOpenPolicy',  \
    LsaOpenPolicySce, N, <NONE>,  'LsaOpenPolicySce',  \
    LsaOpenSecret, N, <NONE>,  'LsaOpenSecret',  \
    LsaOpenTrustedDomain, N, <NONE>,  'LsaOpenTrustedDomain',  \
    LsaOpenTrustedDomainByName, N, <.PolicyHandle, .TrustedDomainName, .DesiredAccess, .TrustedDomainHandle>,  'LsaOpenTrustedDomainByName',  \
    LsaQueryDomainInformationPolicy, N, <.PolicyHandle, .InformationClass, .buffer>,  'LsaQueryDomainInformationPolicy',  \
    LsaQueryForestTrustInformation, N, <NONE>,  'LsaQueryForestTrustInformation',  \
    LsaQueryInfoTrustedDomain, N, <NONE>,  'LsaQueryInfoTrustedDomain',  \
    LsaQueryInformationPolicy, N, <.PolicyHandle, .InformationClass, .buffer>,  'LsaQueryInformationPolicy',  \
    LsaQuerySecret, N, <NONE>,  'LsaQuerySecret',  \
    LsaQuerySecurityObject, N, <NONE>,  'LsaQuerySecurityObject',  \
    LsaQueryTrustedDomainInfo, N, <.PolicyHandle, .TrustedDomainSid, .InformationClass, .buffer>,  'LsaQueryTrustedDomainInfo',  \
    LsaQueryTrustedDomainInfoByName, N, <.PolicyHandle, .TrustedDomainName, .InformationClass, .buffer>,  'LsaQueryTrustedDomainInfoByName',  \
    LsaRemoveAccountRights, N, <.PolicyHandle, .AccountSid, .AllRights, .UserRights, .CountOfRights>,  'LsaRemoveAccountRights',  \
    LsaRemovePrivilegesFromAccount, N, <NONE>,  'LsaRemovePrivilegesFromAccount',  \
    LsaRetrievePrivateData, N, <.PolicyHandle, .KeyName, .PrivateData>,  'LsaRetrievePrivateData',  \
    LsaSetDomainInformationPolicy, N, <.PolicyHandle, .InformationClass, .buffer>,  'LsaSetDomainInformationPolicy',  \
    LsaSetForestTrustInformation, N, <NONE>,  'LsaSetForestTrustInformation',  \
    LsaSetInformationPolicy, N, <.PolicyHandle, .InformationClass, .buffer>,  'LsaSetInformationPolicy',  \
    LsaSetInformationTrustedDomain, N, <NONE>,  'LsaSetInformationTrustedDomain',  \
    LsaSetQuotasForAccount, N, <NONE>,  'LsaSetQuotasForAccount',  \
    LsaSetSecret, N, <NONE>,  'LsaSetSecret',  \
    LsaSetSecurityObject, N, <NONE>,  'LsaSetSecurityObject',  \
    LsaSetSystemAccessAccount, N, <NONE>,  'LsaSetSystemAccessAccount',  \
    LsaSetTrustedDomainInfoByName, N, <.PolicyHandle, .TrustedDomainName, .InformationClass, .buffer>,  'LsaSetTrustedDomainInfoByName',  \
    LsaSetTrustedDomainInformation, N, <.PolicyHandle, .TrustedDomainSid, .InformationClass, .buffer>,  'LsaSetTrustedDomainInformation',  \
    LsaStorePrivateData, N, <.PolicyHandle, .KeyName, .PrivateData>,  'LsaStorePrivateData',  \
    MD4Final, N, <NONE>,  'MD4Final',  \
    MD4Init, N, <NONE>,  'MD4Init',  \
    MD4Update, N, <NONE>,  'MD4Update',  \
    MD5Final, N, <NONE>,  'MD5Final',  \
    MD5Init, N, <NONE>,  'MD5Init',  \
    MD5Update, N, <NONE>,  'MD5Update',  \
    MSChapSrvChangePassword, N, <NONE>,  'MSChapSrvChangePassword',  \
    MSChapSrvChangePassword2, N, <NONE>,  'MSChapSrvChangePassword2',  \
    MakeAbsoluteSD, N, <.pSelfRelativeSecurityDescriptor, .pAbsoluteSecurityDescriptor, .lpdwAbsoluteSecurityDescriptorSize, .pDacl, .lpdwDaclSize,  \
        .pSacl, .lpdwSaclSize, .pOwner, .lpdwOwnerSize, .pPrimaryGroup, .lpdwPrimaryGroupSize>,  'MakeAbsoluteSD',  \
    MakeAbsoluteSD2, N, <.pSelfRelativeSecurityDescriptor, .lpdwBufferSize>,  'MakeAbsoluteSD2',  \
    MakeSelfRelativeSD, N, <.pAbsoluteSecurityDescriptor, .pSelfRelativeSecurityDescriptor, .lpdwBufferLength>,  'MakeSelfRelativeSD',  \
    MapGenericMask, N, <.AccessMask, .GenericMapping>,  'MapGenericMask',  \
    NotifyBootConfigStatus, N, <.BootAcceptable>,  'NotifyBootConfigStatus',  \
    NotifyChangeEventLog, N, <.hEventLog, .hEvent>,  'NotifyChangeEventLog',  \
    ObjectCloseAuditAlarm, A, <.SubsystemName, .HandleId, .GenerateOnClose>,  'ObjectCloseAuditAlarmA',  \
    ObjectCloseAuditAlarm, W, <.SubsystemName, .HandleId, .GenerateOnClose>,  'ObjectCloseAuditAlarmW',  \
    ObjectDeleteAuditAlarm, A, <.SubsystemName, .HandleId, .GenerateOnClose>,  'ObjectDeleteAuditAlarmA',  \
    ObjectDeleteAuditAlarm, W, <.SubsystemName, .HandleId, .GenerateOnClose>,  'ObjectDeleteAuditAlarmW',  \
    ObjectOpenAuditAlarm, A, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .pSecurityDescriptor, .ClientToken, .DesiredAccess,  \
        .GrantedAccess, .Privileges, .ObjectCreation, .AccessGranted, .GenerateOnClose>,  'ObjectOpenAuditAlarmA',  \
    ObjectOpenAuditAlarm, W, <.SubsystemName, .HandleId, .ObjectTypeName, .ObjectName, .pSecurityDescriptor, .ClientToken, .DesiredAccess,  \
        .GrantedAccess, .Privileges, .ObjectCreation, .AccessGranted, .GenerateOnClose>,  'ObjectOpenAuditAlarmW',  \
    ObjectPrivilegeAuditAlarm, A, <.SubsystemName, .HandleId, .ClientToken, .DesiredAccess, .Privileges, .AccessGranted>,  'ObjectPrivilegeAuditAlarmA',  \
    ObjectPrivilegeAuditAlarm, W, <.SubsystemName, .HandleId, .ClientToken, .DesiredAccess, .Privileges, .AccessGranted>,  'ObjectPrivilegeAuditAlarmW',  \
    OpenBackupEventLog, A, <.lpUNCServerName, .lpFileName>,  'OpenBackupEventLogA',  \
    OpenBackupEventLog, W, <.lpUNCServerName, .lpFileName>,  'OpenBackupEventLogW',  \
    OpenEncryptedFileRaw, A, <.lpFileName, .ulFlags, .pvContext>,  'OpenEncryptedFileRawA',  \
    OpenEncryptedFileRaw, W, <.lpFileName, .ulFlags, .pvContext>,  'OpenEncryptedFileRawW',  \
    OpenEventLog, A, <.lpUNCServerName, .lpSourceName>,  'OpenEventLogA',  \
    OpenEventLog, W, <.lpUNCServerName, .lpSourceName>,  'OpenEventLogW',  \
    OpenProcessToken, N, <.ProcessHandle, .DesiredAccess, .TokenHandle>,  'OpenProcessToken',  \
    OpenSCManager, A, <.lpMachineName, .lpDatabaseName, .dwDesiredAccess>,  'OpenSCManagerA',  \
    OpenSCManager, W, <.lpMachineName, .lpDatabaseName, .dwDesiredAccess>,  'OpenSCManagerW',  \
    OpenService, A, <.hSCManager, .lpServiceName, .dwDesiredAccess>,  'OpenServiceA',  \
    OpenService, W, <.hSCManager, .lpServiceName, .dwDesiredAccess>,  'OpenServiceW',  \
    OpenThreadToken, N, <.ThreadHandle, .DesiredAccess, .OpenAsSelf, .TokenHandle>,  'OpenThreadToken',  \
    OpenTrace, A, <NONE>,  'OpenTraceA',  \
    OpenTrace, W, <NONE>,  'OpenTraceW',  \
    PrivilegeCheck, N, <.ClientToken, .RequiredPrivileges, .pfResult>,  'PrivilegeCheck',  \
    PrivilegedServiceAuditAlarm, A, <.SubsystemName, .ServiceName, .ClientToken, .Privileges, .AccessGranted>,  'PrivilegedServiceAuditAlarmA',  \
    PrivilegedServiceAuditAlarm, W, <.SubsystemName, .ServiceName, .ClientToken, .Privileges, .AccessGranted>,  'PrivilegedServiceAuditAlarmW',  \
    ProcessIdleTasks, N, <NONE>,  'ProcessIdleTasks',  \
    ProcessTrace, N, <NONE>,  'ProcessTrace',  \
    QueryAllTraces, A, <NONE>,  'QueryAllTracesA',  \
    QueryAllTraces, W, <NONE>,  'QueryAllTracesW',  \
    QueryRecoveryAgentsOnEncryptedFile, N, <.lpFileName, .pRecoveryAgents>,  'QueryRecoveryAgentsOnEncryptedFile',  \
    QueryServiceConfig2, A, <.hService, .dwInfoLevel, .lpBuffer, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceConfig2A',  \
    QueryServiceConfig2, W, <.hService, .dwInfoLevel, .lpBuffer, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceConfig2W',  \
    QueryServiceConfig, A, <.hService, .lpServiceConfig, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceConfigA',  \
    QueryServiceConfig, W, <.hService, .lpServiceConfig, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceConfigW',  \
    QueryServiceLockStatus, A, <.hSCManager, .lpLockStatus, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceLockStatusA',  \
    QueryServiceLockStatus, W, <.hSCManager, .lpLockStatus, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceLockStatusW',  \
    QueryServiceObjectSecurity, N, <.hService, .dwSecurityInformation, .lpSecurityDescriptor, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceObjectSecurity',  \
    QueryServiceStatus, N, <.hService, .lpServiceStatus>,  'QueryServiceStatus',  \
    QueryServiceStatusEx, N, <.hService, .InfoLevel, .lpBuffer, .cbBufSize, .pcbBytesNeeded>,  'QueryServiceStatusEx',  \
    QueryTrace, A, <NONE>,  'QueryTraceA',  \
    QueryTrace, W, <NONE>,  'QueryTraceW',  \
    QueryUsersOnEncryptedFile, N, <.lpFileName, .pUsers>,  'QueryUsersOnEncryptedFile',  \
    QueryWindows31FilesMigration, N, <NONE>,  'QueryWindows31FilesMigration',  \
    ReadEncryptedFileRaw, N, <.pfExportCallback, .pvCallbackContext, .pvContext>,  'ReadEncryptedFileRaw',  \
    ReadEventLog, A, <.hEventLog, .dwReadFlags, .dwRecordOffset, .lpBuffer, .nNumberOfBytesToRead, .pnBytesRead, .pnMinNumberOfBytesNeeded,  \
      >,  'ReadEventLogA',  \
    ReadEventLog, W, <.hEventLog, .dwReadFlags, .dwRecordOffset, .lpBuffer, .nNumberOfBytesToRead, .pnBytesRead, .pnMinNumberOfBytesNeeded,  \
      >,  'ReadEventLogW',  \
    RegCloseKey, N, <.hKey>,  'RegCloseKey',  \
    RegConnectRegistry, A, <.lpMachineName, .hKey, .phkResult>,  'RegConnectRegistryA',  \
    RegConnectRegistry, W, <.lpMachineName, .hKey, .phkResult>,  'RegConnectRegistryW',  \
    RegCreateKey, A, <.hKey, .lpSubKey, .phkResult>,  'RegCreateKeyA',  \
    RegCreateKeyEx, A, <.hKey, .lpSubKey, .Reserved, .lpClass, .dwOptions, .samDesired, .lpSecurityAttributes, .phkResult, .lpdwDisposition,  \
      >,  'RegCreateKeyExA',  \
    RegCreateKeyEx, W, <.hKey, .lpSubKey, .Reserved, .lpClass, .dwOptions, .samDesired, .lpSecurityAttributes, .phkResult, .lpdwDisposition,  \
      >,  'RegCreateKeyExW',  \
    RegCreateKey, W, <.hKey, .lpSubKey, .phkResult>,  'RegCreateKeyW',  \
    RegDeleteKey, A, <.hKey, .lpSubKey>,  'RegDeleteKeyA',  \
    RegDeleteKey, W, <.hKey, .lpSubKey>,  'RegDeleteKeyW',  \
    RegDeleteValue, A, <.hKey, .lpValueName>,  'RegDeleteValueA',  \
    RegDeleteValue, W, <.hKey, .lpValueName>,  'RegDeleteValueW',  \
    RegDisablePredefinedCache, N, <VOID>,  'RegDisablePredefinedCache',  \
    RegDisablePredefinedCacheEx, N, <NONE>,  'RegDisablePredefinedCacheEx',  \
    RegEnumKey, A, <.hKey, .dwIndex, .lpName, .cbName>,  'RegEnumKeyA',  \
    RegEnumKeyEx, A, <.hKey, .dwIndex, .lpName, .lpcbName, .lpReserved, .lpClass, .lpcbClass, .lpftLastWriteTime>,  'RegEnumKeyExA',  \
    RegEnumKeyEx, W, <.hKey, .dwIndex, .lpName, .lpcbName, .lpReserved, .lpClass, .lpcbClass, .lpftLastWriteTime>,  'RegEnumKeyExW',  \
    RegEnumKey, W, <.hKey, .dwIndex, .lpName, .cbName>,  'RegEnumKeyW',  \
    RegEnumValue, A, <.hKey, .dwIndex, .lpValueName, .lpcbValueName, .lpReserved, .lpType, .lpData, .lpcbData>,  'RegEnumValueA',  \
    RegEnumValue, W, <.hKey, .dwIndex, .lpValueName, .lpcbValueName, .lpReserved, .lpType, .lpData, .lpcbData>,  'RegEnumValueW',  \
    RegFlushKey, N, <.hKey>,  'RegFlushKey',  \
    RegGetKeySecurity, N, <.hKey, .SecurityInformation, .pSecurityDescriptor, .lpcbSecurityDescriptor>,  'RegGetKeySecurity',  \
    RegLoadKey, A, <.hKey, .lpSubKey, .lpFile>,  'RegLoadKeyA',  \
    RegLoadKey, W, <.hKey, .lpSubKey, .lpFile>,  'RegLoadKeyW',  \
    RegNotifyChangeKeyValue, N, <.hKey, .bWatchSubtree, .dwNotifyFilter, .hEvent, .fAsynchronus>,  'RegNotifyChangeKeyValue',  \
    RegOpenCurrentUser, N, <.samDesired, .phkResult>,  'RegOpenCurrentUser',  \
    RegOpenKey, A, <.hKey, .lpSubKey, .phkResult>,  'RegOpenKeyA',  \
    RegOpenKeyEx, A, <.hKey, .lpSubKey, .ulOptions, .samDesired, .phkResult>,  'RegOpenKeyExA',  \
    RegOpenKeyEx, W, <.hKey, .lpSubKey, .ulOptions, .samDesired, .phkResult>,  'RegOpenKeyExW',  \
    RegOpenKey, W, <.hKey, .lpSubKey, .phkResult>,  'RegOpenKeyW',  \
    RegOpenUserClassesRoot, N, <.hToken, .dwOptions, .samDesired, .phkResult>,  'RegOpenUserClassesRoot',  \
    RegOverridePredefKey, N, <.hKey, .hNewHKey>,  'RegOverridePredefKey',  \
    RegQueryInfoKey, A, <.hKey, .lpClass, .lpcbClass, .lpReserved, .lpcSubKeys, .lpcbMaxSubKeyLen, .lpcbMaxClassLen, .lpcValues, .lpcbMaxValueNameLen,  \
        .lpcbMaxValueLen, .lpcbSecurityDescriptor, .lpftLastWriteTime>,  'RegQueryInfoKeyA',  \
    RegQueryInfoKey, W, <.hKey, .lpClass, .lpcbClass, .lpReserved, .lpcSubKeys, .lpcbMaxSubKeyLen, .lpcbMaxClassLen, .lpcValues, .lpcbMaxValueNameLen,  \
        .lpcbMaxValueLen, .lpcbSecurityDescriptor, .lpftLastWriteTime>,  'RegQueryInfoKeyW',  \
    RegQueryMultipleValues, A, <.hKey, .val_list, .num_vals, .lpValueBuf, .ldwTotsize>,  'RegQueryMultipleValuesA',  \
    RegQueryMultipleValues, W, <.hKey, .val_list, .num_vals, .lpValueBuf, .ldwTotsize>,  'RegQueryMultipleValuesW',  \
    RegQueryValue, A, <.hKey, .lpSubKey, .lpValue, .lpcbValue>,  'RegQueryValueA',  \
    RegQueryValueEx, A, <.hKey, .lpValueName, .lpReserved, .lpType, .lpData, .lpcbData>,  'RegQueryValueExA',  \
    RegQueryValueEx, W, <.hKey, .lpValueName, .lpReserved, .lpType, .lpData, .lpcbData>,  'RegQueryValueExW',  \
    RegQueryValue, W, <.hKey, .lpSubKey, .lpValue, .lpcbValue>,  'RegQueryValueW',  \
    RegReplaceKey, A, <.hKey, .lpSubKey, .lpNewFile, .lpOldFile>,  'RegReplaceKeyA',  \
    RegReplaceKey, W, <.hKey, .lpSubKey, .lpNewFile, .lpOldFile>,  'RegReplaceKeyW',  \
    RegRestoreKey, A, <.hKey, .lpFile, .dwFlags>,  'RegRestoreKeyA',  \
    RegRestoreKey, W, <.hKey, .lpFile, .dwFlags>,  'RegRestoreKeyW',  \
    RegSaveKey, A, <.hKey, .lpFile, .lpSecurityAttributes>,  'RegSaveKeyA',  \
    RegSaveKeyEx, A, <NONE>,  'RegSaveKeyExA',  \
    RegSaveKeyEx, W, <NONE>,  'RegSaveKeyExW',  \
    RegSaveKey, W, <.hKey, .lpFile, .lpSecurityAttributes>,  'RegSaveKeyW',  \
    RegSetKeySecurity, N, <.hKey, .SecurityInformation, .pSecurityDescriptor>,  'RegSetKeySecurity',  \
    RegSetValue, A, <.hKey, .lpSubKey, .dwType, .lpData, .cbData>,  'RegSetValueA',  \
    RegSetValueEx, A, <.hKey, .lpValueName, .Reserved, .dwType, .lpData, .cbData>,  'RegSetValueExA',  \
    RegSetValueEx, W, <.hKey, .lpValueName, .Reserved, .dwType, .lpData, .cbData>,  'RegSetValueExW',  \
    RegSetValue, W, <.hKey, .lpSubKey, .dwType, .lpData, .cbData>,  'RegSetValueW',  \
    RegUnLoadKey, A, <.hKey, .lpSubKey>,  'RegUnLoadKeyA',  \
    RegUnLoadKey, W, <.hKey, .lpSubKey>,  'RegUnLoadKeyW',  \
    RegisterEventSource, A, <.lpUNCServerName, .lpSourceName>,  'RegisterEventSourceA',  \
    RegisterEventSource, W, <.lpUNCServerName, .lpSourceName>,  'RegisterEventSourceW',  \
    RegisterIdleTask, N, <NONE>,  'RegisterIdleTask',  \
    RegisterServiceCtrlHandler, A, <.lpServiceName, .lpHandlerProc>,  'RegisterServiceCtrlHandlerA',  \
    RegisterServiceCtrlHandlerEx, A, <.lpServiceName, .lpHandlerProc, .lpContext>,  'RegisterServiceCtrlHandlerExA',  \
    RegisterServiceCtrlHandlerEx, W, <.lpServiceName, .lpHandlerProc, .lpContext>,  'RegisterServiceCtrlHandlerExW',  \
    RegisterServiceCtrlHandler, W, <.lpServiceName, .lpHandlerProc>,  'RegisterServiceCtrlHandlerW',  \
    RegisterTraceGuids, A, <NONE>,  'RegisterTraceGuidsA',  \
    RegisterTraceGuids, W, <NONE>,  'RegisterTraceGuidsW',  \
    RemoveTraceCallback, N, <NONE>,  'RemoveTraceCallback',  \
    RemoveUsersFromEncryptedFile, N, <.lpFileName, .pHashes>,  'RemoveUsersFromEncryptedFile',  \
    ReportEvent, A, <.hEventLog, .wType, .wCategory, .dwEventID, .lpUserSid, .wNumStrings, .dwDataSize, .lpStrings, .lpRawData>,  'ReportEventA',  \
    ReportEvent, W, <.hEventLog, .wType, .wCategory, .dwEventID, .lpUserSid, .wNumStrings, .dwDataSize, .lpStrings, .lpRawData>,  'ReportEventW',  \
    RevertToSelf, N, <VOID>,  'RevertToSelf',  \
    SaferCloseLevel, N, <NONE>,  'SaferCloseLevel',  \
    SaferComputeTokenFromLevel, N, <NONE>,  'SaferComputeTokenFromLevel',  \
    SaferCreateLevel, N, <NONE>,  'SaferCreateLevel',  \
    SaferGetLevelInformation, N, <NONE>,  'SaferGetLevelInformation',  \
    SaferGetPolicyInformation, N, <NONE>,  'SaferGetPolicyInformation',  \
    SaferIdentifyLevel, N, <NONE>,  'SaferIdentifyLevel',  \
    SaferRecordEventLogEntry, N, <NONE>,  'SaferRecordEventLogEntry',  \
    SaferSetLevelInformation, N, <NONE>,  'SaferSetLevelInformation',  \
    SaferSetPolicyInformation, N, <NONE>,  'SaferSetPolicyInformation',  \
    SaferiChangeRegistryScope, N, <NONE>,  'SaferiChangeRegistryScope',  \
    SaferiCompareTokenLevels, N, <NONE>,  'SaferiCompareTokenLevels',  \
    SaferiIsExecutableFileType, N, <NONE>,  'SaferiIsExecutableFileType',  \
    SaferiPopulateDefaultsInRegistry, N, <NONE>,  'SaferiPopulateDefaultsInRegistry',  \
    SaferiRecordEventLogEntry, N, <NONE>,  'SaferiRecordEventLogEntry',  \
    SaferiReplaceProcessThreadTokens, N, <NONE>,  'SaferiReplaceProcessThreadTokens',  \
    SaferiSearchMatchingHashRules, N, <NONE>,  'SaferiSearchMatchingHashRules',  \
    SetAclInformation, N, <.pAcl, .pAclInformation, .nAclInformationLength, .dwAclInformationClass>,  'SetAclInformation',  \
    SetEntriesInAccessList, A, <NONE>,  'SetEntriesInAccessListA',  \
    SetEntriesInAccessList, W, <NONE>,  'SetEntriesInAccessListW',  \
    SetEntriesInAcl, A, <.cCountOfExplicitEntries, .pListOfExplicitEntries, .OldAcl, .NewAcl>,  'SetEntriesInAclA',  \
    SetEntriesInAcl, W, <.cCountOfExplicitEntries, .pListOfExplicitEntries, .OldAcl, .NewAcl>,  'SetEntriesInAclW',  \
    SetEntriesInAuditList, A, <NONE>,  'SetEntriesInAuditListA',  \
    SetEntriesInAuditList, W, <NONE>,  'SetEntriesInAuditListW',  \
    SetFileSecurity, A, <.lpFileName, .SecurityInformation, .pSecurityDescriptor>,  'SetFileSecurityA',  \
    SetFileSecurity, W, <.lpFileName, .SecurityInformation, .pSecurityDescriptor>,  'SetFileSecurityW',  \
    SetInformationCodeAuthzLevel, W, <NONE>,  'SetInformationCodeAuthzLevelW',  \
    SetInformationCodeAuthzPolicy, W, <NONE>,  'SetInformationCodeAuthzPolicyW',  \
    SetKernelObjectSecurity, N, <.Handle, .SecurityInformation, .SecurityDescriptor>,  'SetKernelObjectSecurity',  \
    SetNamedSecurityInfo, A, <.pObjectName, .ObjectType, .SecurityInfo, .psidOwner, .psidGroup, .pDacl, .pSacl>,  'SetNamedSecurityInfoA',  \
    SetNamedSecurityInfoEx, A, <NONE>,  'SetNamedSecurityInfoExA',  \
    SetNamedSecurityInfoEx, W, <NONE>,  'SetNamedSecurityInfoExW',  \
    SetNamedSecurityInfo, W, <.pObjectName, .ObjectType, .SecurityInfo, .psidOwner, .psidGroup, .pDacl, .pSacl>,  'SetNamedSecurityInfoW',  \
    SetPrivateObjectSecurity, N, <.SecurityInformation, .ModificationDescriptor, .ObjectsSecurityDescriptor, .GenericMapping, .Token,  \
      >,  'SetPrivateObjectSecurity',  \
    SetPrivateObjectSecurityEx, N, <.SecurityInformation, .ModificationDescriptor, .ObjectsSecurityDescriptor, .AutoInheritFlags, .GenericMapping,  \
        .Token>,  'SetPrivateObjectSecurityEx',  \
    SetSecurityDescriptorControl, N, <.pSecurityDescriptor, .ControlBitsOfInterest, .ControlBitsToSet>,  'SetSecurityDescriptorControl',  \
    SetSecurityDescriptorDacl, N, <.pSecurityDescriptor, .bDaclPresent, .pDacl, .bDaclDefaulted>,  'SetSecurityDescriptorDacl',  \
    SetSecurityDescriptorGroup, N, <.pSecurityDescriptor, .pGroup, .bGroupDefaulted>,  'SetSecurityDescriptorGroup',  \
    SetSecurityDescriptorOwner, N, <.pSecurityDescriptor, .pOwner, .bOwnerDefaulted>,  'SetSecurityDescriptorOwner',  \
    SetSecurityDescriptorRMControl, N, <.SecurityDescriptor, .RMControl>,  'SetSecurityDescriptorRMControl',  \
    SetSecurityDescriptorSacl, N, <.pSecurityDescriptor, .bSaclPresent, .pSacl, .bSaclDefaulted>,  'SetSecurityDescriptorSacl',  \
    SetSecurityInfo, N, <.handle, .ObjectType, .SecurityInfo, .psidOwner, .psidGroup, .pDacl, .pSacl>,  'SetSecurityInfo',  \
    SetSecurityInfoEx, A, <NONE>,  'SetSecurityInfoExA',  \
    SetSecurityInfoEx, W, <NONE>,  'SetSecurityInfoExW',  \
    SetServiceBits, N, <.hServiceStatus, .dwServiceBits, .bSetBitsOn, .bUpdateImmediately>,  'SetServiceBits',  \
    SetServiceObjectSecurity, N, <.hService, .dwSecurityInformation, .lpSecurityDescriptor>,  'SetServiceObjectSecurity',  \
    SetServiceStatus, N, <.hServiceStatus, .lpServiceStatus>,  'SetServiceStatus',  \
    SetThreadToken, N, <.Thread, .Token>,  'SetThreadToken',  \
    SetTokenInformation, N, <.TokenHandle, .TokenInformationClass, .TokenInformation, .TokenInformationLength>,  'SetTokenInformation',  \
    SetTraceCallback, N, <NONE>,  'SetTraceCallback',  \
    SetUserFileEncryptionKey, N, <.pEncryptionCertificate>,  'SetUserFileEncryptionKey',  \
    StartService, A, <.hService, .dwNumServiceArgs, .lpServiceArgVectors>,  'StartServiceA',  \
    StartServiceCtrlDispatcher, A, <.lpServiceStartTable>,  'StartServiceCtrlDispatcherA',  \
    StartServiceCtrlDispatcher, W, <.lpServiceStartTable>,  'StartServiceCtrlDispatcherW',  \
    StartService, W, <.hService, .dwNumServiceArgs, .lpServiceArgVectors>,  'StartServiceW',  \
    StartTrace, A, <NONE>,  'StartTraceA',  \
    StartTrace, W, <NONE>,  'StartTraceW',  \
    StopTrace, A, <NONE>,  'StopTraceA',  \
    StopTrace, W, <NONE>,  'StopTraceW',  \
    SynchronizeWindows31FilesAndWindowsNTRegistry, N, <NONE>,  'SynchronizeWindows31FilesAndWindowsNTRegistry',  \
    SystemFunction001, N, <NONE>,  'SystemFunction001',  \
    SystemFunction002, N, <NONE>,  'SystemFunction002',  \
    SystemFunction003, N, <NONE>,  'SystemFunction003',  \
    SystemFunction004, N, <NONE>,  'SystemFunction004',  \
    SystemFunction005, N, <NONE>,  'SystemFunction005',  \
    SystemFunction006, N, <NONE>,  'SystemFunction006',  \
    SystemFunction007, N, <NONE>,  'SystemFunction007',  \
    SystemFunction008, N, <NONE>,  'SystemFunction008',  \
    SystemFunction009, N, <NONE>,  'SystemFunction009',  \
    SystemFunction010, N, <NONE>,  'SystemFunction010',  \
    SystemFunction011, N, <NONE>,  'SystemFunction011',  \
    SystemFunction012, N, <NONE>,  'SystemFunction012',  \
    SystemFunction013, N, <NONE>,  'SystemFunction013',  \
    SystemFunction014, N, <NONE>,  'SystemFunction014',  \
    SystemFunction015, N, <NONE>,  'SystemFunction015',  \
    SystemFunction016, N, <NONE>,  'SystemFunction016',  \
    SystemFunction017, N, <NONE>,  'SystemFunction017',  \
    SystemFunction018, N, <NONE>,  'SystemFunction018',  \
    SystemFunction019, N, <NONE>,  'SystemFunction019',  \
    SystemFunction020, N, <NONE>,  'SystemFunction020',  \
    SystemFunction021, N, <NONE>,  'SystemFunction021',  \
    SystemFunction022, N, <NONE>,  'SystemFunction022',  \
    SystemFunction023, N, <NONE>,  'SystemFunction023',  \
    SystemFunction024, N, <NONE>,  'SystemFunction024',  \
    SystemFunction025, N, <NONE>,  'SystemFunction025',  \
    SystemFunction026, N, <NONE>,  'SystemFunction026',  \
    SystemFunction027, N, <NONE>,  'SystemFunction027',  \
    SystemFunction028, N, <NONE>,  'SystemFunction028',  \
    SystemFunction029, N, <NONE>,  'SystemFunction029',  \
    SystemFunction030, N, <NONE>,  'SystemFunction030',  \
    SystemFunction031, N, <NONE>,  'SystemFunction031',  \
    SystemFunction032, N, <NONE>,  'SystemFunction032',  \
    SystemFunction033, N, <NONE>,  'SystemFunction033',  \
    SystemFunction034, N, <NONE>,  'SystemFunction034',  \
    SystemFunction035, N, <NONE>,  'SystemFunction035',  \
    SystemFunction036, N, <NONE>,  'SystemFunction036',  \
    SystemFunction040, N, <NONE>,  'SystemFunction040',  \
    SystemFunction041, N, <NONE>,  'SystemFunction041',  \
    TraceEvent, N, <NONE>,  'TraceEvent',  \
    TraceEventInstance, N, <NONE>,  'TraceEventInstance',  \
    TraceMessage, N, <NONE>,  'TraceMessage',  \
    TraceMessageVa, N, <NONE>,  'TraceMessageVa',  \
    TreeResetNamedSecurityInfo, A, <.pObjectName, .ObjectType, .SecurityInfo, .pOwner, .pGroup, .pDacl, .pSacl, .KeepExplicit, .fnProgress,  \
        .ProgressInvokeSetting, .Args>,  'TreeResetNamedSecurityInfoA',  \
    TreeResetNamedSecurityInfo, W, <.pObjectName, .ObjectType, .SecurityInfo, .pOwner, .pGroup, .pDacl, .pSacl, .KeepExplicit, .fnProgress,  \
        .ProgressInvokeSetting, .Args>,  'TreeResetNamedSecurityInfoW',  \
    TrusteeAccessToObject, A, <NONE>,  'TrusteeAccessToObjectA',  \
    TrusteeAccessToObject, W, <NONE>,  'TrusteeAccessToObjectW',  \
    UninstallApplication, N, <NONE>,  'UninstallApplication',  \
    UnlockServiceDatabase, N, <.ScLock>,  'UnlockServiceDatabase',  \
    UnregisterIdleTask, N, <NONE>,  'UnregisterIdleTask',  \
    UnregisterTraceGuids, N, <NONE>,  'UnregisterTraceGuids',  \
    UpdateTrace, A, <NONE>,  'UpdateTraceA',  \
    UpdateTrace, W, <NONE>,  'UpdateTraceW',  \
    WdmWmiServiceMain, N, <NONE>,  'WdmWmiServiceMain',  \
    WmiCloseBlock, N, <NONE>,  'WmiCloseBlock',  \
    WmiCloseTraceWithCursor, N, <NONE>,  'WmiCloseTraceWithCursor',  \
    WmiConvertTimestamp, N, <NONE>,  'WmiConvertTimestamp',  \
    WmiDevInstToInstanceName, A, <NONE>,  'WmiDevInstToInstanceNameA',  \
    WmiDevInstToInstanceName, W, <NONE>,  'WmiDevInstToInstanceNameW',  \
    WmiEnumerateGuids, N, <NONE>,  'WmiEnumerateGuids',  \
    WmiExecuteMethod, A, <NONE>,  'WmiExecuteMethodA',  \
    WmiExecuteMethod, W, <NONE>,  'WmiExecuteMethodW',  \
    WmiFileHandleToInstanceName, A, <NONE>,  'WmiFileHandleToInstanceNameA',  \
    WmiFileHandleToInstanceName, W, <NONE>,  'WmiFileHandleToInstanceNameW',  \
    WmiFreeBuffer, N, <NONE>,  'WmiFreeBuffer',  \
    WmiGetFirstTraceOffset, N, <NONE>,  'WmiGetFirstTraceOffset',  \
    WmiGetNextEvent, N, <NONE>,  'WmiGetNextEvent',  \
    WmiGetTraceHeader, N, <NONE>,  'WmiGetTraceHeader',  \
    WmiMofEnumerateResources, A, <NONE>,  'WmiMofEnumerateResourcesA',  \
    WmiMofEnumerateResources, W, <NONE>,  'WmiMofEnumerateResourcesW',  \
    WmiNotificationRegistration, A, <NONE>,  'WmiNotificationRegistrationA',  \
    WmiNotificationRegistration, W, <NONE>,  'WmiNotificationRegistrationW',  \
    WmiOpenBlock, N, <NONE>,  'WmiOpenBlock',  \
    WmiOpenTraceWithCursor, N, <NONE>,  'WmiOpenTraceWithCursor',  \
    WmiParseTraceEvent, N, <NONE>,  'WmiParseTraceEvent',  \
    WmiQueryAllData, A, <NONE>,  'WmiQueryAllDataA',  \
    WmiQueryAllDataMultiple, A, <NONE>,  'WmiQueryAllDataMultipleA',  \
    WmiQueryAllDataMultiple, W, <NONE>,  'WmiQueryAllDataMultipleW',  \
    WmiQueryAllData, W, <NONE>,  'WmiQueryAllDataW',  \
    WmiQueryGuidInformation, N, <NONE>,  'WmiQueryGuidInformation',  \
    WmiQuerySingleInstance, A, <NONE>,  'WmiQuerySingleInstanceA',  \
    WmiQuerySingleInstanceMultiple, A, <NONE>,  'WmiQuerySingleInstanceMultipleA',  \
    WmiQuerySingleInstanceMultiple, W, <NONE>,  'WmiQuerySingleInstanceMultipleW',  \
    WmiQuerySingleInstance, W, <NONE>,  'WmiQuerySingleInstanceW',  \
    WmiReceiveNotifications, A, <NONE>,  'WmiReceiveNotificationsA',  \
    WmiReceiveNotifications, W, <NONE>,  'WmiReceiveNotificationsW',  \
    WmiSetSingleInstance, A, <NONE>,  'WmiSetSingleInstanceA',  \
    WmiSetSingleInstance, W, <NONE>,  'WmiSetSingleInstanceW',  \
    WmiSetSingleItem, A, <NONE>,  'WmiSetSingleItemA',  \
    WmiSetSingleItem, W, <NONE>,  'WmiSetSingleItemW',  \
    Wow64Win32ApiEntry, N, <NONE>,  'Wow64Win32ApiEntry',  \
    WriteEncryptedFileRaw, N, <.pfImportCallback, .pvCallbackContext, .pvContext>,  'WriteEncryptedFileRaw'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted freshlib/imports/Win32/api/comctl32.inc.

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
97
98
99
100
101
102
103
104
;   comctl32.dll API calls (ASCII)
import_proto comctl32,  \
    AddMRUString, W, <NONE>,  'AddMRUStringW',  \
    CreateMRUList, W, <NONE>,  'CreateMRUListW',  \
    CreateMappedBitmap, N, <.hInstance, .idBitmap, .wFlags, .lpColorMap, .ByValumMaps>,  'CreateMappedBitmap',  \
    CreatePropertySheetPage, A, <.lpcpropsheetpagea>,  'CreatePropertySheetPageA',  \
    CreatePropertySheetPage, W, <.lpcpropsheetpagea>,  'CreatePropertySheetPageW',  \
    CreateStatusWindow, A, <.dwStyle, .lpszText, .hWndParent, .wID>,  'CreateStatusWindowA',  \
    CreateStatusWindow, W, <.dwStyle, .lpszText, .hWndParent, .wID>,  'CreateStatusWindowW',  \
    CreateToolbar, N, <NONE>,  'CreateToolbar',  \
    CreateToolbarEx, N, <.hWndParent, .dwStyle, .wID, .nBitmaps, .hBMInst, .wBMID, .lpButtons, .iNumButtons, .dxButton, .dyButton, .dxBitmap, .dyBitmap, .uStructSize>,  'CreateToolbarEx',  \
    CreateUpDownControl, N, <.dwStyle, .x, .y, .cx, .cy, .hParent, .nID, .hInst, .hBuddy, .nUpper, .nLower, .nPos>,  'CreateUpDownControl',  \
    DPA_Create, N, <NONE>,  'DPA_Create',  \
    DPA_DeleteAllPtrs, N, <NONE>,  'DPA_DeleteAllPtrs',  \
    DPA_DeletePtr, N, <NONE>,  'DPA_DeletePtr',  \
    DPA_Destroy, N, <NONE>,  'DPA_Destroy',  \
    DPA_DestroyCallback, N, <NONE>,  'DPA_DestroyCallback',  \
    DPA_EnumCallback, N, <NONE>,  'DPA_EnumCallback',  \
    DPA_GetPtr, N, <NONE>,  'DPA_GetPtr',  \
    DPA_InsertPtr, N, <NONE>,  'DPA_InsertPtr',  \
    DPA_Search, N, <NONE>,  'DPA_Search',  \
    DPA_SetPtr, N, <NONE>,  'DPA_SetPtr',  \
    DPA_Sort, N, <NONE>,  'DPA_Sort',  \
    DSA_Create, N, <NONE>,  'DSA_Create',  \
    DSA_DeleteAllItems, N, <NONE>,  'DSA_DeleteAllItems',  \
    DSA_Destroy, N, <NONE>,  'DSA_Destroy',  \
    DSA_DestroyCallback, N, <NONE>,  'DSA_DestroyCallback',  \
    DSA_GetItemPtr, N, <NONE>,  'DSA_GetItemPtr',  \
    DSA_InsertItem, N, <NONE>,  'DSA_InsertItem',  \
    DefSubclassProc, N, <NONE>,  'DefSubclassProc',  \
    DestroyPropertySheetPage, N, <.hpropsheetpage>,  'DestroyPropertySheetPage',  \
    DllGetVersion, N, <NONE>,  'DllGetVersion',  \
    DllInstall, N, <.bInstall, .pszCmdLine>,  'DllInstall',  \
    DrawInsert, N, <.handParent, .hLB, .nItem>,  'DrawInsert',  \
    DrawStatusText, A, <.hDC, .lprc, .pszText, .uFlags>,  'DrawStatusTextA',  \
    DrawStatusText, W, <.hDC, .lprc, .pszText, .uFlags>,  'DrawStatusTextW',  \
    EnumMRUList, W, <NONE>,  'EnumMRUListW',  \
    FlatSB_EnableScrollBar, N, <.hwnd, .ByValt, .uint>,  'FlatSB_EnableScrollBar',  \
    FlatSB_GetScrollInfo, N, <.hwnd, .code, .lpscrollinfo>,  'FlatSB_GetScrollInfo',  \
    FlatSB_GetScrollPos, N, <.hwnd, .code>,  'FlatSB_GetScrollPos',  \
    FlatSB_GetScrollProp, N, <.hwnd, .propIndex, .lpint>,  'FlatSB_GetScrollProp',  \
    FlatSB_GetScrollRange, N, <.hwnd, .code, .lpint>,  'FlatSB_GetScrollRange',  \
    FlatSB_SetScrollInfo, N, <.hwnd, .code, .lpscrollinfo, .fRedraw>,  'FlatSB_SetScrollInfo',  \
    FlatSB_SetScrollPos, N, <.hwnd, .code, .pos, .fRedraw>,  'FlatSB_SetScrollPos',  \
    FlatSB_SetScrollProp, N, <.hwnd, .index, .newValue, .bool>,  'FlatSB_SetScrollProp',  \
    FlatSB_SetScrollRange, N, <.hwnd, .code, .min, .max, .fRedraw>,  'FlatSB_SetScrollRange',  \
    FlatSB_ShowScrollBar, N, <.hwnd, .code, .bool>,  'FlatSB_ShowScrollBar',  \
    FreeMRUList, N, <NONE>,  'FreeMRUList',  \
    GetEffectiveClientRect, N, <.hWnd, .lprc, .lpInfo>,  'GetEffectiveClientRect',  \
    GetMUILanguage, N, <VOID>,  'GetMUILanguage',  \
    ImageList_Add, N, <.himl, .hbmImage, .hbmMask>,  'ImageList_Add',  \
    ImageList_AddIcon, N, <NONE>,  'ImageList_AddIcon',  \
    ImageList_AddMasked, N, <.himl, .hbmImage, .crMask>,  'ImageList_AddMasked',  \
    ImageList_BeginDrag, N, <.himlTrack, .iTrack, .dxHotspot, .dyHotspot>,  'ImageList_BeginDrag',  \
    ImageList_Copy, N, <.himlDst, .iDst, .himlSrc, .iSrc, .uFlags>,  'ImageList_Copy',  \
    ImageList_Create, N, <.cx, .cy, .flags, .cInitial, .cGrow>,  'ImageList_Create',  \
    ImageList_Destroy, N, <.himl>,  'ImageList_Destroy',  \
    ImageList_DragEnter, N, <.hwndLock, .x, .y>,  'ImageList_DragEnter',  \
    ImageList_DragLeave, N, <.hWndOwner>,  'ImageList_DragLeave',  \
    ImageList_DragMove, N, <.x, .y>,  'ImageList_DragMove',  \
    ImageList_DragShowNolock, N, <.fBoolean>,  'ImageList_DragShowNolock',  \
    ImageList_Draw, N, <.himl, .i, .hdcDst, .x, .y, .fStyle>,  'ImageList_Draw',  \
    ImageList_DrawEx, N, <.himl, .i, .hdcDst, .x, .y, .dx, .dy, .rgbBk, .rgbFg, .fStyle>,  'ImageList_DrawEx',  \
    ImageList_DrawIndirect, N, <.pimldp>,  'ImageList_DrawIndirect',  \
    ImageList_Duplicate, N, <.himl>,  'ImageList_Duplicate',  \
    ImageList_EndDrag, N, <VOID>,  'ImageList_EndDrag',  \
    ImageList_GetBkColor, N, <.himl>,  'ImageList_GetBkColor',  \
    ImageList_GetDragImage, N, <.ppt, .pptHotspot>,  'ImageList_GetDragImage',  \
    ImageList_GetFlags, N, <NONE>,  'ImageList_GetFlags',  \
    ImageList_GetIcon, N, <.himl, .i, .flags>,  'ImageList_GetIcon',  \
    ImageList_GetIconSize, N, <.himl, .cx, .cy>,  'ImageList_GetIconSize',  \
    ImageList_GetImageCount, N, <.himl>,  'ImageList_GetImageCount',  \
    ImageList_GetImageInfo, N, <.himl, .i, .pImageInfo>,  'ImageList_GetImageInfo',  \
    ImageList_GetImageRect, N, <NONE>,  'ImageList_GetImageRect',  \
    ImageList_LoadImage, A, <.hInst, .lpszbmp, .cx, .cGrow, .crMask, .uType, .uFlags>,  'ImageList_LoadImageA',  \
    ImageList_LoadImage, W, <.hInst, .lpszbmp, .cx, .cGrow, .crMask, .uType, .uFlags>,  'ImageList_LoadImageW',  \
    ImageList_Merge, N, <.himl1, .i1, .himl2, .i2, .dx, .dy>,  'ImageList_Merge',  \
    ImageList_Read, N, <.pstm>,  'ImageList_Read',  \
    ImageList_Remove, N, <.himl, .i>,  'ImageList_Remove',  \
    ImageList_Replace, N, <.himl, .i, .hbmImage, .hbmMask>,  'ImageList_Replace',  \
    ImageList_ReplaceIcon, N, <.himl, .i, .hicon>,  'ImageList_ReplaceIcon',  \
    ImageList_SetBkColor, N, <.himl, .clrBk>,  'ImageList_SetBkColor',  \
    ImageList_SetDragCursorImage, N, <.himlDrag, .iDrag, .dxHotspot, .dyHotspot>,  'ImageList_SetDragCursorImage',  \
    ImageList_SetFilter, N, <NONE>,  'ImageList_SetFilter',  \
    ImageList_SetFlags, N, <NONE>,  'ImageList_SetFlags',  \
    ImageList_SetIconSize, N, <.himl, .cx, .cy>,  'ImageList_SetIconSize',  \
    ImageList_SetImageCount, N, <.himl, .uNewCount>,  'ImageList_SetImageCount',  \
    ImageList_SetOverlayImage, N, <.himl, .iImage, .iOverlay>,  'ImageList_SetOverlayImage',  \
    ImageList_Write, N, <.himl, .pstm>,  'ImageList_Write',  \
    InitCommonControls, N, <VOID>,  'InitCommonControls',  \
    InitCommonControlsEx, N, <.pIcce>,  'InitCommonControlsEx',  \
    InitMUILanguage, N, <.uiLang>,  'InitMUILanguage',  \
    InitializeFlatSB, N, <.hwnd>,  'InitializeFlatSB',  \
    LBItemFromPt, N, <.hLB, .pt, .bAutoScroll>,  'LBItemFromPt',  \
    MakeDragList, N, <.hLB>,  'MakeDragList',  \
    MenuHelp, N, <.uMsg, .wParam, .lParam, .hMainMenu, .hInst, .hwndStatus, .lpwIDs>,  'MenuHelp',  \
    PropertySheet, A, <.lpcpropsheetheadera>,  'PropertySheetA',  \
    PropertySheet, W, <.lpcpropsheetheadera>,  'PropertySheetW',  \
    RemoveWindowSubclass, N, <NONE>,  'RemoveWindowSubclass',  \
    SetWindowSubclass, N, <NONE>,  'SetWindowSubclass',  \
    ShowHideMenuCtl, N, <.hWnd, .uFlags, .lpInfo>,  'ShowHideMenuCtl',  \
    Str_SetPtr, W, <NONE>,  'Str_SetPtrW',  \
    UninitializeFlatSB, N, <.hwnd>,  'UninitializeFlatSB',  \
    _TrackMouseEvent, N, <NONE>,  '_TrackMouseEvent'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































































































































































Deleted freshlib/imports/Win32/api/comdlg32.inc.

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
;   comdlg32.dll API calls (ASCII)
import_proto comdlg32,  \
    ChooseColor, A, <.pChoosecolor>,  'ChooseColorA',  \
    ChooseColor, W, <.pChoosecolor>,  'ChooseColorW',  \
    ChooseFont, A, <.pChoosefont>,  'ChooseFontA',  \
    ChooseFont, W, <.pChoosefont>,  'ChooseFontW',  \
    CommDlgExtendedError, N, <VOID>,  'CommDlgExtendedError',  \
    FindText, A, <.pFindreplace>,  'FindTextA',  \
    FindText, W, <.pFindreplace>,  'FindTextW',  \
    GetFileTitle, A, <.lpszFile, .lpszTitle, .cbBuf>,  'GetFileTitleA',  \
    GetFileTitle, W, <.lpszFile, .lpszTitle, .cbBuf>,  'GetFileTitleW',  \
    GetOpenFileName, A, <.pOpenfilename>,  'GetOpenFileNameA',  \
    GetOpenFileName, W, <.pOpenfilename>,  'GetOpenFileNameW',  \
    GetSaveFileName, A, <.pOpenfilename>,  'GetSaveFileNameA',  \
    GetSaveFileName, W, <.pOpenfilename>,  'GetSaveFileNameW',  \
    LoadAlterBitmap, N, <NONE>,  'LoadAlterBitmap',  \
    PageSetupDlg, A, <.pPagesetupdlg>,  'PageSetupDlgA',  \
    PageSetupDlg, W, <.pPagesetupdlg>,  'PageSetupDlgW',  \
    PrintDlg, A, <.pPrintdlg>,  'PrintDlgA',  \
    PrintDlgEx, A, <.TLPPRINTDLGEXA>,  'PrintDlgExA',  \
    PrintDlgEx, W, <.TLPPRINTDLGEXA>,  'PrintDlgExW',  \
    PrintDlg, W, <.pPrintdlg>,  'PrintDlgW',  \
    ReplaceText, A, <.pFindreplace>,  'ReplaceTextA',  \
    ReplaceText, W, <.pFindreplace>,  'ReplaceTextW',  \
    Ssync_ANSI_UNICODE_Struct_For_WO, W, <NONE>,  'Ssync_ANSI_UNICODE_Struct_For_WOW',  \
    WantArrows, N, <NONE>,  'WantArrows',  \
    dwLBSubclass, N, <NONE>,  'dwLBSubclass',  \
    dwOKSubclass, N, <NONE>,  'dwOKSubclass'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































Deleted freshlib/imports/Win32/api/gdi32.inc.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
;   gdi32.dll API calls (ASCII)
import_proto gdi32,  \
    AbortDoc, N, <.hdc>,  'AbortDoc',  \
    AbortPath, N, <.hdc>,  'AbortPath',  \
    AddFontMemResourceEx, N, <.pvoid, .dword, .pDword>,  'AddFontMemResourceEx',  \
    AddFontResource, A, <.lpFileName>,  'AddFontResourceA',  \
    AddFontResourceEx, A, <.lpcstr, .dword>,  'AddFontResourceExA',  \
    AddFontResourceEx, W, <.lpcstr, .dword>,  'AddFontResourceExW',  \
    AddFontResourceTracking, N, <NONE>,  'AddFontResourceTracking',  \
    AddFontResource, W, <.lpFileName>,  'AddFontResourceW',  \
    AngleArc, N, <.hdc, .x, .y, .dwRadius, .eStartAngle, .eSweepAngle>,  'AngleArc',  \
    AnimatePalette, N, <.hPalette, .wStartIndex, .wNumEntries, .lpPaletteColors>,  'AnimatePalette',  \
    AnyLinkedFonts, N, <NONE>,  'AnyLinkedFonts',  \
    Arc, N, <.hdc, .X1, .Y1, .X2, .Y2, .X3, .Y3, .X4, .Y4>,  'Arc',  \
    ArcTo, N, <.hdc, .X1, .Y1, .X2, .Y2, .X3, .Y3, .X4, .Y4>,  'ArcTo',  \
    BRUSHOBJ_hGetColorTransform, N, <NONE>,  'BRUSHOBJ_hGetColorTransform',  \
    BRUSHOBJ_pvAllocRbrush, N, <NONE>,  'BRUSHOBJ_pvAllocRbrush',  \
    BRUSHOBJ_pvGetRbrush, N, <NONE>,  'BRUSHOBJ_pvGetRbrush',  \
    BRUSHOBJ_ulGetBrushColor, N, <NONE>,  'BRUSHOBJ_ulGetBrushColor',  \
    BeginPath, N, <.hdc>,  'BeginPath',  \
    BitBlt, N, <.hDestDC, .x, .y, .nWidth, .nHeight, .hSrcDC, .xSrc, .ySrc, .dwRop>,  'BitBlt',  \
    CLIPOBJ_bEnum, N, <NONE>,  'CLIPOBJ_bEnum',  \
    CLIPOBJ_cEnumStart, N, <NONE>,  'CLIPOBJ_cEnumStart',  \
    CLIPOBJ_ppoGetPath, N, <NONE>,  'CLIPOBJ_ppoGetPath',  \
    CancelDC, N, <.hdc>,  'CancelDC',  \
    CheckColorsInGamut, N, <.hdc, .lpv, .lpv2, .dw>,  'CheckColorsInGamut',  \
    ChoosePixelFormat, N, <.hDC, .pPixelFormatDescriptor>,  'ChoosePixelFormat',  \
    Chord, N, <.hdc, .X1, .Y1, .X2, .Y2, .X3, .Y3, .X4, .Y4>,  'Chord',  \
    ClearBitmapAttributes, N, <NONE>,  'ClearBitmapAttributes',  \
    ClearBrushAttributes, N, <NONE>,  'ClearBrushAttributes',  \
    CloseEnhMetaFile, N, <.hdc>,  'CloseEnhMetaFile',  \
    CloseFigure, N, <.hdc>,  'CloseFigure',  \
    CloseMetaFile, N, <.hMF>,  'CloseMetaFile',  \
    ColorCorrectPalette, N, <.hdc, .hpalette, .dword>,  'ColorCorrectPalette',  \
    ColorMatchToTarget, N, <.hdc, .hdc2, .dw>,  'ColorMatchToTarget',  \
    CombineRgn, N, <.hDestRgn, .hSrcRgn1, .hSrcRgn2, .nCombineMode>,  'CombineRgn',  \
    CombineTransform, N, <.lpxformResult, .lpxform1, .lpxform2>,  'CombineTransform',  \
    CopyEnhMetaFile, A, <.hemfSrc, .lpszFile>,  'CopyEnhMetaFileA',  \
    CopyEnhMetaFile, W, <.hemfSrc, .lpszFile>,  'CopyEnhMetaFileW',  \
    CopyMetaFile, A, <.hMF, .lpFileName>,  'CopyMetaFileA',  \
    CopyMetaFile, W, <.hMF, .lpFileName>,  'CopyMetaFileW',  \
    CreateBitmap, N, <.nWidth, .nHeight, .nPlanes, .nBitCount, .lpBits>,  'CreateBitmap',  \
    CreateBitmapIndirect, N, <.lpBitmap>,  'CreateBitmapIndirect',  \
    CreateBrushIndirect, N, <.lpLogBrush>,  'CreateBrushIndirect',  \
    CreateColorSpace, A, <.lplogcolorspace>,  'CreateColorSpaceA',  \
    CreateColorSpace, W, <.lplogcolorspace>,  'CreateColorSpaceW',  \
    CreateCompatibleBitmap, N, <.hdc, .nWidth, .nHeight>,  'CreateCompatibleBitmap',  \
    CreateCompatibleDC, N, <.hdc>,  'CreateCompatibleDC',  \
    CreateDC, A, <.lpDriverName, .lpDeviceName, .lpOutput, .lpInitData>,  'CreateDCA',  \
    CreateDC, W, <.lpDriverName, .lpDeviceName, .lpOutput, .lpInitData>,  'CreateDCW',  \
    CreateDIBPatternBrush, N, <.hPackedDIB, .wUsage>,  'CreateDIBPatternBrush',  \
    CreateDIBPatternBrushPt, N, <.lpPackedDIB, .iUsage>,  'CreateDIBPatternBrushPt',  \
    CreateDIBSection, N, <.hDC, .pBitmapInfo, .iUsage, .pVarBits, .hSection, .dwOffset>,  'CreateDIBSection',  \
    CreateDIBitmap, N, <.hdc, .lpInfoHeader, .dwUsage, .lpInitBits, .lpInitInfo, .wUsage>,  'CreateDIBitmap',  \
    CreateDiscardableBitmap, N, <.hdc, .nWidth, .nHeight>,  'CreateDiscardableBitmap',  \
    CreateEllipticRgn, N, <.X1, .Y1, .X2, .Y2>,  'CreateEllipticRgn',  \
    CreateEllipticRgnIndirect, N, <.lpRect>,  'CreateEllipticRgnIndirect',  \
    CreateEnhMetaFile, A, <.hdcRef, .lpFileName, .lpRect, .lpDescription>,  'CreateEnhMetaFileA',  \
    CreateEnhMetaFile, W, <.hdcRef, .lpFileName, .lpRect, .lpDescription>,  'CreateEnhMetaFileW',  \
    CreateFont, A, <.height, .width, .escapement, .orientation, .weight, .italic, .underline, .strikeout, .charset, .OutputPrecision, .ClipPrecision, .quality, .PitchAndFamily, .Face>,  'CreateFontA',  \
    CreateFontIndirect, A, <.lpLogFont>,  'CreateFontIndirectA',  \
    CreateFontIndirectEx, A, <.ENUMLOGFONTEXDVA>,  'CreateFontIndirectExA',  \
    CreateFontIndirectEx, W, <.ENUMLOGFONTEXDVA>,  'CreateFontIndirectExW',  \
    CreateFontIndirect, W, <.lpLogFont>,  'CreateFontIndirectW',  \
    CreateFont, W, <.height, .width, .escapement, .orientation, .weight, .italic, .underline, .strikeout, .charset, .OutputPrecision, .ClipPrecision, .quality, .PitchAndFamily, .Face>,  'CreateFontW',  \
    CreateHalftonePalette, N, <.hdc>,  'CreateHalftonePalette',  \
    CreateHatchBrush, N, <.nIndex, .crColor>,  'CreateHatchBrush',  \
    CreateIC, A, <.lpDriverName, .lpDeviceName, .lpOutput, .lpInitData>,  'CreateICA',  \
    CreateIC, W, <.lpDriverName, .lpDeviceName, .lpOutput, .lpInitData>,  'CreateICW',  \
    CreateMetaFile, A, <.lpString>,  'CreateMetaFileA',  \
    CreateMetaFile, W, <.lpString>,  'CreateMetaFileW',  \
    CreatePalette, N, <.lpLogPalette>,  'CreatePalette',  \
    CreatePatternBrush, N, <.hBitmap>,  'CreatePatternBrush',  \
    CreatePen, N, <.nPenStyle, .nWidth, .crColor>,  'CreatePen',  \
    CreatePenIndirect, N, <.lpLogPen>,  'CreatePenIndirect',  \
    CreatePolyPolygonRgn, N, <.lpPoint, .lpPolyCounts, .nCount, .nPolyFillMode>,  'CreatePolyPolygonRgn',  \
    CreatePolygonRgn, N, <.lpPoint, .nCount, .nPolyFillMode>,  'CreatePolygonRgn',  \
    CreateRectRgn, N, <.X1, .Y1, .X2, .Y2>,  'CreateRectRgn',  \
    CreateRectRgnIndirect, N, <.lpRect>,  'CreateRectRgnIndirect',  \
    CreateRoundRectRgn, N, <.X1, .Y1, .X2, .Y2, .X3, .Y3>,  'CreateRoundRectRgn',  \
    CreateScalableFontResource, A, <.fHidden, .lpszResourceFile, .lpszFontFile, .lpszCurrentPath>,  'CreateScalableFontResourceA',  \
    CreateScalableFontResource, W, <.fHidden, .lpszResourceFile, .lpszFontFile, .lpszCurrentPath>,  'CreateScalableFontResourceW',  \
    CreateSolidBrush, N, <.crColor>,  'CreateSolidBrush',  \
    DPtoLP, N, <.hdc, .lpPoint, .nCount>,  'DPtoLP',  \
    DdEntry0, N, <NONE>,  'DdEntry0',  \
    DdEntry1, N, <NONE>,  'DdEntry1',  \
    DdEntry10, N, <NONE>,  'DdEntry10',  \
    DdEntry11, N, <NONE>,  'DdEntry11',  \
    DdEntry12, N, <NONE>,  'DdEntry12',  \
    DdEntry13, N, <NONE>,  'DdEntry13',  \
    DdEntry14, N, <NONE>,  'DdEntry14',  \
    DdEntry15, N, <NONE>,  'DdEntry15',  \
    DdEntry16, N, <NONE>,  'DdEntry16',  \
    DdEntry17, N, <NONE>,  'DdEntry17',  \
    DdEntry18, N, <NONE>,  'DdEntry18',  \
    DdEntry19, N, <NONE>,  'DdEntry19',  \
    DdEntry2, N, <NONE>,  'DdEntry2',  \
    DdEntry20, N, <NONE>,  'DdEntry20',  \
    DdEntry21, N, <NONE>,  'DdEntry21',  \
    DdEntry22, N, <NONE>,  'DdEntry22',  \
    DdEntry23, N, <NONE>,  'DdEntry23',  \
    DdEntry24, N, <NONE>,  'DdEntry24',  \
    DdEntry25, N, <NONE>,  'DdEntry25',  \
    DdEntry26, N, <NONE>,  'DdEntry26',  \
    DdEntry27, N, <NONE>,  'DdEntry27',  \
    DdEntry28, N, <NONE>,  'DdEntry28',  \
    DdEntry29, N, <NONE>,  'DdEntry29',  \
    DdEntry3, N, <NONE>,  'DdEntry3',  \
    DdEntry30, N, <NONE>,  'DdEntry30',  \
    DdEntry31, N, <NONE>,  'DdEntry31',  \
    DdEntry32, N, <NONE>,  'DdEntry32',  \
    DdEntry33, N, <NONE>,  'DdEntry33',  \
    DdEntry34, N, <NONE>,  'DdEntry34',  \
    DdEntry35, N, <NONE>,  'DdEntry35',  \
    DdEntry36, N, <NONE>,  'DdEntry36',  \
    DdEntry37, N, <NONE>,  'DdEntry37',  \
    DdEntry38, N, <NONE>,  'DdEntry38',  \
    DdEntry39, N, <NONE>,  'DdEntry39',  \
    DdEntry4, N, <NONE>,  'DdEntry4',  \
    DdEntry40, N, <NONE>,  'DdEntry40',  \
    DdEntry41, N, <NONE>,  'DdEntry41',  \
    DdEntry42, N, <NONE>,  'DdEntry42',  \
    DdEntry43, N, <NONE>,  'DdEntry43',  \
    DdEntry44, N, <NONE>,  'DdEntry44',  \
    DdEntry45, N, <NONE>,  'DdEntry45',  \
    DdEntry46, N, <NONE>,  'DdEntry46',  \
    DdEntry47, N, <NONE>,  'DdEntry47',  \
    DdEntry48, N, <NONE>,  'DdEntry48',  \
    DdEntry49, N, <NONE>,  'DdEntry49',  \
    DdEntry5, N, <NONE>,  'DdEntry5',  \
    DdEntry50, N, <NONE>,  'DdEntry50',  \
    DdEntry51, N, <NONE>,  'DdEntry51',  \
    DdEntry52, N, <NONE>,  'DdEntry52',  \
    DdEntry53, N, <NONE>,  'DdEntry53',  \
    DdEntry54, N, <NONE>,  'DdEntry54',  \
    DdEntry55, N, <NONE>,  'DdEntry55',  \
    DdEntry56, N, <NONE>,  'DdEntry56',  \
    DdEntry6, N, <NONE>,  'DdEntry6',  \
    DdEntry7, N, <NONE>,  'DdEntry7',  \
    DdEntry8, N, <NONE>,  'DdEntry8',  \
    DdEntry9, N, <NONE>,  'DdEntry9',  \
    DeleteColorSpace, N, <.hcolorspace>,  'DeleteColorSpace',  \
    DeleteDC, N, <.hdc>,  'DeleteDC',  \
    DeleteEnhMetaFile, N, <.hemf>,  'DeleteEnhMetaFile',  \
    DeleteMetaFile, N, <.hMF>,  'DeleteMetaFile',  \
    DeleteObject, N, <.hObject>,  'DeleteObject',  \
    DescribePixelFormat, N, <.hDC, .n, .un, .lpPixelFormatDescriptor>,  'DescribePixelFormat',  \
    DeviceCapabilitiesEx, A, <NONE>,  'DeviceCapabilitiesExA',  \
    DeviceCapabilitiesEx, W, <NONE>,  'DeviceCapabilitiesExW',  \
    DrawEscape, N, <.hdc, .nEscape, .cbInput, .lpszInData>,  'DrawEscape',  \
    Ellipse, N, <.hdc, .X1, .Y1, .X2, .Y2>,  'Ellipse',  \
    EnableEUDC, N, <NONE>,  'EnableEUDC',  \
    EndDoc, N, <.hDC>,  'EndDoc',  \
    EndFormPage, N, <.hdc>,  'EndFormPage',  \
    EndPage, N, <.hdc>,  'EndPage',  \
    EndPath, N, <.hdc>,  'EndPath',  \
    EngAcquireSemaphore, N, <NONE>,  'EngAcquireSemaphore',  \
    EngAlphaBlend, N, <NONE>,  'EngAlphaBlend',  \
    EngAssociateSurface, N, <NONE>,  'EngAssociateSurface',  \
    EngBitBlt, N, <NONE>,  'EngBitBlt',  \
    EngCheckAbort, N, <NONE>,  'EngCheckAbort',  \
    EngComputeGlyphSet, N, <NONE>,  'EngComputeGlyphSet',  \
    EngCopyBits, N, <NONE>,  'EngCopyBits',  \
    EngCreateBitmap, N, <NONE>,  'EngCreateBitmap',  \
    EngCreateClip, N, <NONE>,  'EngCreateClip',  \
    EngCreateDeviceBitmap, N, <NONE>,  'EngCreateDeviceBitmap',  \
    EngCreateDeviceSurface, N, <NONE>,  'EngCreateDeviceSurface',  \
    EngCreatePalette, N, <NONE>,  'EngCreatePalette',  \
    EngCreateSemaphore, N, <NONE>,  'EngCreateSemaphore',  \
    EngDeleteClip, N, <NONE>,  'EngDeleteClip',  \
    EngDeletePalette, N, <NONE>,  'EngDeletePalette',  \
    EngDeletePath, N, <NONE>,  'EngDeletePath',  \
    EngDeleteSemaphore, N, <NONE>,  'EngDeleteSemaphore',  \
    EngDeleteSurface, N, <NONE>,  'EngDeleteSurface',  \
    EngEraseSurface, N, <NONE>,  'EngEraseSurface',  \
    EngFillPath, N, <NONE>,  'EngFillPath',  \
    EngFindResource, N, <NONE>,  'EngFindResource',  \
    EngFreeModule, N, <NONE>,  'EngFreeModule',  \
    EngGetCurrentCodePage, N, <NONE>,  'EngGetCurrentCodePage',  \
    EngGetDriverName, N, <NONE>,  'EngGetDriverName',  \
    EngGetPrinterDataFileName, N, <NONE>,  'EngGetPrinterDataFileName',  \
    EngGradientFill, N, <NONE>,  'EngGradientFill',  \
    EngLineTo, N, <NONE>,  'EngLineTo',  \
    EngLoadModule, N, <NONE>,  'EngLoadModule',  \
    EngLockSurface, N, <NONE>,  'EngLockSurface',  \
    EngMarkBandingSurface, N, <NONE>,  'EngMarkBandingSurface',  \
    EngMultiByteToUnicodeN, N, <NONE>,  'EngMultiByteToUnicodeN',  \
    EngMultiByteToWideChar, N, <NONE>,  'EngMultiByteToWideChar',  \
    EngPaint, N, <NONE>,  'EngPaint',  \
    EngPlgBlt, N, <NONE>,  'EngPlgBlt',  \
    EngQueryEMFInfo, N, <NONE>,  'EngQueryEMFInfo',  \
    EngQueryLocalTime, N, <NONE>,  'EngQueryLocalTime',  \
    EngReleaseSemaphore, N, <NONE>,  'EngReleaseSemaphore',  \
    EngStretchBlt, N, <NONE>,  'EngStretchBlt',  \
    EngStretchBltROP, N, <NONE>,  'EngStretchBltROP',  \
    EngStrokeAndFillPath, N, <NONE>,  'EngStrokeAndFillPath',  \
    EngStrokePath, N, <NONE>,  'EngStrokePath',  \
    EngTextOut, N, <NONE>,  'EngTextOut',  \
    EngTransparentBlt, N, <NONE>,  'EngTransparentBlt',  \
    EngUnicodeToMultiByteN, N, <NONE>,  'EngUnicodeToMultiByteN',  \
    EngUnlockSurface, N, <NONE>,  'EngUnlockSurface',  \
    EngWideCharToMultiByte, N, <NONE>,  'EngWideCharToMultiByte',  \
    EnumEnhMetaFile, N, <.hdc, .hemf, .lpEnhMetaFunc, .lpData, .lpRect>,  'EnumEnhMetaFile',  \
    EnumFontFamilies, A, <.hdc, .lpszFamily, .lpEnumFontFamProc, .lParam>,  'EnumFontFamiliesA',  \
    EnumFontFamiliesEx, A, <.hdc, .lpLogFont, .lpEnumFontProc, .lParam, .dw>,  'EnumFontFamiliesExA',  \
    EnumFontFamiliesEx, W, <.hdc, .lpLogFont, .lpEnumFontProc, .lParam, .dw>,  'EnumFontFamiliesExW',  \
    EnumFontFamilies, W, <.hdc, .lpszFamily, .lpEnumFontFamProc, .lParam>,  'EnumFontFamiliesW',  \
    EnumFonts, A, <.hDC, .lpsz, .lpFontEnumProc, .lParam>,  'EnumFontsA',  \
    EnumFonts, W, <.hDC, .lpsz, .lpFontEnumProc, .lParam>,  'EnumFontsW',  \
    EnumICMProfiles, A, <.hdc, .icmEnumProc, .lParam>,  'EnumICMProfilesA',  \
    EnumICMProfiles, W, <.hdc, .icmEnumProc, .lParam>,  'EnumICMProfilesW',  \
    EnumMetaFile, N, <.hDC, .hMetafile, .lpMFEnumProc, .lParam>,  'EnumMetaFile',  \
    EnumObjects, N, <.hDC, .n, .lpGOBJEnumProc, .lpVoid>,  'EnumObjects',  \
    EqualRgn, N, <.hSrcRgn1, .hSrcRgn2>,  'EqualRgn',  \
    Escape, N, <.hdc, .nEscape, .nCount, .lpInData, .lpOutData>,  'Escape',  \
    EudcLoadLink, W, <NONE>,  'EudcLoadLinkW',  \
    EudcUnloadLink, W, <NONE>,  'EudcUnloadLinkW',  \
    ExcludeClipRect, N, <.hdc, .X1, .Y1, .X2, .Y2>,  'ExcludeClipRect',  \
    ExtCreatePen, N, <.dwPenStyle, .dwWidth, .lplb, .dwStyleCount, .lpStyle>,  'ExtCreatePen',  \
    ExtCreateRegion, N, <.lpXform, .nCount, .lpRgnData>,  'ExtCreateRegion',  \
    ExtEscape, N, <.hdc, .nEscape, .cbInput, .lpszInData, .cbOutput, .lpszOutData>,  'ExtEscape',  \
    ExtFloodFill, N, <.hdc, .x, .y, .crColor, .wFillType>,  'ExtFloodFill',  \
    ExtSelectClipRgn, N, <.hdc, .hRgn, .fnMode>,  'ExtSelectClipRgn',  \
    ExtTextOut, A, <.hdc, .x, .y, .wOptions, .lpRect, .lpString, .nCount, .lpDx>,  'ExtTextOutA',  \
    ExtTextOut, W, <.hdc, .x, .y, .wOptions, .lpRect, .lpString, .nCount, .lpDx>,  'ExtTextOutW',  \
    FONTOBJ_cGetAllGlyphHandles, N, <NONE>,  'FONTOBJ_cGetAllGlyphHandles',  \
    FONTOBJ_cGetGlyphs, N, <NONE>,  'FONTOBJ_cGetGlyphs',  \
    FONTOBJ_pQueryGlyphAttrs, N, <NONE>,  'FONTOBJ_pQueryGlyphAttrs',  \
    FONTOBJ_pfdg, N, <NONE>,  'FONTOBJ_pfdg',  \
    FONTOBJ_pifi, N, <NONE>,  'FONTOBJ_pifi',  \
    FONTOBJ_pvTrueTypeFontFile, N, <NONE>,  'FONTOBJ_pvTrueTypeFontFile',  \
    FONTOBJ_pxoGetXform, N, <NONE>,  'FONTOBJ_pxoGetXform',  \
    FONTOBJ_vGetInfo, N, <NONE>,  'FONTOBJ_vGetInfo',  \
    FillPath, N, <.hdc>,  'FillPath',  \
    FillRgn, N, <.hdc, .hRgn, .hBrush>,  'FillRgn',  \
    FixBrushOrgEx, N, <.hDC, .n1, .n2, .lpPoint>,  'FixBrushOrgEx',  \
    FlattenPath, N, <.hdc>,  'FlattenPath',  \
    FloodFill, N, <.hdc, .x, .y, .crColor>,  'FloodFill',  \
    FontIsLinked, N, <NONE>,  'FontIsLinked',  \
    FrameRgn, N, <.hdc, .hRgn, .hBrush, .nWidth, .nHeight>,  'FrameRgn',  \
    GdiAddFontResource, W, <NONE>,  'GdiAddFontResourceW',  \
    GdiAddGlsBounds, N, <NONE>,  'GdiAddGlsBounds',  \
    GdiAddGlsRecord, N, <NONE>,  'GdiAddGlsRecord',  \
    GdiAlphaBlend, N, <NONE>,  'GdiAlphaBlend',  \
    GdiArtificialDecrementDriver, N, <NONE>,  'GdiArtificialDecrementDriver',  \
    GdiCleanCacheDC, N, <NONE>,  'GdiCleanCacheDC',  \
    GdiComment, N, <.hdc, .cbSize, .lpData>,  'GdiComment',  \
    GdiConsoleTextOut, N, <NONE>,  'GdiConsoleTextOut',  \
    GdiConvertAndCheckDC, N, <NONE>,  'GdiConvertAndCheckDC',  \
    GdiConvertBitmap, N, <NONE>,  'GdiConvertBitmap',  \
    GdiConvertBitmapV5, N, <NONE>,  'GdiConvertBitmapV5',  \
    GdiConvertBrush, N, <NONE>,  'GdiConvertBrush',  \
    GdiConvertDC, N, <NONE>,  'GdiConvertDC',  \
    GdiConvertEnhMetaFile, N, <NONE>,  'GdiConvertEnhMetaFile',  \
    GdiConvertFont, N, <NONE>,  'GdiConvertFont',  \
    GdiConvertMetaFilePict, N, <NONE>,  'GdiConvertMetaFilePict',  \
    GdiConvertPalette, N, <NONE>,  'GdiConvertPalette',  \
    GdiConvertRegion, N, <NONE>,  'GdiConvertRegion',  \
    GdiConvertToDevmode, W, <NONE>,  'GdiConvertToDevmodeW',  \
    GdiCreateLocalEnhMetaFile, N, <NONE>,  'GdiCreateLocalEnhMetaFile',  \
    GdiCreateLocalMetaFilePict, N, <NONE>,  'GdiCreateLocalMetaFilePict',  \
    GdiDeleteLocalDC, N, <NONE>,  'GdiDeleteLocalDC',  \
    GdiDeleteSpoolFileHandle, N, <NONE>,  'GdiDeleteSpoolFileHandle',  \
    GdiDescribePixelFormat, N, <NONE>,  'GdiDescribePixelFormat',  \
    GdiDllInitialize, N, <NONE>,  'GdiDllInitialize',  \
    GdiDrawStream, N, <NONE>,  'GdiDrawStream',  \
    GdiEndDocEMF, N, <NONE>,  'GdiEndDocEMF',  \
    GdiEndPageEMF, N, <NONE>,  'GdiEndPageEMF',  \
    GdiEntry1, N, <NONE>,  'GdiEntry1',  \
    GdiEntry10, N, <NONE>,  'GdiEntry10',  \
    GdiEntry11, N, <NONE>,  'GdiEntry11',  \
    GdiEntry12, N, <NONE>,  'GdiEntry12',  \
    GdiEntry13, N, <NONE>,  'GdiEntry13',  \
    GdiEntry14, N, <NONE>,  'GdiEntry14',  \
    GdiEntry15, N, <NONE>,  'GdiEntry15',  \
    GdiEntry16, N, <NONE>,  'GdiEntry16',  \
    GdiEntry2, N, <NONE>,  'GdiEntry2',  \
    GdiEntry3, N, <NONE>,  'GdiEntry3',  \
    GdiEntry4, N, <NONE>,  'GdiEntry4',  \
    GdiEntry5, N, <NONE>,  'GdiEntry5',  \
    GdiEntry6, N, <NONE>,  'GdiEntry6',  \
    GdiEntry7, N, <NONE>,  'GdiEntry7',  \
    GdiEntry8, N, <NONE>,  'GdiEntry8',  \
    GdiEntry9, N, <NONE>,  'GdiEntry9',  \
    GdiFixUpHandle, N, <NONE>,  'GdiFixUpHandle',  \
    GdiFlush, N, <VOID>,  'GdiFlush',  \
    GdiFullscreenControl, N, <NONE>,  'GdiFullscreenControl',  \
    GdiGetBatchLimit, N, <VOID>,  'GdiGetBatchLimit',  \
    GdiGetBitmapBitsSize, N, <NONE>,  'GdiGetBitmapBitsSize',  \
    GdiGetCharDimensions, N, <NONE>,  'GdiGetCharDimensions',  \
    GdiGetCodePage, N, <NONE>,  'GdiGetCodePage',  \
    GdiGetDC, N, <NONE>,  'GdiGetDC',  \
    GdiGetDevmodeForPage, N, <NONE>,  'GdiGetDevmodeForPage',  \
    GdiGetLocalBrush, N, <NONE>,  'GdiGetLocalBrush',  \
    GdiGetLocalDC, N, <NONE>,  'GdiGetLocalDC',  \
    GdiGetLocalFont, N, <NONE>,  'GdiGetLocalFont',  \
    GdiGetPageCount, N, <NONE>,  'GdiGetPageCount',  \
    GdiGetPageHandle, N, <NONE>,  'GdiGetPageHandle',  \
    GdiGetSpoolFileHandle, N, <NONE>,  'GdiGetSpoolFileHandle',  \
    GdiGetSpoolMessage, N, <NONE>,  'GdiGetSpoolMessage',  \
    GdiGradientFill, N, <NONE>,  'GdiGradientFill',  \
    GdiInitSpool, N, <NONE>,  'GdiInitSpool',  \
    GdiInitializeLanguagePack, N, <NONE>,  'GdiInitializeLanguagePack',  \
    GdiIsMetaFileDC, N, <NONE>,  'GdiIsMetaFileDC',  \
    GdiIsMetaPrintDC, N, <NONE>,  'GdiIsMetaPrintDC',  \
    GdiIsPlayMetafileDC, N, <NONE>,  'GdiIsPlayMetafileDC',  \
    GdiPlayDCScript, N, <NONE>,  'GdiPlayDCScript',  \
    GdiPlayEMF, N, <NONE>,  'GdiPlayEMF',  \
    GdiPlayJournal, N, <NONE>,  'GdiPlayJournal',  \
    GdiPlayPageEMF, N, <NONE>,  'GdiPlayPageEMF',  \
    GdiPlayPrivatePageEMF, N, <NONE>,  'GdiPlayPrivatePageEMF',  \
    GdiPlayScript, N, <NONE>,  'GdiPlayScript',  \
    GdiPrinterThunk, N, <NONE>,  'GdiPrinterThunk',  \
    GdiProcessSetup, N, <NONE>,  'GdiProcessSetup',  \
    GdiQueryFonts, N, <NONE>,  'GdiQueryFonts',  \
    GdiQueryTable, N, <NONE>,  'GdiQueryTable',  \
    GdiRealizationInfo, N, <NONE>,  'GdiRealizationInfo',  \
    GdiReleaseDC, N, <NONE>,  'GdiReleaseDC',  \
    GdiReleaseLocalDC, N, <NONE>,  'GdiReleaseLocalDC',  \
    GdiResetDCEMF, N, <NONE>,  'GdiResetDCEMF',  \
    GdiSetAttrs, N, <NONE>,  'GdiSetAttrs',  \
    GdiSetBatchLimit, N, <.dwLimit>,  'GdiSetBatchLimit',  \
    GdiSetLastError, N, <NONE>,  'GdiSetLastError',  \
    GdiSetPixelFormat, N, <NONE>,  'GdiSetPixelFormat',  \
    GdiSetServerAttr, N, <NONE>,  'GdiSetServerAttr',  \
    GdiStartDocEMF, N, <NONE>,  'GdiStartDocEMF',  \
    GdiStartPageEMF, N, <NONE>,  'GdiStartPageEMF',  \
    GdiSwapBuffers, N, <NONE>,  'GdiSwapBuffers',  \
    GdiTransparentBlt, N, <NONE>,  'GdiTransparentBlt',  \
    GdiValidateHandle, N, <NONE>,  'GdiValidateHandle',  \
    GetArcDirection, N, <.hdc>,  'GetArcDirection',  \
    GetAspectRatioFilterEx, N, <.hdc, .lpAspectRatio>,  'GetAspectRatioFilterEx',  \
    GetBitmapAttributes, N, <NONE>,  'GetBitmapAttributes',  \
    GetBitmapBits, N, <.hBitmap, .dwCount, .lpBits>,  'GetBitmapBits',  \
    GetBitmapDimensionEx, N, <.hBitmap, .lpDimension>,  'GetBitmapDimensionEx',  \
    GetBkColor, N, <.hdc>,  'GetBkColor',  \
    GetBkMode, N, <.hdc>,  'GetBkMode',  \
    GetBoundsRect, N, <.hdc, .lprcBounds, .flags>,  'GetBoundsRect',  \
    GetBrushAttributes, N, <NONE>,  'GetBrushAttributes',  \
    GetBrushOrgEx, N, <.hDC, .lpPoint>,  'GetBrushOrgEx',  \
    GetCharABCWidths, A, <.hdc, .uFirstChar, .uLastChar, .lpabc>,  'GetCharABCWidthsA',  \
    GetCharABCWidthsFloat, A, <.hdc, .iFirstChar, .iLastChar, .lpABCF>,  'GetCharABCWidthsFloatA',  \
    GetCharABCWidthsFloat, W, <.hdc, .iFirstChar, .iLastChar, .lpABCF>,  'GetCharABCWidthsFloatW',  \
    GetCharABCWidthsI, N, <.hdc, .uint, .lpword, .lpabc>,  'GetCharABCWidthsI',  \
    GetCharABCWidths, W, <.hdc, .uFirstChar, .uLastChar, .lpabc>,  'GetCharABCWidthsW',  \
    GetCharWidth32, A, <.hdc, .iFirstChar, .iLastChar, .lpBuffer>,  'GetCharWidth32A',  \
    GetCharWidth32, W, <.hdc, .iFirstChar, .iLastChar, .lpBuffer>,  'GetCharWidth32W',  \
    GetCharWidth, A, <.hdc, .wFirstChar, .wLastChar, .lpBuffer>,  'GetCharWidthA',  \
    GetCharWidthFloat, A, <.hdc, .iFirstChar, .iLastChar, .pxBuffer>,  'GetCharWidthFloatA',  \
    GetCharWidthFloat, W, <.hdc, .iFirstChar, .iLastChar, .pxBuffer>,  'GetCharWidthFloatW',  \
    GetCharWidthI, N, <.hdc, .uint, .lpword, .lpint>,  'GetCharWidthI',  \
    GetCharWidthInfo, N, <NONE>,  'GetCharWidthInfo',  \
    GetCharWidth, W, <.hdc, .wFirstChar, .wLastChar, .lpBuffer>,  'GetCharWidthW',  \
    GetCharacterPlacement, A, <.hdc, .lpsz, .n1, .n2, .lpGcpResults, .dw>,  'GetCharacterPlacementA',  \
    GetCharacterPlacement, W, <.hdc, .lpsz, .n1, .n2, .lpGcpResults, .dw>,  'GetCharacterPlacementW',  \
    GetClipBox, N, <.hdc, .lpRect>,  'GetClipBox',  \
    GetClipRgn, N, <.hdc, .hRgn>,  'GetClipRgn',  \
    GetColorAdjustment, N, <.hdc, .lpca>,  'GetColorAdjustment',  \
    GetColorSpace, N, <.hdc>,  'GetColorSpace',  \
    GetCurrentObject, N, <.hdc, .uObjectType>,  'GetCurrentObject',  \
    GetCurrentPositionEx, N, <.hdc, .lpPoint>,  'GetCurrentPositionEx',  \
    GetDCBrushColor, N, <.hdc>,  'GetDCBrushColor',  \
    GetDCOrgEx, N, <.hdc, .lpPoint>,  'GetDCOrgEx',  \
    GetDCPenColor, N, <.hdc>,  'GetDCPenColor',  \
    GetDIBColorTable, N, <.hDC, .un1, .un2, .pRGBQuad>,  'GetDIBColorTable',  \
    GetDIBits, N, <.aHDC, .hBitmap, .nStartScan, .nNumScans, .lpBits, .lpBI, .wUsage>,  'GetDIBits',  \
    GetDeviceCaps, N, <.hdc, .nIndex>,  'GetDeviceCaps',  \
    GetDeviceGammaRamp, N, <.hdc, .lpv>,  'GetDeviceGammaRamp',  \
    GetETM, N, <NONE>,  'GetETM',  \
    GetEUDCTimeStamp, N, <NONE>,  'GetEUDCTimeStamp',  \
    GetEUDCTimeStampEx, W, <NONE>,  'GetEUDCTimeStampExW',  \
    GetEnhMetaFile, A, <.lpszMetaFile>,  'GetEnhMetaFileA',  \
    GetEnhMetaFileBits, N, <.hemf, .cbBuffer, .lpbBuffer>,  'GetEnhMetaFileBits',  \
    GetEnhMetaFileDescription, A, <.hemf, .cchBuffer, .lpszDescription>,  'GetEnhMetaFileDescriptionA',  \
    GetEnhMetaFileDescription, W, <.hemf, .cchBuffer, .lpszDescription>,  'GetEnhMetaFileDescriptionW',  \
    GetEnhMetaFileHeader, N, <.hemf, .cbBuffer, .lpemh>,  'GetEnhMetaFileHeader',  \
    GetEnhMetaFilePaletteEntries, N, <.hemf, .cEntries, .lppe>,  'GetEnhMetaFilePaletteEntries',  \
    GetEnhMetaFilePixelFormat, N, <.henhmetafile, .uint, .PIXELFORMATDESCRIPTOR>,  'GetEnhMetaFilePixelFormat',  \
    GetEnhMetaFile, W, <.lpszMetaFile>,  'GetEnhMetaFileW',  \
    GetFontAssocStatus, N, <NONE>,  'GetFontAssocStatus',  \
    GetFontData, N, <.hdc, .dwTable, .dwOffset, .lpvBuffer, .cbData>,  'GetFontData',  \
    GetFontLanguageInfo, N, <.hdc>,  'GetFontLanguageInfo',  \
    GetFontResourceInfo, W, <NONE>,  'GetFontResourceInfoW',  \
    GetFontUnicodeRanges, N, <.hdc, .LPGLYPHSET>,  'GetFontUnicodeRanges',  \
    GetGlyphIndices, A, <.hdc, .lpcstr, .ByValt, .lpword, .dword>,  'GetGlyphIndicesA',  \
    GetGlyphIndices, W, <.hdc, .lpcstr, .ByValt, .lpword, .dword>,  'GetGlyphIndicesW',  \
    GetGlyphOutline, A, <.hdc, .uChar, .fuFormat, .lpgm, .cbBuffer, .lpBuffer, .lpmat2>,  'GetGlyphOutlineA',  \
    GetGlyphOutline, W, <.hdc, .uChar, .fuFormat, .lpgm, .cbBuffer, .lpBuffer, .lpmat2>,  'GetGlyphOutlineW',  \
    GetGlyphOutlineWow, N, <NONE>,  'GetGlyphOutlineWow',  \
    GetGraphicsMode, N, <.hdc>,  'GetGraphicsMode',  \
    GetHFONT, N, <NONE>,  'GetHFONT',  \
    GetICMProfile, A, <.hdc, .dw, .lpStr>,  'GetICMProfileA',  \
    GetICMProfile, W, <.hdc, .dw, .lpStr>,  'GetICMProfileW',  \
    GetKerningPairs, A, <.hdc, .cPairs, .lpkrnpair>,  'GetKerningPairsA',  \
    GetKerningPairs, W, <.hdc, .cPairs, .lpkrnpair>,  'GetKerningPairsW',  \
    GetLayout, N, <.hdc>,  'GetLayout',  \
    GetLogColorSpace, A, <.hcolorspace, .lplogcolorspace, .dw>,  'GetLogColorSpaceA',  \
    GetLogColorSpace, W, <.hcolorspace, .lplogcolorspace, .dw>,  'GetLogColorSpaceW',  \
    GetMapMode, N, <.hdc>,  'GetMapMode',  \
    GetMetaFile, A, <.lpFileName>,  'GetMetaFileA',  \
    GetMetaFileBitsEx, N, <.hMF, .nSize, .lpvData>,  'GetMetaFileBitsEx',  \
    GetMetaFile, W, <.lpFileName>,  'GetMetaFileW',  \
    GetMetaRgn, N, <.hdc, .hRgn>,  'GetMetaRgn',  \
    GetMiterLimit, N, <.hdc, .peLimit>,  'GetMiterLimit',  \
    GetNearestColor, N, <.hdc, .crColor>,  'GetNearestColor',  \
    GetNearestPaletteIndex, N, <.hPalette, .crColor>,  'GetNearestPaletteIndex',  \
    GetObject, A, <.hObject, .nCount, .lpObject>,  'GetObjectA',  \
    GetObjectType, N, <.hgdiobj>,  'GetObjectType',  \
    GetObject, W, <.hObject, .nCount, .lpObject>,  'GetObjectW',  \
    GetOutlineTextMetrics, A, <.hdc, .cbData, .lpotm>,  'GetOutlineTextMetricsA',  \
    GetOutlineTextMetrics, W, <.hdc, .cbData, .lpotm>,  'GetOutlineTextMetricsW',  \
    GetPaletteEntries, N, <.hPalette, .wStartIndex, .wNumEntries, .lpPaletteEntries>,  'GetPaletteEntries',  \
    GetPath, N, <.hdc, .lpPoint, .lpTypes, .nSize>,  'GetPath',  \
    GetPixel, N, <.hdc, .x, .y>,  'GetPixel',  \
    GetPixelFormat, N, <.hDC>,  'GetPixelFormat',  \
    GetPolyFillMode, N, <.hdc>,  'GetPolyFillMode',  \
    GetROP2, N, <.hdc>,  'GetROP2',  \
    GetRandomRgn, N, <.hdc, .hrgn, .ByValt>,  'GetRandomRgn',  \
    GetRasterizerCaps, N, <.lpraststat, .cb>,  'GetRasterizerCaps',  \
    GetRegionData, N, <.hRgn, .dwCount, .lpRgnData>,  'GetRegionData',  \
    GetRelAbs, N, <NONE>,  'GetRelAbs',  \
    GetRgnBox, N, <.hRgn, .lpRect>,  'GetRgnBox',  \
    GetStockObject, N, <.fnObject>,  'GetStockObject',  \
    GetStretchBltMode, N, <.hdc>,  'GetStretchBltMode',  \
    GetStringBitmap, A, <NONE>,  'GetStringBitmapA',  \
    GetStringBitmap, W, <NONE>,  'GetStringBitmapW',  \
    GetSystemPaletteEntries, N, <.hdc, .wStartIndex, .wNumEntries, .lpPaletteEntries>,  'GetSystemPaletteEntries',  \
    GetSystemPaletteUse, N, <.hdc>,  'GetSystemPaletteUse',  \
    GetTextAlign, N, <.hdc>,  'GetTextAlign',  \
    GetTextCharacterExtra, N, <.hdc>,  'GetTextCharacterExtra',  \
    GetTextCharset, N, <.hdc>,  'GetTextCharset',  \
    GetTextCharsetInfo, N, <.hdc, .lpSig, .dwFlags>,  'GetTextCharsetInfo',  \
    GetTextColor, N, <.hdc>,  'GetTextColor',  \
    GetTextExtentExPoint, A, <.hdc, .lpszStr, .cchString, .nMaxExtent, .lpnFit, .alpDx, .lpSize>,  'GetTextExtentExPointA',  \
    GetTextExtentExPointI, N, <.hdc, .lpword, .ByValt, .lpint, .lpsize>,  'GetTextExtentExPointI',  \
    GetTextExtentExPoint, W, <.hdc, .lpszStr, .cchString, .nMaxExtent, .lpnFit, .alpDx, .lpSize>,  'GetTextExtentExPointW',  \
    GetTextExtentExPointWPri, N, <NONE>,  'GetTextExtentExPointWPri',  \
    GetTextExtentPoint32, A, <.hdc, .lpsz, .cbString, .lpSize>,  'GetTextExtentPoint32A',  \
    GetTextExtentPoint32, W, <.hdc, .lpsz, .cbString, .lpSize>,  'GetTextExtentPoint32W',  \
    GetTextExtentPoint, A, <.hdc, .lpszString, .cbString, .lpSize>,  'GetTextExtentPointA',  \
    GetTextExtentPointI, N, <.hdc, .lpword, .ByValt, .lpsize>,  'GetTextExtentPointI',  \
    GetTextExtentPoint, W, <.hdc, .lpszString, .cbString, .lpSize>,  'GetTextExtentPointW',  \
    GetTextFace, A, <.hdc, .nCount, .lpFacename>,  'GetTextFaceA',  \
    GetTextFaceAlias, W, <NONE>,  'GetTextFaceAliasW',  \
    GetTextFace, W, <.hdc, .nCount, .lpFacename>,  'GetTextFaceW',  \
    GetTextMetrics, A, <.hdc, .lpMetrics>,  'GetTextMetricsA',  \
    GetTextMetrics, W, <.hdc, .lpMetrics>,  'GetTextMetricsW',  \
    GetTransform, N, <NONE>,  'GetTransform',  \
    GetViewportExtEx, N, <.hdc, .lpSize>,  'GetViewportExtEx',  \
    GetViewportOrgEx, N, <.hdc, .lpPoint>,  'GetViewportOrgEx',  \
    GetWinMetaFileBits, N, <.hemf, .cbBuffer, .lpbBuffer, .fnMapMode, .hdcRef>,  'GetWinMetaFileBits',  \
    GetWindowExtEx, N, <.hdc, .lpSize>,  'GetWindowExtEx',  \
    GetWindowOrgEx, N, <.hdc, .lpPoint>,  'GetWindowOrgEx',  \
    GetWorldTransform, N, <.hdc, .lpXform>,  'GetWorldTransform',  \
    HT_Get8BPPFormatPalette, N, <NONE>,  'HT_Get8BPPFormatPalette',  \
    HT_Get8BPPMaskPalette, N, <NONE>,  'HT_Get8BPPMaskPalette',  \
    IntersectClipRect, N, <.hdc, .X1, .Y1, .X2, .Y2>,  'IntersectClipRect',  \
    InvertRgn, N, <.hdc, .hRgn>,  'InvertRgn',  \
    IsValidEnhMetaRecord, N, <NONE>,  'IsValidEnhMetaRecord',  \
    IsValidEnhMetaRecordOffExt, N, <NONE>,  'IsValidEnhMetaRecordOffExt',  \
    LPtoDP, N, <.hdc, .lpPoint, .nCount>,  'LPtoDP',  \
    LineDD, A, <.ByValt, .pLineddaproc, .lparam>,  'LineDDA',  \
    LineTo, N, <.hdc, .x, .y>,  'LineTo',  \
    MaskBlt, N, <.hdcDest, .nXDest, .nYDest, .nWidth, .nHeight, .hdcSrc, .nXSrc, .nYSrc, .hbmMask, .xMask, .yMask, .dwRop>,  'MaskBlt',  \
    MirrorRgn, N, <NONE>,  'MirrorRgn',  \
    ModifyWorldTransform, N, <.hdc, .lpXform, .iMode>,  'ModifyWorldTransform',  \
    MoveToEx, N, <.hdc, .x, .y, .lpPoint>,  'MoveToEx',  \
    NamedEscape, N, <NONE>,  'NamedEscape',  \
    OffsetClipRgn, N, <.hdc, .x, .y>,  'OffsetClipRgn',  \
    OffsetRgn, N, <.hRgn, .x, .y>,  'OffsetRgn',  \
    OffsetViewportOrgEx, N, <.hdc, .nX, .nY, .lpPoint>,  'OffsetViewportOrgEx',  \
    OffsetWindowOrgEx, N, <.hdc, .nX, .nY, .lpPoint>,  'OffsetWindowOrgEx',  \
    PATHOBJ_bEnum, N, <NONE>,  'PATHOBJ_bEnum',  \
    PATHOBJ_bEnumClipLines, N, <NONE>,  'PATHOBJ_bEnumClipLines',  \
    PATHOBJ_vEnumStart, N, <NONE>,  'PATHOBJ_vEnumStart',  \
    PATHOBJ_vEnumStartClipLines, N, <NONE>,  'PATHOBJ_vEnumStartClipLines',  \
    PATHOBJ_vGetBounds, N, <NONE>,  'PATHOBJ_vGetBounds',  \
    PaintRgn, N, <.hdc, .hRgn>,  'PaintRgn',  \
    PatBlt, N, <.hdc, .x, .y, .nWidth, .nHeight, .dwRop>,  'PatBlt',  \
    PathToRegion, N, <.hdc>,  'PathToRegion',  \
    Pie, N, <.hdc, .X1, .Y1, .X2, .Y2, .X3, .Y3, .X4, .Y4>,  'Pie',  \
    PlayEnhMetaFile, N, <.hdc, .hemf, .lpRect>,  'PlayEnhMetaFile',  \
    PlayEnhMetaFileRecord, N, <.hdc, .lpHandletable, .lpEnhMetaRecord, .nHandles>,  'PlayEnhMetaFileRecord',  \
    PlayMetaFile, N, <.hdc, .hMF>,  'PlayMetaFile',  \
    PlayMetaFileRecord, N, <.hdc, .lpHandletable, .lpMetaRecord, .nHandles>,  'PlayMetaFileRecord',  \
    PlgBlt, N, <.hdcDest, .lpPoint, .hdcSrc, .nXSrc, .nYSrc, .nWidth, .nHeight, .hbmMask, .xMask, .yMask>,  'PlgBlt',  \
    PolyBezier, N, <.hdc, .lppt, .cPoints>,  'PolyBezier',  \
    PolyBezierTo, N, <.hdc, .lppt, .cCount>,  'PolyBezierTo',  \
    PolyDraw, N, <.hdc, .lppt, .lpbTypes, .cCount>,  'PolyDraw',  \
    PolyPatBlt, N, <NONE>,  'PolyPatBlt',  \
    PolyPolygon, N, <.hdc, .lpPoint, .lpPolyCounts, .nCount>,  'PolyPolygon',  \
    PolyPolyline, N, <.hdc, .lppt, .lpdwPolyPoints, .cCount>,  'PolyPolyline',  \
    PolyTextOut, A, <.hdc, .pptxt, .cStrings>,  'PolyTextOutA',  \
    PolyTextOut, W, <.hdc, .pptxt, .cStrings>,  'PolyTextOutW',  \
    Polygon, N, <.hdc, .lpPoint, .nCount>,  'Polygon',  \
    Polyline, N, <.hdc, .lpPoint, .nCount>,  'Polyline',  \
    PolylineTo, N, <.hdc, .lppt, .cCount>,  'PolylineTo',  \
    PtInRegion, N, <.hRgn, .x, .y>,  'PtInRegion',  \
    PtVisible, N, <.hdc, .x, .y>,  'PtVisible',  \
    QueryFontAssocStatus, N, <NONE>,  'QueryFontAssocStatus',  \
    RealizePalette, N, <.hdc>,  'RealizePalette',  \
    RectInRegion, N, <.hRgn, .lpRect>,  'RectInRegion',  \
    RectVisible, N, <.hdc, .lpRect>,  'RectVisible',  \
    Rectangle, N, <.hdc, .X1, .Y1, .X2, .Y2>,  'Rectangle',  \
    RemoveFontMemResourceEx, N, <.handle>,  'RemoveFontMemResourceEx',  \
    RemoveFontResource, A, <.lpFileName>,  'RemoveFontResourceA',  \
    RemoveFontResourceEx, A, <.lpcstr, .dword, .DESIGNVECTOR>,  'RemoveFontResourceExA',  \
    RemoveFontResourceEx, W, <.lpcstr, .dword, .DESIGNVECTOR>,  'RemoveFontResourceExW',  \
    RemoveFontResourceTracking, N, <NONE>,  'RemoveFontResourceTracking',  \
    RemoveFontResource, W, <.lpFileName>,  'RemoveFontResourceW',  \
    ResetDC, A, <.hdc, .lpInitData>,  'ResetDCA',  \
    ResetDC, W, <.hdc, .lpInitData>,  'ResetDCW',  \
    ResizePalette, N, <.hPalette, .nNumEntries>,  'ResizePalette',  \
    RestoreDC, N, <.hdc, .nSavedDC>,  'RestoreDC',  \
    RoundRect, N, <.hdc, .X1, .Y1, .X2, .Y2, .X3, .Y3>,  'RoundRect',  \
    STROBJ_bEnum, N, <NONE>,  'STROBJ_bEnum',  \
    STROBJ_bEnumPositionsOnly, N, <NONE>,  'STROBJ_bEnumPositionsOnly',  \
    STROBJ_bGetAdvanceWidths, N, <NONE>,  'STROBJ_bGetAdvanceWidths',  \
    STROBJ_dwGetCodePage, N, <NONE>,  'STROBJ_dwGetCodePage',  \
    STROBJ_vEnumStart, N, <NONE>,  'STROBJ_vEnumStart',  \
    SaveDC, N, <.hdc>,  'SaveDC',  \
    ScaleViewportExtEx, N, <.hdc, .nXnum, .nXdenom, .nYnum, .nYdenom, .lpSize>,  'ScaleViewportExtEx',  \
    ScaleWindowExtEx, N, <.hdc, .nXnum, .nXdenom, .nYnum, .nYdenom, .lpSize>,  'ScaleWindowExtEx',  \
    SelectBrushLocal, N, <NONE>,  'SelectBrushLocal',  \
    SelectClipPath, N, <.hdc, .iMode>,  'SelectClipPath',  \
    SelectClipRgn, N, <.hdc, .hRgn>,  'SelectClipRgn',  \
    SelectFontLocal, N, <NONE>,  'SelectFontLocal',  \
    SelectObject, N, <.hdc, .hObject>,  'SelectObject',  \
    SelectPalette, N, <.hdc, .hPalette, .bForceBackground>,  'SelectPalette',  \
    SetAbortProc, N, <.hDC, .lpAbortProc>,  'SetAbortProc',  \
    SetArcDirection, N, <.hdc, .ArcDirection>,  'SetArcDirection',  \
    SetBitmapAttributes, N, <NONE>,  'SetBitmapAttributes',  \
    SetBitmapBits, N, <.hBitmap, .dwCount, .lpBits>,  'SetBitmapBits',  \
    SetBitmapDimensionEx, N, <.hbm, .nX, .nY, .lpSize>,  'SetBitmapDimensionEx',  \
    SetBkColor, N, <.hdc, .crColor>,  'SetBkColor',  \
    SetBkMode, N, <.hdc, .nBkMode>,  'SetBkMode',  \
    SetBoundsRect, N, <.hdc, .lprcBounds, .flags>,  'SetBoundsRect',  \
    SetBrushAttributes, N, <NONE>,  'SetBrushAttributes',  \
    SetBrushOrgEx, N, <.hdc, .nXOrg, .nYOrg, .lppt>,  'SetBrushOrgEx',  \
    SetColorAdjustment, N, <.hdc, .lpca>,  'SetColorAdjustment',  \
    SetColorSpace, N, <.hdc, .hcolorspace>,  'SetColorSpace',  \
    SetDCBrushColor, N, <.hdc, .colorref>,  'SetDCBrushColor',  \
    SetDCPenColor, N, <.hdc, .colorref>,  'SetDCPenColor',  \
    SetDIBColorTable, N, <.hDC, .un1, .un2, .pcRGBQuad>,  'SetDIBColorTable',  \
    SetDIBits, N, <.hdc, .hBitmap, .nStartScan, .nNumScans, .lpBits, .lpBI, .wUsage>,  'SetDIBits',  \
    SetDIBitsToDevice, N, <.hdc, .x, .y, .dx, .dy, .SrcX, .SrcY, .Scan, .NumScans, .Bits, .BitsInfo, .wUsage>,  'SetDIBitsToDevice',  \
    SetDeviceGammaRamp, N, <.hdc, .lpv>,  'SetDeviceGammaRamp',  \
    SetEnhMetaFileBits, N, <.cbBuffer, .lpData>,  'SetEnhMetaFileBits',  \
    SetFontEnumeration, N, <NONE>,  'SetFontEnumeration',  \
    SetGraphicsMode, N, <.hdc, .iMode>,  'SetGraphicsMode',  \
    SetICMMode, N, <.hdc, .n>,  'SetICMMode',  \
    SetICMProfile, A, <.hdc, .lpStr>,  'SetICMProfileA',  \
    SetICMProfile, W, <.hdc, .lpStr>,  'SetICMProfileW',  \
    SetLayout, N, <.hdc, .dword>,  'SetLayout',  \
    SetLayoutWidth, N, <NONE>,  'SetLayoutWidth',  \
    SetMagicColors, N, <NONE>,  'SetMagicColors',  \
    SetMapMode, N, <.hdc, .nMapMode>,  'SetMapMode',  \
    SetMapperFlags, N, <.hdc, .dwFlag>,  'SetMapperFlags',  \
    SetMetaFileBitsEx, N, <.nSize, .lpData>,  'SetMetaFileBitsEx',  \
    SetMetaRgn, N, <.hdc>,  'SetMetaRgn',  \
    SetMiterLimit, N, <.hdc, .eNewLimit, .peOldLimit>,  'SetMiterLimit',  \
    SetPaletteEntries, N, <.hPalette, .wStartIndex, .wNumEntries, .lpPaletteEntries>,  'SetPaletteEntries',  \
    SetPixel, N, <.hdc, .x, .y, .crColor>,  'SetPixel',  \
    SetPixelFormat, N, <.hDC, .n, .pcPixelFormatDescriptor>,  'SetPixelFormat',  \
    SetPixelV, N, <.hdc, .x, .y, .crColor>,  'SetPixelV',  \
    SetPolyFillMode, N, <.hdc, .nPolyFillMode>,  'SetPolyFillMode',  \
    SetROP2, N, <.hdc, .nDrawMode>,  'SetROP2',  \
    SetRectRgn, N, <.hRgn, .X1, .Y1, .X2, .Y2>,  'SetRectRgn',  \
    SetRelAbs, N, <NONE>,  'SetRelAbs',  \
    SetStretchBltMode, N, <.hdc, .nStretchMode>,  'SetStretchBltMode',  \
    SetSystemPaletteUse, N, <.hdc, .wUsage>,  'SetSystemPaletteUse',  \
    SetTextAlign, N, <.hdc, .fMode>,  'SetTextAlign',  \
    SetTextCharacterExtra, N, <.hdc, .nCharExtra>,  'SetTextCharacterExtra',  \
    SetTextColor, N, <.hdc, .crColor>,  'SetTextColor',  \
    SetTextJustification, N, <.hdc, .nBreakExtra, .nBreakCount>,  'SetTextJustification',  \
    SetViewportExtEx, N, <.hdc, .nX, .nY, .lpSize>,  'SetViewportExtEx',  \
    SetViewportOrgEx, N, <.hdc, .nX, .nY, .lpPoint>,  'SetViewportOrgEx',  \
    SetVirtualResolution, N, <NONE>,  'SetVirtualResolution',  \
    SetWinMetaFileBits, N, <.cbBuffer, .lpbBuffer, .hdcRef, .lpmfp>,  'SetWinMetaFileBits',  \
    SetWindowExtEx, N, <.hdc, .nX, .nY, .lpSize>,  'SetWindowExtEx',  \
    SetWindowOrgEx, N, <.hdc, .nX, .nY, .lpPoint>,  'SetWindowOrgEx',  \
    SetWorldTransform, N, <.hdc, .lpXform>,  'SetWorldTransform',  \
    StartDoc, A, <.hdc, .lpdi>,  'StartDocA',  \
    StartDoc, W, <.hdc, .lpdi>,  'StartDocW',  \
    StartFormPage, N, <.hdc>,  'StartFormPage',  \
    StartPage, N, <.hdc>,  'StartPage',  \
    StretchBlt, N, <.hdc, .x, .y, .nWidth, .nHeight, .hSrcDC, .xSrc, .ySrc, .nSrcWidth, .nSrcHeight, .dwRop>,  'StretchBlt',  \
    StretchDIBits, N, <.hdc, .x, .y, .dx, .dy, .SrcX, .SrcY, .wSrcWidth, .wSrcHeight, .lpBits, .lpBitsInfo, .wUsage, .dwRop>,  'StretchDIBits',  \
    StrokeAndFillPath, N, <.hdc>,  'StrokeAndFillPath',  \
    StrokePath, N, <.hdc>,  'StrokePath',  \
    SwapBuffers, N, <.hDC>,  'SwapBuffers',  \
    TextOut, A, <.hdc, .x, .y, .lpString, .nCount>,  'TextOutA',  \
    TextOut, W, <.hdc, .x, .y, .lpString, .nCount>,  'TextOutW',  \
    TranslateCharsetInfo, N, <.lpSrc, .lpcs, .dwFlags>,  'TranslateCharsetInfo',  \
    UnloadNetworkFonts, N, <NONE>,  'UnloadNetworkFonts',  \
    UnrealizeObject, N, <.hObject>,  'UnrealizeObject',  \
    UpdateColors, N, <.hdc>,  'UpdateColors',  \
    UpdateICMRegKey, A, <.dword, .lpstr, .uint>,  'UpdateICMRegKeyA',  \
    UpdateICMRegKey, W, <.dword, .lpstr, .uint>,  'UpdateICMRegKeyW',  \
    WidenPath, N, <.hdc>,  'WidenPath',  \
    XFORMOBJ_bApplyXform, N, <NONE>,  'XFORMOBJ_bApplyXform',  \
    XFORMOBJ_iGetXform, N, <NONE>,  'XFORMOBJ_iGetXform',  \
    XLATEOBJ_cGetPalette, N, <NONE>,  'XLATEOBJ_cGetPalette',  \
    XLATEOBJ_hGetColorTransform, N, <NONE>,  'XLATEOBJ_hGetColorTransform',  \
    XLATEOBJ_iXlate, N, <NONE>,  'XLATEOBJ_iXlate',  \
    XLATEOBJ_piVector, N, <NONE>,  'XLATEOBJ_piVector',  \
    bInitSystemAndFontsDirectories, W, <NONE>,  'bInitSystemAndFontsDirectoriesW',  \
    bMakePathName, W, <NONE>,  'bMakePathNameW',  \
    cGetTTFFromFOT, N, <NONE>,  'cGetTTFFromFOT',  \
    gdiPlaySpoolStream, N, <NONE>,  'gdiPlaySpoolStream'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted freshlib/imports/Win32/api/kernel32.inc.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
;   kernel32.dll API calls (ASCII)
import_proto kernel32,  \
    ActivateActCtx, N, <NONE>,  'ActivateActCtx',  \
    AddAtom, A, <.lpString>,  'AddAtomA',  \
    AddAtom, W, <.lpString>,  'AddAtomW',  \
    AddConsoleAlias, A, <NONE>,  'AddConsoleAliasA',  \
    AddConsoleAlias, W, <NONE>,  'AddConsoleAliasW',  \
    AddLocalAlternateComputerName, A, <NONE>,  'AddLocalAlternateComputerNameA',  \
    AddLocalAlternateComputerName, W, <NONE>,  'AddLocalAlternateComputerNameW',  \
    AddRefActCtx, N, <NONE>,  'AddRefActCtx',  \
    AddVectoredExceptionHandler, N, <NONE>,  'AddVectoredExceptionHandler',  \
    AllocConsole, N, <VOID>,  'AllocConsole',  \
    AllocateUserPhysicalPages, N, <.hProcess, .NumberOfPages, .PageArray>,  'AllocateUserPhysicalPages',  \
    AreFileApisANSI, N, <VOID>,  'AreFileApisANSI',  \
    AssignProcessToJobObject, N, <.hJob, .hProcess>,  'AssignProcessToJobObject',  \
    AttachConsole, N, <NONE>,  'AttachConsole',  \
    BackupRead, N, <.hFile, .lpBuffer, .nNumberOfBytesToRead, .lpNumberOfBytesRead, .bAbort, .bProcessSecurity, .lpContext>,  'BackupRead',  \
    BackupSeek, N, <.hFile, .dwLowBytesToSeek, .dwHighBytesToSeek, .lpdwLowByteSeeked, .lpdwHighByteSeeked, .lpContext>,  'BackupSeek',  \
    BackupWrite, N, <.hFile, .lpBuffer, .nNumberOfBytesToWrite, .lpNumberOfBytesWritten, .bAbort, .bProcessSecurity, .lpContext>,  'BackupWrite',  \
    BaseCheckAppcompatCache, N, <NONE>,  'BaseCheckAppcompatCache',  \
    BaseCleanupAppcompatCache, N, <NONE>,  'BaseCleanupAppcompatCache',  \
    BaseCleanupAppcompatCacheSupport, N, <NONE>,  'BaseCleanupAppcompatCacheSupport',  \
    BaseDumpAppcompatCache, N, <NONE>,  'BaseDumpAppcompatCache',  \
    BaseFlushAppcompatCache, N, <NONE>,  'BaseFlushAppcompatCache',  \
    BaseInitAppcompatCache, N, <NONE>,  'BaseInitAppcompatCache',  \
    BaseInitAppcompatCacheSupport, N, <NONE>,  'BaseInitAppcompatCacheSupport',  \
    BaseProcessInitPostImport, N, <NONE>,  'BaseProcessInitPostImport',  \
    BaseQueryModuleData, N, <NONE>,  'BaseQueryModuleData',  \
    BaseUpdateAppcompatCache, N, <NONE>,  'BaseUpdateAppcompatCache',  \
    BasepCheckWinSaferRestrictions, N, <NONE>,  'BasepCheckWinSaferRestrictions',  \
    Beep, N, <.dwFreq, .dwDuration>,  'Beep',  \
    BeginUpdateResource, A, <.pFileName, .bDeleteExistingResources>,  'BeginUpdateResourceA',  \
    BeginUpdateResource, W, <.pFileName, .bDeleteExistingResources>,  'BeginUpdateResourceW',  \
    BindIoCompletionCallback, N, <.FileHandle, .lFunction, .Flags>,  'BindIoCompletionCallback',  \
    BuildCommDCB, A, <.lpDef, .lpDCB>,  'BuildCommDCBA',  \
    BuildCommDCBAndTimeouts, A, <.lpDef, .lpDCB, .lpCommTimeouts>,  'BuildCommDCBAndTimeoutsA',  \
    BuildCommDCBAndTimeouts, W, <.lpDef, .lpDCB, .lpCommTimeouts>,  'BuildCommDCBAndTimeoutsW',  \
    BuildCommDCB, W, <.lpDef, .lpDCB>,  'BuildCommDCBW',  \
    CallNamedPipe, A, <.lpNamedPipeName, .lpInBuffer, .nInBufferSize, .lpOutBuffer, .nOutBufferSize, .lpBytesRead, .nTimeOut>,  'CallNamedPipeA',  \
    CallNamedPipe, W, <.lpNamedPipeName, .lpInBuffer, .nInBufferSize, .lpOutBuffer, .nOutBufferSize, .lpBytesRead, .nTimeOut>,  'CallNamedPipeW',  \
    CancelDeviceWakeupRequest, N, <.hDevice>,  'CancelDeviceWakeupRequest',  \
    CancelIo, N, <.hFile>,  'CancelIo',  \
    CancelTimerQueueTimer, N, <.TimerQueue, .Timer>,  'CancelTimerQueueTimer',  \
    CancelWaitableTimer, N, <.hTimer>,  'CancelWaitableTimer',  \
    ChangeTimerQueueTimer, N, <.TimerQueue, .Timer, .DueTime, .Period>,  'ChangeTimerQueueTimer',  \
    CheckNameLegalDOS8Dot3, A, <NONE>,  'CheckNameLegalDOS8Dot3A',  \
    CheckNameLegalDOS8Dot3, W, <NONE>,  'CheckNameLegalDOS8Dot3W',  \
    CheckRemoteDebuggerPresent, N, <NONE>,  'CheckRemoteDebuggerPresent',  \
    ClearCommBreak, N, <.nCid>,  'ClearCommBreak',  \
    ClearCommError, N, <.hFile, .lpErrors, .lpStat>,  'ClearCommError',  \
    CloseConsoleHandle, N, <NONE>,  'CloseConsoleHandle',  \
    CloseHandle, N, <.hObject>,  'CloseHandle',  \
    CloseProfileUserMapping, N, <NONE>,  'CloseProfileUserMapping',  \
    CmdBatNotification, N, <NONE>,  'CmdBatNotification',  \
    CommConfigDialog, A, <.lpszName, .hWnd, .lpCC>,  'CommConfigDialogA',  \
    CommConfigDialog, W, <.lpszName, .hWnd, .lpCC>,  'CommConfigDialogW',  \
    CompareFileTime, N, <.lpFileTime1, .lpFileTime2>,  'CompareFileTime',  \
    CompareString, A, <.Locale, .dwCmpFlags, .lpString1, .cchCount1, .lpString2, .cchCount2>,  'CompareStringA',  \
    CompareString, W, <.Locale, .dwCmpFlags, .lpString1, .cchCount1, .lpString2, .cchCount2>,  'CompareStringW',  \
    ConnectNamedPipe, N, <.hNamedPipe, .lpOverlapped>,  'ConnectNamedPipe',  \
    ConsoleMenuControl, N, <NONE>,  'ConsoleMenuControl',  \
    ContinueDebugEvent, N, <.dwProcessId, .dwThreadId, .dwContinueStatus>,  'ContinueDebugEvent',  \
    ConvertDefaultLocale, N, <.Locale>,  'ConvertDefaultLocale',  \
    ConvertFiberToThread, N, <NONE>,  'ConvertFiberToThread',  \
    ConvertThreadToFiber, N, <.lpParameter>,  'ConvertThreadToFiber',  \
    CopyFile, A, <.lpExistingFileName, .lpNewFileName, .bFailIfExists>,  'CopyFileA',  \
    CopyFileEx, A, <.lpExistingFileName, .lpNewFileName, .lpProgressRoutine, .lpData, .pbCancel, .dwCopyFlags>,  'CopyFileExA',  \
    CopyFileEx, W, <.lpExistingFileName, .lpNewFileName, .lpProgressRoutine, .lpData, .pbCancel, .dwCopyFlags>,  'CopyFileExW',  \
    CopyFile, W, <.lpExistingFileName, .lpNewFileName, .bFailIfExists>,  'CopyFileW',  \
    CopyLZFile, N, <.n1, .n2>,  'CopyLZFile',  \
    CreateActCtx, A, <NONE>,  'CreateActCtxA',  \
    CreateActCtx, W, <NONE>,  'CreateActCtxW',  \
    CreateConsoleScreenBuffer, N, <.dwDesiredAccess, .dwShareMode, .lpSecurityAttributes, .dwFlags, .lpScreenBufferData>,  'CreateConsoleScreenBuffer',  \
    CreateDirectory, A, <.lpPathName, .lpSecurityAttributes>,  'CreateDirectoryA',  \
    CreateDirectoryEx, A, <.lpTemplateDirectory, .lpNewDirectory, .lpSecurityAttributes>,  'CreateDirectoryExA',  \
    CreateDirectoryEx, W, <.lpTemplateDirectory, .lpNewDirectory, .lpSecurityAttributes>,  'CreateDirectoryExW',  \
    CreateDirectory, W, <.lpPathName, .lpSecurityAttributes>,  'CreateDirectoryW',  \
    CreateEvent, A, <.lpEventAttributes, .bManualReset, .bInitialState, .lpName>,  'CreateEventA',  \
    CreateEvent, W, <.lpEventAttributes, .bManualReset, .bInitialState, .lpName>,  'CreateEventW',  \
    CreateFiber, N, <.dwStackSize, .lpStartAddress, .lpParameter>,  'CreateFiber',  \
    CreateFiberEx, N, <NONE>,  'CreateFiberEx',  \
    CreateFile, A, <.lpFileName, .dwDesiredAccess, .dwShareMode, .lpSecurityAttributes, .dwCreationDisposition, .dwFlagsAndAttributes, .hTemplateFile>,  'CreateFileA',  \
    CreateFileMapping, A, <.hFile, .lpFileMappigAttributes, .flProtect, .dwMaximumSizeHigh, .dwMaximumSizeLow, .lpName>,  'CreateFileMappingA',  \
    CreateFileMapping, W, <.hFile, .lpFileMappigAttributes, .flProtect, .dwMaximumSizeHigh, .dwMaximumSizeLow, .lpName>,  'CreateFileMappingW',  \
    CreateFile, W, <.lpFileName, .dwDesiredAccess, .dwShareMode, .lpSecurityAttributes, .dwCreationDisposition, .dwFlagsAndAttributes, .hTemplateFile>,  'CreateFileW',  \
    CreateHardLink, A, <.lpFileName, .lpExistingFileName, .lpSecurityAttributes>,  'CreateHardLinkA',  \
    CreateHardLink, W, <.lpFileName, .lpExistingFileName, .lpSecurityAttributes>,  'CreateHardLinkW',  \
    CreateIoCompletionPort, N, <.FileHandle, .ExistingCompletionPort, .CompletionKey, .NumberOfConcurrentThreads>,  'CreateIoCompletionPort',  \
    CreateJobObject, A, <.lpJobAttributes, .lpName>,  'CreateJobObjectA',  \
    CreateJobObject, W, <.lpJobAttributes, .lpName>,  'CreateJobObjectW',  \
    CreateJobSet, N, <NONE>,  'CreateJobSet',  \
    CreateMailslot, A, <.lpName, .nMaxMessageSize, .lReadTimeout, .lpSecurityAttributes>,  'CreateMailslotA',  \
    CreateMailslot, W, <.lpName, .nMaxMessageSize, .lReadTimeout, .lpSecurityAttributes>,  'CreateMailslotW',  \
    CreateMemoryResourceNotification, N, <NONE>,  'CreateMemoryResourceNotification',  \
    CreateMutex, A, <.lpMutexAttributes, .bInitialOwner, .lpName>,  'CreateMutexA',  \
    CreateMutex, W, <.lpMutexAttributes, .bInitialOwner, .lpName>,  'CreateMutexW',  \
    CreateNamedPipe, A, <.lpName, .dwOpenMode, .dwPipeMode, .nMaxInstances, .nOutBufferSize, .nInBufferSize, .nDefaultTimeOut, .lpSecurityAttributes>,  'CreateNamedPipeA',  \
    CreateNamedPipe, W, <.lpName, .dwOpenMode, .dwPipeMode, .nMaxInstances, .nOutBufferSize, .nInBufferSize, .nDefaultTimeOut, .lpSecurityAttributes>,  'CreateNamedPipeW',  \
    CreateNlsSecurityDescriptor, N, <NONE>,  'CreateNlsSecurityDescriptor',  \
    CreatePipe, N, <.phReadPipe, .phWritePipe, .lpPipeAttributes, .nSize>,  'CreatePipe',  \
    CreateProcess, A, <.lpApplicationName, .lpCommandLine, .lpProcessAttributes, .lpThreadAttributes, .bInheritHandles, .dwCreationFlags, .lpEnvironment, .lpCurrentDriectory, .lpStartupInfo, .lpProcessInformation>,  'CreateProcessA',  \
    CreateProcessInternal, A, <NONE>,  'CreateProcessInternalA',  \
    CreateProcessInternal, W, <NONE>,  'CreateProcessInternalW',  \
    CreateProcessInternalWSecure, N, <NONE>,  'CreateProcessInternalWSecure',  \
    CreateProcess, W, <.lpApplicationName, .lpCommandLine, .lpProcessAttributes, .lpThreadAttributes, .bInheritHandles, .dwCreationFlags, .lpEnvironment, .lpCurrentDriectory, .lpStartupInfo, .lpProcessInformation>,  'CreateProcessW',  \
    CreateRemoteThread, N, <.hProcess, .lpThreadAttributes, .dwStackSize, .lpStartAddress, .lpParameter, .dwCreationFlags, .lpThreadId>,  'CreateRemoteThread',  \
    CreateSemaphore, A, <.lpSemaphoreAttributes, .lInitialCount, .lMaximumCount, .lpName>,  'CreateSemaphoreA',  \
    CreateSemaphore, W, <.lpSemaphoreAttributes, .lInitialCount, .lMaximumCount, .lpName>,  'CreateSemaphoreW',  \
    CreateSocketHandle, N, <NONE>,  'CreateSocketHandle',  \
    CreateTapePartition, N, <.hDevice, .dwPartitionMethod, .dwCount, .dwSize>,  'CreateTapePartition',  \
    CreateThread, N, <.lpThreadAttributes, .dwStackSize, .lpStartAddress, .lpParameter, .dwCreationFlags, .lpThreadId>,  'CreateThread',  \
    CreateTimerQueue, N, <VOID>,  'CreateTimerQueue',  \
    CreateTimerQueueTimer, N, <NONE>,  'CreateTimerQueueTimer',  \
    CreateToolhelp32Snapshot, N, <.dwFlags, .th32ProcessID>,  'CreateToolhelp32Snapshot',  \
    CreateVirtualBuffer, N, <NONE>,  'CreateVirtualBuffer',  \
    CreateWaitableTimer, A, <.lpTimerAttributes, .bManualReset, .lpTimerName>,  'CreateWaitableTimerA',  \
    CreateWaitableTimer, W, <.lpTimerAttributes, .bManualReset, .lpTimerName>,  'CreateWaitableTimerW',  \
    DeactivateActCtx, N, <NONE>,  'DeactivateActCtx',  \
    DebugActiveProcess, N, <.dwProcessId>,  'DebugActiveProcess',  \
    DebugActiveProcessStop, N, <NONE>,  'DebugActiveProcessStop',  \
    DebugBreak, N, <VOID>,  'DebugBreak',  \
    DebugBreakProcess, N, <NONE>,  'DebugBreakProcess',  \
    DebugSetProcessKillOnExit, N, <NONE>,  'DebugSetProcessKillOnExit',  \
    DecodePointer, N, <NONE>,  'DecodePointer',  \
    DecodeSystemPointer, N, <NONE>,  'DecodeSystemPointer',  \
    DefineDosDevice, A, <.dwFlags, .lpDeviceName, .lpTargetPath>,  'DefineDosDeviceA',  \
    DefineDosDevice, W, <.dwFlags, .lpDeviceName, .lpTargetPath>,  'DefineDosDeviceW',  \
    DelayLoadFailureHook, N, <NONE>,  'DelayLoadFailureHook',  \
    DeleteAtom, N, <.nAtom>,  'DeleteAtom',  \
    DeleteCriticalSection, N, <.lpCriticalSection>,  'DeleteCriticalSection',  \
    DeleteFiber, N, <.lpFiber>,  'DeleteFiber',  \
    DeleteFile, A, <.lpFileName>,  'DeleteFileA',  \
    DeleteFile, W, <.lpFileName>,  'DeleteFileW',  \
    DeleteTimerQueue, N, <.TimerQueue>,  'DeleteTimerQueue',  \
    DeleteTimerQueueEx, N, <.TimerQueue, .CompletionEvent>,  'DeleteTimerQueueEx',  \
    DeleteTimerQueueTimer, N, <.TimerQueue, .Timer, .CompletionEvent>,  'DeleteTimerQueueTimer',  \
    DeleteVolumeMountPoint, A, <.lpszVolumeMountPoint>,  'DeleteVolumeMountPointA',  \
    DeleteVolumeMountPoint, W, <.lpszVolumeMountPoint>,  'DeleteVolumeMountPointW',  \
    DeviceIoControl, N, <.hDevice, .dwIoControlCode, .lpInBuffer, .nInBufferSize, .lpOutBuffer, .nOutBufferSize, .lpBytesReturned, .lpOverlapped>,  'DeviceIoControl',  \
    DisableThreadLibraryCalls, N, <.hLibModule>,  'DisableThreadLibraryCalls',  \
    DisconnectNamedPipe, N, <.hNamedPipe>,  'DisconnectNamedPipe',  \
    DnsHostnameToComputerName, A, <.Hostname, .ComputerName, .nSize>,  'DnsHostnameToComputerNameA',  \
    DnsHostnameToComputerName, W, <.Hostname, .ComputerName, .nSize>,  'DnsHostnameToComputerNameW',  \
    DosDateTimeToFileTime, N, <.wFatDate, .wFatTime, .lpFileTime>,  'DosDateTimeToFileTime',  \
    DosPathToSessionPath, A, <.SessionId, .pInPath, .ppOutPath>,  'DosPathToSessionPathA',  \
    DosPathToSessionPath, W, <.SessionId, .pInPath, .ppOutPath>,  'DosPathToSessionPathW',  \
    DuplicateConsoleHandle, N, <NONE>,  'DuplicateConsoleHandle',  \
    DuplicateHandle, N, <.hSourceProcessHandle, .hSourceHandle, .hTargetProcessHandle, .lpTargetHandle, .dwDesiredAccess, .bInheritHandle, .dwOptions>,  'DuplicateHandle',  \
    EncodePointer, N, <NONE>,  'EncodePointer',  \
    EncodeSystemPointer, N, <NONE>,  'EncodeSystemPointer',  \
    EndUpdateResource, A, <.hUpdate, .fDiscard>,  'EndUpdateResourceA',  \
    EndUpdateResource, W, <.hUpdate, .fDiscard>,  'EndUpdateResourceW',  \
    EnterCriticalSection, N, <.lpCriticalSection>,  'EnterCriticalSection',  \
    EnumCalendarInfo, A, <.lpCalInfoEnumProc, .Locale, .Calendar, .CalType>,  'EnumCalendarInfoA',  \
    EnumCalendarInfoEx, A, <.lpCalInfoEnumProcEx, .Locale, .Calendar, .CalType>,  'EnumCalendarInfoExA',  \
    EnumCalendarInfoEx, W, <.lpCalInfoEnumProcEx, .Locale, .Calendar, .CalType>,  'EnumCalendarInfoExW',  \
    EnumCalendarInfo, W, <.lpCalInfoEnumProc, .Locale, .Calendar, .CalType>,  'EnumCalendarInfoW',  \
    EnumDateFormats, A, <.lpDateFmtEnumProc, .Locale, .dwFlags>,  'EnumDateFormatsA',  \
    EnumDateFormatsEx, A, <.lpDateFmtEnumProcEx, .Locale, .dwFlags>,  'EnumDateFormatsExA',  \
    EnumDateFormatsEx, W, <.lpDateFmtEnumProcEx, .Locale, .dwFlags>,  'EnumDateFormatsExW',  \
    EnumDateFormats, W, <.lpDateFmtEnumProc, .Locale, .dwFlags>,  'EnumDateFormatsW',  \
    EnumLanguageGroupLocales, A, <.lpLangGroupLocaleEnumProc, .LanguageGroup, .dwFlags, .lParam>,  'EnumLanguageGroupLocalesA',  \
    EnumLanguageGroupLocales, W, <.lpLangGroupLocaleEnumProc, .LanguageGroup, .dwFlags, .lParam>,  'EnumLanguageGroupLocalesW',  \
    EnumResourceLanguages, A, <.hModule, .lpType, .lpName, .lpEnumFunc, .lParam>,  'EnumResourceLanguagesA',  \
    EnumResourceLanguages, W, <.hModule, .lpType, .lpName, .lpEnumFunc, .lParam>,  'EnumResourceLanguagesW',  \
    EnumResourceNames, A, <.hModule, .lpType, .lpEnumFunc, .lParam>,  'EnumResourceNamesA',  \
    EnumResourceNames, W, <.hModule, .lpType, .lpEnumFunc, .lParam>,  'EnumResourceNamesW',  \
    EnumResourceTypes, A, <.hModule, .lpEnumFunc, .lParam>,  'EnumResourceTypesA',  \
    EnumResourceTypes, W, <.hModule, .lpEnumFunc, .lParam>,  'EnumResourceTypesW',  \
    EnumSystemCodePages, A, <.lpCodePageEnumProc, .dwFlags>,  'EnumSystemCodePagesA',  \
    EnumSystemCodePages, W, <.lpCodePageEnumProc, .dwFlags>,  'EnumSystemCodePagesW',  \
    EnumSystemGeoID, N, <NONE>,  'EnumSystemGeoID',  \
    EnumSystemLanguageGroups, A, <.lpLanguageGroupEnumProc, .dwFlags, .lParam>,  'EnumSystemLanguageGroupsA',  \
    EnumSystemLanguageGroups, W, <.lpLanguageGroupEnumProc, .dwFlags, .lParam>,  'EnumSystemLanguageGroupsW',  \
    EnumSystemLocales, A, <.lpLocaleEnumProc, .dwFlags>,  'EnumSystemLocalesA',  \
    EnumSystemLocales, W, <.lpLocaleEnumProc, .dwFlags>,  'EnumSystemLocalesW',  \
    EnumTimeFormats, A, <.lpTimeFmtEnumProc, .Locale, .dwFlags>,  'EnumTimeFormatsA',  \
    EnumTimeFormats, W, <.lpTimeFmtEnumProc, .Locale, .dwFlags>,  'EnumTimeFormatsW',  \
    EnumUILanguages, A, <.lpUILanguageEnumProc, .dwFlags, .lParam>,  'EnumUILanguagesA',  \
    EnumUILanguages, W, <.lpUILanguageEnumProc, .dwFlags, .lParam>,  'EnumUILanguagesW',  \
    EnumerateLocalComputerNames, A, <NONE>,  'EnumerateLocalComputerNamesA',  \
    EnumerateLocalComputerNames, W, <NONE>,  'EnumerateLocalComputerNamesW',  \
    EraseTape, N, <.hDevice, .dwEraseType, .bimmediate>,  'EraseTape',  \
    EscapeCommFunction, N, <.nCid, .nFunc>,  'EscapeCommFunction',  \
    ExitProcess, N, <.uExitCode>,  'ExitProcess',  \
    ExitThread, N, <.dwExitCode>,  'ExitThread',  \
    ExitVDM, N, <NONE>,  'ExitVDM',  \
    ExpandEnvironmentStrings, A, <.lpSrc, .lpDst, .nSize>,  'ExpandEnvironmentStringsA',  \
    ExpandEnvironmentStrings, W, <.lpSrc, .lpDst, .nSize>,  'ExpandEnvironmentStringsW',  \
    ExpungeConsoleCommandHistory, A, <NONE>,  'ExpungeConsoleCommandHistoryA',  \
    ExpungeConsoleCommandHistory, W, <NONE>,  'ExpungeConsoleCommandHistoryW',  \
    ExtendVirtualBuffer, N, <NONE>,  'ExtendVirtualBuffer',  \
    FatalAppExit, A, <.uAction, .lpMessageText>,  'FatalAppExitA',  \
    FatalAppExit, W, <.uAction, .lpMessageText>,  'FatalAppExitW',  \
    FatalExit, N, <.code>,  'FatalExit',  \
    FileTimeToDosDateTime, N, <.lpFileTime, .lpFatDate, .lpFatTime>,  'FileTimeToDosDateTime',  \
    FileTimeToLocalFileTime, N, <.lpFileTime, .lpLocalFileTime>,  'FileTimeToLocalFileTime',  \
    FileTimeToSystemTime, N, <.lpFileTime, .lpSystemTime>,  'FileTimeToSystemTime',  \
    FillConsoleOutputAttribute, N, <.hConsoleOutput, .wAttribute, .nLength, .dwWriteCoord, .lpNumberOfAttrsWritten>,  'FillConsoleOutputAttribute',  \
    FillConsoleOutputCharacter, A, <.hConsoleOutput, .cCharacter, .nLength, .dwWriteCoord, .lpNumberOfCharsWritten>,  'FillConsoleOutputCharacterA',  \
    FillConsoleOutputCharacter, W, <.hConsoleOutput, .cCharacter, .nLength, .dwWriteCoord, .lpNumberOfCharsWritten>,  'FillConsoleOutputCharacterW',  \
    FindActCtxSectionGuid, N, <NONE>,  'FindActCtxSectionGuid',  \
    FindActCtxSectionString, A, <NONE>,  'FindActCtxSectionStringA',  \
    FindActCtxSectionString, W, <NONE>,  'FindActCtxSectionStringW',  \
    FindAtom, A, <.lpString>,  'FindAtomA',  \
    FindAtom, W, <.lpString>,  'FindAtomW',  \
    FindClose, N, <.hFindFile>,  'FindClose',  \
    FindCloseChangeNotification, N, <.hChangeHandle>,  'FindCloseChangeNotification',  \
    FindFirstChangeNotification, A, <.lpPathName, .bWatchSubtree, .dwNotifyFilter>,  'FindFirstChangeNotificationA',  \
    FindFirstChangeNotification, W, <.lpPathName, .bWatchSubtree, .dwNotifyFilter>,  'FindFirstChangeNotificationW',  \
    FindFirstFile, A, <.lpFileName, .lpFindFileData>,  'FindFirstFileA',  \
    FindFirstFileEx, A, <.lpFileName, .fInfoLevelId, .lpFindFileData, .fSearchOp, .lpSearchFilter, .dwAdditionalFlags>,  'FindFirstFileExA',  \
    FindFirstFileEx, W, <.lpFileName, .fInfoLevelId, .lpFindFileData, .fSearchOp, .lpSearchFilter, .dwAdditionalFlags>,  'FindFirstFileExW',  \
    FindFirstFile, W, <.lpFileName, .lpFindFileData>,  'FindFirstFileW',  \
    FindFirstVolume, A, <.lpszVolumeName, .cchBufferLength>,  'FindFirstVolumeA',  \
    FindFirstVolumeMountPoint, A, <.lpszRootPathName, .lpszVolumeMountPoint, .cchBufferLength>,  'FindFirstVolumeMountPointA',  \
    FindFirstVolumeMountPoint, W, <.lpszRootPathName, .lpszVolumeMountPoint, .cchBufferLength>,  'FindFirstVolumeMountPointW',  \
    FindFirstVolume, W, <.lpszVolumeName, .cchBufferLength>,  'FindFirstVolumeW',  \
    FindNextChangeNotification, N, <.hChangeHandle>,  'FindNextChangeNotification',  \
    FindNextFile, A, <.hFindFile, .lpFindFileData>,  'FindNextFileA',  \
    FindNextFile, W, <.hFindFile, .lpFindFileData>,  'FindNextFileW',  \
    FindNextVolume, A, <.hFindVolume, .lpszVolumeName, .cchBufferLength>,  'FindNextVolumeA',  \
    FindNextVolumeMountPoint, A, <.hFindVolumeMountPoint, .lpszVolumeMountPoint, .cchBufferLength>,  'FindNextVolumeMountPointA',  \
    FindNextVolumeMountPoint, W, <.hFindVolumeMountPoint, .lpszVolumeMountPoint, .cchBufferLength>,  'FindNextVolumeMountPointW',  \
    FindNextVolume, W, <.hFindVolume, .lpszVolumeName, .cchBufferLength>,  'FindNextVolumeW',  \
    FindResource, A, <.hInstance, .lpName, .lpType>,  'FindResourceA',  \
    FindResourceEx, A, <.hModule, .lpType, .lpName, .wLanguage>,  'FindResourceExA',  \
    FindResourceEx, W, <.hModule, .lpType, .lpName, .wLanguage>,  'FindResourceExW',  \
    FindResource, W, <.hInstance, .lpName, .lpType>,  'FindResourceW',  \
    FindVolumeClose, N, <.hFindVolume>,  'FindVolumeClose',  \
    FindVolumeMountPointClose, N, <.hFindVolumeMountPoint>,  'FindVolumeMountPointClose',  \
    FlushConsoleInputBuffer, N, <.hConsoleInput>,  'FlushConsoleInputBuffer',  \
    FlushFileBuffers, N, <.hFile>,  'FlushFileBuffers',  \
    FlushInstructionCache, N, <.hProcess, .lpBaseAddress, .dwSize>,  'FlushInstructionCache',  \
    FlushViewOfFile, N, <.lpBaseAddress, .dwNumberOfBytesToFlush>,  'FlushViewOfFile',  \
    FoldString, A, <.dwMapFlags, .lpSrcStr, .cchSrc, .lpDestStr, .cchDest>,  'FoldStringA',  \
    FoldString, W, <.dwMapFlags, .lpSrcStr, .cchSrc, .lpDestStr, .cchDest>,  'FoldStringW',  \
    FormatMessage, A, <.dwFlags, .lpSource, .dwMessageId, .dwLanguageId, .lpBuffer, .nSize, .Arguments>,  'FormatMessageA',  \
    FormatMessage, W, <.dwFlags, .lpSource, .dwMessageId, .dwLanguageId, .lpBuffer, .nSize, .Arguments>,  'FormatMessageW',  \
    FreeConsole, N, <VOID>,  'FreeConsole',  \
    FreeEnvironmentStrings, A, <.lpsz>,  'FreeEnvironmentStringsA',  \
    FreeEnvironmentStrings, W, <.lpsz>,  'FreeEnvironmentStringsW',  \
    FreeLibrary, N, <.hLibModule>,  'FreeLibrary',  \
    FreeLibraryAndExitThread, N, <.hLibModule, .dwExitCode>,  'FreeLibraryAndExitThread',  \
    FreeResource, N, <.hResData>,  'FreeResource',  \
    FreeUserPhysicalPages, N, <.hProcess, .NumberOfPages, .PageArray>,  'FreeUserPhysicalPages',  \
    FreeVirtualBuffer, N, <NONE>,  'FreeVirtualBuffer',  \
    GenerateConsoleCtrlEvent, N, <.dwCtrlEvent, .dwProcessGroupId>,  'GenerateConsoleCtrlEvent',  \
    GetACP, N, <VOID>,  'GetACP',  \
    GetAtomName, A, <.nAtom, .lpBuffer, .nSize>,  'GetAtomNameA',  \
    GetAtomName, W, <.nAtom, .lpBuffer, .nSize>,  'GetAtomNameW',  \
    GetBinaryType, A, <.lpApplicationName, .lpBinaryType>,  'GetBinaryTypeA',  \
    GetBinaryType, W, <.lpApplicationName, .lpBinaryType>,  'GetBinaryTypeW',  \
    GetCPFileNameFromRegistry, N, <NONE>,  'GetCPFileNameFromRegistry',  \
    GetCPInfo, N, <.CodePage, .lpCPInfo>,  'GetCPInfo',  \
    GetCPInfoEx, A, <.CodePage, .dwFlags, .lpCPInfoEx>,  'GetCPInfoExA',  \
    GetCPInfoEx, W, <.CodePage, .dwFlags, .lpCPInfoEx>,  'GetCPInfoExW',  \
    GetCalendarInfo, A, <.Locale, .Calendar, .CalType, .lpCalData, .cchData, .lpValue>,  'GetCalendarInfoA',  \
    GetCalendarInfo, W, <.Locale, .Calendar, .CalType, .lpCalData, .cchData, .lpValue>,  'GetCalendarInfoW',  \
    GetComPlusPackageInstallStatus, N, <NONE>,  'GetComPlusPackageInstallStatus',  \
    GetCommConfig, N, <.hCommDev, .lpCC, .lpdwSize>,  'GetCommConfig',  \
    GetCommMask, N, <.hFile, .lpEvtMask>,  'GetCommMask',  \
    GetCommModemStatus, N, <.hFile, .lpModemStat>,  'GetCommModemStatus',  \
    GetCommProperties, N, <.hFile, .lpCommProp>,  'GetCommProperties',  \
    GetCommState, N, <.nCid, .lpDCB>,  'GetCommState',  \
    GetCommTimeouts, N, <.hFile, .lpCommTimeouts>,  'GetCommTimeouts',  \
    GetCommandLine, A, <VOID>,  'GetCommandLineA',  \
    GetCommandLine, W, <VOID>,  'GetCommandLineW',  \
    GetCompressedFileSize, A, <.lpFileName, .lpFileSizeHigh>,  'GetCompressedFileSizeA',  \
    GetCompressedFileSize, W, <.lpFileName, .lpFileSizeHigh>,  'GetCompressedFileSizeW',  \
    GetComputerName, A, <.lpBuffer, .nSize>,  'GetComputerNameA',  \
    GetComputerNameEx, A, <.NameType, .lpBuffer, .nSize>,  'GetComputerNameExA',  \
    GetComputerNameEx, W, <.NameType, .lpBuffer, .nSize>,  'GetComputerNameExW',  \
    GetComputerName, W, <.lpBuffer, .nSize>,  'GetComputerNameW',  \
    GetConsoleAlias, A, <NONE>,  'GetConsoleAliasA',  \
    GetConsoleAliasExes, A, <NONE>,  'GetConsoleAliasExesA',  \
    GetConsoleAliasExesLength, A, <NONE>,  'GetConsoleAliasExesLengthA',  \
    GetConsoleAliasExesLength, W, <NONE>,  'GetConsoleAliasExesLengthW',  \
    GetConsoleAliasExes, W, <NONE>,  'GetConsoleAliasExesW',  \
    GetConsoleAlias, W, <NONE>,  'GetConsoleAliasW',  \
    GetConsoleAliases, A, <NONE>,  'GetConsoleAliasesA',  \
    GetConsoleAliasesLength, A, <NONE>,  'GetConsoleAliasesLengthA',  \
    GetConsoleAliasesLength, W, <NONE>,  'GetConsoleAliasesLengthW',  \
    GetConsoleAliases, W, <NONE>,  'GetConsoleAliasesW',  \
    GetConsoleCP, N, <VOID>,  'GetConsoleCP',  \
    GetConsoleCharType, N, <NONE>,  'GetConsoleCharType',  \
    GetConsoleCommandHistory, A, <NONE>,  'GetConsoleCommandHistoryA',  \
    GetConsoleCommandHistoryLength, A, <NONE>,  'GetConsoleCommandHistoryLengthA',  \
    GetConsoleCommandHistoryLength, W, <NONE>,  'GetConsoleCommandHistoryLengthW',  \
    GetConsoleCommandHistory, W, <NONE>,  'GetConsoleCommandHistoryW',  \
    GetConsoleCursorInfo, N, <.hConsoleOutput, .lpConsoleCursorInfo>,  'GetConsoleCursorInfo',  \
    GetConsoleCursorMode, N, <NONE>,  'GetConsoleCursorMode',  \
    GetConsoleDisplayMode, N, <NONE>,  'GetConsoleDisplayMode',  \
    GetConsoleFontInfo, N, <NONE>,  'GetConsoleFontInfo',  \
    GetConsoleFontSize, N, <NONE>,  'GetConsoleFontSize',  \
    GetConsoleHardwareState, N, <NONE>,  'GetConsoleHardwareState',  \
    GetConsoleInputExeName, A, <NONE>,  'GetConsoleInputExeNameA',  \
    GetConsoleInputExeName, W, <NONE>,  'GetConsoleInputExeNameW',  \
    GetConsoleInputWaitHandle, N, <NONE>,  'GetConsoleInputWaitHandle',  \
    GetConsoleKeyboardLayoutName, A, <NONE>,  'GetConsoleKeyboardLayoutNameA',  \
    GetConsoleKeyboardLayoutName, W, <NONE>,  'GetConsoleKeyboardLayoutNameW',  \
    GetConsoleMode, N, <.hConsoleHandle, .lpMode>,  'GetConsoleMode',  \
    GetConsoleNlsMode, N, <NONE>,  'GetConsoleNlsMode',  \
    GetConsoleOutputCP, N, <VOID>,  'GetConsoleOutputCP',  \
    GetConsoleProcessList, N, <NONE>,  'GetConsoleProcessList',  \
    GetConsoleScreenBufferInfo, N, <.hConsoleOutput, .lpConsoleScreenBufferInfo>,  'GetConsoleScreenBufferInfo',  \
    GetConsoleSelectionInfo, N, <NONE>,  'GetConsoleSelectionInfo',  \
    GetConsoleTitle, A, <.lpConsoleTitle, .nSize>,  'GetConsoleTitleA',  \
    GetConsoleTitle, W, <.lpConsoleTitle, .nSize>,  'GetConsoleTitleW',  \
    GetConsoleWindow, N, <NONE>,  'GetConsoleWindow',  \
    GetCurrencyFormat, A, <.Locale, .dwFlags, .lpValue, .lpFormat, .lpCurrencyStr, .cchCurrency>,  'GetCurrencyFormatA',  \
    GetCurrencyFormat, W, <.Locale, .dwFlags, .lpValue, .lpFormat, .lpCurrencyStr, .cchCurrency>,  'GetCurrencyFormatW',  \
    GetCurrentActCtx, N, <NONE>,  'GetCurrentActCtx',  \
    GetCurrentConsoleFont, N, <NONE>,  'GetCurrentConsoleFont',  \
    GetCurrentDirectory, A, <.nBufferLength, .lpBuffer>,  'GetCurrentDirectoryA',  \
    GetCurrentDirectory, W, <.nBufferLength, .lpBuffer>,  'GetCurrentDirectoryW',  \
    GetCurrentProcess, N, <VOID>,  'GetCurrentProcess',  \
    GetCurrentProcessId, N, <VOID>,  'GetCurrentProcessId',  \
    GetCurrentThread, N, <VOID>,  'GetCurrentThread',  \
    GetCurrentThreadId, N, <VOID>,  'GetCurrentThreadId',  \
    GetDateFormat, A, <.Locale, .dwFlags, .lpDate, .lpFormat, .lpDateStr, .cchDate>,  'GetDateFormatA',  \
    GetDateFormat, W, <.Locale, .dwFlags, .lpDate, .lpFormat, .lpDateStr, .cchDate>,  'GetDateFormatW',  \
    GetDefaultCommConfig, A, <.lpszName, .lpCC, .lpdwSize>,  'GetDefaultCommConfigA',  \
    GetDefaultCommConfig, W, <.lpszName, .lpCC, .lpdwSize>,  'GetDefaultCommConfigW',  \
    GetDefaultSortkeySize, N, <NONE>,  'GetDefaultSortkeySize',  \
    GetDevicePowerState, N, <.hDevice, .pfOn>,  'GetDevicePowerState',  \
    GetDiskFreeSpace, A, <.lpRootPathName, .lpSectorsPerCluster, .lpBytesPerSector, .lpNumberOfFreeClusters, .lpTotalNumberOfClusters>,  'GetDiskFreeSpaceA',  \
    GetDiskFreeSpaceEx, A, <.lpDirectoryName, .lpFreeBytesAvailableToCaller, .lpTotalNumberOfBytes, .lpTotalNumberOfFreeBytes>,  'GetDiskFreeSpaceExA',  \
    GetDiskFreeSpaceEx, W, <.lpDirectoryName, .lpFreeBytesAvailableToCaller, .lpTotalNumberOfBytes, .lpTotalNumberOfFreeBytes>,  'GetDiskFreeSpaceExW',  \
    GetDiskFreeSpace, W, <.lpRootPathName, .lpSectorsPerCluster, .lpBytesPerSector, .lpNumberOfFreeClusters, .lpTotalNumberOfClusters>,  'GetDiskFreeSpaceW',  \
    GetDllDirectory, A, <NONE>,  'GetDllDirectoryA',  \
    GetDllDirectory, W, <NONE>,  'GetDllDirectoryW',  \
    GetDriveType, A, <.nDrive>,  'GetDriveTypeA',  \
    GetDriveType, W, <.nDrive>,  'GetDriveTypeW',  \
    GetEnvironmentStrings, A, <VOID>,  'GetEnvironmentStringsA',  \
    GetEnvironmentStrings, W, <VOID>,  'GetEnvironmentStringsW',  \
    GetEnvironmentVariable, A, <.lpName, .lpBuffer, .nSize>,  'GetEnvironmentVariableA',  \
    GetEnvironmentVariable, W, <.lpName, .lpBuffer, .nSize>,  'GetEnvironmentVariableW',  \
    GetExitCodeProcess, N, <.hProcess, .lpExitCode>,  'GetExitCodeProcess',  \
    GetExitCodeThread, N, <.hThread, .lpExitCode>,  'GetExitCodeThread',  \
    GetExpandedName, A, <.lpszSource, .lpszBuffer>,  'GetExpandedNameA',  \
    GetExpandedName, W, <.lpszSource, .lpszBuffer>,  'GetExpandedNameW',  \
    GetFileAttributes, A, <.lpFileName>,  'GetFileAttributesA',  \
    GetFileAttributesEx, A, <.lpFileName, .fInfoLevelId, .lpFileInformation>,  'GetFileAttributesExA',  \
    GetFileAttributesEx, W, <.lpFileName, .fInfoLevelId, .lpFileInformation>,  'GetFileAttributesExW',  \
    GetFileAttributes, W, <.lpFileName>,  'GetFileAttributesW',  \
    GetFileInformationByHandle, N, <.hFile, .lpFileInformation>,  'GetFileInformationByHandle',  \
    GetFileSize, N, <.hFile, .lpFileSizeHigh>,  'GetFileSize',  \
    GetFileSizeEx, N, <.hFile, .lpFileSize>,  'GetFileSizeEx',  \
    GetFileTime, N, <.hFile, .lpCreationTime, .lpLastAccessTime, .lpLastWriteTime>,  'GetFileTime',  \
    GetFileType, N, <.hFile>,  'GetFileType',  \
    GetFirmwareEnvironmentVariable, A, <NONE>,  'GetFirmwareEnvironmentVariableA',  \
    GetFirmwareEnvironmentVariable, W, <NONE>,  'GetFirmwareEnvironmentVariableW',  \
    GetFullPathName, A, <.lpFileName, .nBufferLength, .lpBuffer, .lpFilePart>,  'GetFullPathNameA',  \
    GetFullPathName, W, <.lpFileName, .nBufferLength, .lpBuffer, .lpFilePart>,  'GetFullPathNameW',  \
    GetGeoInfo, A, <NONE>,  'GetGeoInfoA',  \
    GetGeoInfo, W, <NONE>,  'GetGeoInfoW',  \
    GetHandleContext, N, <NONE>,  'GetHandleContext',  \
    GetHandleInformation, N, <.hObject, .lpdwFlags>,  'GetHandleInformation',  \
    GetLargestConsoleWindowSize, N, <.hConsoleOutput>,  'GetLargestConsoleWindowSize',  \
    GetLastError, N, <VOID>,  'GetLastError',  \
    GetLinguistLangSize, N, <NONE>,  'GetLinguistLangSize',  \
    GetLocalTime, N, <.lpSystemTime>,  'GetLocalTime',  \
    GetLocaleInfo, A, <.Locale, .LCType, .lpLCData, .cchData>,  'GetLocaleInfoA',  \
    GetLocaleInfo, W, <.Locale, .LCType, .lpLCData, .cchData>,  'GetLocaleInfoW',  \
    GetLogicalDriveStrings, A, <.nBufferLength, .lpBuffer>,  'GetLogicalDriveStringsA',  \
    GetLogicalDriveStrings, W, <.nBufferLength, .lpBuffer>,  'GetLogicalDriveStringsW',  \
    GetLogicalDrives, N, <VOID>,  'GetLogicalDrives',  \
    GetLogicalProcessorInformation, N, <NONE>,  'GetLogicalProcessorInformation',  \
    GetLongPathName, A, <.lpszShortPath, .lpszLongPath, .cchBuffer>,  'GetLongPathNameA',  \
    GetLongPathName, W, <.lpszShortPath, .lpszLongPath, .cchBuffer>,  'GetLongPathNameW',  \
    GetMailslotInfo, N, <.hMailslot, .lpMaxMessageSize, .lpNextSize, .lpMessageCount, .lpReadTimeout>,  'GetMailslotInfo',  \
    GetModuleFileName, A, <.hModule, .lpFileName, .nSize>,  'GetModuleFileNameA',  \
    GetModuleFileName, W, <.hModule, .lpFileName, .nSize>,  'GetModuleFileNameW',  \
    GetModuleHandle, A, <.lpModuleName>,  'GetModuleHandleA',  \
    GetModuleHandleEx, A, <NONE>,  'GetModuleHandleExA',  \
    GetModuleHandleEx, W, <NONE>,  'GetModuleHandleExW',  \
    GetModuleHandle, W, <.lpModuleName>,  'GetModuleHandleW',  \
    GetNamedPipeHandleState, A, <.hNamedPipe, .lpState, .lpCurInstances, .lpMaxCollectionCount, .lpCollectDataTimeout, .lpUserName, .nMaxUserNameSize>,  'GetNamedPipeHandleStateA',  \
    GetNamedPipeHandleState, W, <.hNamedPipe, .lpState, .lpCurInstances, .lpMaxCollectionCount, .lpCollectDataTimeout, .lpUserName, .nMaxUserNameSize>,  'GetNamedPipeHandleStateW',  \
    GetNamedPipeInfo, N, <.hNamedPipe, .lpFlags, .lpOutBufferSize, .lpInBufferSize, .lpMaxInstances>,  'GetNamedPipeInfo',  \
    GetNativeSystemInfo, N, <NONE>,  'GetNativeSystemInfo',  \
    GetNextVDMCommand, N, <NONE>,  'GetNextVDMCommand',  \
    GetNlsSectionName, N, <NONE>,  'GetNlsSectionName',  \
    GetNumaAvailableMemory, N, <NONE>,  'GetNumaAvailableMemory',  \
    GetNumaAvailableMemoryNode, N, <NONE>,  'GetNumaAvailableMemoryNode',  \
    GetNumaHighestNodeNumber, N, <NONE>,  'GetNumaHighestNodeNumber',  \
    GetNumaNodeProcessorMask, N, <NONE>,  'GetNumaNodeProcessorMask',  \
    GetNumaProcessorMap, N, <NONE>,  'GetNumaProcessorMap',  \
    GetNumaProcessorNode, N, <NONE>,  'GetNumaProcessorNode',  \
    GetNumberFormat, A, <.Locale, .dwFlags, .lpValue, .lpFormat, .lpNumberStr, .cchNumber>,  'GetNumberFormatA',  \
    GetNumberFormat, W, <.Locale, .dwFlags, .lpValue, .lpFormat, .lpNumberStr, .cchNumber>,  'GetNumberFormatW',  \
    GetNumberOfConsoleFonts, N, <NONE>,  'GetNumberOfConsoleFonts',  \
    GetNumberOfConsoleInputEvents, N, <.hConsoleInput, .lpNumberOfEvents>,  'GetNumberOfConsoleInputEvents',  \
    GetNumberOfConsoleMouseButtons, N, <.lpNumberOfMouseButtons>,  'GetNumberOfConsoleMouseButtons',  \
    GetOEMCP, N, <VOID>,  'GetOEMCP',  \
    GetOverlappedResult, N, <.hFile, .lpOverlapped, .lpNumberOfBytesTransferred, .bWait>,  'GetOverlappedResult',  \
    GetPriorityClass, N, <.hProcess>,  'GetPriorityClass',  \
    GetPrivateProfileInt, A, <.lpApplicationName, .lpKeyName, .nDefault, .lpFileName>,  'GetPrivateProfileIntA',  \
    GetPrivateProfileInt, W, <.lpApplicationName, .lpKeyName, .nDefault, .lpFileName>,  'GetPrivateProfileIntW',  \
    GetPrivateProfileSection, A, <.lpAppName, .lpReturnedString, .nSize, .lpFileName>,  'GetPrivateProfileSectionA',  \
    GetPrivateProfileSectionNames, A, <.lpszReturnBuffer, .nSize, .lpFileName>,  'GetPrivateProfileSectionNamesA',  \
    GetPrivateProfileSectionNames, W, <.lpszReturnBuffer, .nSize, .lpFileName>,  'GetPrivateProfileSectionNamesW',  \
    GetPrivateProfileSection, W, <.lpAppName, .lpReturnedString, .nSize, .lpFileName>,  'GetPrivateProfileSectionW',  \
    GetPrivateProfileString, A, <.lpApplicationName, .lpKeyName, .lpDefault, .lpReturnedString, .nSize, .lpFileName>,  'GetPrivateProfileStringA',  \
    GetPrivateProfileString, W, <.lpApplicationName, .lpKeyName, .lpDefault, .lpReturnedString, .nSize, .lpFileName>,  'GetPrivateProfileStringW',  \
    GetPrivateProfileStruct, A, <.lpszSection, .lpszKey, .lpStruct, .uSizeStruct, .szFile>,  'GetPrivateProfileStructA',  \
    GetPrivateProfileStruct, W, <.lpszSection, .lpszKey, .lpStruct, .uSizeStruct, .szFile>,  'GetPrivateProfileStructW',  \
    GetProcAddress, N, <.hModule, .lpProcName>,  'GetProcAddress',  \
    GetProcessAffinityMask, N, <.hProcess, .lpProcessAffinityMask, .SystemAffinityMask>,  'GetProcessAffinityMask',  \
    GetProcessDEPPolicy, N, <NONE>,  'GetProcessDEPPolicy',  \
    GetProcessHandleCount, N, <NONE>,  'GetProcessHandleCount',  \
    GetProcessHeap, N, <VOID>,  'GetProcessHeap',  \
    GetProcessHeaps, N, <.NumberOfHeaps, .ProcessHeaps>,  'GetProcessHeaps',  \
    GetProcessId, N, <NONE>,  'GetProcessId',  \
    GetProcessIoCounters, N, <.hProcess, .lpIoCounters>,  'GetProcessIoCounters',  \
    GetProcessPriorityBoost, N, <.hProcess, .pDisablePriorityBoost>,  'GetProcessPriorityBoost',  \
    GetProcessShutdownParameters, N, <.lpdwLevel, .lpdwFlags>,  'GetProcessShutdownParameters',  \
    GetProcessTimes, N, <.hProcess, .lpCreationTime, .lpExitTime, .lpKernelTime, .lpUserTime>,  'GetProcessTimes',  \
    GetProcessVersion, N, <.ProcessId>,  'GetProcessVersion',  \
    GetProcessWorkingSetSize, N, <.hProcess, .lpMinimumWorkingSetSize, .lpMaximumWorkingSetSize>,  'GetProcessWorkingSetSize',  \
    GetProfileInt, A, <.lpAppName, .lpKeyName, .nDefault>,  'GetProfileIntA',  \
    GetProfileInt, W, <.lpAppName, .lpKeyName, .nDefault>,  'GetProfileIntW',  \
    GetProfileSection, A, <.lpAppName, .lpReturnedString, .nSize>,  'GetProfileSectionA',  \
    GetProfileSection, W, <.lpAppName, .lpReturnedString, .nSize>,  'GetProfileSectionW',  \
    GetProfileString, A, <.lpAppName, .lpKeyName, .lpDefault, .lpReturnedString, .nSize>,  'GetProfileStringA',  \
    GetProfileString, W, <.lpAppName, .lpKeyName, .lpDefault, .lpReturnedString, .nSize>,  'GetProfileStringW',  \
    GetQueuedCompletionStatus, N, <.CompletionPort, .lpNumberOfBytesTransferred, .lpCompletionKey, .lpOverlapped, .dwMilliseconds>,  'GetQueuedCompletionStatus',  \
    GetShortPathName, A, <.lpszLongPath, .lpszShortPath, .cchBuffer>,  'GetShortPathNameA',  \
    GetShortPathName, W, <.lpszLongPath, .lpszShortPath, .cchBuffer>,  'GetShortPathNameW',  \
    GetStartupInfo, A, <.lpStartupInfo>,  'GetStartupInfoA',  \
    GetStartupInfo, W, <.lpStartupInfo>,  'GetStartupInfoW',  \
    GetStdHandle, N, <.nStdHandle>,  'GetStdHandle',  \
    GetStringType, A, <.Locale, .dwInfoType, .lpSrcStr, .cchSrc, .lpCharType>,  'GetStringTypeA',  \
    GetStringTypeEx, A, <.Locale, .dwInfoType, .lpSrcStr, .cchSrc, .lpCharType>,  'GetStringTypeExA',  \
    GetStringTypeEx, W, <.Locale, .dwInfoType, .lpSrcStr, .cchSrc, .lpCharType>,  'GetStringTypeExW',  \
    GetStringType, W, <.Locale, .dwInfoType, .lpSrcStr, .cchSrc, .lpCharType>,  'GetStringTypeW',  \
    GetSystemDEPPolicy, N, <NONE>,  'GetSystemDEPPolicy',  \
    GetSystemDefaultLCID, N, <VOID>,  'GetSystemDefaultLCID',  \
    GetSystemDefaultLangID, N, <VOID>,  'GetSystemDefaultLangID',  \
    GetSystemDefaultUILanguage, N, <VOID>,  'GetSystemDefaultUILanguage',  \
    GetSystemDirectory, A, <.lpBuffer, .nSize>,  'GetSystemDirectoryA',  \
    GetSystemDirectory, W, <.lpBuffer, .nSize>,  'GetSystemDirectoryW',  \
    GetSystemInfo, N, <.lpSystemInfo>,  'GetSystemInfo',  \
    GetSystemPowerStatus, N, <.lpSystemPowerStatus>,  'GetSystemPowerStatus',  \
    GetSystemRegistryQuota, N, <NONE>,  'GetSystemRegistryQuota',  \
    GetSystemTime, N, <.lpSystemTime>,  'GetSystemTime',  \
    GetSystemTimeAdjustment, N, <.lpTimeAdjustment, .lpTimeIncrement, .lpTimeAdjustmentDisabled>,  'GetSystemTimeAdjustment',  \
    GetSystemTimeAsFileTime, N, <.lpSystemTimeAsFileTime>,  'GetSystemTimeAsFileTime',  \
    GetSystemTimes, N, <NONE>,  'GetSystemTimes',  \
    GetSystemWindowsDirectory, A, <.lpBuffer, .uSize>,  'GetSystemWindowsDirectoryA',  \
    GetSystemWindowsDirectory, W, <.lpBuffer, .uSize>,  'GetSystemWindowsDirectoryW',  \
    GetSystemWow64Directory, A, <NONE>,  'GetSystemWow64DirectoryA',  \
    GetSystemWow64Directory, W, <NONE>,  'GetSystemWow64DirectoryW',  \
    GetTapeParameters, N, <.hDevice, .dwOperation, .lpdwSize, .lpTapeInformation>,  'GetTapeParameters',  \
    GetTapePosition, N, <.hDevice, .dwPositionType, .lpdwPartition, .lpdwOffsetLow, .lpdwOffsetHigh>,  'GetTapePosition',  \
    GetTapeStatus, N, <.hDevice>,  'GetTapeStatus',  \
    GetTempFileName, A, <.lpszPath, .lpPrefixString, .wUnique, .lpTempFileName>,  'GetTempFileNameA',  \
    GetTempFileName, W, <.lpszPath, .lpPrefixString, .wUnique, .lpTempFileName>,  'GetTempFileNameW',  \
    GetTempPath, A, <.nBufferLength, .lpBuffer>,  'GetTempPathA',  \
    GetTempPath, W, <.nBufferLength, .lpBuffer>,  'GetTempPathW',  \
    GetThreadContext, N, <.hThread, .lpContext>,  'GetThreadContext',  \
    GetThreadIOPendingFlag, N, <NONE>,  'GetThreadIOPendingFlag',  \
    GetThreadLocale, N, <VOID>,  'GetThreadLocale',  \
    GetThreadPriority, N, <.hThread>,  'GetThreadPriority',  \
    GetThreadPriorityBoost, N, <.hThread, .pDisablePriorityBoost>,  'GetThreadPriorityBoost',  \
    GetThreadSelectorEntry, N, <.hThread, .dwSelector, .lpSelectorEntry>,  'GetThreadSelectorEntry',  \
    GetThreadTimes, N, <.hThread, .lpCreationTime, .lpExitTime, .lpKernelTime, .lpUserTime>,  'GetThreadTimes',  \
    GetTickCount, N, <VOID>,  'GetTickCount',  \
    GetTimeFormat, A, <.Locale, .dwFlags, .lpTime, .lpFormat, .lpTimeStr, .cchTime>,  'GetTimeFormatA',  \
    GetTimeFormat, W, <.Locale, .dwFlags, .lpTime, .lpFormat, .lpTimeStr, .cchTime>,  'GetTimeFormatW',  \
    GetTimeZoneInformation, N, <.lpTimeZoneInformation>,  'GetTimeZoneInformation',  \
    GetUserDefaultLCID, N, <VOID>,  'GetUserDefaultLCID',  \
    GetUserDefaultLangID, N, <VOID>,  'GetUserDefaultLangID',  \
    GetUserDefaultUILanguage, N, <VOID>,  'GetUserDefaultUILanguage',  \
    GetUserGeoID, N, <NONE>,  'GetUserGeoID',  \
    GetVDMCurrentDirectories, N, <NONE>,  'GetVDMCurrentDirectories',  \
    GetVersion, N, <VOID>,  'GetVersion',  \
    GetVersionEx, A, <.lpVersionInformation>,  'GetVersionExA',  \
    GetVersionEx, W, <.lpVersionInformation>,  'GetVersionExW',  \
    GetVolumeInformation, A, <.lpRootPathName, .lpVolumeNameBuffer, .nVolumeNameSize, .lpVolumeSerialNumber, .lpMaximumComponentLength, .lpFileSystemFlags, .lpFileSystemNameBuffer, .nFileSystemNameSize>,  'GetVolumeInformationA',  \
    GetVolumeInformation, W, <.lpRootPathName, .lpVolumeNameBuffer, .nVolumeNameSize, .lpVolumeSerialNumber, .lpMaximumComponentLength, .lpFileSystemFlags, .lpFileSystemNameBuffer, .nFileSystemNameSize>,  'GetVolumeInformationW',  \
    GetVolumeNameForVolumeMountPoint, A, <.lpszVolumeMountPoint, .lpszVolumeName, .cchBufferLength>,  'GetVolumeNameForVolumeMountPointA',  \
    GetVolumeNameForVolumeMountPoint, W, <.lpszVolumeMountPoint, .lpszVolumeName, .cchBufferLength>,  'GetVolumeNameForVolumeMountPointW',  \
    GetVolumePathName, A, <.lpszFileName, .lpszVolumePathName, .cchBufferLength>,  'GetVolumePathNameA',  \
    GetVolumePathName, W, <.lpszFileName, .lpszVolumePathName, .cchBufferLength>,  'GetVolumePathNameW',  \
    GetVolumePathNamesForVolumeName, A, <NONE>,  'GetVolumePathNamesForVolumeNameA',  \
    GetVolumePathNamesForVolumeName, W, <NONE>,  'GetVolumePathNamesForVolumeNameW',  \
    GetWindowsDirectory, A, <.lpBuffer, .nSize>,  'GetWindowsDirectoryA',  \
    GetWindowsDirectory, W, <.lpBuffer, .nSize>,  'GetWindowsDirectoryW',  \
    GetWriteWatch, N, <.dwFlags, .lpBaseAddress, .dwRegionSize, .lpAddresses, .lpdwCount, .lpdwGranularity>,  'GetWriteWatch',  \
    GlobalAddAtom, A, <.lpString>,  'GlobalAddAtomA',  \
    GlobalAddAtom, W, <.lpString>,  'GlobalAddAtomW',  \
    GlobalAlloc, N, <.uFlags, .dwBytes>,  'GlobalAlloc',  \
    GlobalCompact, N, <.dwMinFree>,  'GlobalCompact',  \
    GlobalDeleteAtom, N, <.nAtom>,  'GlobalDeleteAtom',  \
    GlobalFindAtom, A, <.lpString>,  'GlobalFindAtomA',  \
    GlobalFindAtom, W, <.lpString>,  'GlobalFindAtomW',  \
    GlobalFix, N, <.hMem>,  'GlobalFix',  \
    GlobalFlags, N, <.hMem>,  'GlobalFlags',  \
    GlobalFree, N, <.hMem>,  'GlobalFree',  \
    GlobalGetAtomName, A, <.nAtom, .lpBuffer, .nSize>,  'GlobalGetAtomNameA',  \
    GlobalGetAtomName, W, <.nAtom, .lpBuffer, .nSize>,  'GlobalGetAtomNameW',  \
    GlobalHandle, N, <.wMem>,  'GlobalHandle',  \
    GlobalLock, N, <.hMem>,  'GlobalLock',  \
    GlobalMemoryStatus, N, <.lpBuffer>,  'GlobalMemoryStatus',  \
    GlobalMemoryStatusEx, N, <.lpBuffer>,  'GlobalMemoryStatusEx',  \
    GlobalReAlloc, N, <.hMem, .dwBytes, .wFlags>,  'GlobalReAlloc',  \
    GlobalSize, N, <.hMem>,  'GlobalSize',  \
    GlobalUnWire, N, <.hMem>,  'GlobalUnWire',  \
    GlobalUnfix, N, <.hMem>,  'GlobalUnfix',  \
    GlobalUnlock, N, <.hMem>,  'GlobalUnlock',  \
    GlobalWire, N, <.hMem>,  'GlobalWire',  \
    Heap32First, N, <.lphe, .th32ProcessID, .th32HeapID>,  'Heap32First',  \
    Heap32ListFirst, N, <.hSnapshot, .lphl>,  'Heap32ListFirst',  \
    Heap32ListNext, N, <.hSnapshot, .lphl>,  'Heap32ListNext',  \
    Heap32Next, N, <.lphe>,  'Heap32Next',  \
    HeapAlloc, N, <.hHeap, .dwFlags, .dwBytes>,  'HeapAlloc',  \
    HeapCompact, N, <.hHeap, .dwFlags>,  'HeapCompact',  \
    HeapCreate, N, <.flOptions, .dwInitialSize, .dwMaximumSize>,  'HeapCreate',  \
    HeapCreateTags, W, <NONE>,  'HeapCreateTagsW',  \
    HeapDestroy, N, <.hHeap>,  'HeapDestroy',  \
    HeapExtend, N, <NONE>,  'HeapExtend',  \
    HeapFree, N, <.hHeap, .dwFlags, .lpMem>,  'HeapFree',  \
    HeapLock, N, <.hHeap>,  'HeapLock',  \
    HeapQueryInformation, N, <NONE>,  'HeapQueryInformation',  \
    HeapQueryTag, W, <NONE>,  'HeapQueryTagW',  \
    HeapReAlloc, N, <.hHeap, .dwFlags, .lpMem, .dwBytes>,  'HeapReAlloc',  \
    HeapSetInformation, N, <NONE>,  'HeapSetInformation',  \
    HeapSize, N, <.hHeap, .dwFlags, .lpMem>,  'HeapSize',  \
    HeapSummary, N, <NONE>,  'HeapSummary',  \
    HeapUnlock, N, <.hHeap>,  'HeapUnlock',  \
    HeapUsage, N, <NONE>,  'HeapUsage',  \
    HeapValidate, N, <.hHeap, .dwFlags, .lpMem>,  'HeapValidate',  \
    HeapWalk, N, <.hHeap, .lpEntry>,  'HeapWalk',  \
    InitAtomTable, N, <.nSize>,  'InitAtomTable',  \
    InitializeCriticalSection, N, <.lpCriticalSection>,  'InitializeCriticalSection',  \
    InitializeCriticalSectionAndSpinCount, N, <.lpCriticalSection, .dwSpinCount>,  'InitializeCriticalSectionAndSpinCount',  \
    InitializeSListHead, N, <NONE>,  'InitializeSListHead',  \
    InterlockedCompareExchange, N, <.Destination, .Exchange, .Comperand>,  'InterlockedCompareExchange',  \
    InterlockedDecrement, N, <.lpAddend>,  'InterlockedDecrement',  \
    InterlockedExchange, N, <.Target, .Value>,  'InterlockedExchange',  \
    InterlockedExchangeAdd, N, <.Addend, .Value>,  'InterlockedExchangeAdd',  \
    InterlockedFlushSList, N, <NONE>,  'InterlockedFlushSList',  \
    InterlockedIncrement, N, <.lpAddend>,  'InterlockedIncrement',  \
    InterlockedPopEntrySList, N, <NONE>,  'InterlockedPopEntrySList',  \
    InterlockedPushEntrySList, N, <NONE>,  'InterlockedPushEntrySList',  \
    InvalidateConsoleDIBits, N, <NONE>,  'InvalidateConsoleDIBits',  \
    IsBadCodePtr, N, <.lpfn>,  'IsBadCodePtr',  \
    IsBadHugeReadPtr, N, <.lp, .ucb>,  'IsBadHugeReadPtr',  \
    IsBadHugeWritePtr, N, <.lp, .ucb>,  'IsBadHugeWritePtr',  \
    IsBadReadPtr, N, <.lp, .ucb>,  'IsBadReadPtr',  \
    IsBadStringPtr, A, <.lpsz, .ucchMax>,  'IsBadStringPtrA',  \
    IsBadStringPtr, W, <.lpsz, .ucchMax>,  'IsBadStringPtrW',  \
    IsBadWritePtr, N, <.lp, .ucb>,  'IsBadWritePtr',  \
    IsDBCSLeadByte, N, <.bTestChar>,  'IsDBCSLeadByte',  \
    IsDBCSLeadByteEx, N, <.CodePage, .TestChar>,  'IsDBCSLeadByteEx',  \
    IsDebuggerPresent, N, <VOID>,  'IsDebuggerPresent',  \
    IsProcessInJob, N, <NONE>,  'IsProcessInJob',  \
    IsProcessorFeaturePresent, N, <.ProcessorFeature>,  'IsProcessorFeaturePresent',  \
    IsSystemResumeAutomatic, N, <VOID>,  'IsSystemResumeAutomatic',  \
    IsValidCodePage, N, <.CodePage>,  'IsValidCodePage',  \
    IsValidLanguageGroup, N, <.LanguageGroup, .dwFlags>,  'IsValidLanguageGroup',  \
    IsValidLocale, N, <.Locale, .dwFlags>,  'IsValidLocale',  \
    IsValidUILanguage, N, <NONE>,  'IsValidUILanguage',  \
    IsWow64Process, N, <NONE>,  'IsWow64Process',  \
    LCMapString, A, <.Locale, .dwMapFlags, .lpSrcStr, .cchSrc, .lpDestStr, .cchDest>,  'LCMapStringA',  \
    LCMapString, W, <.Locale, .dwMapFlags, .lpSrcStr, .cchSrc, .lpDestStr, .cchDest>,  'LCMapStringW',  \
    LZClose, N, <.hfFile>,  'LZClose',  \
    LZCloseFile, N, <NONE>,  'LZCloseFile',  \
    LZCopy, N, <.hfSource, .hfDest>,  'LZCopy',  \
    LZCreateFile, W, <NONE>,  'LZCreateFileW',  \
    LZDone, N, <VOID>,  'LZDone',  \
    LZInit, N, <.hfSrc>,  'LZInit',  \
    LZOpenFile, A, <.lpszFile, .lpOf, .style>,  'LZOpenFileA',  \
    LZOpenFile, W, <.lpszFile, .lpOf, .style>,  'LZOpenFileW',  \
    LZRead, N, <.hfFile, .lpvBuf, .cbread>,  'LZRead',  \
    LZSeek, N, <.hfFile, .lOffset, .nOrigin>,  'LZSeek',  \
    LZStart, N, <VOID>,  'LZStart',  \
    LeaveCriticalSection, N, <.lpCriticalSection>,  'LeaveCriticalSection',  \
    LoadLibrary, A, <.lpLibFileName>,  'LoadLibraryA',  \
    LoadLibraryEx, A, <.lpLibFileName, .hFile, .dwFlags>,  'LoadLibraryExA',  \
    LoadLibraryEx, W, <.lpLibFileName, .hFile, .dwFlags>,  'LoadLibraryExW',  \
    LoadLibrary, W, <.lpLibFileName>,  'LoadLibraryW',  \
    LoadModule, N, <.lpModuleName, .lpParameterBlock>,  'LoadModule',  \
    LoadResource, N, <.hInstance, .hResInfo>,  'LoadResource',  \
    LocalAlloc, N, <.wFlags, .wBytes>,  'LocalAlloc',  \
    LocalCompact, N, <.uMinFree>,  'LocalCompact',  \
    LocalFileTimeToFileTime, N, <.lpLocalFileTime, .lpFileTime>,  'LocalFileTimeToFileTime',  \
    LocalFlags, N, <.hMem>,  'LocalFlags',  \
    LocalFree, N, <.hMem>,  'LocalFree',  \
    LocalHandle, N, <.wMem>,  'LocalHandle',  \
    LocalLock, N, <.hMem>,  'LocalLock',  \
    LocalReAlloc, N, <.hMem, .wBytes, .wFlags>,  'LocalReAlloc',  \
    LocalShrink, N, <.hMem, .cbNewSize>,  'LocalShrink',  \
    LocalSize, N, <.hMem>,  'LocalSize',  \
    LocalUnlock, N, <.hMem>,  'LocalUnlock',  \
    LockFile, N, <.hFile, .dwFileOffsetLow, .dwFileOffsetHigh, .nNumberOfBytesToLockLow, .nNumberOfBytesToLockHigh>,  'LockFile',  \
    LockFileEx, N, <.hFile, .dwFlags, .dwReserved, .nNumberOfBytesToLockLow, .nNumberOfBytesToLockHigh, .lpOverlapped>,  'LockFileEx',  \
    LockResource, N, <.hResData>,  'LockResource',  \
    MapUserPhysicalPages, N, <.VirtualAddress, .NumberOfPages, .PageArray>,  'MapUserPhysicalPages',  \
    MapUserPhysicalPagesScatter, N, <.VirtualAddresses, .NumberOfPages, .PageArray>,  'MapUserPhysicalPagesScatter',  \
    MapViewOfFile, N, <.hFileMappingObject, .dwDesiredAccess, .dwFileOffsetHigh, .dwFileOffsetLow, .dwNumberOfBytesToMap>,  'MapViewOfFile',  \
    MapViewOfFileEx, N, <.hFileMappingObject, .dwDesiredAccess, .dwFileOffsetHigh, .dwFileOffsetLow, .dwNumberOfBytesToMap, .lpBaseAddress>,  'MapViewOfFileEx',  \
    Module32First, A, <.hSnapshot, .lpme>,  'Module32First',  \
    Module32First, W, <.hSnapshot, .lpme>,  'Module32FirstW',  \
    Module32Next, A, <.hSnapshot, .lpme>,  'Module32Next',  \
    Module32Next, W, <.hSnapshot, .lpme>,  'Module32NextW',  \
    MoveFile, A, <.lpExistingFileName, .lpNewFileName>,  'MoveFileA',  \
    MoveFileEx, A, <.lpExistingFileName, .lpNewFileName, .dwFlags>,  'MoveFileExA',  \
    MoveFileEx, W, <.lpExistingFileName, .lpNewFileName, .dwFlags>,  'MoveFileExW',  \
    MoveFile, W, <.lpExistingFileName, .lpNewFileName>,  'MoveFileW',  \
    MoveFileWithProgress, A, <.lpExistingFileName, .lpNewFileName, .lpProgressRoutine, .lpData, .dwFlags>,  'MoveFileWithProgressA',  \
    MoveFileWithProgress, W, <.lpExistingFileName, .lpNewFileName, .lpProgressRoutine, .lpData, .dwFlags>,  'MoveFileWithProgressW',  \
    MulDiv, N, <.nNumber, .nNumerator, .nDenominator>,  'MulDiv',  \
    MultiByteToWideChar, N, <.CodePage, .dwFlags, .lpMultiByteStr, .cchMultiByte, .lpWideCharStr, .cchWideChar>,  'MultiByteToWideChar',  \
    NlsConvertIntegerToString, N, <NONE>,  'NlsConvertIntegerToString',  \
    NlsGetCacheUpdateCount, N, <NONE>,  'NlsGetCacheUpdateCount',  \
    NlsResetProcessLocale, N, <NONE>,  'NlsResetProcessLocale',  \
    NumaVirtualQueryNode, N, <NONE>,  'NumaVirtualQueryNode',  \
    OpenConsole, W, <NONE>,  'OpenConsoleW',  \
    OpenDataFile, N, <NONE>,  'OpenDataFile',  \
    OpenEvent, A, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenEventA',  \
    OpenEvent, W, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenEventW',  \
    OpenFile, N, <.lpFileName, .lpReOpenBuff, .wStyle>,  'OpenFile',  \
    OpenFileMapping, A, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenFileMappingA',  \
    OpenFileMapping, W, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenFileMappingW',  \
    OpenJobObject, A, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenJobObjectA',  \
    OpenJobObject, W, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenJobObjectW',  \
    OpenMutex, A, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenMutexA',  \
    OpenMutex, W, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenMutexW',  \
    OpenProcess, N, <.dwDesiredAccess, .bInheritHandle, .dwProcessId>,  'OpenProcess',  \
    OpenProfileUserMapping, N, <NONE>,  'OpenProfileUserMapping',  \
    OpenSemaphore, A, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenSemaphoreA',  \
    OpenSemaphore, W, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenSemaphoreW',  \
    OpenThread, N, <.dwDesiredAccess, .bInheritHandle, .dwThreadId>,  'OpenThread',  \
    OpenWaitableTimer, A, <.dwDesiredAccess, .bInheritHandle, .lpTimerName>,  'OpenWaitableTimerA',  \
    OpenWaitableTimer, W, <.dwDesiredAccess, .bInheritHandle, .lpTimerName>,  'OpenWaitableTimerW',  \
    OutputDebugString, A, <.lpOutputString>,  'OutputDebugStringA',  \
    OutputDebugString, W, <.lpOutputString>,  'OutputDebugStringW',  \
    PeekConsoleInput, A, <.hConsoleInput, .lpBuffer, .nLength, .lpNumberOfEventsRead>,  'PeekConsoleInputA',  \
    PeekConsoleInput, W, <.hConsoleInput, .lpBuffer, .nLength, .lpNumberOfEventsRead>,  'PeekConsoleInputW',  \
    PeekNamedPipe, N, <.hNamedPipe, .lpBuffer, .nBufferSize, .lpBytesRead, .lpTotalBytesAvail, .lpBytesLeftThisMessage>,  'PeekNamedPipe',  \
    PostQueuedCompletionStatus, N, <.CompletionPort, .dwNumberOfBytesTransferred, .dwCompletionKey, .lpOverlapped>,  'PostQueuedCompletionStatus',  \
    PrepareTape, N, <.hDevice, .dwOperation, .bimmediate>,  'PrepareTape',  \
    PrivCopyFileEx, W, <NONE>,  'PrivCopyFileExW',  \
    PrivMoveFileIdentity, W, <NONE>,  'PrivMoveFileIdentityW',  \
    Process32First, A, <.hSnapshot, .lppe>,  'Process32First',  \
    Process32First, W, <.hSnapshot, .lppe>,  'Process32FirstW',  \
    Process32Next, A, <.hSnapshot, .lppe>,  'Process32Next',  \
    Process32Next, W, <.hSnapshot, .lppe>,  'Process32NextW',  \
    ProcessIdToSessionId, N, <.dwProcessId, .pSessionId>,  'ProcessIdToSessionId',  \
    PulseEvent, N, <.hEvent>,  'PulseEvent',  \
    PurgeComm, N, <.hFile, .dwFlags>,  'PurgeComm',  \
    QueryActCtx, W, <NONE>,  'QueryActCtxW',  \
    QueryDepthSList, N, <NONE>,  'QueryDepthSList',  \
    QueryDosDevice, A, <.lpDeviceName, .lpTargetPath, .ucchMax>,  'QueryDosDeviceA',  \
    QueryDosDevice, W, <.lpDeviceName, .lpTargetPath, .ucchMax>,  'QueryDosDeviceW',  \
    QueryInformationJobObject, N, <.hJob, .JobObjectInformationClass, .lpJobObjectInformation, .cbJobObjectInformationLength, .lpReturnLength>,  'QueryInformationJobObject',  \
    QueryMemoryResourceNotification, N, <NONE>,  'QueryMemoryResourceNotification',  \
    QueryPerformanceCounter, N, <.lpPerformanceCount>,  'QueryPerformanceCounter',  \
    QueryPerformanceFrequency, N, <.lpFrequency>,  'QueryPerformanceFrequency',  \
    QueryWin31IniFilesMappedToRegistry, N, <NONE>,  'QueryWin31IniFilesMappedToRegistry',  \
    QueueUserAPC, N, <.pfnAPC, .hThread, .dwData>,  'QueueUserAPC',  \
    QueueUserWorkItem, N, <.lFunction, .Context, .Flags>,  'QueueUserWorkItem',  \
    RaiseException, N, <.dwExceptionCode, .dwExceptionFlags, .nNumberOfArguments, .lpArguments>,  'RaiseException',  \
    ReadConsole, A, <.hConsoleInput, .lpBuffer, .nNumberOfCharsToRead, .lpNumberOfCharsRead, .lpReserved>,  'ReadConsoleA',  \
    ReadConsoleInput, A, <.hConsoleInput, .lpBuffer, .nLength, .lpNumberOfEventsRead>,  'ReadConsoleInputA',  \
    ReadConsoleInputEx, A, <NONE>,  'ReadConsoleInputExA',  \
    ReadConsoleInputEx, W, <NONE>,  'ReadConsoleInputExW',  \
    ReadConsoleInput, W, <.hConsoleInput, .lpBuffer, .nLength, .lpNumberOfEventsRead>,  'ReadConsoleInputW',  \
    ReadConsoleOutput, A, <.hConsoleOutput, .lpBuffer, .dwBufferSize, .dwBufferCoord, .lpReadRegion>,  'ReadConsoleOutputA',  \
    ReadConsoleOutputAttribute, N, <.hConsoleOutput, .lpAttribute, .nLength, .dwReadCoord, .lpNumberOfAttrsRead>,  'ReadConsoleOutputAttribute',  \
    ReadConsoleOutputCharacter, A, <.hConsoleOutput, .lpCharacter, .nLength, .dwReadCoord, .lpNumberOfCharsRead>,  'ReadConsoleOutputCharacterA',  \
    ReadConsoleOutputCharacter, W, <.hConsoleOutput, .lpCharacter, .nLength, .dwReadCoord, .lpNumberOfCharsRead>,  'ReadConsoleOutputCharacterW',  \
    ReadConsoleOutput, W, <.hConsoleOutput, .lpBuffer, .dwBufferSize, .dwBufferCoord, .lpReadRegion>,  'ReadConsoleOutputW',  \
    ReadConsole, W, <.hConsoleInput, .lpBuffer, .nNumberOfCharsToRead, .lpNumberOfCharsRead, .lpReserved>,  'ReadConsoleW',  \
    ReadDirectoryChanges, W, <NONE>,  'ReadDirectoryChangesW',  \
    ReadFile, N, <.hFile, .lpBuffer, .nNumberOfBytesToRead, .lpNumberOfBytesRead, .lpOverlapped>,  'ReadFile',  \
    ReadFileEx, N, <.hFile, .lpBuffer, .nNumberOfBytesToRead, .lpOverlapped, .lpCompletionRoutine>,  'ReadFileEx',  \
    ReadFileScatter, N, <.hFile, .aSegmentArray, .nNumberOfBytesToRead, .lpReserved, .lpOverlapped>,  'ReadFileScatter',  \
    ReadProcessMemory, N, <.hProcess, .lpBaseAddress, .lpBuffer, .nSize, .lpNumberOfBytesWritten>,  'ReadProcessMemory',  \
    RegisterConsoleIME, N, <NONE>,  'RegisterConsoleIME',  \
    RegisterConsoleOS2, N, <NONE>,  'RegisterConsoleOS2',  \
    RegisterConsoleVDM, N, <NONE>,  'RegisterConsoleVDM',  \
    RegisterWaitForInputIdle, N, <NONE>,  'RegisterWaitForInputIdle',  \
    RegisterWaitForSingleObject, N, <.phNewWaitObject, .hObject, .Callback, .Context, .dwMilliseconds, .dwFlags>,  'RegisterWaitForSingleObject',  \
    RegisterWaitForSingleObjectEx, N, <.hObject, .Callback, .Context, .dwMilliseconds, .dwFlags>,  'RegisterWaitForSingleObjectEx',  \
    RegisterWowBaseHandlers, N, <NONE>,  'RegisterWowBaseHandlers',  \
    RegisterWowExec, N, <NONE>,  'RegisterWowExec',  \
    ReleaseActCtx, N, <NONE>,  'ReleaseActCtx',  \
    ReleaseMutex, N, <.hMutex>,  'ReleaseMutex',  \
    ReleaseSemaphore, N, <.hSemaphore, .lReleaseCount, .lpPreviousCount>,  'ReleaseSemaphore',  \
    RemoveDirectory, A, <.lpPathName>,  'RemoveDirectoryA',  \
    RemoveDirectory, W, <.lpPathName>,  'RemoveDirectoryW',  \
    RemoveLocalAlternateComputerName, A, <NONE>,  'RemoveLocalAlternateComputerNameA',  \
    RemoveLocalAlternateComputerName, W, <NONE>,  'RemoveLocalAlternateComputerNameW',  \
    RemoveVectoredExceptionHandler, N, <NONE>,  'RemoveVectoredExceptionHandler',  \
    ReplaceFile, A, <.lpReplacedFileName, .lpReplacementFileName, .lpBackupFileName, .dwReplaceFlags, .lpExclude, .lpReserved>,  'ReplaceFileA',  \
    ReplaceFile, W, <.lpReplacedFileName, .lpReplacementFileName, .lpBackupFileName, .dwReplaceFlags, .lpExclude, .lpReserved>,  'ReplaceFileW',  \
    RequestDeviceWakeup, N, <.hDevice>,  'RequestDeviceWakeup',  \
    RequestWakeupLatency, N, <.latency>,  'RequestWakeupLatency',  \
    ResetEvent, N, <.hEvent>,  'ResetEvent',  \
    ResetWriteWatch, N, <.lpBaseAddress, .dwRegionSize>,  'ResetWriteWatch',  \
    RestoreLastError, N, <NONE>,  'RestoreLastError',  \
    ResumeThread, N, <.hThread>,  'ResumeThread',  \
    RtlCaptureContext, N, <NONE>,  'RtlCaptureContext',  \
    RtlCaptureStackBackTrace, N, <NONE>,  'RtlCaptureStackBackTrace',  \
    RtlFillMemory, N, <.Destination, .Length, .Fill>,  'RtlFillMemory',  \
    RtlMoveMemory, N, <.dest, .source, .numBytes>,  'RtlMoveMemory',  \
    RtlUnwind, N, <NONE>,  'RtlUnwind',  \
    RtlZeroMemory, N, <.dest, .numBytes>,  'RtlZeroMemory',  \
    ScrollConsoleScreenBuffer, A, <.hConsoleOutput, .lpScrollRectangle, .lpClipRectangle, .dwDestinationOrigin, .lpFill>,  'ScrollConsoleScreenBufferA',  \
    ScrollConsoleScreenBuffer, W, <.hConsoleOutput, .lpScrollRectangle, .lpClipRectangle, .dwDestinationOrigin, .lpFill>,  'ScrollConsoleScreenBufferW',  \
    SearchPath, A, <.lpPath, .lpFileName, .lpExtension, .nBufferLength, .lpBuffer, .lpFilePart>,  'SearchPathA',  \
    SearchPath, W, <.lpPath, .lpFileName, .lpExtension, .nBufferLength, .lpBuffer, .lpFilePart>,  'SearchPathW',  \
    SetCPGlobal, N, <NONE>,  'SetCPGlobal',  \
    SetCalendarInfo, A, <.Locale, .Calendar, .CalType, .lpCalData>,  'SetCalendarInfoA',  \
    SetCalendarInfo, W, <.Locale, .Calendar, .CalType, .lpCalData>,  'SetCalendarInfoW',  \
    SetClientTimeZoneInformation, N, <NONE>,  'SetClientTimeZoneInformation',  \
    SetComPlusPackageInstallStatus, N, <NONE>,  'SetComPlusPackageInstallStatus',  \
    SetCommBreak, N, <.nCid>,  'SetCommBreak',  \
    SetCommConfig, N, <.hCommDev, .lpCC, .dwSize>,  'SetCommConfig',  \
    SetCommMask, N, <.hFile, .dwEvtMask>,  'SetCommMask',  \
    SetCommState, N, <.hCommDev, .lpDCB>,  'SetCommState',  \
    SetCommTimeouts, N, <.hFile, .lpCommTimeouts>,  'SetCommTimeouts',  \
    SetComputerName, A, <.lpComputerName>,  'SetComputerNameA',  \
    SetComputerNameEx, A, <.NameType, .lpBuffer>,  'SetComputerNameExA',  \
    SetComputerNameEx, W, <.NameType, .lpBuffer>,  'SetComputerNameExW',  \
    SetComputerName, W, <.lpComputerName>,  'SetComputerNameW',  \
    SetConsoleActiveScreenBuffer, N, <.hConsoleOutput>,  'SetConsoleActiveScreenBuffer',  \
    SetConsoleCP, N, <.wCodePageID>,  'SetConsoleCP',  \
    SetConsoleCommandHistoryMode, N, <NONE>,  'SetConsoleCommandHistoryMode',  \
    SetConsoleCtrlHandler, N, <.HandlerRoutine, .Add>,  'SetConsoleCtrlHandler',  \
    SetConsoleCursor, N, <NONE>,  'SetConsoleCursor',  \
    SetConsoleCursorInfo, N, <.hConsoleOutput, .lpConsoleCursorInfo>,  'SetConsoleCursorInfo',  \
    SetConsoleCursorMode, N, <NONE>,  'SetConsoleCursorMode',  \
    SetConsoleCursorPosition, N, <.hConsoleOutput, .dwCursorPosition>,  'SetConsoleCursorPosition',  \
    SetConsoleDisplayMode, N, <NONE>,  'SetConsoleDisplayMode',  \
    SetConsoleFont, N, <NONE>,  'SetConsoleFont',  \
    SetConsoleHardwareState, N, <NONE>,  'SetConsoleHardwareState',  \
    SetConsoleIcon, N, <NONE>,  'SetConsoleIcon',  \
    SetConsoleInputExeName, A, <NONE>,  'SetConsoleInputExeNameA',  \
    SetConsoleInputExeName, W, <NONE>,  'SetConsoleInputExeNameW',  \
    SetConsoleKeyShortcuts, N, <NONE>,  'SetConsoleKeyShortcuts',  \
    SetConsoleLocalEUDC, N, <NONE>,  'SetConsoleLocalEUDC',  \
    SetConsoleMaximumWindowSize, N, <NONE>,  'SetConsoleMaximumWindowSize',  \
    SetConsoleMenuClose, N, <NONE>,  'SetConsoleMenuClose',  \
    SetConsoleMode, N, <.hConsoleHandle, .dwMode>,  'SetConsoleMode',  \
    SetConsoleNlsMode, N, <NONE>,  'SetConsoleNlsMode',  \
    SetConsoleNumberOfCommands, A, <NONE>,  'SetConsoleNumberOfCommandsA',  \
    SetConsoleNumberOfCommands, W, <NONE>,  'SetConsoleNumberOfCommandsW',  \
    SetConsoleOS2OemFormat, N, <NONE>,  'SetConsoleOS2OemFormat',  \
    SetConsoleOutputCP, N, <.wCodePageID>,  'SetConsoleOutputCP',  \
    SetConsolePalette, N, <NONE>,  'SetConsolePalette',  \
    SetConsoleScreenBufferSize, N, <.hConsoleOutput, .dwSize>,  'SetConsoleScreenBufferSize',  \
    SetConsoleTextAttribute, N, <.hConsoleOutput, .wAttributes>,  'SetConsoleTextAttribute',  \
    SetConsoleTitle, A, <.lpConsoleTitle>,  'SetConsoleTitleA',  \
    SetConsoleTitle, W, <.lpConsoleTitle>,  'SetConsoleTitleW',  \
    SetConsoleWindowInfo, N, <.hConsoleOutput, .bAbsolute, .lpConsoleWindow>,  'SetConsoleWindowInfo',  \
    SetCriticalSectionSpinCount, N, <.lpCriticalSection, .dwSpinCount>,  'SetCriticalSectionSpinCount',  \
    SetCurrentDirectory, A, <.lpPathName>,  'SetCurrentDirectoryA',  \
    SetCurrentDirectory, W, <.lpPathName>,  'SetCurrentDirectoryW',  \
    SetDefaultCommConfig, A, <.lpszName, .lpCC, .dwSize>,  'SetDefaultCommConfigA',  \
    SetDefaultCommConfig, W, <.lpszName, .lpCC, .dwSize>,  'SetDefaultCommConfigW',  \
    SetDllDirectory, A, <NONE>,  'SetDllDirectoryA',  \
    SetDllDirectory, W, <NONE>,  'SetDllDirectoryW',  \
    SetEndOfFile, N, <.hFile>,  'SetEndOfFile',  \
    SetEnvironmentVariable, A, <.lpName, .lpValue>,  'SetEnvironmentVariableA',  \
    SetEnvironmentVariable, W, <.lpName, .lpValue>,  'SetEnvironmentVariableW',  \
    SetErrorMode, N, <.wMode>,  'SetErrorMode',  \
    SetEvent, N, <.hEvent>,  'SetEvent',  \
    SetFileApisToANSI, N, <VOID>,  'SetFileApisToANSI',  \
    SetFileApisToOEM, N, <VOID>,  'SetFileApisToOEM',  \
    SetFileAttributes, A, <.lpFileName, .dwFileAttributes>,  'SetFileAttributesA',  \
    SetFileAttributes, W, <.lpFileName, .dwFileAttributes>,  'SetFileAttributesW',  \
    SetFilePointer, N, <.hFile, .lDistanceToMove, .lpDistanceToMoveHigh, .dwMoveMethod>,  'SetFilePointer',  \
    SetFilePointerEx, N, <.hFile, .liDistanceToMove, .lpNewFilePointer, .dwMoveMethod>,  'SetFilePointerEx',  \
    SetFileShortName, A, <NONE>,  'SetFileShortNameA',  \
    SetFileShortName, W, <NONE>,  'SetFileShortNameW',  \
    SetFileTime, N, <.hFile, .lpCreationTime, .lpLastAccessTime, .lpLastWriteTime>,  'SetFileTime',  \
    SetFileValidData, N, <NONE>,  'SetFileValidData',  \
    SetFirmwareEnvironmentVariable, A, <NONE>,  'SetFirmwareEnvironmentVariableA',  \
    SetFirmwareEnvironmentVariable, W, <NONE>,  'SetFirmwareEnvironmentVariableW',  \
    SetHandleContext, N, <NONE>,  'SetHandleContext',  \
    SetHandleCount, N, <.wNumber>,  'SetHandleCount',  \
    SetHandleInformation, N, <.hObject, .dwMask, .dwFlags>,  'SetHandleInformation',  \
    SetInformationJobObject, N, <.hJob, .JobObjectInformationClass, .lpJobObjectInformation, .cbJobObjectInformationLength>,  'SetInformationJobObject',  \
    SetLastConsoleEventActive, N, <NONE>,  'SetLastConsoleEventActive',  \
    SetLastError, N, <.dwErrCode>,  'SetLastError',  \
    SetLocalPrimaryComputerName, A, <NONE>,  'SetLocalPrimaryComputerNameA',  \
    SetLocalPrimaryComputerName, W, <NONE>,  'SetLocalPrimaryComputerNameW',  \
    SetLocalTime, N, <.lpSystemTime>,  'SetLocalTime',  \
    SetLocaleInfo, A, <.Locale, .LCType, .lpLCData>,  'SetLocaleInfoA',  \
    SetLocaleInfo, W, <.Locale, .LCType, .lpLCData>,  'SetLocaleInfoW',  \
    SetMailslotInfo, N, <.hMailslot, .lReadTimeout>,  'SetMailslotInfo',  \
    SetMessageWaitingIndicator, N, <.hMsgIndicator, .ulMsgCount>,  'SetMessageWaitingIndicator',  \
    SetNamedPipeHandleState, N, <.hNamedPipe, .lpMode, .lpMaxCollectionCount, .lpCollectDataTimeout>,  'SetNamedPipeHandleState',  \
    SetPriorityClass, N, <.hProcess, .dwPriorityClass>,  'SetPriorityClass',  \
    SetProcessAffinityMask, N, <.hProcess, .dwProcessAffinityMask>,  'SetProcessAffinityMask',  \
    SetProcessDEPPolicy, N, <NONE>,  'SetProcessDEPPolicy',  \
    SetProcessPriorityBoost, N, <.hProcess, .bDisablePriorityBoost>,  'SetProcessPriorityBoost',  \
    SetProcessShutdownParameters, N, <.dwLevel, .dwFlags>,  'SetProcessShutdownParameters',  \
    SetProcessWorkingSetSize, N, <.hProcess, .dwMinimumWorkingSetSize, .dwMaximumWorkingSetSize>,  'SetProcessWorkingSetSize',  \
    SetStdHandle, N, <.nStdHandle, .nHandle>,  'SetStdHandle',  \
    SetSystemPowerState, N, <.fSuspend, .fForce>,  'SetSystemPowerState',  \
    SetSystemTime, N, <.lpSystemTime>,  'SetSystemTime',  \
    SetSystemTimeAdjustment, N, <.dwTimeAdjustment, .bTimeAdjustmentDisabled>,  'SetSystemTimeAdjustment',  \
    SetTapeParameters, N, <.hDevice, .dwOperation, .lpTapeInformation>,  'SetTapeParameters',  \
    SetTapePosition, N, <.hDevice, .dwPositionMethod, .dwPartition, .dwOffsetLow, .dwOffsetHigh, .bimmediate>,  'SetTapePosition',  \
    SetTermsrvAppInstallMode, N, <NONE>,  'SetTermsrvAppInstallMode',  \
    SetThreadAffinityMask, N, <.hThread, .dwThreadAffinityMask>,  'SetThreadAffinityMask',  \
    SetThreadContext, N, <.hThread, .lpContext>,  'SetThreadContext',  \
    SetThreadExecutionState, N, <.esFlags>,  'SetThreadExecutionState',  \
    SetThreadIdealProcessor, N, <.hThread, .dwIdealProcessor>,  'SetThreadIdealProcessor',  \
    SetThreadLocale, N, <.Locale>,  'SetThreadLocale',  \
    SetThreadPriority, N, <.hThread, .nPriority>,  'SetThreadPriority',  \
    SetThreadPriorityBoost, N, <.hThread, .bDisablePriorityBoost>,  'SetThreadPriorityBoost',  \
    SetThreadUILanguage, N, <NONE>,  'SetThreadUILanguage',  \
    SetTimeZoneInformation, N, <.lpTimeZoneInformation>,  'SetTimeZoneInformation',  \
    SetTimerQueueTimer, N, <.TimerQueue, .Callback, .Parameter, .DueTime, .Period, .PreferIo>,  'SetTimerQueueTimer',  \
    SetUnhandledExceptionFilter, N, <.lpTopLevelExceptionFilter>,  'SetUnhandledExceptionFilter',  \
    SetUserGeoID, N, <NONE>,  'SetUserGeoID',  \
    SetVDMCurrentDirectories, N, <NONE>,  'SetVDMCurrentDirectories',  \
    SetVolumeLabel, A, <.lpRootPathName, .lpVolumeName>,  'SetVolumeLabelA',  \
    SetVolumeLabel, W, <.lpRootPathName, .lpVolumeName>,  'SetVolumeLabelW',  \
    SetVolumeMountPoint, A, <.lpszVolumeMountPoint, .lpszVolumeName>,  'SetVolumeMountPointA',  \
    SetVolumeMountPoint, W, <.lpszVolumeMountPoint, .lpszVolumeName>,  'SetVolumeMountPointW',  \
    SetWaitableTimer, N, <.hTimer, .lpDueTime, .lPeriod, .pfnCompletionRoutine, .lpArgToCompletionRoutine, .fResume>,  'SetWaitableTimer',  \
    SetupComm, N, <.hFile, .dwInQueue, .dwOutQueue>,  'SetupComm',  \
    ShowConsoleCursor, N, <NONE>,  'ShowConsoleCursor',  \
    SignalObjectAndWait, N, <.hObjectToSignal, .hObjectToWaitOn, .dwMilliseconds, .bAlertable>,  'SignalObjectAndWait',  \
    SizeofResource, N, <.hInstance, .hResInfo>,  'SizeofResource',  \
    Sleep, N, <.dwMilliseconds>,  'Sleep',  \
    SleepEx, N, <.dwMilliseconds, .bAlertable>,  'SleepEx',  \
    SuspendThread, N, <.hThread>,  'SuspendThread',  \
    SwitchToFiber, N, <.lpFiber>,  'SwitchToFiber',  \
    SwitchToThread, N, <VOID>,  'SwitchToThread',  \
    SystemTimeToFileTime, N, <.lpSystemTime, .lpFileTime>,  'SystemTimeToFileTime',  \
    SystemTimeToTzSpecificLocalTime, N, <.lpTimeZoneInformation, .lpUniversalTime, .lpLocalTime>,  'SystemTimeToTzSpecificLocalTime',  \
    TerminateJobObject, N, <.hJob, .uExitCode>,  'TerminateJobObject',  \
    TerminateProcess, N, <.hProcess, .uExitCode>,  'TerminateProcess',  \
    TerminateThread, N, <.hThread, .dwExitCode>,  'TerminateThread',  \
    TermsrvAppInstallMode, N, <NONE>,  'TermsrvAppInstallMode',  \
    Thread32First, N, <.hSnapshot, .lpte>,  'Thread32First',  \
    Thread32Next, N, <.hSnapshot, .lpte>,  'Thread32Next',  \
    TlsAlloc, N, <VOID>,  'TlsAlloc',  \
    TlsFree, N, <.dwTlsIndex>,  'TlsFree',  \
    TlsGetValue, N, <.dwTlsIndex>,  'TlsGetValue',  \
    TlsSetValue, N, <.dwTlsIndex, .lpTlsValue>,  'TlsSetValue',  \
    Toolhelp32ReadProcessMemory, N, <.th32ProcessID, .lpBaseAddress, .lpBuffer, .cbRead, .lpNumberOfBytesRead>,  'Toolhelp32ReadProcessMemory',  \
    TransactNamedPipe, N, <.hNamedPipe, .lpInBuffer, .nInBufferSize, .lpOutBuffer, .nOutBufferSize, .lpBytesRead, .lpOverlapped>,  'TransactNamedPipe',  \
    TransmitCommChar, N, <.nCid, .cChar>,  'TransmitCommChar',  \
    TrimVirtualBuffer, N, <NONE>,  'TrimVirtualBuffer',  \
    TryEnterCriticalSection, N, <.lpCriticalSection>,  'TryEnterCriticalSection',  \
    TzSpecificLocalTimeToSystemTime, N, <NONE>,  'TzSpecificLocalTimeToSystemTime',  \
    UTRegister, N, <NONE>,  'UTRegister',  \
    UTUnRegister, N, <NONE>,  'UTUnRegister',  \
    UnhandledExceptionFilter, N, <.ExceptionInfo>,  'UnhandledExceptionFilter',  \
    UnlockFile, N, <.hFile, .dwFileOffsetLow, .dwFileOffsetHigh, .nNumberOfBytesToUnlockLow, .nNumberOfBytesToUnlockHigh>,  'UnlockFile',  \
    UnlockFileEx, N, <.hFile, .dwReserved, .nNumberOfBytesToUnlockLow, .nNumberOfBytesToUnlockHigh, .lpOverlapped>,  'UnlockFileEx',  \
    UnmapViewOfFile, N, <.lpBaseAddress>,  'UnmapViewOfFile',  \
    UnregisterConsoleIME, N, <NONE>,  'UnregisterConsoleIME',  \
    UnregisterWait, N, <.WaitHandle>,  'UnregisterWait',  \
    UnregisterWaitEx, N, <.WaitHandle, .CompletionEvent>,  'UnregisterWaitEx',  \
    UpdateResource, A, <.hUpdate, .lpType, .lpName, .wLanguage, .lpData, .cbData>,  'UpdateResourceA',  \
    UpdateResource, W, <.hUpdate, .lpType, .lpName, .wLanguage, .lpData, .cbData>,  'UpdateResourceW',  \
    VDMConsoleOperation, N, <NONE>,  'VDMConsoleOperation',  \
    VDMOperationStarted, N, <NONE>,  'VDMOperationStarted',  \
    ValidateLCType, N, <NONE>,  'ValidateLCType',  \
    ValidateLocale, N, <NONE>,  'ValidateLocale',  \
    VerLanguageName, A, <.wLang, .szLang, .nSize>,  'VerLanguageNameA',  \
    VerLanguageName, W, <.wLang, .szLang, .nSize>,  'VerLanguageNameW',  \
    VerSetConditionMask, N, <.ConditionMask, .TypeMask, .Condition>,  'VerSetConditionMask',  \
    VerifyConsoleIoHandle, N, <NONE>,  'VerifyConsoleIoHandle',  \
    VerifyVersionInfo, A, <.lpVersionInformation, .dwTypeMask, .dwlConditionMask>,  'VerifyVersionInfoA',  \
    VerifyVersionInfo, W, <.lpVersionInformation, .dwTypeMask, .dwlConditionMask>,  'VerifyVersionInfoW',  \
    VirtualAlloc, N, <.lpAddress, .dwSize, .flAllocationType, .flProtect>,  'VirtualAlloc',  \
    VirtualAllocEx, N, <.hProcess, .lpAddress, .dwSize, .flAllocationType, .flProtect>,  'VirtualAllocEx',  \
    VirtualBufferExceptionHandler, N, <NONE>,  'VirtualBufferExceptionHandler',  \
    VirtualFree, N, <.lpAddress, .dwSize, .dwFreeType>,  'VirtualFree',  \
    VirtualFreeEx, N, <.hProcess, .lpAddress, .dwSize, .dwFreeType>,  'VirtualFreeEx',  \
    VirtualLock, N, <.lpAddress, .dwSize>,  'VirtualLock',  \
    VirtualProtect, N, <.lpAddress, .dwSize, .flNewProtect, .lpflOldProtect>,  'VirtualProtect',  \
    VirtualProtectEx, N, <.hProcess, .lpAddress, .dwSize, .flNewProtect, .lpflOldProtect>,  'VirtualProtectEx',  \
    VirtualQuery, N, <.lpAddress, .lpBuffer, .dwLength>,  'VirtualQuery',  \
    VirtualQueryEx, N, <.hProcess, .lpAddress, .lpBuffer, .dwLength>,  'VirtualQueryEx',  \
    VirtualUnlock, N, <.lpAddress, .dwSize>,  'VirtualUnlock',  \
    WTSGetActiveConsoleSessionId, N, <NONE>,  'WTSGetActiveConsoleSessionId',  \
    WaitCommEvent, N, <.hFile, .lpEvtMask, .lpOverlapped>,  'WaitCommEvent',  \
    WaitForDebugEvent, N, <.lpDebugEvent, .dwMilliseconds>,  'WaitForDebugEvent',  \
    WaitForMultipleObjects, N, <.nCount, .lpHandles, .bWaitAll, .dwMilliseconds>,  'WaitForMultipleObjects',  \
    WaitForMultipleObjectsEx, N, <.nCount, .lpHandles, .bWaitAll, .dwMilliseconds, .bAlertable>,  'WaitForMultipleObjectsEx',  \
    WaitForSingleObject, N, <.hHandle, .dwMilliseconds>,  'WaitForSingleObject',  \
    WaitForSingleObjectEx, N, <.hHandle, .dwMilliseconds, .bAlertable>,  'WaitForSingleObjectEx',  \
    WaitNamedPipe, A, <.lpNamedPipeName, .nTimeOut>,  'WaitNamedPipeA',  \
    WaitNamedPipe, W, <.lpNamedPipeName, .nTimeOut>,  'WaitNamedPipeW',  \
    WideCharToMultiByte, N, <.CodePage, .dwFlags, .lpWideCharStr, .cchWideChar, .lpMultiByteStr, .cchMultiByte, .lpDefaultChar, .lpUsedDefaultChar>,  'WideCharToMultiByte',  \
    WinExec, N, <.lpCmdLine, .nCmdShow>,  'WinExec',  \
    WriteConsole, A, <.hConsoleOutput, .lpBuffer, .nNumberOfCharsToWrite, .lpNumberOfCharsWritten, .lpReserved>,  'WriteConsoleA',  \
    WriteConsoleInput, A, <.hConsoleInput, .lpBuffer, .nLength, .lpNumberOfEventsWritten>,  'WriteConsoleInputA',  \
    WriteConsoleInputVDM, A, <NONE>,  'WriteConsoleInputVDMA',  \
    WriteConsoleInputVDM, W, <NONE>,  'WriteConsoleInputVDMW',  \
    WriteConsoleInput, W, <.hConsoleInput, .lpBuffer, .nLength, .lpNumberOfEventsWritten>,  'WriteConsoleInputW',  \
    WriteConsoleOutput, A, <.hConsoleOutput, .lpBuffer, .dwBufferSize, .dwBufferCoord, .lpWriteRegion>,  'WriteConsoleOutputA',  \
    WriteConsoleOutputAttribute, N, <.hConsoleOutput, .lpAttribute, .nLength, .dwWriteCoord, .lpNumberOfAttrsWritten>,  'WriteConsoleOutputAttribute',  \
    WriteConsoleOutputCharacter, A, <.hConsoleOutput, .lpCharacter, .nLength, .dwWriteCoord, .lpNumberOfCharsWritten>,  'WriteConsoleOutputCharacterA',  \
    WriteConsoleOutputCharacter, W, <.hConsoleOutput, .lpCharacter, .nLength, .dwWriteCoord, .lpNumberOfCharsWritten>,  'WriteConsoleOutputCharacterW',  \
    WriteConsoleOutput, W, <.hConsoleOutput, .lpBuffer, .dwBufferSize, .dwBufferCoord, .lpWriteRegion>,  'WriteConsoleOutputW',  \
    WriteConsole, W, <.hConsoleOutput, .lpBuffer, .nNumberOfCharsToWrite, .lpNumberOfCharsWritten, .lpReserved>,  'WriteConsoleW',  \
    WriteFile, N, <.hFile, .lpBuffer, .nNumberOfBytesToWrite, .lpNumberOfBytesWritten, .lpOverlapped>,  'WriteFile',  \
    WriteFileEx, N, <.hFile, .lpBuffer, .nNumberOfBytesToWrite, .lpOverlapped, .lpCompletionRoutine>,  'WriteFileEx',  \
    WriteFileGather, N, <.hFile, .aSegmentArray, .nNumberOfBytesToWrite, .lpReserved, .lpOverlapped>,  'WriteFileGather',  \
    WritePrivateProfileSection, A, <.lpAppName, .lpString, .lpFileName>,  'WritePrivateProfileSectionA',  \
    WritePrivateProfileSection, W, <.lpAppName, .lpString, .lpFileName>,  'WritePrivateProfileSectionW',  \
    WritePrivateProfileString, A, <.lpApplicationName, .lpKeyName, .lpString, .lpFileName>,  'WritePrivateProfileStringA',  \
    WritePrivateProfileString, W, <.lpApplicationName, .lpKeyName, .lpString, .lpFileName>,  'WritePrivateProfileStringW',  \
    WritePrivateProfileStruct, A, <.lpszSection, .lpszKey, .lpStruct, .uSizeStruct, .szFile>,  'WritePrivateProfileStructA',  \
    WritePrivateProfileStruct, W, <.lpszSection, .lpszKey, .lpStruct, .uSizeStruct, .szFile>,  'WritePrivateProfileStructW',  \
    WriteProcessMemory, N, <.hProcess, .lpBaseAddress, .lpBuffer, .nSize, .lpNumberOfBytesWritten>,  'WriteProcessMemory',  \
    WriteProfileSection, A, <.lpAppName, .lpString>,  'WriteProfileSectionA',  \
    WriteProfileSection, W, <.lpAppName, .lpString>,  'WriteProfileSectionW',  \
    WriteProfileString, A, <.lpszSection, .lpszKeyName, .lpszString>,  'WriteProfileStringA',  \
    WriteProfileString, W, <.lpszSection, .lpszKeyName, .lpszString>,  'WriteProfileStringW',  \
    WriteTapemark, N, <.hDevice, .dwTapemarkType, .dwTapemarkCount, .bimmediate>,  'WriteTapemark',  \
    ZombifyActCtx, N, <NONE>,  'ZombifyActCtx',  \
    _hread, N, <NONE>,  '_hread',  \
    _hwrite, N, <NONE>,  '_hwrite',  \
    _lclose, N, <NONE>,  '_lclose',  \
    _lcreat, N, <NONE>,  '_lcreat',  \
    _llseek, N, <NONE>,  '_llseek',  \
    _lopen, N, <NONE>,  '_lopen',  \
    _lread, N, <NONE>,  '_lread',  \
    _lwrite, N, <NONE>,  '_lwrite',  \
    lstrcat, A, <.lpString1, .lpString2>,  'lstrcatA',  \
    lstrcat, W, <.lpString1, .lpString2>,  'lstrcatW',  \
    lstrcmp, A, <.lpString1, .lpString2>,  'lstrcmpA',  \
    lstrcmp, W, <.lpString1, .lpString2>,  'lstrcmpW',  \
    lstrcmpi, A, <.lpString1, .lpString2>,  'lstrcmpiA',  \
    lstrcmpi, W, <.lpString1, .lpString2>,  'lstrcmpiW',  \
    lstrcpy, A, <.lpString1, .lpString2>,  'lstrcpyA',  \
    lstrcpy, W, <.lpString1, .lpString2>,  'lstrcpyW',  \
    lstrcpyn, A, <.lpString1, .lpString2, .iMaxLength>,  'lstrcpynA',  \
    lstrcpyn, W, <.lpString1, .lpString2, .iMaxLength>,  'lstrcpynW',  \
    lstrlen, A, <.lpString>,  'lstrlenA',  \
    lstrlen, W, <.lpString>,  'lstrlenW'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted freshlib/imports/Win32/api/msimg32.inc.

1
2
3
4
5
6
7
;   msimg32.dll API calls (ASCII)
import_proto msimg32,  \
    AlphaBlend, N, <.hdc, .lInt, .BLENDFUNCT>,  'AlphaBlend',  \
    DllInitialize, N, <NONE>,  'DllInitialize',  \
    GradientFill, N, <.hdc, .PTRIVERTEX, .ulong, .pvoid>,  'GradientFill',  \
    TransparentBlt, N, <.hdc, .t, .uint>,  'TransparentBlt',  \
    vSetDdrawflag, N, <NONE>,  'vSetDdrawflag'
<
<
<
<
<
<
<














Deleted freshlib/imports/Win32/api/odbc32.inc.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
172
173
174
175
176
177
178
179
180
181
182
183
184
;   odbc32.dll API calls (ASCII)
import_proto odbc32,  \
    CloseODBCPerfData, N, <NONE>,  'CloseODBCPerfData',  \
    CollectODBCPerfData, N, <NONE>,  'CollectODBCPerfData',  \
    CursorLibLockDbc, N, <NONE>,  'CursorLibLockDbc',  \
    CursorLibLockDesc, N, <NONE>,  'CursorLibLockDesc',  \
    CursorLibLockStmt, N, <NONE>,  'CursorLibLockStmt',  \
    CursorLibTransact, N, <NONE>,  'CursorLibTransact',  \
    DllBidEntryPoint, N, <NONE>,  'DllBidEntryPoint',  \
    GetODBCSharedData, N, <NONE>,  'GetODBCSharedData',  \
    LockHandle, N, <NONE>,  'LockHandle',  \
    MpHeapAlloc, N, <NONE>,  'MpHeapAlloc',  \
    MpHeapCompact, N, <NONE>,  'MpHeapCompact',  \
    MpHeapCreate, N, <NONE>,  'MpHeapCreate',  \
    MpHeapDestroy, N, <NONE>,  'MpHeapDestroy',  \
    MpHeapFree, N, <NONE>,  'MpHeapFree',  \
    MpHeapReAlloc, N, <NONE>,  'MpHeapReAlloc',  \
    MpHeapSize, N, <NONE>,  'MpHeapSize',  \
    MpHeapValidate, N, <NONE>,  'MpHeapValidate',  \
    ODBCGetTryWaitValue, N, <VOID>,  'ODBCGetTryWaitValue',  \
    ODBCInternalConnect, W, <NONE>,  'ODBCInternalConnectW',  \
    ODBCQualifyFileDSN, W, <NONE>,  'ODBCQualifyFileDSNW',  \
    ODBCSetTryWaitValue, N, <.dwValue>,  'ODBCSetTryWaitValue',  \
    OpenODBCPerfData, N, <NONE>,  'OpenODBCPerfData',  \
    PostComponentError, N, <NONE>,  'PostComponentError',  \
    PostODBCComponentError, N, <NONE>,  'PostODBCComponentError',  \
    PostODBCError, N, <NONE>,  'PostODBCError',  \
    SQLAllocConnect, N, <.henv, .phdbc>,  'SQLAllocConnect',  \
    SQLAllocEnv, N, <.phenv>,  'SQLAllocEnv',  \
    SQLAllocHandle, N, <.HandleType, .InputHandle, .OutputHandle>,  'SQLAllocHandle',  \
    SQLAllocHandleStd, N, <.fHandleType, .hInput, .phOutput>,  'SQLAllocHandleStd',  \
    SQLAllocStmt, N, <.hdbc, .phstmt>,  'SQLAllocStmt',  \
    SQLBindCol, N, <.hstmt, .icol, .fCType, .rgbValue, .cbValueMax, .pcbValue>,  'SQLBindCol',  \
    SQLBindParam, N, <.StatementHandle, .ParameterNumber, .ValueType, .ParameterType, .LengthPrecision, .ParameterScale, .ParameterValue, .StrLen_or_Ind>,  'SQLBindParam',  \
    SQLBindParameter, N, <.hstmt, .ipar, .fParamType, .fCType, .fSqlType, .cbColDef, .ibScale, .rgbValue, .cbValueMax, .pcbValue>,  'SQLBindParameter',  \
    SQLBrowseConnect, N, <.hdbc, .szConnStrIn, .cbConnStrIn, .szConnStrOut, .cbConnStrOutMax, .pcbConnStrOut>,  'SQLBrowseConnect',  \
    SQLBrowseConnect, A, <.hdbc, .szConnStrIn, .cbConnStrIn, .szConnStrOut, .cbConnStrOutMax, .pcbConnStrOut>,  'SQLBrowseConnectA',  \
    SQLBrowseConnect, W, <.hdbc, .szConnStrIn, .cbConnStrIn, .szConnStrOut, .cbConnStrOutMax, .pcbConnStrOut>,  'SQLBrowseConnectW',  \
    SQLBulkOperations, N, <.StatementHandle, .Operation>,  'SQLBulkOperations',  \
    SQLCancel, N, <.hstmt>,  'SQLCancel',  \
    SQLCloseCursor, N, <.StatementHandle>,  'SQLCloseCursor',  \
    SQLColAttribute, N, <.hstmt, .iCol, .iField, .pCharAttr, .cbCharAttrMax, .pcbCharAttr, .pNumAttr>,  'SQLColAttribute',  \
    SQLColAttribute, A, <.hstmt, .iCol, .iField, .pCharAttr, .cbCharAttrMax, .pcbCharAttr, .pNumAttr>,  'SQLColAttributeA',  \
    SQLColAttribute, W, <.hstmt, .iCol, .iField, .pCharAttr, .cbCharAttrMax, .pcbCharAttr, .pNumAttr>,  'SQLColAttributeW',  \
    SQLColAttributes, N, <.hstmt, .icol, .fDescType, .rgbDesc, .cbDescMax, .pcbDesc, .pfDesc>,  'SQLColAttributes',  \
    SQLColAttributes, A, <.hstmt, .icol, .fDescType, .rgbDesc, .cbDescMax, .pcbDesc, .pfDesc>,  'SQLColAttributesA',  \
    SQLColAttributes, W, <.hstmt, .icol, .fDescType, .rgbDesc, .cbDescMax, .pcbDesc, .pfDesc>,  'SQLColAttributesW',  \
    SQLColumnPrivileges, N, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szColumnName, .cbColumnName>,  'SQLColumnPrivileges',  \
    SQLColumnPrivileges, A, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szColumnName, .cbColumnName>,  'SQLColumnPrivilegesA',  \
    SQLColumnPrivileges, W, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szColumnName, .cbColumnName>,  'SQLColumnPrivilegesW',  \
    SQLColumns, N, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szColumnName, .cbColumnName>,  'SQLColumns',  \
    SQLColumns, A, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szColumnName, .cbColumnName>,  'SQLColumnsA',  \
    SQLColumns, W, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szColumnName, .cbColumnName>,  'SQLColumnsW',  \
    SQLConnect, N, <.hdbc, .szDSN, .cbDSN, .szUID, .cbUID, .szAuthStr, .cbAuthStr>,  'SQLConnect',  \
    SQLConnect, A, <.hdbc, .szDSN, .cbDSN, .szUID, .cbUID, .szAuthStr, .cbAuthStr>,  'SQLConnectA',  \
    SQLConnect, W, <.hdbc, .szDSN, .cbDSN, .szUID, .cbUID, .szAuthStr, .cbAuthStr>,  'SQLConnectW',  \
    SQLCopyDesc, N, <.SourceDescHandle, .TargetDescHandle>,  'SQLCopyDesc',  \
    SQLDataSources, N, <.henv, .fDirection, .szDSN, .cbDSNMax, .pcbDSN, .szDescription, .cbDescriptionMax, .pcbDescription>,  'SQLDataSources',  \
    SQLDataSources, A, <.henv, .fDirection, .szDSN, .cbDSNMax, .pcbDSN, .szDescription, .cbDescriptionMax, .pcbDescription>,  'SQLDataSourcesA',  \
    SQLDataSources, W, <.henv, .fDirection, .szDSN, .cbDSNMax, .pcbDSN, .szDescription, .cbDescriptionMax, .pcbDescription>,  'SQLDataSourcesW',  \
    SQLDescribeCol, N, <.hstmt, .icol, .szColName, .cbColNameMax, .pcbColName, .pfSqlType, .pcbColDef, .pibScale, .pfNullable>,  'SQLDescribeCol',  \
    SQLDescribeCol, A, <.hstmt, .icol, .szColName, .cbColNameMax, .pcbColName, .pfSqlType, .pcbColDef, .pibScale, .pfNullable>,  'SQLDescribeColA',  \
    SQLDescribeCol, W, <.hstmt, .icol, .szColName, .cbColNameMax, .pcbColName, .pfSqlType, .pcbColDef, .pibScale, .pfNullable>,  'SQLDescribeColW',  \
    SQLDescribeParam, N, <.hstmt, .ipar, .pfSqlType, .pcbParamDef, .pibScale, .pfNullable>,  'SQLDescribeParam',  \
    SQLDisconnect, N, <.hdbc>,  'SQLDisconnect',  \
    SQLDriverConnect, N, <.hdbc, .hwnd, .szConnStrIn, .cbConnStrIn, .szConnStrOut, .cbConnStrOutMax, .pcbConnStrOut, .fDriverCompletion>,  'SQLDriverConnect',  \
    SQLDriverConnect, A, <.hdbc, .hwnd, .szConnStrIn, .cbConnStrIn, .szConnStrOut, .cbConnStrOutMax, .pcbConnStrOut, .fDriverCompletion>,  'SQLDriverConnectA',  \
    SQLDriverConnect, W, <.hdbc, .hwnd, .szConnStrIn, .cbConnStrIn, .szConnStrOut, .cbConnStrOutMax, .pcbConnStrOut, .fDriverCompletion>,  'SQLDriverConnectW',  \
    SQLDrivers, N, <.henv, .fDirection, .szDriverDesc, .cbDriverDescMax, .pcbDriverDesc, .szDriverAttributes, .cbDrvrAttrMax, .pcbDrvrAttr>,  'SQLDrivers',  \
    SQLDrivers, A, <.henv, .fDirection, .szDriverDesc, .cbDriverDescMax, .pcbDriverDesc, .szDriverAttributes, .cbDrvrAttrMax, .pcbDrvrAttr>,  'SQLDriversA',  \
    SQLDrivers, W, <.henv, .fDirection, .szDriverDesc, .cbDriverDescMax, .pcbDriverDesc, .szDriverAttributes, .cbDrvrAttrMax, .pcbDrvrAttr>,  'SQLDriversW',  \
    SQLEndTran, N, <.HandleType, .handle, .CompletionType>,  'SQLEndTran',  \
    SQLError, N, <.henv, .hdbc, .hstmt, .szSqlState, .pfNativeError, .szErrorMsg, .cbErrorMsgMax, .pcbErrorMsg>,  'SQLError',  \
    SQLError, A, <.henv, .hdbc, .hstmt, .szSqlState, .pfNativeError, .szErrorMsg, .cbErrorMsgMax, .pcbErrorMsg>,  'SQLErrorA',  \
    SQLError, W, <.henv, .hdbc, .hstmt, .szSqlState, .pfNativeError, .szErrorMsg, .cbErrorMsgMax, .pcbErrorMsg>,  'SQLErrorW',  \
    SQLExecDirect, N, <.hstmt, .szSqlStr, .cbSqlStr>,  'SQLExecDirect',  \
    SQLExecDirect, A, <.hstmt, .szSqlStr, .cbSqlStr>,  'SQLExecDirectA',  \
    SQLExecDirect, W, <.hstmt, .szSqlStr, .cbSqlStr>,  'SQLExecDirectW',  \
    SQLExecute, N, <.hstmt>,  'SQLExecute',  \
    SQLExtendedFetch, N, <.hstmt, .fFetchType, .irow, .pcrow, .rgfRowStatus>,  'SQLExtendedFetch',  \
    SQLFetch, N, <.hstmt>,  'SQLFetch',  \
    SQLFetchScroll, N, <.StatementHandle, .FetchOrientation, .FetchOffset>,  'SQLFetchScroll',  \
    SQLForeignKeys, N, <.hstmt, .szPkCatalogName, .cbPkCatalogName, .szPkSchemaName, .cbPkSchemaName, .szPkTableName, .cbPkTableName, .szFkCatalogName, .cbFkCatalogName, .szFkSchemaName, .cbFkSchemaName, .szFkTableName, .cbFkTableName>,  'SQLForeignKeys',
    SQLForeignKeys, A, <.hstmt, .szPkCatalogName, .cbPkCatalogName, .szPkSchemaName, .cbPkSchemaName, .szPkTableName, .cbPkTableName, .szFkCatalogName, .cbFkCatalogName, .szFkSchemaName, .cbFkSchemaName, .szFkTableName, .cbFkTableName>,  'SQLForeignKeysA',
    SQLForeignKeys, W, <.hstmt, .szPkCatalogName, .cbPkCatalogName, .szPkSchemaName, .cbPkSchemaName, .szPkTableName, .cbPkTableName, .szFkCatalogName, .cbFkCatalogName, .szFkSchemaName, .cbFkSchemaName, .szFkTableName, .cbFkTableName>,  'SQLForeignKeysW',
    SQLFreeConnect, N, <.hdbc>,  'SQLFreeConnect',  \
    SQLFreeEnv, N, <.henv>,  'SQLFreeEnv',  \
    SQLFreeHandle, N, <.HandleType, .handle>,  'SQLFreeHandle',  \
    SQLFreeStmt, N, <.hstmt, .fOption>,  'SQLFreeStmt',  \
    SQLGetConnectAttr, N, <.ConnectionHandle, .lAttribute, .lValue, .BufferLength, .StringLength>,  'SQLGetConnectAttr',  \
    SQLGetConnectAttr, A, <.ConnectionHandle, .lAttribute, .lValue, .BufferLength, .StringLength>,  'SQLGetConnectAttrA',  \
    SQLGetConnectAttr, W, <.ConnectionHandle, .lAttribute, .lValue, .BufferLength, .StringLength>,  'SQLGetConnectAttrW',  \
    SQLGetConnectOption, N, <.hdbc, .fOption, .pvParam>,  'SQLGetConnectOption',  \
    SQLGetConnectOption, A, <.hdbc, .fOption, .pvParam>,  'SQLGetConnectOptionA',  \
    SQLGetConnectOption, W, <.hdbc, .fOption, .pvParam>,  'SQLGetConnectOptionW',  \
    SQLGetCursorName, N, <.hstmt, .szCursor, .cbCursorMax, .pcbCursor>,  'SQLGetCursorName',  \
    SQLGetCursorName, A, <.hstmt, .szCursor, .cbCursorMax, .pcbCursor>,  'SQLGetCursorNameA',  \
    SQLGetCursorName, W, <.hstmt, .szCursor, .cbCursorMax, .pcbCursor>,  'SQLGetCursorNameW',  \
    SQLGetData, N, <.hstmt, .icol, .fCType, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetData',  \
    SQLGetDescField, N, <.hdesc, .iRecord, .iField, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetDescField',  \
    SQLGetDescField, A, <.hdesc, .iRecord, .iField, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetDescFieldA',  \
    SQLGetDescField, W, <.hdesc, .iRecord, .iField, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetDescFieldW',  \
    SQLGetDescRec, N, <.hdesc, .iRecord, .szName, .cbNameMax, .pcbName, .pfType, .pfSubType, .pLength, .pPrecision, .pScale, .pNullable>,  'SQLGetDescRec',  \
    SQLGetDescRec, A, <.hdesc, .iRecord, .szName, .cbNameMax, .pcbName, .pfType, .pfSubType, .pLength, .pPrecision, .pScale, .pNullable>,  'SQLGetDescRecA',  \
    SQLGetDescRec, W, <.hdesc, .iRecord, .szName, .cbNameMax, .pcbName, .pfType, .pfSubType, .pLength, .pPrecision, .pScale, .pNullable>,  'SQLGetDescRecW',  \
    SQLGetDiagField, N, <.HandleType, .handle, .RecNumber, .DiagIdentifier, .DiagInfo, .BufferLength, .StringLength>,  'SQLGetDiagField',  \
    SQLGetDiagField, A, <.HandleType, .handle, .RecNumber, .DiagIdentifier, .DiagInfo, .BufferLength, .StringLength>,  'SQLGetDiagFieldA',  \
    SQLGetDiagField, W, <.HandleType, .handle, .RecNumber, .DiagIdentifier, .DiagInfo, .BufferLength, .StringLength>,  'SQLGetDiagFieldW',  \
    SQLGetDiagRec, N, <.fHandleType, .handle, .iRecord, .szSqlState, .pfNativeError, .szErrorMsg, .cbErrorMsgMax, .pcbErrorMsg>,  'SQLGetDiagRec',  \
    SQLGetDiagRec, A, <.fHandleType, .handle, .iRecord, .szSqlState, .pfNativeError, .szErrorMsg, .cbErrorMsgMax, .pcbErrorMsg>,  'SQLGetDiagRecA',  \
    SQLGetDiagRec, W, <.fHandleType, .handle, .iRecord, .szSqlState, .pfNativeError, .szErrorMsg, .cbErrorMsgMax, .pcbErrorMsg>,  'SQLGetDiagRecW',  \
    SQLGetEnvAttr, N, <.EnvironmentHandle, .lAttribute, .lValue, .BufferLength, .StringLength>,  'SQLGetEnvAttr',  \
    SQLGetFunctions, N, <.hdbc, .fFunction, .pfExists>,  'SQLGetFunctions',  \
    SQLGetInfo, N, <.hdbc, .fInfoType, .rgbInfoValue, .cbInfoValueMax, .pcbInfoValue>,  'SQLGetInfo',  \
    SQLGetInfo, A, <.hdbc, .fInfoType, .rgbInfoValue, .cbInfoValueMax, .pcbInfoValue>,  'SQLGetInfoA',  \
    SQLGetInfo, W, <.hdbc, .fInfoType, .rgbInfoValue, .cbInfoValueMax, .pcbInfoValue>,  'SQLGetInfoW',  \
    SQLGetStmtAttr, N, <.hstmt, .fAttribute, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetStmtAttr',  \
    SQLGetStmtAttr, A, <.hstmt, .fAttribute, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetStmtAttrA',  \
    SQLGetStmtAttr, W, <.hstmt, .fAttribute, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetStmtAttrW',  \
    SQLGetStmtOption, N, <.hstmt, .fOption, .pvParam>,  'SQLGetStmtOption',  \
    SQLGetTypeInfo, N, <.hstmt, .fSqlType>,  'SQLGetTypeInfo',  \
    SQLGetTypeInfo, A, <.hstmt, .fSqlType>,  'SQLGetTypeInfoA',  \
    SQLGetTypeInfo, W, <.hstmt, .fSqlType>,  'SQLGetTypeInfoW',  \
    SQLMoreResults, N, <.hstmt>,  'SQLMoreResults',  \
    SQLNativeSql, N, <.hdbc, .szSqlStrIn, .cbSqlStrIn, .szSqlStr, .cbSqlStrMax, .pcbSqlStr>,  'SQLNativeSql',  \
    SQLNativeSql, A, <.hdbc, .szSqlStrIn, .cbSqlStrIn, .szSqlStr, .cbSqlStrMax, .pcbSqlStr>,  'SQLNativeSqlA',  \
    SQLNativeSql, W, <.hdbc, .szSqlStrIn, .cbSqlStrIn, .szSqlStr, .cbSqlStrMax, .pcbSqlStr>,  'SQLNativeSqlW',  \
    SQLNumParams, N, <.hstmt, .pcpar>,  'SQLNumParams',  \
    SQLNumResultCols, N, <.hstmt, .pccol>,  'SQLNumResultCols',  \
    SQLParamData, N, <.hstmt, .prgbValue>,  'SQLParamData',  \
    SQLParamOptions, N, <.hstmt, .crow, .pirow>,  'SQLParamOptions',  \
    SQLPrepare, N, <.hstmt, .szSqlStr, .cbSqlStr>,  'SQLPrepare',  \
    SQLPrepare, A, <.hstmt, .szSqlStr, .cbSqlStr>,  'SQLPrepareA',  \
    SQLPrepare, W, <.hstmt, .szSqlStr, .cbSqlStr>,  'SQLPrepareW',  \
    SQLPrimaryKeys, N, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName>,  'SQLPrimaryKeys',  \
    SQLPrimaryKeys, A, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName>,  'SQLPrimaryKeysA',  \
    SQLPrimaryKeys, W, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName>,  'SQLPrimaryKeysW',  \
    SQLProcedureColumns, N, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szProcName, .cbProcName, .szColumnName, .cbColumnName>,  'SQLProcedureColumns',  \
    SQLProcedureColumns, A, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szProcName, .cbProcName, .szColumnName, .cbColumnName>,  'SQLProcedureColumnsA',  \
    SQLProcedureColumns, W, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szProcName, .cbProcName, .szColumnName, .cbColumnName>,  'SQLProcedureColumnsW',  \
    SQLProcedures, N, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szProcName, .cbProcName>,  'SQLProcedures',  \
    SQLProcedures, A, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szProcName, .cbProcName>,  'SQLProceduresA',  \
    SQLProcedures, W, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szProcName, .cbProcName>,  'SQLProceduresW',  \
    SQLPutData, N, <.hstmt, .rgbValue, .cbValue>,  'SQLPutData',  \
    SQLRowCount, N, <.hstmt, .pcrow>,  'SQLRowCount',  \
    SQLSetConnectAttr, N, <.hdbc, .fAttribute, .rgbValue, .cbValue>,  'SQLSetConnectAttr',  \
    SQLSetConnectAttr, A, <.hdbc, .fAttribute, .rgbValue, .cbValue>,  'SQLSetConnectAttrA',  \
    SQLSetConnectAttr, W, <.hdbc, .fAttribute, .rgbValue, .cbValue>,  'SQLSetConnectAttrW',  \
    SQLSetConnectOption, N, <.hdbc, .fOption, .vParam>,  'SQLSetConnectOption',  \
    SQLSetConnectOption, A, <.hdbc, .fOption, .vParam>,  'SQLSetConnectOptionA',  \
    SQLSetConnectOption, W, <.hdbc, .fOption, .vParam>,  'SQLSetConnectOptionW',  \
    SQLSetCursorName, N, <.hstmt, .szCursor, .cbCursor>,  'SQLSetCursorName',  \
    SQLSetCursorName, A, <.hstmt, .szCursor, .cbCursor>,  'SQLSetCursorNameA',  \
    SQLSetCursorName, W, <.hstmt, .szCursor, .cbCursor>,  'SQLSetCursorNameW',  \
    SQLSetDescField, N, <.DescriptorHandle, .RecNumber, .FieldIdentifier, .Value, .BufferLength>,  'SQLSetDescField',  \
    SQLSetDescField, A, <.DescriptorHandle, .RecNumber, .FieldIdentifier, .Value, .BufferLength>,  'SQLSetDescFieldA',  \
    SQLSetDescField, W, <.DescriptorHandle, .RecNumber, .FieldIdentifier, .Value, .BufferLength>,  'SQLSetDescFieldW',  \
    SQLSetDescRec, N, <.DescriptorHandle, .RecNumber, .lType, .SubType, .Length, .Precision, .kScale, .Data, .StringLength, .Indicator>,  'SQLSetDescRec',  \
    SQLSetEnvAttr, N, <.EnvironmentHandle, .lAttribute, .Value, .StringLength>,  'SQLSetEnvAttr',  \
    SQLSetParam, N, <.hstmt, .ipar, .fCType, .fSqlType, .cbParamDef, .ibScale, .rgbValue, .pcbValue>,  'SQLSetParam',  \
    SQLSetPos, N, <.hstmt, .irow, .fOption, .fLock>,  'SQLSetPos',  \
    SQLSetScrollOptions, N, <.hstmt, .fConcurrency, .crowKeyset, .crowRowset>,  'SQLSetScrollOptions',  \
    SQLSetStmtAttr, N, <.StatementHandle, .lAttribute, .Value, .StringLength>,  'SQLSetStmtAttr',  \
    SQLSetStmtAttr, A, <.StatementHandle, .lAttribute, .Value, .StringLength>,  'SQLSetStmtAttrA',  \
    SQLSetStmtAttr, W, <.StatementHandle, .lAttribute, .Value, .StringLength>,  'SQLSetStmtAttrW',  \
    SQLSetStmtOption, N, <.hstmt, .fOption, .vParam>,  'SQLSetStmtOption',  \
    SQLSpecialColumns, N, <.hstmt, .fColType, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .fScope, .fNullable>,  'SQLSpecialColumns',  \
    SQLSpecialColumns, A, <.hstmt, .fColType, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .fScope, .fNullable>,  'SQLSpecialColumnsA',  \
    SQLSpecialColumns, W, <.hstmt, .fColType, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .fScope, .fNullable>,  'SQLSpecialColumnsW',  \
    SQLStatistics, N, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .fUnique, .fAccuracy>,  'SQLStatistics',  \
    SQLStatistics, A, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .fUnique, .fAccuracy>,  'SQLStatisticsA',  \
    SQLStatistics, W, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .fUnique, .fAccuracy>,  'SQLStatisticsW',  \
    SQLTablePrivileges, N, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName>,  'SQLTablePrivileges',  \
    SQLTablePrivileges, A, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName>,  'SQLTablePrivilegesA',  \
    SQLTablePrivileges, W, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName>,  'SQLTablePrivilegesW',  \
    SQLTables, N, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szTableType, .cbTableType>,  'SQLTables',  \
    SQLTables, A, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szTableType, .cbTableType>,  'SQLTablesA',  \
    SQLTables, W, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szTableType, .cbTableType>,  'SQLTablesW',  \
    SQLTransact, N, <.henv, .hdbc, .fType>,  'SQLTransact',  \
    SearchStatusCode, N, <NONE>,  'SearchStatusCode',  \
    VFreeErrors, N, <NONE>,  'VFreeErrors',  \
    VRetrieveDriverErrorsRowCol, N, <NONE>,  'VRetrieveDriverErrorsRowCol',  \
    ValidateErrorQueue, N, <NONE>,  'ValidateErrorQueue',  \
    g_hHeapMalloc, N, <NONE>,  'g_hHeapMalloc'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































































































































































































































































































































Deleted freshlib/imports/Win32/api/ole32.inc.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
;   ole32.dll API calls (ASCII)
import_proto ole32,  \
    BindMoniker, N, <.pmk, .grfOpt, .iidResult, .ppvResult>,  'BindMoniker',  \
    CLIPFORMAT_UserFree, N, <.pLong, .pClipformat>,  'CLIPFORMAT_UserFree',  \
    CLIPFORMAT_UserMarshal, N, <.pLong, .pChar, .pClipformat>,  'CLIPFORMAT_UserMarshal',  \
    CLIPFORMAT_UserSize, N, <.pLong, .lLong, .pClipformat>,  'CLIPFORMAT_UserSize',  \
    CLIPFORMAT_UserUnmarshal, N, <.pLong, .pChar, .pClipformat>,  'CLIPFORMAT_UserUnmarshal',  \
    CLSIDFromOle1Class, N, <NONE>,  'CLSIDFromOle1Class',  \
    CLSIDFromProgID, N, <.TSzProgID, .T>,  'CLSIDFromProgID',  \
    CLSIDFromProgIDEx, N, <.lpszProgID, .lpclsid>,  'CLSIDFromProgIDEx',  \
    CLSIDFromString, N, <.lpsz, .pclsid>,  'CLSIDFromString',  \
    CoAddRefServerProcess, N, <VOID>,  'CoAddRefServerProcess',  \
    CoAllowSetForegroundWindow, N, <.pUnk, .lpvReserved>,  'CoAllowSetForegroundWindow',  \
    CoBuildVersion, N, <VOID>,  'CoBuildVersion',  \
    CoCancelCall, N, <.dwThreadId, .ulTimeout>,  'CoCancelCall',  \
    CoCopyProxy, N, <.pProxy, .ppCopy>,  'CoCopyProxy',  \
    CoCreateFreeThreadedMarshaler, N, <.punkOuter, .ppunkMarshal>,  'CoCreateFreeThreadedMarshaler',  \
    CoCreateGuid, N, <.pguid>,  'CoCreateGuid',  \
    CoCreateInstance, N, <.rclsid, .pUnkOuter, .dwClsContext, .riid, .ppv>,  'CoCreateInstance',  \
    CoCreateInstanceEx, N, <.Clsid, .punkOuter, .dwClsCtx, .pServerInfo, .dwCount, .pResults>,  'CoCreateInstanceEx',  \
    CoCreateObjectInContext, N, <NONE>,  'CoCreateObjectInContext',  \
    CoDeactivateObject, N, <NONE>,  'CoDeactivateObject',  \
    CoDisableCallCancellation, N, <.pReserved>,  'CoDisableCallCancellation',  \
    CoDisconnectObject, N, <.pUnk, .dwReserved>,  'CoDisconnectObject',  \
    CoDosDateTimeToFileTime, N, <.nDosDate, .nDosTime, .lpFileTime>,  'CoDosDateTimeToFileTime',  \
    CoEnableCallCancellation, N, <.pReserved>,  'CoEnableCallCancellation',  \
    CoFileTimeNow, N, <.lpFileTime>,  'CoFileTimeNow',  \
    CoFileTimeToDosDateTime, N, <.lpFileTime, .lpDosDate, .lpDosTime>,  'CoFileTimeToDosDateTime',  \
    CoFreeAllLibraries, N, <VOID>,  'CoFreeAllLibraries',  \
    CoFreeLibrary, N, <.hInst>,  'CoFreeLibrary',  \
    CoFreeUnusedLibraries, N, <VOID>,  'CoFreeUnusedLibraries',  \
    CoFreeUnusedLibrariesEx, N, <NONE>,  'CoFreeUnusedLibrariesEx',  \
    CoGetApartmentID, N, <NONE>,  'CoGetApartmentID',  \
    CoGetCallContext, N, <.riid, .ppInterface>,  'CoGetCallContext',  \
    CoGetCallerTID, N, <NONE>,  'CoGetCallerTID',  \
    CoGetCancelObject, N, <.dwThreadId, .iid, .ppUnk>,  'CoGetCancelObject',  \
    CoGetClassObject, N, <.rclsid, .dwClsContext, .pvReserved, .riid, .ppv>,  'CoGetClassObject',  \
    CoGetClassVersion, N, <.pClassSpec, .pdwVersionMS, .pdwVersionLS>,  'CoGetClassVersion',  \
    CoGetComCatalog, N, <NONE>,  'CoGetComCatalog',  \
    CoGetContextToken, N, <NONE>,  'CoGetContextToken',  \
    CoGetCurrentLogicalThreadId, N, <NONE>,  'CoGetCurrentLogicalThreadId',  \
    CoGetCurrentProcess, N, <VOID>,  'CoGetCurrentProcess',  \
    CoGetDefaultContext, N, <NONE>,  'CoGetDefaultContext',  \
    CoGetInstanceFromFile, N, <.pServerInfo, .pClsid, .punkOuter, .dwClsCtx, .grfMode, .pwszName, .dwCount, .pResults>,  'CoGetInstanceFromFile',  \
    CoGetInstanceFromIStorage, N, <.pServerInfo, .pClsid, .punkOuter, .dwClsCtx, .pstg, .dwCount, .pResults>,  'CoGetInstanceFromIStorage',  \
    CoGetInterceptor, N, <NONE>,  'CoGetInterceptor',  \
    CoGetInterceptorFromTypeInfo, N, <NONE>,  'CoGetInterceptorFromTypeInfo',  \
    CoGetInterfaceAndReleaseStream, N, <.pStm, .iid, .ppv>,  'CoGetInterfaceAndReleaseStream',  \
    CoGetMalloc, N, <.dwMemContext, .ppMalloc>,  'CoGetMalloc',  \
    CoGetMarshalSizeMax, N, <.pulSize, .riid, .pUnk, .dwDestContext, .pvDestContext, .mshlflags>,  'CoGetMarshalSizeMax',  \
    CoGetObject, N, <.pszName, .pBindOptions, .riid, .ppv>,  'CoGetObject',  \
    CoGetObjectContext, N, <.riid, .ppv>,  'CoGetObjectContext',  \
    CoGetPSClsid, N, <.riid, .pClsid>,  'CoGetPSClsid',  \
    CoGetProcessIdentifier, N, <NONE>,  'CoGetProcessIdentifier',  \
    CoGetStandardMarshal, N, <.riid, .pUnk, .dwDestContext, .pvDestContext, .mshlflags, .ppMarshal>,  'CoGetStandardMarshal',  \
    CoGetState, N, <NONE>,  'CoGetState',  \
    CoGetStdMarshalEx, N, <.pUnkOuter, .smexflags, .ppUnkInner>,  'CoGetStdMarshalEx',  \
    CoGetSystemSecurityPermissions, N, <NONE>,  'CoGetSystemSecurityPermissions',  \
    CoGetTreatAsClass, N, <.clsidOld, .pClsidNew>,  'CoGetTreatAsClass',  \
    CoImpersonateClient, N, <VOID>,  'CoImpersonateClient',  \
    CoInitialize, N, <.pzReserved>,  'CoInitialize',  \
    CoInitializeEx, N, <.pvReserved, .dwCoInit>,  'CoInitializeEx',  \
    CoInitializeSecurity, N, <.pSecDesc, .cAuthSvc, .asAuthSvc, .pReserved1, .dwAuthnLevel, .dwImpLevel, .pAuthList, .dwCapabilities, .pReserved3>,  'CoInitializeSecurity',  \
    CoInitializeWO, W, <NONE>,  'CoInitializeWOW',  \
    CoInstall, N, <.pbc, .dwFlags, .pClassSpec, .pQuery, .pszCodeBase>,  'CoInstall',  \
    CoInvalidateRemoteMachineBindings, N, <NONE>,  'CoInvalidateRemoteMachineBindings',  \
    CoIsHandlerConnected, N, <.pUnk>,  'CoIsHandlerConnected',  \
    CoIsOle1Class, N, <.rclsid>,  'CoIsOle1Class',  \
    CoLoadLibrary, N, <.lpszLibName, .bAutoFree>,  'CoLoadLibrary',  \
    CoLockObjectExternal, N, <.pUnk, .fLock, .fLastUnlockReleases>,  'CoLockObjectExternal',  \
    CoMarshalHresult, N, <.pstm, .hresult>,  'CoMarshalHresult',  \
    CoMarshalInterThreadInterfaceInStream, N, <.riid, .pUnk, .ppStm>,  'CoMarshalInterThreadInterfaceInStream',  \
    CoMarshalInterface, N, <.pStm, .riid, .pUnk, .dwDestContext, .pvDestContext, .mshlflags>,  'CoMarshalInterface',  \
    CoPopServiceDomain, N, <NONE>,  'CoPopServiceDomain',  \
    CoPushServiceDomain, N, <NONE>,  'CoPushServiceDomain',  \
    CoQueryAuthenticationServices, N, <.pcAuthSvc, .asAuthSvc>,  'CoQueryAuthenticationServices',  \
    CoQueryClientBlanket, N, <.pAuthnSvc, .pAuthzSvc, .pServerPrincName, .pAuthnLevel, .pImpLevel, .pPrivs, .pCapabilities>,  'CoQueryClientBlanket',  \
    CoQueryProxyBlanket, N, <.pProxy, .pwAuthnSvc, .pAuthzSvc, .pServerPrincName, .pAuthnLevel, .pImpLevel, .pAuthInfo, .pCapabilites>,  'CoQueryProxyBlanket',  \
    CoQueryReleaseObject, N, <NONE>,  'CoQueryReleaseObject',  \
    CoReactivateObject, N, <NONE>,  'CoReactivateObject',  \
    CoRegisterChannelHook, N, <.ExtensionUuid, .pChannelHook>,  'CoRegisterChannelHook',  \
    CoRegisterClassObject, N, <.rclsid, .pUnk, .dwClsContext, .flags, .lpdwRegister>,  'CoRegisterClassObject',  \
    CoRegisterInitializeSpy, N, <NONE>,  'CoRegisterInitializeSpy',  \
    CoRegisterMallocSpy, N, <.pMallocSpy>,  'CoRegisterMallocSpy',  \
    CoRegisterMessageFilter, N, <.lpMessageFilter, .lplpMessageFilter>,  'CoRegisterMessageFilter',  \
    CoRegisterPSClsid, N, <.riid, .rclsid>,  'CoRegisterPSClsid',  \
    CoRegisterSurrogate, N, <.pSurrogate>,  'CoRegisterSurrogate',  \
    CoRegisterSurrogateEx, N, <NONE>,  'CoRegisterSurrogateEx',  \
    CoReleaseMarshalData, N, <.pStm>,  'CoReleaseMarshalData',  \
    CoReleaseServerProcess, N, <VOID>,  'CoReleaseServerProcess',  \
    CoResumeClassObjects, N, <VOID>,  'CoResumeClassObjects',  \
    CoRetireServer, N, <NONE>,  'CoRetireServer',  \
    CoRevertToSelf, N, <VOID>,  'CoRevertToSelf',  \
    CoRevokeClassObject, N, <.dwRegister>,  'CoRevokeClassObject',  \
    CoRevokeInitializeSpy, N, <NONE>,  'CoRevokeInitializeSpy',  \
    CoRevokeMallocSpy, N, <VOID>,  'CoRevokeMallocSpy',  \
    CoSetCancelObject, N, <.pUnk>,  'CoSetCancelObject',  \
    CoSetProxyBlanket, N, <.pProxy, .dwAuthnSvc, .dwAuthzSvc, .pServerPrincName, .dwAuthnLevel, .dwImpLevel, .pAuthInfo, .dwCapabilities>,  'CoSetProxyBlanket',  \
    CoSetState, N, <NONE>,  'CoSetState',  \
    CoSuspendClassObjects, N, <VOID>,  'CoSuspendClassObjects',  \
    CoSwitchCallContext, N, <.pNewObject, .ppOldObject>,  'CoSwitchCallContext',  \
    CoTaskMemAlloc, N, <.cb>,  'CoTaskMemAlloc',  \
    CoTaskMemFree, N, <.lpIDList>,  'CoTaskMemFree',  \
    CoTaskMemRealloc, N, <.pv, .cb>,  'CoTaskMemRealloc',  \
    CoTestCancel, N, <VOID>,  'CoTestCancel',  \
    CoTreatAsClass, N, <.clsidOld, .clsidNew>,  'CoTreatAsClass',  \
    CoUninitialize, N, <VOID>,  'CoUninitialize',  \
    CoUnloadingWO, W, <NONE>,  'CoUnloadingWOW',  \
    CoUnmarshalHresult, N, <.pstm, .phresult>,  'CoUnmarshalHresult',  \
    CoUnmarshalInterface, N, <.pStm, .riid, .ppv>,  'CoUnmarshalInterface',  \
    CoWaitForMultipleHandles, N, <.dwFlags, .dwTimeout, .cHandles, .pHandles, .lpdwindex>,  'CoWaitForMultipleHandles',  \
    ComPs_CStdStubBuffer_AddRef, N, <NONE>,  'ComPs_CStdStubBuffer_AddRef',  \
    ComPs_CStdStubBuffer_Connect, N, <NONE>,  'ComPs_CStdStubBuffer_Connect',  \
    ComPs_CStdStubBuffer_CountRefs, N, <NONE>,  'ComPs_CStdStubBuffer_CountRefs',  \
    ComPs_CStdStubBuffer_DebugServerQueryInterface, N, <NONE>,  'ComPs_CStdStubBuffer_DebugServerQueryInterface',  \
    ComPs_CStdStubBuffer_DebugServerRelease, N, <NONE>,  'ComPs_CStdStubBuffer_DebugServerRelease',  \
    ComPs_CStdStubBuffer_Disconnect, N, <NONE>,  'ComPs_CStdStubBuffer_Disconnect',  \
    ComPs_CStdStubBuffer_Invoke, N, <NONE>,  'ComPs_CStdStubBuffer_Invoke',  \
    ComPs_CStdStubBuffer_IsIIDSupported, N, <NONE>,  'ComPs_CStdStubBuffer_IsIIDSupported',  \
    ComPs_CStdStubBuffer_QueryInterface, N, <NONE>,  'ComPs_CStdStubBuffer_QueryInterface',  \
    ComPs_IUnknown_AddRef_Proxy, N, <NONE>,  'ComPs_IUnknown_AddRef_Proxy',  \
    ComPs_IUnknown_QueryInterface_Proxy, N, <NONE>,  'ComPs_IUnknown_QueryInterface_Proxy',  \
    ComPs_IUnknown_Release_Proxy, N, <NONE>,  'ComPs_IUnknown_Release_Proxy',  \
    ComPs_NdrCStdStubBuffer2_Release, N, <NONE>,  'ComPs_NdrCStdStubBuffer2_Release',  \
    ComPs_NdrCStdStubBuffer_Release, N, <NONE>,  'ComPs_NdrCStdStubBuffer_Release',  \
    ComPs_NdrClientCall2, N, <NONE>,  'ComPs_NdrClientCall2',  \
    ComPs_NdrClientCall2_va, N, <NONE>,  'ComPs_NdrClientCall2_va',  \
    ComPs_NdrDllCanUnloadNow, N, <NONE>,  'ComPs_NdrDllCanUnloadNow',  \
    ComPs_NdrDllGetClassObject, N, <NONE>,  'ComPs_NdrDllGetClassObject',  \
    ComPs_NdrDllRegisterProxy, N, <NONE>,  'ComPs_NdrDllRegisterProxy',  \
    ComPs_NdrDllUnregisterProxy, N, <NONE>,  'ComPs_NdrDllUnregisterProxy',  \
    ComPs_NdrStubCall2, N, <NONE>,  'ComPs_NdrStubCall2',  \
    ComPs_NdrStubForwardingFunction, N, <NONE>,  'ComPs_NdrStubForwardingFunction',  \
    CreateAntiMoniker, N, <.ppmk>,  'CreateAntiMoniker',  \
    CreateBindCtx, N, <.reserved, .ppbc>,  'CreateBindCtx',  \
    CreateClassMoniker, N, <.rclsid, .ppmk>,  'CreateClassMoniker',  \
    CreateDataAdviseHolder, N, <.ppDAHolder>,  'CreateDataAdviseHolder',  \
    CreateDataCache, N, <.pUnkOuter, .rclsid, .iid, .ppv>,  'CreateDataCache',  \
    CreateErrorInfo, N, <.pperrinfo>,  'CreateErrorInfo',  \
    CreateFileMoniker, N, <.lpszPathName, .ppmk>,  'CreateFileMoniker',  \
    CreateGenericComposite, N, <.pmkFirst, .pmkRest, .ppmkComposite>,  'CreateGenericComposite',  \
    CreateILockBytesOnHGlobal, N, <.hGlobal, .fDeleteOnRelease, .pplkbyt>,  'CreateILockBytesOnHGlobal',  \
    CreateItemMoniker, N, <.lpszDelim, .lpszItem, .ppmk>,  'CreateItemMoniker',  \
    CreateObjrefMoniker, N, <.punk, .ppmk>,  'CreateObjrefMoniker',  \
    CreateOleAdviseHolder, N, <.ppOAHolder>,  'CreateOleAdviseHolder',  \
    CreatePointerMoniker, N, <.punk, .ppmk>,  'CreatePointerMoniker',  \
    CreateStdProgressIndicator, N, <.hwndParent, .pszTitle, .pIbscCaller, .ppIbsc>,  'CreateStdProgressIndicator',  \
    CreateStreamOnHGlobal, N, <.hGlobal, .fDeleteOnRelease, .ppstm>,  'CreateStreamOnHGlobal',  \
    DcomChannelSetHResult, N, <NONE>,  'DcomChannelSetHResult',  \
    DllDebugObjectRPCHook, N, <NONE>,  'DllDebugObjectRPCHook',  \
    DllGetClassObjectWO, W, <NONE>,  'DllGetClassObjectWOW',  \
\;    DllRegisterServer, N, <VOID>,  'DllRegisterServer',  \
    DoDragDrop, N, <.pDataObj, .pDropSource, .dwOKEffects, .pdwEffect>,  'DoDragDrop',  \
    EnableHookObject, N, <NONE>,  'EnableHookObject',  \
    FmtIdToPropStgName, N, <.pfmtid, .oszName>,  'FmtIdToPropStgName',  \
    FreePropVariantArray, N, <.cVariants, .rgvars>,  'FreePropVariantArray',  \
    GetClassFile, N, <.szFilename, .pclsid>,  'GetClassFile',  \
    GetConvertStg, N, <.pStg>,  'GetConvertStg',  \
    GetDocumentBitStg, N, <NONE>,  'GetDocumentBitStg',  \
    GetErrorInfo, N, <.dwReserved, .pperrinfo>,  'GetErrorInfo',  \
    GetHGlobalFromILockBytes, N, <.plkbyt, .phglobal>,  'GetHGlobalFromILockBytes',  \
    GetHGlobalFromStream, N, <.pstm, .phglobal>,  'GetHGlobalFromStream',  \
    GetHookInterface, N, <NONE>,  'GetHookInterface',  \
    GetRunningObjectTable, N, <.reserved, .pprot>,  'GetRunningObjectTable',  \
    HACCEL_UserFree, N, <.pLong, .pHaccel>,  'HACCEL_UserFree',  \
    HACCEL_UserMarshal, N, <.pLong, .pChar, .pHaccel>,  'HACCEL_UserMarshal',  \
    HACCEL_UserSize, N, <.pLong, .lLong, .pHaccel>,  'HACCEL_UserSize',  \
    HACCEL_UserUnmarshal, N, <.pLong, .pChar, .pHaccel>,  'HACCEL_UserUnmarshal',  \
    HBITMAP_UserFree, N, <.pLong, .pHbitmap>,  'HBITMAP_UserFree',  \
    HBITMAP_UserMarshal, N, <.pLong, .pChar, .pHbitmap>,  'HBITMAP_UserMarshal',  \
    HBITMAP_UserSize, N, <.pLong, .lLong, .pHbitmap>,  'HBITMAP_UserSize',  \
    HBITMAP_UserUnmarshal, N, <.pLong, .pChar, .pHbitmap>,  'HBITMAP_UserUnmarshal',  \
    HBRUSH_UserFree, N, <NONE>,  'HBRUSH_UserFree',  \
    HBRUSH_UserMarshal, N, <NONE>,  'HBRUSH_UserMarshal',  \
    HBRUSH_UserSize, N, <NONE>,  'HBRUSH_UserSize',  \
    HBRUSH_UserUnmarshal, N, <NONE>,  'HBRUSH_UserUnmarshal',  \
    HDC_UserFree, N, <.pLong, .pHdc>,  'HDC_UserFree',  \
    HDC_UserMarshal, N, <.pLong, .pChar, .pHdc>,  'HDC_UserMarshal',  \
    HDC_UserSize, N, <.pLong, .lLong, .pHdc>,  'HDC_UserSize',  \
    HDC_UserUnmarshal, N, <.pLong, .pChar, .pHdc>,  'HDC_UserUnmarshal',  \
    HENHMETAFILE_UserFree, N, <NONE>,  'HENHMETAFILE_UserFree',  \
    HENHMETAFILE_UserMarshal, N, <NONE>,  'HENHMETAFILE_UserMarshal',  \
    HENHMETAFILE_UserSize, N, <NONE>,  'HENHMETAFILE_UserSize',  \
    HENHMETAFILE_UserUnmarshal, N, <NONE>,  'HENHMETAFILE_UserUnmarshal',  \
    HGLOBAL_UserFree, N, <.pLong, .pHglobal>,  'HGLOBAL_UserFree',  \
    HGLOBAL_UserMarshal, N, <.pLong, .pChar, .pHglobal>,  'HGLOBAL_UserMarshal',  \
    HGLOBAL_UserSize, N, <.pLong, .lLong, .pHglobal>,  'HGLOBAL_UserSize',  \
    HGLOBAL_UserUnmarshal, N, <.pLong, .pChar, .pHglobal>,  'HGLOBAL_UserUnmarshal',  \
    HICON_UserFree, N, <.pLong, .pHicon>,  'HICON_UserFree',  \
    HICON_UserMarshal, N, <.pLong, .pChar, .pHicon>,  'HICON_UserMarshal',  \
    HICON_UserSize, N, <.pLong, .llong, .pHicon>,  'HICON_UserSize',  \
    HICON_UserUnmarshal, N, <.pLong, .pChar, .pHicon>,  'HICON_UserUnmarshal',  \
    HMENU_UserFree, N, <.pLong, .pHmenu>,  'HMENU_UserFree',  \
    HMENU_UserMarshal, N, <.pLong, .pChar, .pHmenu>,  'HMENU_UserMarshal',  \
    HMENU_UserSize, N, <.pLong, .lLong, .pHmenu>,  'HMENU_UserSize',  \
    HMENU_UserUnmarshal, N, <.pLong, .pChar, .pHmenu>,  'HMENU_UserUnmarshal',  \
    HMETAFILEPICT_UserFree, N, <NONE>,  'HMETAFILEPICT_UserFree',  \
    HMETAFILEPICT_UserMarshal, N, <NONE>,  'HMETAFILEPICT_UserMarshal',  \
    HMETAFILEPICT_UserSize, N, <NONE>,  'HMETAFILEPICT_UserSize',  \
    HMETAFILEPICT_UserUnmarshal, N, <NONE>,  'HMETAFILEPICT_UserUnmarshal',  \
    HMETAFILE_UserFree, N, <NONE>,  'HMETAFILE_UserFree',  \
    HMETAFILE_UserMarshal, N, <NONE>,  'HMETAFILE_UserMarshal',  \
    HMETAFILE_UserSize, N, <NONE>,  'HMETAFILE_UserSize',  \
    HMETAFILE_UserUnmarshal, N, <NONE>,  'HMETAFILE_UserUnmarshal',  \
    HPALETTE_UserFree, N, <.pLong, .pHpalette>,  'HPALETTE_UserFree',  \
    HPALETTE_UserMarshal, N, <.pLong, .pChar, .pHpalette>,  'HPALETTE_UserMarshal',  \
    HPALETTE_UserSize, N, <.pLong, .lLong, .pHpalette>,  'HPALETTE_UserSize',  \
    HPALETTE_UserUnmarshal, N, <.pLong, .pChar, .pHpalette>,  'HPALETTE_UserUnmarshal',  \
    HWND_UserFree, N, <.pLong, .pHwnd>,  'HWND_UserFree',  \
    HWND_UserMarshal, N, <.pLong, .pChar, .pHwnd>,  'HWND_UserMarshal',  \
    HWND_UserSize, N, <.pLong, .lLong, .pHwnd>,  'HWND_UserSize',  \
    HWND_UserUnmarshal, N, <.pLong, .pChar, .pHwnd>,  'HWND_UserUnmarshal',  \
    HkOleRegisterObject, N, <NONE>,  'HkOleRegisterObject',  \
    IIDFromString, N, <.lpsz, .lpiid>,  'IIDFromString',  \
    IsAccelerator, N, <.hAccel, .cAccelEntries, .lpMsg, .lpwCmd>,  'IsAccelerator',  \
    IsEqualGUID, N, <NONE>,  'IsEqualGUID',  \
    IsValidIid, N, <NONE>,  'IsValidIid',  \
    IsValidInterface, N, <NONE>,  'IsValidInterface',  \
    IsValidPtrIn, N, <NONE>,  'IsValidPtrIn',  \
    IsValidPtrOut, N, <NONE>,  'IsValidPtrOut',  \
    MkParseDisplayName, N, <.pbc, .szUserName, .pchEaten, .ppmk>,  'MkParseDisplayName',  \
    MonikerCommonPrefixWith, N, <.pmkThis, .pmkOther, .ppmkCommon>,  'MonikerCommonPrefixWith',  \
    MonikerRelativePathTo, N, <.pmkSrc, .pmkDest, .ppmkRelPath, .dwReserved>,  'MonikerRelativePathTo',  \
    OleBuildVersion, N, <VOID>,  'OleBuildVersion',  \
    OleConvertIStorageToOLESTREAM, N, <.pstg, .lpolestream>,  'OleConvertIStorageToOLESTREAM',  \
    OleConvertIStorageToOLESTREAMEx, N, <.pstg, .cfFormat, .lWidth, .lHeight, .dwSize, .pmedium, .polestm>,  'OleConvertIStorageToOLESTREAMEx',  \
    OleConvertOLESTREAMToIStorage, N, <.lpolestream, .pstg, .ptd>,  'OleConvertOLESTREAMToIStorage',  \
    OleConvertOLESTREAMToIStorageEx, N, <.polestm, .pstg, .pcfFormat, .plwWidth, .plHeight, .pdwSize, .pmedium>,  'OleConvertOLESTREAMToIStorageEx',  \
    OleCreate, N, <.rclsid, .riid, .renderopt, .pFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreate',  \
    OleCreateDefaultHandler, N, <.clsid, .pUnkOuter, .riid, .lplpObj>,  'OleCreateDefaultHandler',  \
    OleCreateEmbeddingHelper, N, <.clsid, .pUnkOuter, .flags, .pCF, .riid, .lplpObj>,  'OleCreateEmbeddingHelper',  \
    OleCreateEx, N, <.rclsid, .riid, .dwFlags, .renderopt, .cFormats, .rgAdvf, .rgFormatEtc, .lpAdviseSink, .rgdwConnection, .pClientSite, .pStg, .ppvObj>,  'OleCreateEx',  \
    OleCreateFromData, N, <.pSrcDataObj, .riid, .renderopt, .pFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreateFromData',  \
    OleCreateFromDataEx, N, <.pSrcDataObj, .riid, .dwFlags, .renderopt, .cFormats, .rgAdvf, .rgFormatEtc, .lpAdviseSink, .rgdwConnection, .pClientSite, .pStg, .ppvObj>,  'OleCreateFromDataEx',  \
    OleCreateFromFile, N, <.rclsid, .lpszFileName, .riid, .renderopt, .lpFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreateFromFile',  \
    OleCreateFromFileEx, N, <.rclsid, .lpszFileName, .riid, .dwFlags, .renderopt, .cFormats, .rgAdvf, .rgFormatEtc, .lpAdviseSink, .rgdwConnection, .pClientSite, .pStg, .ppvObj>,  'OleCreateFromFileEx',  \
    OleCreateLink, N, <.pmkLinkSrc, .riid, .renderopt, .lpFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreateLink',  \
    OleCreateLinkEx, N, <.pmkLinkSrc, .riid, .dwFlags, .renderopt, .cFormats, .rgAdvf, .rgFormatEtc, .lpAdviseSink, .rgdwConnection, .pClientSite, .pStg, .ppvObj>,  'OleCreateLinkEx',  \
    OleCreateLinkFromData, N, <.pSrcDataObj, .riid, .renderopt, .pFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreateLinkFromData',  \
    OleCreateLinkFromDataEx, N, <.pSrcDataObj, .riid, .dwFlags, .renderopt, .cFormats, .rgAdvf, .rgFormatEtc, .lpAdviseSink, .rgdwConnection, .pClientSite, .pStg, .ppvObj>,  'OleCreateLinkFromDataEx',  \
    OleCreateLinkToFile, N, <.lpszFileName, .riid, .renderopt, .lpFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreateLinkToFile',  \
    OleCreateLinkToFileEx, N, <.lpszFileName, .riid, .dwFlags, .renderopt, .cFormats, .rgAdvf, .rgFormatEtc, .lpAdviseSink, .rgdwConnection, .pClientSite, .pStg, .ppvObj>,  'OleCreateLinkToFileEx',  \
    OleCreateMenuDescriptor, N, <.hmenuCombined, .lpMenuWidths>,  'OleCreateMenuDescriptor',  \
    OleCreateStaticFromData, N, <.pSrcDataObj, .iid, .renderopt, .pFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreateStaticFromData',  \
    OleDestroyMenuDescriptor, N, <.holemenu>,  'OleDestroyMenuDescriptor',  \
    OleDoAutoConvert, N, <.pStg, .pClsidNew>,  'OleDoAutoConvert',  \
    OleDraw, N, <.pUnknown, .dwAspect, .hdcDraw, .lprcBounds>,  'OleDraw',  \
    OleDuplicateData, N, <.hSrc, .cfFormat, .uiFlags>,  'OleDuplicateData',  \
    OleFlushClipboard, N, <VOID>,  'OleFlushClipboard',  \
    OleGetAutoConvert, N, <.clsidOld, .pClsidNew>,  'OleGetAutoConvert',  \
    OleGetClipboard, N, <.ppDataObj>,  'OleGetClipboard',  \
    OleGetIconOfClass, N, <.rclsid, .lpszLabel, .fUseTypeAsLabel>,  'OleGetIconOfClass',  \
    OleGetIconOfFile, N, <.lpszPath, .fUseFileAsLabel>,  'OleGetIconOfFile',  \
    OleInitialize, N, <.pvReserved>,  'OleInitialize',  \
    OleInitializeWO, W, <NONE>,  'OleInitializeWOW',  \
    OleIsCurrentClipboard, N, <.pDataObj>,  'OleIsCurrentClipboard',  \
    OleIsRunning, N, <.pObject>,  'OleIsRunning',  \
    OleLoad, N, <.pStg, .riid, .pClientSite, .ppvObj>,  'OleLoad',  \
    OleLoadFromStream, N, <.pStm, .iidInterface, .ppvObj>,  'OleLoadFromStream',  \
    OleLockRunning, N, <.pUnknown, .fLock, .fLastUnlockCloses>,  'OleLockRunning',  \
    OleMetafilePictFromIconAndLabel, N, <.hIcon, .lpszLabel, .lpszSourceFile, .iIconIndex>,  'OleMetafilePictFromIconAndLabel',  \
    OleNoteObjectVisible, N, <.pUnknown, .fVisible>,  'OleNoteObjectVisible',  \
    OleQueryCreateFromData, N, <.pSrcDataObject>,  'OleQueryCreateFromData',  \
    OleQueryLinkFromData, N, <.pSrcDataObject>,  'OleQueryLinkFromData',  \
    OleRegEnumFormatEtc, N, <.clsid, .dwDirection, .ppenum>,  'OleRegEnumFormatEtc',  \
    OleRegEnumVerbs, N, <.clsid, .ppenum>,  'OleRegEnumVerbs',  \
    OleRegGetMiscStatus, N, <.clsid, .dwAspect, .pdwStatus>,  'OleRegGetMiscStatus',  \
    OleRegGetUserType, N, <.clsid, .dwFormOfType, .pszUserType>,  'OleRegGetUserType',  \
    OleRun, N, <.pUnknown>,  'OleRun',  \
    OleSave, N, <.pPS, .pStg, .fSameAsLoad>,  'OleSave',  \
    OleSaveToStream, N, <.pPStm, .pStm>,  'OleSaveToStream',  \
    OleSetAutoConvert, N, <.clsidOld, .clsidNew>,  'OleSetAutoConvert',  \
    OleSetClipboard, N, <.pDataObj>,  'OleSetClipboard',  \
    OleSetContainedObject, N, <.pUnknown, .fContained>,  'OleSetContainedObject',  \
    OleSetMenuDescriptor, N, <.holemenu, .hwndFrame, .hwndActiveObject, .lpFrame, .lpActiveObj>,  'OleSetMenuDescriptor',  \
    OleTranslateAccelerator, N, <.lpFrame, .lpFrameInfo, .lpmsg>,  'OleTranslateAccelerator',  \
    OleUninitialize, N, <VOID>,  'OleUninitialize',  \
    OpenOrCreateStream, N, <NONE>,  'OpenOrCreateStream',  \
    ProgIDFromCLSID, N, <.clsid, .lplpszProgID>,  'ProgIDFromCLSID',  \
    PropStgNameToFmtId, N, <.oszName, .pfmtid>,  'PropStgNameToFmtId',  \
    PropSysAllocString, N, <NONE>,  'PropSysAllocString',  \
    PropSysFreeString, N, <NONE>,  'PropSysFreeString',  \
    PropVariantChangeType, N, <NONE>,  'PropVariantChangeType',  \
    PropVariantClear, N, <.pvar>,  'PropVariantClear',  \
    PropVariantCopy, N, <.pvarDest, .pvarSrc>,  'PropVariantCopy',  \
    ReadClassStg, N, <.pStg, .pclsid>,  'ReadClassStg',  \
    ReadClassStm, N, <.pStm, .pclsid>,  'ReadClassStm',  \
    ReadFmtUserTypeStg, N, <.pstg, .pcf, .lplpszUserType>,  'ReadFmtUserTypeStg',  \
    ReadOleStg, N, <NONE>,  'ReadOleStg',  \
    ReadStringStream, N, <NONE>,  'ReadStringStream',  \
    RegisterDragDrop, N, <.hwnd, .pDropTarget>,  'RegisterDragDrop',  \
    ReleaseStgMedium, N, <.lpstgmedium>,  'ReleaseStgMedium',  \
    RevokeDragDrop, N, <.hwnd>,  'RevokeDragDrop',  \
    SNB_UserFree, N, <.pLong, .pSnb>,  'SNB_UserFree',  \
    SNB_UserMarshal, N, <.pLong, .pChar, .pSnb>,  'SNB_UserMarshal',  \
    SNB_UserSize, N, <.pLong, .lLong, .pSnb>,  'SNB_UserSize',  \
    SNB_UserUnmarshal, N, <.pLong, .pChar, .pSnb>,  'SNB_UserUnmarshal',  \
    STGMEDIUM_UserFree, N, <.pLong, .pStgmedium>,  'STGMEDIUM_UserFree',  \
    STGMEDIUM_UserMarshal, N, <.pLong, .pChar, .pStgmedium>,  'STGMEDIUM_UserMarshal',  \
    STGMEDIUM_UserSize, N, <.pLong, .long, .pStgmedium>,  'STGMEDIUM_UserSize',  \
    STGMEDIUM_UserUnmarshal, N, <.pLong, .pChar, .pStgmedium>,  'STGMEDIUM_UserUnmarshal',  \
    SetConvertStg, N, <.pStg, .fConvert>,  'SetConvertStg',  \
    SetDocumentBitStg, N, <NONE>,  'SetDocumentBitStg',  \
    SetErrorInfo, N, <.dwReserved, .perrinfo>,  'SetErrorInfo',  \
    StgConvertPropertyToVariant, N, <NONE>,  'StgConvertPropertyToVariant',  \
    StgConvertVariantToProperty, N, <NONE>,  'StgConvertVariantToProperty',  \
    StgCreateDocfile, N, <.pwcsName, .grfMode, .reserved, .ppstgOpen>,  'StgCreateDocfile',  \
    StgCreateDocfileOnILockBytes, N, <.plkbyt, .grfMode, .reserved, .ppstgOpen>,  'StgCreateDocfileOnILockBytes',  \
    StgCreatePropSetStg, N, <.pStorage, .dwReserved, .ppPropSetStg>,  'StgCreatePropSetStg',  \
    StgCreatePropStg, N, <.pUnk, .fmtid, .pclsid, .grfFlags, .dwReserved, .ppPropStg>,  'StgCreatePropStg',  \
    StgCreateStorageEx, N, <.pwcsName, .grfMode, .stgfmt, .grfAttrs, .pStgOptions, .reserved, .riid, .ppObjectOpen>,  'StgCreateStorageEx',  \
    StgGetIFillLockBytesOnFile, N, <.pwcsName, .ppflb>,  'StgGetIFillLockBytesOnFile',  \
    StgGetIFillLockBytesOnILockBytes, N, <.pilb, .ppflb>,  'StgGetIFillLockBytesOnILockBytes',  \
    StgIsStorageFile, N, <.pwcsName>,  'StgIsStorageFile',  \
    StgIsStorageILockBytes, N, <.plkbyt>,  'StgIsStorageILockBytes',  \
    StgOpenAsyncDocfileOnIFillLockBytes, N, <.pflb, .grfMode, .asyncFlags, .ppstgOpen>,  'StgOpenAsyncDocfileOnIFillLockBytes',  \
    StgOpenPropStg, N, <.pUnk, .fmtid, .grfFlags, .dwReserved, .ppPropStg>,  'StgOpenPropStg',  \
    StgOpenStorage, N, <.pwcsName, .pstgPriority, .grfMode, .snbExclude, .reserved, .ppstgOpen>,  'StgOpenStorage',  \
    StgOpenStorageEx, N, <.pwcsName, .grfMode, .stgfmt, .grfAttrs, .pStgOptions, .reserved, .riid, .ppObjectOpen>,  'StgOpenStorageEx',  \
    StgOpenStorageOnHandle, N, <NONE>,  'StgOpenStorageOnHandle',  \
    StgOpenStorageOnILockBytes, N, <.plkbyt, .pstgPriority, .grfMode, .snbExclude, .reserved, .ppstgOpen>,  'StgOpenStorageOnILockBytes',  \
    StgPropertyLengthAsVariant, N, <NONE>,  'StgPropertyLengthAsVariant',  \
    StgSetTimes, N, <.lpszName, .pctime, .patime, .pmtime>,  'StgSetTimes',  \
    StringFromCLSID, N, <.rclsid, .lplpsz>,  'StringFromCLSID',  \
    StringFromGUID2, N, <.rguid, .lpsz, .cchMax>,  'StringFromGUID2',  \
    StringFromIID, N, <.rclsid, .lplpsz>,  'StringFromIID',  \
    UpdateDCOMSettings, N, <NONE>,  'UpdateDCOMSettings',  \
    UtConvertDvtd16toDvtd32, N, <NONE>,  'UtConvertDvtd16toDvtd32',  \
    UtConvertDvtd32toDvtd16, N, <NONE>,  'UtConvertDvtd32toDvtd16',  \
    UtGetDvtd16Info, N, <NONE>,  'UtGetDvtd16Info',  \
    UtGetDvtd32Info, N, <NONE>,  'UtGetDvtd32Info',  \
    WdtpInterfacePointer_UserFree, N, <NONE>,  'WdtpInterfacePointer_UserFree',  \
    WdtpInterfacePointer_UserMarshal, N, <NONE>,  'WdtpInterfacePointer_UserMarshal',  \
    WdtpInterfacePointer_UserSize, N, <NONE>,  'WdtpInterfacePointer_UserSize',  \
    WdtpInterfacePointer_UserUnmarshal, N, <NONE>,  'WdtpInterfacePointer_UserUnmarshal',  \
    WriteClassStg, N, <.pStg, .rclsid>,  'WriteClassStg',  \
    WriteClassStm, N, <.pStm, .rclsid>,  'WriteClassStm',  \
    WriteFmtUserTypeStg, N, <.pstg, .cf, .lpszUserType>,  'WriteFmtUserTypeStg',  \
    WriteOleStg, N, <NONE>,  'WriteOleStg',  \
    WriteStringStream, N, <NONE>,  'WriteStringStream'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































































































































































































































































































































































































































































































































































Deleted freshlib/imports/Win32/api/shell32.inc.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
;   shell32.dll API calls (ASCII)
import_proto shell32,  \
    Activate_RunDLL, N, <NONE>,  'Activate_RunDLL',  \
    AppCompat_RunDLL, W, <NONE>,  'AppCompat_RunDLLW',  \
    CDefFolderMenu_Create, N, <NONE>,  'CDefFolderMenu_Create',  \
    CDefFolderMenu_Create2, N, <NONE>,  'CDefFolderMenu_Create2',  \
    CallCPLEntry16, N, <NONE>,  'CallCPLEntry16',  \
    CheckEscapes, A, <NONE>,  'CheckEscapesA',  \
    CheckEscapes, W, <NONE>,  'CheckEscapesW',  \
    CommandLineToArgv, W, <.lpCmdLine, .pNumArgs>,  'CommandLineToArgvW',  \
    Control_FillCache_RunDLL, A, <NONE>,  'Control_FillCache_RunDLLA',  \
    Control_FillCache_RunDLL, W, <NONE>,  'Control_FillCache_RunDLLW',  \
    Control_RunDLL, A, <NONE>,  'Control_RunDLLA',  \
    Control_RunDLLAsUser, W, <NONE>,  'Control_RunDLLAsUserW',  \
    Control_RunDLL, W, <NONE>,  'Control_RunDLLW',  \
    DAD_AutoScroll, N, <NONE>,  'DAD_AutoScroll',  \
    DAD_DragEnterEx, N, <NONE>,  'DAD_DragEnterEx',  \
    DAD_DragEnterEx2, N, <NONE>,  'DAD_DragEnterEx2',  \
    DAD_DragLeave, N, <NONE>,  'DAD_DragLeave',  \
    DAD_DragMove, N, <NONE>,  'DAD_DragMove',  \
    DAD_SetDragImage, N, <NONE>,  'DAD_SetDragImage',  \
    DAD_ShowDragImage, N, <NONE>,  'DAD_ShowDragImage',  \
    DllCanUnloadNow, N, <VOID>,  'DllCanUnloadNow',  \
    DllGetClassObject, N, <.rclsid, .riid, .ppv>,  'DllGetClassObject',  \
\;    DllGetVersion, N, <NONE>,  'DllGetVersion',  \
\;    DllInstall, N, <.bInstall, .pszCmdLine>,  'DllInstall',  \
    DllRegisterServer, N, <VOID>,  'DllRegisterServer',  \
    DllUnregisterServer, N, <VOID>,  'DllUnregisterServer',  \
    DoEnvironmentSubst, A, <.szString, .cbString>,  'DoEnvironmentSubstA',  \
    DoEnvironmentSubst, W, <.szString, .cbString>,  'DoEnvironmentSubstW',  \
    DragAcceptFiles, N, <.hwnd, .fAccept>,  'DragAcceptFiles',  \
    DragFinish, N, <.hDrop>,  'DragFinish',  \
    DragQueryFile, A, <.HDROP, .UINT, .lpStr, .ch>,  'DragQueryFileA',  \
    DragQueryFile, W, <.HDROP, .UINT, .lpStr, .ch>,  'DragQueryFileW',  \
    DragQueryFileAorW, N, <NONE>,  'DragQueryFileAorW',  \
    DragQueryPoint, N, <.HDROP, .lpPoint>,  'DragQueryPoint',  \
    DriveType, N, <NONE>,  'DriveType',  \
    DuplicateIcon, N, <.hInst, .hIcon>,  'DuplicateIcon',  \
    ExtractAssociatedIcon, A, <.hInst, .lpIconPath, .lpiIcon>,  'ExtractAssociatedIconA',  \
    ExtractAssociatedIconEx, A, <NONE>,  'ExtractAssociatedIconExA',  \
    ExtractAssociatedIconEx, W, <NONE>,  'ExtractAssociatedIconExW',  \
    ExtractAssociatedIcon, W, <.hInst, .lpIconPath, .lpiIcon>,  'ExtractAssociatedIconW',  \
    ExtractIcon, A, <.hInst, .lpszExeFileName, .nIconIndex>,  'ExtractIconA',  \
    ExtractIconEx, A, <.lpszFile, .nIconIndex, .phiconLarge, .phiconSmall, .nIcons>,  'ExtractIconExA',  \
    ExtractIconEx, W, <.lpszFile, .nIconIndex, .phiconLarge, .phiconSmall, .nIcons>,  'ExtractIconExW',  \
    ExtractIconResInfo, A, <NONE>,  'ExtractIconResInfoA',  \
    ExtractIconResInfo, W, <NONE>,  'ExtractIconResInfoW',  \
    ExtractIcon, W, <.hInst, .lpszExeFileName, .nIconIndex>,  'ExtractIconW',  \
    ExtractVersionResource16, W, <NONE>,  'ExtractVersionResource16W',  \
    FindExeDlgProc, N, <NONE>,  'FindExeDlgProc',  \
    FindExecutable, A, <.lpFile, .lpDirectory, .lpResult>,  'FindExecutableA',  \
    FindExecutable, W, <.lpFile, .lpDirectory, .lpResult>,  'FindExecutableW',  \
    FreeIconList, N, <NONE>,  'FreeIconList',  \
    GetFileNameFromBrowse, N, <NONE>,  'GetFileNameFromBrowse',  \
    ILAppendID, N, <NONE>,  'ILAppendID',  \
    ILClone, N, <NONE>,  'ILClone',  \
    ILCloneFirst, N, <NONE>,  'ILCloneFirst',  \
    ILCombine, N, <NONE>,  'ILCombine',  \
    ILCreateFromPath, A, <NONE>,  'ILCreateFromPathA',  \
    ILCreateFromPath, W, <NONE>,  'ILCreateFromPathW',  \
    ILFindChild, N, <NONE>,  'ILFindChild',  \
    ILFindLastID, N, <NONE>,  'ILFindLastID',  \
    ILFree, N, <NONE>,  'ILFree',  \
    ILGetNext, N, <NONE>,  'ILGetNext',  \
    ILGetSize, N, <NONE>,  'ILGetSize',  \
    ILIsEqual, N, <NONE>,  'ILIsEqual',  \
    ILIsParent, N, <NONE>,  'ILIsParent',  \
    ILLoadFromStream, N, <NONE>,  'ILLoadFromStream',  \
    ILRemoveLastID, N, <NONE>,  'ILRemoveLastID',  \
    ILSaveToStream, N, <NONE>,  'ILSaveToStream',  \
    InternalExtractIconList, A, <NONE>,  'InternalExtractIconListA',  \
    InternalExtractIconList, W, <NONE>,  'InternalExtractIconListW',  \
    IsLFNDrive, A, <NONE>,  'IsLFNDriveA',  \
    IsLFNDrive, W, <NONE>,  'IsLFNDriveW',  \
    IsNetDrive, N, <NONE>,  'IsNetDrive',  \
    IsUserAnAdmin, N, <NONE>,  'IsUserAnAdmin',  \
    OpenAs_RunDLL, A, <NONE>,  'OpenAs_RunDLLA',  \
    OpenAs_RunDLL, W, <NONE>,  'OpenAs_RunDLLW',  \
    OpenRegStream, N, <NONE>,  'OpenRegStream',  \
    Options_RunDLL, A, <NONE>,  'Options_RunDLLA',  \
    Options_RunDLL, W, <NONE>,  'Options_RunDLLW',  \
    PathCleanupSpec, N, <NONE>,  'PathCleanupSpec',  \
    PathGetShortPath, N, <NONE>,  'PathGetShortPath',  \
    PathIsExe, N, <NONE>,  'PathIsExe',  \
    PathIsSlow, A, <NONE>,  'PathIsSlowA',  \
    PathIsSlow, W, <NONE>,  'PathIsSlowW',  \
    PathMakeUniqueName, N, <NONE>,  'PathMakeUniqueName',  \
    PathProcessCommand, N, <NONE>,  'PathProcessCommand',  \
    PathQualify, N, <NONE>,  'PathQualify',  \
    PathResolve, N, <NONE>,  'PathResolve',  \
    PathYetAnotherMakeUniqueName, N, <NONE>,  'PathYetAnotherMakeUniqueName',  \
    PickIconDlg, N, <NONE>,  'PickIconDlg',  \
    PifMgr_CloseProperties, N, <NONE>,  'PifMgr_CloseProperties',  \
    PifMgr_GetProperties, N, <NONE>,  'PifMgr_GetProperties',  \
    PifMgr_OpenProperties, N, <NONE>,  'PifMgr_OpenProperties',  \
    PifMgr_SetProperties, N, <NONE>,  'PifMgr_SetProperties',  \
    PrintersGetCommand_RunDLL, A, <NONE>,  'PrintersGetCommand_RunDLLA',  \
    PrintersGetCommand_RunDLL, W, <NONE>,  'PrintersGetCommand_RunDLLW',  \
    ReadCabinetState, N, <NONE>,  'ReadCabinetState',  \
    RealDriveType, N, <NONE>,  'RealDriveType',  \
    RealShellExecute, A, <NONE>,  'RealShellExecuteA',  \
    RealShellExecuteEx, A, <NONE>,  'RealShellExecuteExA',  \
    RealShellExecuteEx, W, <NONE>,  'RealShellExecuteExW',  \
    RealShellExecute, W, <NONE>,  'RealShellExecuteW',  \
    RegenerateUserEnvironment, N, <NONE>,  'RegenerateUserEnvironment',  \
    RestartDialog, N, <NONE>,  'RestartDialog',  \
    RestartDialogEx, N, <NONE>,  'RestartDialogEx',  \
    SHAddFromPropSheetExtArray, N, <NONE>,  'SHAddFromPropSheetExtArray',  \
    SHAddToRecentDocs, N, <.uFlags, .pv>,  'SHAddToRecentDocs',  \
    SHAlloc, N, <NONE>,  'SHAlloc',  \
    SHAllocShared, N, <NONE>,  'SHAllocShared',  \
    SHAppBarMessage, N, <.dwMessage, .pData>,  'SHAppBarMessage',  \
    SHBindToParent, N, <.pidl, .riid, .ppv, .ppidlLast>,  'SHBindToParent',  \
    SHBrowseForFolder, A, <.lpbi>,  'SHBrowseForFolderA',  \
    SHBrowseForFolder, W, <.lpbi>,  'SHBrowseForFolderW',  \
    SHCLSIDFromString, N, <NONE>,  'SHCLSIDFromString',  \
    SHChangeNotification_Lock, N, <NONE>,  'SHChangeNotification_Lock',  \
    SHChangeNotification_Unlock, N, <NONE>,  'SHChangeNotification_Unlock',  \
    SHChangeNotify, N, <.wEventId, .uFlags, .dwItem1, .dwItem2>,  'SHChangeNotify',  \
    SHChangeNotifyDeregister, N, <NONE>,  'SHChangeNotifyDeregister',  \
    SHChangeNotifyRegister, N, <NONE>,  'SHChangeNotifyRegister',  \
    SHChangeNotifySuspendResume, N, <NONE>,  'SHChangeNotifySuspendResume',  \
    SHCloneSpecialIDList, N, <NONE>,  'SHCloneSpecialIDList',  \
    SHCoCreateInstance, N, <NONE>,  'SHCoCreateInstance',  \
    SHCreateDirectory, N, <NONE>,  'SHCreateDirectory',  \
    SHCreateDirectoryEx, A, <.hwnd, .pszPath, .psa>,  'SHCreateDirectoryExA',  \
    SHCreateDirectoryEx, W, <.hwnd, .pszPath, .psa>,  'SHCreateDirectoryExW',  \
    SHCreateFileExtractIcon, W, <NONE>,  'SHCreateFileExtractIconW',  \
    SHCreateLocalServerRunDll, N, <NONE>,  'SHCreateLocalServerRunDll',  \
    SHCreateProcessAsUser, W, <NONE>,  'SHCreateProcessAsUserW',  \
    SHCreatePropSheetExtArray, N, <NONE>,  'SHCreatePropSheetExtArray',  \
    SHCreateQueryCancelAutoPlayMoniker, N, <NONE>,  'SHCreateQueryCancelAutoPlayMoniker',  \
    SHCreateShellFolderView, N, <NONE>,  'SHCreateShellFolderView',  \
    SHCreateShellFolderViewEx, N, <NONE>,  'SHCreateShellFolderViewEx',  \
    SHCreateShellItem, N, <NONE>,  'SHCreateShellItem',  \
    SHCreateStdEnumFmtEtc, N, <NONE>,  'SHCreateStdEnumFmtEtc',  \
    SHDefExtractIcon, A, <NONE>,  'SHDefExtractIconA',  \
    SHDefExtractIcon, W, <NONE>,  'SHDefExtractIconW',  \
    SHDestroyPropSheetExtArray, N, <NONE>,  'SHDestroyPropSheetExtArray',  \
    SHDoDragDrop, N, <NONE>,  'SHDoDragDrop',  \
    SHEmptyRecycleBin, A, <.hwnd, .pszRootPath, .dwFlags>,  'SHEmptyRecycleBinA',  \
    SHEmptyRecycleBin, W, <.hwnd, .pszRootPath, .dwFlags>,  'SHEmptyRecycleBinW',  \
    SHEnableServiceObject, N, <NONE>,  'SHEnableServiceObject',  \
    SHEnumerateUnreadMailAccounts, W, <NONE>,  'SHEnumerateUnreadMailAccountsW',  \
    SHExtractIcons, W, <NONE>,  'SHExtractIconsW',  \
    SHFileOperation, A, <.lpFileOp>,  'SHFileOperationA',  \
    SHFileOperation, W, <.lpFileOp>,  'SHFileOperationW',  \
    SHFindFiles, N, <NONE>,  'SHFindFiles',  \
    SHFind_InitMenuPopup, N, <NONE>,  'SHFind_InitMenuPopup',  \
    SHFlushClipboard, N, <NONE>,  'SHFlushClipboard',  \
    SHFlushSFCache, N, <NONE>,  'SHFlushSFCache',  \
    SHFormatDrive, N, <NONE>,  'SHFormatDrive',  \
    SHFree, N, <NONE>,  'SHFree',  \
    SHFreeNameMappings, N, <.hNameMappings>,  'SHFreeNameMappings',  \
    SHFreeShared, N, <NONE>,  'SHFreeShared',  \
    SHGetAttributesFromDataObject, N, <NONE>,  'SHGetAttributesFromDataObject',  \
    SHGetDataFromIDList, A, <.psf, .pidl, .nFormat, .pv, .cb>,  'SHGetDataFromIDListA',  \
    SHGetDataFromIDList, W, <.psf, .pidl, .nFormat, .pv, .cb>,  'SHGetDataFromIDListW',  \
    SHGetDesktopFolder, N, <.ppshf>,  'SHGetDesktopFolder',  \
    SHGetDiskFreeSpace, A, <NONE>,  'SHGetDiskFreeSpaceA',  \
    SHGetDiskFreeSpaceEx, A, <.pszDirectoryName, .pulFreeBytesAvailableToCaller, .pulTotalNumberOfBytes, .pulTotalNumberOfFreeBytes>,  'SHGetDiskFreeSpaceExA',  \
    SHGetDiskFreeSpaceEx, W, <.pszDirectoryName, .pulFreeBytesAvailableToCaller, .pulTotalNumberOfBytes, .pulTotalNumberOfFreeBytes>,  'SHGetDiskFreeSpaceExW',  \
    SHGetFileInfo, A, <.pszPath, .dwFileAttributes, .psfi, .cbFileInfo, .uFlags>,  'SHGetFileInfoA',  \
    SHGetFileInfo, W, <.pszPath, .dwFileAttributes, .psfi, .cbFileInfo, .uFlags>,  'SHGetFileInfoW',  \
    SHGetFolderLocation, N, <.hwnd, .csidl, .hToken, .dwFlags, .ppidl>,  'SHGetFolderLocation',  \
    SHGetFolderPath, A, <.hwnd, .csidl, .hToken, .dwFlags, .pszPath>,  'SHGetFolderPathA',  \
    SHGetFolderPathAndSubDir, A, <NONE>,  'SHGetFolderPathAndSubDirA',  \
    SHGetFolderPathAndSubDir, W, <NONE>,  'SHGetFolderPathAndSubDirW',  \
    SHGetFolderPath, W, <.hwnd, .csidl, .hToken, .dwFlags, .pszPath>,  'SHGetFolderPathW',  \
    SHGetIconOverlayIndex, A, <.pszIconPath, .iIconIndex>,  'SHGetIconOverlayIndexA',  \
    SHGetIconOverlayIndex, W, <.pszIconPath, .iIconIndex>,  'SHGetIconOverlayIndexW',  \
    SHGetImageList, N, <NONE>,  'SHGetImageList',  \
    SHGetInstanceExplorer, N, <.ppunk>,  'SHGetInstanceExplorer',  \
    SHGetMalloc, N, <.ppMalloc>,  'SHGetMalloc',  \
    SHGetNewLinkInfo, A, <.pszLinkto, .pszDir, .pszName, .pfMustCopy, .uFlags>,  'SHGetNewLinkInfoA',  \
    SHGetNewLinkInfo, W, <.pszLinkto, .pszDir, .pszName, .pfMustCopy, .uFlags>,  'SHGetNewLinkInfoW',  \
    SHGetPathFromIDList, A, <.pidl, .pszPath>,  'SHGetPathFromIDListA',  \
    SHGetPathFromIDList, W, <.pidl, .pszPath>,  'SHGetPathFromIDListW',  \
    SHGetRealIDL, N, <NONE>,  'SHGetRealIDL',  \
    SHGetSetFolderCustomSettings, W, <NONE>,  'SHGetSetFolderCustomSettingsW',  \
    SHGetSetSettings, N, <NONE>,  'SHGetSetSettings',  \
    SHGetSettings, N, <.lpsfs, .dwMask>,  'SHGetSettings',  \
    SHGetShellStyleHInstance, N, <NONE>,  'SHGetShellStyleHInstance',  \
    SHGetSpecialFolderLocation, N, <.hwnd, .csidl, .ppidl>,  'SHGetSpecialFolderLocation',  \
    SHGetSpecialFolderPath, A, <.hwnd, .pszPath, .csidl, .fCreate>,  'SHGetSpecialFolderPathA',  \
    SHGetSpecialFolderPath, W, <.hwnd, .pszPath, .csidl, .fCreate>,  'SHGetSpecialFolderPathW',  \
    SHGetUnreadMailCount, W, <NONE>,  'SHGetUnreadMailCountW',  \
    SHHandleUpdateImage, N, <NONE>,  'SHHandleUpdateImage',  \
    SHHelpShortcuts_RunDLL, A, <NONE>,  'SHHelpShortcuts_RunDLLA',  \
    SHHelpShortcuts_RunDLL, W, <NONE>,  'SHHelpShortcuts_RunDLLW',  \
    SHILCreateFromPath, N, <NONE>,  'SHILCreateFromPath',  \
    SHInvokePrinterCommand, A, <.hwnd, .uAction, .lpBuf1, .lpBuf2, .fModal>,  'SHInvokePrinterCommandA',  \
    SHInvokePrinterCommand, W, <.hwnd, .uAction, .lpBuf1, .lpBuf2, .fModal>,  'SHInvokePrinterCommandW',  \
    SHIsFileAvailableOffline, N, <.pwszPath, .pdwStatus>,  'SHIsFileAvailableOffline',  \
    SHLimitInputEdit, N, <NONE>,  'SHLimitInputEdit',  \
    SHLoadInProc, N, <.rclsid>,  'SHLoadInProc',  \
    SHLoadNonloadedIconOverlayIdentifiers, N, <VOID>,  'SHLoadNonloadedIconOverlayIdentifiers',  \
    SHLoadOLE, N, <NONE>,  'SHLoadOLE',  \
    SHLockShared, N, <NONE>,  'SHLockShared',  \
    SHMapIDListToImageListIndexAsync, N, <NONE>,  'SHMapIDListToImageListIndexAsync',  \
    SHMapPIDLToSystemImageListIndex, N, <NONE>,  'SHMapPIDLToSystemImageListIndex',  \
    SHMultiFileProperties, N, <NONE>,  'SHMultiFileProperties',  \
    SHObjectProperties, N, <NONE>,  'SHObjectProperties',  \
    SHOpenFolderAndSelectItems, N, <NONE>,  'SHOpenFolderAndSelectItems',  \
    SHOpenPropSheet, W, <NONE>,  'SHOpenPropSheetW',  \
    SHParseDisplayName, N, <NONE>,  'SHParseDisplayName',  \
    SHPathPrepareForWrite, A, <.hwnd, .punkEnableModless, .pszPath, .dwFlags>,  'SHPathPrepareForWriteA',  \
    SHPathPrepareForWrite, W, <.hwnd, .punkEnableModless, .pszPath, .dwFlags>,  'SHPathPrepareForWriteW',  \
    SHPropStgCreate, N, <NONE>,  'SHPropStgCreate',  \
    SHPropStgReadMultiple, N, <NONE>,  'SHPropStgReadMultiple',  \
    SHPropStgWriteMultiple, N, <NONE>,  'SHPropStgWriteMultiple',  \
    SHQueryRecycleBin, A, <.pszRootPath, .pSHQueryRBInfo>,  'SHQueryRecycleBinA',  \
    SHQueryRecycleBin, W, <.pszRootPath, .pSHQueryRBInfo>,  'SHQueryRecycleBinW',  \
    SHReplaceFromPropSheetExtArray, N, <NONE>,  'SHReplaceFromPropSheetExtArray',  \
    SHRestricted, N, <NONE>,  'SHRestricted',  \
    SHRunControlPanel, N, <NONE>,  'SHRunControlPanel',  \
    SHSetInstanceExplorer, N, <NONE>,  'SHSetInstanceExplorer',  \
    SHSetLocalizedName, N, <NONE>,  'SHSetLocalizedName',  \
    SHSetUnreadMailCount, W, <NONE>,  'SHSetUnreadMailCountW',  \
    SHShellFolderView_Message, N, <NONE>,  'SHShellFolderView_Message',  \
    SHSimpleIDListFromPath, N, <NONE>,  'SHSimpleIDListFromPath',  \
    SHStartNetConnectionDialog, W, <NONE>,  'SHStartNetConnectionDialogW',  \
    SHTestTokenMembership, N, <NONE>,  'SHTestTokenMembership',  \
    SHUnlockShared, N, <NONE>,  'SHUnlockShared',  \
    SHUpdateImage, A, <NONE>,  'SHUpdateImageA',  \
    SHUpdateImage, W, <NONE>,  'SHUpdateImageW',  \
    SHUpdateRecycleBinIcon, N, <NONE>,  'SHUpdateRecycleBinIcon',  \
    SHValidateUNC, N, <NONE>,  'SHValidateUNC',  \
    SheChangeDir, A, <NONE>,  'SheChangeDirA',  \
    SheChangeDirEx, A, <NONE>,  'SheChangeDirExA',  \
    SheChangeDirEx, W, <NONE>,  'SheChangeDirExW',  \
    SheChangeDir, W, <NONE>,  'SheChangeDirW',  \
    SheConvertPath, W, <NONE>,  'SheConvertPathW',  \
    SheFullPath, A, <NONE>,  'SheFullPathA',  \
    SheFullPath, W, <NONE>,  'SheFullPathW',  \
    SheGetCurDrive, N, <NONE>,  'SheGetCurDrive',  \
    SheGetDir, A, <NONE>,  'SheGetDirA',  \
    SheGetDirEx, W, <NONE>,  'SheGetDirExW',  \
    SheGetDir, W, <NONE>,  'SheGetDirW',  \
    SheGetPathOffset, W, <NONE>,  'SheGetPathOffsetW',  \
    SheRemoveQuotes, A, <NONE>,  'SheRemoveQuotesA',  \
    SheRemoveQuotes, W, <NONE>,  'SheRemoveQuotesW',  \
    SheSetCurDrive, N, <NONE>,  'SheSetCurDrive',  \
    SheShortenPath, A, <NONE>,  'SheShortenPathA',  \
    SheShortenPath, W, <NONE>,  'SheShortenPathW',  \
    ShellAbout, A, <.hwnd, .szApp, .szOtherStuff, .hIcon>,  'ShellAboutA',  \
    ShellAbout, W, <.hwnd, .szApp, .szOtherStuff, .hIcon>,  'ShellAboutW',  \
    ShellExec_RunDLL, A, <NONE>,  'ShellExec_RunDLLA',  \
    ShellExec_RunDLL, W, <NONE>,  'ShellExec_RunDLLW',  \
    ShellExecute, A, <.hwnd, .lpOperation, .lpFile, .lpParameters, .lpDirectory, .nCmdShow>,  'ShellExecuteA',  \
    ShellExecuteEx, A, <.lpExecInfo>,  'ShellExecuteExA',  \
    ShellExecuteEx, W, <.lpExecInfo>,  'ShellExecuteExW',  \
    ShellExecute, W, <.hwnd, .lpOperation, .lpFile, .lpParameters, .lpDirectory, .nCmdShow>,  'ShellExecuteW',  \
    ShellHookProc, N, <NONE>,  'ShellHookProc',  \
    ShellMessageBox, A, <NONE>,  'ShellMessageBoxA',  \
    ShellMessageBox, W, <NONE>,  'ShellMessageBoxW',  \
    Shell_GetCachedImageIndex, N, <NONE>,  'Shell_GetCachedImageIndex',  \
    Shell_GetImageLists, N, <NONE>,  'Shell_GetImageLists',  \
    Shell_MergeMenus, N, <NONE>,  'Shell_MergeMenus',  \
    Shell_NotifyIcon, A, <.dwMessage, .lpData>,  'Shell_NotifyIconA',  \
    Shell_NotifyIcon, W, <.dwMessage, .lpData>,  'Shell_NotifyIconW',  \
    SignalFileOpen, N, <NONE>,  'SignalFileOpen',  \
    StrChr, A, <.lpStart, .wMatch>,  'StrChrA',  \
    StrChrI, A, <.lpStart, .wMatch>,  'StrChrIA',  \
    StrChrI, W, <.lpStart, .wMatch>,  'StrChrIW',  \
    StrChr, W, <.lpStart, .wMatch>,  'StrChrW',  \
    StrCmpN, A, <.lpStr1, .lpStr2, .nChar>,  'StrCmpNA',  \
    StrCmpNI, A, <.lpStr1, .lpStr2, .nChar>,  'StrCmpNIA',  \
    StrCmpNI, W, <.lpStr1, .lpStr2, .nChar>,  'StrCmpNIW',  \
    StrCmpN, W, <.lpStr1, .lpStr2, .nChar>,  'StrCmpNW',  \
    StrCpyN, A, <NONE>,  'StrCpyNA',  \
    StrCpyN, W, <NONE>,  'StrCpyNW',  \
    StrNCmp, A, <NONE>,  'StrNCmpA',  \
    StrNCmpI, A, <NONE>,  'StrNCmpIA',  \
    StrNCmpI, W, <NONE>,  'StrNCmpIW',  \
    StrNCmp, W, <NONE>,  'StrNCmpW',  \
    StrNCpy, A, <NONE>,  'StrNCpyA',  \
    StrNCpy, W, <NONE>,  'StrNCpyW',  \
    StrRChr, A, <.lpStart, .lpEnd, .wMatch>,  'StrRChrA',  \
    StrRChrI, A, <.lpStart, .lpEnd, .wMatch>,  'StrRChrIA',  \
    StrRChrI, W, <.lpStart, .lpEnd, .wMatch>,  'StrRChrIW',  \
    StrRChr, W, <.lpStart, .lpEnd, .wMatch>,  'StrRChrW',  \
    StrRStr, A, <NONE>,  'StrRStrA',  \
    StrRStrI, A, <.lpSource, .lpLast, .lpSrch>,  'StrRStrIA',  \
    StrRStrI, W, <.lpSource, .lpLast, .lpSrch>,  'StrRStrIW',  \
    StrRStr, W, <NONE>,  'StrRStrW',  \
    StrStr, A, <.lpFirst, .lpSrch>,  'StrStrA',  \
    StrStrI, A, <.lpFirst, .lpSrch>,  'StrStrIA',  \
    StrStrI, W, <.lpFirst, .lpSrch>,  'StrStrIW',  \
    StrStr, W, <.lpFirst, .lpSrch>,  'StrStrW',  \
    WOWShellExecute, N, <NONE>,  'WOWShellExecute',  \
    Win32DeleteFile, N, <NONE>,  'Win32DeleteFile',  \
    WriteCabinetState, N, <NONE>,  'WriteCabinetState'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































































































































































































































































































































































































































































































































Deleted freshlib/imports/Win32/api/sqlite3.inc.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
;   sqlite3.dll API calls (ASCII)
import_proto sqlite3,  \
    sqliteAggregateContext, N, <.context, .nbytes>,  'sqlite3_aggregate_context',  \
    sqliteAggregateCount_OLD, N, <NONE>,  'sqlite3_aggregate_count',  \
    sqliteAutoExtension, N, <.ptrCallback>,  'sqlite3_auto_extension',  \
    sqliteBackupFinish, N, <.ptrBackup>,  'sqlite3_backup_finish',  \
    sqliteBackupInit, N, <.ptrDestDB, .ptrDestName, .ptrSourceDB, .ptrSourceName>,  'sqlite3_backup_init',  \
    sqliteBackupPageCount, N, <.ptrBackup>,  'sqlite3_backup_pagecount',  \
    sqliteBackupRemaining, N, <.ptrBackup>,  'sqlite3_backup_remaining',  \
    sqliteBackupStep, N, <.ptrBackup, .nPage>,  'sqlite3_backup_step',  \
    sqliteBindBlob, N, <.stmt, .index, .ptrData, .nbytes, .destructor>,  'sqlite3_bind_blob',  \
    sqliteBindDouble, N, <.stmt, .index, .value>,  'sqlite3_bind_double',  \
    sqliteBindInt, N, <.stmt, .index, .value>,  'sqlite3_bind_int',  \
    sqliteBindInt64, N, <.stmt, .index, .valueLo, .valueHi>,  'sqlite3_bind_int64',  \
    sqliteBindNull, N, <.stmt, .index>,  'sqlite3_bind_null',  \
    sqliteBindParameterCount, N, <.stmt>,  'sqlite3_bind_parameter_count',  \
    sqliteBindParameterIndex, N, <.stmt, .paramName>,  'sqlite3_bind_parameter_index',  \
    sqliteBindParameterName, N, <.stmt, .paramIndex>,  'sqlite3_bind_parameter_name',  \
    sqliteBindText, N, <.stmt, .index, .ptrText, .nbytes, .destructor>,  'sqlite3_bind_text',  \
    sqliteBindText16, N, <.stmt, .index, .ptrText, .nbytes, .destructor>,  'sqlite3_bind_text16',  \
    sqliteBindValue, N, <.stmt, .index, .ptrValue>,  'sqlite3_bind_value',  \
    sqliteBindZeroblob, N, <.stmt, .index, .size>,  'sqlite3_bind_zeroblob',  \
    sqliteBlobBytes, N, <.hBlob>,  'sqlite3_blob_bytes',  \
    sqliteBlobClose, N, <.hBlob>,  'sqlite3_blob_close',  \
    sqliteBlobOpen, N, <.ptrDB, .DBname, .Table, .Column, .iRow, .flags, .ptrVarBlob>,  'sqlite3_blob_open',  \
    sqliteBlobRead, N, <.hBlob, .ptrBuffer, .bytes, .iOffset>,  'sqlite3_blob_read',  \
    sqliteBlobWrite, N, <.hBlob, .ptrBuffer, .bytes, .iOffset>,  'sqlite3_blob_write',  \
    sqliteBusyHandler, N, <.ptrDB, .ptrProc, .lParam>,  'sqlite3_busy_handler',  \
    sqliteBusyTimeout, N, <.ptrDB, .time_ms>,  'sqlite3_busy_timeout',  \
    sqliteChanges, N, <.ptrDB>,  'sqlite3_changes',  \
    sqliteClearBindings, N, <.stmt>,  'sqlite3_clear_bindings',  \
    sqliteClose, N, <.ptrDatabase>,  'sqlite3_close',  \
    sqliteCollationNeeded, N, <.ptrDB, .lparam, .ptrCallback>,  'sqlite3_collation_needed',  \
    sqliteCollationNeeded16, N, <.ptrDB, .lparam, .ptrCallback>,  'sqlite3_collation_needed16',  \
    sqliteColumnBlob, N, <.stmt, .iCol>,  'sqlite3_column_blob',  \
    sqliteColumnBytes, N, <.stmt, .iCol>,  'sqlite3_column_bytes',  \
    sqliteColumnBytes16, N, <.stmt, .iCol>,  'sqlite3_column_bytes16',  \
    sqliteColumnCount, N, <.stmt>,  'sqlite3_column_count',  \
    sqliteColumnDatabaseName, N, <.stmt, .index>,  'sqlite3_column_database_name',  \
    sqliteColumnDatabaseName16, N, <.stmt, .index>,  'sqlite3_column_database_name16',  \
    sqliteColumnDeclType, N, <.stmt, .index>,  'sqlite3_column_decltype',  \
    sqliteColumnDeclType16, N, <.stmt, .index>,  'sqlite3_column_decltype16',  \
    sqliteColumnDouble, N, <.stmt, .iCol>,  'sqlite3_column_double',  \
    sqliteColumnInt, N, <.stmt, .iCol>,  'sqlite3_column_int',  \
    sqliteColumnInt64, N, <.stmt, .iCol>,  'sqlite3_column_int64',  \
    sqliteColumnName, N, <.stmt, .index>,  'sqlite3_column_name',  \
    sqliteColumnName16, N, <.stmt, .index>,  'sqlite3_column_name16',  \
    sqliteColumnOriginName, N, <.stmt, .index>,  'sqlite3_column_origin_name',  \
    sqliteColumnOriginName16, N, <.stmt, .index>,  'sqlite3_column_origin_name16',  \
    sqliteColumnTableName, N, <.stmt, .index>,  'sqlite3_column_table_name',  \
    sqliteColumnTableName16, N, <.stmt, .index>,  'sqlite3_column_table_name16',  \
    sqliteColumnText, N, <.stmt, .iCol>,  'sqlite3_column_text',  \
    sqliteColumnText16, N, <.stmt, .iCol>,  'sqlite3_column_text16',  \
    sqliteColumnType, N, <.stmt, .iCol>,  'sqlite3_column_type',  \
    sqliteColumnValue, N, <.stmt, .iCol>,  'sqlite3_column_value',  \
    sqliteCommitHook, N, <.ptrDB, .ptrHook, .lparam>,  'sqlite3_commit_hook',  \
    sqliteCompileOptionGet, N, <.N>,  'sqlite3_compileoption_get',  \
    sqliteCompileOptionUsed, N, <.ptrOptName>,  'sqlite3_compileoption_used',  \
    sqliteComplete, N, <.ptrSQL>,  'sqlite3_complete',  \
    sqliteComplete16, N, <.ptrSQL>,  'sqlite3_complete16',  \
    sqliteConfig, N, <.index, .Carguments>,  'sqlite3_config',  \
    sqliteContextDBHandle, N, <.context>,  'sqlite3_context_db_handle',  \
    sqliteCreateCollation, N, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare>,  'sqlite3_create_collation',  \
    sqliteCreateCollation16, N, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare>,  'sqlite3_create_collation16',  \
    sqliteCreateCollation_v2, N, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare, .ptrDestroy>,  'sqlite3_create_collation_v2',  \
    sqliteCreateFunction, N, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal>,  'sqlite3_create_function',  \
    sqliteCreateFunction16, N, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal>,  'sqlite3_create_function16',  \
    sqliteCreateFunction_v2, N, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal, .procDestroy>,  'sqlite3_create_function_v2',  \
    sqliteCreateModule, N, <.ptrDB, .ptrModuleName, .ptrVTableModule, .lparam>,  'sqlite3_create_module',  \
    sqliteCreateModule_v2, N, <.ptrDB, .ptrModuleName, .ptrVTableModule, .lparam, .procDestroy>,  'sqlite3_create_module_v2',  \
    sqliteDBConfig, N, <.ptrDB, .index, .Carguments>,  'sqlite3_db_config',  \
    sqliteDBHandle, N, <.stmt>,  'sqlite3_db_handle',  \
    sqliteDBMutex, N, <.ptrDB>,  'sqlite3_db_mutex',  \
    sqliteDBStatus, N, <.ptrDB, .index, .ptrRetCurrent, .ptrRetHighest, .flagReset>,  'sqlite3_db_status',  \
    sqliteDataCount, N, <.stmt>,  'sqlite3_data_count',  \
    sqliteDeclareVtab, N, <.ptrDB, .ptrSQL>,  'sqlite3_declare_vtab',  \
    sqliteEnableLoadExtension, N, <.ptrDB, .flagEnable>,  'sqlite3_enable_load_extension',  \
    sqliteEnableSharedCache, N, <.flagEnable>,  'sqlite3_enable_shared_cache',  \
    sqliteErrCode, N, <.ptrDB>,  'sqlite3_errcode',  \
    sqliteErrMsg, N, <.ptrDB>,  'sqlite3_errmsg',  \
    sqliteErrMsg16, N, <.ptrDB>,  'sqlite3_errmsg16',  \
    sqliteExec, N, <.ptrDB, .ptrSQL, .procCallback, .lparam, .ptrVarErrMsg>,  'sqlite3_exec',  \
    sqliteExpired, N, <VOID>,  'sqlite3_expired',  \
    sqliteExtendedErrCode, N, <.ptrDB>,  'sqlite3_extended_errcode',  \
    sqliteExtendedResultCodes, N, <.ptrDB, .flagEnable>,  'sqlite3_extended_result_codes',  \
    sqliteFileControl, N, <.ptrDB, .ptrDBName, .wparam, .lparam>,  'sqlite3_file_control',  \
    sqliteFinalize, N, <.stmt>,  'sqlite3_finalize',  \
    sqliteFree, N, <.ptrmem>,  'sqlite3_free',  \
    sqliteFreeTable, N, <.ptrVarResult>,  'sqlite3_free_table',  \
    sqliteGetAutocommit, N, <.ptrDB>,  'sqlite3_get_autocommit',  \
    sqliteGetAuxdata, N, <.context, .N>,  'sqlite3_get_auxdata',  \
    sqliteGetTable, N, <.ptrDB, .ptrSQL, .ptrVarResult, .ptrVarRows, .ptrVarColumns, .ptrVarErrorMsg>,  'sqlite3_get_table',  \
    sqliteGlobalRecover_OLD, N, <NONE>,  'sqlite3_global_recover',  \
    sqliteInitialize, N, <VOID>,  'sqlite3_initialize',  \
    sqliteInterrupt, N, <.ptrDB>,  'sqlite3_interrupt',  \
    sqliteLastInsertRowID, N, <.ptrDB>,  'sqlite3_last_insert_rowid',  \
    sqliteLibVersion, N, <VOID>,  'sqlite3_libversion',  \
    sqliteLibversionNumber, N, <VOID>,  'sqlite3_libversion_number',  \
    sqliteLimit, N, <.ptrDB, .idLimit, .newVal>,  'sqlite3_limit',  \
    sqliteLoadExtension, N, <.ptrDB, .nameDLL, .entryProc, .ptrVarErrMsg>,  'sqlite3_load_extension',  \
    sqliteLog, N, <.iErrCode, .ptrFormat, .Carguments>,  'sqlite3_log',  \
    sqliteMAlloc, N, <.size>,  'sqlite3_malloc',  \
    sqliteMemoryAlarm_OLD, N, <NONE>,  'sqlite3_memory_alarm',  \
    sqliteMemoryHighWater, N, <.flagReset>,  'sqlite3_memory_highwater',  \
    sqliteMemoryUsed, N, <VOID>,  'sqlite3_memory_used',  \
    sqliteMprintf, N, <.ptrString, .Carguments>,  'sqlite3_mprintf',  \
    sqliteMutexAlloc, N, <.type>,  'sqlite3_mutex_alloc',  \
    sqliteMutexEnter, N, <.hMutex>,  'sqlite3_mutex_enter',  \
    sqliteMutexFree, N, <.hMutex>,  'sqlite3_mutex_free',  \
    sqliteMutexLeave, N, <.hMutex>,  'sqlite3_mutex_leave',  \
    sqliteMutexTry, N, <.hMutex>,  'sqlite3_mutex_try',  \
    sqliteNextStmt, N, <.ptrDB, .stmt>,  'sqlite3_next_stmt',  \
    sqliteOSEnd, N, <VOID>,  'sqlite3_os_end',  \
    sqliteOSInit, N, <VOID>,  'sqlite3_os_init',  \
    sqliteOpen, N, <.ptrFileName, \
    .ptrVarDB>,  'sqlite3_open',  \
    sqliteOpen16, N, <.ptrFileName, .ptrVarDB>,  'sqlite3_open16',  \
    sqliteOpen_v2, N, <.ptrFileName, .ptrVarDB, .flags, .ptrVFSName>,  'sqlite3_open_v2',  \
    sqliteOverloadFunction, N, <.ptrDB, .ptrFuncName, .lparam>,  'sqlite3_overload_function',  \
    sqlitePrepare, N, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare',  \
    sqlitePrepare16, N, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare16',  \
    sqlitePrepare16_v2, N, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare16_v2',  \
    sqlitePrepare_v2, N, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare_v2',  \
    sqliteProfile, N, <.ptrDB, .procProfiler, .lparam>,  'sqlite3_profile',  \
    sqliteProgressHandler, N, <.ptrDB, .N, .procProgress, .lparam>,  'sqlite3_progress_handler',  \
    sqliteRandomness, N, <.bytes, .buffer>,  'sqlite3_randomness',  \
    sqliteReAlloc, N, <.ptrmem, .newsize>,  'sqlite3_realloc',  \
    sqliteReleaseMemory, N, <.bytes>,  'sqlite3_release_memory',  \
    sqliteReset, N, <.stmt>,  'sqlite3_reset',  \
    sqliteResetAutoExtension, N, <VOID>,  'sqlite3_reset_auto_extension',  \
    sqliteResultBlob, N, <.context, .ptrdata, .size, .procDestroy>,  'sqlite3_result_blob',  \
    sqliteResultDouble, N, <.context, .double>,  'sqlite3_result_double',  \
    sqliteResultError, N, <.context, .ptrErrMsg, .size>,  'sqlite3_result_error',  \
    sqliteResultError16, N, <.context, .ptrErrMsg, .size>,  'sqlite3_result_error16',  \
    sqliteResultErrorCode, N, <.context, .errcode>,  'sqlite3_result_error_code',  \
    sqliteResultErrorNoMem, N, <.context>,  'sqlite3_result_error_nomem',  \
    sqliteResultErrorTooBig, N, <.context>,  'sqlite3_result_error_toobig',  \
    sqliteResultInt, N, <.context, .integer>,  'sqlite3_result_int',  \
    sqliteResultInt64, N, <.context, .int64Lo, .int64Hi>,  'sqlite3_result_int64',  \
    sqliteResultNULL, N, <.context>,  'sqlite3_result_null',  \
    sqliteResultText, N, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text',  \
    sqliteResultText16, N, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16',  \
    sqliteResultText16be, N, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16be',  \
    sqliteResultText16le, N, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16le',  \
    sqliteResultValue, N, <.context, .ptrValue>,  'sqlite3_result_value',  \
    sqliteResultZeroBlob, N, <.context, .size>,  'sqlite3_result_zeroblob',  \
    sqliteRollbackHook, N, <.ptrDB, .ptrHook, .lparam>,  'sqlite3_rollback_hook',  \
    sqliteRtreeGeometryCallback, N, <NONE>,  'sqlite3_rtree_geometry_callback',  \
    sqliteSQL, N, <.stmt>,  'sqlite3_sql',  \
    sqliteSetAuthorizer, N, <.ptrDB, .procAuthorizer, .lparam>,  'sqlite3_set_authorizer',  \
    sqliteSetAuxdata, N, <.context, .N, .ptrData, .procDestructor>,  'sqlite3_set_auxdata',  \
    sqliteShutdown, N, <VOID>,  'sqlite3_shutdown',  \
    sqliteSleep, N, <.sleep_ms>,  'sqlite3_sleep',  \
    sqliteSnprintf, N, <.size, .ptrBuffer, .ptrString, .Carguments>,  'sqlite3_snprintf',  \
    sqliteSoftHeapLimit, N, <.N>,  'sqlite3_soft_heap_limit',  \
    sqliteSoftHeapLimit64, N, <.sizeLo, .sizeHi>,  'sqlite3_soft_heap_limit64',  \
    sqliteSourceID, N, <VOID>,  'sqlite3_sourceid',  \
    sqliteStatus, N, <.paramIndex, .ptrVarResult, .ptrVarHighwater, .flagReset>,  'sqlite3_status',  \
    sqliteStep, N, <.stmt>,  'sqlite3_step',  \
    sqliteStmtStatus, N, <.stmt, .paramIndex, .flagReset>,  'sqlite3_stmt_status',  \
    sqliteStrnicmp, N, <.ptrStr1, .ptrStr2, .size>,  'sqlite3_strnicmp',  \
    sqliteTableColumnMetadata, N, <.ptrDB, .ptrDBName, .ptrTableName, .ptrColumnName, .ptrVarDataType, .ptrVarCollSeq, .ptrVarNotNull, .ptrVarPrimaryKey, .ptrVarAutoInc>,  'sqlite3_table_column_metadata',  \
    sqliteTestControl, N, <.opCode, .Carguments>,  'sqlite3_test_control',  \
    sqliteThreadCleanup, N, <VOID>,  'sqlite3_thread_cleanup',  \
    sqliteThreadsafe, N, <VOID>,  'sqlite3_threadsafe',  \
    sqliteTotalChanges, N, <.ptrDB>,  'sqlite3_total_changes',  \
    sqliteTrace, N, <.ptrDB, .procTrace, .lparam>,  'sqlite3_trace',  \
    sqliteTransferBindings, N, <VOID>,  'sqlite3_transfer_bindings',  \
    sqliteUpdateHook, N, <.ptrDB, .procUpdateHook, .lparam>,  'sqlite3_update_hook',  \
    sqliteUserData, N, <.context>,  'sqlite3_user_data',  \
    sqliteValueBlob, N, <.ptrValue>,  'sqlite3_value_blob',  \
    sqliteValueBytes, N, <.ptrValue>,  'sqlite3_value_bytes',  \
    sqliteValueBytes16, N, <.ptrValue>,  'sqlite3_value_bytes16',  \
    sqliteValueDouble, N, <.ptrValue>,  'sqlite3_value_double',  \
    sqliteValueInt, N, <.ptrValue>,  'sqlite3_value_int',  \
    sqliteValueInt64, N, <.ptrValue>,  'sqlite3_value_int64',  \
    sqliteValueNumericType, N, <.ptrValue>,  'sqlite3_value_numeric_type',  \
    sqliteValueText, N, <.ptrValue>,  'sqlite3_value_text',  \
    sqliteValueText16, N, <.ptrValue>,  'sqlite3_value_text16',  \
    sqliteValueText16be, N, <.ptrValue>,  'sqlite3_value_text16be',  \
    sqliteValueText16le, N, <.ptrValue>,  'sqlite3_value_text16le',  \
    sqliteValueType, N, <.ptrValue>,  'sqlite3_value_type',  \
    sqliteVersion, N, <VOID>,  'sqlite3_version',  \
    sqliteVfsFind, N, <.ptrVFSName>,  'sqlite3_vfs_find',  \
    sqliteVfsRegister, N, <.hVFS, .flagDefault>,  'sqlite3_vfs_register',  \
    sqliteVfsUnregister, N, <.hVFS>,  'sqlite3_vfs_unregister',  \
    sqliteVmprintf, N, <.ptrString, .va_list>,  'sqlite3_vmprintf',  \
    sqliteWalAutocheckpoint, N, <.ptrDB, .N>,  'sqlite3_wal_autocheckpoint',  \
    sqliteWalCheckpoint, N, <.ptrDB, .ptrDBName>,  'sqlite3_wal_checkpoint',  \
    sqliteWalHook, N, <.ptrDB, .procCommitHook, .lparam>,  'sqlite3_wal_hook',  \
    sqliteWin32_MbcsToUtf8, N, <NONE>,  'sqlite3_win32_mbcs_to_utf8'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























































































































































































































































































































































































Deleted freshlib/imports/Win32/api/user32.inc.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
;   user32.dll API calls (ASCII)
import_proto user32,  \
    ActivateKeyboardLayout, N, <.HKL, .flags>,  'ActivateKeyboardLayout',  \
    AdjustWindowRect, N, <.lpRect, .dwStyle, .bMenu>,  'AdjustWindowRect',  \
    AdjustWindowRectEx, N, <.lpRect, .dwStyle, .bMenu, .dwExStyle>,  'AdjustWindowRectEx',  \
    AlignRects, N, <NONE>,  'AlignRects',  \
    AllowForegroundActivation, N, <NONE>,  'AllowForegroundActivation',  \
    AllowSetForegroundWindow, N, <.dwProcessId>,  'AllowSetForegroundWindow',  \
    AnimateWindow, N, <.hwnd, .dwTime, .dwFlags>,  'AnimateWindow',  \
    AnyPopup, N, <VOID>,  'AnyPopup',  \
    AppendMenu, A, <.hMenu, .wFlags, .wIDNewItem, .lpNewItem>,  'AppendMenuA',  \
    AppendMenu, W, <.hMenu, .wFlags, .wIDNewItem, .lpNewItem>,  'AppendMenuW',  \
    ArrangeIconicWindows, N, <.hwnd>,  'ArrangeIconicWindows',  \
    AttachThreadInput, N, <.idAttach, .idAttachTo, .fAttach>,  'AttachThreadInput',  \
    BeginDeferWindowPos, N, <.nNumWindows>,  'BeginDeferWindowPos',  \
    BeginPaint, N, <.hwnd, .lpPaint>,  'BeginPaint',  \
    BlockInput, N, <.fBlockIt>,  'BlockInput',  \
    BringWindowToTop, N, <.hwnd>,  'BringWindowToTop',  \
    BroadcastSystemMessage, A, <.dw, .pdw, .un, .wParam, .lParam>,  'BroadcastSystemMessageA',  \
    BroadcastSystemMessageEx, A, <NONE>,  'BroadcastSystemMessageExA',  \
    BroadcastSystemMessageEx, W, <NONE>,  'BroadcastSystemMessageExW',  \
    BroadcastSystemMessage, W, <.dw, .pdw, .un, .wParam, .lParam>,  'BroadcastSystemMessageW',  \
    BuildReasonArray, N, <NONE>,  'BuildReasonArray',  \
    CalcMenuBar, N, <NONE>,  'CalcMenuBar',  \
    CallMsgFilter, A, <.lpMsg, .ncode>,  'CallMsgFilterA',  \
    CallMsgFilter, W, <.lpMsg, .ncode>,  'CallMsgFilterW',  \
    CallNextHookEx, N, <.hHook, .ncode, .wParam, .lParam>,  'CallNextHookEx',  \
    CallWindowProc, A, <.lpPrevWndFunc, .hWnd, .Msg, .wParam, .lParam>,  'CallWindowProcA',  \
    CallWindowProc, W, <.lpPrevWndFunc, .hWnd, .Msg, .wParam, .lParam>,  'CallWindowProcW',  \
    CascadeChildWindows, N, <NONE>,  'CascadeChildWindows',  \
    CascadeWindows, N, <.hwndParent, .wHow, .lpRect, .cKids, .lpkids>,  'CascadeWindows',  \
    ChangeClipboardChain, N, <.hwnd, .hWndNext>,  'ChangeClipboardChain',  \
    ChangeDisplaySettings, A, <.lpDevMode, .dwFlags>,  'ChangeDisplaySettingsA',  \
    ChangeDisplaySettingsEx, A, <.lpszDeviceName, .lpDevMode, .hwnd, .dwflags, .lParam>,  'ChangeDisplaySettingsExA',  \
    ChangeDisplaySettingsEx, W, <.lpszDeviceName, .lpDevMode, .hwnd, .dwflags, .lParam>,  'ChangeDisplaySettingsExW',  \
    ChangeDisplaySettings, W, <.lpDevMode, .dwFlags>,  'ChangeDisplaySettingsW',  \
    ChangeMenu, A, <.hMenu, .cmd, .lpszNewItem, .cmdInsert, .flags>,  'ChangeMenuA',  \
    ChangeMenu, W, <.hMenu, .cmd, .lpszNewItem, .cmdInsert, .flags>,  'ChangeMenuW',  \
    CharLower, A, <.lpsz>,  'CharLowerA',  \
    CharLowerBuff, A, <.lpsz, .cchLength>,  'CharLowerBuffA',  \
    CharLowerBuff, W, <.lpsz, .cchLength>,  'CharLowerBuffW',  \
    CharLower, W, <.lpsz>,  'CharLowerW',  \
    CharNext, A, <.lpsz>,  'CharNextA',  \
    CharNextEx, A, <.CodePage, .lpCurrentChar, .dwFlags>,  'CharNextExA',  \
    CharNext, W, <.lpsz>,  'CharNextW',  \
    CharPrev, A, <.lpszStart, .lpszCurrent>,  'CharPrevA',  \
    CharPrevEx, A, <.CodePage, .lpStart, .lpCurrentChar, .dwFlags>,  'CharPrevExA',  \
    CharPrev, W, <.lpszStart, .lpszCurrent>,  'CharPrevW',  \
    CharToOem, A, <.lpszSrc, .lpszDst>,  'CharToOemA',  \
    CharToOemBuff, A, <.lpszSrc, .lpszDst, .cchDstLength>,  'CharToOemBuffA',  \
    CharToOemBuff, W, <.lpszSrc, .lpszDst, .cchDstLength>,  'CharToOemBuffW',  \
    CharToOem, W, <.lpszSrc, .lpszDst>,  'CharToOemW',  \
    CharUpper, A, <.lpsz>,  'CharUpperA',  \
    CharUpperBuff, A, <.lpsz, .cchLength>,  'CharUpperBuffA',  \
    CharUpperBuff, W, <.lpsz, .cchLength>,  'CharUpperBuffW',  \
    CharUpper, W, <.lpsz>,  'CharUpperW',  \
    CheckDlgButton, N, <.hDlg, .nIDButton, .uCheck>,  'CheckDlgButton',  \
    CheckMenuItem, N, <.hMenu, .wIDCheckItem, .wCheck>,  'CheckMenuItem',  \
    CheckMenuRadioItem, N, <.hMenu, .un1, .un2, .un3, .un4>,  'CheckMenuRadioItem',  \
    CheckRadioButton, N, <.hDlg, .nIDFirstButton, .nIDLastButton, .nIDCheckButton>,  'CheckRadioButton',  \
    ChildWindowFromPoint, N, <.hWnd, .xPoint, .yPoint>,  'ChildWindowFromPoint',  \
    ChildWindowFromPointEx, N, <.hWnd, .pt, .un>,  'ChildWindowFromPointEx',  \
    CliImmSetHotKey, N, <NONE>,  'CliImmSetHotKey',  \
    ClientThreadSetup, N, <NONE>,  'ClientThreadSetup',  \
    ClientToScreen, N, <.hwnd, .lpPoint>,  'ClientToScreen',  \
    ClipCursor, N, <.lpRect>,  'ClipCursor',  \
    CloseClipboard, N, <VOID>,  'CloseClipboard',  \
    CloseDesktop, N, <.hDesktop>,  'CloseDesktop',  \
    CloseWindow, N, <.hwnd>,  'CloseWindow',  \
    CloseWindowStation, N, <.hWinSta>,  'CloseWindowStation',  \
    CopyAcceleratorTable, A, <.hAccelSrc, .lpAccelDst, .cAccelEntries>,  'CopyAcceleratorTableA',  \
    CopyAcceleratorTable, W, <.hAccelSrc, .lpAccelDst, .cAccelEntries>,  'CopyAcceleratorTableW',  \
    CopyIcon, N, <.hIcon>,  'CopyIcon',  \
    CopyImage, N, <.handle, .un1, .n1, .n2, .un2>,  'CopyImage',  \
    CopyRect, N, <.lpDestRect, .lpSourceRect>,  'CopyRect',  \
    CountClipboardFormats, N, <VOID>,  'CountClipboardFormats',  \
    CreateAcceleratorTable, A, <.lpaccl, .cEntries>,  'CreateAcceleratorTableA',  \
    CreateAcceleratorTable, W, <.lpaccl, .cEntries>,  'CreateAcceleratorTableW',  \
    CreateCaret, N, <.hwnd, .hBitmap, .nWidth, .nHeight>,  'CreateCaret',  \
    CreateCursor, N, <.hInstance, .nXhotspot, .nYhotspot, .nWidth, .nHeight, .lpANDbitPlane, .lpXORbitPlane>,  'CreateCursor',  \
    CreateDesktop, A, <.lpszDesktop, .lpszDevice, .pDevmode, .dwFlags, .dwDesiredAccess, .lpsa>,  'CreateDesktopA',  \
    CreateDesktop, W, <.lpszDesktop, .lpszDevice, .pDevmode, .dwFlags, .dwDesiredAccess, .lpsa>,  'CreateDesktopW',  \
    CreateDialogIndirectParam, A, <.hInstance, .lpTemplate, .hWndParent, .lpDialogFunc, .dwInitParam>,  'CreateDialogIndirectParamA',  \
    CreateDialogIndirectParamAor, W, <NONE>,  'CreateDialogIndirectParamAorW',  \
    CreateDialogIndirectParam, W, <.hInstance, .lpTemplate, .hWndParent, .lpDialogFunc, .dwInitParam>,  'CreateDialogIndirectParamW',  \
    CreateDialogParam, A, <.hInstance, .lpName, .hWndParent, .lpDialogFunc, .lParamInit>,  'CreateDialogParamA',  \
    CreateDialogParam, W, <.hInstance, .lpName, .hWndParent, .lpDialogFunc, .lParamInit>,  'CreateDialogParamW',  \
    CreateIcon, N, <.hInstance, .nWidth, .nHeight, .nPlanes, .nBitsPixel, .lpANDbits, .lpXORbits>,  'CreateIcon',  \
    CreateIconFromResource, N, <.presbits, .dwResSize, .fIcon, .dwVer>,  'CreateIconFromResource',  \
    CreateIconFromResourceEx, N, <.presbits, .dwResSize, .fIcon, .dwVer, .cxDesired, .cyDesired, .Flags>,  'CreateIconFromResourceEx',  \
    CreateIconIndirect, N, <.piconinfo>,  'CreateIconIndirect',  \
    CreateMDIWindow, A, <.lpClassName, .lpWindowName, .dwStyle, .x, .y, .nWidth, .nHeight, .hWndParent, .hInstance, .lParam>,  'CreateMDIWindowA',  \
    CreateMDIWindow, W, <.lpClassName, .lpWindowName, .dwStyle, .x, .y, .nWidth, .nHeight, .hWndParent, .hInstance, .lParam>,  'CreateMDIWindowW',  \
    CreateMenu, N, <VOID>,  'CreateMenu',  \
    CreatePopupMenu, N, <VOID>,  'CreatePopupMenu',  \
    CreateSystemThreads, N, <NONE>,  'CreateSystemThreads',  \
    CreateWindowEx, A, <.dwExStyle, .lpClassName, .lpWindowName, .dwStyle, .x, .y, .nWidth, .nHeight, .hWndParent, .hMenu, .hInstance, .lpParam>,  'CreateWindowExA',  \
    CreateWindowEx, W, <.dwExStyle, .lpClassName, .lpWindowName, .dwStyle, .x, .y, .nWidth, .nHeight, .hWndParent, .hMenu, .hInstance, .lpParam>,  'CreateWindowExW',  \
    CreateWindowStation, A, <.lpwinsta, .dwReserved, .dwDesiredAccess, .lpsa>,  'CreateWindowStationA',  \
    CreateWindowStation, W, <.lpwinsta, .dwReserved, .dwDesiredAccess, .lpsa>,  'CreateWindowStationW',  \
    CsrBroadcastSystemMessageEx, W, <NONE>,  'CsrBroadcastSystemMessageExW',  \
    CtxInitUser32, N, <NONE>,  'CtxInitUser32',  \
    DdeAbandonTransaction, N, <.idInst, .hConv, .idTransaction>,  'DdeAbandonTransaction',  \
    DdeAccessData, N, <.hData, .pcbDataSize>,  'DdeAccessData',  \
    DdeAddData, N, <.hData, .pSrc, .cb, .cbOff>,  'DdeAddData',  \
    DdeClientTransaction, N, <.pData, .cbData, .hConv, .hszItem, .wFmt, .wType, .dwTimeout, .pdwResult>,  'DdeClientTransaction',  \
    DdeCmpStringHandles, N, <.hsz1, .hsz2>,  'DdeCmpStringHandles',  \
    DdeConnect, N, <.idInst, .hszService, .hszTopic, .pCC>,  'DdeConnect',  \
    DdeConnectList, N, <.idInst, .hszService, .hszTopic, .hConvList, .pCC>,  'DdeConnectList',  \
    DdeCreateDataHandle, N, <.idInst, .pSrc, .cb, .cbOff, .hszItem, .wFmt, .afCmd>,  'DdeCreateDataHandle',  \
    DdeCreateStringHandle, A, <.idInst, .psz, .iCodePage>,  'DdeCreateStringHandleA',  \
    DdeCreateStringHandle, W, <.idInst, .psz, .iCodePage>,  'DdeCreateStringHandleW',  \
    DdeDisconnect, N, <.hConv>,  'DdeDisconnect',  \
    DdeDisconnectList, N, <.hConvList>,  'DdeDisconnectList',  \
    DdeEnableCallback, N, <.idInst, .hConv, .wCmd>,  'DdeEnableCallback',  \
    DdeFreeDataHandle, N, <.hData>,  'DdeFreeDataHandle',  \
    DdeFreeStringHandle, N, <.idInst, .hsz>,  'DdeFreeStringHandle',  \
    DdeGetData, N, <.hData, .pDst, .cbMax, .cbOff>,  'DdeGetData',  \
    DdeGetLastError, N, <.idInst>,  'DdeGetLastError',  \
    DdeGetQualityOfService, N, <NONE>,  'DdeGetQualityOfService',  \
    DdeImpersonateClient, N, <.hConv>,  'DdeImpersonateClient',  \
    DdeInitialize, A, <.pidInst, .pfnCallback, .afCmd, .ulRes>,  'DdeInitializeA',  \
    DdeInitialize, W, <.pidInst, .pfnCallback, .afCmd, .ulRes>,  'DdeInitializeW',  \
    DdeKeepStringHandle, N, <.idInst, .hsz>,  'DdeKeepStringHandle',  \
    DdeNameService, N, <.idInst, .hsz1, .hsz2, .afCmd>,  'DdeNameService',  \
    DdePostAdvise, N, <.idInst, .hszTopic, .hszItem>,  'DdePostAdvise',  \
    DdeQueryConvInfo, N, <.hConv, .idTransaction, .pConvInfo>,  'DdeQueryConvInfo',  \
    DdeQueryNextServer, N, <.hConvList, .hConvPrev>,  'DdeQueryNextServer',  \
    DdeQueryString, A, <.idInst, .hsz, .psz, .cchMax, .iCodePage>,  'DdeQueryStringA',  \
    DdeQueryString, W, <.idInst, .hsz, .psz, .cchMax, .iCodePage>,  'DdeQueryStringW',  \
    DdeReconnect, N, <.hConv>,  'DdeReconnect',  \
    DdeSetQualityOfService, N, <.hWndClient, .pqosNew, .pqosPrev>,  'DdeSetQualityOfService',  \
    DdeSetUserHandle, N, <.hConv, .id, .hUser>,  'DdeSetUserHandle',  \
    DdeUnaccessData, N, <.hData>,  'DdeUnaccessData',  \
    DdeUninitialize, N, <.idInst>,  'DdeUninitialize',  \
    DefDlgProc, A, <.hDlg, .wMsg, .wParam, .lParam>,  'DefDlgProcA',  \
    DefDlgProc, W, <.hDlg, .wMsg, .wParam, .lParam>,  'DefDlgProcW',  \
    DefFrameProc, A, <.hwnd, .hWndMDIClient, .wMsg, .wParam, .lParam>,  'DefFrameProcA',  \
    DefFrameProc, W, <.hwnd, .hWndMDIClient, .wMsg, .wParam, .lParam>,  'DefFrameProcW',  \
    DefMDIChildProc, A, <.hwnd, .wMsg, .wParam, .lParam>,  'DefMDIChildProcA',  \
    DefMDIChildProc, W, <.hwnd, .wMsg, .wParam, .lParam>,  'DefMDIChildProcW',  \
    DefRawInputProc, N, <NONE>,  'DefRawInputProc',  \
    DefWindowProc, A, <.hwnd, .wMsg, .wParam, .lParam>,  'DefWindowProcA',  \
    DefWindowProc, W, <.hwnd, .wMsg, .wParam, .lParam>,  'DefWindowProcW',  \
    DeferWindowPos, N, <.hWinPosInfo, .hwnd, .hWndInsertAfter, .x, .y, .cx, .cy, .wFlags>,  'DeferWindowPos',  \
    DeleteMenu, N, <.hMenu, .nPosition, .wFlags>,  'DeleteMenu',  \
    DeregisterShellHookWindow, N, <NONE>,  'DeregisterShellHookWindow',  \
    DestroyAcceleratorTable, N, <.haccel>,  'DestroyAcceleratorTable',  \
    DestroyCaret, N, <VOID>,  'DestroyCaret',  \
    DestroyCursor, N, <.hCursor>,  'DestroyCursor',  \
    DestroyIcon, N, <.hIcon>,  'DestroyIcon',  \
    DestroyMenu, N, <.hMenu>,  'DestroyMenu',  \
    DestroyReasons, N, <NONE>,  'DestroyReasons',  \
    DestroyWindow, N, <.hwnd>,  'DestroyWindow',  \
    DeviceEventWorker, N, <NONE>,  'DeviceEventWorker',  \
    DialogBoxIndirectParam, A, <.hInstance, .hDialogTemplate, .hWndParent, .lpDialogFunc, .dwInitParam>,  'DialogBoxIndirectParamA',  \
    DialogBoxIndirectParamAor, W, <NONE>,  'DialogBoxIndirectParamAorW',  \
    DialogBoxIndirectParam, W, <.hInstance, .hDialogTemplate, .hWndParent, .lpDialogFunc, .dwInitParam>,  'DialogBoxIndirectParamW',  \
    DialogBoxParam, A, <.hInstance, .lpTemplateName, .hWndParent, .lpDialogFunc, .dwInitParam>,  'DialogBoxParamA',  \
    DialogBoxParam, W, <.hInstance, .lpTemplateName, .hWndParent, .lpDialogFunc, .dwInitParam>,  'DialogBoxParamW',  \
    DisableProcessWindowsGhosting, N, <NONE>,  'DisableProcessWindowsGhosting',  \
    DispatchMessage, A, <.lpMsg>,  'DispatchMessageA',  \
    DispatchMessage, W, <.lpMsg>,  'DispatchMessageW',  \
    DisplayExitWindowsWarnings, N, <NONE>,  'DisplayExitWindowsWarnings',  \
    DlgDirList, A, <.hDlg, .lpPathSpec, .nIDListBox, .nIDStaticPath, .wFileType>,  'DlgDirListA',  \
    DlgDirListComboBox, A, <.hDlg, .lpPathSpec, .nIDComboBox, .nIDStaticPath, .wFileType>,  'DlgDirListComboBoxA',  \
    DlgDirListComboBox, W, <.hDlg, .lpPathSpec, .nIDComboBox, .nIDStaticPath, .wFileType>,  'DlgDirListComboBoxW',  \
    DlgDirList, W, <.hDlg, .lpPathSpec, .nIDListBox, .nIDStaticPath, .wFileType>,  'DlgDirListW',  \
    DlgDirSelectComboBoxEx, A, <.hWndDlg, .lpszPath, .cbPath, .idComboBox>,  'DlgDirSelectComboBoxExA',  \
    DlgDirSelectComboBoxEx, W, <.hWndDlg, .lpszPath, .cbPath, .idComboBox>,  'DlgDirSelectComboBoxExW',  \
    DlgDirSelectEx, A, <.hWndDlg, .lpszPath, .cbPath, .idListBox>,  'DlgDirSelectExA',  \
    DlgDirSelectEx, W, <.hWndDlg, .lpszPath, .cbPath, .idListBox>,  'DlgDirSelectExW',  \
    DragDetect, N, <.hWnd, .pt>,  'DragDetect',  \
    DragObject, N, <.hWnd1, .hWnd2, .un, .dw, .hCursor>,  'DragObject',  \
    DrawAnimatedRects, N, <.hwnd, .idAni, .lprcFrom, .lprcTo>,  'DrawAnimatedRects',  \
    DrawCaption, N, <.hWnd, .hDC, .pcRect, .uDCFlags>,  'DrawCaption',  \
    DrawCaptionTemp, A, <NONE>,  'DrawCaptionTempA',  \
    DrawCaptionTemp, W, <NONE>,  'DrawCaptionTempW',  \
    DrawEdge, N, <.hdc, .qrc, .edge, .grfFlags>,  'DrawEdge',  \
    DrawFocusRect, N, <.hdc, .lpRect>,  'DrawFocusRect',  \
    DrawFrame, N, <NONE>,  'DrawFrame',  \
    DrawFrameControl, N, <.hDC, .lpRect, .uFrameType, .uFrameState>,  'DrawFrameControl',  \
    DrawIcon, N, <.hdc, .x, .y, .hIcon>,  'DrawIcon',  \
    DrawIconEx, N, <.hdc, .xLeft, .yTop, .hIcon, .cxWidth, .cyWidth, .istepIfAniCur, .hbrFlickerFreeDraw, .diFlags>,  'DrawIconEx',  \
    DrawMenuBar, N, <.hwnd>,  'DrawMenuBar',  \
    DrawMenuBarTemp, N, <NONE>,  'DrawMenuBarTemp',  \
    DrawState, A, <.hDC, .hBrush, .lpDrawStateProc, .lParam, .wParam, .n1, .n2, .n3, .n4, .un>,  'DrawStateA',  \
    DrawState, W, <.hDC, .hBrush, .lpDrawStateProc, .lParam, .wParam, .n1, .n2, .n3, .n4, .un>,  'DrawStateW',  \
    DrawText, A, <.hdc, .lpStr, .nCount, .lpRect, .wFormat>,  'DrawTextA',  \
    DrawTextEx, A, <.hDC, .lpsz, .n, .lpRect, .un, .lpDrawTextParams>,  'DrawTextExA',  \
    DrawTextEx, W, <.hDC, .lpsz, .n, .lpRect, .un, .lpDrawTextParams>,  'DrawTextExW',  \
    DrawText, W, <.hdc, .lpStr, .nCount, .lpRect, .wFormat>,  'DrawTextW',  \
    EditWndProc, N, <NONE>,  'EditWndProc',  \
    EmptyClipboard, N, <VOID>,  'EmptyClipboard',  \
    EnableMenuItem, N, <.hMenu, .wIDEnableItem, .wEnable>,  'EnableMenuItem',  \
    EnableScrollBar, N, <.hwnd, .wSBflags, .wArrows>,  'EnableScrollBar',  \
    EnableWindow, N, <.hwnd, .fBoolean>,  'EnableWindow',  \
    EndDeferWindowPos, N, <.hWinPosInfo>,  'EndDeferWindowPos',  \
    EndDialog, N, <.hDlg, .nResult>,  'EndDialog',  \
    EndMenu, N, <VOID>,  'EndMenu',  \
    EndPaint, N, <.hwnd, .lpPaint>,  'EndPaint',  \
    EndTask, N, <NONE>,  'EndTask',  \
    EnterReaderModeHelper, N, <NONE>,  'EnterReaderModeHelper',  \
    EnumChildWindows, N, <.hWndParent, .lpEnumFunc, .lParam>,  'EnumChildWindows',  \
    EnumClipboardFormats, N, <.wFormat>,  'EnumClipboardFormats',  \
    EnumDesktopWindows, N, <.hDesktop, .lpfn, .lParam>,  'EnumDesktopWindows',  \
    EnumDesktops, A, <.hwinsta, .lpEnumFunc, .lParam>,  'EnumDesktopsA',  \
    EnumDesktops, W, <.hwinsta, .lpEnumFunc, .lParam>,  'EnumDesktopsW',  \
    EnumDisplayDevices, A, <.lpDevice, .iDevNum, .lpDisplayDevice, .dwFlags>,  'EnumDisplayDevicesA',  \
    EnumDisplayDevices, W, <.lpDevice, .iDevNum, .lpDisplayDevice, .dwFlags>,  'EnumDisplayDevicesW',  \
    EnumDisplayMonitors, N, <.hdc, .lprcClip, .lpfnEnum, .dwData>,  'EnumDisplayMonitors',  \
    EnumDisplaySettings, A, <.lpszDeviceName, .iModeNum, .lpDevMode>,  'EnumDisplaySettingsA',  \
    EnumDisplaySettingsEx, A, <.lpszDeviceName, .iModeNum, .lpDevMode, .dwFlags>,  'EnumDisplaySettingsExA',  \
    EnumDisplaySettingsEx, W, <.lpszDeviceName, .iModeNum, .lpDevMode, .dwFlags>,  'EnumDisplaySettingsExW',  \
    EnumDisplaySettings, W, <.lpszDeviceName, .iModeNum, .lpDevMode>,  'EnumDisplaySettingsW',  \
    EnumProps, A, <.hWnd, .lpEnumFunc>,  'EnumPropsA',  \
    EnumPropsEx, A, <.hWnd, .lpEnumFunc, .lParam>,  'EnumPropsExA',  \
    EnumPropsEx, W, <.hWnd, .lpEnumFunc, .lParam>,  'EnumPropsExW',  \
    EnumProps, W, <.hWnd, .lpEnumFunc>,  'EnumPropsW',  \
    EnumThreadWindows, N, <.dwThreadId, .lpfn, .lParam>,  'EnumThreadWindows',  \
    EnumWindowStations, A, <.lpEnumFunc, .lParam>,  'EnumWindowStationsA',  \
    EnumWindowStations, W, <.lpEnumFunc, .lParam>,  'EnumWindowStationsW',  \
    EnumWindows, N, <.lpEnumFunc, .lParam>,  'EnumWindows',  \
    EqualRect, N, <.lpRect1, .lpRect2>,  'EqualRect',  \
    ExcludeUpdateRgn, N, <.hdc, .hwnd>,  'ExcludeUpdateRgn',  \
    ExitWindowsEx, N, <.uFlags, .dwReserved>,  'ExitWindowsEx',  \
    FillRect, N, <.hdc, .lpRect, .hBrush>,  'FillRect',  \
    FindWindow, A, <.lpClassName, .lpWindowName>,  'FindWindowA',  \
    FindWindowEx, A, <.hWnd1, .hWnd2, .lpsz1, .lpsz2>,  'FindWindowExA',  \
    FindWindowEx, W, <.hWnd1, .hWnd2, .lpsz1, .lpsz2>,  'FindWindowExW',  \
    FindWindow, W, <.lpClassName, .lpWindowName>,  'FindWindowW',  \
    FlashWindow, N, <.hwnd, .bInvert>,  'FlashWindow',  \
    FlashWindowEx, N, <.pfwi>,  'FlashWindowEx',  \
    FrameRect, N, <.hdc, .lpRect, .hBrush>,  'FrameRect',  \
    FreeDDElParam, N, <.msg, .lParam>,  'FreeDDElParam',  \
    GetActiveWindow, N, <VOID>,  'GetActiveWindow',  \
    GetAltTabInfo, A, <.hwnd, .iItem, .pati, .pszItemText, .cchItemText>,  'GetAltTabInfoA',  \
    GetAltTabInfo, W, <.hwnd, .iItem, .pati, .pszItemText, .cchItemText>,  'GetAltTabInfoW',  \
    GetAncestor, N, <.hwnd, .gaFlags>,  'GetAncestor',  \
    GetAppCompatFlags, N, <NONE>,  'GetAppCompatFlags',  \
    GetAppCompatFlags2, N, <NONE>,  'GetAppCompatFlags2',  \
    GetAsyncKeyState, N, <.vKey>,  'GetAsyncKeyState',  \
    GetCapture, N, <VOID>,  'GetCapture',  \
    GetCaretBlinkTime, N, <VOID>,  'GetCaretBlinkTime',  \
    GetCaretPos, N, <.lpPoint>,  'GetCaretPos',  \
    GetClassInfo, A, <.hInstance, .lpClassName, .lpWndClass>,  'GetClassInfoA',  \
    GetClassInfoEx, A, <.hinstance, .lpcstr, .lpwndclassexa>,  'GetClassInfoExA',  \
    GetClassInfoEx, W, <.hinstance, .lpcstr, .lpwndclassexa>,  'GetClassInfoExW',  \
    GetClassInfo, W, <.hInstance, .lpClassName, .lpWndClass>,  'GetClassInfoW',  \
    GetClassLong, A, <.hwnd, .nIndex>,  'GetClassLongA',  \
    GetClassLong, W, <.hwnd, .nIndex>,  'GetClassLongW',  \
    GetClassName, A, <.hwnd, .lpClassName, .nMaxCount>,  'GetClassNameA',  \
    GetClassName, W, <.hwnd, .lpClassName, .nMaxCount>,  'GetClassNameW',  \
    GetClassWord, N, <.hwnd, .nIndex>,  'GetClassWord',  \
    GetClientRect, N, <.hwnd, .lpRect>,  'GetClientRect',  \
    GetClipCursor, N, <.lprc>,  'GetClipCursor',  \
    GetClipboardData, N, <.wFormat>,  'GetClipboardData',  \
    GetClipboardFormatName, A, <.wFormat, .lpString, .nMaxCount>,  'GetClipboardFormatNameA',  \
    GetClipboardFormatName, W, <.wFormat, .lpString, .nMaxCount>,  'GetClipboardFormatNameW',  \
    GetClipboardOwner, N, <VOID>,  'GetClipboardOwner',  \
    GetClipboardSequenceNumber, N, <VOID>,  'GetClipboardSequenceNumber',  \
    GetClipboardViewer, N, <VOID>,  'GetClipboardViewer',  \
    GetComboBoxInfo, N, <.hwndCombo, .pcbi>,  'GetComboBoxInfo',  \
    GetCursor, N, <VOID>,  'GetCursor',  \
    GetCursorFrameInfo, N, <NONE>,  'GetCursorFrameInfo',  \
    GetCursorInfo, N, <.pci>,  'GetCursorInfo',  \
    GetCursorPos, N, <.lpPoint>,  'GetCursorPos',  \
    GetDC, N, <.hwnd>,  'GetDC',  \
    GetDCEx, N, <.hwnd, .hrgnclip, .fdwOptions>,  'GetDCEx',  \
    GetDesktopWindow, N, <VOID>,  'GetDesktopWindow',  \
    GetDialogBaseUnits, N, <VOID>,  'GetDialogBaseUnits',  \
    GetDlgCtrlID, N, <.hwnd>,  'GetDlgCtrlID',  \
    GetDlgItem, N, <.hDlg, .nIDDlgItem>,  'GetDlgItem',  \
    GetDlgItemInt, N, <.hDlg, .nIDDlgItem, .lpTranslated, .bSigned>,  'GetDlgItemInt',  \
    GetDlgItemText, A, <.hDlg, .nIDDlgItem, .lpString, .nMaxCount>,  'GetDlgItemTextA',  \
    GetDlgItemText, W, <.hDlg, .nIDDlgItem, .lpString, .nMaxCount>,  'GetDlgItemTextW',  \
    GetDoubleClickTime, N, <VOID>,  'GetDoubleClickTime',  \
    GetFocus, N, <VOID>,  'GetFocus',  \
    GetForegroundWindow, N, <VOID>,  'GetForegroundWindow',  \
    GetGUIThreadInfo, N, <.idThread, .pgui>,  'GetGUIThreadInfo',  \
    GetGuiResources, N, <.hProcess, .uiFlags>,  'GetGuiResources',  \
    GetIconInfo, N, <.hIcon, .piconinfo>,  'GetIconInfo',  \
    GetInputDesktop, N, <NONE>,  'GetInputDesktop',  \
    GetInputState, N, <VOID>,  'GetInputState',  \
    GetInternalWindowPos, N, <NONE>,  'GetInternalWindowPos',  \
    GetKBCodePage, N, <VOID>,  'GetKBCodePage',  \
    GetKeyNameText, A, <.lParam, .lpBuffer, .nSize>,  'GetKeyNameTextA',  \
    GetKeyNameText, W, <.lParam, .lpBuffer, .nSize>,  'GetKeyNameTextW',  \
    GetKeyState, N, <.nVirtKey>,  'GetKeyState',  \
    GetKeyboardLayout, N, <.dwLayout>,  'GetKeyboardLayout',  \
    GetKeyboardLayoutList, N, <.nBuff, .lpList>,  'GetKeyboardLayoutList',  \
    GetKeyboardLayoutName, A, <.pwszKLID>,  'GetKeyboardLayoutNameA',  \
    GetKeyboardLayoutName, W, <.pwszKLID>,  'GetKeyboardLayoutNameW',  \
    GetKeyboardState, N, <.pbKeyState>,  'GetKeyboardState',  \
    GetKeyboardType, N, <.nTypeFlag>,  'GetKeyboardType',  \
    GetLastActivePopup, N, <.hwndOwnder>,  'GetLastActivePopup',  \
    GetLastInputInfo, N, <.plii>,  'GetLastInputInfo',  \
    GetLayeredWindowAttributes, N, <NONE>,  'GetLayeredWindowAttributes',  \
    GetListBoxInfo, N, <.hwnd>,  'GetListBoxInfo',  \
    GetMenu, N, <.hwnd>,  'GetMenu',  \
    GetMenuBarInfo, N, <.hwnd, .idObject, .idItem, .pmbi>,  'GetMenuBarInfo',  \
    GetMenuCheckMarkDimensions, N, <VOID>,  'GetMenuCheckMarkDimensions',  \
    GetMenuContextHelpId, N, <.hMenu>,  'GetMenuContextHelpId',  \
    GetMenuDefaultItem, N, <.hMenu, .fByPos, .gmdiFlags>,  'GetMenuDefaultItem',  \
    GetMenuInfo, N, <.hmenu, .LPMENUINFO>,  'GetMenuInfo',  \
    GetMenuItemCount, N, <.hMenu>,  'GetMenuItemCount',  \
    GetMenuItemID, N, <.hMenu, .nPos>,  'GetMenuItemID',  \
    GetMenuItemInfo, A, <.hMenu, .un, .fBoolean, .lpMenuItemInfo>,  'GetMenuItemInfoA',  \
    GetMenuItemInfo, W, <.hMenu, .un, .fBoolean, .lpMenuItemInfo>,  'GetMenuItemInfoW',  \
    GetMenuItemRect, N, <.hWnd, .hMenu, .uItem, .lprcItem>,  'GetMenuItemRect',  \
    GetMenuState, N, <.hMenu, .wID, .wFlags>,  'GetMenuState',  \
    GetMenuString, A, <.hMenu, .wIDItem, .lpString, .nMaxCount, .wFlags>,  'GetMenuStringA',  \
    GetMenuString, W, <.hMenu, .wIDItem, .lpString, .nMaxCount, .wFlags>,  'GetMenuStringW',  \
    GetMessage, A, <.lpMsg, .hwnd, .wMsgFilterMin, .wMsgFilterMax>,  'GetMessageA',  \
    GetMessageExtraInfo, N, <VOID>,  'GetMessageExtraInfo',  \
    GetMessagePos, N, <VOID>,  'GetMessagePos',  \
    GetMessageTime, N, <VOID>,  'GetMessageTime',  \
    GetMessage, W, <.lpMsg, .hwnd, .wMsgFilterMin, .wMsgFilterMax>,  'GetMessageW',  \
    GetMonitorInfo, A, <.hMonitor, .lpmi>,  'GetMonitorInfoA',  \
    GetMonitorInfo, W, <.hMonitor, .lpmi>,  'GetMonitorInfoW',  \
    GetMouseMovePointsEx, N, <.cbSize, .lppt, .lpptBuf, .nBufPoints, .resolution>,  'GetMouseMovePointsEx',  \
    GetNextDlgGroupItem, N, <.hDlg, .hCtl, .bPrevious>,  'GetNextDlgGroupItem',  \
    GetNextDlgTabItem, N, <.hDlg, .hCtl, .bPrevious>,  'GetNextDlgTabItem',  \
    GetOpenClipboardWindow, N, <VOID>,  'GetOpenClipboardWindow',  \
    GetParent, N, <.hwnd>,  'GetParent',  \
    GetPriorityClipboardFormat, N, <.lpPriorityList, .nCount>,  'GetPriorityClipboardFormat',  \
    GetProcessDefaultLayout, N, <.pdwDefaultLayout>,  'GetProcessDefaultLayout',  \
    GetProcessWindowStation, N, <VOID>,  'GetProcessWindowStation',  \
    GetProgmanWindow, N, <NONE>,  'GetProgmanWindow',  \
    GetProp, A, <.hwnd, .lpString>,  'GetPropA',  \
    GetProp, W, <.hwnd, .lpString>,  'GetPropW',  \
    GetQueueStatus, N, <.fuFlags>,  'GetQueueStatus',  \
    GetRawInputBuffer, N, <NONE>,  'GetRawInputBuffer',  \
    GetRawInputData, N, <NONE>,  'GetRawInputData',  \
    GetRawInputDeviceInfo, A, <NONE>,  'GetRawInputDeviceInfoA',  \
    GetRawInputDeviceInfo, W, <NONE>,  'GetRawInputDeviceInfoW',  \
    GetRawInputDeviceList, N, <NONE>,  'GetRawInputDeviceList',  \
    GetReasonTitleFromReasonCode, N, <NONE>,  'GetReasonTitleFromReasonCode',  \
    GetRegisteredRawInputDevices, N, <NONE>,  'GetRegisteredRawInputDevices',  \
    GetScrollBarInfo, N, <.hwnd, .idObject, .psbi>,  'GetScrollBarInfo',  \
    GetScrollInfo, N, <.hWnd, .n, .lpScrollInfo>,  'GetScrollInfo',  \
    GetScrollPos, N, <.hwnd, .nBar>,  'GetScrollPos',  \
    GetScrollRange, N, <.hwnd, .nBar, .lpMinPos, .lpMaxPos>,  'GetScrollRange',  \
    GetShellWindow, N, <NONE>,  'GetShellWindow',  \
    GetSubMenu, N, <.hMenu, .nPos>,  'GetSubMenu',  \
    GetSysColor, N, <.nSysColor>,  'GetSysColor',  \
    GetSysColorBrush, N, <.nSysColor>,  'GetSysColorBrush',  \
    GetSystemMenu, N, <.hwnd, .fBoolean>,  'GetSystemMenu',  \
    GetSystemMetrics, N, <.nIndex>,  'GetSystemMetrics',  \
    GetTabbedTextExtent, A, <.hdc, .lpString, .nCount, .nTabPositions, .lpnTabStopPositions>,  'GetTabbedTextExtentA',  \
    GetTabbedTextExtent, W, <.hdc, .lpString, .nCount, .nTabPositions, .lpnTabStopPositions>,  'GetTabbedTextExtentW',  \
    GetTaskmanWindow, N, <NONE>,  'GetTaskmanWindow',  \
    GetThreadDesktop, N, <.dwThread>,  'GetThreadDesktop',  \
    GetTitleBarInfo, N, <.hwnd, .pti>,  'GetTitleBarInfo',  \
    GetTopWindow, N, <.hwnd>,  'GetTopWindow',  \
    GetUpdateRect, N, <.hwnd, .lpRect, .bErase>,  'GetUpdateRect',  \
    GetUpdateRgn, N, <.hwnd, .hRgn, .fErase>,  'GetUpdateRgn',  \
    GetUserObjectInformation, A, <.hObj, .nIndex, .pvInfo, .nLength, .lpnLengthNeeded>,  'GetUserObjectInformationA',  \
    GetUserObjectInformation, W, <.hObj, .nIndex, .pvInfo, .nLength, .lpnLengthNeeded>,  'GetUserObjectInformationW',  \
    GetUserObjectSecurity, N, <.hObj, .pSIRequested, .pSd, .nLength, .lpnLengthNeeded>,  'GetUserObjectSecurity',  \
    GetWinStationInfo, N, <NONE>,  'GetWinStationInfo',  \
    GetWindow, N, <.hwnd, .wCmd>,  'GetWindow',  \
    GetWindowContextHelpId, N, <.hWnd>,  'GetWindowContextHelpId',  \
    GetWindowDC, N, <.hwnd>,  'GetWindowDC',  \
    GetWindowInfo, N, <.hwnd, .pwi>,  'GetWindowInfo',  \
    GetWindowLong, A, <.hwnd, .nIndex>,  'GetWindowLongA',  \
    GetWindowLong, W, <.hwnd, .nIndex>,  'GetWindowLongW',  \
    GetWindowModuleFileName, A, <.hwnd, .pszFileName, .cchFileNameMax>,  'GetWindowModuleFileNameA',  \
    GetWindowModuleFileName, W, <.hwnd, .pszFileName, .cchFileNameMax>,  'GetWindowModuleFileNameW',  \
    GetWindowPlacement, N, <.hwnd, .lpwndpl>,  'GetWindowPlacement',  \
    GetWindowRect, N, <.hwnd, .lpRect>,  'GetWindowRect',  \
    GetWindowRgn, N, <.hWnd, .hRgn>,  'GetWindowRgn',  \
    GetWindowRgnBox, N, <NONE>,  'GetWindowRgnBox',  \
    GetWindowText, A, <.hwnd, .lpString, .cch>,  'GetWindowTextA',  \
    GetWindowTextLength, A, <.hwnd>,  'GetWindowTextLengthA',  \
    GetWindowTextLength, W, <.hwnd>,  'GetWindowTextLengthW',  \
    GetWindowText, W, <.hwnd, .lpString, .cch>,  'GetWindowTextW',  \
    GetWindowThreadProcessId, N, <.hwnd, .lpdwProcessId>,  'GetWindowThreadProcessId',  \
    GetWindowWord, N, <.hwnd, .nIndex>,  'GetWindowWord',  \
    GrayString, A, <.hDC, .hBrush, .lpOutputFunc, .lpData, .nCount, .X, .Y, .nWidth, .nHeight>,  'GrayStringA',  \
    GrayString, W, <.hDC, .hBrush, .lpOutputFunc, .lpData, .nCount, .X, .Y, .nWidth, .nHeight>,  'GrayStringW',  \
    HideCaret, N, <.hwnd>,  'HideCaret',  \
    HiliteMenuItem, N, <.hwnd, .hMenu, .wIDHiliteItem, .wHilite>,  'HiliteMenuItem',  \
    IMPGetIME, A, <.hwnd, .LPIMEPROA>,  'IMPGetIMEA',  \
    IMPGetIME, W, <.hwnd, .LPIMEPROA>,  'IMPGetIMEW',  \
    IMPQueryIME, A, <.LPIMEPROA>,  'IMPQueryIMEA',  \
    IMPQueryIME, W, <.LPIMEPROA>,  'IMPQueryIMEW',  \
    IMPSetIME, A, <.hwnd, .LPIMEPROA>,  'IMPSetIMEA',  \
    IMPSetIME, W, <.hwnd, .LPIMEPROA>,  'IMPSetIMEW',  \
    ImpersonateDdeClientWindow, N, <.hWndClient, .hWndServer>,  'ImpersonateDdeClientWindow',  \
    InSendMessage, N, <VOID>,  'InSendMessage',  \
    InSendMessageEx, N, <.lpReserved>,  'InSendMessageEx',  \
    InflateRect, N, <.lpRect, .x, .y>,  'InflateRect',  \
    InitializeLpkHooks, N, <NONE>,  'InitializeLpkHooks',  \
    InitializeWin32EntryTable, N, <NONE>,  'InitializeWin32EntryTable',  \
    InsertMenu, A, <.hMenu, .nPosition, .wFlags, .wIDNewItem, .lpNewItem>,  'InsertMenuA',  \
    InsertMenuItem, A, <.hMenu, .uItem, .bool, .ByRef>,  'InsertMenuItemA',  \
    InsertMenuItem, W, <.hMenu, .uItem, .bool, .ByRef>,  'InsertMenuItemW',  \
    InsertMenu, W, <.hMenu, .nPosition, .wFlags, .wIDNewItem, .lpNewItem>,  'InsertMenuW',  \
    InternalGetWindowText, N, <NONE>,  'InternalGetWindowText',  \
    IntersectRect, N, <.lpDestRect, .lpSrc1Rect, .lpSrc2Rect>,  'IntersectRect',  \
    InvalidateRect, N, <.hwnd, .lpRect, .fBoolean>,  'InvalidateRect',  \
    InvalidateRgn, N, <.hwnd, .hRgn, .bErase>,  'InvalidateRgn',  \
    InvertRect, N, <.hdc, .lpRect>,  'InvertRect',  \
    IsCharAlpha, A, <.cChar>,  'IsCharAlphaA',  \
    IsCharAlphaNumeric, A, <.cChar>,  'IsCharAlphaNumericA',  \
    IsCharAlphaNumeric, W, <.cChar>,  'IsCharAlphaNumericW',  \
    IsCharAlpha, W, <.cChar>,  'IsCharAlphaW',  \
    IsCharLower, A, <.cChar>,  'IsCharLowerA',  \
    IsCharLower, W, <.cChar>,  'IsCharLowerW',  \
    IsCharUpper, A, <.cChar>,  'IsCharUpperA',  \
    IsCharUpper, W, <.cChar>,  'IsCharUpperW',  \
    IsChild, N, <.hWndParent, .hwnd>,  'IsChild',  \
    IsClipboardFormatAvailable, N, <.wFormat>,  'IsClipboardFormatAvailable',  \
    IsDialogMessage, A, <.hDlg, .lpMsg>,  'IsDialogMessageA',  \
    IsDialogMessage, W, <.hDlg, .lpMsg>,  'IsDialogMessageW',  \
    IsDlgButtonChecked, N, <.hDlg, .nIDButton>,  'IsDlgButtonChecked',  \
    IsGUIThread, N, <NONE>,  'IsGUIThread',  \
    IsHungAppWindow, N, <NONE>,  'IsHungAppWindow',  \
    IsIconic, N, <.hwnd>,  'IsIconic',  \
    IsMenu, N, <.hMenu>,  'IsMenu',  \
    IsRectEmpty, N, <.lpRect>,  'IsRectEmpty',  \
    IsServerSideWindow, N, <NONE>,  'IsServerSideWindow',  \
    IsWinEventHookInstalled, N, <NONE>,  'IsWinEventHookInstalled',  \
    IsWindow, N, <.hwnd>,  'IsWindow',  \
    IsWindowEnabled, N, <.hwnd>,  'IsWindowEnabled',  \
    IsWindowInDestroy, N, <NONE>,  'IsWindowInDestroy',  \
    IsWindowUnicode, N, <.hwnd>,  'IsWindowUnicode',  \
    IsWindowVisible, N, <.hwnd>,  'IsWindowVisible',  \
    IsZoomed, N, <.hwnd>,  'IsZoomed',  \
    KillSystemTimer, N, <NONE>,  'KillSystemTimer',  \
    KillTimer, N, <.hwnd, .nIDEvent>,  'KillTimer',  \
    LoadAccelerators, A, <.hInstance, .lpTableName>,  'LoadAcceleratorsA',  \
    LoadAccelerators, W, <.hInstance, .lpTableName>,  'LoadAcceleratorsW',  \
    LoadBitmap, A, <.hInstance, .lpBitmapName>,  'LoadBitmapA',  \
    LoadBitmap, W, <.hInstance, .lpBitmapName>,  'LoadBitmapW',  \
    LoadCursor, A, <.hInstance, .lpCursorName>,  'LoadCursorA',  \
    LoadCursorFromFile, A, <.lpFileName>,  'LoadCursorFromFileA',  \
    LoadCursorFromFile, W, <.lpFileName>,  'LoadCursorFromFileW',  \
    LoadCursor, W, <.hInstance, .lpCursorName>,  'LoadCursorW',  \
    LoadIcon, A, <.hInstance, .lpIconName>,  'LoadIconA',  \
    LoadIcon, W, <.hInstance, .lpIconName>,  'LoadIconW',  \
    LoadImage, A, <.hInst, .lpsz, .uType, .n1, .n2, .uFlags>,  'LoadImageA',  \
    LoadImage, W, <.hInst, .lpsz, .uType, .n1, .n2, .uFlags>,  'LoadImageW',  \
    LoadKeyboardLayout, A, <.pwszKLID, .flags>,  'LoadKeyboardLayoutA',  \
    LoadKeyboardLayoutEx, N, <NONE>,  'LoadKeyboardLayoutEx',  \
    LoadKeyboardLayout, W, <.pwszKLID, .flags>,  'LoadKeyboardLayoutW',  \
    LoadLocalFonts, N, <NONE>,  'LoadLocalFonts',  \
    LoadMenu, A, <.hInstance, .lpString>,  'LoadMenuA',  \
    LoadMenuIndirect, A, <.lpMenuTemplate>,  'LoadMenuIndirectA',  \
    LoadMenuIndirect, W, <.lpMenuTemplate>,  'LoadMenuIndirectW',  \
    LoadMenu, W, <.hInstance, .lpString>,  'LoadMenuW',  \
    LoadRemoteFonts, N, <NONE>,  'LoadRemoteFonts',  \
    LoadString, A, <.hInstance, .wID, .lpBuffer, .nBufferMax>,  'LoadStringA',  \
    LoadString, W, <.hInstance, .wID, .lpBuffer, .nBufferMax>,  'LoadStringW',  \
    LockSetForegroundWindow, N, <.uLockCode>,  'LockSetForegroundWindow',  \
    LockWindowStation, N, <NONE>,  'LockWindowStation',  \
    LockWindowUpdate, N, <.hwndLock>,  'LockWindowUpdate',  \
    LockWorkStation, N, <VOID>,  'LockWorkStation',  \
    LookupIconIdFromDirectory, N, <.presbits, .fIcon>,  'LookupIconIdFromDirectory',  \
    LookupIconIdFromDirectoryEx, N, <.presbits, .fIcon, .cxDesired, .cyDesired, .Flags>,  'LookupIconIdFromDirectoryEx',  \
    MBToWCSEx, N, <NONE>,  'MBToWCSEx',  \
    MB_GetString, N, <NONE>,  'MB_GetString',  \
    MapDialogRect, N, <.hDlg, .lpRect>,  'MapDialogRect',  \
    MapVirtualKey, A, <.wCode, .wMapType>,  'MapVirtualKeyA',  \
    MapVirtualKeyEx, A, <.uCode, .uMapType, .dwhkl>,  'MapVirtualKeyExA',  \
    MapVirtualKeyEx, W, <.uCode, .uMapType, .dwhkl>,  'MapVirtualKeyExW',  \
    MapVirtualKey, W, <.wCode, .wMapType>,  'MapVirtualKeyW',  \
    MapWindowPoints, N, <.hwndFrom, .hwndTo, .lppt, .cPoints>,  'MapWindowPoints',  \
    MenuItemFromPoint, N, <.hWnd, .hMenu, .ptScreen>,  'MenuItemFromPoint',  \
    MenuWindowProc, A, <NONE>,  'MenuWindowProcA',  \
    MenuWindowProc, W, <NONE>,  'MenuWindowProcW',  \
    MessageBeep, N, <.wType>,  'MessageBeep',  \
    MessageBox, A, <.hwnd, .lpText, .lpCaption, .wType>,  'MessageBoxA',  \
    MessageBoxEx, A, <.hwnd, .lpText, .lpCaption, .wType, .wLanguageId>,  'MessageBoxExA',  \
    MessageBoxEx, W, <.hwnd, .lpText, .lpCaption, .wType, .wLanguageId>,  'MessageBoxExW',  \
    MessageBoxIndirect, A, <.lpMsgBoxParams>,  'MessageBoxIndirectA',  \
    MessageBoxIndirect, W, <.lpMsgBoxParams>,  'MessageBoxIndirectW',  \
    MessageBoxTimeout, A, <NONE>,  'MessageBoxTimeoutA',  \
    MessageBoxTimeout, W, <NONE>,  'MessageBoxTimeoutW',  \
    MessageBox, W, <.hwnd, .lpText, .lpCaption, .wType>,  'MessageBoxW',  \
    ModifyMenu, A, <.hMenu, .nPosition, .wFlags, .wIDNewItem, .lpString>,  'ModifyMenuA',  \
    ModifyMenu, W, <.hMenu, .nPosition, .wFlags, .wIDNewItem, .lpString>,  'ModifyMenuW',  \
    MonitorFromPoint, N, <.pt, .dwFlags>,  'MonitorFromPoint',  \
    MonitorFromRect, N, <.lprc, .dwFlags>,  'MonitorFromRect',  \
    MonitorFromWindow, N, <.hwnd, .dwFlags>,  'MonitorFromWindow',  \
    MoveWindow, N, <.hwnd, .x, .y, .nWidth, .nHeight, .fBoolean>,  'MoveWindow',  \
    MsgWaitForMultipleObjects, N, <.nCount, .pHandles, .fWaitAll, .dwMilliseconds, .dwWakeMask>,  'MsgWaitForMultipleObjects',  \
    MsgWaitForMultipleObjectsEx, N, <.nCount, .pHandles, .dwMilliseconds, .dwWakeMask, .dwFlags>,  'MsgWaitForMultipleObjectsEx',  \
    NotifyWinEvent, N, <.lEvent, .hwnd, .idObject, .idChild>,  'NotifyWinEvent',  \
    OemKeyScan, N, <.wOemChar>,  'OemKeyScan',  \
    OemToChar, A, <.lpszSrc, .lpszDst>,  'OemToCharA',  \
    OemToCharBuff, A, <.lpszSrc, .lpszDst, .cchDstLength>,  'OemToCharBuffA',  \
    OemToCharBuff, W, <.lpszSrc, .lpszDst, .cchDstLength>,  'OemToCharBuffW',  \
    OemToChar, W, <.lpszSrc, .lpszDst>,  'OemToCharW',  \
    OffsetRect, N, <.lpRect, .x, .y>,  'OffsetRect',  \
    OpenClipboard, N, <.hwnd>,  'OpenClipboard',  \
    OpenDesktop, A, <.lpszDesktop, .dwFlags, .fInherit, .dwDesiredAccess>,  'OpenDesktopA',  \
    OpenDesktop, W, <.lpszDesktop, .dwFlags, .fInherit, .dwDesiredAccess>,  'OpenDesktopW',  \
    OpenIcon, N, <.hwnd>,  'OpenIcon',  \
    OpenInputDesktop, N, <.dwFlags, .fInherit, .dwDesiredAccess>,  'OpenInputDesktop',  \
    OpenWindowStation, A, <.lpszWinSta, .fInherit, .dwDesiredAccess>,  'OpenWindowStationA',  \
    OpenWindowStation, W, <.lpszWinSta, .fInherit, .dwDesiredAccess>,  'OpenWindowStationW',  \
    PackDDElParam, N, <.msg, .uiLo, .uiHi>,  'PackDDElParam',  \
    PaintDesktop, N, <.hdc>,  'PaintDesktop',  \
    PaintMenuBar, N, <NONE>,  'PaintMenuBar',  \
    PeekMessage, A, <.lpMsg, .hwnd, .wMsgFilterMin, .wMsgFilterMax, .wRemoveMsg>,  'PeekMessageA',  \
    PeekMessage, W, <.lpMsg, .hwnd, .wMsgFilterMin, .wMsgFilterMax, .wRemoveMsg>,  'PeekMessageW',  \
    PostMessage, A, <.hwnd, .wMsg, .wParam, .lParam>,  'PostMessageA',  \
    PostMessage, W, <.hwnd, .wMsg, .wParam, .lParam>,  'PostMessageW',  \
    PostQuitMessage, N, <.nExitCode>,  'PostQuitMessage',  \
    PostThreadMessage, A, <.idThread, .msg, .wParam, .lParam>,  'PostThreadMessageA',  \
    PostThreadMessage, W, <.idThread, .msg, .wParam, .lParam>,  'PostThreadMessageW',  \
    PrintWindow, N, <.hWnd, .hdcBlt, .nFlags>,  'PrintWindow',  \
    PrivateExtractIconEx, A, <NONE>,  'PrivateExtractIconExA',  \
    PrivateExtractIconEx, W, <NONE>,  'PrivateExtractIconExW',  \
    PrivateExtractIcons, A, <NONE>,  'PrivateExtractIconsA',  \
    PrivateExtractIcons, W, <NONE>,  'PrivateExtractIconsW',  \
    PrivateSetDbgTag, N, <NONE>,  'PrivateSetDbgTag',  \
    PrivateSetRipFlags, N, <NONE>,  'PrivateSetRipFlags',  \
    PtInRect, N, <.lpRect, .x, .y>,  'PtInRect',  \
    QuerySendMessage, N, <NONE>,  'QuerySendMessage',  \
    QueryUserCounters, N, <NONE>,  'QueryUserCounters',  \
    RealChildWindowFromPoint, N, <.hwndParent, .ptParentClientCoords>,  'RealChildWindowFromPoint',  \
    RealGetWindowClass, A, <.hwnd, .pszType, .cchType>,  'RealGetWindowClassA',  \
    RealGetWindowClass, W, <.hwnd, .pszType, .cchType>,  'RealGetWindowClassW',  \
    ReasonCodeNeedsBugID, N, <NONE>,  'ReasonCodeNeedsBugID',  \
    ReasonCodeNeedsComment, N, <NONE>,  'ReasonCodeNeedsComment',  \
    RecordShutdownReason, N, <NONE>,  'RecordShutdownReason',  \
    RedrawWindow, N, <.hwnd, .lprcUpdate, .hrgnUpdate, .fuRedraw>,  'RedrawWindow',  \
    RegisterClass, A, <.Class>,  'RegisterClassA',  \
    RegisterClassEx, A, <.pcWndClassEx>,  'RegisterClassExA',  \
    RegisterClassEx, W, <.pcWndClassEx>,  'RegisterClassExW',  \
    RegisterClass, W, <.Class>,  'RegisterClassW',  \
    RegisterClipboardFormat, A, <.lpString>,  'RegisterClipboardFormatA',  \
    RegisterClipboardFormat, W, <.lpString>,  'RegisterClipboardFormatW',  \
    RegisterDeviceNotification, A, <.hRecipient, .NotificationFilter, .Flags>,  'RegisterDeviceNotificationA',  \
    RegisterDeviceNotification, W, <.hRecipient, .NotificationFilter, .Flags>,  'RegisterDeviceNotificationW',  \
    RegisterHotKey, N, <.hwnd, .id, .fsModifiers, .vk>,  'RegisterHotKey',  \
    RegisterLogonProcess, N, <NONE>,  'RegisterLogonProcess',  \
    RegisterMessagePumpHook, N, <NONE>,  'RegisterMessagePumpHook',  \
    RegisterRawInputDevices, N, <NONE>,  'RegisterRawInputDevices',  \
    RegisterServicesProcess, N, <NONE>,  'RegisterServicesProcess',  \
    RegisterShellHookWindow, N, <NONE>,  'RegisterShellHookWindow',  \
    RegisterSystemThread, N, <NONE>,  'RegisterSystemThread',  \
    RegisterTasklist, N, <NONE>,  'RegisterTasklist',  \
    RegisterUserApiHook, N, <NONE>,  'RegisterUserApiHook',  \
    RegisterWindowMessage, A, <.lpString>,  'RegisterWindowMessageA',  \
    RegisterWindowMessage, W, <.lpString>,  'RegisterWindowMessageW',  \
    ReleaseCapture, N, <VOID>,  'ReleaseCapture',  \
    ReleaseDC, N, <.hwnd, .hdc>,  'ReleaseDC',  \
    RemoveMenu, N, <.hMenu, .nPosition, .wFlags>,  'RemoveMenu',  \
    RemoveProp, A, <.hwnd, .lpString>,  'RemovePropA',  \
    RemoveProp, W, <.hwnd, .lpString>,  'RemovePropW',  \
    ReplyMessage, N, <.lReply>,  'ReplyMessage',  \
    ResolveDesktopForWO, W, <NONE>,  'ResolveDesktopForWOW',  \
    ReuseDDElParam, N, <.lParam, .msgIn, .msgOut, .uiLo, .uiHi>,  'ReuseDDElParam',  \
    ScreenToClient, N, <.hwnd, .lpPoint>,  'ScreenToClient',  \
    ScrollChildren, N, <NONE>,  'ScrollChildren',  \
    ScrollDC, N, <.hdc, .dx, .dy, .lprcScroll, .lprcClip, .hrgnUpdate, .lprcUpdate>,  'ScrollDC',  \
    ScrollWindow, N, <.hWnd, .XAmount, .YAmount, .lpRect, .lpClipRect>,  'ScrollWindow',  \
    ScrollWindowEx, N, <.hwnd, .dx, .dy, .lprcScroll, .lprcClip, .hrgnUpdate, .lprcUpdate, .fuScroll>,  'ScrollWindowEx',  \
    SendDlgItemMessage, A, <.hDlg, .nIDDlgItem, .wMsg, .wParam, .lParam>,  'SendDlgItemMessageA',  \
    SendDlgItemMessage, W, <.hDlg, .nIDDlgItem, .wMsg, .wParam, .lParam>,  'SendDlgItemMessageW',  \
    SendIMEMessageEx, A, <.hwnd, .lparam>,  'SendIMEMessageExA',  \
    SendIMEMessageEx, W, <.hwnd, .lparam>,  'SendIMEMessageExW',  \
    SendInput, N, <.cInputs, .pInputs, .cbSize>,  'SendInput',  \
    SendMessage, A, <.hwnd, .wMsg, .wParam, .lParam>,  'SendMessageA',  \
    SendMessageCallback, A, <.hwnd, .wMsg, .wParam, .lParam, .lpResultCallBack, .dwData>,  'SendMessageCallbackA',  \
    SendMessageCallback, W, <.hwnd, .wMsg, .wParam, .lParam, .lpResultCallBack, .dwData>,  'SendMessageCallbackW',  \
    SendMessageTimeout, A, <.hwnd, .msg, .wParam, .lParam, .fuFlags, .uTimeout, .lpdwResult>,  'SendMessageTimeoutA',  \
    SendMessageTimeout, W, <.hwnd, .msg, .wParam, .lParam, .fuFlags, .uTimeout, .lpdwResult>,  'SendMessageTimeoutW',  \
    SendMessage, W, <.hwnd, .wMsg, .wParam, .lParam>,  'SendMessageW',  \
    SendNotifyMessage, A, <.hwnd, .msg, .wParam, .lParam>,  'SendNotifyMessageA',  \
    SendNotifyMessage, W, <.hwnd, .msg, .wParam, .lParam>,  'SendNotifyMessageW',  \
    SetActiveWindow, N, <.hwnd>,  'SetActiveWindow',  \
    SetCapture, N, <.hwnd>,  'SetCapture',  \
    SetCaretBlinkTime, N, <.wMSeconds>,  'SetCaretBlinkTime',  \
    SetCaretPos, N, <.x, .y>,  'SetCaretPos',  \
    SetClassLong, A, <.hwnd, .nIndex, .dwNewLong>,  'SetClassLongA',  \
    SetClassLong, W, <.hwnd, .nIndex, .dwNewLong>,  'SetClassLongW',  \
    SetClassWord, N, <.hwnd, .nIndex, .wNewWord>,  'SetClassWord',  \
    SetClipboardData, N, <.uFormat, .hMem>,  'SetClipboardData',  \
    SetClipboardViewer, N, <.hwnd>,  'SetClipboardViewer',  \
    SetConsoleReserveKeys, N, <NONE>,  'SetConsoleReserveKeys',  \
    SetCursor, N, <.hCursor>,  'SetCursor',  \
    SetCursorContents, N, <NONE>,  'SetCursorContents',  \
    SetCursorPos, N, <.x, .y>,  'SetCursorPos',  \
    SetDebugErrorLevel, N, <.dwLevel>,  'SetDebugErrorLevel',  \
    SetDeskWallpaper, N, <NONE>,  'SetDeskWallpaper',  \
    SetDlgItemInt, N, <.hDlg, .nIDDlgItem, .wValue, .bSigned>,  'SetDlgItemInt',  \
    SetDlgItemText, A, <.hDlg, .nIDDlgItem, .lpString>,  'SetDlgItemTextA',  \
    SetDlgItemText, W, <.hDlg, .nIDDlgItem, .lpString>,  'SetDlgItemTextW',  \
    SetDoubleClickTime, N, <.wCount>,  'SetDoubleClickTime',  \
    SetFocus, N, <.hwnd>,  'SetFocus',  \
    SetForegroundWindow, N, <.hwnd>,  'SetForegroundWindow',  \
    SetInternalWindowPos, N, <NONE>,  'SetInternalWindowPos',  \
    SetKeyboardState, N, <.lppbKeyState>,  'SetKeyboardState',  \
    SetLastErrorEx, N, <.dwErrCode, .dwType>,  'SetLastErrorEx',  \
    SetLayeredWindowAttributes, N, <.hwnd, .crKey, .bAlpha, .dwFlags>,  'SetLayeredWindowAttributes',  \
    SetLogonNotifyWindow, N, <NONE>,  'SetLogonNotifyWindow',  \
    SetMenu, N, <.hwnd, .hMenu>,  'SetMenu',  \
    SetMenuContextHelpId, N, <.hMenu, .dw>,  'SetMenuContextHelpId',  \
    SetMenuDefaultItem, N, <.hMenu, .uItem, .fByPos>,  'SetMenuDefaultItem',  \
    SetMenuInfo, N, <.hmenu, .LPCMENUINFO>,  'SetMenuInfo',  \
    SetMenuItemBitmaps, N, <.hMenu, .nPosition, .wFlags, .hBitmapUnchecked, .hBitmapChecked>,  'SetMenuItemBitmaps',  \
    SetMenuItemInfo, A, <.hMenu, .un, .fBoolean, .lpcMenuItemInfo>,  'SetMenuItemInfoA',  \
    SetMenuItemInfo, W, <.hMenu, .un, .fBoolean, .lpcMenuItemInfo>,  'SetMenuItemInfoW',  \
    SetMessageExtraInfo, N, <.lParam>,  'SetMessageExtraInfo',  \
    SetMessageQueue, N, <.cMessagesMax>,  'SetMessageQueue',  \
    SetParent, N, <.hWndChild, .hWndNewParent>,  'SetParent',  \
    SetProcessDefaultLayout, N, <.dwDefaultLayout>,  'SetProcessDefaultLayout',  \
    SetProcessWindowStation, N, <.hWinSta>,  'SetProcessWindowStation',  \
    SetProgmanWindow, N, <NONE>,  'SetProgmanWindow',  \
    SetProp, A, <.hwnd, .lpString, .hData>,  'SetPropA',  \
    SetProp, W, <.hwnd, .lpString, .hData>,  'SetPropW',  \
    SetRect, N, <.lpRect, .X1, .Y1, .X2, .Y2>,  'SetRect',  \
    SetRectEmpty, N, <.lpRect>,  'SetRectEmpty',  \
    SetScrollInfo, N, <.hWnd, .n, .lpcScrollInfo, .bool>,  'SetScrollInfo',  \
    SetScrollPos, N, <.hwnd, .nBar, .nPos, .fBoolean>,  'SetScrollPos',  \
    SetScrollRange, N, <.hwnd, .nBar, .nMinPos, .nMaxPos, .bRedraw>,  'SetScrollRange',  \
    SetShellWindow, N, <NONE>,  'SetShellWindow',  \
    SetShellWindowEx, N, <NONE>,  'SetShellWindowEx',  \
    SetSysColors, N, <.nChanges, .lpSysColor, .lpColorValues>,  'SetSysColors',  \
    SetSysColorsTemp, N, <NONE>,  'SetSysColorsTemp',  \
    SetSystemCursor, N, <.hcur, .id>,  'SetSystemCursor',  \
    SetSystemMenu, N, <NONE>,  'SetSystemMenu',  \
    SetSystemTimer, N, <NONE>,  'SetSystemTimer',  \
    SetTaskmanWindow, N, <NONE>,  'SetTaskmanWindow',  \
    SetThreadDesktop, N, <.hDesktop>,  'SetThreadDesktop',  \
    SetTimer, N, <.hWnd, .nIDEvent, .uElapse, .lpTimerFunc>,  'SetTimer',  \
    SetUserObjectInformation, A, <.hObj, .nIndex, .pvInfo, .nLength>,  'SetUserObjectInformationA',  \
    SetUserObjectInformation, W, <.hObj, .nIndex, .pvInfo, .nLength>,  'SetUserObjectInformationW',  \
    SetUserObjectSecurity, N, <.hObj, .pSIRequested, .pSd>,  'SetUserObjectSecurity',  \
    SetWinEventHook, N, <.eventMin, .eventMax, .hmodWinEventProc, .pfnWinEventProc, .idProcess, .idThread, .dwFlags>,  'SetWinEventHook',  \
    SetWindowContextHelpId, N, <.hWnd, .dw>,  'SetWindowContextHelpId',  \
    SetWindowLong, A, <.hwnd, .nIndex, .dwNewLong>,  'SetWindowLongA',  \
    SetWindowLong, W, <.hwnd, .nIndex, .dwNewLong>,  'SetWindowLongW',  \
    SetWindowPlacement, N, <.hwnd, .lpwndpl>,  'SetWindowPlacement',  \
    SetWindowPos, N, <.hwnd, .hWndInsertAfter, .x, .y, .cx, .cy, .wFlags>,  'SetWindowPos',  \
    SetWindowRgn, N, <.hWnd, .hRgn, .bRedraw>,  'SetWindowRgn',  \
    SetWindowStationUser, N, <NONE>,  'SetWindowStationUser',  \
    SetWindowText, A, <.hwnd, .lpString>,  'SetWindowTextA',  \
    SetWindowText, W, <.hwnd, .lpString>,  'SetWindowTextW',  \
    SetWindowWord, N, <.hwnd, .nIndex, .wNewWord>,  'SetWindowWord',  \
    SetWindowsHook, A, <.nFilterType, .pfnFilterProc>,  'SetWindowsHookA',  \
    SetWindowsHookEx, A, <.idHook, .lpfn, .hmod, .dwThreadId>,  'SetWindowsHookExA',  \
    SetWindowsHookEx, W, <.idHook, .lpfn, .hmod, .dwThreadId>,  'SetWindowsHookExW',  \
    SetWindowsHook, W, <.nFilterType, .pfnFilterProc>,  'SetWindowsHookW',  \
    ShowCaret, N, <.hwnd>,  'ShowCaret',  \
    ShowCursor, N, <.bShow>,  'ShowCursor',  \
    ShowOwnedPopups, N, <.hwnd, .fBoolean>,  'ShowOwnedPopups',  \
    ShowScrollBar, N, <.hwnd, .wBar, .bShow>,  'ShowScrollBar',  \
    ShowStartGlass, N, <NONE>,  'ShowStartGlass',  \
    ShowWindow, N, <.hwnd, .nCmdShow>,  'ShowWindow',  \
    ShowWindowAsync, N, <.hWnd, .nCmdShow>,  'ShowWindowAsync',  \
    SoftModalMessageBox, N, <NONE>,  'SoftModalMessageBox',  \
    SubtractRect, N, <.lprcDst, .lprcSrc1, .lprcSrc2>,  'SubtractRect',  \
    SwapMouseButton, N, <.bSwap>,  'SwapMouseButton',  \
    SwitchDesktop, N, <.hDesktop>,  'SwitchDesktop',  \
    SwitchToThisWindow, N, <NONE>,  'SwitchToThisWindow',  \
    SystemParametersInfo, A, <.uAction, .uParam, .ByRef, .fuWinIni>,  'SystemParametersInfoA',  \
    SystemParametersInfo, W, <.uAction, .uParam, .ByRef, .fuWinIni>,  'SystemParametersInfoW',  \
    TabbedTextOut, A, <.hdc, .x, .y, .lpString, .nCount, .nTabPositions, .lpnTabStopPositions, .nTabOrigin>,  'TabbedTextOutA',  \
    TabbedTextOut, W, <.hdc, .x, .y, .lpString, .nCount, .nTabPositions, .lpnTabStopPositions, .nTabOrigin>,  'TabbedTextOutW',  \
    TileChildWindows, N, <NONE>,  'TileChildWindows',  \
    TileWindows, N, <.hwndParent, .wHow, .lpRect, .cKids, .lpKids>,  'TileWindows',  \
    ToAscii, N, <.uVirtKey, .uScanCode, .lpbKeyState, .lpwTransKey, .fuState>,  'ToAscii',  \
    ToAsciiEx, N, <.uVirtKey, .uScanCode, .lpKeyState, .lpChar, .uFlags, .dwhkl>,  'ToAsciiEx',  \
    ToUnicode, N, <.wVirtKey, .wScanCode, .lpKeyState, .pwszBuff, .cchBuff, .wFlags>,  'ToUnicode',  \
    ToUnicodeEx, N, <.wVirtKey, .wScanCode, .lpKeyState, .pwszBuff, .cchBuff, .wFlags, .dwhkl>,  'ToUnicodeEx',  \
    TrackMouseEvent, N, <.lpEventTrack>,  'TrackMouseEvent',  \
    TrackPopupMenu, N, <.hMenu, .uFlags, .x, .y, .nReserved, .hwnd, .lprc>,  'TrackPopupMenu',  \
    TrackPopupMenuEx, N, <.hMenu, .un, .n1, .n2, .hWnd, .lpTPMParams>,  'TrackPopupMenuEx',  \
    TranslateAccelerator, A, <.hwnd, .hAccTable, .lpMsg>,  'TranslateAcceleratorA',  \
    TranslateAccelerator, W, <.hwnd, .hAccTable, .lpMsg>,  'TranslateAcceleratorW',  \
    TranslateMDISysAccel, N, <.hWndClient, .lpMsg>,  'TranslateMDISysAccel',  \
    TranslateMessage, N, <.lpMsg>,  'TranslateMessage',  \
    TranslateMessageEx, N, <NONE>,  'TranslateMessageEx',  \
    UnhookWinEvent, N, <.hWinEventHook>,  'UnhookWinEvent',  \
    UnhookWindowsHook, N, <.nCode, .pfnFilterProc>,  'UnhookWindowsHook',  \
    UnhookWindowsHookEx, N, <.hHook>,  'UnhookWindowsHookEx',  \
    UnionRect, N, <.lpDestRect, .lpSrc1Rect, .lpSrc2Rect>,  'UnionRect',  \
    UnloadKeyboardLayout, N, <.HKL>,  'UnloadKeyboardLayout',  \
    UnlockWindowStation, N, <NONE>,  'UnlockWindowStation',  \
    UnpackDDElParam, N, <.msg, .lParam, .puiLo, .puiHi>,  'UnpackDDElParam',  \
    UnregisterClass, A, <.lpClassName, .hInstance>,  'UnregisterClassA',  \
    UnregisterClass, W, <.lpClassName, .hInstance>,  'UnregisterClassW',  \
    UnregisterDeviceNotification, N, <.Handle>,  'UnregisterDeviceNotification',  \
    UnregisterHotKey, N, <.hwnd, .id>,  'UnregisterHotKey',  \
    UnregisterMessagePumpHook, N, <NONE>,  'UnregisterMessagePumpHook',  \
    UnregisterUserApiHook, N, <NONE>,  'UnregisterUserApiHook',  \
    UpdateLayeredWindow, N, <.hWnd, .hdcDst, .pptDst, .psize, .hdcSrc, .pptSrc, .crKey, .pblend, .dwFlags>,  'UpdateLayeredWindow',  \
    UpdatePerUserSystemParameters, N, <NONE>,  'UpdatePerUserSystemParameters',  \
    UpdateWindow, N, <.hwnd>,  'UpdateWindow',  \
    User32InitializeImmEntryTable, N, <NONE>,  'User32InitializeImmEntryTable',  \
    UserClientDllInitialize, N, <NONE>,  'UserClientDllInitialize',  \
    UserHandleGrantAccess, N, <.hUserHandle, .hJob, .bGrant>,  'UserHandleGrantAccess',  \
    UserLpkPSMTextOut, N, <NONE>,  'UserLpkPSMTextOut',  \
    UserLpkTabbedTextOut, N, <NONE>,  'UserLpkTabbedTextOut',  \
    UserRealizePalette, N, <NONE>,  'UserRealizePalette',  \
    UserRegisterWowHandlers, N, <NONE>,  'UserRegisterWowHandlers',  \
    VRipOutput, N, <NONE>,  'VRipOutput',  \
    VTagOutput, N, <NONE>,  'VTagOutput',  \
    ValidateRect, N, <.hwnd, .lpRect>,  'ValidateRect',  \
    ValidateRgn, N, <.hwnd, .hRgn>,  'ValidateRgn',  \
    VkKeyScan, A, <.cChar>,  'VkKeyScanA',  \
    VkKeyScanEx, A, <.ch, .dwhkl>,  'VkKeyScanExA',  \
    VkKeyScanEx, W, <.ch, .dwhkl>,  'VkKeyScanExW',  \
    VkKeyScan, W, <.cChar>,  'VkKeyScanW',  \
    WCSToMBEx, N, <NONE>,  'WCSToMBEx',  \
    WINNLSEnableIME, N, <.hwnd, .bool>,  'WINNLSEnableIME',  \
    WINNLSGetEnableStatus, N, <.hwnd>,  'WINNLSGetEnableStatus',  \
    WINNLSGetIMEHotkey, N, <.hwnd>,  'WINNLSGetIMEHotkey',  \
    WaitForInputIdle, N, <.hProcess, .dwMilliseconds>,  'WaitForInputIdle',  \
    WaitMessage, N, <VOID>,  'WaitMessage',  \
    Win32PoolAllocationStats, N, <NONE>,  'Win32PoolAllocationStats',  \
    WinHelp, A, <.hwnd, .lpHelpFile, .wCommand, .dwData>,  'WinHelpA',  \
    WinHelp, W, <.hwnd, .lpHelpFile, .wCommand, .dwData>,  'WinHelpW',  \
    WindowFromDC, N, <.hdc>,  'WindowFromDC',  \
    WindowFromPoint, N, <.xPoint, .yPoint>,  'WindowFromPoint',  \
    keybd_event, N, <.bVk, .bScan, .dwFlags, .dwExtraInfo>,  'keybd_event',  \
    mouse_event, N, <.dwFlags, .dx, .dy, .cButtons, .dwExtraInfo>,  'mouse_event',  \
    wsprintf, A, <.lpOut, .lpFmt, .etc>,  'wsprintfA',  \
    wsprintf, W, <.lpOut, .lpFmt, .etc>,  'wsprintfW',  \
    wvsprintf, A, <NONE>,  'wvsprintfA',  \
    wvsprintf, W, <NONE>,  'wvsprintfW'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted freshlib/imports/Win32/api/wsock32.inc.

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
;   wsock32.dll API calls (ASCII)
import_proto wsock32,  \
    AcceptEx, N, <.sListenSocket, .sAcceptSocket, .lpOutputBuffer, .dwReceiveDataLength, .dwLocalAddressLength, .dwRemoteAddressLength, .lpdwBytesReceived, .lpOverlapped>,  'AcceptEx',  \
    EnumProtocols, A, <.lpiProtocols, .lpProtocolBuffer, .lpdwBufferLength>,  'EnumProtocolsA',  \
    EnumProtocols, W, <.lpiProtocols, .lpProtocolBuffer, .lpdwBufferLength>,  'EnumProtocolsW',  \
    GetAcceptExSockaddrs, N, <.lpOutputBuffer, .dwReceiveDataLength, .dwLocalAddressLength, .dwRemoteAddressLength, .LocalSockaddr, .LocalSockaddrLength, .RemoteSockaddr, .RemoteSockaddrLength>,  'GetAcceptExSockaddrs',  \
    GetAddressByName, A, <.dwNameSpace, .lpServiceType, .lpServiceName, .lpiProtocols, .dwResolution, .lpServiceAs, .lpCsaddrBuffer, .lpdwBufferLength, .lpAliasBuffer, .lpdwAliasBufferLength>,  'GetAddressByNameA',  \
    GetAddressByName, W, <.dwNameSpace, .lpServiceType, .lpServiceName, .lpiProtocols, .dwResolution, .lpServiceAs, .lpCsaddrBuffer, .lpdwBufferLength, .lpAliasBuffer, .lpdwAliasBufferLength>,  'GetAddressByNameW',  \
    GetNameByType, A, <.lpServiceType, .lpServiceName, .dwNameLength>,  'GetNameByTypeA',  \
    GetNameByType, W, <.lpServiceType, .lpServiceName, .dwNameLength>,  'GetNameByTypeW',  \
    GetService, A, <.dwNameSpace, .lpGuid, .lpServiceName, .dwProperties, .lpBuffer, .lpdwBufferSize, .lpServiceAs>,  'GetServiceA',  \
    GetService, W, <.dwNameSpace, .lpGuid, .lpServiceName, .dwProperties, .lpBuffer, .lpdwBufferSize, .lpServiceAs>,  'GetServiceW',  \
    GetTypeByName, A, <.lpServiceName, .lpServiceType>,  'GetTypeByNameA',  \
    GetTypeByName, W, <.lpServiceName, .lpServiceType>,  'GetTypeByNameW',  \
    MigrateWinsockConfiguration, N, <NONE>,  'MigrateWinsockConfiguration',  \
    NPLoadNameSpaces, N, <NONE>,  'NPLoadNameSpaces',  \
    SetService, A, <.dwNameSpace, .dwOperation, .dwFlags, .lpServiceInfo, .lpServiceAsyncInfo, .lpdwStatusFlags>,  'SetServiceA',  \
    SetService, W, <.dwNameSpace, .dwOperation, .dwFlags, .lpServiceInfo, .lpServiceAsyncInfo, .lpdwStatusFlags>,  'SetServiceW',  \
    TransmitFile, N, <.hSocket, .hFile, .nNumberOfBytesToWrite, .nNumberOfBytesPerSend, .lpOverlapped, .lpTransmitBuffers, .dwReserved>,  'TransmitFile',  \
    WEP, N, <NONE>,  'WEP',  \
    WSAAsyncGetHostByAddr, N, <.hWnd, .wMsg, .addr, .lLen, .lType, .buf, .buflen>,  'WSAAsyncGetHostByAddr',  \
    WSAAsyncGetHostByName, N, <.hWnd, .wMsg, .name, .buf, .buflen>,  'WSAAsyncGetHostByName',  \
    WSAAsyncGetProtoByName, N, <.hWnd, .wMsg, .name, .buf, .buflen>,  'WSAAsyncGetProtoByName',  \
    WSAAsyncGetProtoByNumber, N, <.hWnd, .wMsg, .number, .buf, .buflen>,  'WSAAsyncGetProtoByNumber',  \
    WSAAsyncGetServByName, N, <.hWnd, .wMsg, .name, .proto, .buf, .buflen>,  'WSAAsyncGetServByName',  \
    WSAAsyncGetServByPort, N, <.hWnd, .wMsg, .port, .proto, .buf, .buflen>,  'WSAAsyncGetServByPort',  \
    WSAAsyncSelect, N, <.s, .hWnd, .wMsg, .lEvent>,  'WSAAsyncSelect',  \
    WSACancelAsyncRequest, N, <.hAsyncTaskHandle>,  'WSACancelAsyncRequest',  \
    WSACancelBlockingCall, N, <VOID>,  'WSACancelBlockingCall',  \
    WSACleanup, N, <VOID>,  'WSACleanup',  \
    WSAGetLastError, N, <VOID>,  'WSAGetLastError',  \
    WSAIsBlocking, N, <VOID>,  'WSAIsBlocking',  \
    WSARecvEx, N, <.s, .buf, .lLen, .flags>,  'WSARecvEx',  \
    WSASetBlockingHook, N, <.lpBlockFunc>,  'WSASetBlockingHook',  \
    WSASetLastError, N, <.iError>,  'WSASetLastError',  \
    WSAStartup, N, <.wVersionRequired, .lpWSAData>,  'WSAStartup',  \
    WSAUnhookBlockingHook, N, <VOID>,  'WSAUnhookBlockingHook',  \
    WSApSetPostRoutine, N, <NONE>,  'WSApSetPostRoutine',  \
    __WSAFDIsSet, N, <NONE>,  '__WSAFDIsSet',  \
    accept, N, <.s, .addr, .addrlen>,  'accept',  \
    bind, N, <.s, .addr, .namelen>,  'bind',  \
    closesocket, N, <.s>,  'closesocket',  \
    connect, N, <.s, .name, .namelen>,  'connect',  \
    dn_expand, N, <NONE>,  'dn_expand',  \
    gethostbyaddr, N, <.addr, .len, .type>,  'gethostbyaddr',  \
    gethostbyname, N, <.name>,  'gethostbyname',  \
    gethostname, N, <.name, .namelen>,  'gethostname',  \
    getnetbyname, N, <NONE>,  'getnetbyname',  \
    getpeername, N, <.s, .name, .namelen>,  'getpeername',  \
    getprotobyname, N, <.name>,  'getprotobyname',  \
    getprotobynumber, N, <.number>,  'getprotobynumber',  \
    getservbyname, N, <.name, .proto>,  'getservbyname',  \
    getservbyport, N, <.port, .proto>,  'getservbyport',  \
    getsockname, N, <.s, .name, .namelen>,  'getsockname',  \
    getsockopt, N, <.s, .level, .optname, .optval, .optlen>,  'getsockopt',  \
    htonl, N, <.hostlong>,  'htonl',  \
    htons, N, <.hostshort>,  'htons',  \
    inet_addr, N, <.cp>,  'inet_addr',  \
    inet_network, N, <NONE>,  'inet_network',  \
    inet_ntoa, N, <.lIn>,  'inet_ntoa',  \
    ioctlsocket, N, <.s, .cmd, .argp>,  'ioctlsocket',  \
    listen, N, <.s, .backlog>,  'listen',  \
    ntohl, N, <.netlong>,  'ntohl',  \
    ntohs, N, <.netshort>,  'ntohs',  \
    rcmd, N, <NONE>,  'rcmd',  \
    recv, N, <.s, .buf, .lLen, .flags>,  'recv',  \
    recvfrom, N, <.s, .buf, .lLen, .flags, .from, .fromlen>,  'recvfrom',  \
    rexec, N, <NONE>,  'rexec',  \
    rresvport, N, <NONE>,  'rresvport',  \
    s_perror, N, <NONE>,  's_perror',  \
    select, N, <NONE>,  'select',  \
    send, N, <.s, .buf, .lLen, .flags>,  'send',  \
    sendto, N, <.s, .buf, .lLen, .flags, .to, .tolen>,  'sendto',  \
    sethostname, N, <NONE>,  'sethostname',  \
    setsockopt, N, <.s, .level, .optname, .optval, .optlen>,  'setsockopt',  \
    shutdown, N, <.s, .how>,  'shutdown',  \
    socket, N, <.af, .lType, .protocol>,  'socket'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































Added freshlib/imports/Win32/comctl32.inc.



















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: comctl32.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

import_proto comctl32,  \
    AddMRUStringW, <NONE>,  'AddMRUStringW',  \
    CreateMRUListW, <NONE>,  'CreateMRUListW',  \
    CreateMappedBitmap, <.hInstance, .idBitmap, .wFlags, .lpColorMap, .ByValumMaps>,  'CreateMappedBitmap',  \
    CreatePropertySheetPage, <.lpcpropsheetpagea>,  'CreatePropertySheetPage',  \
    CreatePropertySheetPageA, <.lpcpropsheetpagea>,  'CreatePropertySheetPageA',  \
    CreatePropertySheetPageW, <.lpcpropsheetpagea>,  'CreatePropertySheetPageW',  \
    CreateStatusWindow, <.dwStyle, .lpszText, .hWndParent, .wID>,  'CreateStatusWindow',  \
    CreateStatusWindowA, <.dwStyle, .lpszText, .hWndParent, .wID>,  'CreateStatusWindowA',  \
    CreateStatusWindowW, <.dwStyle, .lpszText, .hWndParent, .wID>,  'CreateStatusWindowW',  \
    CreateToolbar, <NONE>,  'CreateToolbar',  \
    CreateToolbarEx, <.hWndParent, .dwStyle, .wID, .nBitmaps, .hBMInst, .wBMID, .lpButtons, .iNumButtons, .dxButton, .dyButton, .dxBitmap,  \
        .dyBitmap, .uStructSize>,  'CreateToolbarEx',  \
    CreateUpDownControl, <.dwStyle, .x, .y, .cx, .cy, .hParent, .nID, .hInst, .hBuddy, .nUpper, .nLower, .nPos>,  'CreateUpDownControl',  \
    DPA_Create, <NONE>,  'DPA_Create',  \
    DPA_DeleteAllPtrs, <NONE>,  'DPA_DeleteAllPtrs',  \
    DPA_DeletePtr, <NONE>,  'DPA_DeletePtr',  \
    DPA_Destroy, <NONE>,  'DPA_Destroy',  \
    DPA_DestroyCallback, <NONE>,  'DPA_DestroyCallback',  \
    DPA_EnumCallback, <NONE>,  'DPA_EnumCallback',  \
    DPA_GetPtr, <NONE>,  'DPA_GetPtr',  \
    DPA_InsertPtr, <NONE>,  'DPA_InsertPtr',  \
    DPA_Search, <NONE>,  'DPA_Search',  \
    DPA_SetPtr, <NONE>,  'DPA_SetPtr',  \
    DPA_Sort, <NONE>,  'DPA_Sort',  \
    DSA_Create, <NONE>,  'DSA_Create',  \
    DSA_DeleteAllItems, <NONE>,  'DSA_DeleteAllItems',  \
    DSA_Destroy, <NONE>,  'DSA_Destroy',  \
    DSA_DestroyCallback, <NONE>,  'DSA_DestroyCallback',  \
    DSA_GetItemPtr, <NONE>,  'DSA_GetItemPtr',  \
    DSA_InsertItem, <NONE>,  'DSA_InsertItem',  \
    DefSubclassProc, <NONE>,  'DefSubclassProc',  \
    DestroyPropertySheetPage, <.hpropsheetpage>,  'DestroyPropertySheetPage',  \
    DrawInsert, <.handParent, .hLB, .nItem>,  'DrawInsert',  \
    DrawStatusText, <.hDC, .lprc, .pszText, .uFlags>,  'DrawStatusText',  \
    DrawStatusTextA, <.hDC, .lprc, .pszText, .uFlags>,  'DrawStatusTextA',  \
    DrawStatusTextW, <.hDC, .lprc, .pszText, .uFlags>,  'DrawStatusTextW',  \
    EnumMRUListW, <NONE>,  'EnumMRUListW',  \
    FlatSB_EnableScrollBar, <.hwnd, .ByValt, .uint>,  'FlatSB_EnableScrollBar',  \
    FlatSB_GetScrollInfo, <.hwnd, .code, .lpscrollinfo>,  'FlatSB_GetScrollInfo',  \
    FlatSB_GetScrollPos, <.hwnd, .code>,  'FlatSB_GetScrollPos',  \
    FlatSB_GetScrollProp, <.hwnd, .propIndex, .lpint>,  'FlatSB_GetScrollProp',  \
    FlatSB_GetScrollRange, <.hwnd, .code, .lpint>,  'FlatSB_GetScrollRange',  \
    FlatSB_SetScrollInfo, <.hwnd, .code, .lpscrollinfo, .fRedraw>,  'FlatSB_SetScrollInfo',  \
    FlatSB_SetScrollPos, <.hwnd, .code, .pos, .fRedraw>,  'FlatSB_SetScrollPos',  \
    FlatSB_SetScrollProp, <.hwnd, .index, .newValue, .bool>,  'FlatSB_SetScrollProp',  \
    FlatSB_SetScrollRange, <.hwnd, .code, .min, .max, .fRedraw>,  'FlatSB_SetScrollRange',  \
    FlatSB_ShowScrollBar, <.hwnd, .code, .bool>,  'FlatSB_ShowScrollBar',  \
    FreeMRUList, <NONE>,  'FreeMRUList',  \
    GetEffectiveClientRect, <.hWnd, .lprc, .lpInfo>,  'GetEffectiveClientRect',  \
    GetMUILanguage, <VOID>,  'GetMUILanguage',  \
    ImageList_Add, <.himl, .hbmImage, .hbmMask>,  'ImageList_Add',  \
    ImageList_AddIcon, <NONE>,  'ImageList_AddIcon',  \
    ImageList_AddMasked, <.himl, .hbmImage, .crMask>,  'ImageList_AddMasked',  \
    ImageList_BeginDrag, <.himlTrack, .iTrack, .dxHotspot, .dyHotspot>,  'ImageList_BeginDrag',  \
    ImageList_Copy, <.himlDst, .iDst, .himlSrc, .iSrc, .uFlags>,  'ImageList_Copy',  \
    ImageList_Create, <.cx, .cy, .flags, .cInitial, .cGrow>,  'ImageList_Create',  \
    ImageList_Destroy, <.himl>,  'ImageList_Destroy',  \
    ImageList_DragEnter, <.hwndLock, .x, .y>,  'ImageList_DragEnter',  \
    ImageList_DragLeave, <.hWndOwner>,  'ImageList_DragLeave',  \
    ImageList_DragMove, <.x, .y>,  'ImageList_DragMove',  \
    ImageList_DragShowNolock, <.fBoolean>,  'ImageList_DragShowNolock',  \
    ImageList_Draw, <.himl, .i, .hdcDst, .x, .y, .fStyle>,  'ImageList_Draw',  \
    ImageList_DrawEx, <.himl, .i, .hdcDst, .x, .y, .dx, .dy, .rgbBk, .rgbFg, .fStyle>,  'ImageList_DrawEx',  \
    ImageList_DrawIndirect, <.pimldp>,  'ImageList_DrawIndirect',  \
    ImageList_Duplicate, <.himl>,  'ImageList_Duplicate',  \
    ImageList_EndDrag, <VOID>,  'ImageList_EndDrag',  \
    ImageList_GetBkColor, <.himl>,  'ImageList_GetBkColor',  \
    ImageList_GetDragImage, <.ppt, .pptHotspot>,  'ImageList_GetDragImage',  \
    ImageList_GetFlags, <NONE>,  'ImageList_GetFlags',  \
    ImageList_GetIcon, <.himl, .i, .flags>,  'ImageList_GetIcon',  \
    ImageList_GetIconSize, <.himl, .cx, .cy>,  'ImageList_GetIconSize',  \
    ImageList_GetImageCount, <.himl>,  'ImageList_GetImageCount',  \
    ImageList_GetImageInfo, <.himl, .i, .pImageInfo>,  'ImageList_GetImageInfo',  \
    ImageList_GetImageRect, <NONE>,  'ImageList_GetImageRect',  \
    ImageList_LoadImage, <.hInst, .lpszbmp, .cx, .cGrow, .crMask, .uType, .uFlags>,  'ImageList_LoadImage',  \
    ImageList_LoadImageA, <.hInst, .lpszbmp, .cx, .cGrow, .crMask, .uType, .uFlags>,  'ImageList_LoadImageA',  \
    ImageList_LoadImageW, <.hInst, .lpszbmp, .cx, .cGrow, .crMask, .uType, .uFlags>,  'ImageList_LoadImageW',  \
    ImageList_Merge, <.himl1, .i1, .himl2, .i2, .dx, .dy>,  'ImageList_Merge',  \
    ImageList_Read, <.pstm>,  'ImageList_Read',  \
    ImageList_Remove, <.himl, .i>,  'ImageList_Remove',  \
    ImageList_Replace, <.himl, .i, .hbmImage, .hbmMask>,  'ImageList_Replace',  \
    ImageList_ReplaceIcon, <.himl, .i, .hicon>,  'ImageList_ReplaceIcon',  \
    ImageList_SetBkColor, <.himl, .clrBk>,  'ImageList_SetBkColor',  \
    ImageList_SetDragCursorImage, <.himlDrag, .iDrag, .dxHotspot, .dyHotspot>,  'ImageList_SetDragCursorImage',  \
    ImageList_SetFilter, <NONE>,  'ImageList_SetFilter',  \
    ImageList_SetFlags, <NONE>,  'ImageList_SetFlags',  \
    ImageList_SetIconSize, <.himl, .cx, .cy>,  'ImageList_SetIconSize',  \
    ImageList_SetImageCount, <.himl, .uNewCount>,  'ImageList_SetImageCount',  \
    ImageList_SetOverlayImage, <.himl, .iImage, .iOverlay>,  'ImageList_SetOverlayImage',  \
    ImageList_Write, <.himl, .pstm>,  'ImageList_Write',  \
    InitCommonControls, <VOID>,  'InitCommonControls',  \
    InitCommonControlsEx, <.pIcce>,  'InitCommonControlsEx',  \
    InitMUILanguage, <.uiLang>,  'InitMUILanguage',  \
    InitializeFlatSB, <.hwnd>,  'InitializeFlatSB',  \
    LBItemFromPt, <.hLB, .pt, .bAutoScroll>,  'LBItemFromPt',  \
    MakeDragList, <.hLB>,  'MakeDragList',  \
    MenuHelp, <.uMsg, .wParam, .lParam, .hMainMenu, .hInst, .hwndStatus, .lpwIDs>,  'MenuHelp',  \
    PropertySheet, <.lpcpropsheetheadera>,  'PropertySheet',  \
    PropertySheetA, <.lpcpropsheetheadera>,  'PropertySheetA',  \
    PropertySheetW, <.lpcpropsheetheadera>,  'PropertySheetW',  \
    RemoveWindowSubclass, <NONE>,  'RemoveWindowSubclass',  \
    SetWindowSubclass, <NONE>,  'SetWindowSubclass',  \
    ShowHideMenuCtl, <.hWnd, .uFlags, .lpInfo>,  'ShowHideMenuCtl',  \
    Str_SetPtrW, <NONE>,  'Str_SetPtrW',  \
    UninitializeFlatSB, <.hwnd>,  'UninitializeFlatSB',  \
    _TrackMouseEvent, <NONE>,  '_TrackMouseEvent'

Added freshlib/imports/Win32/comdlg32.inc.



















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: comdlg32.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

import_proto comdlg32,  \
    ChooseColorA, <.pChoosecolor>,  'ChooseColorA',  \
    ChooseColorW, <.pChoosecolor>,  'ChooseColorW',  \
    ChooseFontA, <.pChoosefont>,  'ChooseFontA',  \
    ChooseFontW, <.pChoosefont>,  'ChooseFontW',  \
    CommDlgExtendedError, <VOID>,  'CommDlgExtendedError',  \
    FindTextA, <.pFindreplace>,  'FindTextA',  \
    FindTextW, <.pFindreplace>,  'FindTextW',  \
    GetFileTitleA, <.lpszFile, .lpszTitle, .cbBuf>,  'GetFileTitleA',  \
    GetFileTitleW, <.lpszFile, .lpszTitle, .cbBuf>,  'GetFileTitleW',  \
    GetOpenFileNameA, <.pOpenfilename>,  'GetOpenFileNameA',  \
    GetOpenFileNameW, <.pOpenfilename>,  'GetOpenFileNameW',  \
    GetSaveFileNameA, <.pOpenfilename>,  'GetSaveFileNameA',  \
    GetSaveFileNameW, <.pOpenfilename>,  'GetSaveFileNameW',  \
    LoadAlterBitmap, <NONE>,  'LoadAlterBitmap',  \
    PageSetupDlgA, <.pPagesetupdlg>,  'PageSetupDlgA',  \
    PageSetupDlgW, <.pPagesetupdlg>,  'PageSetupDlgW',  \
    PrintDlgA, <.pPrintdlg>,  'PrintDlgA',  \
    PrintDlgExA, <.TLPPRINTDLGEXA>,  'PrintDlgExA',  \
    PrintDlgExW, <.TLPPRINTDLGEXA>,  'PrintDlgExW',  \
    PrintDlgW, <.pPrintdlg>,  'PrintDlgW',  \
    ReplaceTextA, <.pFindreplace>,  'ReplaceTextA',  \
    ReplaceTextW, <.pFindreplace>,  'ReplaceTextW',  \
    Ssync_ANSI_UNICODE_Struct_For_WOW, <NONE>,  'Ssync_ANSI_UNICODE_Struct_For_WOW',  \
    WantArrows, <NONE>,  'WantArrows',  \
    dwLBSubclass, <NONE>,  'dwLBSubclass',  \
    dwOKSubclass, <NONE>,  'dwOKSubclass'

Added freshlib/imports/Win32/crtdll.inc.























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: crtdll.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto crtdll,  \
    _CIacos, <NONE>,  '_CIacos',  \
    _CIasin, <NONE>,  '_CIasin',  \
    _CIatan, <NONE>,  '_CIatan',  \
    _CIatan2, <NONE>,  '_CIatan2',  \
    _CIcos, <NONE>,  '_CIcos',  \
    _CIcosh, <NONE>,  '_CIcosh',  \
    _CIexp, <NONE>,  '_CIexp',  \
    _CIfmod, <NONE>,  '_CIfmod',  \
    _CIlog, <NONE>,  '_CIlog',  \
    _CIlog10, <NONE>,  '_CIlog10',  \
    _CIpow, <NONE>,  '_CIpow',  \
    _CIsin, <NONE>,  '_CIsin',  \
    _CIsinh, <NONE>,  '_CIsinh',  \
    _CIsqrt, <NONE>,  '_CIsqrt',  \
    _CItan, <NONE>,  '_CItan',  \
    _CItanh, <NONE>,  '_CItanh',  \
    _HUGE_dll, <NONE>,  '_HUGE_dll',  \
    _XcptFilter, <NONE>,  '_XcptFilter',  \
    __GetMainArgs, <NONE>,  '__GetMainArgs',  \
    __argc_dll, <NONE>,  '__argc_dll',  \
    __argv_dll, <NONE>,  '__argv_dll',  \
    __dllonexit, <NONE>,  '__dllonexit',  \
    __doserrno, <NONE>,  '__doserrno',  \
    __fpecode, <NONE>,  '__fpecode',  \
    __isascii, <NONE>,  '__isascii',  \
    __iscsym, <NONE>,  '__iscsym',  \
    __iscsymf, <NONE>,  '__iscsymf',  \
    __mb_cur_max_dll, <NONE>,  '__mb_cur_max_dll',  \
    __pxcptinfoptrs, <NONE>,  '__pxcptinfoptrs',  \
    __threadhandle, <NONE>,  '__threadhandle',  \
    __threadid, <NONE>,  '__threadid',  \
    __toascii, <NONE>,  '__toascii',  \
    _abnormal_termination, <NONE>,  '_abnormal_termination',  \
    _access, <NONE>,  '_access',  \
    _acmdln_dll, <NONE>,  '_acmdln_dll',  \
    _aexit_rtn_dll, <NONE>,  '_aexit_rtn_dll',  \
    _amsg_exit, <NONE>,  '_amsg_exit',  \
    _assert, <NONE>,  '_assert',  \
    _basemajor_dll, <NONE>,  '_basemajor_dll',  \
    _baseminor_dll, <NONE>,  '_baseminor_dll',  \
    _baseversion_dll, <NONE>,  '_baseversion_dll',  \
    _beep, <NONE>,  '_beep',  \
    _beginthread, <NONE>,  '_beginthread',  \
    _c_exit, <NONE>,  '_c_exit',  \
    _cabs, <NONE>,  '_cabs',  \
    _cexit, <NONE>,  '_cexit',  \
    _cgets, <NONE>,  '_cgets',  \
    _chdir, <NONE>,  '_chdir',  \
    _chdrive, <NONE>,  '_chdrive',  \
    _chgsign, <NONE>,  '_chgsign',  \
    _chmod, <NONE>,  '_chmod',  \
    _chsize, <NONE>,  '_chsize',  \
    _clearfp, <NONE>,  '_clearfp',  \
    _commit, <NONE>,  '_commit',  \
    _commode_dll, <NONE>,  '_commode_dll',  \
    _control87, <NONE>,  '_control87',  \
    _controlfp, <NONE>,  '_controlfp',  \
    _copysign, <NONE>,  '_copysign',  \
    _cprintf, <NONE>,  '_cprintf',  \
    _cpumode_dll, <NONE>,  '_cpumode_dll',  \
    _cputs, <NONE>,  '_cputs',  \
    _cscanf, <NONE>,  '_cscanf',  \
    _ctype, <NONE>,  '_ctype',  \
    _cwait, <NONE>,  '_cwait',  \
    _daylight_dll, <NONE>,  '_daylight_dll',  \
    _dup, <NONE>,  '_dup',  \
    _dup2, <NONE>,  '_dup2',  \
    _ecvt, <NONE>,  '_ecvt',  \
    _endthread, <NONE>,  '_endthread',  \
    _environ_dll, <NONE>,  '_environ_dll',  \
    _eof, <NONE>,  '_eof',  \
    _errno, <NONE>,  '_errno',  \
    _except_handler2, <NONE>,  '_except_handler2',  \
    _execl, <NONE>,  '_execl',  \
    _execle, <NONE>,  '_execle',  \
    _execlp, <NONE>,  '_execlp',  \
    _execlpe, <NONE>,  '_execlpe',  \
    _execv, <NONE>,  '_execv',  \
    _execve, <NONE>,  '_execve',  \
    _execvp, <NONE>,  '_execvp',  \
    _execvpe, <NONE>,  '_execvpe',  \
    _exit, <NONE>,  '_exit',  \
    _expand, <NONE>,  '_expand',  \
    _fcloseall, <NONE>,  '_fcloseall',  \
    _fcvt, <NONE>,  '_fcvt',  \
    _fdopen, <NONE>,  '_fdopen',  \
    _fgetchar, <NONE>,  '_fgetchar',  \
    _fgetwchar, <NONE>,  '_fgetwchar',  \
    _filbuf, <NONE>,  '_filbuf',  \
    _fileinfo_dll, <NONE>,  '_fileinfo_dll',  \
    _filelength, <NONE>,  '_filelength',  \
    _fileno, <NONE>,  '_fileno',  \
    _findclose, <NONE>,  '_findclose',  \
    _findfirst, <NONE>,  '_findfirst',  \
    _findnext, <NONE>,  '_findnext',  \
    _finite, <NONE>,  '_finite',  \
    _flsbuf, <NONE>,  '_flsbuf',  \
    _flushall, <NONE>,  '_flushall',  \
    _fmode_dll, <NONE>,  '_fmode_dll',  \
    _fpclass, <NONE>,  '_fpclass',  \
    _fpieee_flt, <NONE>,  '_fpieee_flt',  \
    _fpreset, <NONE>,  '_fpreset',  \
    _fputchar, <NONE>,  '_fputchar',  \
    _fputwchar, <NONE>,  '_fputwchar',  \
    _fsopen, <NONE>,  '_fsopen',  \
    _fstat, <NONE>,  '_fstat',  \
    _ftime, <NONE>,  '_ftime',  \
    _ftol, <NONE>,  '_ftol',  \
    _fullpath, <NONE>,  '_fullpath',  \
    _futime, <NONE>,  '_futime',  \
    _gcvt, <NONE>,  '_gcvt',  \
    _get_osfhandle, <NONE>,  '_get_osfhandle',  \
    _getch, <NONE>,  '_getch',  \
    _getche, <NONE>,  '_getche',  \
    _getcwd, <NONE>,  '_getcwd',  \
    _getdcwd, <NONE>,  '_getdcwd',  \
    _getdiskfree, <NONE>,  '_getdiskfree',  \
    _getdllprocaddr, <NONE>,  '_getdllprocaddr',  \
    _getdrive, <NONE>,  '_getdrive',  \
    _getdrives, <NONE>,  '_getdrives',  \
    _getpid, <NONE>,  '_getpid',  \
    _getsystime, <NONE>,  '_getsystime',  \
    _getw, <NONE>,  '_getw',  \
    _global_unwind2, <NONE>,  '_global_unwind2',  \
    _heapchk, <NONE>,  '_heapchk',  \
    _heapmin, <NONE>,  '_heapmin',  \
    _heapset, <NONE>,  '_heapset',  \
    _heapwalk, <NONE>,  '_heapwalk',  \
    _hypot, <NONE>,  '_hypot',  \
    _initterm, <NONE>,  '_initterm',  \
    _iob, <NONE>,  '_iob',  \
    _isatty, <NONE>,  '_isatty',  \
    _isctype, <NONE>,  '_isctype',  \
    _ismbbalnum, <NONE>,  '_ismbbalnum',  \
    _ismbbalpha, <NONE>,  '_ismbbalpha',  \
    _ismbbgraph, <NONE>,  '_ismbbgraph',  \
    _ismbbkalnum, <NONE>,  '_ismbbkalnum',  \
    _ismbbkana, <NONE>,  '_ismbbkana',  \
    _ismbbkpunct, <NONE>,  '_ismbbkpunct',  \
    _ismbblead, <NONE>,  '_ismbblead',  \
    _ismbbprint, <NONE>,  '_ismbbprint',  \
    _ismbbpunct, <NONE>,  '_ismbbpunct',  \
    _ismbbtrail, <NONE>,  '_ismbbtrail',  \
    _ismbcalpha, <NONE>,  '_ismbcalpha',  \
    _ismbcdigit, <NONE>,  '_ismbcdigit',  \
    _ismbchira, <NONE>,  '_ismbchira',  \
    _ismbckata, <NONE>,  '_ismbckata',  \
    _ismbcl0, <NONE>,  '_ismbcl0',  \
    _ismbcl1, <NONE>,  '_ismbcl1',  \
    _ismbcl2, <NONE>,  '_ismbcl2',  \
    _ismbclegal, <NONE>,  '_ismbclegal',  \
    _ismbclower, <NONE>,  '_ismbclower',  \
    _ismbcprint, <NONE>,  '_ismbcprint',  \
    _ismbcspace, <NONE>,  '_ismbcspace',  \
    _ismbcsymbol, <NONE>,  '_ismbcsymbol',  \
    _ismbcupper, <NONE>,  '_ismbcupper',  \
    _ismbslead, <NONE>,  '_ismbslead',  \
    _ismbstrail, <NONE>,  '_ismbstrail',  \
    _isnan, <NONE>,  '_isnan',  \
    _itoa, <NONE>,  '_itoa',  \
    _itow, <NONE>,  '_itow',  \
    _j0, <NONE>,  '_j0',  \
    _j1, <NONE>,  '_j1',  \
    _jn, <NONE>,  '_jn',  \
    _kbhit, <NONE>,  '_kbhit',  \
    _lfind, <NONE>,  '_lfind',  \
    _loaddll, <NONE>,  '_loaddll',  \
    _local_unwind2, <NONE>,  '_local_unwind2',  \
    _locking, <NONE>,  '_locking',  \
    _logb, <NONE>,  '_logb',  \
    _lrotl, <NONE>,  '_lrotl',  \
    _lrotr, <NONE>,  '_lrotr',  \
    _lsearch, <NONE>,  '_lsearch',  \
    _ltoa, <NONE>,  '_ltoa',  \
    _ltow, <NONE>,  '_ltow',  \
    _makepath, <NONE>,  '_makepath',  \
    _matherr, <NONE>,  '_matherr',  \
    _mbbtombc, <NONE>,  '_mbbtombc',  \
    _mbbtype, <NONE>,  '_mbbtype',  \
    _mbccpy, <NONE>,  '_mbccpy',  \
    _mbcjistojms, <NONE>,  '_mbcjistojms',  \
    _mbcjmstojis, <NONE>,  '_mbcjmstojis',  \
    _mbclen, <NONE>,  '_mbclen',  \
    _mbctohira, <NONE>,  '_mbctohira',  \
    _mbctokata, <NONE>,  '_mbctokata',  \
    _mbctolower, <NONE>,  '_mbctolower',  \
    _mbctombb, <NONE>,  '_mbctombb',  \
    _mbctoupper, <NONE>,  '_mbctoupper',  \
    _mbctype, <NONE>,  '_mbctype',  \
    _mbsbtype, <NONE>,  '_mbsbtype',  \
    _mbscat, <NONE>,  '_mbscat',  \
    _mbschr, <NONE>,  '_mbschr',  \
    _mbscmp, <NONE>,  '_mbscmp',  \
    _mbscpy, <NONE>,  '_mbscpy',  \
    _mbscspn, <NONE>,  '_mbscspn',  \
    _mbsdec, <NONE>,  '_mbsdec',  \
    _mbsdup, <NONE>,  '_mbsdup',  \
    _mbsicmp, <NONE>,  '_mbsicmp',  \
    _mbsinc, <NONE>,  '_mbsinc',  \
    _mbslen, <NONE>,  '_mbslen',  \
    _mbslwr, <NONE>,  '_mbslwr',  \
    _mbsnbcat, <NONE>,  '_mbsnbcat',  \
    _mbsnbcmp, <NONE>,  '_mbsnbcmp',  \
    _mbsnbcnt, <NONE>,  '_mbsnbcnt',  \
    _mbsnbcpy, <NONE>,  '_mbsnbcpy',  \
    _mbsnbicmp, <NONE>,  '_mbsnbicmp',  \
    _mbsnbset, <NONE>,  '_mbsnbset',  \
    _mbsncat, <NONE>,  '_mbsncat',  \
    _mbsnccnt, <NONE>,  '_mbsnccnt',  \
    _mbsncmp, <NONE>,  '_mbsncmp',  \
    _mbsncpy, <NONE>,  '_mbsncpy',  \
    _mbsnextc, <NONE>,  '_mbsnextc',  \
    _mbsnicmp, <NONE>,  '_mbsnicmp',  \
    _mbsninc, <NONE>,  '_mbsninc',  \
    _mbsnset, <NONE>,  '_mbsnset',  \
    _mbspbrk, <NONE>,  '_mbspbrk',  \
    _mbsrchr, <NONE>,  '_mbsrchr',  \
    _mbsrev, <NONE>,  '_mbsrev',  \
    _mbsset, <NONE>,  '_mbsset',  \
    _mbsspn, <NONE>,  '_mbsspn',  \
    _mbsspnp, <NONE>,  '_mbsspnp',  \
    _mbsstr, <NONE>,  '_mbsstr',  \
    _mbstok, <NONE>,  '_mbstok',  \
    _mbstrlen, <NONE>,  '_mbstrlen',  \
    _mbsupr, <NONE>,  '_mbsupr',  \
    _memccpy, <NONE>,  '_memccpy',  \
    _memicmp, <NONE>,  '_memicmp',  \
    _mkdir, <NONE>,  '_mkdir',  \
    _mktemp, <NONE>,  '_mktemp',  \
    _msize, <NONE>,  '_msize',  \
    _nextafter, <NONE>,  '_nextafter',  \
    _onexit, <NONE>,  '_onexit',  \
    _open_osfhandle, <NONE>,  '_open_osfhandle',  \
    _osmajor_dll, <NONE>,  '_osmajor_dll',  \
    _osminor_dll, <NONE>,  '_osminor_dll',  \
    _osmode_dll, <NONE>,  '_osmode_dll',  \
    _osver_dll, <NONE>,  '_osver_dll',  \
    _osversion_dll, <NONE>,  '_osversion_dll',  \
    _pclose, <NONE>,  '_pclose',  \
    _pctype_dll, <NONE>,  '_pctype_dll',  \
    _pgmptr_dll, <NONE>,  '_pgmptr_dll',  \
    _pipe, <NONE>,  '_pipe',  \
    _popen, <NONE>,  '_popen',  \
    _purecall, <NONE>,  '_purecall',  \
    _putch, <NONE>,  '_putch',  \
    _putenv, <NONE>,  '_putenv',  \
    _putw, <NONE>,  '_putw',  \
    _pwctype_dll, <NONE>,  '_pwctype_dll',  \
    _rmdir, <NONE>,  '_rmdir',  \
    _rmtmp, <NONE>,  '_rmtmp',  \
    _rotl, <NONE>,  '_rotl',  \
    _rotr, <NONE>,  '_rotr',  \
    _scalb, <NONE>,  '_scalb',  \
    _searchenv, <NONE>,  '_searchenv',  \
    _seterrormode, <NONE>,  '_seterrormode',  \
    _setjmp, <NONE>,  '_setjmp',  \
    _setmode, <NONE>,  '_setmode',  \
    _setsystime, <NONE>,  '_setsystime',  \
    _sleep, <NONE>,  '_sleep',  \
    _snprintf, <NONE>,  '_snprintf',  \
    _snwprintf, <NONE>,  '_snwprintf',  \
    _sopen, <NONE>,  '_sopen',  \
    _spawnl, <NONE>,  '_spawnl',  \
    _spawnle, <NONE>,  '_spawnle',  \
    _spawnlp, <NONE>,  '_spawnlp',  \
    _spawnlpe, <NONE>,  '_spawnlpe',  \
    _spawnv, <NONE>,  '_spawnv',  \
    _spawnve, <NONE>,  '_spawnve',  \
    _spawnvp, <NONE>,  '_spawnvp',  \
    _spawnvpe, <NONE>,  '_spawnvpe',  \
    _splitpath, <NONE>,  '_splitpath',  \
    _stat, <NONE>,  '_stat',  \
    _statusfp, <NONE>,  '_statusfp',  \
    _strcmpi, <NONE>,  '_strcmpi',  \
    _strdate, <NONE>,  '_strdate',  \
    _strdec, <NONE>,  '_strdec',  \
    _strdup, <NONE>,  '_strdup',  \
    _strerror, <NONE>,  '_strerror',  \
    _stricmp, <NONE>,  '_stricmp',  \
    _stricoll, <NONE>,  '_stricoll',  \
    _strinc, <NONE>,  '_strinc',  \
    _strlwr, <NONE>,  '_strlwr',  \
    _strncnt, <NONE>,  '_strncnt',  \
    _strnextc, <NONE>,  '_strnextc',  \
    _strnicmp, <NONE>,  '_strnicmp',  \
    _strninc, <NONE>,  '_strninc',  \
    _strnset, <NONE>,  '_strnset',  \
    _strrev, <NONE>,  '_strrev',  \
    _strset, <NONE>,  '_strset',  \
    _strspnp, <NONE>,  '_strspnp',  \
    _strtime, <NONE>,  '_strtime',  \
    _strupr, <NONE>,  '_strupr',  \
    _swab, <NONE>,  '_swab',  \
    _sys_errlist, <NONE>,  '_sys_errlist',  \
    _sys_nerr_dll, <NONE>,  '_sys_nerr_dll',  \
    _tell, <NONE>,  '_tell',  \
    _tempnam, <NONE>,  '_tempnam',  \
    _timezone_dll, <NONE>,  '_timezone_dll',  \
    _tolower, <NONE>,  '_tolower',  \
    _toupper, <NONE>,  '_toupper',  \
    _tzname, <NONE>,  '_tzname',  \
    _tzset, <NONE>,  '_tzset',  \
    _ultoa, <NONE>,  '_ultoa',  \
    _ultow, <NONE>,  '_ultow',  \
    _umask, <NONE>,  '_umask',  \
    _ungetch, <NONE>,  '_ungetch',  \
    _unlink, <NONE>,  '_unlink',  \
    _unloaddll, <NONE>,  '_unloaddll',  \
    _utime, <NONE>,  '_utime',  \
    _vsnprintf, <NONE>,  '_vsnprintf',  \
    _vsnwprintf, <NONE>,  '_vsnwprintf',  \
    _wcsdup, <NONE>,  '_wcsdup',  \
    _wcsicmp, <NONE>,  '_wcsicmp',  \
    _wcsicoll, <NONE>,  '_wcsicoll',  \
    _wcslwr, <NONE>,  '_wcslwr',  \
    _wcsnicmp, <NONE>,  '_wcsnicmp',  \
    _wcsnset, <NONE>,  '_wcsnset',  \
    _wcsrev, <NONE>,  '_wcsrev',  \
    _wcsset, <NONE>,  '_wcsset',  \
    _wcsupr, <NONE>,  '_wcsupr',  \
    _winmajor_dll, <NONE>,  '_winmajor_dll',  \
    _winminor_dll, <NONE>,  '_winminor_dll',  \
    _winver_dll, <NONE>,  '_winver_dll',  \
    _wtoi, <NONE>,  '_wtoi',  \
    _wtol, <NONE>,  '_wtol',  \
    _y0, <NONE>,  '_y0',  \
    _y1, <NONE>,  '_y1',  \
    _yn, <NONE>,  '_yn',  \
    abort, <NONE>,  'abort',  \
    abs, <NONE>,  'abs',  \
    acos, <NONE>,  'acos',  \
    asctime, <NONE>,  'asctime',  \
    asin, <NONE>,  'asin',  \
    atan, <NONE>,  'atan',  \
    atan2, <NONE>,  'atan2',  \
    atexit, <NONE>,  'atexit',  \
    atof, <NONE>,  'atof',  \
    atoi, <NONE>,  'atoi',  \
    atol, <NONE>,  'atol',  \
    bsearch, <NONE>,  'bsearch',  \
    calloc, <NONE>,  'calloc',  \
    ceil, <NONE>,  'ceil',  \
    clearerr, <NONE>,  'clearerr',  \
    clock, <NONE>,  'clock',  \
    cos, <NONE>,  'cos',  \
    cosh, <NONE>,  'cosh',  \
    ctime, <NONE>,  'ctime',  \
    difftime, <NONE>,  'difftime',  \
    div, <NONE>,  'div',  \
    exit, <NONE>,  'exit',  \
    exp, <NONE>,  'exp',  \
    fabs, <NONE>,  'fabs',  \
    fclose, <NONE>,  'fclose',  \
    feof, <NONE>,  'feof',  \
    ferror, <NONE>,  'ferror',  \
    fflush, <NONE>,  'fflush',  \
    fgetc, <NONE>,  'fgetc',  \
    fgetpos, <NONE>,  'fgetpos',  \
    fgets, <NONE>,  'fgets',  \
    fgetwc, <NONE>,  'fgetwc',  \
    floor, <NONE>,  'floor',  \
    fmod, <NONE>,  'fmod',  \
    fopen, <NONE>,  'fopen',  \
    fprintf, <NONE>,  'fprintf',  \
    fputc, <NONE>,  'fputc',  \
    fputs, <NONE>,  'fputs',  \
    fputwc, <NONE>,  'fputwc',  \
    fread, <NONE>,  'fread',  \
    free, <.TM_aKey>,  'free',  \
    freopen, <NONE>,  'freopen',  \
    frexp, <NONE>,  'frexp',  \
    fscanf, <NONE>,  'fscanf',  \
    fseek, <NONE>,  'fseek',  \
    fsetpos, <NONE>,  'fsetpos',  \
    ftell, <NONE>,  'ftell',  \
    fwprintf, <NONE>,  'fwprintf',  \
    fwrite, <NONE>,  'fwrite',  \
    fwscanf, <NONE>,  'fwscanf',  \
    getc, <NONE>,  'getc',  \
    getchar, <NONE>,  'getchar',  \
    getenv, <NONE>,  'getenv',  \
    gets, <NONE>,  'gets',  \
    gmtime, <NONE>,  'gmtime',  \
    hread, <.hFile, .lpBuffer, .lBytes>,  'hread',  \
    hwrite, <.hFile, .lpBuffer, .lBytes>,  'hwrite',  \
    is_wctype, <NONE>,  'is_wctype',  \
    isalnum, <NONE>,  'isalnum',  \
    isalpha, <NONE>,  'isalpha',  \
    iscntrl, <NONE>,  'iscntrl',  \
    isdigit, <NONE>,  'isdigit',  \
    isgraph, <NONE>,  'isgraph',  \
    isleadbyte, <NONE>,  'isleadbyte',  \
    islower, <NONE>,  'islower',  \
    isprint, <NONE>,  'isprint',  \
    ispunct, <NONE>,  'ispunct',  \
    isspace, <NONE>,  'isspace',  \
    isupper, <NONE>,  'isupper',  \
    iswalnum, <NONE>,  'iswalnum',  \
    iswalpha, <NONE>,  'iswalpha',  \
    iswascii, <NONE>,  'iswascii',  \
    iswcntrl, <NONE>,  'iswcntrl',  \
    iswctype, <NONE>,  'iswctype',  \
    iswdigit, <NONE>,  'iswdigit',  \
    iswgraph, <NONE>,  'iswgraph',  \
    iswlower, <NONE>,  'iswlower',  \
    iswprint, <NONE>,  'iswprint',  \
    iswpunct, <NONE>,  'iswpunct',  \
    iswspace, <NONE>,  'iswspace',  \
    iswupper, <NONE>,  'iswupper',  \
    iswxdigit, <NONE>,  'iswxdigit',  \
    isxdigit, <NONE>,  'isxdigit',  \
    labs, <NONE>,  'labs',  \
    lclose, <.hFile>,  'lclose',  \
    lcreat, <.lpPathName, .iAttribute>,  'lcreat',  \
    ldexp, <NONE>,  'ldexp',  \
    ldiv, <NONE>,  'ldiv',  \
    llseek, <.hFile, .lOffset, .iOrigin>,  'llseek',  \
    localeconv, <NONE>,  'localeconv',  \
    localtime, <NONE>,  'localtime',  \
    log, <NONE>,  'log',  \
    log10, <NONE>,  'log10',  \
    longjmp, <NONE>,  'longjmp',  \
    lopen, <.lpPathName, .iReadWrite>,  'lopen',  \
    malloc, <NONE>,  'malloc',  \
    mblen, <NONE>,  'mblen',  \
    mbstowcs, <NONE>,  'mbstowcs',  \
    mbtowc, <NONE>,  'mbtowc',  \
    memchr, <NONE>,  'memchr',  \
    memcmp, <NONE>,  'memcmp',  \
    memcpy, <NONE>,  'memcpy',  \
    memmove, <.pVoid, .FunctionCall>,  'memmove',  \
    memset, <NONE>,  'memset',  \
    mktime, <NONE>,  'mktime',  \
    modf, <NONE>,  'modf',  \
    perror, <NONE>,  'perror',  \
    pow, <NONE>,  'pow',  \
    printf, <NONE>,  'printf',  \
    putc, <NONE>,  'putc',  \
    putchar, <NONE>,  'putchar',  \
    puts, <NONE>,  'puts',  \
    qsort, <NONE>,  'qsort',  \
    raise, <NONE>,  'raise',  \
    rand, <NONE>,  'rand',  \
    realloc, <NONE>,  'realloc',  \
    remove, <NONE>,  'remove',  \
    rename, <NONE>,  'rename',  \
    rewind, <NONE>,  'rewind',  \
    scanf, <NONE>,  'scanf',  \
    setbuf, <NONE>,  'setbuf',  \
    setlocale, <NONE>,  'setlocale',  \
    setvbuf, <NONE>,  'setvbuf',  \
    signal, <NONE>,  'signal',  \
    sin, <NONE>,  'sin',  \
    sinh, <NONE>,  'sinh',  \
    sprintf, <NONE>,  'sprintf',  \
    sqrt, <NONE>,  'sqrt',  \
    srand, <NONE>,  'srand',  \
    sscanf, <NONE>,  'sscanf',  \
    strcat, <NONE>,  'strcat',  \
    strchr, <.lpStart, .wMatch>,  'strchr',  \
    strcmp, <NONE>,  'strcmp',  \
    strcoll, <NONE>,  'strcoll',  \
    strcpy, <NONE>,  'strcpy',  \
    strcspn, <.lpStr, .lpSet>,  'strcspn',  \
    strerror, <NONE>,  'strerror',  \
    strftime, <NONE>,  'strftime',  \
    strlen, <NONE>,  'strlen',  \
    strncat, <.psz1, .psz2, .cchMax>,  'strncat',  \
    strncmp, <NONE>,  'strncmp',  \
    strncpy, <NONE>,  'strncpy',  \
    strpbrk, <.psz, .pszSet>,  'strpbrk',  \
    strrchr, <.lpStart, .lpEnd, .wMatch>,  'strrchr',  \
    strspn, <.psz, .pszSet>,  'strspn',  \
    strstr, <.lpFirst, .lpSrch>,  'strstr',  \
    strtod, <NONE>,  'strtod',  \
    strtok, <NONE>,  'strtok',  \
    strtol, <NONE>,  'strtol',  \
    strtoul, <NONE>,  'strtoul',  \
    strxfrm, <NONE>,  'strxfrm',  \
    swprintf, <NONE>,  'swprintf',  \
    swscanf, <NONE>,  'swscanf',  \
    system, <NONE>,  'system',  \
    tan, <NONE>,  'tan',  \
    tanh, <NONE>,  'tanh',  \
    time, <NONE>,  'time',  \
    tmpfile, <NONE>,  'tmpfile',  \
    tmpnam, <NONE>,  'tmpnam',  \
    tolower, <NONE>,  'tolower',  \
    toupper, <NONE>,  'toupper',  \
    towlower, <NONE>,  'towlower',  \
    towupper, <NONE>,  'towupper',  \
    ungetc, <NONE>,  'ungetc',  \
    ungetwc, <NONE>,  'ungetwc',  \
    vfprintf, <NONE>,  'vfprintf',  \
    vfwprintf, <NONE>,  'vfwprintf',  \
    vprintf, <NONE>,  'vprintf',  \
    vsprintf, <NONE>,  'vsprintf',  \
    vswprintf, <NONE>,  'vswprintf',  \
    vwprintf, <NONE>,  'vwprintf',  \
    wcscat, <NONE>,  'wcscat',  \
    wcschr, <NONE>,  'wcschr',  \
    wcscmp, <NONE>,  'wcscmp',  \
    wcscoll, <NONE>,  'wcscoll',  \
    wcscpy, <NONE>,  'wcscpy',  \
    wcscspn, <NONE>,  'wcscspn',  \
    wcsftime, <NONE>,  'wcsftime',  \
    wcslen, <NONE>,  'wcslen',  \
    wcsncat, <NONE>,  'wcsncat',  \
    wcsncmp, <NONE>,  'wcsncmp',  \
    wcsncpy, <NONE>,  'wcsncpy',  \
    wcspbrk, <NONE>,  'wcspbrk',  \
    wcsrchr, <NONE>,  'wcsrchr',  \
    wcsspn, <NONE>,  'wcsspn',  \
    wcsstr, <NONE>,  'wcsstr',  \
    wcstod, <NONE>,  'wcstod',  \
    wcstok, <NONE>,  'wcstok',  \
    wcstol, <NONE>,  'wcstol',  \
    wcstombs, <NONE>,  'wcstombs',  \
    wcstoul, <NONE>,  'wcstoul',  \
    wcsxfrm, <NONE>,  'wcsxfrm',  \
    wctomb, <NONE>,  'wctomb',  \
    wprintf, <NONE>,  'wprintf',  \
    wscanf, <NONE>,  'wscanf'

Added freshlib/imports/Win32/gdi32.inc.



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: gdi32.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

import_proto gdi32,  \
    AbortDoc, <.hdc>,  'AbortDoc',  \
    AbortPath, <.hdc>,  'AbortPath',  \
    AddFontMemResourceEx, <.pvoid, .dword, .pDword>,  'AddFontMemResourceEx',  \
    AddFontResourceA, <.lpFileName>,  'AddFontResourceA',  \
    AddFontResourceExA, <.lpcstr, .flags, .reserved>,  'AddFontResourceExA',  \
    AddFontResourceExW, <.lpcstr, .flags, .reserved>,  'AddFontResourceExW',  \
    AddFontResourceTracking, <NONE>,  'AddFontResourceTracking',  \
    AddFontResourceW, <.lpFileName>,  'AddFontResourceW',  \
    AngleArc, <.hdc, .x, .y, .dwRadius, .eStartAngle, .eSweepAngle>,  'AngleArc',  \
    AnimatePalette, <.hPalette, .wStartIndex, .wNumEntries, .lpPaletteColors>,  'AnimatePalette',  \
    AnyLinkedFonts, <NONE>,  'AnyLinkedFonts',  \
    Arc, <.hdc, .X1, .Y1, .X2, .Y2, .X3, .Y3, .X4, .Y4>,  'Arc',  \
    ArcTo, <.hdc, .X1, .Y1, .X2, .Y2, .X3, .Y3, .X4, .Y4>,  'ArcTo',  \
    BRUSHOBJ_hGetColorTransform, <NONE>,  'BRUSHOBJ_hGetColorTransform',  \
    BRUSHOBJ_pvAllocRbrush, <NONE>,  'BRUSHOBJ_pvAllocRbrush',  \
    BRUSHOBJ_pvGetRbrush, <NONE>,  'BRUSHOBJ_pvGetRbrush',  \
    BRUSHOBJ_ulGetBrushColor, <NONE>,  'BRUSHOBJ_ulGetBrushColor',  \
    BeginPath, <.hdc>,  'BeginPath',  \
    BitBlt, <.hDestDC, .x, .y, .nWidth, .nHeight, .hSrcDC, .xSrc, .ySrc, .dwRop>,  'BitBlt',  \
    CLIPOBJ_bEnum, <NONE>,  'CLIPOBJ_bEnum',  \
    CLIPOBJ_cEnumStart, <NONE>,  'CLIPOBJ_cEnumStart',  \
    CLIPOBJ_ppoGetPath, <NONE>,  'CLIPOBJ_ppoGetPath',  \
    CancelDC, <.hdc>,  'CancelDC',  \
    CheckColorsInGamut, <.hdc, .lpv, .lpv2, .dw>,  'CheckColorsInGamut',  \
    ChoosePixelFormat, <.hDC, .pPixelFormatDescriptor>,  'ChoosePixelFormat',  \
    Chord, <.hdc, .X1, .Y1, .X2, .Y2, .X3, .Y3, .X4, .Y4>,  'Chord',  \
    ClearBitmapAttributes, <NONE>,  'ClearBitmapAttributes',  \
    ClearBrushAttributes, <NONE>,  'ClearBrushAttributes',  \
    CloseEnhMetaFile, <.hdc>,  'CloseEnhMetaFile',  \
    CloseFigure, <.hdc>,  'CloseFigure',  \
    CloseMetaFile, <.hMF>,  'CloseMetaFile',  \
    ColorCorrectPalette, <.hdc, .hpalette, .dword>,  'ColorCorrectPalette',  \
    ColorMatchToTarget, <.hdc, .hdc2, .dw>,  'ColorMatchToTarget',  \
    CombineRgn, <.hDestRgn, .hSrcRgn1, .hSrcRgn2, .nCombineMode>,  'CombineRgn',  \
    CombineTransform, <.lpxformResult, .lpxform1, .lpxform2>,  'CombineTransform',  \
    CopyEnhMetaFileA, <.hemfSrc, .lpszFile>,  'CopyEnhMetaFileA',  \
    CopyEnhMetaFileW, <.hemfSrc, .lpszFile>,  'CopyEnhMetaFileW',  \
    CopyMetaFileA, <.hMF, .lpFileName>,  'CopyMetaFileA',  \
    CopyMetaFileW, <.hMF, .lpFileName>,  'CopyMetaFileW',  \
    CreateBitmap, <.nWidth, .nHeight, .nPlanes, .nBitCount, .lpBits>,  'CreateBitmap',  \
    CreateBitmapIndirect, <.lpBitmap>,  'CreateBitmapIndirect',  \
    CreateBrushIndirect, <.lpLogBrush>,  'CreateBrushIndirect',  \
    CreateColorSpaceA, <.lplogcolorspace>,  'CreateColorSpaceA',  \
    CreateColorSpaceW, <.lplogcolorspace>,  'CreateColorSpaceW',  \
    CreateCompatibleBitmap, <.hdc, .nWidth, .nHeight>,  'CreateCompatibleBitmap',  \
    CreateCompatibleDC, <.hdc>,  'CreateCompatibleDC',  \
    CreateDCA, <.lpDriverName, .lpDeviceName, .lpOutput, .lpInitData>,  'CreateDCA',  \
    CreateDCW, <.lpDriverName, .lpDeviceName, .lpOutput, .lpInitData>,  'CreateDCW',  \
    CreateDIBPatternBrush, <.hPackedDIB, .wUsage>,  'CreateDIBPatternBrush',  \
    CreateDIBPatternBrushPt, <.lpPackedDIB, .iUsage>,  'CreateDIBPatternBrushPt',  \
    CreateDIBSection, <.hDC, .pBitmapInfo, .un, .lplpVoid, .handle, .dw>,  'CreateDIBSection',  \
    CreateDIBitmap, <.hdc, .lpInfoHeader, .dwUsage, .lpInitBits, .lpInitInfo, .wUsage>,  'CreateDIBitmap',  \
    CreateDiscardableBitmap, <.hdc, .nWidth, .nHeight>,  'CreateDiscardableBitmap',  \
    CreateEllipticRgn, <.X1, .Y1, .X2, .Y2>,  'CreateEllipticRgn',  \
    CreateEllipticRgnIndirect, <.lpRect>,  'CreateEllipticRgnIndirect',  \
    CreateEnhMetaFileA, <.hdcRef, .lpFileName, .lpRect, .lpDescription>,  'CreateEnhMetaFileA',  \
    CreateEnhMetaFileW, <.hdcRef, .lpFileName, .lpRect, .lpDescription>,  'CreateEnhMetaFileW',  \
    CreateFontA, <.iHeight, .iWidth, .iEscapement, .iOriantation, .iWeight, .fItalic, .fUnderline, .fStrikeOut, .fCharSet, .fOutputPrecision, .fClipPrecision, .fQuality, .fPitchAndFamily, .pFace>,  'CreateFontA',  \
    CreateFontIndirectA, <.lpLogFont>,  'CreateFontIndirectA',  \
    CreateFontIndirectExA, <.ENUMLOGFONTEXDVA>,  'CreateFontIndirectExA',  \
    CreateFontIndirectExW, <.ENUMLOGFONTEXDVA>,  'CreateFontIndirectExW',  \
    CreateFontIndirectW, <.lpLogFont>,  'CreateFontIndirectW',  \
    CreateFontW, <.iHeight, .iWidth, .iEscapement, .iOriantation, .iWeight, .fItalic, .fUnderline, .fStrikeOut, .fCharSet, .fOutputPrecision, .fClipPrecision, .fQuality, .fPitchAndFamily, .pFace>,  'CreateFontW',  \
    CreateHalftonePalette, <.hdc>,  'CreateHalftonePalette',  \
    CreateHatchBrush, <.nIndex, .crColor>,  'CreateHatchBrush',  \
    CreateICA, <.lpDriverName, .lpDeviceName, .lpOutput, .lpInitData>,  'CreateICA',  \
    CreateICW, <.lpDriverName, .lpDeviceName, .lpOutput, .lpInitData>,  'CreateICW',  \
    CreateMetaFileA, <.lpString>,  'CreateMetaFileA',  \
    CreateMetaFileW, <.lpString>,  'CreateMetaFileW',  \
    CreatePalette, <.lpLogPalette>,  'CreatePalette',  \
    CreatePatternBrush, <.hBitmap>,  'CreatePatternBrush',  \
    CreatePen, <.nPenStyle, .nWidth, .crColor>,  'CreatePen',  \
    CreatePenIndirect, <.lpLogPen>,  'CreatePenIndirect',  \
    CreatePolyPolygonRgn, <.lpPoint, .lpPolyCounts, .nCount, .nPolyFillMode>,  'CreatePolyPolygonRgn',  \
    CreatePolygonRgn, <.lpPoint, .nCount, .nPolyFillMode>,  'CreatePolygonRgn',  \
    CreateRectRgn, <.X1, .Y1, .X2, .Y2>,  'CreateRectRgn',  \
    CreateRectRgnIndirect, <.lpRect>,  'CreateRectRgnIndirect',  \
    CreateRoundRectRgn, <.X1, .Y1, .X2, .Y2, .X3, .Y3>,  'CreateRoundRectRgn',  \
    CreateScalableFontResourceA, <.fHidden, .lpszResourceFile, .lpszFontFile, .lpszCurrentPath>,  'CreateScalableFontResourceA',  \
    CreateScalableFontResourceW, <.fHidden, .lpszResourceFile, .lpszFontFile, .lpszCurrentPath>,  'CreateScalableFontResourceW',  \
    CreateSolidBrush, <.crColor>,  'CreateSolidBrush',  \
    DPtoLP, <.hdc, .lpPoint, .nCount>,  'DPtoLP',  \
    DdEntry0, <NONE>,  'DdEntry0',  \
    DdEntry1, <NONE>,  'DdEntry1',  \
    DdEntry10, <NONE>,  'DdEntry10',  \
    DdEntry11, <NONE>,  'DdEntry11',  \
    DdEntry12, <NONE>,  'DdEntry12',  \
    DdEntry13, <NONE>,  'DdEntry13',  \
    DdEntry14, <NONE>,  'DdEntry14',  \
    DdEntry15, <NONE>,  'DdEntry15',  \
    DdEntry16, <NONE>,  'DdEntry16',  \
    DdEntry17, <NONE>,  'DdEntry17',  \
    DdEntry18, <NONE>,  'DdEntry18',  \
    DdEntry19, <NONE>,  'DdEntry19',  \
    DdEntry2, <NONE>,  'DdEntry2',  \
    DdEntry20, <NONE>,  'DdEntry20',  \
    DdEntry21, <NONE>,  'DdEntry21',  \
    DdEntry22, <NONE>,  'DdEntry22',  \
    DdEntry23, <NONE>,  'DdEntry23',  \
    DdEntry24, <NONE>,  'DdEntry24',  \
    DdEntry25, <NONE>,  'DdEntry25',  \
    DdEntry26, <NONE>,  'DdEntry26',  \
    DdEntry27, <NONE>,  'DdEntry27',  \
    DdEntry28, <NONE>,  'DdEntry28',  \
    DdEntry29, <NONE>,  'DdEntry29',  \
    DdEntry3, <NONE>,  'DdEntry3',  \
    DdEntry30, <NONE>,  'DdEntry30',  \
    DdEntry31, <NONE>,  'DdEntry31',  \
    DdEntry32, <NONE>,  'DdEntry32',  \
    DdEntry33, <NONE>,  'DdEntry33',  \
    DdEntry34, <NONE>,  'DdEntry34',  \
    DdEntry35, <NONE>,  'DdEntry35',  \
    DdEntry36, <NONE>,  'DdEntry36',  \
    DdEntry37, <NONE>,  'DdEntry37',  \
    DdEntry38, <NONE>,  'DdEntry38',  \
    DdEntry39, <NONE>,  'DdEntry39',  \
    DdEntry4, <NONE>,  'DdEntry4',  \
    DdEntry40, <NONE>,  'DdEntry40',  \
    DdEntry41, <NONE>,  'DdEntry41',  \
    DdEntry42, <NONE>,  'DdEntry42',  \
    DdEntry43, <NONE>,  'DdEntry43',  \
    DdEntry44, <NONE>,  'DdEntry44',  \
    DdEntry45, <NONE>,  'DdEntry45',  \
    DdEntry46, <NONE>,  'DdEntry46',  \
    DdEntry47, <NONE>,  'DdEntry47',  \
    DdEntry48, <NONE>,  'DdEntry48',  \
    DdEntry49, <NONE>,  'DdEntry49',  \
    DdEntry5, <NONE>,  'DdEntry5',  \
    DdEntry50, <NONE>,  'DdEntry50',  \
    DdEntry51, <NONE>,  'DdEntry51',  \
    DdEntry52, <NONE>,  'DdEntry52',  \
    DdEntry53, <NONE>,  'DdEntry53',  \
    DdEntry54, <NONE>,  'DdEntry54',  \
    DdEntry55, <NONE>,  'DdEntry55',  \
    DdEntry56, <NONE>,  'DdEntry56',  \
    DdEntry6, <NONE>,  'DdEntry6',  \
    DdEntry7, <NONE>,  'DdEntry7',  \
    DdEntry8, <NONE>,  'DdEntry8',  \
    DdEntry9, <NONE>,  'DdEntry9',  \
    DeleteColorSpace, <.hcolorspace>,  'DeleteColorSpace',  \
    DeleteDC, <.hdc>,  'DeleteDC',  \
    DeleteEnhMetaFile, <.hemf>,  'DeleteEnhMetaFile',  \
    DeleteMetaFile, <.hMF>,  'DeleteMetaFile',  \
    DeleteObject, <.hObject>,  'DeleteObject',  \
    DescribePixelFormat, <.hDC, .n, .un, .lpPixelFormatDescriptor>,  'DescribePixelFormat',  \
    DeviceCapabilitiesExA, <NONE>,  'DeviceCapabilitiesExA',  \
    DeviceCapabilitiesExW, <NONE>,  'DeviceCapabilitiesExW',  \
    DrawEscape, <.hdc, .nEscape, .cbInput, .lpszInData>,  'DrawEscape',  \
    Ellipse, <.hdc, .X1, .Y1, .X2, .Y2>,  'Ellipse',  \
    EnableEUDC, <NONE>,  'EnableEUDC',  \
    EndDoc, <.hDC>,  'EndDoc',  \
    EndFormPage, <.hdc>,  'EndFormPage',  \
    EndPage, <.hdc>,  'EndPage',  \
    EndPath, <.hdc>,  'EndPath',  \
    EngAcquireSemaphore, <NONE>,  'EngAcquireSemaphore',  \
    EngAlphaBlend, <NONE>,  'EngAlphaBlend',  \
    EngAssociateSurface, <NONE>,  'EngAssociateSurface',  \
    EngBitBlt, <NONE>,  'EngBitBlt',  \
    EngCheckAbort, <NONE>,  'EngCheckAbort',  \
    EngComputeGlyphSet, <NONE>,  'EngComputeGlyphSet',  \
    EngCopyBits, <NONE>,  'EngCopyBits',  \
    EngCreateBitmap, <NONE>,  'EngCreateBitmap',  \
    EngCreateClip, <NONE>,  'EngCreateClip',  \
    EngCreateDeviceBitmap, <NONE>,  'EngCreateDeviceBitmap',  \
    EngCreateDeviceSurface, <NONE>,  'EngCreateDeviceSurface',  \
    EngCreatePalette, <NONE>,  'EngCreatePalette',  \
    EngCreateSemaphore, <NONE>,  'EngCreateSemaphore',  \
    EngDeleteClip, <NONE>,  'EngDeleteClip',  \
    EngDeletePalette, <NONE>,  'EngDeletePalette',  \
    EngDeletePath, <NONE>,  'EngDeletePath',  \
    EngDeleteSemaphore, <NONE>,  'EngDeleteSemaphore',  \
    EngDeleteSurface, <NONE>,  'EngDeleteSurface',  \
    EngEraseSurface, <NONE>,  'EngEraseSurface',  \
    EngFillPath, <NONE>,  'EngFillPath',  \
    EngFindResource, <NONE>,  'EngFindResource',  \
    EngFreeModule, <NONE>,  'EngFreeModule',  \
    EngGetCurrentCodePage, <NONE>,  'EngGetCurrentCodePage',  \
    EngGetDriverName, <NONE>,  'EngGetDriverName',  \
    EngGetPrinterDataFileName, <NONE>,  'EngGetPrinterDataFileName',  \
    EngGradientFill, <NONE>,  'EngGradientFill',  \
    EngLineTo, <NONE>,  'EngLineTo',  \
    EngLoadModule, <NONE>,  'EngLoadModule',  \
    EngLockSurface, <NONE>,  'EngLockSurface',  \
    EngMarkBandingSurface, <NONE>,  'EngMarkBandingSurface',  \
    EngMultiByteToUnicodeN, <NONE>,  'EngMultiByteToUnicodeN',  \
    EngMultiByteToWideChar, <NONE>,  'EngMultiByteToWideChar',  \
    EngPaint, <NONE>,  'EngPaint',  \
    EngPlgBlt, <NONE>,  'EngPlgBlt',  \
    EngQueryEMFInfo, <NONE>,  'EngQueryEMFInfo',  \
    EngQueryLocalTime, <NONE>,  'EngQueryLocalTime',  \
    EngReleaseSemaphore, <NONE>,  'EngReleaseSemaphore',  \
    EngStretchBlt, <NONE>,  'EngStretchBlt',  \
    EngStretchBltROP, <NONE>,  'EngStretchBltROP',  \
    EngStrokeAndFillPath, <NONE>,  'EngStrokeAndFillPath',  \
    EngStrokePath, <NONE>,  'EngStrokePath',  \
    EngTextOut, <NONE>,  'EngTextOut',  \
    EngTransparentBlt, <NONE>,  'EngTransparentBlt',  \
    EngUnicodeToMultiByteN, <NONE>,  'EngUnicodeToMultiByteN',  \
    EngUnlockSurface, <NONE>,  'EngUnlockSurface',  \
    EngWideCharToMultiByte, <NONE>,  'EngWideCharToMultiByte',  \
    EnumEnhMetaFile, <.hdc, .hemf, .lpEnhMetaFunc, .lpData, .lpRect>,  'EnumEnhMetaFile',  \
    EnumFontFamiliesA, <.hdc, .lpszFamily, .lpEnumFontFamProc, .lParam>,  'EnumFontFamiliesA',  \
    EnumFontFamiliesExA, <.hdc, .lpLogFont, .lpEnumFontProc, .lParam, .dw>,  'EnumFontFamiliesExA',  \
    EnumFontFamiliesExW, <.hdc, .lpLogFont, .lpEnumFontProc, .lParam, .dw>,  'EnumFontFamiliesExW',  \
    EnumFontFamiliesW, <.hdc, .lpszFamily, .lpEnumFontFamProc, .lParam>,  'EnumFontFamiliesW',  \
    EnumFontsA, <.hDC, .lpsz, .lpFontEnumProc, .lParam>,  'EnumFontsA',  \
    EnumFontsW, <.hDC, .lpsz, .lpFontEnumProc, .lParam>,  'EnumFontsW',  \
    EnumICMProfilesA, <.hdc, .icmEnumProc, .lParam>,  'EnumICMProfilesA',  \
    EnumICMProfilesW, <.hdc, .icmEnumProc, .lParam>,  'EnumICMProfilesW',  \
    EnumMetaFile, <.hDC, .hMetafile, .lpMFEnumProc, .lParam>,  'EnumMetaFile',  \
    EnumObjects, <.hDC, .n, .lpGOBJEnumProc, .lpVoid>,  'EnumObjects',  \
    EqualRgn, <.hSrcRgn1, .hSrcRgn2>,  'EqualRgn',  \
    Escape, <.hdc, .nEscape, .nCount, .lpInData, .lpOutData>,  'Escape',  \
    EudcLoadLinkW, <NONE>,  'EudcLoadLinkW',  \
    EudcUnloadLinkW, <NONE>,  'EudcUnloadLinkW',  \
    ExcludeClipRect, <.hdc, .X1, .Y1, .X2, .Y2>,  'ExcludeClipRect',  \
    ExtCreatePen, <.dwPenStyle, .dwWidth, .lplb, .dwStyleCount, .lpStyle>,  'ExtCreatePen',  \
    ExtCreateRegion, <.lpXform, .nCount, .lpRgnData>,  'ExtCreateRegion',  \
    ExtEscape, <.hdc, .nEscape, .cbInput, .lpszInData, .cbOutput, .lpszOutData>,  'ExtEscape',  \
    ExtFloodFill, <.hdc, .x, .y, .crColor, .wFillType>,  'ExtFloodFill',  \
    ExtSelectClipRgn, <.hdc, .hRgn, .fnMode>,  'ExtSelectClipRgn',  \
    ExtTextOutA, <.hdc, .x, .y, .wOptions, .lpRect, .lpString, .nCount, .lpDx>,  'ExtTextOutA',  \
    ExtTextOutW, <.hdc, .x, .y, .wOptions, .lpRect, .lpString, .nCount, .lpDx>,  'ExtTextOutW',  \
    FONTOBJ_cGetAllGlyphHandles, <NONE>,  'FONTOBJ_cGetAllGlyphHandles',  \
    FONTOBJ_cGetGlyphs, <NONE>,  'FONTOBJ_cGetGlyphs',  \
    FONTOBJ_pQueryGlyphAttrs, <NONE>,  'FONTOBJ_pQueryGlyphAttrs',  \
    FONTOBJ_pfdg, <NONE>,  'FONTOBJ_pfdg',  \
    FONTOBJ_pifi, <NONE>,  'FONTOBJ_pifi',  \
    FONTOBJ_pvTrueTypeFontFile, <NONE>,  'FONTOBJ_pvTrueTypeFontFile',  \
    FONTOBJ_pxoGetXform, <NONE>,  'FONTOBJ_pxoGetXform',  \
    FONTOBJ_vGetInfo, <NONE>,  'FONTOBJ_vGetInfo',  \
    FillPath, <.hdc>,  'FillPath',  \
    FillRgn, <.hdc, .hRgn, .hBrush>,  'FillRgn',  \
    FixBrushOrgEx, <.hDC, .n1, .n2, .lpPoint>,  'FixBrushOrgEx',  \
    FlattenPath, <.hdc>,  'FlattenPath',  \
    FloodFill, <.hdc, .x, .y, .crColor>,  'FloodFill',  \
    FontIsLinked, <NONE>,  'FontIsLinked',  \
    FrameRgn, <.hdc, .hRgn, .hBrush, .nWidth, .nHeight>,  'FrameRgn',  \
    GdiAddFontResourceW, <NONE>,  'GdiAddFontResourceW',  \
    GdiAddGlsBounds, <NONE>,  'GdiAddGlsBounds',  \
    GdiAddGlsRecord, <NONE>,  'GdiAddGlsRecord',  \
    GdiAlphaBlend, <NONE>,  'GdiAlphaBlend',  \
    GdiArtificialDecrementDriver, <NONE>,  'GdiArtificialDecrementDriver',  \
    GdiCleanCacheDC, <NONE>,  'GdiCleanCacheDC',  \
    GdiComment, <.hdc, .cbSize, .lpData>,  'GdiComment',  \
    GdiConsoleTextOut, <NONE>,  'GdiConsoleTextOut',  \
    GdiConvertAndCheckDC, <NONE>,  'GdiConvertAndCheckDC',  \
    GdiConvertBitmap, <NONE>,  'GdiConvertBitmap',  \
    GdiConvertBitmapV5, <NONE>,  'GdiConvertBitmapV5',  \
    GdiConvertBrush, <NONE>,  'GdiConvertBrush',  \
    GdiConvertDC, <NONE>,  'GdiConvertDC',  \
    GdiConvertEnhMetaFile, <NONE>,  'GdiConvertEnhMetaFile',  \
    GdiConvertFont, <NONE>,  'GdiConvertFont',  \
    GdiConvertMetaFilePict, <NONE>,  'GdiConvertMetaFilePict',  \
    GdiConvertPalette, <NONE>,  'GdiConvertPalette',  \
    GdiConvertRegion, <NONE>,  'GdiConvertRegion',  \
    GdiConvertToDevmodeW, <NONE>,  'GdiConvertToDevmodeW',  \
    GdiCreateLocalEnhMetaFile, <NONE>,  'GdiCreateLocalEnhMetaFile',  \
    GdiCreateLocalMetaFilePict, <NONE>,  'GdiCreateLocalMetaFilePict',  \
    GdiDeleteLocalDC, <NONE>,  'GdiDeleteLocalDC',  \
    GdiDeleteSpoolFileHandle, <NONE>,  'GdiDeleteSpoolFileHandle',  \
    GdiDescribePixelFormat, <NONE>,  'GdiDescribePixelFormat',  \
    GdiDllInitialize, <NONE>,  'GdiDllInitialize',  \
    GdiDrawStream, <NONE>,  'GdiDrawStream',  \
    GdiEndDocEMF, <NONE>,  'GdiEndDocEMF',  \
    GdiEndPageEMF, <NONE>,  'GdiEndPageEMF',  \
    GdiEntry1, <NONE>,  'GdiEntry1',  \
    GdiEntry10, <NONE>,  'GdiEntry10',  \
    GdiEntry11, <NONE>,  'GdiEntry11',  \
    GdiEntry12, <NONE>,  'GdiEntry12',  \
    GdiEntry13, <NONE>,  'GdiEntry13',  \
    GdiEntry14, <NONE>,  'GdiEntry14',  \
    GdiEntry15, <NONE>,  'GdiEntry15',  \
    GdiEntry16, <NONE>,  'GdiEntry16',  \
    GdiEntry2, <NONE>,  'GdiEntry2',  \
    GdiEntry3, <NONE>,  'GdiEntry3',  \
    GdiEntry4, <NONE>,  'GdiEntry4',  \
    GdiEntry5, <NONE>,  'GdiEntry5',  \
    GdiEntry6, <NONE>,  'GdiEntry6',  \
    GdiEntry7, <NONE>,  'GdiEntry7',  \
    GdiEntry8, <NONE>,  'GdiEntry8',  \
    GdiEntry9, <NONE>,  'GdiEntry9',  \
    GdiFixUpHandle, <NONE>,  'GdiFixUpHandle',  \
    GdiFlush, <VOID>,  'GdiFlush',  \
    GdiFullscreenControl, <NONE>,  'GdiFullscreenControl',  \
    GdiGetBatchLimit, <VOID>,  'GdiGetBatchLimit',  \
    GdiGetBitmapBitsSize, <NONE>,  'GdiGetBitmapBitsSize',  \
    GdiGetCharDimensions, <NONE>,  'GdiGetCharDimensions',  \
    GdiGetCodePage, <NONE>,  'GdiGetCodePage',  \
    GdiGetDC, <NONE>,  'GdiGetDC',  \
    GdiGetDevmodeForPage, <NONE>,  'GdiGetDevmodeForPage',  \
    GdiGetLocalBrush, <NONE>,  'GdiGetLocalBrush',  \
    GdiGetLocalDC, <NONE>,  'GdiGetLocalDC',  \
    GdiGetLocalFont, <NONE>,  'GdiGetLocalFont',  \
    GdiGetPageCount, <NONE>,  'GdiGetPageCount',  \
    GdiGetPageHandle, <NONE>,  'GdiGetPageHandle',  \
    GdiGetSpoolFileHandle, <NONE>,  'GdiGetSpoolFileHandle',  \
    GdiGetSpoolMessage, <NONE>,  'GdiGetSpoolMessage',  \
    GdiGradientFill, <NONE>,  'GdiGradientFill',  \
    GdiInitSpool, <NONE>,  'GdiInitSpool',  \
    GdiInitializeLanguagePack, <NONE>,  'GdiInitializeLanguagePack',  \
    GdiIsMetaFileDC, <NONE>,  'GdiIsMetaFileDC',  \
    GdiIsMetaPrintDC, <NONE>,  'GdiIsMetaPrintDC',  \
    GdiIsPlayMetafileDC, <NONE>,  'GdiIsPlayMetafileDC',  \
    GdiPlayDCScript, <NONE>,  'GdiPlayDCScript',  \
    GdiPlayEMF, <NONE>,  'GdiPlayEMF',  \
    GdiPlayJournal, <NONE>,  'GdiPlayJournal',  \
    GdiPlayPageEMF, <NONE>,  'GdiPlayPageEMF',  \
    GdiPlayPrivatePageEMF, <NONE>,  'GdiPlayPrivatePageEMF',  \
    GdiPlayScript, <NONE>,  'GdiPlayScript',  \
    GdiPrinterThunk, <NONE>,  'GdiPrinterThunk',  \
    GdiProcessSetup, <NONE>,  'GdiProcessSetup',  \
    GdiQueryFonts, <NONE>,  'GdiQueryFonts',  \
    GdiQueryTable, <NONE>,  'GdiQueryTable',  \
    GdiRealizationInfo, <NONE>,  'GdiRealizationInfo',  \
    GdiReleaseDC, <NONE>,  'GdiReleaseDC',  \
    GdiReleaseLocalDC, <NONE>,  'GdiReleaseLocalDC',  \
    GdiResetDCEMF, <NONE>,  'GdiResetDCEMF',  \
    GdiSetAttrs, <NONE>,  'GdiSetAttrs',  \
    GdiSetBatchLimit, <.dwLimit>,  'GdiSetBatchLimit',  \
    GdiSetLastError, <NONE>,  'GdiSetLastError',  \
    GdiSetPixelFormat, <NONE>,  'GdiSetPixelFormat',  \
    GdiSetServerAttr, <NONE>,  'GdiSetServerAttr',  \
    GdiStartDocEMF, <NONE>,  'GdiStartDocEMF',  \
    GdiStartPageEMF, <NONE>,  'GdiStartPageEMF',  \
    GdiSwapBuffers, <NONE>,  'GdiSwapBuffers',  \
    GdiTransparentBlt, <NONE>,  'GdiTransparentBlt',  \
    GdiValidateHandle, <NONE>,  'GdiValidateHandle',  \
    GetArcDirection, <.hdc>,  'GetArcDirection',  \
    GetAspectRatioFilterEx, <.hdc, .lpAspectRatio>,  'GetAspectRatioFilterEx',  \
    GetBitmapAttributes, <NONE>,  'GetBitmapAttributes',  \
    GetBitmapBits, <.hBitmap, .dwCount, .lpBits>,  'GetBitmapBits',  \
    GetBitmapDimensionEx, <.hBitmap, .lpDimension>,  'GetBitmapDimensionEx',  \
    GetBkColor, <.hdc>,  'GetBkColor',  \
    GetBkMode, <.hdc>,  'GetBkMode',  \
    GetBoundsRect, <.hdc, .lprcBounds, .flags>,  'GetBoundsRect',  \
    GetBrushAttributes, <NONE>,  'GetBrushAttributes',  \
    GetBrushOrgEx, <.hDC, .lpPoint>,  'GetBrushOrgEx',  \
    GetCharABCWidthsA, <.hdc, .uFirstChar, .uLastChar, .lpabc>,  'GetCharABCWidthsA',  \
    GetCharABCWidthsFloatA, <.hdc, .iFirstChar, .iLastChar, .lpABCF>,  'GetCharABCWidthsFloatA',  \
    GetCharABCWidthsFloatW, <.hdc, .iFirstChar, .iLastChar, .lpABCF>,  'GetCharABCWidthsFloatW',  \
    GetCharABCWidthsI, <.hdc, .uint, .lpword, .lpabc>,  'GetCharABCWidthsI',  \
    GetCharABCWidthsW, <.hdc, .uFirstChar, .uLastChar, .lpabc>,  'GetCharABCWidthsW',  \
    GetCharWidth32A, <.hdc, .iFirstChar, .iLastChar, .lpBuffer>,  'GetCharWidth32A',  \
    GetCharWidth32W, <.hdc, .iFirstChar, .iLastChar, .lpBuffer>,  'GetCharWidth32W',  \
    GetCharWidthA, <.hdc, .wFirstChar, .wLastChar, .lpBuffer>,  'GetCharWidthA',  \
    GetCharWidthFloatA, <.hdc, .iFirstChar, .iLastChar, .pxBuffer>,  'GetCharWidthFloatA',  \
    GetCharWidthFloatW, <.hdc, .iFirstChar, .iLastChar, .pxBuffer>,  'GetCharWidthFloatW',  \
    GetCharWidthI, <.hdc, .uint, .lpword, .lpint>,  'GetCharWidthI',  \
    GetCharWidthInfo, <NONE>,  'GetCharWidthInfo',  \
    GetCharWidthW, <.hdc, .wFirstChar, .wLastChar, .lpBuffer>,  'GetCharWidthW',  \
    GetCharacterPlacementA, <.hdc, .lpsz, .n1, .n2, .lpGcpResults, .dw>,  'GetCharacterPlacementA',  \
    GetCharacterPlacementW, <.hdc, .lpsz, .n1, .n2, .lpGcpResults, .dw>,  'GetCharacterPlacementW',  \
    GetClipBox, <.hdc, .lpRect>,  'GetClipBox',  \
    GetClipRgn, <.hdc, .hRgn>,  'GetClipRgn',  \
    GetColorAdjustment, <.hdc, .lpca>,  'GetColorAdjustment',  \
    GetColorSpace, <.hdc>,  'GetColorSpace',  \
    GetCurrentObject, <.hdc, .uObjectType>,  'GetCurrentObject',  \
    GetCurrentPositionEx, <.hdc, .lpPoint>,  'GetCurrentPositionEx',  \
    GetDCBrushColor, <.hdc>,  'GetDCBrushColor',  \
    GetDCOrgEx, <.hdc, .lpPoint>,  'GetDCOrgEx',  \
    GetDCPenColor, <.hdc>,  'GetDCPenColor',  \
    GetDIBColorTable, <.hDC, .un1, .un2, .pRGBQuad>,  'GetDIBColorTable',  \
    GetDIBits, <.aHDC, .hBitmap, .nStartScan, .nNumScans, .lpBits, .lpBI, .wUsage>,  'GetDIBits',  \
    GetDeviceCaps, <.hdc, .nIndex>,  'GetDeviceCaps',  \
    GetDeviceGammaRamp, <.hdc, .lpv>,  'GetDeviceGammaRamp',  \
    GetETM, <NONE>,  'GetETM',  \
    GetEUDCTimeStamp, <NONE>,  'GetEUDCTimeStamp',  \
    GetEUDCTimeStampExW, <NONE>,  'GetEUDCTimeStampExW',  \
    GetEnhMetaFileA, <.lpszMetaFile>,  'GetEnhMetaFileA',  \
    GetEnhMetaFileBits, <.hemf, .cbBuffer, .lpbBuffer>,  'GetEnhMetaFileBits',  \
    GetEnhMetaFileDescriptionA, <.hemf, .cchBuffer, .lpszDescription>,  'GetEnhMetaFileDescriptionA',  \
    GetEnhMetaFileDescriptionW, <.hemf, .cchBuffer, .lpszDescription>,  'GetEnhMetaFileDescriptionW',  \
    GetEnhMetaFileHeader, <.hemf, .cbBuffer, .lpemh>,  'GetEnhMetaFileHeader',  \
    GetEnhMetaFilePaletteEntries, <.hemf, .cEntries, .lppe>,  'GetEnhMetaFilePaletteEntries',  \
    GetEnhMetaFilePixelFormat, <.henhmetafile, .uint, .PIXELFORMATDESCRIPTOR>,  'GetEnhMetaFilePixelFormat',  \
    GetEnhMetaFileW, <.lpszMetaFile>,  'GetEnhMetaFileW',  \
    GetFontAssocStatus, <NONE>,  'GetFontAssocStatus',  \
    GetFontData, <.hdc, .dwTable, .dwOffset, .lpvBuffer, .cbData>,  'GetFontData',  \
    GetFontLanguageInfo, <.hdc>,  'GetFontLanguageInfo',  \
    GetFontResourceInfoW, <NONE>,  'GetFontResourceInfoW',  \
    GetFontUnicodeRanges, <.hdc, .LPGLYPHSET>,  'GetFontUnicodeRanges',  \
    GetGlyphIndicesA, <.hdc, .lpcstr, .ByValt, .lpword, .dword>,  'GetGlyphIndicesA',  \
    GetGlyphIndicesW, <.hdc, .lpcstr, .ByValt, .lpword, .dword>,  'GetGlyphIndicesW',  \
    GetGlyphOutline, <.hdc, .uChar, .fuFormat, .lpgm, .cbBuffer, .lpBuffer, .lpmat2>,  'GetGlyphOutline',  \
    GetGlyphOutlineA, <.hdc, .uChar, .fuFormat, .lpgm, .cbBuffer, .lpBuffer, .lpmat2>,  'GetGlyphOutlineA',  \
    GetGlyphOutlineW, <.hdc, .uChar, .fuFormat, .lpgm, .cbBuffer, .lpBuffer, .lpmat2>,  'GetGlyphOutlineW',  \
    GetGlyphOutlineWow, <NONE>,  'GetGlyphOutlineWow',  \
    GetGraphicsMode, <.hdc>,  'GetGraphicsMode',  \
    GetHFONT, <NONE>,  'GetHFONT',  \
    GetICMProfileA, <.hdc, .dw, .lpStr>,  'GetICMProfileA',  \
    GetICMProfileW, <.hdc, .dw, .lpStr>,  'GetICMProfileW',  \
    GetKerningPairs, <.hdc, .cPairs, .lpkrnpair>,  'GetKerningPairs',  \
    GetKerningPairsA, <.hdc, .cPairs, .lpkrnpair>,  'GetKerningPairsA',  \
    GetKerningPairsW, <.hdc, .cPairs, .lpkrnpair>,  'GetKerningPairsW',  \
    GetLayout, <.hdc>,  'GetLayout',  \
    GetLogColorSpaceA, <.hcolorspace, .lplogcolorspace, .dw>,  'GetLogColorSpaceA',  \
    GetLogColorSpaceW, <.hcolorspace, .lplogcolorspace, .dw>,  'GetLogColorSpaceW',  \
    GetMapMode, <.hdc>,  'GetMapMode',  \
    GetMetaFileA, <.lpFileName>,  'GetMetaFileA',  \
    GetMetaFileBitsEx, <.hMF, .nSize, .lpvData>,  'GetMetaFileBitsEx',  \
    GetMetaFileW, <.lpFileName>,  'GetMetaFileW',  \
    GetMetaRgn, <.hdc, .hRgn>,  'GetMetaRgn',  \
    GetMiterLimit, <.hdc, .peLimit>,  'GetMiterLimit',  \
    GetNearestColor, <.hdc, .crColor>,  'GetNearestColor',  \
    GetNearestPaletteIndex, <.hPalette, .crColor>,  'GetNearestPaletteIndex',  \
    GetObjectA, <.hObject, .nCount, .lpObject>,  'GetObjectA',  \
    GetObjectType, <.hgdiobj>,  'GetObjectType',  \
    GetObjectW, <.hObject, .nCount, .lpObject>,  'GetObjectW',  \
    GetOutlineTextMetricsA, <.hdc, .cbData, .lpotm>,  'GetOutlineTextMetricsA',  \
    GetOutlineTextMetricsW, <.hdc, .cbData, .lpotm>,  'GetOutlineTextMetricsW',  \
    GetPaletteEntries, <.hPalette, .wStartIndex, .wNumEntries, .lpPaletteEntries>,  'GetPaletteEntries',  \
    GetPath, <.hdc, .lpPoint, .lpTypes, .nSize>,  'GetPath',  \
    GetPixel, <.hdc, .x, .y>,  'GetPixel',  \
    GetPixelFormat, <.hDC>,  'GetPixelFormat',  \
    GetPolyFillMode, <.hdc>,  'GetPolyFillMode',  \
    GetROP2, <.hdc>,  'GetROP2',  \
    GetRandomRgn, <.hdc, .hrgn, .ByValt>,  'GetRandomRgn',  \
    GetRasterizerCaps, <.lpraststat, .cb>,  'GetRasterizerCaps',  \
    GetRegionData, <.hRgn, .dwCount, .lpRgnData>,  'GetRegionData',  \
    GetRelAbs, <NONE>,  'GetRelAbs',  \
    GetRgnBox, <.hRgn, .lpRect>,  'GetRgnBox',  \
    GetStockObject, <.fnObject>,  'GetStockObject',  \
    GetStretchBltMode, <.hdc>,  'GetStretchBltMode',  \
    GetStringBitmapA, <NONE>,  'GetStringBitmapA',  \
    GetStringBitmapW, <NONE>,  'GetStringBitmapW',  \
    GetSystemPaletteEntries, <.hdc, .wStartIndex, .wNumEntries, .lpPaletteEntries>,  'GetSystemPaletteEntries',  \
    GetSystemPaletteUse, <.hdc>,  'GetSystemPaletteUse',  \
    GetTextAlign, <.hdc>,  'GetTextAlign',  \
    GetTextCharacterExtra, <.hdc>,  'GetTextCharacterExtra',  \
    GetTextCharset, <.hdc>,  'GetTextCharset',  \
    GetTextCharsetInfo, <.hdc, .lpSig, .dwFlags>,  'GetTextCharsetInfo',  \
    GetTextColor, <.hdc>,  'GetTextColor',  \
    GetTextExtentExPointA, <.hdc, .lpszStr, .cchString, .nMaxExtent, .lpnFit, .alpDx, .lpSize>,  'GetTextExtentExPointA',  \
    GetTextExtentExPointI, <.hdc, .lpword, .ByValt, .lpint, .lpsize>,  'GetTextExtentExPointI',  \
    GetTextExtentExPointW, <.hdc, .lpszStr, .cchString, .nMaxExtent, .lpnFit, .alpDx, .lpSize>,  'GetTextExtentExPointW',  \
    GetTextExtentExPointWPri, <NONE>,  'GetTextExtentExPointWPri',  \
    GetTextExtentPoint32A, <.hdc, .lpsz, .cbString, .lpSize>,  'GetTextExtentPoint32A',  \
    GetTextExtentPoint32W, <.hdc, .lpsz, .cbString, .lpSize>,  'GetTextExtentPoint32W',  \
    GetTextExtentPointA, <.hdc, .lpszString, .cbString, .lpSize>,  'GetTextExtentPointA',  \
    GetTextExtentPointI, <.hdc, .lpword, .ByValt, .lpsize>,  'GetTextExtentPointI',  \
    GetTextExtentPointW, <.hdc, .lpszString, .cbString, .lpSize>,  'GetTextExtentPointW',  \
    GetTextFaceA, <.hdc, .nCount, .lpFacename>,  'GetTextFaceA',  \
    GetTextFaceAliasW, <NONE>,  'GetTextFaceAliasW',  \
    GetTextFaceW, <.hdc, .nCount, .lpFacename>,  'GetTextFaceW',  \
    GetTextMetricsA, <.hdc, .lpMetrics>,  'GetTextMetricsA',  \
    GetTextMetricsW, <.hdc, .lpMetrics>,  'GetTextMetricsW',  \
    GetTransform, <NONE>,  'GetTransform',  \
    GetViewportExtEx, <.hdc, .lpSize>,  'GetViewportExtEx',  \
    GetViewportOrgEx, <.hdc, .lpPoint>,  'GetViewportOrgEx',  \
    GetWinMetaFileBits, <.hemf, .cbBuffer, .lpbBuffer, .fnMapMode, .hdcRef>,  'GetWinMetaFileBits',  \
    GetWindowExtEx, <.hdc, .lpSize>,  'GetWindowExtEx',  \
    GetWindowOrgEx, <.hdc, .lpPoint>,  'GetWindowOrgEx',  \
    GetWorldTransform, <.hdc, .lpXform>,  'GetWorldTransform',  \
    HT_Get8BPPFormatPalette, <NONE>,  'HT_Get8BPPFormatPalette',  \
    HT_Get8BPPMaskPalette, <NONE>,  'HT_Get8BPPMaskPalette',  \
    IntersectClipRect, <.hdc, .X1, .Y1, .X2, .Y2>,  'IntersectClipRect',  \
    InvertRgn, <.hdc, .hRgn>,  'InvertRgn',  \
    IsValidEnhMetaRecord, <NONE>,  'IsValidEnhMetaRecord',  \
    IsValidEnhMetaRecordOffExt, <NONE>,  'IsValidEnhMetaRecordOffExt',  \
    LPtoDP, <.hdc, .lpPoint, .nCount>,  'LPtoDP',  \
    LineDDA, <.ByValt, .pLineddaproc, .lparam>,  'LineDDA',  \
    LineTo, <.hdc, .x, .y>,  'LineTo',  \
    MaskBlt, <.hdcDest, .nXDest, .nYDest, .nWidth, .nHeight, .hdcSrc, .nXSrc, .nYSrc, .hbmMask, .xMask, .yMask, .dwRop>,  'MaskBlt',  \
    MirrorRgn, <NONE>,  'MirrorRgn',  \
    ModifyWorldTransform, <.hdc, .lpXform, .iMode>,  'ModifyWorldTransform',  \
    MoveToEx, <.hdc, .x, .y, .lpPoint>,  'MoveToEx',  \
    NamedEscape, <NONE>,  'NamedEscape',  \
    OffsetClipRgn, <.hdc, .x, .y>,  'OffsetClipRgn',  \
    OffsetRgn, <.hRgn, .x, .y>,  'OffsetRgn',  \
    OffsetViewportOrgEx, <.hdc, .nX, .nY, .lpPoint>,  'OffsetViewportOrgEx',  \
    OffsetWindowOrgEx, <.hdc, .nX, .nY, .lpPoint>,  'OffsetWindowOrgEx',  \
    PATHOBJ_bEnum, <NONE>,  'PATHOBJ_bEnum',  \
    PATHOBJ_bEnumClipLines, <NONE>,  'PATHOBJ_bEnumClipLines',  \
    PATHOBJ_vEnumStart, <NONE>,  'PATHOBJ_vEnumStart',  \
    PATHOBJ_vEnumStartClipLines, <NONE>,  'PATHOBJ_vEnumStartClipLines',  \
    PATHOBJ_vGetBounds, <NONE>,  'PATHOBJ_vGetBounds',  \
    PaintRgn, <.hdc, .hRgn>,  'PaintRgn',  \
    PatBlt, <.hdc, .x, .y, .nWidth, .nHeight, .dwRop>,  'PatBlt',  \
    PathToRegion, <.hdc>,  'PathToRegion',  \
    Pie, <.hdc, .X1, .Y1, .X2, .Y2, .X3, .Y3, .X4, .Y4>,  'Pie',  \
    PlayEnhMetaFile, <.hdc, .hemf, .lpRect>,  'PlayEnhMetaFile',  \
    PlayEnhMetaFileRecord, <.hdc, .lpHandletable, .lpEnhMetaRecord, .nHandles>,  'PlayEnhMetaFileRecord',  \
    PlayMetaFile, <.hdc, .hMF>,  'PlayMetaFile',  \
    PlayMetaFileRecord, <.hdc, .lpHandletable, .lpMetaRecord, .nHandles>,  'PlayMetaFileRecord',  \
    PlgBlt, <.hdcDest, .lpPoint, .hdcSrc, .nXSrc, .nYSrc, .nWidth, .nHeight, .hbmMask, .xMask, .yMask>,  'PlgBlt',  \
    PolyBezier, <.hdc, .lppt, .cPoints>,  'PolyBezier',  \
    PolyBezierTo, <.hdc, .lppt, .cCount>,  'PolyBezierTo',  \
    PolyDraw, <.hdc, .lppt, .lpbTypes, .cCount>,  'PolyDraw',  \
    PolyPatBlt, <NONE>,  'PolyPatBlt',  \
    PolyPolygon, <.hdc, .lpPoint, .lpPolyCounts, .nCount>,  'PolyPolygon',  \
    PolyPolyline, <.hdc, .lppt, .lpdwPolyPoints, .cCount>,  'PolyPolyline',  \
    PolyTextOutA, <.hdc, .pptxt, .cStrings>,  'PolyTextOutA',  \
    PolyTextOutW, <.hdc, .pptxt, .cStrings>,  'PolyTextOutW',  \
    Polygon, <.hdc, .lpPoint, .nCount>,  'Polygon',  \
    Polyline, <.hdc, .lpPoint, .nCount>,  'Polyline',  \
    PolylineTo, <.hdc, .lppt, .cCount>,  'PolylineTo',  \
    PtInRegion, <.hRgn, .x, .y>,  'PtInRegion',  \
    PtVisible, <.hdc, .x, .y>,  'PtVisible',  \
    QueryFontAssocStatus, <NONE>,  'QueryFontAssocStatus',  \
    RealizePalette, <.hdc>,  'RealizePalette',  \
    RectInRegion, <.hRgn, .lpRect>,  'RectInRegion',  \
    RectVisible, <.hdc, .lpRect>,  'RectVisible',  \
    Rectangle, <.hdc, .X1, .Y1, .X2, .Y2>,  'Rectangle',  \
    RemoveFontMemResourceEx, <.handle>,  'RemoveFontMemResourceEx',  \
    RemoveFontResourceA, <.lpFileName>,  'RemoveFontResourceA',  \
    RemoveFontResourceExA, <.lpcstr, .dword, .DESIGNVECTOR>,  'RemoveFontResourceExA',  \
    RemoveFontResourceExW, <.lpcstr, .dword, .DESIGNVECTOR>,  'RemoveFontResourceExW',  \
    RemoveFontResourceTracking, <NONE>,  'RemoveFontResourceTracking',  \
    RemoveFontResourceW, <.lpFileName>,  'RemoveFontResourceW',  \
    ResetDCA, <.hdc, .lpInitData>,  'ResetDCA',  \
    ResetDCW, <.hdc, .lpInitData>,  'ResetDCW',  \
    ResizePalette, <.hPalette, .nNumEntries>,  'ResizePalette',  \
    RestoreDC, <.hdc, .nSavedDC>,  'RestoreDC',  \
    RoundRect, <.hdc, .X1, .Y1, .X2, .Y2, .X3, .Y3>,  'RoundRect',  \
    STROBJ_bEnum, <NONE>,  'STROBJ_bEnum',  \
    STROBJ_bEnumPositionsOnly, <NONE>,  'STROBJ_bEnumPositionsOnly',  \
    STROBJ_bGetAdvanceWidths, <NONE>,  'STROBJ_bGetAdvanceWidths',  \
    STROBJ_dwGetCodePage, <NONE>,  'STROBJ_dwGetCodePage',  \
    STROBJ_vEnumStart, <NONE>,  'STROBJ_vEnumStart',  \
    SaveDC, <.hdc>,  'SaveDC',  \
    ScaleViewportExtEx, <.hdc, .nXnum, .nXdenom, .nYnum, .nYdenom, .lpSize>,  'ScaleViewportExtEx',  \
    ScaleWindowExtEx, <.hdc, .nXnum, .nXdenom, .nYnum, .nYdenom, .lpSize>,  'ScaleWindowExtEx',  \
    SelectBrushLocal, <NONE>,  'SelectBrushLocal',  \
    SelectClipPath, <.hdc, .iMode>,  'SelectClipPath',  \
    SelectClipRgn, <.hdc, .hRgn>,  'SelectClipRgn',  \
    SelectFontLocal, <NONE>,  'SelectFontLocal',  \
    SelectObject, <.hdc, .hObject>,  'SelectObject',  \
    SelectPalette, <.hdc, .hPalette, .bForceBackground>,  'SelectPalette',  \
    SetAbortProc, <.hDC, .lpAbortProc>,  'SetAbortProc',  \
    SetArcDirection, <.hdc, .ArcDirection>,  'SetArcDirection',  \
    SetBitmapAttributes, <NONE>,  'SetBitmapAttributes',  \
    SetBitmapBits, <.hBitmap, .dwCount, .lpBits>,  'SetBitmapBits',  \
    SetBitmapDimensionEx, <.hbm, .nX, .nY, .lpSize>,  'SetBitmapDimensionEx',  \
    SetBkColor, <.hdc, .crColor>,  'SetBkColor',  \
    SetBkMode, <.hdc, .nBkMode>,  'SetBkMode',  \
    SetBoundsRect, <.hdc, .lprcBounds, .flags>,  'SetBoundsRect',  \
    SetBrushAttributes, <NONE>,  'SetBrushAttributes',  \
    SetBrushOrgEx, <.hdc, .nXOrg, .nYOrg, .lppt>,  'SetBrushOrgEx',  \
    SetColorAdjustment, <.hdc, .lpca>,  'SetColorAdjustment',  \
    SetColorSpace, <.hdc, .hcolorspace>,  'SetColorSpace',  \
    SetDCBrushColor, <.hdc, .colorref>,  'SetDCBrushColor',  \
    SetDCPenColor, <.hdc, .colorref>,  'SetDCPenColor',  \
    SetDIBColorTable, <.hDC, .un1, .un2, .pcRGBQuad>,  'SetDIBColorTable',  \
    SetDIBits, <.hdc, .hBitmap, .nStartScan, .nNumScans, .lpBits, .lpBI, .wUsage>,  'SetDIBits',  \
    SetDIBitsToDevice, <.hdc, .x, .y, .dx, .dy, .SrcX, .SrcY, .Scan, .NumScans, .Bits, .BitsInfo, .wUsage>,  'SetDIBitsToDevice',  \
    SetDeviceGammaRamp, <.hdc, .lpv>,  'SetDeviceGammaRamp',  \
    SetEnhMetaFileBits, <.cbBuffer, .lpData>,  'SetEnhMetaFileBits',  \
    SetFontEnumeration, <NONE>,  'SetFontEnumeration',  \
    SetGraphicsMode, <.hdc, .iMode>,  'SetGraphicsMode',  \
    SetICMMode, <.hdc, .n>,  'SetICMMode',  \
    SetICMProfileA, <.hdc, .lpStr>,  'SetICMProfileA',  \
    SetICMProfileW, <.hdc, .lpStr>,  'SetICMProfileW',  \
    SetLayout, <.hdc, .dword>,  'SetLayout',  \
    SetLayoutWidth, <NONE>,  'SetLayoutWidth',  \
    SetMagicColors, <NONE>,  'SetMagicColors',  \
    SetMapMode, <.hdc, .nMapMode>,  'SetMapMode',  \
    SetMapperFlags, <.hdc, .dwFlag>,  'SetMapperFlags',  \
    SetMetaFileBitsEx, <.nSize, .lpData>,  'SetMetaFileBitsEx',  \
    SetMetaRgn, <.hdc>,  'SetMetaRgn',  \
    SetMiterLimit, <.hdc, .eNewLimit, .peOldLimit>,  'SetMiterLimit',  \
    SetPaletteEntries, <.hPalette, .wStartIndex, .wNumEntries, .lpPaletteEntries>,  'SetPaletteEntries',  \
    SetPixel, <.hdc, .x, .y, .crColor>,  'SetPixel',  \
    SetPixelFormat, <.hDC, .n, .pcPixelFormatDescriptor>,  'SetPixelFormat',  \
    SetPixelV, <.hdc, .x, .y, .crColor>,  'SetPixelV',  \
    SetPolyFillMode, <.hdc, .nPolyFillMode>,  'SetPolyFillMode',  \
    SetROP2, <.hdc, .nDrawMode>,  'SetROP2',  \
    SetRectRgn, <.hRgn, .X1, .Y1, .X2, .Y2>,  'SetRectRgn',  \
    SetRelAbs, <NONE>,  'SetRelAbs',  \
    SetStretchBltMode, <.hdc, .nStretchMode>,  'SetStretchBltMode',  \
    SetSystemPaletteUse, <.hdc, .wUsage>,  'SetSystemPaletteUse',  \
    SetTextAlign, <.hdc, .fMode>,  'SetTextAlign',  \
    SetTextCharacterExtra, <.hdc, .nCharExtra>,  'SetTextCharacterExtra',  \
    SetTextColor, <.hdc, .crColor>,  'SetTextColor',  \
    SetTextJustification, <.hdc, .nBreakExtra, .nBreakCount>,  'SetTextJustification',  \
    SetViewportExtEx, <.hdc, .nX, .nY, .lpSize>,  'SetViewportExtEx',  \
    SetViewportOrgEx, <.hdc, .nX, .nY, .lpPoint>,  'SetViewportOrgEx',  \
    SetVirtualResolution, <NONE>,  'SetVirtualResolution',  \
    SetWinMetaFileBits, <.cbBuffer, .lpbBuffer, .hdcRef, .lpmfp>,  'SetWinMetaFileBits',  \
    SetWindowExtEx, <.hdc, .nX, .nY, .lpSize>,  'SetWindowExtEx',  \
    SetWindowOrgEx, <.hdc, .nX, .nY, .lpPoint>,  'SetWindowOrgEx',  \
    SetWorldTransform, <.hdc, .lpXform>,  'SetWorldTransform',  \
    StartDocA, <.hdc, .lpdi>,  'StartDocA',  \
    StartDocW, <.hdc, .lpdi>,  'StartDocW',  \
    StartFormPage, <.hdc>,  'StartFormPage',  \
    StartPage, <.hdc>,  'StartPage',  \
    StretchBlt, <.hdc, .x, .y, .nWidth, .nHeight, .hSrcDC, .xSrc, .ySrc, .nSrcWidth, .nSrcHeight, .dwRop>,  'StretchBlt',  \
    StretchDIBits, <.hdc, .x, .y, .dx, .dy, .SrcX, .SrcY, .wSrcWidth, .wSrcHeight, .lpBits, .lpBitsInfo, .wUsage, .dwRop>,  'StretchDIBits',  \
    StrokeAndFillPath, <.hdc>,  'StrokeAndFillPath',  \
    StrokePath, <.hdc>,  'StrokePath',  \
    SwapBuffers, <.hDC>,  'SwapBuffers',  \
    TextOutA, <.hdc, .x, .y, .lpString, .nCount>,  'TextOutA',  \
    TextOutW, <.hdc, .x, .y, .lpString, .nCount>,  'TextOutW',  \
    TranslateCharsetInfo, <.lpSrc, .lpcs, .dwFlags>,  'TranslateCharsetInfo',  \
    UnloadNetworkFonts, <NONE>,  'UnloadNetworkFonts',  \
    UnrealizeObject, <.hObject>,  'UnrealizeObject',  \
    UpdateColors, <.hdc>,  'UpdateColors',  \
    UpdateICMRegKeyA, <.dword, .lpstr, .uint>,  'UpdateICMRegKeyA',  \
    UpdateICMRegKeyW, <.dword, .lpstr, .uint>,  'UpdateICMRegKeyW',  \
    WidenPath, <.hdc>,  'WidenPath',  \
    XFORMOBJ_bApplyXform, <NONE>,  'XFORMOBJ_bApplyXform',  \
    XFORMOBJ_iGetXform, <NONE>,  'XFORMOBJ_iGetXform',  \
    XLATEOBJ_cGetPalette, <NONE>,  'XLATEOBJ_cGetPalette',  \
    XLATEOBJ_hGetColorTransform, <NONE>,  'XLATEOBJ_hGetColorTransform',  \
    XLATEOBJ_iXlate, <NONE>,  'XLATEOBJ_iXlate',  \
    XLATEOBJ_piVector, <NONE>,  'XLATEOBJ_piVector',  \
    bInitSystemAndFontsDirectoriesW, <NONE>,  'bInitSystemAndFontsDirectoriesW',  \
    bMakePathNameW, <NONE>,  'bMakePathNameW',  \
    cGetTTFFromFOT, <NONE>,  'cGetTTFFromFOT',  \
    gdiPlaySpoolStream, <NONE>,  'gdiPlaySpoolStream'

Added freshlib/imports/Win32/gdiplus.inc.

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
;   gdiplus.dll API calls (ASCII) 
import_proto gdiplus,  \
    GdipAddPathArc, <NONE>,  'GdipAddPathArc',  \
    GdipAddPathArcI, <NONE>,  'GdipAddPathArcI',  \
    GdipAddPathBezier, <NONE>,  'GdipAddPathBezier',  \
    GdipAddPathBezierI, <NONE>,  'GdipAddPathBezierI',  \
    GdipAddPathBeziers, <NONE>,  'GdipAddPathBeziers',  \
    GdipAddPathBeziersI, <NONE>,  'GdipAddPathBeziersI',  \
    GdipAddPathClosedCurve, <NONE>,  'GdipAddPathClosedCurve',  \
    GdipAddPathClosedCurve2, <NONE>,  'GdipAddPathClosedCurve2',  \
    GdipAddPathClosedCurve2I, <NONE>,  'GdipAddPathClosedCurve2I',  \
    GdipAddPathClosedCurveI, <NONE>,  'GdipAddPathClosedCurveI',  \
    GdipAddPathCurve, <NONE>,  'GdipAddPathCurve',  \
    GdipAddPathCurve2, <NONE>,  'GdipAddPathCurve2',  \
    GdipAddPathCurve2I, <NONE>,  'GdipAddPathCurve2I',  \
    GdipAddPathCurve3, <NONE>,  'GdipAddPathCurve3',  \
    GdipAddPathCurve3I, <NONE>,  'GdipAddPathCurve3I',  \
    GdipAddPathCurveI, <NONE>,  'GdipAddPathCurveI',  \
    GdipAddPathEllipse, <NONE>,  'GdipAddPathEllipse',  \
    GdipAddPathEllipseI, <NONE>,  'GdipAddPathEllipseI',  \
    GdipAddPathLine, <NONE>,  'GdipAddPathLine',  \
    GdipAddPathLine2, <NONE>,  'GdipAddPathLine2',  \
    GdipAddPathLine2I, <NONE>,  'GdipAddPathLine2I',  \
    GdipAddPathLineI, <NONE>,  'GdipAddPathLineI',  \
    GdipAddPathPath, <NONE>,  'GdipAddPathPath',  \
    GdipAddPathPie, <NONE>,  'GdipAddPathPie',  \
    GdipAddPathPieI, <NONE>,  'GdipAddPathPieI',  \
    GdipAddPathPolygon, <NONE>,  'GdipAddPathPolygon',  \
    GdipAddPathPolygonI, <NONE>,  'GdipAddPathPolygonI',  \
    GdipAddPathRectangle, <NONE>,  'GdipAddPathRectangle',  \
    GdipAddPathRectangleI, <NONE>,  'GdipAddPathRectangleI',  \
    GdipAddPathRectangles, <NONE>,  'GdipAddPathRectangles',  \
    GdipAddPathRectanglesI, <NONE>,  'GdipAddPathRectanglesI',  \
    GdipAddPathString, <NONE>,  'GdipAddPathString',  \
    GdipAddPathStringI, <NONE>,  'GdipAddPathStringI',  \
    GdipAlloc, <NONE>,  'GdipAlloc',  \
    GdipBeginContainer, <NONE>,  'GdipBeginContainer',  \
    GdipBeginContainer2, <NONE>,  'GdipBeginContainer2',  \
    GdipBeginContainerI, <NONE>,  'GdipBeginContainerI',  \
    GdipBitmapApplyEffect, <NONE>,  'GdipBitmapApplyEffect',  \
    GdipBitmapConvertFormat, <NONE>,  'GdipBitmapConvertFormat',  \
    GdipBitmapCreateApplyEffect, <NONE>,  'GdipBitmapCreateApplyEffect',  \
    GdipBitmapGetHistogram, <NONE>,  'GdipBitmapGetHistogram',  \
    GdipBitmapGetHistogramSize, <NONE>,  'GdipBitmapGetHistogramSize',  \
    GdipBitmapGetPixel, <NONE>,  'GdipBitmapGetPixel',  \
    GdipBitmapLockBits, <NONE>,  'GdipBitmapLockBits',  \
    GdipBitmapSetPixel, <NONE>,  'GdipBitmapSetPixel',  \
    GdipBitmapSetResolution, <NONE>,  'GdipBitmapSetResolution',  \
    GdipBitmapUnlockBits, <NONE>,  'GdipBitmapUnlockBits',  \
    GdipClearPathMarkers, <NONE>,  'GdipClearPathMarkers',  \
    GdipCloneBitmapArea, <NONE>,  'GdipCloneBitmapArea',  \
    GdipCloneBitmapAreaI, <NONE>,  'GdipCloneBitmapAreaI',  \
    GdipCloneBrush, <NONE>,  'GdipCloneBrush',  \
    GdipCloneCustomLineCap, <NONE>,  'GdipCloneCustomLineCap',  \
    GdipCloneFont, <NONE>,  'GdipCloneFont',  \
    GdipCloneFontFamily, <NONE>,  'GdipCloneFontFamily',  \
    GdipCloneImage, <NONE>,  'GdipCloneImage',  \
    GdipCloneImageAttributes, <NONE>,  'GdipCloneImageAttributes',  \
    GdipCloneMatrix, <NONE>,  'GdipCloneMatrix',  \
    GdipClonePath, <NONE>,  'GdipClonePath',  \
    GdipClonePen, <NONE>,  'GdipClonePen',  \
    GdipCloneRegion, <NONE>,  'GdipCloneRegion',  \
    GdipCloneStringFormat, <NONE>,  'GdipCloneStringFormat',  \
    GdipClosePathFigure, <NONE>,  'GdipClosePathFigure',  \
    GdipClosePathFigures, <NONE>,  'GdipClosePathFigures',  \
    GdipCombineRegionPath, <NONE>,  'GdipCombineRegionPath',  \
    GdipCombineRegionRect, <NONE>,  'GdipCombineRegionRect',  \
    GdipCombineRegionRectI, <NONE>,  'GdipCombineRegionRectI',  \
    GdipCombineRegionRegion, <NONE>,  'GdipCombineRegionRegion',  \
    GdipComment, <NONE>,  'GdipComment',  \
    GdipConvertToEmfPlus, <NONE>,  'GdipConvertToEmfPlus',  \
    GdipConvertToEmfPlusToFile, <NONE>,  'GdipConvertToEmfPlusToFile',  \
    GdipConvertToEmfPlusToStream, <NONE>,  'GdipConvertToEmfPlusToStream',  \
    GdipCreateAdjustableArrowCap, <NONE>,  'GdipCreateAdjustableArrowCap',  \
    GdipCreateBitmapFromDirectDrawSurface, <NONE>,  'GdipCreateBitmapFromDirectDrawSurface',  \
    GdipCreateBitmapFromFile, <NONE>,  'GdipCreateBitmapFromFile',  \
    GdipCreateBitmapFromFileICM, <NONE>,  'GdipCreateBitmapFromFileICM',  \
    GdipCreateBitmapFromGdiDib, <NONE>,  'GdipCreateBitmapFromGdiDib',  \
    GdipCreateBitmapFromGraphics, <NONE>,  'GdipCreateBitmapFromGraphics',  \
    GdipCreateBitmapFromHBITMAP, <NONE>,  'GdipCreateBitmapFromHBITMAP',  \
    GdipCreateBitmapFromHICON, <NONE>,  'GdipCreateBitmapFromHICON',  \
    GdipCreateBitmapFromResource, <NONE>,  'GdipCreateBitmapFromResource',  \
    GdipCreateBitmapFromScan0, <NONE>,  'GdipCreateBitmapFromScan0',  \
    GdipCreateBitmapFromStream, <NONE>,  'GdipCreateBitmapFromStream',  \
    GdipCreateBitmapFromStreamICM, <NONE>,  'GdipCreateBitmapFromStreamICM',  \
    GdipCreateCachedBitmap, <NONE>,  'GdipCreateCachedBitmap',  \
    GdipCreateCustomLineCap, <NONE>,  'GdipCreateCustomLineCap',  \
    GdipCreateEffect, <NONE>,  'GdipCreateEffect',  \
    GdipCreateFont, <NONE>,  'GdipCreateFont',  \
    GdipCreateFontFamilyFromName, <NONE>,  'GdipCreateFontFamilyFromName',  \
    GdipCreateFontFromDC, <NONE>,  'GdipCreateFontFromDC',  \
    GdipCreateFontFromLogfontA, <NONE>,  'GdipCreateFontFromLogfontA',  \
    GdipCreateFontFromLogfontW, <NONE>,  'GdipCreateFontFromLogfontW',  \
    GdipCreateFromHDC, <NONE>,  'GdipCreateFromHDC',  \
    GdipCreateFromHDC2, <NONE>,  'GdipCreateFromHDC2',  \
    GdipCreateFromHWND, <NONE>,  'GdipCreateFromHWND',  \
    GdipCreateFromHWNDICM, <NONE>,  'GdipCreateFromHWNDICM',  \
    GdipCreateHBITMAPFromBitmap, <NONE>,  'GdipCreateHBITMAPFromBitmap',  \
    GdipCreateHICONFromBitmap, <NONE>,  'GdipCreateHICONFromBitmap',  \
    GdipCreateHalftonePalette, <NONE>,  'GdipCreateHalftonePalette',  \
    GdipCreateHatchBrush, <NONE>,  'GdipCreateHatchBrush',  \
    GdipCreateImageAttributes, <NONE>,  'GdipCreateImageAttributes',  \
    GdipCreateLineBrush, <NONE>,  'GdipCreateLineBrush',  \
    GdipCreateLineBrushFromRect, <NONE>,  'GdipCreateLineBrushFromRect',  \
    GdipCreateLineBrushFromRectI, <NONE>,  'GdipCreateLineBrushFromRectI',  \
    GdipCreateLineBrushFromRectWithAngle, <NONE>,  'GdipCreateLineBrushFromRectWithAngle',  \
    GdipCreateLineBrushFromRectWithAngleI, <NONE>,  'GdipCreateLineBrushFromRectWithAngleI',  \
    GdipCreateLineBrushI, <NONE>,  'GdipCreateLineBrushI',  \
    GdipCreateMatrix, <NONE>,  'GdipCreateMatrix',  \
    GdipCreateMatrix2, <NONE>,  'GdipCreateMatrix2',  \
    GdipCreateMatrix3, <NONE>,  'GdipCreateMatrix3',  \
    GdipCreateMatrix3I, <NONE>,  'GdipCreateMatrix3I',  \
    GdipCreateMetafileFromEmf, <NONE>,  'GdipCreateMetafileFromEmf',  \
    GdipCreateMetafileFromFile, <NONE>,  'GdipCreateMetafileFromFile',  \
    GdipCreateMetafileFromStream, <NONE>,  'GdipCreateMetafileFromStream',  \
    GdipCreateMetafileFromWmf, <NONE>,  'GdipCreateMetafileFromWmf',  \
    GdipCreateMetafileFromWmfFile, <NONE>,  'GdipCreateMetafileFromWmfFile',  \
    GdipCreatePath, <NONE>,  'GdipCreatePath',  \
    GdipCreatePath2, <NONE>,  'GdipCreatePath2',  \
    GdipCreatePath2I, <NONE>,  'GdipCreatePath2I',  \
    GdipCreatePathGradient, <NONE>,  'GdipCreatePathGradient',  \
    GdipCreatePathGradientFromPath, <NONE>,  'GdipCreatePathGradientFromPath',  \
    GdipCreatePathGradientI, <NONE>,  'GdipCreatePathGradientI',  \
    GdipCreatePathIter, <NONE>,  'GdipCreatePathIter',  \
    GdipCreatePen1, <NONE>,  'GdipCreatePen1',  \
    GdipCreatePen2, <NONE>,  'GdipCreatePen2',  \
    GdipCreateRegion, <NONE>,  'GdipCreateRegion',  \
    GdipCreateRegionHrgn, <NONE>,  'GdipCreateRegionHrgn',  \
    GdipCreateRegionPath, <NONE>,  'GdipCreateRegionPath',  \
    GdipCreateRegionRect, <NONE>,  'GdipCreateRegionRect',  \
    GdipCreateRegionRectI, <NONE>,  'GdipCreateRegionRectI',  \
    GdipCreateRegionRgnData, <NONE>,  'GdipCreateRegionRgnData',  \
    GdipCreateSolidFill, <NONE>,  'GdipCreateSolidFill',  \
    GdipCreateStreamOnFile, <NONE>,  'GdipCreateStreamOnFile',  \
    GdipCreateStringFormat, <NONE>,  'GdipCreateStringFormat',  \
    GdipCreateTexture, <NONE>,  'GdipCreateTexture',  \
    GdipCreateTexture2, <NONE>,  'GdipCreateTexture2',  \
    GdipCreateTexture2I, <NONE>,  'GdipCreateTexture2I',  \
    GdipCreateTextureIA, <NONE>,  'GdipCreateTextureIA',  \
    GdipCreateTextureIAI, <NONE>,  'GdipCreateTextureIAI',  \
    GdipDeleteBrush, <NONE>,  'GdipDeleteBrush',  \
    GdipDeleteCachedBitmap, <NONE>,  'GdipDeleteCachedBitmap',  \
    GdipDeleteCustomLineCap, <NONE>,  'GdipDeleteCustomLineCap',  \
    GdipDeleteEffect, <NONE>,  'GdipDeleteEffect',  \
    GdipDeleteFont, <NONE>,  'GdipDeleteFont',  \
    GdipDeleteFontFamily, <NONE>,  'GdipDeleteFontFamily',  \
    GdipDeleteGraphics, <NONE>,  'GdipDeleteGraphics',  \
    GdipDeleteMatrix, <NONE>,  'GdipDeleteMatrix',  \
    GdipDeletePath, <NONE>,  'GdipDeletePath',  \
    GdipDeletePathIter, <NONE>,  'GdipDeletePathIter',  \
    GdipDeletePen, <NONE>,  'GdipDeletePen',  \
    GdipDeletePrivateFontCollection, <NONE>,  'GdipDeletePrivateFontCollection',  \
    GdipDeleteRegion, <NONE>,  'GdipDeleteRegion',  \
    GdipDeleteStringFormat, <NONE>,  'GdipDeleteStringFormat',  \
    GdipDisposeImage, <NONE>,  'GdipDisposeImage',  \
    GdipDisposeImageAttributes, <NONE>,  'GdipDisposeImageAttributes',  \
    GdipDrawArc, <NONE>,  'GdipDrawArc',  \
    GdipDrawArcI, <NONE>,  'GdipDrawArcI',  \
    GdipDrawBezier, <NONE>,  'GdipDrawBezier',  \
    GdipDrawBezierI, <NONE>,  'GdipDrawBezierI',  \
    GdipDrawBeziers, <NONE>,  'GdipDrawBeziers',  \
    GdipDrawBeziersI, <NONE>,  'GdipDrawBeziersI',  \
    GdipDrawCachedBitmap, <NONE>,  'GdipDrawCachedBitmap',  \
    GdipDrawClosedCurve, <NONE>,  'GdipDrawClosedCurve',  \
    GdipDrawClosedCurve2, <NONE>,  'GdipDrawClosedCurve2',  \
    GdipDrawClosedCurve2I, <NONE>,  'GdipDrawClosedCurve2I',  \
    GdipDrawClosedCurveI, <NONE>,  'GdipDrawClosedCurveI',  \
    GdipDrawCurve, <NONE>,  'GdipDrawCurve',  \
    GdipDrawCurve2, <NONE>,  'GdipDrawCurve2',  \
    GdipDrawCurve2I, <NONE>,  'GdipDrawCurve2I',  \
    GdipDrawCurve3, <NONE>,  'GdipDrawCurve3',  \
    GdipDrawCurve3I, <NONE>,  'GdipDrawCurve3I',  \
    GdipDrawCurveI, <NONE>,  'GdipDrawCurveI',  \
    GdipDrawDriverString, <NONE>,  'GdipDrawDriverString',  \
    GdipDrawEllipse, <NONE>,  'GdipDrawEllipse',  \
    GdipDrawEllipseI, <NONE>,  'GdipDrawEllipseI',  \
    GdipDrawImage, <NONE>,  'GdipDrawImage',  \
    GdipDrawImageFX, <NONE>,  'GdipDrawImageFX',  \
    GdipDrawImageI, <NONE>,  'GdipDrawImageI',  \
    GdipDrawImagePointRect, <NONE>,  'GdipDrawImagePointRect',  \
    GdipDrawImagePointRectI, <NONE>,  'GdipDrawImagePointRectI',  \
    GdipDrawImagePoints, <NONE>,  'GdipDrawImagePoints',  \
    GdipDrawImagePointsI, <NONE>,  'GdipDrawImagePointsI',  \
    GdipDrawImagePointsRect, <NONE>,  'GdipDrawImagePointsRect',  \
    GdipDrawImagePointsRectI, <NONE>,  'GdipDrawImagePointsRectI',  \
    GdipDrawImageRect, <NONE>,  'GdipDrawImageRect',  \
    GdipDrawImageRectI, <NONE>,  'GdipDrawImageRectI',  \
    GdipDrawImageRectRect, <NONE>,  'GdipDrawImageRectRect',  \
    GdipDrawImageRectRectI, <NONE>,  'GdipDrawImageRectRectI',  \
    GdipDrawLine, <NONE>,  'GdipDrawLine',  \
    GdipDrawLineI, <NONE>,  'GdipDrawLineI',  \
    GdipDrawLines, <NONE>,  'GdipDrawLines',  \
    GdipDrawLinesI, <NONE>,  'GdipDrawLinesI',  \
    GdipDrawPath, <NONE>,  'GdipDrawPath',  \
    GdipDrawPie, <NONE>,  'GdipDrawPie',  \
    GdipDrawPieI, <NONE>,  'GdipDrawPieI',  \
    GdipDrawPolygon, <NONE>,  'GdipDrawPolygon',  \
    GdipDrawPolygonI, <NONE>,  'GdipDrawPolygonI',  \
    GdipDrawRectangle, <NONE>,  'GdipDrawRectangle',  \
    GdipDrawRectangleI, <NONE>,  'GdipDrawRectangleI',  \
    GdipDrawRectangles, <NONE>,  'GdipDrawRectangles',  \
    GdipDrawRectanglesI, <NONE>,  'GdipDrawRectanglesI',  \
    GdipDrawString, <NONE>,  'GdipDrawString',  \
    GdipEmfToWmfBits, <NONE>,  'GdipEmfToWmfBits',  \
    GdipEndContainer, <NONE>,  'GdipEndContainer',  \
    GdipEnumerateMetafileDestPoint, <NONE>,  'GdipEnumerateMetafileDestPoint',  \
    GdipEnumerateMetafileDestPointI, <NONE>,  'GdipEnumerateMetafileDestPointI',  \
    GdipEnumerateMetafileDestPoints, <NONE>,  'GdipEnumerateMetafileDestPoints',  \
    GdipEnumerateMetafileDestPointsI, <NONE>,  'GdipEnumerateMetafileDestPointsI',  \
    GdipEnumerateMetafileDestRect, <NONE>,  'GdipEnumerateMetafileDestRect',  \
    GdipEnumerateMetafileDestRectI, <NONE>,  'GdipEnumerateMetafileDestRectI',  \
    GdipEnumerateMetafileSrcRectDestPoint, <NONE>,  'GdipEnumerateMetafileSrcRectDestPoint',  \
    GdipEnumerateMetafileSrcRectDestPointI, <NONE>,  'GdipEnumerateMetafileSrcRectDestPointI',  \
    GdipEnumerateMetafileSrcRectDestPoints, <NONE>,  'GdipEnumerateMetafileSrcRectDestPoints',  \
    GdipEnumerateMetafileSrcRectDestPointsI, <NONE>,  'GdipEnumerateMetafileSrcRectDestPointsI',  \
    GdipEnumerateMetafileSrcRectDestRect, <NONE>,  'GdipEnumerateMetafileSrcRectDestRect',  \
    GdipEnumerateMetafileSrcRectDestRectI, <NONE>,  'GdipEnumerateMetafileSrcRectDestRectI',  \
    GdipFillClosedCurve, <NONE>,  'GdipFillClosedCurve',  \
    GdipFillClosedCurve2, <NONE>,  'GdipFillClosedCurve2',  \
    GdipFillClosedCurve2I, <NONE>,  'GdipFillClosedCurve2I',  \
    GdipFillClosedCurveI, <NONE>,  'GdipFillClosedCurveI',  \
    GdipFillEllipse, <NONE>,  'GdipFillEllipse',  \
    GdipFillEllipseI, <NONE>,  'GdipFillEllipseI',  \
    GdipFillPath, <NONE>,  'GdipFillPath',  \
    GdipFillPie, <NONE>,  'GdipFillPie',  \
    GdipFillPieI, <NONE>,  'GdipFillPieI',  \
    GdipFillPolygon, <NONE>,  'GdipFillPolygon',  \
    GdipFillPolygon2, <NONE>,  'GdipFillPolygon2',  \
    GdipFillPolygon2I, <NONE>,  'GdipFillPolygon2I',  \
    GdipFillPolygonI, <NONE>,  'GdipFillPolygonI',  \
    GdipFillRectangle, <NONE>,  'GdipFillRectangle',  \
    GdipFillRectangleI, <NONE>,  'GdipFillRectangleI',  \
    GdipFillRectangles, <NONE>,  'GdipFillRectangles',  \
    GdipFillRectanglesI, <NONE>,  'GdipFillRectanglesI',  \
    GdipFillRegion, <NONE>,  'GdipFillRegion',  \
    GdipFindFirstImageItem, <NONE>,  'GdipFindFirstImageItem',  \
    GdipFindNextImageItem, <NONE>,  'GdipFindNextImageItem',  \
    GdipFlattenPath, <NONE>,  'GdipFlattenPath',  \
    GdipFlush, <NONE>,  'GdipFlush',  \
    GdipFree, <NONE>,  'GdipFree',  \
    GdipGetAdjustableArrowCapFillState, <NONE>,  'GdipGetAdjustableArrowCapFillState',  \
    GdipGetAdjustableArrowCapHeight, <NONE>,  'GdipGetAdjustableArrowCapHeight',  \
    GdipGetAdjustableArrowCapMiddleInset, <NONE>,  'GdipGetAdjustableArrowCapMiddleInset',  \
    GdipGetAdjustableArrowCapWidth, <NONE>,  'GdipGetAdjustableArrowCapWidth',  \
    GdipGetAllPropertyItems, <NONE>,  'GdipGetAllPropertyItems',  \
    GdipGetBrushType, <NONE>,  'GdipGetBrushType',  \
    GdipGetCellAscent, <NONE>,  'GdipGetCellAscent',  \
    GdipGetCellDescent, <NONE>,  'GdipGetCellDescent',  \
    GdipGetClip, <NONE>,  'GdipGetClip',  \
    GdipGetClipBounds, <NONE>,  'GdipGetClipBounds',  \
    GdipGetClipBoundsI, <NONE>,  'GdipGetClipBoundsI',  \
    GdipGetCompositingMode, <NONE>,  'GdipGetCompositingMode',  \
    GdipGetCompositingQuality, <NONE>,  'GdipGetCompositingQuality',  \
    GdipGetCustomLineCapBaseCap, <NONE>,  'GdipGetCustomLineCapBaseCap',  \
    GdipGetCustomLineCapBaseInset, <NONE>,  'GdipGetCustomLineCapBaseInset',  \
    GdipGetCustomLineCapStrokeCaps, <NONE>,  'GdipGetCustomLineCapStrokeCaps',  \
    GdipGetCustomLineCapStrokeJoin, <NONE>,  'GdipGetCustomLineCapStrokeJoin',  \
    GdipGetCustomLineCapType, <NONE>,  'GdipGetCustomLineCapType',  \
    GdipGetCustomLineCapWidthScale, <NONE>,  'GdipGetCustomLineCapWidthScale',  \
    GdipGetDC, <NONE>,  'GdipGetDC',  \
    GdipGetDpiX, <NONE>,  'GdipGetDpiX',  \
    GdipGetDpiY, <NONE>,  'GdipGetDpiY',  \
    GdipGetEffectParameterSize, <NONE>,  'GdipGetEffectParameterSize',  \
    GdipGetEffectParameters, <NONE>,  'GdipGetEffectParameters',  \
    GdipGetEmHeight, <NONE>,  'GdipGetEmHeight',  \
    GdipGetEncoderParameterList, <NONE>,  'GdipGetEncoderParameterList',  \
    GdipGetEncoderParameterListSize, <NONE>,  'GdipGetEncoderParameterListSize',  \
    GdipGetFamily, <NONE>,  'GdipGetFamily',  \
    GdipGetFamilyName, <NONE>,  'GdipGetFamilyName',  \
    GdipGetFontCollectionFamilyCount, <NONE>,  'GdipGetFontCollectionFamilyCount',  \
    GdipGetFontCollectionFamilyList, <NONE>,  'GdipGetFontCollectionFamilyList',  \
    GdipGetFontHeight, <NONE>,  'GdipGetFontHeight',  \
    GdipGetFontHeightGivenDPI, <NONE>,  'GdipGetFontHeightGivenDPI',  \
    GdipGetFontSize, <NONE>,  'GdipGetFontSize',  \
    GdipGetFontStyle, <NONE>,  'GdipGetFontStyle',  \
    GdipGetFontUnit, <NONE>,  'GdipGetFontUnit',  \
    GdipGetGenericFontFamilyMonospace, <NONE>,  'GdipGetGenericFontFamilyMonospace',  \
    GdipGetGenericFontFamilySansSerif, <NONE>,  'GdipGetGenericFontFamilySansSerif',  \
    GdipGetGenericFontFamilySerif, <NONE>,  'GdipGetGenericFontFamilySerif',  \
    GdipGetHatchBackgroundColor, <NONE>,  'GdipGetHatchBackgroundColor',  \
    GdipGetHatchForegroundColor, <NONE>,  'GdipGetHatchForegroundColor',  \
    GdipGetHatchStyle, <NONE>,  'GdipGetHatchStyle',  \
    GdipGetHemfFromMetafile, <NONE>,  'GdipGetHemfFromMetafile',  \
    GdipGetImageAttributesAdjustedPalette, <NONE>,  'GdipGetImageAttributesAdjustedPalette',  \
    GdipGetImageBounds, <NONE>,  'GdipGetImageBounds',  \
    GdipGetImageDecoders, <NONE>,  'GdipGetImageDecoders',  \
    GdipGetImageDecodersSize, <NONE>,  'GdipGetImageDecodersSize',  \
    GdipGetImageDimension, <NONE>,  'GdipGetImageDimension',  \
    GdipGetImageEncoders, <NONE>,  'GdipGetImageEncoders',  \
    GdipGetImageEncodersSize, <NONE>,  'GdipGetImageEncodersSize',  \
    GdipGetImageFlags, <NONE>,  'GdipGetImageFlags',  \
    GdipGetImageGraphicsContext, <NONE>,  'GdipGetImageGraphicsContext',  \
    GdipGetImageHeight, <NONE>,  'GdipGetImageHeight',  \
    GdipGetImageHorizontalResolution, <NONE>,  'GdipGetImageHorizontalResolution',  \
    GdipGetImageItemData, <NONE>,  'GdipGetImageItemData',  \
    GdipGetImagePalette, <NONE>,  'GdipGetImagePalette',  \
    GdipGetImagePaletteSize, <NONE>,  'GdipGetImagePaletteSize',  \
    GdipGetImagePixelFormat, <NONE>,  'GdipGetImagePixelFormat',  \
    GdipGetImageRawFormat, <NONE>,  'GdipGetImageRawFormat',  \
    GdipGetImageThumbnail, <NONE>,  'GdipGetImageThumbnail',  \
    GdipGetImageType, <NONE>,  'GdipGetImageType',  \
    GdipGetImageVerticalResolution, <NONE>,  'GdipGetImageVerticalResolution',  \
    GdipGetImageWidth, <NONE>,  'GdipGetImageWidth',  \
    GdipGetInterpolationMode, <NONE>,  'GdipGetInterpolationMode',  \
    GdipGetLineBlend, <NONE>,  'GdipGetLineBlend',  \
    GdipGetLineBlendCount, <NONE>,  'GdipGetLineBlendCount',  \
    GdipGetLineColors, <NONE>,  'GdipGetLineColors',  \
    GdipGetLineGammaCorrection, <NONE>,  'GdipGetLineGammaCorrection',  \
    GdipGetLinePresetBlend, <NONE>,  'GdipGetLinePresetBlend',  \
    GdipGetLinePresetBlendCount, <NONE>,  'GdipGetLinePresetBlendCount',  \
    GdipGetLineRect, <NONE>,  'GdipGetLineRect',  \
    GdipGetLineRectI, <NONE>,  'GdipGetLineRectI',  \
    GdipGetLineSpacing, <NONE>,  'GdipGetLineSpacing',  \
    GdipGetLineTransform, <NONE>,  'GdipGetLineTransform',  \
    GdipGetLineWrapMode, <NONE>,  'GdipGetLineWrapMode',  \
    GdipGetLogFontA, <NONE>,  'GdipGetLogFontA',  \
    GdipGetLogFontW, <NONE>,  'GdipGetLogFontW',  \
    GdipGetMatrixElements, <NONE>,  'GdipGetMatrixElements',  \
    GdipGetMetafileDownLevelRasterizationLimit, <NONE>,  'GdipGetMetafileDownLevelRasterizationLimit',  \
    GdipGetMetafileHeaderFromEmf, <NONE>,  'GdipGetMetafileHeaderFromEmf',  \
    GdipGetMetafileHeaderFromFile, <NONE>,  'GdipGetMetafileHeaderFromFile',  \
    GdipGetMetafileHeaderFromMetafile, <NONE>,  'GdipGetMetafileHeaderFromMetafile',  \
    GdipGetMetafileHeaderFromStream, <NONE>,  'GdipGetMetafileHeaderFromStream',  \
    GdipGetMetafileHeaderFromWmf, <NONE>,  'GdipGetMetafileHeaderFromWmf',  \
    GdipGetNearestColor, <NONE>,  'GdipGetNearestColor',  \
    GdipGetPageScale, <NONE>,  'GdipGetPageScale',  \
    GdipGetPageUnit, <NONE>,  'GdipGetPageUnit',  \
    GdipGetPathData, <NONE>,  'GdipGetPathData',  \
    GdipGetPathFillMode, <NONE>,  'GdipGetPathFillMode',  \
    GdipGetPathGradientBlend, <NONE>,  'GdipGetPathGradientBlend',  \
    GdipGetPathGradientBlendCount, <NONE>,  'GdipGetPathGradientBlendCount',  \
    GdipGetPathGradientCenterColor, <NONE>,  'GdipGetPathGradientCenterColor',  \
    GdipGetPathGradientCenterPoint, <NONE>,  'GdipGetPathGradientCenterPoint',  \
    GdipGetPathGradientCenterPointI, <NONE>,  'GdipGetPathGradientCenterPointI',  \
    GdipGetPathGradientFocusScales, <NONE>,  'GdipGetPathGradientFocusScales',  \
    GdipGetPathGradientGammaCorrection, <NONE>,  'GdipGetPathGradientGammaCorrection',  \
    GdipGetPathGradientPath, <NONE>,  'GdipGetPathGradientPath',  \
    GdipGetPathGradientPointCount, <NONE>,  'GdipGetPathGradientPointCount',  \
    GdipGetPathGradientPresetBlend, <NONE>,  'GdipGetPathGradientPresetBlend',  \
    GdipGetPathGradientPresetBlendCount, <NONE>,  'GdipGetPathGradientPresetBlendCount',  \
    GdipGetPathGradientRect, <NONE>,  'GdipGetPathGradientRect',  \
    GdipGetPathGradientRectI, <NONE>,  'GdipGetPathGradientRectI',  \
    GdipGetPathGradientSurroundColorCount, <NONE>,  'GdipGetPathGradientSurroundColorCount',  \
    GdipGetPathGradientSurroundColorsWithCount, <NONE>,  'GdipGetPathGradientSurroundColorsWithCount',  \
    GdipGetPathGradientTransform, <NONE>,  'GdipGetPathGradientTransform',  \
    GdipGetPathGradientWrapMode, <NONE>,  'GdipGetPathGradientWrapMode',  \
    GdipGetPathLastPoint, <NONE>,  'GdipGetPathLastPoint',  \
    GdipGetPathPoints, <NONE>,  'GdipGetPathPoints',  \
    GdipGetPathPointsI, <NONE>,  'GdipGetPathPointsI',  \
    GdipGetPathTypes, <NONE>,  'GdipGetPathTypes',  \
    GdipGetPathWorldBounds, <NONE>,  'GdipGetPathWorldBounds',  \
    GdipGetPathWorldBoundsI, <NONE>,  'GdipGetPathWorldBoundsI',  \
    GdipGetPenBrushFill, <NONE>,  'GdipGetPenBrushFill',  \
    GdipGetPenColor, <NONE>,  'GdipGetPenColor',  \
    GdipGetPenCompoundArray, <NONE>,  'GdipGetPenCompoundArray',  \
    GdipGetPenCompoundCount, <NONE>,  'GdipGetPenCompoundCount',  \
    GdipGetPenCustomEndCap, <NONE>,  'GdipGetPenCustomEndCap',  \
    GdipGetPenCustomStartCap, <NONE>,  'GdipGetPenCustomStartCap',  \
    GdipGetPenDashArray, <NONE>,  'GdipGetPenDashArray',  \
    GdipGetPenDashCap197819, <NONE>,  'GdipGetPenDashCap197819',  \
    GdipGetPenDashCount, <NONE>,  'GdipGetPenDashCount',  \
    GdipGetPenDashOffset, <NONE>,  'GdipGetPenDashOffset',  \
    GdipGetPenDashStyle, <NONE>,  'GdipGetPenDashStyle',  \
    GdipGetPenEndCap, <NONE>,  'GdipGetPenEndCap',  \
    GdipGetPenFillType, <NONE>,  'GdipGetPenFillType',  \
    GdipGetPenLineJoin, <NONE>,  'GdipGetPenLineJoin',  \
    GdipGetPenMiterLimit, <NONE>,  'GdipGetPenMiterLimit',  \
    GdipGetPenMode, <NONE>,  'GdipGetPenMode',  \
    GdipGetPenStartCap, <NONE>,  'GdipGetPenStartCap',  \
    GdipGetPenTransform, <NONE>,  'GdipGetPenTransform',  \
    GdipGetPenUnit, <NONE>,  'GdipGetPenUnit',  \
    GdipGetPenWidth, <NONE>,  'GdipGetPenWidth',  \
    GdipGetPixelOffsetMode, <NONE>,  'GdipGetPixelOffsetMode',  \
    GdipGetPointCount, <NONE>,  'GdipGetPointCount',  \
    GdipGetPropertyCount, <NONE>,  'GdipGetPropertyCount',  \
    GdipGetPropertyIdList, <NONE>,  'GdipGetPropertyIdList',  \
    GdipGetPropertyItem, <NONE>,  'GdipGetPropertyItem',  \
    GdipGetPropertyItemSize, <NONE>,  'GdipGetPropertyItemSize',  \
    GdipGetPropertySize, <NONE>,  'GdipGetPropertySize',  \
    GdipGetRegionBounds, <NONE>,  'GdipGetRegionBounds',  \
    GdipGetRegionBoundsI, <NONE>,  'GdipGetRegionBoundsI',  \
    GdipGetRegionData, <NONE>,  'GdipGetRegionData',  \
    GdipGetRegionDataSize, <NONE>,  'GdipGetRegionDataSize',  \
    GdipGetRegionHRgn, <NONE>,  'GdipGetRegionHRgn',  \
    GdipGetRegionScans, <NONE>,  'GdipGetRegionScans',  \
    GdipGetRegionScansCount, <NONE>,  'GdipGetRegionScansCount',  \
    GdipGetRegionScansI, <NONE>,  'GdipGetRegionScansI',  \
    GdipGetRenderingOrigin, <NONE>,  'GdipGetRenderingOrigin',  \
    GdipGetSmoothingMode, <NONE>,  'GdipGetSmoothingMode',  \
    GdipGetSolidFillColor, <NONE>,  'GdipGetSolidFillColor',  \
    GdipGetStringFormatAlign, <NONE>,  'GdipGetStringFormatAlign',  \
    GdipGetStringFormatDigitSubstitution, <NONE>,  'GdipGetStringFormatDigitSubstitution',  \
    GdipGetStringFormatFlags, <NONE>,  'GdipGetStringFormatFlags',  \
    GdipGetStringFormatHotkeyPrefix, <NONE>,  'GdipGetStringFormatHotkeyPrefix',  \
    GdipGetStringFormatLineAlign, <NONE>,  'GdipGetStringFormatLineAlign',  \
    GdipGetStringFormatMeasurableCharacterRangeCount, <NONE>,  'GdipGetStringFormatMeasurableCharacterRangeCount',  \
    GdipGetStringFormatTabStopCount, <NONE>,  'GdipGetStringFormatTabStopCount',  \
    GdipGetStringFormatTabStops, <NONE>,  'GdipGetStringFormatTabStops',  \
    GdipGetStringFormatTrimming, <NONE>,  'GdipGetStringFormatTrimming',  \
    GdipGetTextContrast, <NONE>,  'GdipGetTextContrast',  \
    GdipGetTextRenderingHint, <NONE>,  'GdipGetTextRenderingHint',  \
    GdipGetTextureImage, <NONE>,  'GdipGetTextureImage',  \
    GdipGetTextureTransform, <NONE>,  'GdipGetTextureTransform',  \
    GdipGetTextureWrapMode, <NONE>,  'GdipGetTextureWrapMode',  \
    GdipGetVisibleClipBounds, <NONE>,  'GdipGetVisibleClipBounds',  \
    GdipGetVisibleClipBoundsI, <NONE>,  'GdipGetVisibleClipBoundsI',  \
    GdipGetWorldTransform, <NONE>,  'GdipGetWorldTransform',  \
    GdipGraphicsClear, <NONE>,  'GdipGraphicsClear',  \
    GdipGraphicsSetAbort, <NONE>,  'GdipGraphicsSetAbort',  \
    GdipImageForceValidation, <NONE>,  'GdipImageForceValidation',  \
    GdipImageGetFrameCount, <NONE>,  'GdipImageGetFrameCount',  \
    GdipImageGetFrameDimensionsCount, <NONE>,  'GdipImageGetFrameDimensionsCount',  \
    GdipImageGetFrameDimensionsList, <NONE>,  'GdipImageGetFrameDimensionsList',  \
    GdipImageRotateFlip, <NONE>,  'GdipImageRotateFlip',  \
    GdipImageSelectActiveFrame, <NONE>,  'GdipImageSelectActiveFrame',  \
    GdipImageSetAbort, <NONE>,  'GdipImageSetAbort',  \
    GdipInitializePalette, <NONE>,  'GdipInitializePalette',  \
    GdipInvertMatrix, <NONE>,  'GdipInvertMatrix',  \
    GdipIsClipEmpty, <NONE>,  'GdipIsClipEmpty',  \
    GdipIsEmptyRegion, <NONE>,  'GdipIsEmptyRegion',  \
    GdipIsEqualRegion, <NONE>,  'GdipIsEqualRegion',  \
    GdipIsInfiniteRegion, <NONE>,  'GdipIsInfiniteRegion',  \
    GdipIsMatrixEqual, <NONE>,  'GdipIsMatrixEqual',  \
    GdipIsMatrixIdentity, <NONE>,  'GdipIsMatrixIdentity',  \
    GdipIsMatrixInvertible, <NONE>,  'GdipIsMatrixInvertible',  \
    GdipIsOutlineVisiblePathPoint, <NONE>,  'GdipIsOutlineVisiblePathPoint',  \
    GdipIsOutlineVisiblePathPointI, <NONE>,  'GdipIsOutlineVisiblePathPointI',  \
    GdipIsStyleAvailable, <NONE>,  'GdipIsStyleAvailable',  \
    GdipIsVisibleClipEmpty, <NONE>,  'GdipIsVisibleClipEmpty',  \
    GdipIsVisiblePathPoint, <NONE>,  'GdipIsVisiblePathPoint',  \
    GdipIsVisiblePathPointI, <NONE>,  'GdipIsVisiblePathPointI',  \
    GdipIsVisiblePoint, <NONE>,  'GdipIsVisiblePoint',  \
    GdipIsVisiblePointI, <NONE>,  'GdipIsVisiblePointI',  \
    GdipIsVisibleRect, <NONE>,  'GdipIsVisibleRect',  \
    GdipIsVisibleRectI, <NONE>,  'GdipIsVisibleRectI',  \
    GdipIsVisibleRegionPoint, <NONE>,  'GdipIsVisibleRegionPoint',  \
    GdipIsVisibleRegionPointI, <NONE>,  'GdipIsVisibleRegionPointI',  \
    GdipIsVisibleRegionRect, <NONE>,  'GdipIsVisibleRegionRect',  \
    GdipIsVisibleRegionRectI, <NONE>,  'GdipIsVisibleRegionRectI',  \
    GdipLoadImageFromFile, <NONE>,  'GdipLoadImageFromFile',  \
    GdipLoadImageFromFileICM, <NONE>,  'GdipLoadImageFromFileICM',  \
    GdipLoadImageFromStream, <NONE>,  'GdipLoadImageFromStream',  \
    GdipLoadImageFromStreamICM, <NONE>,  'GdipLoadImageFromStreamICM',  \
    GdipMeasureCharacterRanges, <NONE>,  'GdipMeasureCharacterRanges',  \
    GdipMeasureDriverString, <NONE>,  'GdipMeasureDriverString',  \
    GdipMeasureString, <NONE>,  'GdipMeasureString',  \
    GdipMultiplyLineTransform, <NONE>,  'GdipMultiplyLineTransform',  \
    GdipMultiplyMatrix, <NONE>,  'GdipMultiplyMatrix',  \
    GdipMultiplyPathGradientTransform, <NONE>,  'GdipMultiplyPathGradientTransform',  \
    GdipMultiplyPenTransform, <NONE>,  'GdipMultiplyPenTransform',  \
    GdipMultiplyTextureTransform, <NONE>,  'GdipMultiplyTextureTransform',  \
    GdipMultiplyWorldTransform, <NONE>,  'GdipMultiplyWorldTransform',  \
    GdipNewInstalledFontCollection, <NONE>,  'GdipNewInstalledFontCollection',  \
    GdipNewPrivateFontCollection, <NONE>,  'GdipNewPrivateFontCollection',  \
    GdipPathIterCopyData, <NONE>,  'GdipPathIterCopyData',  \
    GdipPathIterEnumerate, <NONE>,  'GdipPathIterEnumerate',  \
    GdipPathIterGetCount, <NONE>,  'GdipPathIterGetCount',  \
    GdipPathIterGetSubpathCount, <NONE>,  'GdipPathIterGetSubpathCount',  \
    GdipPathIterHasCurve, <NONE>,  'GdipPathIterHasCurve',  \
    GdipPathIterIsValid, <NONE>,  'GdipPathIterIsValid',  \
    GdipPathIterNextMarker, <NONE>,  'GdipPathIterNextMarker',  \
    GdipPathIterNextMarkerPath, <NONE>,  'GdipPathIterNextMarkerPath',  \
    GdipPathIterNextPathType, <NONE>,  'GdipPathIterNextPathType',  \
    GdipPathIterNextSubpath, <NONE>,  'GdipPathIterNextSubpath',  \
    GdipPathIterNextSubpathPath, <NONE>,  'GdipPathIterNextSubpathPath',  \
    GdipPathIterRewind, <NONE>,  'GdipPathIterRewind',  \
    GdipPlayMetafileRecord, <NONE>,  'GdipPlayMetafileRecord',  \
    GdipPlayTSClientRecord, <NONE>,  'GdipPlayTSClientRecord',  \
    GdipPrivateAddFontFile, <NONE>,  'GdipPrivateAddFontFile',  \
    GdipPrivateAddMemoryFont, <NONE>,  'GdipPrivateAddMemoryFont',  \
    GdipRecordMetafile, <NONE>,  'GdipRecordMetafile',  \
    GdipRecordMetafileFileName, <NONE>,  'GdipRecordMetafileFileName',  \
    GdipRecordMetafileFileNameI, <NONE>,  'GdipRecordMetafileFileNameI',  \
    GdipRecordMetafileI, <NONE>,  'GdipRecordMetafileI',  \
    GdipRecordMetafileStream, <NONE>,  'GdipRecordMetafileStream',  \
    GdipRecordMetafileStreamI, <NONE>,  'GdipRecordMetafileStreamI',  \
    GdipReleaseDC, <NONE>,  'GdipReleaseDC',  \
    GdipRemovePropertyItem, <NONE>,  'GdipRemovePropertyItem',  \
    GdipResetClip, <NONE>,  'GdipResetClip',  \
    GdipResetImageAttributes, <NONE>,  'GdipResetImageAttributes',  \
    GdipResetLineTransform, <NONE>,  'GdipResetLineTransform',  \
    GdipResetPageTransform, <NONE>,  'GdipResetPageTransform',  \
    GdipResetPath, <NONE>,  'GdipResetPath',  \
    GdipResetPathGradientTransform, <NONE>,  'GdipResetPathGradientTransform',  \
    GdipResetPenTransform, <NONE>,  'GdipResetPenTransform',  \
    GdipResetTextureTransform, <NONE>,  'GdipResetTextureTransform',  \
    GdipResetWorldTransform, <NONE>,  'GdipResetWorldTransform',  \
    GdipRestoreGraphics, <NONE>,  'GdipRestoreGraphics',  \
    GdipReversePath, <NONE>,  'GdipReversePath',  \
    GdipRotateLineTransform, <NONE>,  'GdipRotateLineTransform',  \
    GdipRotateMatrix, <NONE>,  'GdipRotateMatrix',  \
    GdipRotatePathGradientTransform, <NONE>,  'GdipRotatePathGradientTransform',  \
    GdipRotatePenTransform, <NONE>,  'GdipRotatePenTransform',  \
    GdipRotateTextureTransform, <NONE>,  'GdipRotateTextureTransform',  \
    GdipRotateWorldTransform, <NONE>,  'GdipRotateWorldTransform',  \
    GdipSaveAdd, <NONE>,  'GdipSaveAdd',  \
    GdipSaveAddImage, <NONE>,  'GdipSaveAddImage',  \
    GdipSaveGraphics, <NONE>,  'GdipSaveGraphics',  \
    GdipSaveImageToFile, <NONE>,  'GdipSaveImageToFile',  \
    GdipSaveImageToStream, <NONE>,  'GdipSaveImageToStream',  \
    GdipScaleLineTransform, <NONE>,  'GdipScaleLineTransform',  \
    GdipScaleMatrix, <NONE>,  'GdipScaleMatrix',  \
    GdipScalePathGradientTransform, <NONE>,  'GdipScalePathGradientTransform',  \
    GdipScalePenTransform, <NONE>,  'GdipScalePenTransform',  \
    GdipScaleTextureTransform, <NONE>,  'GdipScaleTextureTransform',  \
    GdipScaleWorldTransform, <NONE>,  'GdipScaleWorldTransform',  \
    GdipSetAdjustableArrowCapFillState, <NONE>,  'GdipSetAdjustableArrowCapFillState',  \
    GdipSetAdjustableArrowCapHeight, <NONE>,  'GdipSetAdjustableArrowCapHeight',  \
    GdipSetAdjustableArrowCapMiddleInset, <NONE>,  'GdipSetAdjustableArrowCapMiddleInset',  \
    GdipSetAdjustableArrowCapWidth, <NONE>,  'GdipSetAdjustableArrowCapWidth',  \
    GdipSetClipGraphics, <NONE>,  'GdipSetClipGraphics',  \
    GdipSetClipHrgn, <NONE>,  'GdipSetClipHrgn',  \
    GdipSetClipPath, <NONE>,  'GdipSetClipPath',  \
    GdipSetClipRect, <NONE>,  'GdipSetClipRect',  \
    GdipSetClipRectI, <NONE>,  'GdipSetClipRectI',  \
    GdipSetClipRegion, <NONE>,  'GdipSetClipRegion',  \
    GdipSetCompositingMode, <NONE>,  'GdipSetCompositingMode',  \
    GdipSetCompositingQuality, <NONE>,  'GdipSetCompositingQuality',  \
    GdipSetCustomLineCapBaseCap, <NONE>,  'GdipSetCustomLineCapBaseCap',  \
    GdipSetCustomLineCapBaseInset, <NONE>,  'GdipSetCustomLineCapBaseInset',  \
    GdipSetCustomLineCapStrokeCaps, <NONE>,  'GdipSetCustomLineCapStrokeCaps',  \
    GdipSetCustomLineCapStrokeJoin, <NONE>,  'GdipSetCustomLineCapStrokeJoin',  \
    GdipSetCustomLineCapWidthScale, <NONE>,  'GdipSetCustomLineCapWidthScale',  \
    GdipSetEffectParameters, <NONE>,  'GdipSetEffectParameters',  \
    GdipSetEmpty, <NONE>,  'GdipSetEmpty',  \
    GdipSetImageAttributesCachedBackground, <NONE>,  'GdipSetImageAttributesCachedBackground',  \
    GdipSetImageAttributesColorKeys, <NONE>,  'GdipSetImageAttributesColorKeys',  \
    GdipSetImageAttributesColorMatrix, <NONE>,  'GdipSetImageAttributesColorMatrix',  \
    GdipSetImageAttributesGamma, <NONE>,  'GdipSetImageAttributesGamma',  \
    GdipSetImageAttributesNoOp, <NONE>,  'GdipSetImageAttributesNoOp',  \
    GdipSetImageAttributesOutputChannel, <NONE>,  'GdipSetImageAttributesOutputChannel',  \
    GdipSetImageAttributesOutputChannelColorProfile, <NONE>,  'GdipSetImageAttributesOutputChannelColorProfile',  \
    GdipSetImageAttributesRemapTable, <NONE>,  'GdipSetImageAttributesRemapTable',  \
    GdipSetImageAttributesThreshold, <NONE>,  'GdipSetImageAttributesThreshold',  \
    GdipSetImageAttributesToIdentity, <NONE>,  'GdipSetImageAttributesToIdentity',  \
    GdipSetImageAttributesWrapMode, <NONE>,  'GdipSetImageAttributesWrapMode',  \
    GdipSetImagePalette, <NONE>,  'GdipSetImagePalette',  \
    GdipSetInfinite, <NONE>,  'GdipSetInfinite',  \
    GdipSetInterpolationMode, <NONE>,  'GdipSetInterpolationMode',  \
    GdipSetLineBlend, <NONE>,  'GdipSetLineBlend',  \
    GdipSetLineColors, <NONE>,  'GdipSetLineColors',  \
    GdipSetLineGammaCorrection, <NONE>,  'GdipSetLineGammaCorrection',  \
    GdipSetLineLinearBlend, <NONE>,  'GdipSetLineLinearBlend',  \
    GdipSetLinePresetBlend, <NONE>,  'GdipSetLinePresetBlend',  \
    GdipSetLineSigmaBlend, <NONE>,  'GdipSetLineSigmaBlend',  \
    GdipSetLineTransform, <NONE>,  'GdipSetLineTransform',  \
    GdipSetLineWrapMode, <NONE>,  'GdipSetLineWrapMode',  \
    GdipSetMatrixElements, <NONE>,  'GdipSetMatrixElements',  \
    GdipSetMetafileDownLevelRasterizationLimit, <NONE>,  'GdipSetMetafileDownLevelRasterizationLimit',  \
    GdipSetPageScale, <NONE>,  'GdipSetPageScale',  \
    GdipSetPageUnit, <NONE>,  'GdipSetPageUnit',  \
    GdipSetPathFillMode, <NONE>,  'GdipSetPathFillMode',  \
    GdipSetPathGradientBlend, <NONE>,  'GdipSetPathGradientBlend',  \
    GdipSetPathGradientCenterColor, <NONE>,  'GdipSetPathGradientCenterColor',  \
    GdipSetPathGradientCenterPoint, <NONE>,  'GdipSetPathGradientCenterPoint',  \
    GdipSetPathGradientCenterPointI, <NONE>,  'GdipSetPathGradientCenterPointI',  \
    GdipSetPathGradientFocusScales, <NONE>,  'GdipSetPathGradientFocusScales',  \
    GdipSetPathGradientGammaCorrection, <NONE>,  'GdipSetPathGradientGammaCorrection',  \
    GdipSetPathGradientLinearBlend, <NONE>,  'GdipSetPathGradientLinearBlend',  \
    GdipSetPathGradientPath, <NONE>,  'GdipSetPathGradientPath',  \
    GdipSetPathGradientPresetBlend, <NONE>,  'GdipSetPathGradientPresetBlend',  \
    GdipSetPathGradientSigmaBlend, <NONE>,  'GdipSetPathGradientSigmaBlend',  \
    GdipSetPathGradientSurroundColorsWithCount, <NONE>,  'GdipSetPathGradientSurroundColorsWithCount',  \
    GdipSetPathGradientTransform, <NONE>,  'GdipSetPathGradientTransform',  \
    GdipSetPathGradientWrapMode, <NONE>,  'GdipSetPathGradientWrapMode',  \
    GdipSetPathMarker, <NONE>,  'GdipSetPathMarker',  \
    GdipSetPenBrushFill, <NONE>,  'GdipSetPenBrushFill',  \
    GdipSetPenColor, <NONE>,  'GdipSetPenColor',  \
    GdipSetPenCompoundArray, <NONE>,  'GdipSetPenCompoundArray',  \
    GdipSetPenCustomEndCap, <NONE>,  'GdipSetPenCustomEndCap',  \
    GdipSetPenCustomStartCap, <NONE>,  'GdipSetPenCustomStartCap',  \
    GdipSetPenDashArray, <NONE>,  'GdipSetPenDashArray',  \
    GdipSetPenDashCap197819, <NONE>,  'GdipSetPenDashCap197819',  \
    GdipSetPenDashOffset, <NONE>,  'GdipSetPenDashOffset',  \
    GdipSetPenDashStyle, <NONE>,  'GdipSetPenDashStyle',  \
    GdipSetPenEndCap, <NONE>,  'GdipSetPenEndCap',  \
    GdipSetPenLineCap197819, <NONE>,  'GdipSetPenLineCap197819',  \
    GdipSetPenLineJoin, <NONE>,  'GdipSetPenLineJoin',  \
    GdipSetPenMiterLimit, <NONE>,  'GdipSetPenMiterLimit',  \
    GdipSetPenMode, <NONE>,  'GdipSetPenMode',  \
    GdipSetPenStartCap, <NONE>,  'GdipSetPenStartCap',  \
    GdipSetPenTransform, <NONE>,  'GdipSetPenTransform',  \
    GdipSetPenUnit, <NONE>,  'GdipSetPenUnit',  \
    GdipSetPenWidth, <NONE>,  'GdipSetPenWidth',  \
    GdipSetPixelOffsetMode, <NONE>,  'GdipSetPixelOffsetMode',  \
    GdipSetPropertyItem, <NONE>,  'GdipSetPropertyItem',  \
    GdipSetRenderingOrigin, <NONE>,  'GdipSetRenderingOrigin',  \
    GdipSetSmoothingMode, <NONE>,  'GdipSetSmoothingMode',  \
    GdipSetSolidFillColor, <NONE>,  'GdipSetSolidFillColor',  \
    GdipSetStringFormatAlign, <NONE>,  'GdipSetStringFormatAlign',  \
    GdipSetStringFormatDigitSubstitution, <NONE>,  'GdipSetStringFormatDigitSubstitution',  \
    GdipSetStringFormatFlags, <NONE>,  'GdipSetStringFormatFlags',  \
    GdipSetStringFormatHotkeyPrefix, <NONE>,  'GdipSetStringFormatHotkeyPrefix',  \
    GdipSetStringFormatLineAlign, <NONE>,  'GdipSetStringFormatLineAlign',  \
    GdipSetStringFormatMeasurableCharacterRanges, <NONE>,  'GdipSetStringFormatMeasurableCharacterRanges',  \
    GdipSetStringFormatTabStops, <NONE>,  'GdipSetStringFormatTabStops',  \
    GdipSetStringFormatTrimming, <NONE>,  'GdipSetStringFormatTrimming',  \
    GdipSetTextContrast, <NONE>,  'GdipSetTextContrast',  \
    GdipSetTextRenderingHint, <NONE>,  'GdipSetTextRenderingHint',  \
    GdipSetTextureTransform, <NONE>,  'GdipSetTextureTransform',  \
    GdipSetTextureWrapMode, <NONE>,  'GdipSetTextureWrapMode',  \
    GdipSetWorldTransform, <NONE>,  'GdipSetWorldTransform',  \
    GdipShearMatrix, <NONE>,  'GdipShearMatrix',  \
    GdipStartPathFigure, <NONE>,  'GdipStartPathFigure',  \
    GdipStringFormatGetGenericDefault, <NONE>,  'GdipStringFormatGetGenericDefault',  \
    GdipStringFormatGetGenericTypographic, <NONE>,  'GdipStringFormatGetGenericTypographic',  \
    GdipTestControl, <NONE>,  'GdipTestControl',  \
    GdipTransformMatrixPoints, <NONE>,  'GdipTransformMatrixPoints',  \
    GdipTransformMatrixPointsI, <NONE>,  'GdipTransformMatrixPointsI',  \
    GdipTransformPath, <NONE>,  'GdipTransformPath',  \
    GdipTransformPoints, <NONE>,  'GdipTransformPoints',  \
    GdipTransformPointsI, <NONE>,  'GdipTransformPointsI',  \
    GdipTransformRegion, <NONE>,  'GdipTransformRegion',  \
    GdipTranslateClip, <NONE>,  'GdipTranslateClip',  \
    GdipTranslateClipI, <NONE>,  'GdipTranslateClipI',  \
    GdipTranslateLineTransform, <NONE>,  'GdipTranslateLineTransform',  \
    GdipTranslateMatrix, <NONE>,  'GdipTranslateMatrix',  \
    GdipTranslatePathGradientTransform, <NONE>,  'GdipTranslatePathGradientTransform',  \
    GdipTranslatePenTransform, <NONE>,  'GdipTranslatePenTransform',  \
    GdipTranslateRegion, <NONE>,  'GdipTranslateRegion',  \
    GdipTranslateRegionI, <NONE>,  'GdipTranslateRegionI',  \
    GdipTranslateTextureTransform, <NONE>,  'GdipTranslateTextureTransform',  \
    GdipTranslateWorldTransform, <NONE>,  'GdipTranslateWorldTransform',  \
    GdipVectorTransformMatrixPoints, <NONE>,  'GdipVectorTransformMatrixPoints',  \
    GdipVectorTransformMatrixPointsI, <NONE>,  'GdipVectorTransformMatrixPointsI',  \
    GdipWarpPath, <NONE>,  'GdipWarpPath',  \
    GdipWidenPath, <NONE>,  'GdipWidenPath',  \
    GdipWindingModeOutline, <NONE>,  'GdipWindingModeOutline',  \
    GdiplusNotificationHook, <NONE>,  'GdiplusNotificationHook',  \
    GdiplusNotificationUnhook, <NONE>,  'GdiplusNotificationUnhook',  \
    GdiplusShutdown, <NONE>,  'GdiplusShutdown',  \
    GdiplusStartup, <NONE>,  'GdiplusStartup'

Added freshlib/imports/Win32/kernel32.inc.























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: kernel32.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto kernel32,  \
    ActivateActCtx, <NONE>,  'ActivateActCtx',  \
    AddAtomA, <.lpString>,  'AddAtomA',  \
    AddAtomW, <.lpString>,  'AddAtomW',  \
    AddConsoleAliasA, <NONE>,  'AddConsoleAliasA',  \
    AddConsoleAliasW, <NONE>,  'AddConsoleAliasW',  \
    AddLocalAlternateComputerNameA, <NONE>,  'AddLocalAlternateComputerNameA',  \
    AddLocalAlternateComputerNameW, <NONE>,  'AddLocalAlternateComputerNameW',  \
    AddRefActCtx, <NONE>,  'AddRefActCtx',  \
    AddVectoredExceptionHandler, <NONE>,  'AddVectoredExceptionHandler',  \
    AllocConsole, <VOID>,  'AllocConsole',  \
    AllocateUserPhysicalPages, <.hProcess, .NumberOfPages, .PageArray>,  'AllocateUserPhysicalPages',  \
    AreFileApisANSI, <VOID>,  'AreFileApisANSI',  \
    AssignProcessToJobObject, <.hJob, .hProcess>,  'AssignProcessToJobObject',  \
    AttachConsole, <NONE>,  'AttachConsole',  \
    BackupRead, <.hFile, .lpBuffer, .nNumberOfBytesToRead, .lpNumberOfBytesRead, .bAbort, .bProcessSecurity, .lpContext>,  'BackupRead',  \
    BackupSeek, <.hFile, .dwLowBytesToSeek, .dwHighBytesToSeek, .lpdwLowByteSeeked, .lpdwHighByteSeeked, .lpContext>,  'BackupSeek',  \
    BackupWrite, <.hFile, .lpBuffer, .nNumberOfBytesToWrite, .lpNumberOfBytesWritten, .bAbort, .bProcessSecurity, .lpContext>,  'BackupWrite',  \
    BaseCheckAppcompatCache, <NONE>,  'BaseCheckAppcompatCache',  \
    BaseCleanupAppcompatCache, <NONE>,  'BaseCleanupAppcompatCache',  \
    BaseCleanupAppcompatCacheSupport, <NONE>,  'BaseCleanupAppcompatCacheSupport',  \
    BaseDumpAppcompatCache, <NONE>,  'BaseDumpAppcompatCache',  \
    BaseFlushAppcompatCache, <NONE>,  'BaseFlushAppcompatCache',  \
    BaseInitAppcompatCache, <NONE>,  'BaseInitAppcompatCache',  \
    BaseInitAppcompatCacheSupport, <NONE>,  'BaseInitAppcompatCacheSupport',  \
    BaseProcessInitPostImport, <NONE>,  'BaseProcessInitPostImport',  \
    BaseQueryModuleData, <NONE>,  'BaseQueryModuleData',  \
    BaseUpdateAppcompatCache, <NONE>,  'BaseUpdateAppcompatCache',  \
    BasepCheckWinSaferRestrictions, <NONE>,  'BasepCheckWinSaferRestrictions',  \
    Beep, <.dwFreq, .dwDuration>,  'Beep',  \
    BeginUpdateResourceA, <.pFileName, .bDeleteExistingResources>,  'BeginUpdateResourceA',  \
    BeginUpdateResourceW, <.pFileName, .bDeleteExistingResources>,  'BeginUpdateResourceW',  \
    BindIoCompletionCallback, <.FileHandle, .lFunction, .Flags>,  'BindIoCompletionCallback',  \
    BuildCommDCBA, <.lpDef, .lpDCB>,  'BuildCommDCBA',  \
    BuildCommDCBAndTimeoutsA, <.lpDef, .lpDCB, .lpCommTimeouts>,  'BuildCommDCBAndTimeoutsA',  \
    BuildCommDCBAndTimeoutsW, <.lpDef, .lpDCB, .lpCommTimeouts>,  'BuildCommDCBAndTimeoutsW',  \
    BuildCommDCBW, <.lpDef, .lpDCB>,  'BuildCommDCBW',  \
    CallNamedPipeA, <.lpNamedPipeName, .lpInBuffer, .nInBufferSize, .lpOutBuffer, .nOutBufferSize, .lpBytesRead, .nTimeOut>,  'CallNamedPipeA',  \
    CallNamedPipeW, <.lpNamedPipeName, .lpInBuffer, .nInBufferSize, .lpOutBuffer, .nOutBufferSize, .lpBytesRead, .nTimeOut>,  'CallNamedPipeW',  \
    CancelDeviceWakeupRequest, <.hDevice>,  'CancelDeviceWakeupRequest',  \
    CancelIo, <.hFile>,  'CancelIo',  \
    CancelTimerQueueTimer, <.TimerQueue, .Timer>,  'CancelTimerQueueTimer',  \
    CancelWaitableTimer, <.hTimer>,  'CancelWaitableTimer',  \
    ChangeTimerQueueTimer, <.TimerQueue, .Timer, .DueTime, .Period>,  'ChangeTimerQueueTimer',  \
    CheckNameLegalDOS8Dot3A, <NONE>,  'CheckNameLegalDOS8Dot3A',  \
    CheckNameLegalDOS8Dot3W, <NONE>,  'CheckNameLegalDOS8Dot3W',  \
    CheckRemoteDebuggerPresent, <NONE>,  'CheckRemoteDebuggerPresent',  \
    ClearCommBreak, <.nCid>,  'ClearCommBreak',  \
    ClearCommError, <.hFile, .lpErrors, .lpStat>,  'ClearCommError',  \
    CloseConsoleHandle, <NONE>,  'CloseConsoleHandle',  \
    CloseHandle, <.hObject>,  'CloseHandle',  \
    CloseProfileUserMapping, <NONE>,  'CloseProfileUserMapping',  \
    CmdBatNotification, <NONE>,  'CmdBatNotification',  \
    CommConfigDialogA, <.lpszName, .hWnd, .lpCC>,  'CommConfigDialogA',  \
    CommConfigDialogW, <.lpszName, .hWnd, .lpCC>,  'CommConfigDialogW',  \
    CompareFileTime, <.lpFileTime1, .lpFileTime2>,  'CompareFileTime',  \
    CompareStringA, <.Locale, .dwCmpFlags, .lpString1, .cchCount1, .lpString2, .cchCount2>,  'CompareStringA',  \
    CompareStringW, <.Locale, .dwCmpFlags, .lpString1, .cchCount1, .lpString2, .cchCount2>,  'CompareStringW',  \
    ConnectNamedPipe, <.hNamedPipe, .lpOverlapped>,  'ConnectNamedPipe',  \
    ConsoleMenuControl, <NONE>,  'ConsoleMenuControl',  \
    ContinueDebugEvent, <.dwProcessId, .dwThreadId, .dwContinueStatus>,  'ContinueDebugEvent',  \
    ConvertDefaultLocale, <.Locale>,  'ConvertDefaultLocale',  \
    ConvertFiberToThread, <NONE>,  'ConvertFiberToThread',  \
    ConvertThreadToFiber, <.lpParameter>,  'ConvertThreadToFiber',  \
    CopyFileA, <.lpExistingFileName, .lpNewFileName, .bFailIfExists>,  'CopyFileA',  \
    CopyFileExA, <.lpExistingFileName, .lpNewFileName, .lpProgressRoutine, .lpData, .pbCancel, .dwCopyFlags>,  'CopyFileExA',  \
    CopyFileExW, <.lpExistingFileName, .lpNewFileName, .lpProgressRoutine, .lpData, .pbCancel, .dwCopyFlags>,  'CopyFileExW',  \
    CopyFileW, <.lpExistingFileName, .lpNewFileName, .bFailIfExists>,  'CopyFileW',  \
    CopyLZFile, <.n1, .n2>,  'CopyLZFile',  \
    CreateActCtxA, <NONE>,  'CreateActCtxA',  \
    CreateActCtxW, <NONE>,  'CreateActCtxW',  \
    CreateConsoleScreenBuffer, <.dwDesiredAccess, .dwShareMode, .lpSecurityAttributes, .dwFlags, .lpScreenBufferData>,  'CreateConsoleScreenBuffer',  \
    CreateDirectoryA, <.lpPathName, .lpSecurityAttributes>,  'CreateDirectoryA',  \
    CreateDirectoryExA, <.lpTemplateDirectory, .lpNewDirectory, .lpSecurityAttributes>,  'CreateDirectoryExA',  \
    CreateDirectoryExW, <.lpTemplateDirectory, .lpNewDirectory, .lpSecurityAttributes>,  'CreateDirectoryExW',  \
    CreateDirectoryW, <.lpPathName, .lpSecurityAttributes>,  'CreateDirectoryW',  \
    CreateEventA, <.lpEventAttributes, .bManualReset, .bInitialState, .lpName>,  'CreateEventA',  \
    CreateEventW, <.lpEventAttributes, .bManualReset, .bInitialState, .lpName>,  'CreateEventW',  \
    CreateFiber, <.dwStackSize, .lpStartAddress, .lpParameter>,  'CreateFiber',  \
    CreateFiberEx, <NONE>,  'CreateFiberEx',  \
    CreateFileA, <.lpFileName, .dwDesiredAccess, .dwShareMode, .lpSecurityAttributes, .dwCreationDisposition, .dwFlagsAndAttributes,  \
        .hTemplateFile>,  'CreateFileA',  \
    CreateFileMappingA, <.hFile, .lpFileMappigAttributes, .flProtect, .dwMaximumSizeHigh, .dwMaximumSizeLow, .lpName>,  'CreateFileMappingA',  \
    CreateFileMappingW, <.hFile, .lpFileMappigAttributes, .flProtect, .dwMaximumSizeHigh, .dwMaximumSizeLow, .lpName>,  'CreateFileMappingW',  \
    CreateFileW, <.lpFileName, .dwDesiredAccess, .dwShareMode, .lpSecurityAttributes, .dwCreationDisposition, .dwFlagsAndAttributes,  \
        .hTemplateFile>,  'CreateFileW',  \
    CreateHardLinkA, <.lpFileName, .lpExistingFileName, .lpSecurityAttributes>,  'CreateHardLinkA',  \
    CreateHardLinkW, <.lpFileName, .lpExistingFileName, .lpSecurityAttributes>,  'CreateHardLinkW',  \
    CreateIoCompletionPort, <.FileHandle, .ExistingCompletionPort, .CompletionKey, .NumberOfConcurrentThreads>,  'CreateIoCompletionPort',  \
    CreateJobObjectA, <.lpJobAttributes, .lpName>,  'CreateJobObjectA',  \
    CreateJobObjectW, <.lpJobAttributes, .lpName>,  'CreateJobObjectW',  \
    CreateJobSet, <NONE>,  'CreateJobSet',  \
    CreateMailslotA, <.lpName, .nMaxMessageSize, .lReadTimeout, .lpSecurityAttributes>,  'CreateMailslotA',  \
    CreateMailslotW, <.lpName, .nMaxMessageSize, .lReadTimeout, .lpSecurityAttributes>,  'CreateMailslotW',  \
    CreateMemoryResourceNotification, <NONE>,  'CreateMemoryResourceNotification',  \
    CreateMutexA, <.lpMutexAttributes, .bInitialOwner, .lpName>,  'CreateMutexA',  \
    CreateMutexW, <.lpMutexAttributes, .bInitialOwner, .lpName>,  'CreateMutexW',  \
    CreateNamedPipeA, <.lpName, .dwOpenMode, .dwPipeMode, .nMaxInstances, .nOutBufferSize, .nInBufferSize, .nDefaultTimeOut, .lpSecurityAttributes,  \
      >,  'CreateNamedPipeA',  \
    CreateNamedPipeW, <.lpName, .dwOpenMode, .dwPipeMode, .nMaxInstances, .nOutBufferSize, .nInBufferSize, .nDefaultTimeOut, .lpSecurityAttributes,  \
      >,  'CreateNamedPipeW',  \
    CreateNlsSecurityDescriptor, <NONE>,  'CreateNlsSecurityDescriptor',  \
    CreatePipe, <.phReadPipe, .phWritePipe, .lpPipeAttributes, .nSize>,  'CreatePipe',  \
    CreateProcessA, <.lpApplicationName, .lpCommandLine, .lpProcessAttributes, .lpThreadAttributes, .bInheritHandles, .dwCreationFlags,  \
        .lpEnvironment, .lpCurrentDriectory, .lpStartupInfo, .lpProcessInformation>,  'CreateProcessA',  \
    CreateProcessInternalA, <NONE>,  'CreateProcessInternalA',  \
    CreateProcessInternalW, <NONE>,  'CreateProcessInternalW',  \
    CreateProcessInternalWSecure, <NONE>,  'CreateProcessInternalWSecure',  \
    CreateProcessW, <.lpApplicationName, .lpCommandLine, .lpProcessAttributes, .lpThreadAttributes, .bInheritHandles, .dwCreationFlags,  \
        .lpEnvironment, .lpCurrentDriectory, .lpStartupInfo, .lpProcessInformation>,  'CreateProcessW',  \
    CreateRemoteThread, <.hProcess, .lpThreadAttributes, .dwStackSize, .lpStartAddress, .lpParameter, .dwCreationFlags, .lpThreadId,  \
      >,  'CreateRemoteThread',  \
    CreateSemaphoreA, <.lpSemaphoreAttributes, .lInitialCount, .lMaximumCount, .lpName>,  'CreateSemaphoreA',  \
    CreateSemaphoreW, <.lpSemaphoreAttributes, .lInitialCount, .lMaximumCount, .lpName>,  'CreateSemaphoreW',  \
    CreateSocketHandle, <NONE>,  'CreateSocketHandle',  \
    CreateTapePartition, <.hDevice, .dwPartitionMethod, .dwCount, .dwSize>,  'CreateTapePartition',  \
    CreateThread, <.lpThreadAttributes, .dwStackSize, .lpStartAddress, .lpParameter, .dwCreationFlags, .lpThreadId>,  'CreateThread',  \
    CreateTimerQueue, <VOID>,  'CreateTimerQueue',  \
    CreateTimerQueueTimer, <NONE>,  'CreateTimerQueueTimer',  \
    CreateToolhelp32Snapshot, <.dwFlags, .th32ProcessID>,  'CreateToolhelp32Snapshot',  \
    CreateVirtualBuffer, <NONE>,  'CreateVirtualBuffer',  \
    CreateWaitableTimerA, <.lpTimerAttributes, .bManualReset, .lpTimerName>,  'CreateWaitableTimerA',  \
    CreateWaitableTimerW, <.lpTimerAttributes, .bManualReset, .lpTimerName>,  'CreateWaitableTimerW',  \
    DeactivateActCtx, <NONE>,  'DeactivateActCtx',  \
    DebugActiveProcess, <.dwProcessId>,  'DebugActiveProcess',  \
    DebugActiveProcessStop, <NONE>,  'DebugActiveProcessStop',  \
    DebugBreak, <VOID>,  'DebugBreak',  \
    DebugBreakProcess, <NONE>,  'DebugBreakProcess',  \
    DebugSetProcessKillOnExit, <NONE>,  'DebugSetProcessKillOnExit',  \
    DecodePointer, <NONE>,  'DecodePointer',  \
    DecodeSystemPointer, <NONE>,  'DecodeSystemPointer',  \
    DefineDosDeviceA, <.dwFlags, .lpDeviceName, .lpTargetPath>,  'DefineDosDeviceA',  \
    DefineDosDeviceW, <.dwFlags, .lpDeviceName, .lpTargetPath>,  'DefineDosDeviceW',  \
    DelayLoadFailureHook, <NONE>,  'DelayLoadFailureHook',  \
    DeleteAtom, <.nAtom>,  'DeleteAtom',  \
    DeleteCriticalSection, <.lpCriticalSection>,  'DeleteCriticalSection',  \
    DeleteFiber, <.lpFiber>,  'DeleteFiber',  \
    DeleteFileA, <.lpFileName>,  'DeleteFileA',  \
    DeleteFileW, <.lpFileName>,  'DeleteFileW',  \
    DeleteTimerQueue, <.TimerQueue>,  'DeleteTimerQueue',  \
    DeleteTimerQueueEx, <.TimerQueue, .CompletionEvent>,  'DeleteTimerQueueEx',  \
    DeleteTimerQueueTimer, <.TimerQueue, .Timer, .CompletionEvent>,  'DeleteTimerQueueTimer',  \
    DeleteVolumeMountPointA, <.lpszVolumeMountPoint>,  'DeleteVolumeMountPointA',  \
    DeleteVolumeMountPointW, <.lpszVolumeMountPoint>,  'DeleteVolumeMountPointW',  \
    DeviceIoControl, <.hDevice, .dwIoControlCode, .lpInBuffer, .nInBufferSize, .lpOutBuffer, .nOutBufferSize, .lpBytesReturned, .lpOverlapped,  \
      >,  'DeviceIoControl',  \
    DisableThreadLibraryCalls, <.hLibModule>,  'DisableThreadLibraryCalls',  \
    DisconnectNamedPipe, <.hNamedPipe>,  'DisconnectNamedPipe',  \
    DnsHostnameToComputerNameA, <.Hostname, .ComputerName, .nSize>,  'DnsHostnameToComputerNameA',  \
    DnsHostnameToComputerNameW, <.Hostname, .ComputerName, .nSize>,  'DnsHostnameToComputerNameW',  \
    DosDateTimeToFileTime, <.wFatDate, .wFatTime, .lpFileTime>,  'DosDateTimeToFileTime',  \
    DosPathToSessionPathA, <.SessionId, .pInPath, .ppOutPath>,  'DosPathToSessionPathA',  \
    DosPathToSessionPathW, <.SessionId, .pInPath, .ppOutPath>,  'DosPathToSessionPathW',  \
    DuplicateConsoleHandle, <NONE>,  'DuplicateConsoleHandle',  \
    DuplicateHandle, <.hSourceProcessHandle, .hSourceHandle, .hTargetProcessHandle, .lpTargetHandle, .dwDesiredAccess, .bInheritHandle,  \
        .dwOptions>,  'DuplicateHandle',  \
    EncodePointer, <NONE>,  'EncodePointer',  \
    EncodeSystemPointer, <NONE>,  'EncodeSystemPointer',  \
    EndUpdateResourceA, <.hUpdate, .fDiscard>,  'EndUpdateResourceA',  \
    EndUpdateResourceW, <.hUpdate, .fDiscard>,  'EndUpdateResourceW',  \
    EnterCriticalSection, <.lpCriticalSection>,  'EnterCriticalSection',  \
    EnumCalendarInfoA, <.lpCalInfoEnumProc, .Locale, .Calendar, .CalType>,  'EnumCalendarInfoA',  \
    EnumCalendarInfoExA, <.lpCalInfoEnumProcEx, .Locale, .Calendar, .CalType>,  'EnumCalendarInfoExA',  \
    EnumCalendarInfoExW, <.lpCalInfoEnumProcEx, .Locale, .Calendar, .CalType>,  'EnumCalendarInfoExW',  \
    EnumCalendarInfoW, <.lpCalInfoEnumProc, .Locale, .Calendar, .CalType>,  'EnumCalendarInfoW',  \
    EnumDateFormatsA, <.lpDateFmtEnumProc, .Locale, .dwFlags>,  'EnumDateFormatsA',  \
    EnumDateFormatsExA, <.lpDateFmtEnumProcEx, .Locale, .dwFlags>,  'EnumDateFormatsExA',  \
    EnumDateFormatsExW, <.lpDateFmtEnumProcEx, .Locale, .dwFlags>,  'EnumDateFormatsExW',  \
    EnumDateFormatsW, <.lpDateFmtEnumProc, .Locale, .dwFlags>,  'EnumDateFormatsW',  \
    EnumLanguageGroupLocalesA, <.lpLangGroupLocaleEnumProc, .LanguageGroup, .dwFlags, .lParam>,  'EnumLanguageGroupLocalesA',  \
    EnumLanguageGroupLocalesW, <.lpLangGroupLocaleEnumProc, .LanguageGroup, .dwFlags, .lParam>,  'EnumLanguageGroupLocalesW',  \
    EnumResourceLanguagesA, <.hModule, .lpType, .lpName, .lpEnumFunc, .lParam>,  'EnumResourceLanguagesA',  \
    EnumResourceLanguagesW, <.hModule, .lpType, .lpName, .lpEnumFunc, .lParam>,  'EnumResourceLanguagesW',  \
    EnumResourceNamesA, <.hModule, .lpType, .lpEnumFunc, .lParam>,  'EnumResourceNamesA',  \
    EnumResourceNamesW, <.hModule, .lpType, .lpEnumFunc, .lParam>,  'EnumResourceNamesW',  \
    EnumResourceTypesA, <.hModule, .lpEnumFunc, .lParam>,  'EnumResourceTypesA',  \
    EnumResourceTypesW, <.hModule, .lpEnumFunc, .lParam>,  'EnumResourceTypesW',  \
    EnumSystemCodePagesA, <.lpCodePageEnumProc, .dwFlags>,  'EnumSystemCodePagesA',  \
    EnumSystemCodePagesW, <.lpCodePageEnumProc, .dwFlags>,  'EnumSystemCodePagesW',  \
    EnumSystemGeoID, <NONE>,  'EnumSystemGeoID',  \
    EnumSystemLanguageGroupsA, <.lpLanguageGroupEnumProc, .dwFlags, .lParam>,  'EnumSystemLanguageGroupsA',  \
    EnumSystemLanguageGroupsW, <.lpLanguageGroupEnumProc, .dwFlags, .lParam>,  'EnumSystemLanguageGroupsW',  \
    EnumSystemLocalesA, <.lpLocaleEnumProc, .dwFlags>,  'EnumSystemLocalesA',  \
    EnumSystemLocalesW, <.lpLocaleEnumProc, .dwFlags>,  'EnumSystemLocalesW',  \
    EnumTimeFormatsA, <.lpTimeFmtEnumProc, .Locale, .dwFlags>,  'EnumTimeFormatsA',  \
    EnumTimeFormatsW, <.lpTimeFmtEnumProc, .Locale, .dwFlags>,  'EnumTimeFormatsW',  \
    EnumUILanguagesA, <.lpUILanguageEnumProc, .dwFlags, .lParam>,  'EnumUILanguagesA',  \
    EnumUILanguagesW, <.lpUILanguageEnumProc, .dwFlags, .lParam>,  'EnumUILanguagesW',  \
    EnumerateLocalComputerNamesA, <NONE>,  'EnumerateLocalComputerNamesA',  \
    EnumerateLocalComputerNamesW, <NONE>,  'EnumerateLocalComputerNamesW',  \
    EraseTape, <.hDevice, .dwEraseType, .bimmediate>,  'EraseTape',  \
    EscapeCommFunction, <.nCid, .nFunc>,  'EscapeCommFunction',  \
    ExitProcess, <.uExitCode>,  'ExitProcess',  \
    ExitThread, <.dwExitCode>,  'ExitThread',  \
    ExitVDM, <NONE>,  'ExitVDM',  \
    ExpandEnvironmentStringsA, <.lpSrc, .lpDst, .nSize>,  'ExpandEnvironmentStringsA',  \
    ExpandEnvironmentStringsW, <.lpSrc, .lpDst, .nSize>,  'ExpandEnvironmentStringsW',  \
    ExpungeConsoleCommandHistoryA, <NONE>,  'ExpungeConsoleCommandHistoryA',  \
    ExpungeConsoleCommandHistoryW, <NONE>,  'ExpungeConsoleCommandHistoryW',  \
    ExtendVirtualBuffer, <NONE>,  'ExtendVirtualBuffer',  \
    FatalAppExitA, <.uAction, .lpMessageText>,  'FatalAppExitA',  \
    FatalAppExitW, <.uAction, .lpMessageText>,  'FatalAppExitW',  \
    FatalExit, <.code>,  'FatalExit',  \
    FileTimeToDosDateTime, <.lpFileTime, .lpFatDate, .lpFatTime>,  'FileTimeToDosDateTime',  \
    FileTimeToLocalFileTime, <.lpFileTime, .lpLocalFileTime>,  'FileTimeToLocalFileTime',  \
    FileTimeToSystemTime, <.lpFileTime, .lpSystemTime>,  'FileTimeToSystemTime',  \
    FillConsoleOutputAttribute, <.hConsoleOutput, .wAttribute, .nLength, .dwWriteCoord, .lpNumberOfAttrsWritten>,  'FillConsoleOutputAttribute',  \
    FillConsoleOutputCharacterA, <.hConsoleOutput, .cCharacter, .nLength, .dwWriteCoord, .lpNumberOfCharsWritten>,  'FillConsoleOutputCharacterA',  \
    FillConsoleOutputCharacterW, <.hConsoleOutput, .cCharacter, .nLength, .dwWriteCoord, .lpNumberOfCharsWritten>,  'FillConsoleOutputCharacterW',  \
    FindActCtxSectionGuid, <NONE>,  'FindActCtxSectionGuid',  \
    FindActCtxSectionStringA, <NONE>,  'FindActCtxSectionStringA',  \
    FindActCtxSectionStringW, <NONE>,  'FindActCtxSectionStringW',  \
    FindAtomA, <.lpString>,  'FindAtomA',  \
    FindAtomW, <.lpString>,  'FindAtomW',  \
    FindClose, <.hFindFile>,  'FindClose',  \
    FindCloseChangeNotification, <.hChangeHandle>,  'FindCloseChangeNotification',  \
    FindFirstChangeNotificationA, <.lpPathName, .bWatchSubtree, .dwNotifyFilter>,  'FindFirstChangeNotificationA',  \
    FindFirstChangeNotificationW, <.lpPathName, .bWatchSubtree, .dwNotifyFilter>,  'FindFirstChangeNotificationW',  \
    FindFirstFileA, <.lpFileName, .lpFindFileData>,  'FindFirstFileA',  \
    FindFirstFileExA, <.lpFileName, .fInfoLevelId, .lpFindFileData, .fSearchOp, .lpSearchFilter, .dwAdditionalFlags>,  'FindFirstFileExA',  \
    FindFirstFileExW, <.lpFileName, .fInfoLevelId, .lpFindFileData, .fSearchOp, .lpSearchFilter, .dwAdditionalFlags>,  'FindFirstFileExW',  \
    FindFirstFileW, <.lpFileName, .lpFindFileData>,  'FindFirstFileW',  \
    FindFirstVolumeA, <.lpszVolumeName, .cchBufferLength>,  'FindFirstVolumeA',  \
    FindFirstVolumeMountPointA, <.lpszRootPathName, .lpszVolumeMountPoint, .cchBufferLength>,  'FindFirstVolumeMountPointA',  \
    FindFirstVolumeMountPointW, <.lpszRootPathName, .lpszVolumeMountPoint, .cchBufferLength>,  'FindFirstVolumeMountPointW',  \
    FindFirstVolumeW, <.lpszVolumeName, .cchBufferLength>,  'FindFirstVolumeW',  \
    FindNextChangeNotification, <.hChangeHandle>,  'FindNextChangeNotification',  \
    FindNextFileA, <.hFindFile, .lpFindFileData>,  'FindNextFileA',  \
    FindNextFileW, <.hFindFile, .lpFindFileData>,  'FindNextFileW',  \
    FindNextVolumeA, <.hFindVolume, .lpszVolumeName, .cchBufferLength>,  'FindNextVolumeA',  \
    FindNextVolumeMountPointA, <.hFindVolumeMountPoint, .lpszVolumeMountPoint, .cchBufferLength>,  'FindNextVolumeMountPointA',  \
    FindNextVolumeMountPointW, <.hFindVolumeMountPoint, .lpszVolumeMountPoint, .cchBufferLength>,  'FindNextVolumeMountPointW',  \
    FindNextVolumeW, <.hFindVolume, .lpszVolumeName, .cchBufferLength>,  'FindNextVolumeW',  \
    FindResourceA, <.hInstance, .lpName, .lpType>,  'FindResourceA',  \
    FindResourceExA, <.hModule, .lpType, .lpName, .wLanguage>,  'FindResourceExA',  \
    FindResourceExW, <.hModule, .lpType, .lpName, .wLanguage>,  'FindResourceExW',  \
    FindResourceW, <.hInstance, .lpName, .lpType>,  'FindResourceW',  \
    FindVolumeClose, <.hFindVolume>,  'FindVolumeClose',  \
    FindVolumeMountPointClose, <.hFindVolumeMountPoint>,  'FindVolumeMountPointClose',  \
    FlushConsoleInputBuffer, <.hConsoleInput>,  'FlushConsoleInputBuffer',  \
    FlushFileBuffers, <.hFile>,  'FlushFileBuffers',  \
    FlushInstructionCache, <.hProcess, .lpBaseAddress, .dwSize>,  'FlushInstructionCache',  \
    FlushViewOfFile, <.lpBaseAddress, .dwNumberOfBytesToFlush>,  'FlushViewOfFile',  \
    FoldStringA, <.dwMapFlags, .lpSrcStr, .cchSrc, .lpDestStr, .cchDest>,  'FoldStringA',  \
    FoldStringW, <.dwMapFlags, .lpSrcStr, .cchSrc, .lpDestStr, .cchDest>,  'FoldStringW',  \
    FormatMessageA, <.dwFlags, .lpSource, .dwMessageId, .dwLanguageId, .lpBuffer, .nSize, .Arguments>,  'FormatMessageA',  \
    FormatMessageW, <.dwFlags, .lpSource, .dwMessageId, .dwLanguageId, .lpBuffer, .nSize, .Arguments>,  'FormatMessageW',  \
    FreeConsole, <VOID>,  'FreeConsole',  \
    FreeEnvironmentStringsA, <.lpsz>,  'FreeEnvironmentStringsA',  \
    FreeEnvironmentStringsW, <.lpsz>,  'FreeEnvironmentStringsW',  \
    FreeLibrary, <.hLibModule>,  'FreeLibrary',  \
    FreeLibraryAndExitThread, <.hLibModule, .dwExitCode>,  'FreeLibraryAndExitThread',  \
    FreeResource, <.hResData>,  'FreeResource',  \
    FreeUserPhysicalPages, <.hProcess, .NumberOfPages, .PageArray>,  'FreeUserPhysicalPages',  \
    FreeVirtualBuffer, <NONE>,  'FreeVirtualBuffer',  \
    GenerateConsoleCtrlEvent, <.dwCtrlEvent, .dwProcessGroupId>,  'GenerateConsoleCtrlEvent',  \
    GetACP, <VOID>,  'GetACP',  \
    GetAtomNameA, <.nAtom, .lpBuffer, .nSize>,  'GetAtomNameA',  \
    GetAtomNameW, <.nAtom, .lpBuffer, .nSize>,  'GetAtomNameW',  \
    GetBinaryType, <.lpApplicationName, .lpBinaryType>,  'GetBinaryType',  \
    GetBinaryTypeA, <.lpApplicationName, .lpBinaryType>,  'GetBinaryTypeA',  \
    GetBinaryTypeW, <.lpApplicationName, .lpBinaryType>,  'GetBinaryTypeW',  \
    GetCPFileNameFromRegistry, <NONE>,  'GetCPFileNameFromRegistry',  \
    GetCPInfo, <.CodePage, .lpCPInfo>,  'GetCPInfo',  \
    GetCPInfoExA, <.CodePage, .dwFlags, .lpCPInfoEx>,  'GetCPInfoExA',  \
    GetCPInfoExW, <.CodePage, .dwFlags, .lpCPInfoEx>,  'GetCPInfoExW',  \
    GetCalendarInfoA, <.Locale, .Calendar, .CalType, .lpCalData, .cchData, .lpValue>,  'GetCalendarInfoA',  \
    GetCalendarInfoW, <.Locale, .Calendar, .CalType, .lpCalData, .cchData, .lpValue>,  'GetCalendarInfoW',  \
    GetComPlusPackageInstallStatus, <NONE>,  'GetComPlusPackageInstallStatus',  \
    GetCommConfig, <.hCommDev, .lpCC, .lpdwSize>,  'GetCommConfig',  \
    GetCommMask, <.hFile, .lpEvtMask>,  'GetCommMask',  \
    GetCommModemStatus, <.hFile, .lpModemStat>,  'GetCommModemStatus',  \
    GetCommProperties, <.hFile, .lpCommProp>,  'GetCommProperties',  \
    GetCommState, <.nCid, .lpDCB>,  'GetCommState',  \
    GetCommTimeouts, <.hFile, .lpCommTimeouts>,  'GetCommTimeouts',  \
    GetCommandLineA, <VOID>,  'GetCommandLineA',  \
    GetCommandLineW, <VOID>,  'GetCommandLineW',  \
    GetCompressedFileSizeA, <.lpFileName, .lpFileSizeHigh>,  'GetCompressedFileSizeA',  \
    GetCompressedFileSizeW, <.lpFileName, .lpFileSizeHigh>,  'GetCompressedFileSizeW',  \
    GetComputerNameA, <.lpBuffer, .nSize>,  'GetComputerNameA',  \
    GetComputerNameExA, <.NameType, .lpBuffer, .nSize>,  'GetComputerNameExA',  \
    GetComputerNameExW, <.NameType, .lpBuffer, .nSize>,  'GetComputerNameExW',  \
    GetComputerNameW, <.lpBuffer, .nSize>,  'GetComputerNameW',  \
    GetConsoleAliasA, <NONE>,  'GetConsoleAliasA',  \
    GetConsoleAliasExesA, <NONE>,  'GetConsoleAliasExesA',  \
    GetConsoleAliasExesLengthA, <NONE>,  'GetConsoleAliasExesLengthA',  \
    GetConsoleAliasExesLengthW, <NONE>,  'GetConsoleAliasExesLengthW',  \
    GetConsoleAliasExesW, <NONE>,  'GetConsoleAliasExesW',  \
    GetConsoleAliasW, <NONE>,  'GetConsoleAliasW',  \
    GetConsoleAliasesA, <NONE>,  'GetConsoleAliasesA',  \
    GetConsoleAliasesLengthA, <NONE>,  'GetConsoleAliasesLengthA',  \
    GetConsoleAliasesLengthW, <NONE>,  'GetConsoleAliasesLengthW',  \
    GetConsoleAliasesW, <NONE>,  'GetConsoleAliasesW',  \
    GetConsoleCP, <VOID>,  'GetConsoleCP',  \
    GetConsoleCharType, <NONE>,  'GetConsoleCharType',  \
    GetConsoleCommandHistoryA, <NONE>,  'GetConsoleCommandHistoryA',  \
    GetConsoleCommandHistoryLengthA, <NONE>,  'GetConsoleCommandHistoryLengthA',  \
    GetConsoleCommandHistoryLengthW, <NONE>,  'GetConsoleCommandHistoryLengthW',  \
    GetConsoleCommandHistoryW, <NONE>,  'GetConsoleCommandHistoryW',  \
    GetConsoleCursorInfo, <.hConsoleOutput, .lpConsoleCursorInfo>,  'GetConsoleCursorInfo',  \
    GetConsoleCursorMode, <NONE>,  'GetConsoleCursorMode',  \
    GetConsoleDisplayMode, <NONE>,  'GetConsoleDisplayMode',  \
    GetConsoleFontInfo, <NONE>,  'GetConsoleFontInfo',  \
    GetConsoleFontSize, <NONE>,  'GetConsoleFontSize',  \
    GetConsoleHardwareState, <NONE>,  'GetConsoleHardwareState',  \
    GetConsoleInputExeNameA, <NONE>,  'GetConsoleInputExeNameA',  \
    GetConsoleInputExeNameW, <NONE>,  'GetConsoleInputExeNameW',  \
    GetConsoleInputWaitHandle, <NONE>,  'GetConsoleInputWaitHandle',  \
    GetConsoleKeyboardLayoutNameA, <NONE>,  'GetConsoleKeyboardLayoutNameA',  \
    GetConsoleKeyboardLayoutNameW, <NONE>,  'GetConsoleKeyboardLayoutNameW',  \
    GetConsoleMode, <.hConsoleHandle, .lpMode>,  'GetConsoleMode',  \
    GetConsoleNlsMode, <NONE>,  'GetConsoleNlsMode',  \
    GetConsoleOutputCP, <VOID>,  'GetConsoleOutputCP',  \
    GetConsoleProcessList, <NONE>,  'GetConsoleProcessList',  \
    GetConsoleScreenBufferInfo, <.hConsoleOutput, .lpConsoleScreenBufferInfo>,  'GetConsoleScreenBufferInfo',  \
    GetConsoleSelectionInfo, <NONE>,  'GetConsoleSelectionInfo',  \
    GetConsoleTitleA, <.lpConsoleTitle, .nSize>,  'GetConsoleTitleA',  \
    GetConsoleTitleW, <.lpConsoleTitle, .nSize>,  'GetConsoleTitleW',  \
    GetConsoleWindow, <NONE>,  'GetConsoleWindow',  \
    GetCurrencyFormatA, <.Locale, .dwFlags, .lpValue, .lpFormat, .lpCurrencyStr, .cchCurrency>,  'GetCurrencyFormatA',  \
    GetCurrencyFormatW, <.Locale, .dwFlags, .lpValue, .lpFormat, .lpCurrencyStr, .cchCurrency>,  'GetCurrencyFormatW',  \
    GetCurrentActCtx, <NONE>,  'GetCurrentActCtx',  \
    GetCurrentConsoleFont, <NONE>,  'GetCurrentConsoleFont',  \
    GetCurrentDirectoryA, <.nBufferLength, .lpBuffer>,  'GetCurrentDirectoryA',  \
    GetCurrentDirectoryW, <.nBufferLength, .lpBuffer>,  'GetCurrentDirectoryW',  \
    GetCurrentProcess, <VOID>,  'GetCurrentProcess',  \
    GetCurrentProcessId, <VOID>,  'GetCurrentProcessId',  \
    GetCurrentThread, <VOID>,  'GetCurrentThread',  \
    GetCurrentThreadId, <VOID>,  'GetCurrentThreadId',  \
    GetDateFormatA, <.Locale, .dwFlags, .lpDate, .lpFormat, .lpDateStr, .cchDate>,  'GetDateFormatA',  \
    GetDateFormatW, <.Locale, .dwFlags, .lpDate, .lpFormat, .lpDateStr, .cchDate>,  'GetDateFormatW',  \
    GetDefaultCommConfigA, <.lpszName, .lpCC, .lpdwSize>,  'GetDefaultCommConfigA',  \
    GetDefaultCommConfigW, <.lpszName, .lpCC, .lpdwSize>,  'GetDefaultCommConfigW',  \
    GetDefaultSortkeySize, <NONE>,  'GetDefaultSortkeySize',  \
    GetDevicePowerState, <.hDevice, .pfOn>,  'GetDevicePowerState',  \
    GetDiskFreeSpaceA, <.lpRootPathName, .lpSectorsPerCluster, .lpBytesPerSector, .lpNumberOfFreeClusters, .lpTotalNumberOfClusters,  \
      >,  'GetDiskFreeSpaceA',  \
    GetDiskFreeSpaceExA, <.lpDirectoryName, .lpFreeBytesAvailableToCaller, .lpTotalNumberOfBytes, .lpTotalNumberOfFreeBytes>,  'GetDiskFreeSpaceExA',  \
    GetDiskFreeSpaceExW, <.lpDirectoryName, .lpFreeBytesAvailableToCaller, .lpTotalNumberOfBytes, .lpTotalNumberOfFreeBytes>,  'GetDiskFreeSpaceExW',  \
    GetDiskFreeSpaceW, <.lpRootPathName, .lpSectorsPerCluster, .lpBytesPerSector, .lpNumberOfFreeClusters, .lpTotalNumberOfClusters,  \
      >,  'GetDiskFreeSpaceW',  \
    GetDllDirectoryA, <NONE>,  'GetDllDirectoryA',  \
    GetDllDirectoryW, <NONE>,  'GetDllDirectoryW',  \
    GetDriveTypeA, <.nDrive>,  'GetDriveTypeA',  \
    GetDriveTypeW, <.nDrive>,  'GetDriveTypeW',  \
    GetEnvironmentStrings, <VOID>,  'GetEnvironmentStrings',  \
    GetEnvironmentStringsA, <VOID>,  'GetEnvironmentStringsA',  \
    GetEnvironmentStringsW, <VOID>,  'GetEnvironmentStringsW',  \
    GetEnvironmentVariableA, <.lpName, .lpBuffer, .nSize>,  'GetEnvironmentVariableA',  \
    GetEnvironmentVariableW, <.lpName, .lpBuffer, .nSize>,  'GetEnvironmentVariableW',  \
    GetExitCodeProcess, <.hProcess, .lpExitCode>,  'GetExitCodeProcess',  \
    GetExitCodeThread, <.hThread, .lpExitCode>,  'GetExitCodeThread',  \
    GetExpandedNameA, <.lpszSource, .lpszBuffer>,  'GetExpandedNameA',  \
    GetExpandedNameW, <.lpszSource, .lpszBuffer>,  'GetExpandedNameW',  \
    GetFileAttributesA, <.lpFileName>,  'GetFileAttributesA',  \
    GetFileAttributesExA, <.lpFileName, .fInfoLevelId, .lpFileInformation>,  'GetFileAttributesExA',  \
    GetFileAttributesExW, <.lpFileName, .fInfoLevelId, .lpFileInformation>,  'GetFileAttributesExW',  \
    GetFileAttributesW, <.lpFileName>,  'GetFileAttributesW',  \
    GetFileInformationByHandle, <.hFile, .lpFileInformation>,  'GetFileInformationByHandle',  \
    GetFileSize, <.hFile, .lpFileSizeHigh>,  'GetFileSize',  \
    GetFileSizeEx, <.hFile, .lpFileSize>,  'GetFileSizeEx',  \
    GetFileTime, <.hFile, .lpCreationTime, .lpLastAccessTime, .lpLastWriteTime>,  'GetFileTime',  \
    GetFileType, <.hFile>,  'GetFileType',  \
    GetFirmwareEnvironmentVariableA, <NONE>,  'GetFirmwareEnvironmentVariableA',  \
    GetFirmwareEnvironmentVariableW, <NONE>,  'GetFirmwareEnvironmentVariableW',  \
    GetFullPathNameA, <.lpFileName, .nBufferLength, .lpBuffer, .lpFilePart>,  'GetFullPathNameA',  \
    GetFullPathNameW, <.lpFileName, .nBufferLength, .lpBuffer, .lpFilePart>,  'GetFullPathNameW',  \
    GetGeoInfoA, <NONE>,  'GetGeoInfoA',  \
    GetGeoInfoW, <NONE>,  'GetGeoInfoW',  \
    GetHandleContext, <NONE>,  'GetHandleContext',  \
    GetHandleInformation, <.hObject, .lpdwFlags>,  'GetHandleInformation',  \
    GetLargestConsoleWindowSize, <.hConsoleOutput>,  'GetLargestConsoleWindowSize',  \
    GetLastError, <VOID>,  'GetLastError',  \
    GetLinguistLangSize, <NONE>,  'GetLinguistLangSize',  \
    GetLocalTime, <.lpSystemTime>,  'GetLocalTime',  \
    GetLocaleInfoA, <.Locale, .LCType, .lpLCData, .cchData>,  'GetLocaleInfoA',  \
    GetLocaleInfoW, <.Locale, .LCType, .lpLCData, .cchData>,  'GetLocaleInfoW',  \
    GetLogicalDriveStringsA, <.nBufferLength, .lpBuffer>,  'GetLogicalDriveStringsA',  \
    GetLogicalDriveStringsW, <.nBufferLength, .lpBuffer>,  'GetLogicalDriveStringsW',  \
    GetLogicalDrives, <VOID>,  'GetLogicalDrives',  \
    GetLogicalProcessorInformation, <NONE>,  'GetLogicalProcessorInformation',  \
    GetLongPathNameA, <.lpszShortPath, .lpszLongPath, .cchBuffer>,  'GetLongPathNameA',  \
    GetLongPathNameW, <.lpszShortPath, .lpszLongPath, .cchBuffer>,  'GetLongPathNameW',  \
    GetMailslotInfo, <.hMailslot, .lpMaxMessageSize, .lpNextSize, .lpMessageCount, .lpReadTimeout>,  'GetMailslotInfo',  \
    GetModuleFileNameA, <.hModule, .lpFileName, .nSize>,  'GetModuleFileNameA',  \
    GetModuleFileNameW, <.hModule, .lpFileName, .nSize>,  'GetModuleFileNameW',  \
    GetModuleHandleA, <.lpModuleName>,  'GetModuleHandleA',  \
    GetModuleHandleExA, <NONE>,  'GetModuleHandleExA',  \
    GetModuleHandleExW, <NONE>,  'GetModuleHandleExW',  \
    GetModuleHandleW, <.lpModuleName>,  'GetModuleHandleW',  \
    GetNamedPipeHandleStateA, <.hNamedPipe, .lpState, .lpCurInstances, .lpMaxCollectionCount, .lpCollectDataTimeout, .lpUserName, .nMaxUserNameSize,  \
      >,  'GetNamedPipeHandleStateA',  \
    GetNamedPipeHandleStateW, <.hNamedPipe, .lpState, .lpCurInstances, .lpMaxCollectionCount, .lpCollectDataTimeout, .lpUserName, .nMaxUserNameSize,  \
      >,  'GetNamedPipeHandleStateW',  \
    GetNamedPipeInfo, <.hNamedPipe, .lpFlags, .lpOutBufferSize, .lpInBufferSize, .lpMaxInstances>,  'GetNamedPipeInfo',  \
    GetNativeSystemInfo, <NONE>,  'GetNativeSystemInfo',  \
    GetNextVDMCommand, <NONE>,  'GetNextVDMCommand',  \
    GetNlsSectionName, <NONE>,  'GetNlsSectionName',  \
    GetNumaAvailableMemory, <NONE>,  'GetNumaAvailableMemory',  \
    GetNumaAvailableMemoryNode, <NONE>,  'GetNumaAvailableMemoryNode',  \
    GetNumaHighestNodeNumber, <NONE>,  'GetNumaHighestNodeNumber',  \
    GetNumaNodeProcessorMask, <NONE>,  'GetNumaNodeProcessorMask',  \
    GetNumaProcessorMap, <NONE>,  'GetNumaProcessorMap',  \
    GetNumaProcessorNode, <NONE>,  'GetNumaProcessorNode',  \
    GetNumberFormatA, <.Locale, .dwFlags, .lpValue, .lpFormat, .lpNumberStr, .cchNumber>,  'GetNumberFormatA',  \
    GetNumberFormatW, <.Locale, .dwFlags, .lpValue, .lpFormat, .lpNumberStr, .cchNumber>,  'GetNumberFormatW',  \
    GetNumberOfConsoleFonts, <NONE>,  'GetNumberOfConsoleFonts',  \
    GetNumberOfConsoleInputEvents, <.hConsoleInput, .lpNumberOfEvents>,  'GetNumberOfConsoleInputEvents',  \
    GetNumberOfConsoleMouseButtons, <.lpNumberOfMouseButtons>,  'GetNumberOfConsoleMouseButtons',  \
    GetOEMCP, <VOID>,  'GetOEMCP',  \
    GetOverlappedResult, <.hFile, .lpOverlapped, .lpNumberOfBytesTransferred, .bWait>,  'GetOverlappedResult',  \
    GetPriorityClass, <.hProcess>,  'GetPriorityClass',  \
    GetPrivateProfileIntA, <.lpApplicationName, .lpKeyName, .nDefault, .lpFileName>,  'GetPrivateProfileIntA',  \
    GetPrivateProfileIntW, <.lpApplicationName, .lpKeyName, .nDefault, .lpFileName>,  'GetPrivateProfileIntW',  \
    GetPrivateProfileSectionA, <.lpAppName, .lpReturnedString, .nSize, .lpFileName>,  'GetPrivateProfileSectionA',  \
    GetPrivateProfileSectionNamesA, <.lpszReturnBuffer, .nSize, .lpFileName>,  'GetPrivateProfileSectionNamesA',  \
    GetPrivateProfileSectionNamesW, <.lpszReturnBuffer, .nSize, .lpFileName>,  'GetPrivateProfileSectionNamesW',  \
    GetPrivateProfileSectionW, <.lpAppName, .lpReturnedString, .nSize, .lpFileName>,  'GetPrivateProfileSectionW',  \
    GetPrivateProfileStringA, <.lpApplicationName, .lpKeyName, .lpDefault, .lpReturnedString, .nSize, .lpFileName>,  'GetPrivateProfileStringA',  \
    GetPrivateProfileStringW, <.lpApplicationName, .lpKeyName, .lpDefault, .lpReturnedString, .nSize, .lpFileName>,  'GetPrivateProfileStringW',  \
    GetPrivateProfileStructA, <.lpszSection, .lpszKey, .lpStruct, .uSizeStruct, .szFile>,  'GetPrivateProfileStructA',  \
    GetPrivateProfileStructW, <.lpszSection, .lpszKey, .lpStruct, .uSizeStruct, .szFile>,  'GetPrivateProfileStructW',  \
    GetProcAddress, <.hModule, .lpProcName>,  'GetProcAddress',  \
    GetProcessAffinityMask, <.hProcess, .lpProcessAffinityMask, .SystemAffinityMask>,  'GetProcessAffinityMask',  \
    GetProcessDEPPolicy, <NONE>,  'GetProcessDEPPolicy',  \
    GetProcessHandleCount, <NONE>,  'GetProcessHandleCount',  \
    GetProcessHeap, <VOID>,  'GetProcessHeap',  \
    GetProcessHeaps, <.NumberOfHeaps, .ProcessHeaps>,  'GetProcessHeaps',  \
    GetProcessId, <NONE>,  'GetProcessId',  \
    GetProcessIoCounters, <.hProcess, .lpIoCounters>,  'GetProcessIoCounters',  \
    GetProcessPriorityBoost, <.hProcess, .pDisablePriorityBoost>,  'GetProcessPriorityBoost',  \
    GetProcessShutdownParameters, <.lpdwLevel, .lpdwFlags>,  'GetProcessShutdownParameters',  \
    GetProcessTimes, <.hProcess, .lpCreationTime, .lpExitTime, .lpKernelTime, .lpUserTime>,  'GetProcessTimes',  \
    GetProcessVersion, <.ProcessId>,  'GetProcessVersion',  \
    GetProcessWorkingSetSize, <.hProcess, .lpMinimumWorkingSetSize, .lpMaximumWorkingSetSize>,  'GetProcessWorkingSetSize',  \
    GetProfileIntA, <.lpAppName, .lpKeyName, .nDefault>,  'GetProfileIntA',  \
    GetProfileIntW, <.lpAppName, .lpKeyName, .nDefault>,  'GetProfileIntW',  \
    GetProfileSectionA, <.lpAppName, .lpReturnedString, .nSize>,  'GetProfileSectionA',  \
    GetProfileSectionW, <.lpAppName, .lpReturnedString, .nSize>,  'GetProfileSectionW',  \
    GetProfileStringA, <.lpAppName, .lpKeyName, .lpDefault, .lpReturnedString, .nSize>,  'GetProfileStringA',  \
    GetProfileStringW, <.lpAppName, .lpKeyName, .lpDefault, .lpReturnedString, .nSize>,  'GetProfileStringW',  \
    GetQueuedCompletionStatus, <.CompletionPort, .lpNumberOfBytesTransferred, .lpCompletionKey, .lpOverlapped, .dwMilliseconds>,  'GetQueuedCompletionStatus',  \
    GetShortPathNameA, <.lpszLongPath, .lpszShortPath, .cchBuffer>,  'GetShortPathNameA',  \
    GetShortPathNameW, <.lpszLongPath, .lpszShortPath, .cchBuffer>,  'GetShortPathNameW',  \
    GetStartupInfoA, <.lpStartupInfo>,  'GetStartupInfoA',  \
    GetStartupInfoW, <.lpStartupInfo>,  'GetStartupInfoW',  \
    GetStdHandle, <.nStdHandle>,  'GetStdHandle',  \
    GetStringTypeA, <.Locale, .dwInfoType, .lpSrcStr, .cchSrc, .lpCharType>,  'GetStringTypeA',  \
    GetStringTypeExA, <.Locale, .dwInfoType, .lpSrcStr, .cchSrc, .lpCharType>,  'GetStringTypeExA',  \
    GetStringTypeExW, <.Locale, .dwInfoType, .lpSrcStr, .cchSrc, .lpCharType>,  'GetStringTypeExW',  \
    GetStringTypeW, <.Locale, .dwInfoType, .lpSrcStr, .cchSrc, .lpCharType>,  'GetStringTypeW',  \
    GetSystemDEPPolicy, <NONE>,  'GetSystemDEPPolicy',  \
    GetSystemDefaultLCID, <VOID>,  'GetSystemDefaultLCID',  \
    GetSystemDefaultLangID, <VOID>,  'GetSystemDefaultLangID',  \
    GetSystemDefaultUILanguage, <VOID>,  'GetSystemDefaultUILanguage',  \
    GetSystemDirectoryA, <.lpBuffer, .nSize>,  'GetSystemDirectoryA',  \
    GetSystemDirectoryW, <.lpBuffer, .nSize>,  'GetSystemDirectoryW',  \
    GetSystemInfo, <.lpSystemInfo>,  'GetSystemInfo',  \
    GetSystemPowerStatus, <.lpSystemPowerStatus>,  'GetSystemPowerStatus',  \
    GetSystemRegistryQuota, <NONE>,  'GetSystemRegistryQuota',  \
    GetSystemTime, <.lpSystemTime>,  'GetSystemTime',  \
    GetSystemTimeAdjustment, <.lpTimeAdjustment, .lpTimeIncrement, .lpTimeAdjustmentDisabled>,  'GetSystemTimeAdjustment',  \
    GetSystemTimeAsFileTime, <.lpSystemTimeAsFileTime>,  'GetSystemTimeAsFileTime',  \
    GetSystemTimes, <NONE>,  'GetSystemTimes',  \
    GetSystemWindowsDirectoryA, <.lpBuffer, .uSize>,  'GetSystemWindowsDirectoryA',  \
    GetSystemWindowsDirectoryW, <.lpBuffer, .uSize>,  'GetSystemWindowsDirectoryW',  \
    GetSystemWow64DirectoryA, <NONE>,  'GetSystemWow64DirectoryA',  \
    GetSystemWow64DirectoryW, <NONE>,  'GetSystemWow64DirectoryW',  \
    GetTapeParameters, <.hDevice, .dwOperation, .lpdwSize, .lpTapeInformation>,  'GetTapeParameters',  \
    GetTapePosition, <.hDevice, .dwPositionType, .lpdwPartition, .lpdwOffsetLow, .lpdwOffsetHigh>,  'GetTapePosition',  \
    GetTapeStatus, <.hDevice>,  'GetTapeStatus',  \
    GetTempFileNameA, <.lpszPath, .lpPrefixString, .wUnique, .lpTempFileName>,  'GetTempFileNameA',  \
    GetTempFileNameW, <.lpszPath, .lpPrefixString, .wUnique, .lpTempFileName>,  'GetTempFileNameW',  \
    GetTempPathA, <.nBufferLength, .lpBuffer>,  'GetTempPathA',  \
    GetTempPathW, <.nBufferLength, .lpBuffer>,  'GetTempPathW',  \
    GetThreadContext, <.hThread, .lpContext>,  'GetThreadContext',  \
    GetThreadIOPendingFlag, <NONE>,  'GetThreadIOPendingFlag',  \
    GetThreadLocale, <VOID>,  'GetThreadLocale',  \
    GetThreadPriority, <.hThread>,  'GetThreadPriority',  \
    GetThreadPriorityBoost, <.hThread, .pDisablePriorityBoost>,  'GetThreadPriorityBoost',  \
    GetThreadSelectorEntry, <.hThread, .dwSelector, .lpSelectorEntry>,  'GetThreadSelectorEntry',  \
    GetThreadTimes, <.hThread, .lpCreationTime, .lpExitTime, .lpKernelTime, .lpUserTime>,  'GetThreadTimes',  \
    GetTickCount, <VOID>,  'GetTickCount',  \
    GetTimeFormatA, <.Locale, .dwFlags, .lpTime, .lpFormat, .lpTimeStr, .cchTime>,  'GetTimeFormatA',  \
    GetTimeFormatW, <.Locale, .dwFlags, .lpTime, .lpFormat, .lpTimeStr, .cchTime>,  'GetTimeFormatW',  \
    GetTimeZoneInformation, <.lpTimeZoneInformation>,  'GetTimeZoneInformation',  \
    GetUserDefaultLCID, <VOID>,  'GetUserDefaultLCID',  \
    GetUserDefaultLangID, <VOID>,  'GetUserDefaultLangID',  \
    GetUserDefaultUILanguage, <VOID>,  'GetUserDefaultUILanguage',  \
    GetUserGeoID, <NONE>,  'GetUserGeoID',  \
    GetVDMCurrentDirectories, <NONE>,  'GetVDMCurrentDirectories',  \
    GetVersion, <VOID>,  'GetVersion',  \
    GetVersionExA, <.lpVersionInformation>,  'GetVersionExA',  \
    GetVersionExW, <.lpVersionInformation>,  'GetVersionExW',  \
    GetVolumeInformationA, <.lpRootPathName, .lpVolumeNameBuffer, .nVolumeNameSize, .lpVolumeSerialNumber, .lpMaximumComponentLength,  \
        .lpFileSystemFlags, .lpFileSystemNameBuffer, .nFileSystemNameSize>,  'GetVolumeInformationA',  \
    GetVolumeInformationW, <.lpRootPathName, .lpVolumeNameBuffer, .nVolumeNameSize, .lpVolumeSerialNumber, .lpMaximumComponentLength,  \
        .lpFileSystemFlags, .lpFileSystemNameBuffer, .nFileSystemNameSize>,  'GetVolumeInformationW',  \
    GetVolumeNameForVolumeMountPointA, <.lpszVolumeMountPoint, .lpszVolumeName, .cchBufferLength>,  'GetVolumeNameForVolumeMountPointA',  \
    GetVolumeNameForVolumeMountPointW, <.lpszVolumeMountPoint, .lpszVolumeName, .cchBufferLength>,  'GetVolumeNameForVolumeMountPointW',  \
    GetVolumePathNameA, <.lpszFileName, .lpszVolumePathName, .cchBufferLength>,  'GetVolumePathNameA',  \
    GetVolumePathNameW, <.lpszFileName, .lpszVolumePathName, .cchBufferLength>,  'GetVolumePathNameW',  \
    GetVolumePathNamesForVolumeNameA, <NONE>,  'GetVolumePathNamesForVolumeNameA',  \
    GetVolumePathNamesForVolumeNameW, <NONE>,  'GetVolumePathNamesForVolumeNameW',  \
    GetWindowsDirectoryA, <.lpBuffer, .nSize>,  'GetWindowsDirectoryA',  \
    GetWindowsDirectoryW, <.lpBuffer, .nSize>,  'GetWindowsDirectoryW',  \
    GetWriteWatch, <.dwFlags, .lpBaseAddress, .dwRegionSize, .lpAddresses, .lpdwCount, .lpdwGranularity>,  'GetWriteWatch',  \
    GlobalAddAtomA, <.lpString>,  'GlobalAddAtomA',  \
    GlobalAddAtomW, <.lpString>,  'GlobalAddAtomW',  \
    GlobalAlloc, <.uFlags, .dwBytes>,  'GlobalAlloc',  \
    GlobalCompact, <.dwMinFree>,  'GlobalCompact',  \
    GlobalDeleteAtom, <.nAtom>,  'GlobalDeleteAtom',  \
    GlobalFindAtomA, <.lpString>,  'GlobalFindAtomA',  \
    GlobalFindAtomW, <.lpString>,  'GlobalFindAtomW',  \
    GlobalFix, <.hMem>,  'GlobalFix',  \
    GlobalFlags, <.hMem>,  'GlobalFlags',  \
    GlobalFree, <.hMem>,  'GlobalFree',  \
    GlobalGetAtomNameA, <.nAtom, .lpBuffer, .nSize>,  'GlobalGetAtomNameA',  \
    GlobalGetAtomNameW, <.nAtom, .lpBuffer, .nSize>,  'GlobalGetAtomNameW',  \
    GlobalHandle, <.wMem>,  'GlobalHandle',  \
    GlobalLock, <.hMem>,  'GlobalLock',  \
    GlobalMemoryStatus, <.lpBuffer>,  'GlobalMemoryStatus',  \
    GlobalMemoryStatusEx, <.lpBuffer>,  'GlobalMemoryStatusEx',  \
    GlobalReAlloc, <.hMem, .dwBytes, .wFlags>,  'GlobalReAlloc',  \
    GlobalSize, <.hMem>,  'GlobalSize',  \
    GlobalUnWire, <.hMem>,  'GlobalUnWire',  \
    GlobalUnfix, <.hMem>,  'GlobalUnfix',  \
    GlobalUnlock, <.hMem>,  'GlobalUnlock',  \
    GlobalWire, <.hMem>,  'GlobalWire',  \
    Heap32First, <.lphe, .th32ProcessID, .th32HeapID>,  'Heap32First',  \
    Heap32ListFirst, <.hSnapshot, .lphl>,  'Heap32ListFirst',  \
    Heap32ListNext, <.hSnapshot, .lphl>,  'Heap32ListNext',  \
    Heap32Next, <.lphe>,  'Heap32Next',  \
    HeapAlloc, <.hHeap, .dwFlags, .dwBytes>,  'HeapAlloc',  \
    HeapCompact, <.hHeap, .dwFlags>,  'HeapCompact',  \
    HeapCreate, <.flOptions, .dwInitialSize, .dwMaximumSize>,  'HeapCreate',  \
    HeapCreateTagsW, <NONE>,  'HeapCreateTagsW',  \
    HeapDestroy, <.hHeap>,  'HeapDestroy',  \
    HeapExtend, <NONE>,  'HeapExtend',  \
    HeapFree, <.hHeap, .dwFlags, .lpMem>,  'HeapFree',  \
    HeapLock, <.hHeap>,  'HeapLock',  \
    HeapQueryInformation, <NONE>,  'HeapQueryInformation',  \
    HeapQueryTagW, <NONE>,  'HeapQueryTagW',  \
    HeapReAlloc, <.hHeap, .dwFlags, .lpMem, .dwBytes>,  'HeapReAlloc',  \
    HeapSetInformation, <NONE>,  'HeapSetInformation',  \
    HeapSize, <.hHeap, .dwFlags, .lpMem>,  'HeapSize',  \
    HeapSummary, <NONE>,  'HeapSummary',  \
    HeapUnlock, <.hHeap>,  'HeapUnlock',  \
    HeapUsage, <NONE>,  'HeapUsage',  \
    HeapValidate, <.hHeap, .dwFlags, .lpMem>,  'HeapValidate',  \
    HeapWalk, <.hHeap, .lpEntry>,  'HeapWalk',  \
    InitAtomTable, <.nSize>,  'InitAtomTable',  \
    InitializeCriticalSection, <.lpCriticalSection>,  'InitializeCriticalSection',  \
    InitializeCriticalSectionAndSpinCount, <.lpCriticalSection, .dwSpinCount>,  'InitializeCriticalSectionAndSpinCount',  \
    InitializeSListHead, <NONE>,  'InitializeSListHead',  \
    InterlockedCompareExchange, <.Destination, .Exchange, .Comperand>,  'InterlockedCompareExchange',  \
    InterlockedDecrement, <.lpAddend>,  'InterlockedDecrement',  \
    InterlockedExchange, <.Target, .Value>,  'InterlockedExchange',  \
    InterlockedExchangeAdd, <.Addend, .Value>,  'InterlockedExchangeAdd',  \
    InterlockedFlushSList, <NONE>,  'InterlockedFlushSList',  \
    InterlockedIncrement, <.lpAddend>,  'InterlockedIncrement',  \
    InterlockedPopEntrySList, <NONE>,  'InterlockedPopEntrySList',  \
    InterlockedPushEntrySList, <NONE>,  'InterlockedPushEntrySList',  \
    InvalidateConsoleDIBits, <NONE>,  'InvalidateConsoleDIBits',  \
    IsBadCodePtr, <.lpfn>,  'IsBadCodePtr',  \
    IsBadHugeReadPtr, <.lp, .ucb>,  'IsBadHugeReadPtr',  \
    IsBadHugeWritePtr, <.lp, .ucb>,  'IsBadHugeWritePtr',  \
    IsBadReadPtr, <.lp, .ucb>,  'IsBadReadPtr',  \
    IsBadStringPtrA, <.lpsz, .ucchMax>,  'IsBadStringPtrA',  \
    IsBadStringPtrW, <.lpsz, .ucchMax>,  'IsBadStringPtrW',  \
    IsBadWritePtr, <.lp, .ucb>,  'IsBadWritePtr',  \
    IsDBCSLeadByte, <.bTestChar>,  'IsDBCSLeadByte',  \
    IsDBCSLeadByteEx, <.CodePage, .TestChar>,  'IsDBCSLeadByteEx',  \
    IsDebuggerPresent, <VOID>,  'IsDebuggerPresent',  \
    IsProcessInJob, <NONE>,  'IsProcessInJob',  \
    IsProcessorFeaturePresent, <.ProcessorFeature>,  'IsProcessorFeaturePresent',  \
    IsSystemResumeAutomatic, <VOID>,  'IsSystemResumeAutomatic',  \
    IsValidCodePage, <.CodePage>,  'IsValidCodePage',  \
    IsValidLanguageGroup, <.LanguageGroup, .dwFlags>,  'IsValidLanguageGroup',  \
    IsValidLocale, <.Locale, .dwFlags>,  'IsValidLocale',  \
    IsValidUILanguage, <NONE>,  'IsValidUILanguage',  \
    IsWow64Process, <NONE>,  'IsWow64Process',  \
    LCMapStringA, <.Locale, .dwMapFlags, .lpSrcStr, .cchSrc, .lpDestStr, .cchDest>,  'LCMapStringA',  \
    LCMapStringW, <.Locale, .dwMapFlags, .lpSrcStr, .cchSrc, .lpDestStr, .cchDest>,  'LCMapStringW',  \
    LZClose, <.hfFile>,  'LZClose',  \
    LZCloseFile, <NONE>,  'LZCloseFile',  \
    LZCopy, <.hfSource, .hfDest>,  'LZCopy',  \
    LZCreateFileW, <NONE>,  'LZCreateFileW',  \
    LZDone, <VOID>,  'LZDone',  \
    LZInit, <.hfSrc>,  'LZInit',  \
    LZOpenFileA, <.lpszFile, .lpOf, .style>,  'LZOpenFileA',  \
    LZOpenFileW, <.lpszFile, .lpOf, .style>,  'LZOpenFileW',  \
    LZRead, <.hfFile, .lpvBuf, .cbread>,  'LZRead',  \
    LZSeek, <.hfFile, .lOffset, .nOrigin>,  'LZSeek',  \
    LZStart, <VOID>,  'LZStart',  \
    LeaveCriticalSection, <.lpCriticalSection>,  'LeaveCriticalSection',  \
    LoadLibraryA, <.lpLibFileName>,  'LoadLibraryA',  \
    LoadLibraryExA, <.lpLibFileName, .hFile, .dwFlags>,  'LoadLibraryExA',  \
    LoadLibraryExW, <.lpLibFileName, .hFile, .dwFlags>,  'LoadLibraryExW',  \
    LoadLibraryW, <.lpLibFileName>,  'LoadLibraryW',  \
    LoadModule, <.lpModuleName, .lpParameterBlock>,  'LoadModule',  \
    LoadResource, <.hInstance, .hResInfo>,  'LoadResource',  \
    LocalAlloc, <.wFlags, .wBytes>,  'LocalAlloc',  \
    LocalCompact, <.uMinFree>,  'LocalCompact',  \
    LocalFileTimeToFileTime, <.lpLocalFileTime, .lpFileTime>,  'LocalFileTimeToFileTime',  \
    LocalFlags, <.hMem>,  'LocalFlags',  \
    LocalFree, <.hMem>,  'LocalFree',  \
    LocalHandle, <.wMem>,  'LocalHandle',  \
    LocalLock, <.hMem>,  'LocalLock',  \
    LocalReAlloc, <.hMem, .wBytes, .wFlags>,  'LocalReAlloc',  \
    LocalShrink, <.hMem, .cbNewSize>,  'LocalShrink',  \
    LocalSize, <.hMem>,  'LocalSize',  \
    LocalUnlock, <.hMem>,  'LocalUnlock',  \
    LockFile, <.hFile, .dwFileOffsetLow, .dwFileOffsetHigh, .nNumberOfBytesToLockLow, .nNumberOfBytesToLockHigh>,  'LockFile',  \
    LockFileEx, <.hFile, .dwFlags, .dwReserved, .nNumberOfBytesToLockLow, .nNumberOfBytesToLockHigh, .lpOverlapped>,  'LockFileEx',  \
    LockResource, <.hResData>,  'LockResource',  \
    MapUserPhysicalPages, <.VirtualAddress, .NumberOfPages, .PageArray>,  'MapUserPhysicalPages',  \
    MapUserPhysicalPagesScatter, <.VirtualAddresses, .NumberOfPages, .PageArray>,  'MapUserPhysicalPagesScatter',  \
    MapViewOfFile, <.hFileMappingObject, .dwDesiredAccess, .dwFileOffsetHigh, .dwFileOffsetLow, .dwNumberOfBytesToMap>,  'MapViewOfFile',  \
    MapViewOfFileEx, <.hFileMappingObject, .dwDesiredAccess, .dwFileOffsetHigh, .dwFileOffsetLow, .dwNumberOfBytesToMap, .lpBaseAddress,  \
      >,  'MapViewOfFileEx',  \
    Module32First, <.hSnapshot, .lpme>,  'Module32First',  \
    Module32FirstW, <.hSnapshot, .lpme>,  'Module32FirstW',  \
    Module32Next, <.hSnapshot, .lpme>,  'Module32Next',  \
    Module32NextW, <.hSnapshot, .lpme>,  'Module32NextW',  \
    MoveFileA, <.lpExistingFileName, .lpNewFileName>,  'MoveFileA',  \
    MoveFileExA, <.lpExistingFileName, .lpNewFileName, .dwFlags>,  'MoveFileExA',  \
    MoveFileExW, <.lpExistingFileName, .lpNewFileName, .dwFlags>,  'MoveFileExW',  \
    MoveFileW, <.lpExistingFileName, .lpNewFileName>,  'MoveFileW',  \
    MoveFileWithProgressA, <.lpExistingFileName, .lpNewFileName, .lpProgressRoutine, .lpData, .dwFlags>,  'MoveFileWithProgressA',  \
    MoveFileWithProgressW, <.lpExistingFileName, .lpNewFileName, .lpProgressRoutine, .lpData, .dwFlags>,  'MoveFileWithProgressW',  \
    MulDiv, <.nNumber, .nNumerator, .nDenominator>,  'MulDiv',  \
    MultiByteToWideChar, <.CodePage, .dwFlags, .lpMultiByteStr, .cchMultiByte, .lpWideCharStr, .cchWideChar>,  'MultiByteToWideChar',  \
    NlsConvertIntegerToString, <NONE>,  'NlsConvertIntegerToString',  \
    NlsGetCacheUpdateCount, <NONE>,  'NlsGetCacheUpdateCount',  \
    NlsResetProcessLocale, <NONE>,  'NlsResetProcessLocale',  \
    NumaVirtualQueryNode, <NONE>,  'NumaVirtualQueryNode',  \
    OpenConsoleW, <NONE>,  'OpenConsoleW',  \
    OpenDataFile, <NONE>,  'OpenDataFile',  \
    OpenEventA, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenEventA',  \
    OpenEventW, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenEventW',  \
    OpenFile, <.lpFileName, .lpReOpenBuff, .wStyle>,  'OpenFile',  \
    OpenFileMappingA, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenFileMappingA',  \
    OpenFileMappingW, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenFileMappingW',  \
    OpenJobObjectA, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenJobObjectA',  \
    OpenJobObjectW, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenJobObjectW',  \
    OpenMutexA, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenMutexA',  \
    OpenMutexW, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenMutexW',  \
    OpenProcess, <.dwDesiredAccess, .bInheritHandle, .dwProcessId>,  'OpenProcess',  \
    OpenProfileUserMapping, <NONE>,  'OpenProfileUserMapping',  \
    OpenSemaphoreA, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenSemaphoreA',  \
    OpenSemaphoreW, <.dwDesiredAccess, .bInheritHandle, .lpName>,  'OpenSemaphoreW',  \
    OpenThread, <.dwDesiredAccess, .bInheritHandle, .dwThreadId>,  'OpenThread',  \
    OpenWaitableTimerA, <.dwDesiredAccess, .bInheritHandle, .lpTimerName>,  'OpenWaitableTimerA',  \
    OpenWaitableTimerW, <.dwDesiredAccess, .bInheritHandle, .lpTimerName>,  'OpenWaitableTimerW',  \
    OutputDebugStringA, <.lpOutputString>,  'OutputDebugStringA',  \
    OutputDebugStringW, <.lpOutputString>,  'OutputDebugStringW',  \
    PeekConsoleInputA, <.hConsoleInput, .lpBuffer, .nLength, .lpNumberOfEventsRead>,  'PeekConsoleInputA',  \
    PeekConsoleInputW, <.hConsoleInput, .lpBuffer, .nLength, .lpNumberOfEventsRead>,  'PeekConsoleInputW',  \
    PeekNamedPipe, <.hNamedPipe, .lpBuffer, .nBufferSize, .lpBytesRead, .lpTotalBytesAvail, .lpBytesLeftThisMessage>,  'PeekNamedPipe',  \
    PostQueuedCompletionStatus, <.CompletionPort, .dwNumberOfBytesTransferred, .dwCompletionKey, .lpOverlapped>,  'PostQueuedCompletionStatus',  \
    PrepareTape, <.hDevice, .dwOperation, .bimmediate>,  'PrepareTape',  \
    PrivCopyFileExW, <NONE>,  'PrivCopyFileExW',  \
    PrivMoveFileIdentityW, <NONE>,  'PrivMoveFileIdentityW',  \
    Process32First, <.hSnapshot, .lppe>,  'Process32First',  \
    Process32FirstW, <.hSnapshot, .lppe>,  'Process32FirstW',  \
    Process32Next, <.hSnapshot, .lppe>,  'Process32Next',  \
    Process32NextW, <.hSnapshot, .lppe>,  'Process32NextW',  \
    ProcessIdToSessionId, <.dwProcessId, .pSessionId>,  'ProcessIdToSessionId',  \
    PulseEvent, <.hEvent>,  'PulseEvent',  \
    PurgeComm, <.hFile, .dwFlags>,  'PurgeComm',  \
    QueryActCtxW, <NONE>,  'QueryActCtxW',  \
    QueryDepthSList, <NONE>,  'QueryDepthSList',  \
    QueryDosDeviceA, <.lpDeviceName, .lpTargetPath, .ucchMax>,  'QueryDosDeviceA',  \
    QueryDosDeviceW, <.lpDeviceName, .lpTargetPath, .ucchMax>,  'QueryDosDeviceW',  \
    QueryInformationJobObject, <.hJob, .JobObjectInformationClass, .lpJobObjectInformation, .cbJobObjectInformationLength, .lpReturnLength,  \
      >,  'QueryInformationJobObject',  \
    QueryMemoryResourceNotification, <NONE>,  'QueryMemoryResourceNotification',  \
    QueryPerformanceCounter, <.lpPerformanceCount>,  'QueryPerformanceCounter',  \
    QueryPerformanceFrequency, <.lpFrequency>,  'QueryPerformanceFrequency',  \
    QueryWin31IniFilesMappedToRegistry, <NONE>,  'QueryWin31IniFilesMappedToRegistry',  \
    QueueUserAPC, <.pfnAPC, .hThread, .dwData>,  'QueueUserAPC',  \
    QueueUserWorkItem, <.lFunction, .Context, .Flags>,  'QueueUserWorkItem',  \
    RaiseException, <.dwExceptionCode, .dwExceptionFlags, .nNumberOfArguments, .lpArguments>,  'RaiseException',  \
    ReadConsoleA, <.hConsoleInput, .lpBuffer, .nNumberOfCharsToRead, .lpNumberOfCharsRead, .lpReserved>,  'ReadConsoleA',  \
    ReadConsoleInputA, <.hConsoleInput, .lpBuffer, .nLength, .lpNumberOfEventsRead>,  'ReadConsoleInputA',  \
    ReadConsoleInputExA, <NONE>,  'ReadConsoleInputExA',  \
    ReadConsoleInputExW, <NONE>,  'ReadConsoleInputExW',  \
    ReadConsoleInputW, <.hConsoleInput, .lpBuffer, .nLength, .lpNumberOfEventsRead>,  'ReadConsoleInputW',  \
    ReadConsoleOutputA, <.hConsoleOutput, .lpBuffer, .dwBufferSize, .dwBufferCoord, .lpReadRegion>,  'ReadConsoleOutputA',  \
    ReadConsoleOutputAttribute, <.hConsoleOutput, .lpAttribute, .nLength, .dwReadCoord, .lpNumberOfAttrsRead>,  'ReadConsoleOutputAttribute',  \
    ReadConsoleOutputCharacterA, <.hConsoleOutput, .lpCharacter, .nLength, .dwReadCoord, .lpNumberOfCharsRead>,  'ReadConsoleOutputCharacterA',  \
    ReadConsoleOutputCharacterW, <.hConsoleOutput, .lpCharacter, .nLength, .dwReadCoord, .lpNumberOfCharsRead>,  'ReadConsoleOutputCharacterW',  \
    ReadConsoleOutputW, <.hConsoleOutput, .lpBuffer, .dwBufferSize, .dwBufferCoord, .lpReadRegion>,  'ReadConsoleOutputW',  \
    ReadConsoleW, <.hConsoleInput, .lpBuffer, .nNumberOfCharsToRead, .lpNumberOfCharsRead, .lpReserved>,  'ReadConsoleW',  \
    ReadDirectoryChangesW, <NONE>,  'ReadDirectoryChangesW',  \
    ReadFile, <.hFile, .lpBuffer, .nNumberOfBytesToRead, .lpNumberOfBytesRead, .lpOverlapped>,  'ReadFile',  \
    ReadFileEx, <.hFile, .lpBuffer, .nNumberOfBytesToRead, .lpOverlapped, .lpCompletionRoutine>,  'ReadFileEx',  \
    ReadFileScatter, <.hFile, .aSegmentArray, .nNumberOfBytesToRead, .lpReserved, .lpOverlapped>,  'ReadFileScatter',  \
    ReadProcessMemory, <.hProcess, .lpBaseAddress, .lpBuffer, .nSize, .lpNumberOfBytesWritten>,  'ReadProcessMemory',  \
    RegisterConsoleIME, <NONE>,  'RegisterConsoleIME',  \
    RegisterConsoleOS2, <NONE>,  'RegisterConsoleOS2',  \
    RegisterConsoleVDM, <NONE>,  'RegisterConsoleVDM',  \
    RegisterWaitForInputIdle, <NONE>,  'RegisterWaitForInputIdle',  \
    RegisterWaitForSingleObject, <.phNewWaitObject, .hObject, .Callback, .Context, .dwMilliseconds, .dwFlags>,  'RegisterWaitForSingleObject',  \
    RegisterWaitForSingleObjectEx, <.hObject, .Callback, .Context, .dwMilliseconds, .dwFlags>,  'RegisterWaitForSingleObjectEx',  \
    RegisterWowBaseHandlers, <NONE>,  'RegisterWowBaseHandlers',  \
    RegisterWowExec, <NONE>,  'RegisterWowExec',  \
    ReleaseActCtx, <NONE>,  'ReleaseActCtx',  \
    ReleaseMutex, <.hMutex>,  'ReleaseMutex',  \
    ReleaseSemaphore, <.hSemaphore, .lReleaseCount, .lpPreviousCount>,  'ReleaseSemaphore',  \
    RemoveDirectoryA, <.lpPathName>,  'RemoveDirectoryA',  \
    RemoveDirectoryW, <.lpPathName>,  'RemoveDirectoryW',  \
    RemoveLocalAlternateComputerNameA, <NONE>,  'RemoveLocalAlternateComputerNameA',  \
    RemoveLocalAlternateComputerNameW, <NONE>,  'RemoveLocalAlternateComputerNameW',  \
    RemoveVectoredExceptionHandler, <NONE>,  'RemoveVectoredExceptionHandler',  \
    ReplaceFile, <.lpReplacedFileName, .lpReplacementFileName, .lpBackupFileName, .dwReplaceFlags, .lpExclude, .lpReserved>,  'ReplaceFile',  \
    ReplaceFileA, <.lpReplacedFileName, .lpReplacementFileName, .lpBackupFileName, .dwReplaceFlags, .lpExclude, .lpReserved>,  'ReplaceFileA',  \
    ReplaceFileW, <.lpReplacedFileName, .lpReplacementFileName, .lpBackupFileName, .dwReplaceFlags, .lpExclude, .lpReserved>,  'ReplaceFileW',  \
    RequestDeviceWakeup, <.hDevice>,  'RequestDeviceWakeup',  \
    RequestWakeupLatency, <.latency>,  'RequestWakeupLatency',  \
    ResetEvent, <.hEvent>,  'ResetEvent',  \
    ResetWriteWatch, <.lpBaseAddress, .dwRegionSize>,  'ResetWriteWatch',  \
    RestoreLastError, <NONE>,  'RestoreLastError',  \
    ResumeThread, <.hThread>,  'ResumeThread',  \
    RtlCaptureContext, <NONE>,  'RtlCaptureContext',  \
    RtlCaptureStackBackTrace, <NONE>,  'RtlCaptureStackBackTrace',  \
    RtlFillMemory, <.Destination, .Length, .Fill>,  'RtlFillMemory',  \
    RtlMoveMemory, <.dest, .source, .numBytes>,  'RtlMoveMemory',  \
    RtlUnwind, <NONE>,  'RtlUnwind',  \
    RtlZeroMemory, <.dest, .numBytes>,  'RtlZeroMemory',  \
    ScrollConsoleScreenBufferA, <.hConsoleOutput, .lpScrollRectangle, .lpClipRectangle, .dwDestinationOrigin, .lpFill>,  'ScrollConsoleScreenBufferA',  \
    ScrollConsoleScreenBufferW, <.hConsoleOutput, .lpScrollRectangle, .lpClipRectangle, .dwDestinationOrigin, .lpFill>,  'ScrollConsoleScreenBufferW',  \
    SearchPathA, <.lpPath, .lpFileName, .lpExtension, .nBufferLength, .lpBuffer, .lpFilePart>,  'SearchPathA',  \
    SearchPathW, <.lpPath, .lpFileName, .lpExtension, .nBufferLength, .lpBuffer, .lpFilePart>,  'SearchPathW',  \
    SetCPGlobal, <NONE>,  'SetCPGlobal',  \
    SetCalendarInfoA, <.Locale, .Calendar, .CalType, .lpCalData>,  'SetCalendarInfoA',  \
    SetCalendarInfoW, <.Locale, .Calendar, .CalType, .lpCalData>,  'SetCalendarInfoW',  \
    SetClientTimeZoneInformation, <NONE>,  'SetClientTimeZoneInformation',  \
    SetComPlusPackageInstallStatus, <NONE>,  'SetComPlusPackageInstallStatus',  \
    SetCommBreak, <.nCid>,  'SetCommBreak',  \
    SetCommConfig, <.hCommDev, .lpCC, .dwSize>,  'SetCommConfig',  \
    SetCommMask, <.hFile, .dwEvtMask>,  'SetCommMask',  \
    SetCommState, <.hCommDev, .lpDCB>,  'SetCommState',  \
    SetCommTimeouts, <.hFile, .lpCommTimeouts>,  'SetCommTimeouts',  \
    SetComputerNameA, <.lpComputerName>,  'SetComputerNameA',  \
    SetComputerNameExA, <.NameType, .lpBuffer>,  'SetComputerNameExA',  \
    SetComputerNameExW, <.NameType, .lpBuffer>,  'SetComputerNameExW',  \
    SetComputerNameW, <.lpComputerName>,  'SetComputerNameW',  \
    SetConsoleActiveScreenBuffer, <.hConsoleOutput>,  'SetConsoleActiveScreenBuffer',  \
    SetConsoleCP, <.wCodePageID>,  'SetConsoleCP',  \
    SetConsoleCommandHistoryMode, <NONE>,  'SetConsoleCommandHistoryMode',  \
    SetConsoleCtrlHandler, <.HandlerRoutine, .Add>,  'SetConsoleCtrlHandler',  \
    SetConsoleCursor, <NONE>,  'SetConsoleCursor',  \
    SetConsoleCursorInfo, <.hConsoleOutput, .lpConsoleCursorInfo>,  'SetConsoleCursorInfo',  \
    SetConsoleCursorMode, <NONE>,  'SetConsoleCursorMode',  \
    SetConsoleCursorPosition, <.hConsoleOutput, .dwCursorPosition>,  'SetConsoleCursorPosition',  \
    SetConsoleDisplayMode, <NONE>,  'SetConsoleDisplayMode',  \
    SetConsoleFont, <NONE>,  'SetConsoleFont',  \
    SetConsoleHardwareState, <NONE>,  'SetConsoleHardwareState',  \
    SetConsoleIcon, <NONE>,  'SetConsoleIcon',  \
    SetConsoleInputExeNameA, <NONE>,  'SetConsoleInputExeNameA',  \
    SetConsoleInputExeNameW, <NONE>,  'SetConsoleInputExeNameW',  \
    SetConsoleKeyShortcuts, <NONE>,  'SetConsoleKeyShortcuts',  \
    SetConsoleLocalEUDC, <NONE>,  'SetConsoleLocalEUDC',  \
    SetConsoleMaximumWindowSize, <NONE>,  'SetConsoleMaximumWindowSize',  \
    SetConsoleMenuClose, <NONE>,  'SetConsoleMenuClose',  \
    SetConsoleMode, <.hConsoleHandle, .dwMode>,  'SetConsoleMode',  \
    SetConsoleNlsMode, <NONE>,  'SetConsoleNlsMode',  \
    SetConsoleNumberOfCommandsA, <NONE>,  'SetConsoleNumberOfCommandsA',  \
    SetConsoleNumberOfCommandsW, <NONE>,  'SetConsoleNumberOfCommandsW',  \
    SetConsoleOS2OemFormat, <NONE>,  'SetConsoleOS2OemFormat',  \
    SetConsoleOutputCP, <.wCodePageID>,  'SetConsoleOutputCP',  \
    SetConsolePalette, <NONE>,  'SetConsolePalette',  \
    SetConsoleScreenBufferSize, <.hConsoleOutput, .dwSize>,  'SetConsoleScreenBufferSize',  \
    SetConsoleTextAttribute, <.hConsoleOutput, .wAttributes>,  'SetConsoleTextAttribute',  \
    SetConsoleTitleA, <.lpConsoleTitle>,  'SetConsoleTitleA',  \
    SetConsoleTitleW, <.lpConsoleTitle>,  'SetConsoleTitleW',  \
    SetConsoleWindowInfo, <.hConsoleOutput, .bAbsolute, .lpConsoleWindow>,  'SetConsoleWindowInfo',  \
    SetCriticalSectionSpinCount, <.lpCriticalSection, .dwSpinCount>,  'SetCriticalSectionSpinCount',  \
    SetCurrentDirectoryA, <.lpPathName>,  'SetCurrentDirectoryA',  \
    SetCurrentDirectoryW, <.lpPathName>,  'SetCurrentDirectoryW',  \
    SetDefaultCommConfigA, <.lpszName, .lpCC, .dwSize>,  'SetDefaultCommConfigA',  \
    SetDefaultCommConfigW, <.lpszName, .lpCC, .dwSize>,  'SetDefaultCommConfigW',  \
    SetDllDirectoryA, <NONE>,  'SetDllDirectoryA',  \
    SetDllDirectoryW, <NONE>,  'SetDllDirectoryW',  \
    SetEndOfFile, <.hFile>,  'SetEndOfFile',  \
    SetEnvironmentVariableA, <.lpName, .lpValue>,  'SetEnvironmentVariableA',  \
    SetEnvironmentVariableW, <.lpName, .lpValue>,  'SetEnvironmentVariableW',  \
    SetErrorMode, <.wMode>,  'SetErrorMode',  \
    SetEvent, <.hEvent>,  'SetEvent',  \
    SetFileApisToANSI, <VOID>,  'SetFileApisToANSI',  \
    SetFileApisToOEM, <VOID>,  'SetFileApisToOEM',  \
    SetFileAttributesA, <.lpFileName, .dwFileAttributes>,  'SetFileAttributesA',  \
    SetFileAttributesW, <.lpFileName, .dwFileAttributes>,  'SetFileAttributesW',  \
    SetFilePointer, <.hFile, .lDistanceToMove, .lpDistanceToMoveHigh, .dwMoveMethod>,  'SetFilePointer',  \
    SetFilePointerEx, <.hFile, .liDistanceToMove, .lpNewFilePointer, .dwMoveMethod>,  'SetFilePointerEx',  \
    SetFileShortNameA, <NONE>,  'SetFileShortNameA',  \
    SetFileShortNameW, <NONE>,  'SetFileShortNameW',  \
    SetFileTime, <.hFile, .lpCreationTime, .lpLastAccessTime, .lpLastWriteTime>,  'SetFileTime',  \
    SetFileValidData, <NONE>,  'SetFileValidData',  \
    SetFirmwareEnvironmentVariableA, <NONE>,  'SetFirmwareEnvironmentVariableA',  \
    SetFirmwareEnvironmentVariableW, <NONE>,  'SetFirmwareEnvironmentVariableW',  \
    SetHandleContext, <NONE>,  'SetHandleContext',  \
    SetHandleCount, <.wNumber>,  'SetHandleCount',  \
    SetHandleInformation, <.hObject, .dwMask, .dwFlags>,  'SetHandleInformation',  \
    SetInformationJobObject, <.hJob, .JobObjectInformationClass, .lpJobObjectInformation, .cbJobObjectInformationLength>,  'SetInformationJobObject',  \
    SetLastConsoleEventActive, <NONE>,  'SetLastConsoleEventActive',  \
    SetLastError, <.dwErrCode>,  'SetLastError',  \
    SetLocalPrimaryComputerNameA, <NONE>,  'SetLocalPrimaryComputerNameA',  \
    SetLocalPrimaryComputerNameW, <NONE>,  'SetLocalPrimaryComputerNameW',  \
    SetLocalTime, <.lpSystemTime>,  'SetLocalTime',  \
    SetLocaleInfoA, <.Locale, .LCType, .lpLCData>,  'SetLocaleInfoA',  \
    SetLocaleInfoW, <.Locale, .LCType, .lpLCData>,  'SetLocaleInfoW',  \
    SetMailslotInfo, <.hMailslot, .lReadTimeout>,  'SetMailslotInfo',  \
    SetMessageWaitingIndicator, <.hMsgIndicator, .ulMsgCount>,  'SetMessageWaitingIndicator',  \
    SetNamedPipeHandleState, <.hNamedPipe, .lpMode, .lpMaxCollectionCount, .lpCollectDataTimeout>,  'SetNamedPipeHandleState',  \
    SetPriorityClass, <.hProcess, .dwPriorityClass>,  'SetPriorityClass',  \
    SetProcessAffinityMask, <.hProcess, .dwProcessAffinityMask>,  'SetProcessAffinityMask',  \
    SetProcessDEPPolicy, <NONE>,  'SetProcessDEPPolicy',  \
    SetProcessPriorityBoost, <.hProcess, .bDisablePriorityBoost>,  'SetProcessPriorityBoost',  \
    SetProcessShutdownParameters, <.dwLevel, .dwFlags>,  'SetProcessShutdownParameters',  \
    SetProcessWorkingSetSize, <.hProcess, .dwMinimumWorkingSetSize, .dwMaximumWorkingSetSize>,  'SetProcessWorkingSetSize',  \
    SetStdHandle, <.nStdHandle, .nHandle>,  'SetStdHandle',  \
    SetSystemPowerState, <.fSuspend, .fForce>,  'SetSystemPowerState',  \
    SetSystemTime, <.lpSystemTime>,  'SetSystemTime',  \
    SetSystemTimeAdjustment, <.dwTimeAdjustment, .bTimeAdjustmentDisabled>,  'SetSystemTimeAdjustment',  \
    SetTapeParameters, <.hDevice, .dwOperation, .lpTapeInformation>,  'SetTapeParameters',  \
    SetTapePosition, <.hDevice, .dwPositionMethod, .dwPartition, .dwOffsetLow, .dwOffsetHigh, .bimmediate>,  'SetTapePosition',  \
    SetTermsrvAppInstallMode, <NONE>,  'SetTermsrvAppInstallMode',  \
    SetThreadAffinityMask, <.hThread, .dwThreadAffinityMask>,  'SetThreadAffinityMask',  \
    SetThreadContext, <.hThread, .lpContext>,  'SetThreadContext',  \
    SetThreadExecutionState, <.esFlags>,  'SetThreadExecutionState',  \
    SetThreadIdealProcessor, <.hThread, .dwIdealProcessor>,  'SetThreadIdealProcessor',  \
    SetThreadLocale, <.Locale>,  'SetThreadLocale',  \
    SetThreadPriority, <.hThread, .nPriority>,  'SetThreadPriority',  \
    SetThreadPriorityBoost, <.hThread, .bDisablePriorityBoost>,  'SetThreadPriorityBoost',  \
    SetThreadUILanguage, <NONE>,  'SetThreadUILanguage',  \
    SetTimeZoneInformation, <.lpTimeZoneInformation>,  'SetTimeZoneInformation',  \
    SetTimerQueueTimer, <.TimerQueue, .Callback, .Parameter, .DueTime, .Period, .PreferIo>,  'SetTimerQueueTimer',  \
    SetUnhandledExceptionFilter, <.lpTopLevelExceptionFilter>,  'SetUnhandledExceptionFilter',  \
    SetUserGeoID, <NONE>,  'SetUserGeoID',  \
    SetVDMCurrentDirectories, <NONE>,  'SetVDMCurrentDirectories',  \
    SetVolumeLabelA, <.lpRootPathName, .lpVolumeName>,  'SetVolumeLabelA',  \
    SetVolumeLabelW, <.lpRootPathName, .lpVolumeName>,  'SetVolumeLabelW',  \
    SetVolumeMountPointA, <.lpszVolumeMountPoint, .lpszVolumeName>,  'SetVolumeMountPointA',  \
    SetVolumeMountPointW, <.lpszVolumeMountPoint, .lpszVolumeName>,  'SetVolumeMountPointW',  \
    SetWaitableTimer, <.hTimer, .lpDueTime, .lPeriod, .pfnCompletionRoutine, .lpArgToCompletionRoutine, .fResume>,  'SetWaitableTimer',  \
    SetupComm, <.hFile, .dwInQueue, .dwOutQueue>,  'SetupComm',  \
    ShowConsoleCursor, <NONE>,  'ShowConsoleCursor',  \
    SignalObjectAndWait, <.hObjectToSignal, .hObjectToWaitOn, .dwMilliseconds, .bAlertable>,  'SignalObjectAndWait',  \
    SizeofResource, <.hInstance, .hResInfo>,  'SizeofResource',  \
    SleepWin, <.dwMilliseconds>,  'Sleep',  \
    SleepEx, <.dwMilliseconds, .bAlertable>,  'SleepEx',  \
    SuspendThread, <.hThread>,  'SuspendThread',  \
    SwitchToFiber, <.lpFiber>,  'SwitchToFiber',  \
    SwitchToThread, <VOID>,  'SwitchToThread',  \
    SystemTimeToFileTime, <.lpSystemTime, .lpFileTime>,  'SystemTimeToFileTime',  \
    SystemTimeToTzSpecificLocalTime, <.lpTimeZoneInformation, .lpUniversalTime, .lpLocalTime>,  'SystemTimeToTzSpecificLocalTime',  \
    TerminateJobObject, <.hJob, .uExitCode>,  'TerminateJobObject',  \
    TerminateProcess, <.hProcess, .uExitCode>,  'TerminateProcess',  \
    TerminateThread, <.hThread, .dwExitCode>,  'TerminateThread',  \
    TermsrvAppInstallMode, <NONE>,  'TermsrvAppInstallMode',  \
    Thread32First, <.hSnapshot, .lpte>,  'Thread32First',  \
    Thread32Next, <.hSnapshot, .lpte>,  'Thread32Next',  \
    TlsAlloc, <VOID>,  'TlsAlloc',  \
    TlsFree, <.dwTlsIndex>,  'TlsFree',  \
    TlsGetValue, <.dwTlsIndex>,  'TlsGetValue',  \
    TlsSetValue, <.dwTlsIndex, .lpTlsValue>,  'TlsSetValue',  \
    Toolhelp32ReadProcessMemory, <.th32ProcessID, .lpBaseAddress, .lpBuffer, .cbRead, .lpNumberOfBytesRead>,  'Toolhelp32ReadProcessMemory',  \
    TransactNamedPipe, <.hNamedPipe, .lpInBuffer, .nInBufferSize, .lpOutBuffer, .nOutBufferSize, .lpBytesRead, .lpOverlapped>,  'TransactNamedPipe',  \
    TransmitCommChar, <.nCid, .cChar>,  'TransmitCommChar',  \
    TrimVirtualBuffer, <NONE>,  'TrimVirtualBuffer',  \
    TryEnterCriticalSection, <.lpCriticalSection>,  'TryEnterCriticalSection',  \
    TzSpecificLocalTimeToSystemTime, <NONE>,  'TzSpecificLocalTimeToSystemTime',  \
    UTRegister, <NONE>,  'UTRegister',  \
    UTUnRegister, <NONE>,  'UTUnRegister',  \
    UnhandledExceptionFilter, <.ExceptionInfo>,  'UnhandledExceptionFilter',  \
    UnlockFile, <.hFile, .dwFileOffsetLow, .dwFileOffsetHigh, .nNumberOfBytesToUnlockLow, .nNumberOfBytesToUnlockHigh>,  'UnlockFile',  \
    UnlockFileEx, <.hFile, .dwReserved, .nNumberOfBytesToUnlockLow, .nNumberOfBytesToUnlockHigh, .lpOverlapped>,  'UnlockFileEx',  \
    UnmapViewOfFile, <.lpBaseAddress>,  'UnmapViewOfFile',  \
    UnregisterConsoleIME, <NONE>,  'UnregisterConsoleIME',  \
    UnregisterWait, <.WaitHandle>,  'UnregisterWait',  \
    UnregisterWaitEx, <.WaitHandle, .CompletionEvent>,  'UnregisterWaitEx',  \
    UpdateResourceA, <.hUpdate, .lpType, .lpName, .wLanguage, .lpData, .cbData>,  'UpdateResourceA',  \
    UpdateResourceW, <.hUpdate, .lpType, .lpName, .wLanguage, .lpData, .cbData>,  'UpdateResourceW',  \
    VDMConsoleOperation, <NONE>,  'VDMConsoleOperation',  \
    VDMOperationStarted, <NONE>,  'VDMOperationStarted',  \
    ValidateLCType, <NONE>,  'ValidateLCType',  \
    ValidateLocale, <NONE>,  'ValidateLocale',  \
    VerLanguageNameA, <.wLang, .szLang, .nSize>,  'VerLanguageNameA',  \
    VerLanguageNameW, <.wLang, .szLang, .nSize>,  'VerLanguageNameW',  \
    VerSetConditionMask, <.ConditionMask, .TypeMask, .Condition>,  'VerSetConditionMask',  \
    VerifyConsoleIoHandle, <NONE>,  'VerifyConsoleIoHandle',  \
    VerifyVersionInfoA, <.lpVersionInformation, .dwTypeMask, .dwlConditionMask>,  'VerifyVersionInfoA',  \
    VerifyVersionInfoW, <.lpVersionInformation, .dwTypeMask, .dwlConditionMask>,  'VerifyVersionInfoW',  \
    VirtualAlloc, <.lpAddress, .dwSize, .flAllocationType, .flProtect>,  'VirtualAlloc',  \
    VirtualAllocEx, <.hProcess, .lpAddress, .dwSize, .flAllocationType, .flProtect>,  'VirtualAllocEx',  \
    VirtualBufferExceptionHandler, <NONE>,  'VirtualBufferExceptionHandler',  \
    VirtualFree, <.lpAddress, .dwSize, .dwFreeType>,  'VirtualFree',  \
    VirtualFreeEx, <.hProcess, .lpAddress, .dwSize, .dwFreeType>,  'VirtualFreeEx',  \
    VirtualLock, <.lpAddress, .dwSize>,  'VirtualLock',  \
    VirtualProtect, <.lpAddress, .dwSize, .flNewProtect, .lpflOldProtect>,  'VirtualProtect',  \
    VirtualProtectEx, <.hProcess, .lpAddress, .dwSize, .flNewProtect, .lpflOldProtect>,  'VirtualProtectEx',  \
    VirtualQuery, <.lpAddress, .lpBuffer, .dwLength>,  'VirtualQuery',  \
    VirtualQueryEx, <.hProcess, .lpAddress, .lpBuffer, .dwLength>,  'VirtualQueryEx',  \
    VirtualUnlock, <.lpAddress, .dwSize>,  'VirtualUnlock',  \
    WTSGetActiveConsoleSessionId, <NONE>,  'WTSGetActiveConsoleSessionId',  \
    WaitCommEvent, <.hFile, .lpEvtMask, .lpOverlapped>,  'WaitCommEvent',  \
    WaitForDebugEvent, <.lpDebugEvent, .dwMilliseconds>,  'WaitForDebugEvent',  \
    WaitForMultipleObjects, <.nCount, .lpHandles, .bWaitAll, .dwMilliseconds>,  'WaitForMultipleObjects',  \
    WaitForMultipleObjectsEx, <.nCount, .lpHandles, .bWaitAll, .dwMilliseconds, .bAlertable>,  'WaitForMultipleObjectsEx',  \
    WaitForSingleObject, <.hHandle, .dwMilliseconds>,  'WaitForSingleObject',  \
    WaitForSingleObjectEx, <.hHandle, .dwMilliseconds, .bAlertable>,  'WaitForSingleObjectEx',  \
    WaitNamedPipeA, <.lpNamedPipeName, .nTimeOut>,  'WaitNamedPipeA',  \
    WaitNamedPipeW, <.lpNamedPipeName, .nTimeOut>,  'WaitNamedPipeW',  \
    WideCharToMultiByte, <.CodePage, .dwFlags, .lpWideCharStr, .cchWideChar, .lpMultiByteStr, .cchMultiByte, .lpDefaultChar, .lpUsedDefaultChar,  \
      >,  'WideCharToMultiByte',  \
    WinExec, <.lpCmdLine, .nCmdShow>,  'WinExec',  \
    WriteConsoleA, <.hConsoleOutput, .lpBuffer, .nNumberOfCharsToWrite, .lpNumberOfCharsWritten, .lpReserved>,  'WriteConsoleA',  \
    WriteConsoleInputA, <.hConsoleInput, .lpBuffer, .nLength, .lpNumberOfEventsWritten>,  'WriteConsoleInputA',  \
    WriteConsoleInputVDMA, <NONE>,  'WriteConsoleInputVDMA',  \
    WriteConsoleInputVDMW, <NONE>,  'WriteConsoleInputVDMW',  \
    WriteConsoleInputW, <.hConsoleInput, .lpBuffer, .nLength, .lpNumberOfEventsWritten>,  'WriteConsoleInputW',  \
    WriteConsoleOutputA, <.hConsoleOutput, .lpBuffer, .dwBufferSize, .dwBufferCoord, .lpWriteRegion>,  'WriteConsoleOutputA',  \
    WriteConsoleOutputAttribute, <.hConsoleOutput, .lpAttribute, .nLength, .dwWriteCoord, .lpNumberOfAttrsWritten>,  'WriteConsoleOutputAttribute',  \
    WriteConsoleOutputCharacterA, <.hConsoleOutput, .lpCharacter, .nLength, .dwWriteCoord, .lpNumberOfCharsWritten>,  'WriteConsoleOutputCharacterA',  \
    WriteConsoleOutputCharacterW, <.hConsoleOutput, .lpCharacter, .nLength, .dwWriteCoord, .lpNumberOfCharsWritten>,  'WriteConsoleOutputCharacterW',  \
    WriteConsoleOutputW, <.hConsoleOutput, .lpBuffer, .dwBufferSize, .dwBufferCoord, .lpWriteRegion>,  'WriteConsoleOutputW',  \
    WriteConsoleW, <.hConsoleOutput, .lpBuffer, .nNumberOfCharsToWrite, .lpNumberOfCharsWritten, .lpReserved>,  'WriteConsoleW',  \
    WriteFile, <.hFile, .lpBuffer, .nNumberOfBytesToWrite, .lpNumberOfBytesWritten, .lpOverlapped>,  'WriteFile',  \
    WriteFileEx, <.hFile, .lpBuffer, .nNumberOfBytesToWrite, .lpOverlapped, .lpCompletionRoutine>,  'WriteFileEx',  \
    WriteFileGather, <.hFile, .aSegmentArray, .nNumberOfBytesToWrite, .lpReserved, .lpOverlapped>,  'WriteFileGather',  \
    WritePrivateProfileSectionA, <.lpAppName, .lpString, .lpFileName>,  'WritePrivateProfileSectionA',  \
    WritePrivateProfileSectionW, <.lpAppName, .lpString, .lpFileName>,  'WritePrivateProfileSectionW',  \
    WritePrivateProfileStringA, <.lpApplicationName, .lpKeyName, .lpString, .lpFileName>,  'WritePrivateProfileStringA',  \
    WritePrivateProfileStringW, <.lpApplicationName, .lpKeyName, .lpString, .lpFileName>,  'WritePrivateProfileStringW',  \
    WritePrivateProfileStructA, <.lpszSection, .lpszKey, .lpStruct, .uSizeStruct, .szFile>,  'WritePrivateProfileStructA',  \
    WritePrivateProfileStructW, <.lpszSection, .lpszKey, .lpStruct, .uSizeStruct, .szFile>,  'WritePrivateProfileStructW',  \
    WriteProcessMemory, <.hProcess, .lpBaseAddress, .lpBuffer, .nSize, .lpNumberOfBytesWritten>,  'WriteProcessMemory',  \
    WriteProfileSectionA, <.lpAppName, .lpString>,  'WriteProfileSectionA',  \
    WriteProfileSectionW, <.lpAppName, .lpString>,  'WriteProfileSectionW',  \
    WriteProfileStringA, <.lpszSection, .lpszKeyName, .lpszString>,  'WriteProfileStringA',  \
    WriteProfileStringW, <.lpszSection, .lpszKeyName, .lpszString>,  'WriteProfileStringW',  \
    WriteTapemark, <.hDevice, .dwTapemarkType, .dwTapemarkCount, .bimmediate>,  'WriteTapemark',  \
    ZombifyActCtx, <NONE>,  'ZombifyActCtx',  \
    _hread, <NONE>,  '_hread',  \
    _hwrite, <NONE>,  '_hwrite',  \
    _lclose, <NONE>,  '_lclose',  \
    _lcreat, <NONE>,  '_lcreat',  \
    _llseek, <NONE>,  '_llseek',  \
    _lopen, <NONE>,  '_lopen',  \
    _lread, <NONE>,  '_lread',  \
    _lwrite, <NONE>,  '_lwrite',  \
    lstrcat, <.lpString1, .lpString2>,  'lstrcat',  \
    lstrcatA, <.lpString1, .lpString2>,  'lstrcatA',  \
    lstrcatW, <.lpString1, .lpString2>,  'lstrcatW',  \
    lstrcmp, <.lpString1, .lpString2>,  'lstrcmp',  \
    lstrcmpA, <.lpString1, .lpString2>,  'lstrcmpA',  \
    lstrcmpW, <.lpString1, .lpString2>,  'lstrcmpW',  \
    lstrcmpi, <.lpString1, .lpString2>,  'lstrcmpi',  \
    lstrcmpiA, <.lpString1, .lpString2>,  'lstrcmpiA',  \
    lstrcmpiW, <.lpString1, .lpString2>,  'lstrcmpiW',  \
    lstrcpy, <.lpString1, .lpString2>,  'lstrcpy',  \
    lstrcpyA, <.lpString1, .lpString2>,  'lstrcpyA',  \
    lstrcpyW, <.lpString1, .lpString2>,  'lstrcpyW',  \
    lstrcpyn, <.lpString1, .lpString2, .iMaxLength>,  'lstrcpyn',  \
    lstrcpynA, <.lpString1, .lpString2, .iMaxLength>,  'lstrcpynA',  \
    lstrcpynW, <.lpString1, .lpString2, .iMaxLength>,  'lstrcpynW',  \
    lstrlen, <.lpString>,  'lstrlen',  \
    lstrlenA, <.lpString>,  'lstrlenA',  \
    lstrlenW, <.lpString>,  'lstrlenW'

Added freshlib/imports/Win32/msimg32.inc.









































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: msimg32.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto msimg32,  \
    AlphaBlend, <.hdcDest, .xDest, .yDest, .wDest, .hDest, .hdcSrc, .xSrc, .ySrc, .wSrc, .hSrc, .pBlendFn>,  'AlphaBlend',  \
    GradientFill, <.hdc, .PTRIVERTEX, .ulong, .pvoid>,  'GradientFill',  \
    TransparentBlt, <.hdc, .t, .uint>,  'TransparentBlt',  \
    vSetDdrawflag, <NONE>,  'vSetDdrawflag'

Added freshlib/imports/Win32/odbc32.inc.









































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: odbc32.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

import_proto odbc32,  \
    CloseODBCPerfData, <NONE>,  'CloseODBCPerfData',  \
    CollectODBCPerfData, <NONE>,  'CollectODBCPerfData',  \
    CursorLibLockDbc, <NONE>,  'CursorLibLockDbc',  \
    CursorLibLockDesc, <NONE>,  'CursorLibLockDesc',  \
    CursorLibLockStmt, <NONE>,  'CursorLibLockStmt',  \
    CursorLibTransact, <NONE>,  'CursorLibTransact',  \
    GetODBCSharedData, <NONE>,  'GetODBCSharedData',  \
    LockHandle, <NONE>,  'LockHandle',  \
    MpHeapAlloc, <NONE>,  'MpHeapAlloc',  \
    MpHeapCompact, <NONE>,  'MpHeapCompact',  \
    MpHeapCreate, <NONE>,  'MpHeapCreate',  \
    MpHeapDestroy, <NONE>,  'MpHeapDestroy',  \
    MpHeapFree, <NONE>,  'MpHeapFree',  \
    MpHeapReAlloc, <NONE>,  'MpHeapReAlloc',  \
    MpHeapSize, <NONE>,  'MpHeapSize',  \
    MpHeapValidate, <NONE>,  'MpHeapValidate',  \
    ODBCGetTryWaitValue, <VOID>,  'ODBCGetTryWaitValue',  \
    ODBCInternalConnectW, <NONE>,  'ODBCInternalConnectW',  \
    ODBCQualifyFileDSNW, <NONE>,  'ODBCQualifyFileDSNW',  \
    ODBCSetTryWaitValue, <.dwValue>,  'ODBCSetTryWaitValue',  \
    OpenODBCPerfData, <NONE>,  'OpenODBCPerfData',  \
    PostComponentError, <NONE>,  'PostComponentError',  \
    PostODBCComponentError, <NONE>,  'PostODBCComponentError',  \
    PostODBCError, <NONE>,  'PostODBCError',  \
    SQLAllocConnect, <.henv, .phdbc>,  'SQLAllocConnect',  \
    SQLAllocEnv, <.phenv>,  'SQLAllocEnv',  \
    SQLAllocHandle, <.HandleType, .InputHandle, .OutputHandle>,  'SQLAllocHandle',  \
    SQLAllocHandleStd, <.fHandleType, .hInput, .phOutput>,  'SQLAllocHandleStd',  \
    SQLAllocStmt, <.hdbc, .phstmt>,  'SQLAllocStmt',  \
    SQLBindCol, <.hstmt, .icol, .fCType, .rgbValue, .cbValueMax, .pcbValue>,  'SQLBindCol',  \
    SQLBindParam, <.StatementHandle, .ParameterNumber, .ValueType, .ParameterType, .LengthPrecision, .ParameterScale, .ParameterValue,  \
        .StrLen_or_Ind>,  'SQLBindParam',  \
    SQLBindParameter, <.hstmt, .ipar, .fParamType, .fCType, .fSqlType, .cbColDef, .ibScale, .rgbValue, .cbValueMax, .pcbValue>,  'SQLBindParameter',  \
    SQLBrowseConnect, <.hdbc, .szConnStrIn, .cbConnStrIn, .szConnStrOut, .cbConnStrOutMax, .pcbConnStrOut>,  'SQLBrowseConnect',  \
    SQLBrowseConnectA, <.hdbc, .szConnStrIn, .cbConnStrIn, .szConnStrOut, .cbConnStrOutMax, .pcbConnStrOut>,  'SQLBrowseConnectA',  \
    SQLBrowseConnectW, <.hdbc, .szConnStrIn, .cbConnStrIn, .szConnStrOut, .cbConnStrOutMax, .pcbConnStrOut>,  'SQLBrowseConnectW',  \
    SQLBulkOperations, <.StatementHandle, .Operation>,  'SQLBulkOperations',  \
    SQLCancel, <.hstmt>,  'SQLCancel',  \
    SQLCloseCursor, <.StatementHandle>,  'SQLCloseCursor',  \
    SQLColAttribute, <.hstmt, .iCol, .iField, .pCharAttr, .cbCharAttrMax, .pcbCharAttr, .pNumAttr>,  'SQLColAttribute',  \
    SQLColAttributeA, <.hstmt, .iCol, .iField, .pCharAttr, .cbCharAttrMax, .pcbCharAttr, .pNumAttr>,  'SQLColAttributeA',  \
    SQLColAttributeW, <.hstmt, .iCol, .iField, .pCharAttr, .cbCharAttrMax, .pcbCharAttr, .pNumAttr>,  'SQLColAttributeW',  \
    SQLColAttributes, <.hstmt, .icol, .fDescType, .rgbDesc, .cbDescMax, .pcbDesc, .pfDesc>,  'SQLColAttributes',  \
    SQLColAttributesA, <.hstmt, .icol, .fDescType, .rgbDesc, .cbDescMax, .pcbDesc, .pfDesc>,  'SQLColAttributesA',  \
    SQLColAttributesW, <.hstmt, .icol, .fDescType, .rgbDesc, .cbDescMax, .pcbDesc, .pfDesc>,  'SQLColAttributesW',  \
    SQLColumnPrivileges, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szColumnName,  \
        .cbColumnName>,  'SQLColumnPrivileges',  \
    SQLColumnPrivilegesA, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szColumnName,  \
        .cbColumnName>,  'SQLColumnPrivilegesA',  \
    SQLColumnPrivilegesW, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szColumnName,  \
        .cbColumnName>,  'SQLColumnPrivilegesW',  \
    SQLColumns, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szColumnName, .cbColumnName,  \
      >,  'SQLColumns',  \
    SQLColumnsA, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szColumnName,  \
        .cbColumnName>,  'SQLColumnsA',  \
    SQLColumnsW, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szColumnName,  \
        .cbColumnName>,  'SQLColumnsW',  \
    SQLConnect, <.hdbc, .szDSN, .cbDSN, .szUID, .cbUID, .szAuthStr, .cbAuthStr>,  'SQLConnect',  \
    SQLConnectA, <.hdbc, .szDSN, .cbDSN, .szUID, .cbUID, .szAuthStr, .cbAuthStr>,  'SQLConnectA',  \
    SQLConnectW, <.hdbc, .szDSN, .cbDSN, .szUID, .cbUID, .szAuthStr, .cbAuthStr>,  'SQLConnectW',  \
    SQLCopyDesc, <.SourceDescHandle, .TargetDescHandle>,  'SQLCopyDesc',  \
    SQLDataSources, <.henv, .fDirection, .szDSN, .cbDSNMax, .pcbDSN, .szDescription, .cbDescriptionMax, .pcbDescription>,  'SQLDataSources',  \
    SQLDataSourcesA, <.henv, .fDirection, .szDSN, .cbDSNMax, .pcbDSN, .szDescription, .cbDescriptionMax, .pcbDescription>,  'SQLDataSourcesA',  \
    SQLDataSourcesW, <.henv, .fDirection, .szDSN, .cbDSNMax, .pcbDSN, .szDescription, .cbDescriptionMax, .pcbDescription>,  'SQLDataSourcesW',  \
    SQLDescribeCol, <.hstmt, .icol, .szColName, .cbColNameMax, .pcbColName, .pfSqlType, .pcbColDef, .pibScale, .pfNullable>,  'SQLDescribeCol',  \
    SQLDescribeColA, <.hstmt, .icol, .szColName, .cbColNameMax, .pcbColName, .pfSqlType, .pcbColDef, .pibScale, .pfNullable>,  'SQLDescribeColA',  \
    SQLDescribeColW, <.hstmt, .icol, .szColName, .cbColNameMax, .pcbColName, .pfSqlType, .pcbColDef, .pibScale, .pfNullable>,  'SQLDescribeColW',  \
    SQLDescribeParam, <.hstmt, .ipar, .pfSqlType, .pcbParamDef, .pibScale, .pfNullable>,  'SQLDescribeParam',  \
    SQLDisconnect, <.hdbc>,  'SQLDisconnect',  \
    SQLDriverConnect, <.hdbc, .hwnd, .szConnStrIn, .cbConnStrIn, .szConnStrOut, .cbConnStrOutMax, .pcbConnStrOut, .fDriverCompletion,  \
      >,  'SQLDriverConnect',  \
    SQLDriverConnectA, <.hdbc, .hwnd, .szConnStrIn, .cbConnStrIn, .szConnStrOut, .cbConnStrOutMax, .pcbConnStrOut, .fDriverCompletion,  \
      >,  'SQLDriverConnectA',  \
    SQLDriverConnectW, <.hdbc, .hwnd, .szConnStrIn, .cbConnStrIn, .szConnStrOut, .cbConnStrOutMax, .pcbConnStrOut, .fDriverCompletion,  \
      >,  'SQLDriverConnectW',  \
    SQLDrivers, <.henv, .fDirection, .szDriverDesc, .cbDriverDescMax, .pcbDriverDesc, .szDriverAttributes, .cbDrvrAttrMax, .pcbDrvrAttr,  \
      >,  'SQLDrivers',  \
    SQLDriversA, <.henv, .fDirection, .szDriverDesc, .cbDriverDescMax, .pcbDriverDesc, .szDriverAttributes, .cbDrvrAttrMax, .pcbDrvrAttr,  \
      >,  'SQLDriversA',  \
    SQLDriversW, <.henv, .fDirection, .szDriverDesc, .cbDriverDescMax, .pcbDriverDesc, .szDriverAttributes, .cbDrvrAttrMax, .pcbDrvrAttr,  \
      >,  'SQLDriversW',  \
    SQLEndTran, <.HandleType, .handle, .CompletionType>,  'SQLEndTran',  \
    SQLError, <.henv, .hdbc, .hstmt, .szSqlState, .pfNativeError, .szErrorMsg, .cbErrorMsgMax, .pcbErrorMsg>,  'SQLError',  \
    SQLErrorA, <.henv, .hdbc, .hstmt, .szSqlState, .pfNativeError, .szErrorMsg, .cbErrorMsgMax, .pcbErrorMsg>,  'SQLErrorA',  \
    SQLErrorW, <.henv, .hdbc, .hstmt, .szSqlState, .pfNativeError, .szErrorMsg, .cbErrorMsgMax, .pcbErrorMsg>,  'SQLErrorW',  \
    SQLExecDirect, <.hstmt, .szSqlStr, .cbSqlStr>,  'SQLExecDirect',  \
    SQLExecDirectA, <.hstmt, .szSqlStr, .cbSqlStr>,  'SQLExecDirectA',  \
    SQLExecDirectW, <.hstmt, .szSqlStr, .cbSqlStr>,  'SQLExecDirectW',  \
    SQLExecute, <.hstmt>,  'SQLExecute',  \
    SQLExtendedFetch, <.hstmt, .fFetchType, .irow, .pcrow, .rgfRowStatus>,  'SQLExtendedFetch',  \
    SQLFetch, <.hstmt>,  'SQLFetch',  \
    SQLFetchScroll, <.StatementHandle, .FetchOrientation, .FetchOffset>,  'SQLFetchScroll',  \
    SQLForeignKeys, <.hstmt, .szPkCatalogName, .cbPkCatalogName, .szPkSchemaName, .cbPkSchemaName, .szPkTableName, .cbPkTableName,  \
        .szFkCatalogName, .cbFkCatalogName, .szFkSchemaName, .cbFkSchemaName, .szFkTableName, .cbFkTableName>,  'SQLForeignKeys',  \
    SQLForeignKeysA, <.hstmt, .szPkCatalogName, .cbPkCatalogName, .szPkSchemaName, .cbPkSchemaName, .szPkTableName, .cbPkTableName,  \
        .szFkCatalogName, .cbFkCatalogName, .szFkSchemaName, .cbFkSchemaName, .szFkTableName, .cbFkTableName>,  'SQLForeignKeysA',  \
    SQLForeignKeysW, <.hstmt, .szPkCatalogName, .cbPkCatalogName, .szPkSchemaName, .cbPkSchemaName, .szPkTableName, .cbPkTableName,  \
        .szFkCatalogName, .cbFkCatalogName, .szFkSchemaName, .cbFkSchemaName, .szFkTableName, .cbFkTableName>,  'SQLForeignKeysW',  \
    SQLFreeConnect, <.hdbc>,  'SQLFreeConnect',  \
    SQLFreeEnv, <.henv>,  'SQLFreeEnv',  \
    SQLFreeHandle, <.HandleType, .handle>,  'SQLFreeHandle',  \
    SQLFreeStmt, <.hstmt, .fOption>,  'SQLFreeStmt',  \
    SQLGetConnectAttr, <.ConnectionHandle, .lAttribute, .lValue, .BufferLength, .StringLength>,  'SQLGetConnectAttr',  \
    SQLGetConnectAttrA, <.ConnectionHandle, .lAttribute, .lValue, .BufferLength, .StringLength>,  'SQLGetConnectAttrA',  \
    SQLGetConnectAttrW, <.ConnectionHandle, .lAttribute, .lValue, .BufferLength, .StringLength>,  'SQLGetConnectAttrW',  \
    SQLGetConnectOption, <.hdbc, .fOption, .pvParam>,  'SQLGetConnectOption',  \
    SQLGetConnectOptionA, <.hdbc, .fOption, .pvParam>,  'SQLGetConnectOptionA',  \
    SQLGetConnectOptionW, <.hdbc, .fOption, .pvParam>,  'SQLGetConnectOptionW',  \
    SQLGetCursorName, <.hstmt, .szCursor, .cbCursorMax, .pcbCursor>,  'SQLGetCursorName',  \
    SQLGetCursorNameA, <.hstmt, .szCursor, .cbCursorMax, .pcbCursor>,  'SQLGetCursorNameA',  \
    SQLGetCursorNameW, <.hstmt, .szCursor, .cbCursorMax, .pcbCursor>,  'SQLGetCursorNameW',  \
    SQLGetData, <.hstmt, .icol, .fCType, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetData',  \
    SQLGetDescField, <.hdesc, .iRecord, .iField, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetDescField',  \
    SQLGetDescFieldA, <.hdesc, .iRecord, .iField, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetDescFieldA',  \
    SQLGetDescFieldW, <.hdesc, .iRecord, .iField, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetDescFieldW',  \
    SQLGetDescRec, <.hdesc, .iRecord, .szName, .cbNameMax, .pcbName, .pfType, .pfSubType, .pLength, .pPrecision, .pScale, .pNullable,  \
      >,  'SQLGetDescRec',  \
    SQLGetDescRecA, <.hdesc, .iRecord, .szName, .cbNameMax, .pcbName, .pfType, .pfSubType, .pLength, .pPrecision, .pScale, .pNullable,  \
      >,  'SQLGetDescRecA',  \
    SQLGetDescRecW, <.hdesc, .iRecord, .szName, .cbNameMax, .pcbName, .pfType, .pfSubType, .pLength, .pPrecision, .pScale, .pNullable,  \
      >,  'SQLGetDescRecW',  \
    SQLGetDiagField, <.HandleType, .handle, .RecNumber, .DiagIdentifier, .DiagInfo, .BufferLength, .StringLength>,  'SQLGetDiagField',  \
    SQLGetDiagFieldA, <.HandleType, .handle, .RecNumber, .DiagIdentifier, .DiagInfo, .BufferLength, .StringLength>,  'SQLGetDiagFieldA',  \
    SQLGetDiagFieldW, <.HandleType, .handle, .RecNumber, .DiagIdentifier, .DiagInfo, .BufferLength, .StringLength>,  'SQLGetDiagFieldW',  \
    SQLGetDiagRec, <.fHandleType, .handle, .iRecord, .szSqlState, .pfNativeError, .szErrorMsg, .cbErrorMsgMax, .pcbErrorMsg>,  'SQLGetDiagRec',  \
    SQLGetDiagRecA, <.fHandleType, .handle, .iRecord, .szSqlState, .pfNativeError, .szErrorMsg, .cbErrorMsgMax, .pcbErrorMsg>,  'SQLGetDiagRecA',  \
    SQLGetDiagRecW, <.fHandleType, .handle, .iRecord, .szSqlState, .pfNativeError, .szErrorMsg, .cbErrorMsgMax, .pcbErrorMsg>,  'SQLGetDiagRecW',  \
    SQLGetEnvAttr, <.EnvironmentHandle, .lAttribute, .lValue, .BufferLength, .StringLength>,  'SQLGetEnvAttr',  \
    SQLGetFunctions, <.hdbc, .fFunction, .pfExists>,  'SQLGetFunctions',  \
    SQLGetInfo, <.hdbc, .fInfoType, .rgbInfoValue, .cbInfoValueMax, .pcbInfoValue>,  'SQLGetInfo',  \
    SQLGetInfoA, <.hdbc, .fInfoType, .rgbInfoValue, .cbInfoValueMax, .pcbInfoValue>,  'SQLGetInfoA',  \
    SQLGetInfoW, <.hdbc, .fInfoType, .rgbInfoValue, .cbInfoValueMax, .pcbInfoValue>,  'SQLGetInfoW',  \
    SQLGetStmtAttr, <.hstmt, .fAttribute, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetStmtAttr',  \
    SQLGetStmtAttrA, <.hstmt, .fAttribute, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetStmtAttrA',  \
    SQLGetStmtAttrW, <.hstmt, .fAttribute, .rgbValue, .cbValueMax, .pcbValue>,  'SQLGetStmtAttrW',  \
    SQLGetStmtOption, <.hstmt, .fOption, .pvParam>,  'SQLGetStmtOption',  \
    SQLGetTypeInfo, <.hstmt, .fSqlType>,  'SQLGetTypeInfo',  \
    SQLGetTypeInfoA, <.hstmt, .fSqlType>,  'SQLGetTypeInfoA',  \
    SQLGetTypeInfoW, <.hstmt, .fSqlType>,  'SQLGetTypeInfoW',  \
    SQLMoreResults, <.hstmt>,  'SQLMoreResults',  \
    SQLNativeSql, <.hdbc, .szSqlStrIn, .cbSqlStrIn, .szSqlStr, .cbSqlStrMax, .pcbSqlStr>,  'SQLNativeSql',  \
    SQLNativeSqlA, <.hdbc, .szSqlStrIn, .cbSqlStrIn, .szSqlStr, .cbSqlStrMax, .pcbSqlStr>,  'SQLNativeSqlA',  \
    SQLNativeSqlW, <.hdbc, .szSqlStrIn, .cbSqlStrIn, .szSqlStr, .cbSqlStrMax, .pcbSqlStr>,  'SQLNativeSqlW',  \
    SQLNumParams, <.hstmt, .pcpar>,  'SQLNumParams',  \
    SQLNumResultCols, <.hstmt, .pccol>,  'SQLNumResultCols',  \
    SQLParamData, <.hstmt, .prgbValue>,  'SQLParamData',  \
    SQLParamOptions, <.hstmt, .crow, .pirow>,  'SQLParamOptions',  \
    SQLPrepare, <.hstmt, .szSqlStr, .cbSqlStr>,  'SQLPrepare',  \
    SQLPrepareA, <.hstmt, .szSqlStr, .cbSqlStr>,  'SQLPrepareA',  \
    SQLPrepareW, <.hstmt, .szSqlStr, .cbSqlStr>,  'SQLPrepareW',  \
    SQLPrimaryKeys, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName>,  'SQLPrimaryKeys',  \
    SQLPrimaryKeysA, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName>,  'SQLPrimaryKeysA',  \
    SQLPrimaryKeysW, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName>,  'SQLPrimaryKeysW',  \
    SQLProcedureColumns, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szProcName, .cbProcName, .szColumnName,  \
        .cbColumnName>,  'SQLProcedureColumns',  \
    SQLProcedureColumnsA, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szProcName, .cbProcName, .szColumnName,  \
        .cbColumnName>,  'SQLProcedureColumnsA',  \
    SQLProcedureColumnsW, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szProcName, .cbProcName, .szColumnName,  \
        .cbColumnName>,  'SQLProcedureColumnsW',  \
    SQLProcedures, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szProcName, .cbProcName>,  'SQLProcedures',  \
    SQLProceduresA, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szProcName, .cbProcName>,  'SQLProceduresA',  \
    SQLProceduresW, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szProcName, .cbProcName>,  'SQLProceduresW',  \
    SQLPutData, <.hstmt, .rgbValue, .cbValue>,  'SQLPutData',  \
    SQLRowCount, <.hstmt, .pcrow>,  'SQLRowCount',  \
    SQLSetConnectAttr, <.hdbc, .fAttribute, .rgbValue, .cbValue>,  'SQLSetConnectAttr',  \
    SQLSetConnectAttrA, <.hdbc, .fAttribute, .rgbValue, .cbValue>,  'SQLSetConnectAttrA',  \
    SQLSetConnectAttrW, <.hdbc, .fAttribute, .rgbValue, .cbValue>,  'SQLSetConnectAttrW',  \
    SQLSetConnectOption, <.hdbc, .fOption, .vParam>,  'SQLSetConnectOption',  \
    SQLSetConnectOptionA, <.hdbc, .fOption, .vParam>,  'SQLSetConnectOptionA',  \
    SQLSetConnectOptionW, <.hdbc, .fOption, .vParam>,  'SQLSetConnectOptionW',  \
    SQLSetCursorName, <.hstmt, .szCursor, .cbCursor>,  'SQLSetCursorName',  \
    SQLSetCursorNameA, <.hstmt, .szCursor, .cbCursor>,  'SQLSetCursorNameA',  \
    SQLSetCursorNameW, <.hstmt, .szCursor, .cbCursor>,  'SQLSetCursorNameW',  \
    SQLSetDescField, <.DescriptorHandle, .RecNumber, .FieldIdentifier, .Value, .BufferLength>,  'SQLSetDescField',  \
    SQLSetDescFieldA, <.DescriptorHandle, .RecNumber, .FieldIdentifier, .Value, .BufferLength>,  'SQLSetDescFieldA',  \
    SQLSetDescFieldW, <.DescriptorHandle, .RecNumber, .FieldIdentifier, .Value, .BufferLength>,  'SQLSetDescFieldW',  \
    SQLSetDescRec, <.DescriptorHandle, .RecNumber, .lType, .SubType, .Length, .Precision, .kScale, .Data, .StringLength, .Indicator,  \
      >,  'SQLSetDescRec',  \
    SQLSetEnvAttr, <.EnvironmentHandle, .lAttribute, .Value, .StringLength>,  'SQLSetEnvAttr',  \
    SQLSetParam, <.hstmt, .ipar, .fCType, .fSqlType, .cbParamDef, .ibScale, .rgbValue, .pcbValue>,  'SQLSetParam',  \
    SQLSetPos, <.hstmt, .irow, .fOption, .fLock>,  'SQLSetPos',  \
    SQLSetScrollOptions, <.hstmt, .fConcurrency, .crowKeyset, .crowRowset>,  'SQLSetScrollOptions',  \
    SQLSetStmtAttr, <.StatementHandle, .lAttribute, .Value, .StringLength>,  'SQLSetStmtAttr',  \
    SQLSetStmtAttrA, <.StatementHandle, .lAttribute, .Value, .StringLength>,  'SQLSetStmtAttrA',  \
    SQLSetStmtAttrW, <.StatementHandle, .lAttribute, .Value, .StringLength>,  'SQLSetStmtAttrW',  \
    SQLSetStmtOption, <.hstmt, .fOption, .vParam>,  'SQLSetStmtOption',  \
    SQLSpecialColumns, <.hstmt, .fColType, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName,  \
        .fScope, .fNullable>,  'SQLSpecialColumns',  \
    SQLSpecialColumnsA, <.hstmt, .fColType, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName,  \
        .fScope, .fNullable>,  'SQLSpecialColumnsA',  \
    SQLSpecialColumnsW, <.hstmt, .fColType, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName,  \
        .fScope, .fNullable>,  'SQLSpecialColumnsW',  \
    SQLStatistics, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .fUnique, .fAccuracy,  \
      >,  'SQLStatistics',  \
    SQLStatisticsA, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .fUnique, .fAccuracy,  \
      >,  'SQLStatisticsA',  \
    SQLStatisticsW, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .fUnique, .fAccuracy,  \
      >,  'SQLStatisticsW',  \
    SQLTablePrivileges, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName>,  'SQLTablePrivileges',  \
    SQLTablePrivilegesA, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName>,  'SQLTablePrivilegesA',  \
    SQLTablePrivilegesW, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName>,  'SQLTablePrivilegesW',  \
    SQLTables, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szTableType, .cbTableType,  \
      >,  'SQLTables',  \
    SQLTablesA, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szTableType, .cbTableType,  \
      >,  'SQLTablesA',  \
    SQLTablesW, <.hstmt, .szCatalogName, .cbCatalogName, .szSchemaName, .cbSchemaName, .szTableName, .cbTableName, .szTableType, .cbTableType,  \
      >,  'SQLTablesW',  \
    SQLTransact, <.henv, .hdbc, .fType>,  'SQLTransact',  \
    SearchStatusCode, <NONE>,  'SearchStatusCode',  \
    VFreeErrors, <NONE>,  'VFreeErrors',  \
    VRetrieveDriverErrorsRowCol, <NONE>,  'VRetrieveDriverErrorsRowCol',  \
    ValidateErrorQueue, <NONE>,  'ValidateErrorQueue',  \
    g_hHeapMalloc, <NONE>,  'g_hHeapMalloc'

Added freshlib/imports/Win32/ole32.inc.

















































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: ole32.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto ole32,  \
    BindMoniker, <.pmk, .grfOpt, .iidResult, .ppvResult>,  'BindMoniker',  \
    CLIPFORMAT_UserFree, <.pLong, .pClipformat>,  'CLIPFORMAT_UserFree',  \
    CLIPFORMAT_UserMarshal, <.pLong, .pChar, .pClipformat>,  'CLIPFORMAT_UserMarshal',  \
    CLIPFORMAT_UserSize, <.pLong, .lLong, .pClipformat>,  'CLIPFORMAT_UserSize',  \
    CLIPFORMAT_UserUnmarshal, <.pLong, .pChar, .pClipformat>,  'CLIPFORMAT_UserUnmarshal',  \
    CLSIDFromOle1Class, <NONE>,  'CLSIDFromOle1Class',  \
    CLSIDFromProgID, <.TSzProgID, .T>,  'CLSIDFromProgID',  \
    CLSIDFromProgIDEx, <.lpszProgID, .lpclsid>,  'CLSIDFromProgIDEx',  \
    CLSIDFromString, <.lpsz, .pclsid>,  'CLSIDFromString',  \
    CoAddRefServerProcess, <VOID>,  'CoAddRefServerProcess',  \
    CoAllowSetForegroundWindow, <.pUnk, .lpvReserved>,  'CoAllowSetForegroundWindow',  \
    CoBuildVersion, <VOID>,  'CoBuildVersion',  \
    CoCancelCall, <.dwThreadId, .ulTimeout>,  'CoCancelCall',  \
    CoCopyProxy, <.pProxy, .ppCopy>,  'CoCopyProxy',  \
    CoCreateFreeThreadedMarshaler, <.punkOuter, .ppunkMarshal>,  'CoCreateFreeThreadedMarshaler',  \
    CoCreateGuid, <.pguid>,  'CoCreateGuid',  \
    CoCreateInstance, <.rclsid, .pUnkOuter, .dwClsContext, .riid, .ppv>,  'CoCreateInstance',  \
    CoCreateInstanceEx, <.Clsid, .punkOuter, .dwClsCtx, .pServerInfo, .dwCount, .pResults>,  'CoCreateInstanceEx',  \
    CoCreateObjectInContext, <NONE>,  'CoCreateObjectInContext',  \
    CoDeactivateObject, <NONE>,  'CoDeactivateObject',  \
    CoDisableCallCancellation, <.pReserved>,  'CoDisableCallCancellation',  \
    CoDisconnectObject, <.pUnk, .dwReserved>,  'CoDisconnectObject',  \
    CoDosDateTimeToFileTime, <.nDosDate, .nDosTime, .lpFileTime>,  'CoDosDateTimeToFileTime',  \
    CoEnableCallCancellation, <.pReserved>,  'CoEnableCallCancellation',  \
    CoFileTimeNow, <.lpFileTime>,  'CoFileTimeNow',  \
    CoFileTimeToDosDateTime, <.lpFileTime, .lpDosDate, .lpDosTime>,  'CoFileTimeToDosDateTime',  \
    CoFreeAllLibraries, <VOID>,  'CoFreeAllLibraries',  \
    CoFreeLibrary, <.hInst>,  'CoFreeLibrary',  \
    CoFreeUnusedLibraries, <VOID>,  'CoFreeUnusedLibraries',  \
    CoFreeUnusedLibrariesEx, <NONE>,  'CoFreeUnusedLibrariesEx',  \
    CoGetApartmentID, <NONE>,  'CoGetApartmentID',  \
    CoGetCallContext, <.riid, .ppInterface>,  'CoGetCallContext',  \
    CoGetCallerTID, <NONE>,  'CoGetCallerTID',  \
    CoGetCancelObject, <.dwThreadId, .iid, .ppUnk>,  'CoGetCancelObject',  \
    CoGetClassObject, <.rclsid, .dwClsContext, .pvReserved, .riid, .ppv>,  'CoGetClassObject',  \
    CoGetClassVersion, <.pClassSpec, .pdwVersionMS, .pdwVersionLS>,  'CoGetClassVersion',  \
    CoGetComCatalog, <NONE>,  'CoGetComCatalog',  \
    CoGetContextToken, <NONE>,  'CoGetContextToken',  \
    CoGetCurrentLogicalThreadId, <NONE>,  'CoGetCurrentLogicalThreadId',  \
    CoGetCurrentProcess, <VOID>,  'CoGetCurrentProcess',  \
    CoGetDefaultContext, <NONE>,  'CoGetDefaultContext',  \
    CoGetInstanceFromFile, <.pServerInfo, .pClsid, .punkOuter, .dwClsCtx, .grfMode, .pwszName, .dwCount, .pResults>,  'CoGetInstanceFromFile',  \
    CoGetInstanceFromIStorage, <.pServerInfo, .pClsid, .punkOuter, .dwClsCtx, .pstg, .dwCount, .pResults>,  'CoGetInstanceFromIStorage',  \
    CoGetInterceptor, <NONE>,  'CoGetInterceptor',  \
    CoGetInterceptorFromTypeInfo, <NONE>,  'CoGetInterceptorFromTypeInfo',  \
    CoGetInterfaceAndReleaseStream, <.pStm, .iid, .ppv>,  'CoGetInterfaceAndReleaseStream',  \
    CoGetMalloc, <.dwMemContext, .ppMalloc>,  'CoGetMalloc',  \
    CoGetMarshalSizeMax, <.pulSize, .riid, .pUnk, .dwDestContext, .pvDestContext, .mshlflags>,  'CoGetMarshalSizeMax',  \
    CoGetObject, <.pszName, .pBindOptions, .riid, .ppv>,  'CoGetObject',  \
    CoGetObjectContext, <.riid, .ppv>,  'CoGetObjectContext',  \
    CoGetPSClsid, <.riid, .pClsid>,  'CoGetPSClsid',  \
    CoGetProcessIdentifier, <NONE>,  'CoGetProcessIdentifier',  \
    CoGetStandardMarshal, <.riid, .pUnk, .dwDestContext, .pvDestContext, .mshlflags, .ppMarshal>,  'CoGetStandardMarshal',  \
    CoGetState, <NONE>,  'CoGetState',  \
    CoGetStdMarshalEx, <.pUnkOuter, .smexflags, .ppUnkInner>,  'CoGetStdMarshalEx',  \
    CoGetSystemSecurityPermissions, <NONE>,  'CoGetSystemSecurityPermissions',  \
    CoGetTreatAsClass, <.clsidOld, .pClsidNew>,  'CoGetTreatAsClass',  \
    CoImpersonateClient, <VOID>,  'CoImpersonateClient',  \
    CoInitialize, <.pzReserved>,  'CoInitialize',  \
    CoInitializeEx, <.pvReserved, .dwCoInit>,  'CoInitializeEx',  \
    CoInitializeSecurity, <.pSecDesc, .cAuthSvc, .asAuthSvc, .pReserved1, .dwAuthnLevel, .dwImpLevel, .pAuthList, .dwCapabilities,  \
        .pReserved3>,  'CoInitializeSecurity',  \
    CoInitializeWOW, <NONE>,  'CoInitializeWOW',  \
    CoInstall, <.pbc, .dwFlags, .pClassSpec, .pQuery, .pszCodeBase>,  'CoInstall',  \
    CoInvalidateRemoteMachineBindings, <NONE>,  'CoInvalidateRemoteMachineBindings',  \
    CoIsHandlerConnected, <.pUnk>,  'CoIsHandlerConnected',  \
    CoIsOle1Class, <.rclsid>,  'CoIsOle1Class',  \
    CoLoadLibrary, <.lpszLibName, .bAutoFree>,  'CoLoadLibrary',  \
    CoLockObjectExternal, <.pUnk, .fLock, .fLastUnlockReleases>,  'CoLockObjectExternal',  \
    CoMarshalHresult, <.pstm, .hresult>,  'CoMarshalHresult',  \
    CoMarshalInterThreadInterfaceInStream, <.riid, .pUnk, .ppStm>,  'CoMarshalInterThreadInterfaceInStream',  \
    CoMarshalInterface, <.pStm, .riid, .pUnk, .dwDestContext, .pvDestContext, .mshlflags>,  'CoMarshalInterface',  \
    CoPopServiceDomain, <NONE>,  'CoPopServiceDomain',  \
    CoPushServiceDomain, <NONE>,  'CoPushServiceDomain',  \
    CoQueryAuthenticationServices, <.pcAuthSvc, .asAuthSvc>,  'CoQueryAuthenticationServices',  \
    CoQueryClientBlanket, <.pAuthnSvc, .pAuthzSvc, .pServerPrincName, .pAuthnLevel, .pImpLevel, .pPrivs, .pCapabilities>,  'CoQueryClientBlanket',  \
    CoQueryProxyBlanket, <.pProxy, .pwAuthnSvc, .pAuthzSvc, .pServerPrincName, .pAuthnLevel, .pImpLevel, .pAuthInfo, .pCapabilites,  \
      >,  'CoQueryProxyBlanket',  \
    CoQueryReleaseObject, <NONE>,  'CoQueryReleaseObject',  \
    CoReactivateObject, <NONE>,  'CoReactivateObject',  \
    CoRegisterChannelHook, <.ExtensionUuid, .pChannelHook>,  'CoRegisterChannelHook',  \
    CoRegisterClassObject, <.rclsid, .pUnk, .dwClsContext, .flags, .lpdwRegister>,  'CoRegisterClassObject',  \
    CoRegisterInitializeSpy, <NONE>,  'CoRegisterInitializeSpy',  \
    CoRegisterMallocSpy, <.pMallocSpy>,  'CoRegisterMallocSpy',  \
    CoRegisterMessageFilter, <.lpMessageFilter, .lplpMessageFilter>,  'CoRegisterMessageFilter',  \
    CoRegisterPSClsid, <.riid, .rclsid>,  'CoRegisterPSClsid',  \
    CoRegisterSurrogate, <.pSurrogate>,  'CoRegisterSurrogate',  \
    CoRegisterSurrogateEx, <NONE>,  'CoRegisterSurrogateEx',  \
    CoReleaseMarshalData, <.pStm>,  'CoReleaseMarshalData',  \
    CoReleaseServerProcess, <VOID>,  'CoReleaseServerProcess',  \
    CoResumeClassObjects, <VOID>,  'CoResumeClassObjects',  \
    CoRetireServer, <NONE>,  'CoRetireServer',  \
    CoRevertToSelf, <VOID>,  'CoRevertToSelf',  \
    CoRevokeClassObject, <.dwRegister>,  'CoRevokeClassObject',  \
    CoRevokeInitializeSpy, <NONE>,  'CoRevokeInitializeSpy',  \
    CoRevokeMallocSpy, <VOID>,  'CoRevokeMallocSpy',  \
    CoSetCancelObject, <.pUnk>,  'CoSetCancelObject',  \
    CoSetProxyBlanket, <.pProxy, .dwAuthnSvc, .dwAuthzSvc, .pServerPrincName, .dwAuthnLevel, .dwImpLevel, .pAuthInfo, .dwCapabilities,  \
      >,  'CoSetProxyBlanket',  \
    CoSetState, <NONE>,  'CoSetState',  \
    CoSuspendClassObjects, <VOID>,  'CoSuspendClassObjects',  \
    CoSwitchCallContext, <.pNewObject, .ppOldObject>,  'CoSwitchCallContext',  \
    CoTaskMemAlloc, <.cb>,  'CoTaskMemAlloc',  \
    CoTaskMemFree, <.lpIDList>,  'CoTaskMemFree',  \
    CoTaskMemRealloc, <.pv, .cb>,  'CoTaskMemRealloc',  \
    CoTestCancel, <VOID>,  'CoTestCancel',  \
    CoTreatAsClass, <.clsidOld, .clsidNew>,  'CoTreatAsClass',  \
    CoUninitialize, <VOID>,  'CoUninitialize',  \
    CoUnloadingWOW, <NONE>,  'CoUnloadingWOW',  \
    CoUnmarshalHresult, <.pstm, .phresult>,  'CoUnmarshalHresult',  \
    CoUnmarshalInterface, <.pStm, .riid, .ppv>,  'CoUnmarshalInterface',  \
    CoWaitForMultipleHandles, <.dwFlags, .dwTimeout, .cHandles, .pHandles, .lpdwindex>,  'CoWaitForMultipleHandles',  \
    ComPs_CStdStubBuffer_AddRef, <NONE>,  'ComPs_CStdStubBuffer_AddRef',  \
    ComPs_CStdStubBuffer_Connect, <NONE>,  'ComPs_CStdStubBuffer_Connect',  \
    ComPs_CStdStubBuffer_CountRefs, <NONE>,  'ComPs_CStdStubBuffer_CountRefs',  \
    ComPs_CStdStubBuffer_DebugServerQueryInterface, <NONE>,  'ComPs_CStdStubBuffer_DebugServerQueryInterface',  \
    ComPs_CStdStubBuffer_DebugServerRelease, <NONE>,  'ComPs_CStdStubBuffer_DebugServerRelease',  \
    ComPs_CStdStubBuffer_Disconnect, <NONE>,  'ComPs_CStdStubBuffer_Disconnect',  \
    ComPs_CStdStubBuffer_Invoke, <NONE>,  'ComPs_CStdStubBuffer_Invoke',  \
    ComPs_CStdStubBuffer_IsIIDSupported, <NONE>,  'ComPs_CStdStubBuffer_IsIIDSupported',  \
    ComPs_CStdStubBuffer_QueryInterface, <NONE>,  'ComPs_CStdStubBuffer_QueryInterface',  \
    ComPs_IUnknown_AddRef_Proxy, <NONE>,  'ComPs_IUnknown_AddRef_Proxy',  \
    ComPs_IUnknown_QueryInterface_Proxy, <NONE>,  'ComPs_IUnknown_QueryInterface_Proxy',  \
    ComPs_IUnknown_Release_Proxy, <NONE>,  'ComPs_IUnknown_Release_Proxy',  \
    ComPs_NdrCStdStubBuffer2_Release, <NONE>,  'ComPs_NdrCStdStubBuffer2_Release',  \
    ComPs_NdrCStdStubBuffer_Release, <NONE>,  'ComPs_NdrCStdStubBuffer_Release',  \
    ComPs_NdrClientCall2, <NONE>,  'ComPs_NdrClientCall2',  \
    ComPs_NdrClientCall2_va, <NONE>,  'ComPs_NdrClientCall2_va',  \
    ComPs_NdrDllCanUnloadNow, <NONE>,  'ComPs_NdrDllCanUnloadNow',  \
    ComPs_NdrDllGetClassObject, <NONE>,  'ComPs_NdrDllGetClassObject',  \
    ComPs_NdrDllRegisterProxy, <NONE>,  'ComPs_NdrDllRegisterProxy',  \
    ComPs_NdrDllUnregisterProxy, <NONE>,  'ComPs_NdrDllUnregisterProxy',  \
    ComPs_NdrStubCall2, <NONE>,  'ComPs_NdrStubCall2',  \
    ComPs_NdrStubForwardingFunction, <NONE>,  'ComPs_NdrStubForwardingFunction',  \
    CreateAntiMoniker, <.ppmk>,  'CreateAntiMoniker',  \
    CreateBindCtx, <.reserved, .ppbc>,  'CreateBindCtx',  \
    CreateClassMoniker, <.rclsid, .ppmk>,  'CreateClassMoniker',  \
    CreateDataAdviseHolder, <.ppDAHolder>,  'CreateDataAdviseHolder',  \
    CreateDataCache, <.pUnkOuter, .rclsid, .iid, .ppv>,  'CreateDataCache',  \
    CreateErrorInfo, <.pperrinfo>,  'CreateErrorInfo',  \
    CreateFileMoniker, <.lpszPathName, .ppmk>,  'CreateFileMoniker',  \
    CreateGenericComposite, <.pmkFirst, .pmkRest, .ppmkComposite>,  'CreateGenericComposite',  \
    CreateILockBytesOnHGlobal, <.hGlobal, .fDeleteOnRelease, .pplkbyt>,  'CreateILockBytesOnHGlobal',  \
    CreateItemMoniker, <.lpszDelim, .lpszItem, .ppmk>,  'CreateItemMoniker',  \
    CreateObjrefMoniker, <.punk, .ppmk>,  'CreateObjrefMoniker',  \
    CreateOleAdviseHolder, <.ppOAHolder>,  'CreateOleAdviseHolder',  \
    CreatePointerMoniker, <.punk, .ppmk>,  'CreatePointerMoniker',  \
    CreateStdProgressIndicator, <.hwndParent, .pszTitle, .pIbscCaller, .ppIbsc>,  'CreateStdProgressIndicator',  \
    CreateStreamOnHGlobal, <.hGlobal, .fDeleteOnRelease, .ppstm>,  'CreateStreamOnHGlobal',  \
    DcomChannelSetHResult, <NONE>,  'DcomChannelSetHResult',  \
    DoDragDrop, <.pDataObj, .pDropSource, .dwOKEffects, .pdwEffect>,  'DoDragDrop',  \
    EnableHookObject, <NONE>,  'EnableHookObject',  \
    FmtIdToPropStgName, <.pfmtid, .oszName>,  'FmtIdToPropStgName',  \
    FreePropVariantArray, <.cVariants, .rgvars>,  'FreePropVariantArray',  \
    GetClassFile, <.szFilename, .pclsid>,  'GetClassFile',  \
    GetConvertStg, <.pStg>,  'GetConvertStg',  \
    GetDocumentBitStg, <NONE>,  'GetDocumentBitStg',  \
    GetErrorInfo, <.dwReserved, .pperrinfo>,  'GetErrorInfo',  \
    GetHGlobalFromILockBytes, <.plkbyt, .phglobal>,  'GetHGlobalFromILockBytes',  \
    GetHGlobalFromStream, <.pstm, .phglobal>,  'GetHGlobalFromStream',  \
    GetHookInterface, <NONE>,  'GetHookInterface',  \
    GetRunningObjectTable, <.reserved, .pprot>,  'GetRunningObjectTable',  \
    HACCEL_UserFree, <.pLong, .pHaccel>,  'HACCEL_UserFree',  \
    HACCEL_UserMarshal, <.pLong, .pChar, .pHaccel>,  'HACCEL_UserMarshal',  \
    HACCEL_UserSize, <.pLong, .lLong, .pHaccel>,  'HACCEL_UserSize',  \
    HACCEL_UserUnmarshal, <.pLong, .pChar, .pHaccel>,  'HACCEL_UserUnmarshal',  \
    HBITMAP_UserFree, <.pLong, .pHbitmap>,  'HBITMAP_UserFree',  \
    HBITMAP_UserMarshal, <.pLong, .pChar, .pHbitmap>,  'HBITMAP_UserMarshal',  \
    HBITMAP_UserSize, <.pLong, .lLong, .pHbitmap>,  'HBITMAP_UserSize',  \
    HBITMAP_UserUnmarshal, <.pLong, .pChar, .pHbitmap>,  'HBITMAP_UserUnmarshal',  \
    HBRUSH_UserFree, <NONE>,  'HBRUSH_UserFree',  \
    HBRUSH_UserMarshal, <NONE>,  'HBRUSH_UserMarshal',  \
    HBRUSH_UserSize, <NONE>,  'HBRUSH_UserSize',  \
    HBRUSH_UserUnmarshal, <NONE>,  'HBRUSH_UserUnmarshal',  \
    HDC_UserFree, <.pLong, .pHdc>,  'HDC_UserFree',  \
    HDC_UserMarshal, <.pLong, .pChar, .pHdc>,  'HDC_UserMarshal',  \
    HDC_UserSize, <.pLong, .lLong, .pHdc>,  'HDC_UserSize',  \
    HDC_UserUnmarshal, <.pLong, .pChar, .pHdc>,  'HDC_UserUnmarshal',  \
    HENHMETAFILE_UserFree, <NONE>,  'HENHMETAFILE_UserFree',  \
    HENHMETAFILE_UserMarshal, <NONE>,  'HENHMETAFILE_UserMarshal',  \
    HENHMETAFILE_UserSize, <NONE>,  'HENHMETAFILE_UserSize',  \
    HENHMETAFILE_UserUnmarshal, <NONE>,  'HENHMETAFILE_UserUnmarshal',  \
    HGLOBAL_UserFree, <.pLong, .pHglobal>,  'HGLOBAL_UserFree',  \
    HGLOBAL_UserMarshal, <.pLong, .pChar, .pHglobal>,  'HGLOBAL_UserMarshal',  \
    HGLOBAL_UserSize, <.pLong, .lLong, .pHglobal>,  'HGLOBAL_UserSize',  \
    HGLOBAL_UserUnmarshal, <.pLong, .pChar, .pHglobal>,  'HGLOBAL_UserUnmarshal',  \
    HICON_UserFree, <.pLong, .pHicon>,  'HICON_UserFree',  \
    HICON_UserMarshal, <.pLong, .pChar, .pHicon>,  'HICON_UserMarshal',  \
    HICON_UserSize, <.pLong, .llong, .pHicon>,  'HICON_UserSize',  \
    HICON_UserUnmarshal, <.pLong, .pChar, .pHicon>,  'HICON_UserUnmarshal',  \
    HMENU_UserFree, <.pLong, .pHmenu>,  'HMENU_UserFree',  \
    HMENU_UserMarshal, <.pLong, .pChar, .pHmenu>,  'HMENU_UserMarshal',  \
    HMENU_UserSize, <.pLong, .lLong, .pHmenu>,  'HMENU_UserSize',  \
    HMENU_UserUnmarshal, <.pLong, .pChar, .pHmenu>,  'HMENU_UserUnmarshal',  \
    HMETAFILEPICT_UserFree, <NONE>,  'HMETAFILEPICT_UserFree',  \
    HMETAFILEPICT_UserMarshal, <NONE>,  'HMETAFILEPICT_UserMarshal',  \
    HMETAFILEPICT_UserSize, <NONE>,  'HMETAFILEPICT_UserSize',  \
    HMETAFILEPICT_UserUnmarshal, <NONE>,  'HMETAFILEPICT_UserUnmarshal',  \
    HMETAFILE_UserFree, <NONE>,  'HMETAFILE_UserFree',  \
    HMETAFILE_UserMarshal, <NONE>,  'HMETAFILE_UserMarshal',  \
    HMETAFILE_UserSize, <NONE>,  'HMETAFILE_UserSize',  \
    HMETAFILE_UserUnmarshal, <NONE>,  'HMETAFILE_UserUnmarshal',  \
    HPALETTE_UserFree, <.pLong, .pHpalette>,  'HPALETTE_UserFree',  \
    HPALETTE_UserMarshal, <.pLong, .pChar, .pHpalette>,  'HPALETTE_UserMarshal',  \
    HPALETTE_UserSize, <.pLong, .lLong, .pHpalette>,  'HPALETTE_UserSize',  \
    HPALETTE_UserUnmarshal, <.pLong, .pChar, .pHpalette>,  'HPALETTE_UserUnmarshal',  \
    HWND_UserFree, <.pLong, .pHwnd>,  'HWND_UserFree',  \
    HWND_UserMarshal, <.pLong, .pChar, .pHwnd>,  'HWND_UserMarshal',  \
    HWND_UserSize, <.pLong, .lLong, .pHwnd>,  'HWND_UserSize',  \
    HWND_UserUnmarshal, <.pLong, .pChar, .pHwnd>,  'HWND_UserUnmarshal',  \
    HkOleRegisterObject, <NONE>,  'HkOleRegisterObject',  \
    IIDFromString, <.lpsz, .lpiid>,  'IIDFromString',  \
    IsAccelerator, <.hAccel, .cAccelEntries, .lpMsg, .lpwCmd>,  'IsAccelerator',  \
    IsEqualGUID, <NONE>,  'IsEqualGUID',  \
    IsValidIid, <NONE>,  'IsValidIid',  \
    IsValidInterface, <NONE>,  'IsValidInterface',  \
    IsValidPtrIn, <NONE>,  'IsValidPtrIn',  \
    IsValidPtrOut, <NONE>,  'IsValidPtrOut',  \
    MkParseDisplayName, <.pbc, .szUserName, .pchEaten, .ppmk>,  'MkParseDisplayName',  \
    MonikerCommonPrefixWith, <.pmkThis, .pmkOther, .ppmkCommon>,  'MonikerCommonPrefixWith',  \
    MonikerRelativePathTo, <.pmkSrc, .pmkDest, .ppmkRelPath, .dwReserved>,  'MonikerRelativePathTo',  \
    OleBuildVersion, <VOID>,  'OleBuildVersion',  \
    OleConvertIStorageToOLESTREAM, <.pstg, .lpolestream>,  'OleConvertIStorageToOLESTREAM',  \
    OleConvertIStorageToOLESTREAMEx, <.pstg, .cfFormat, .lWidth, .lHeight, .dwSize, .pmedium, .polestm>,  'OleConvertIStorageToOLESTREAMEx',  \
    OleConvertOLESTREAMToIStorage, <.lpolestream, .pstg, .ptd>,  'OleConvertOLESTREAMToIStorage',  \
    OleConvertOLESTREAMToIStorageEx, <.polestm, .pstg, .pcfFormat, .plwWidth, .plHeight, .pdwSize, .pmedium>,  'OleConvertOLESTREAMToIStorageEx',  \
    OleCreate, <.rclsid, .riid, .renderopt, .pFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreate',  \
    OleCreateDefaultHandler, <.clsid, .pUnkOuter, .riid, .lplpObj>,  'OleCreateDefaultHandler',  \
    OleCreateEmbeddingHelper, <.clsid, .pUnkOuter, .flags, .pCF, .riid, .lplpObj>,  'OleCreateEmbeddingHelper',  \
    OleCreateEx, <.rclsid, .riid, .dwFlags, .renderopt, .cFormats, .rgAdvf, .rgFormatEtc, .lpAdviseSink, .rgdwConnection, .pClientSite,  \
        .pStg, .ppvObj>,  'OleCreateEx',  \
    OleCreateFromData, <.pSrcDataObj, .riid, .renderopt, .pFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreateFromData',  \
    OleCreateFromDataEx, <.pSrcDataObj, .riid, .dwFlags, .renderopt, .cFormats, .rgAdvf, .rgFormatEtc, .lpAdviseSink, .rgdwConnection,  \
        .pClientSite, .pStg, .ppvObj>,  'OleCreateFromDataEx',  \
    OleCreateFromFile, <.rclsid, .lpszFileName, .riid, .renderopt, .lpFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreateFromFile',  \
    OleCreateFromFileEx, <.rclsid, .lpszFileName, .riid, .dwFlags, .renderopt, .cFormats, .rgAdvf, .rgFormatEtc, .lpAdviseSink, .rgdwConnection,  \
        .pClientSite, .pStg, .ppvObj>,  'OleCreateFromFileEx',  \
    OleCreateLink, <.pmkLinkSrc, .riid, .renderopt, .lpFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreateLink',  \
    OleCreateLinkEx, <.pmkLinkSrc, .riid, .dwFlags, .renderopt, .cFormats, .rgAdvf, .rgFormatEtc, .lpAdviseSink, .rgdwConnection, .pClientSite,  \
        .pStg, .ppvObj>,  'OleCreateLinkEx',  \
    OleCreateLinkFromData, <.pSrcDataObj, .riid, .renderopt, .pFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreateLinkFromData',  \
    OleCreateLinkFromDataEx, <.pSrcDataObj, .riid, .dwFlags, .renderopt, .cFormats, .rgAdvf, .rgFormatEtc, .lpAdviseSink, .rgdwConnection,  \
        .pClientSite, .pStg, .ppvObj>,  'OleCreateLinkFromDataEx',  \
    OleCreateLinkToFile, <.lpszFileName, .riid, .renderopt, .lpFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreateLinkToFile',  \
    OleCreateLinkToFileEx, <.lpszFileName, .riid, .dwFlags, .renderopt, .cFormats, .rgAdvf, .rgFormatEtc, .lpAdviseSink, .rgdwConnection,  \
        .pClientSite, .pStg, .ppvObj>,  'OleCreateLinkToFileEx',  \
    OleCreateMenuDescriptor, <.hmenuCombined, .lpMenuWidths>,  'OleCreateMenuDescriptor',  \
    OleCreateStaticFromData, <.pSrcDataObj, .iid, .renderopt, .pFormatEtc, .pClientSite, .pStg, .ppvObj>,  'OleCreateStaticFromData',  \
    OleDestroyMenuDescriptor, <.holemenu>,  'OleDestroyMenuDescriptor',  \
    OleDoAutoConvert, <.pStg, .pClsidNew>,  'OleDoAutoConvert',  \
    OleDraw, <.pUnknown, .dwAspect, .hdcDraw, .lprcBounds>,  'OleDraw',  \
    OleDuplicateData, <.hSrc, .cfFormat, .uiFlags>,  'OleDuplicateData',  \
    OleFlushClipboard, <VOID>,  'OleFlushClipboard',  \
    OleGetAutoConvert, <.clsidOld, .pClsidNew>,  'OleGetAutoConvert',  \
    OleGetClipboard, <.ppDataObj>,  'OleGetClipboard',  \
    OleGetIconOfClass, <.rclsid, .lpszLabel, .fUseTypeAsLabel>,  'OleGetIconOfClass',  \
    OleGetIconOfFile, <.lpszPath, .fUseFileAsLabel>,  'OleGetIconOfFile',  \
    OleInitialize, <.pvReserved>,  'OleInitialize',  \
    OleInitializeWOW, <NONE>,  'OleInitializeWOW',  \
    OleIsCurrentClipboard, <.pDataObj>,  'OleIsCurrentClipboard',  \
    OleIsRunning, <.pObject>,  'OleIsRunning',  \
    OleLoad, <.pStg, .riid, .pClientSite, .ppvObj>,  'OleLoad',  \
    OleLoadFromStream, <.pStm, .iidInterface, .ppvObj>,  'OleLoadFromStream',  \
    OleLockRunning, <.pUnknown, .fLock, .fLastUnlockCloses>,  'OleLockRunning',  \
    OleMetafilePictFromIconAndLabel, <.hIcon, .lpszLabel, .lpszSourceFile, .iIconIndex>,  'OleMetafilePictFromIconAndLabel',  \
    OleNoteObjectVisible, <.pUnknown, .fVisible>,  'OleNoteObjectVisible',  \
    OleQueryCreateFromData, <.pSrcDataObject>,  'OleQueryCreateFromData',  \
    OleQueryLinkFromData, <.pSrcDataObject>,  'OleQueryLinkFromData',  \
    OleRegEnumFormatEtc, <.clsid, .dwDirection, .ppenum>,  'OleRegEnumFormatEtc',  \
    OleRegEnumVerbs, <.clsid, .ppenum>,  'OleRegEnumVerbs',  \
    OleRegGetMiscStatus, <.clsid, .dwAspect, .pdwStatus>,  'OleRegGetMiscStatus',  \
    OleRegGetUserType, <.clsid, .dwFormOfType, .pszUserType>,  'OleRegGetUserType',  \
    OleRun, <.pUnknown>,  'OleRun',  \
    OleSave, <.pPS, .pStg, .fSameAsLoad>,  'OleSave',  \
    OleSaveToStream, <.pPStm, .pStm>,  'OleSaveToStream',  \
    OleSetAutoConvert, <.clsidOld, .clsidNew>,  'OleSetAutoConvert',  \
    OleSetClipboard, <.pDataObj>,  'OleSetClipboard',  \
    OleSetContainedObject, <.pUnknown, .fContained>,  'OleSetContainedObject',  \
    OleSetMenuDescriptor, <.holemenu, .hwndFrame, .hwndActiveObject, .lpFrame, .lpActiveObj>,  'OleSetMenuDescriptor',  \
    OleTranslateAccelerator, <.lpFrame, .lpFrameInfo, .lpmsg>,  'OleTranslateAccelerator',  \
    OleUninitialize, <VOID>,  'OleUninitialize',  \
    OpenOrCreateStream, <NONE>,  'OpenOrCreateStream',  \
    ProgIDFromCLSID, <.clsid, .lplpszProgID>,  'ProgIDFromCLSID',  \
    PropStgNameToFmtId, <.oszName, .pfmtid>,  'PropStgNameToFmtId',  \
    PropSysAllocString, <NONE>,  'PropSysAllocString',  \
    PropSysFreeString, <NONE>,  'PropSysFreeString',  \
    PropVariantChangeType, <NONE>,  'PropVariantChangeType',  \
    PropVariantClear, <.pvar>,  'PropVariantClear',  \
    PropVariantCopy, <.pvarDest, .pvarSrc>,  'PropVariantCopy',  \
    ReadClassStg, <.pStg, .pclsid>,  'ReadClassStg',  \
    ReadClassStm, <.pStm, .pclsid>,  'ReadClassStm',  \
    ReadFmtUserTypeStg, <.pstg, .pcf, .lplpszUserType>,  'ReadFmtUserTypeStg',  \
    ReadOleStg, <NONE>,  'ReadOleStg',  \
    ReadStringStream, <NONE>,  'ReadStringStream',  \
    RegisterDragDrop, <.hwnd, .pDropTarget>,  'RegisterDragDrop',  \
    ReleaseStgMedium, <.lpstgmedium>,  'ReleaseStgMedium',  \
    RevokeDragDrop, <.hwnd>,  'RevokeDragDrop',  \
    SNB_UserFree, <.pLong, .pSnb>,  'SNB_UserFree',  \
    SNB_UserMarshal, <.pLong, .pChar, .pSnb>,  'SNB_UserMarshal',  \
    SNB_UserSize, <.pLong, .lLong, .pSnb>,  'SNB_UserSize',  \
    SNB_UserUnmarshal, <.pLong, .pChar, .pSnb>,  'SNB_UserUnmarshal',  \
    STGMEDIUM_UserFree, <.pLong, .pStgmedium>,  'STGMEDIUM_UserFree',  \
    STGMEDIUM_UserMarshal, <.pLong, .pChar, .pStgmedium>,  'STGMEDIUM_UserMarshal',  \
    STGMEDIUM_UserSize, <.pLong, .long, .pStgmedium>,  'STGMEDIUM_UserSize',  \
    STGMEDIUM_UserUnmarshal, <.pLong, .pChar, .pStgmedium>,  'STGMEDIUM_UserUnmarshal',  \
    SetConvertStg, <.pStg, .fConvert>,  'SetConvertStg',  \
    SetDocumentBitStg, <NONE>,  'SetDocumentBitStg',  \
    SetErrorInfo, <.dwReserved, .perrinfo>,  'SetErrorInfo',  \
    StgConvertPropertyToVariant, <NONE>,  'StgConvertPropertyToVariant',  \
    StgConvertVariantToProperty, <NONE>,  'StgConvertVariantToProperty',  \
    StgCreateDocfile, <.pwcsName, .grfMode, .reserved, .ppstgOpen>,  'StgCreateDocfile',  \
    StgCreateDocfileOnILockBytes, <.plkbyt, .grfMode, .reserved, .ppstgOpen>,  'StgCreateDocfileOnILockBytes',  \
    StgCreatePropSetStg, <.pStorage, .dwReserved, .ppPropSetStg>,  'StgCreatePropSetStg',  \
    StgCreatePropStg, <.pUnk, .fmtid, .pclsid, .grfFlags, .dwReserved, .ppPropStg>,  'StgCreatePropStg',  \
    StgCreateStorageEx, <.pwcsName, .grfMode, .stgfmt, .grfAttrs, .pStgOptions, .reserved, .riid, .ppObjectOpen>,  'StgCreateStorageEx',  \
    StgGetIFillLockBytesOnFile, <.pwcsName, .ppflb>,  'StgGetIFillLockBytesOnFile',  \
    StgGetIFillLockBytesOnILockBytes, <.pilb, .ppflb>,  'StgGetIFillLockBytesOnILockBytes',  \
    StgIsStorageFile, <.pwcsName>,  'StgIsStorageFile',  \
    StgIsStorageILockBytes, <.plkbyt>,  'StgIsStorageILockBytes',  \
    StgOpenAsyncDocfileOnIFillLockBytes, <.pflb, .grfMode, .asyncFlags, .ppstgOpen>,  'StgOpenAsyncDocfileOnIFillLockBytes',  \
    StgOpenPropStg, <.pUnk, .fmtid, .grfFlags, .dwReserved, .ppPropStg>,  'StgOpenPropStg',  \
    StgOpenStorage, <.pwcsName, .pstgPriority, .grfMode, .snbExclude, .reserved, .ppstgOpen>,  'StgOpenStorage',  \
    StgOpenStorageEx, <.pwcsName, .grfMode, .stgfmt, .grfAttrs, .pStgOptions, .reserved, .riid, .ppObjectOpen>,  'StgOpenStorageEx',  \
    StgOpenStorageOnHandle, <NONE>,  'StgOpenStorageOnHandle',  \
    StgOpenStorageOnILockBytes, <.plkbyt, .pstgPriority, .grfMode, .snbExclude, .reserved, .ppstgOpen>,  'StgOpenStorageOnILockBytes',  \
    StgPropertyLengthAsVariant, <NONE>,  'StgPropertyLengthAsVariant',  \
    StgSetTimes, <.lpszName, .pctime, .patime, .pmtime>,  'StgSetTimes',  \
    StringFromCLSID, <.rclsid, .lplpsz>,  'StringFromCLSID',  \
    StringFromGUID2, <.rguid, .lpsz, .cchMax>,  'StringFromGUID2',  \
    StringFromIID, <.rclsid, .lplpsz>,  'StringFromIID',  \
    UpdateDCOMSettings, <NONE>,  'UpdateDCOMSettings',  \
    UtConvertDvtd16toDvtd32, <NONE>,  'UtConvertDvtd16toDvtd32',  \
    UtConvertDvtd32toDvtd16, <NONE>,  'UtConvertDvtd32toDvtd16',  \
    UtGetDvtd16Info, <NONE>,  'UtGetDvtd16Info',  \
    UtGetDvtd32Info, <NONE>,  'UtGetDvtd32Info',  \
    WdtpInterfacePointer_UserFree, <NONE>,  'WdtpInterfacePointer_UserFree',  \
    WdtpInterfacePointer_UserMarshal, <NONE>,  'WdtpInterfacePointer_UserMarshal',  \
    WdtpInterfacePointer_UserSize, <NONE>,  'WdtpInterfacePointer_UserSize',  \
    WdtpInterfacePointer_UserUnmarshal, <NONE>,  'WdtpInterfacePointer_UserUnmarshal',  \
    WriteClassStg, <.pStg, .rclsid>,  'WriteClassStg',  \
    WriteClassStm, <.pStm, .rclsid>,  'WriteClassStm',  \
    WriteFmtUserTypeStg, <.pstg, .cf, .lpszUserType>,  'WriteFmtUserTypeStg',  \
    WriteOleStg, <NONE>,  'WriteOleStg',  \
    WriteStringStream, <NONE>,  'WriteStringStream'

Added freshlib/imports/Win32/oleaut32.inc.



































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
;   oleaut32.dll API calls (ASCII)
import_proto oleaut32,  \
    BSTR_UserFree, <.pLong, .pBstr>,  'BSTR_UserFree',  \
    BSTR_UserMarshal, <.pLong, .pChar, .pBstr>,  'BSTR_UserMarshal',  \
    BSTR_UserSize, <.pLong, .lLong, .pBstr>,  'BSTR_UserSize',  \
    BSTR_UserUnmarshal, <.pLong, .pChar, .pBstr>,  'BSTR_UserUnmarshal',  \
    BstrFromVector, <.psa, .pBstr>,  'BstrFromVector',  \
    ClearCustData, <.pCustData>,  'ClearCustData',  \
    CreateDispTypeInfo, <.pidata, .lcid, .pptinfo>,  'CreateDispTypeInfo',  \
    CreateErrorInfo_Aut, <.pperrinfo>,  'CreateErrorInfo',  \
    CreateStdDispatch, <.punkOuter, .pvThis, .ptinfo, .ppunkStdDisp>,  'CreateStdDispatch',  \
    CreateTypeLib, <.syskind, .szFile, .ppctlib>,  'CreateTypeLib',  \
    CreateTypeLib2, <.syskind, .szFile, .ppctlib>,  'CreateTypeLib2',  \
    DispCallFunc, <.pvInstance, .oVft, .cc, .vtReturn, .cActuals, .prgvt, .prgpvarg, .pvargResult>,  'DispCallFunc',  \
    DispGetIDsOfNames, <.ptinfo, .rgszNames, .cNames, .rgdispid>,  'DispGetIDsOfNames',  \
    DispGetParam, <.pdispparams, .position, .vtTarg, .pvarResult, .puArgErr>,  'DispGetParam',  \
    DispInvoke, <.this, .ptinfo, .dispidMember, .wFlags, .pparams, .pvarResult, .pexcepinfo, .puArgErr>,  'DispInvoke',  \
    DllCanUnloadNow, <VOID>,  'DllCanUnloadNow',  \
    DllGetClassObject, <.rclsid, .riid, .ppv>,  'DllGetClassObject',  \
    DllRegisterServer, <VOID>,  'DllRegisterServer',  \
    DllUnregisterServer, <VOID>,  'DllUnregisterServer',  \
    DosDateTimeToVariantTime, <.wDosDate, .wDosTime, .pvtime>,  'DosDateTimeToVariantTime',  \
    GetActiveObject, <.rclsid, .pvReserved, .ppunk>,  'GetActiveObject',  \
    GetAltMonthNames, <.lcid, .prgp>,  'GetAltMonthNames',  \
    GetErrorInfo_Aut, <.dwReserved, .pperrinfo>,  'GetErrorInfo',  \
    GetRecordInfoFromGuids, <.rGuidTypeLib, .uVerMajor, .uVerMinor, .lcid, .rGuidTypeInfo, .ppRecInfo>,  'GetRecordInfoFromGuids',  \
    GetRecordInfoFromTypeInfo, <.pTypeInfo, .ppRecInfo>,  'GetRecordInfoFromTypeInfo',  \
    GetVarConversionLocaleSetting, <NONE>,  'GetVarConversionLocaleSetting',  \
    LHashValOfNameSys, <.syskind, .lcid, .szName>,  'LHashValOfNameSys',  \
    LHashValOfNameSysA, <.syskind, .lcid, .szName>,  'LHashValOfNameSysA',  \
    LPSAFEARRAY_Marshal, <NONE>,  'LPSAFEARRAY_Marshal',  \
    LPSAFEARRAY_Size, <NONE>,  'LPSAFEARRAY_Size',  \
    LPSAFEARRAY_Unmarshal, <NONE>,  'LPSAFEARRAY_Unmarshal',  \
    LPSAFEARRAY_UserFree, <.pLong, .lpsafearray>,  'LPSAFEARRAY_UserFree',  \
    LPSAFEARRAY_UserMarshal, <.pLong, .pChar, .lpsafearray>,  'LPSAFEARRAY_UserMarshal',  \
    LPSAFEARRAY_UserSize, <.pLong, .lLong, .lpsafearray>,  'LPSAFEARRAY_UserSize',  \
    LPSAFEARRAY_UserUnmarshal, <.pLong, .pChar, .lpsafearray>,  'LPSAFEARRAY_UserUnmarshal',  \
    LoadRegTypeLib, <.rguid, .wVerMajor, .wVerMinor, .lcid, .pptlib>,  'LoadRegTypeLib',  \
    LoadTypeLib, <.TLpszModule, .TPpTypeLib>,  'LoadTypeLib',  \
    LoadTypeLibEx, <.szFile, .regkind, .pptlib>,  'LoadTypeLibEx',  \
    OACreateTypeLib2, <NONE>,  'OACreateTypeLib2',  \
    OaBuildVersion, <VOID>,  'OaBuildVersion',  \
    OleCreateFontIndirect, <.lpFontDesc, .riid, .lplpvObj>,  'OleCreateFontIndirect',  \
    OleCreatePictureIndirect, <.lpPictDesc, .riid, .fOwn, .lplpvObj>,  'OleCreatePictureIndirect',  \
    OleCreatePropertyFrame, <.hwndOwner, .x, .y, .lpszCaption, .cObjects, .ppUnk, .cPages, .pPageClsID, .lcid, .dwReserved, .pvReserved,  \
      >,  'OleCreatePropertyFrame',  \
    OleCreatePropertyFrameIndirect, <.lpParams>,  'OleCreatePropertyFrameIndirect',  \
    OleIconToCursor, <.hinstExe, .hIcon>,  'OleIconToCursor',  \
    OleLoadPicture, <.lpstream, .lSize, .fRunmode, .riid, .lplpvObj>,  'OleLoadPicture',  \
    OleLoadPictureEx, <.lpstream, .lSize, .fRunmode, .riid, .xSizeDesired, .ySizeDesired, .dwFlags, .lplpvObj>,  'OleLoadPictureEx',  \
    OleLoadPictureFile, <.varFileName, .lplpdispPicture>,  'OleLoadPictureFile',  \
    OleLoadPictureFileEx, <.varFileName, .xSizeDesired, .ySizeDesired, .dwFlags, .lplpdispPicture>,  'OleLoadPictureFileEx',  \
    OleLoadPicturePath, <.szURLorPath, .punkCaller, .dwReserved, .clrReserved, .riid, .ppvRet>,  'OleLoadPicturePath',  \
    OleSavePictureFile, <.lpdispPicture, .bstrFileName>,  'OleSavePictureFile',  \
    OleTranslateColor, <.lOleColor, .lHPalette, .lColorRef>,  'OleTranslateColor',  \
    QueryPathOfRegTypeLib, <.guid, .wMaj, .wMin, .lcid, .lpbstrPathName>,  'QueryPathOfRegTypeLib',  \
    RegisterActiveObject, <.punk, .rclsid, .dwFlags, .pdwRegister>,  'RegisterActiveObject',  \
    RegisterTypeLib, <.ptlib, .szFullPath, .szHelpDir>,  'RegisterTypeLib',  \
    RegisterTypeLibForUser, <NONE>,  'RegisterTypeLibForUser',  \
    RevokeActiveObject, <.dwRegister, .pvReserved>,  'RevokeActiveObject',  \
    SafeArrayAccessData, <.psa, .ppvData>,  'SafeArrayAccessData',  \
    SafeArrayAllocData, <.psa>,  'SafeArrayAllocData',  \
    SafeArrayAllocDescriptor, <.cDims, .ppsaOut>,  'SafeArrayAllocDescriptor',  \
    SafeArrayAllocDescriptorEx, <.vt, .cDims, .ppsaOut>,  'SafeArrayAllocDescriptorEx',  \
    SafeArrayCopy, <.psa, .ppsaOut>,  'SafeArrayCopy',  \
    SafeArrayCopyData, <.psaSource, .psaTarget>,  'SafeArrayCopyData',  \
    SafeArrayCreate, <.vt, .cDims, .rgsabound>,  'SafeArrayCreate',  \
    SafeArrayCreateEx, <.vt, .cDims, .rgsabound, .pvExtra>,  'SafeArrayCreateEx',  \
    SafeArrayCreateVector, <.vt, .lLbound, .cElements>,  'SafeArrayCreateVector',  \
    SafeArrayCreateVectorEx, <.vt, .lLbound, .cElements, .pvExtra>,  'SafeArrayCreateVectorEx',  \
    SafeArrayDestroy, <.psa>,  'SafeArrayDestroy',  \
    SafeArrayDestroyData, <.psa>,  'SafeArrayDestroyData',  \
    SafeArrayDestroyDescriptor, <.psa>,  'SafeArrayDestroyDescriptor',  \
    SafeArrayGetDim, <.psa>,  'SafeArrayGetDim',  \
    SafeArrayGetElement, <.psa, .rgIndices, .pv>,  'SafeArrayGetElement',  \
    SafeArrayGetElemsize, <.psa>,  'SafeArrayGetElemsize',  \
    SafeArrayGetIID, <.psa, .pguid>,  'SafeArrayGetIID',  \
    SafeArrayGetLBound, <.psa, .nDim, .plLbound>,  'SafeArrayGetLBound',  \
    SafeArrayGetRecordInfo, <.psa, .prinfo>,  'SafeArrayGetRecordInfo',  \
    SafeArrayGetUBound, <.psa, .nDim, .plUbound>,  'SafeArrayGetUBound',  \
    SafeArrayGetVartype, <.psa, .pvt>,  'SafeArrayGetVartype',  \
    SafeArrayLock, <.psa>,  'SafeArrayLock',  \
    SafeArrayPtrOfIndex, <.psa, .rgIndices, .ppvData>,  'SafeArrayPtrOfIndex',  \
    SafeArrayPutElement, <.psa, .rgIndices, .pv>,  'SafeArrayPutElement',  \
    SafeArrayRedim, <.psa, .psaboundNew>,  'SafeArrayRedim',  \
    SafeArraySetIID, <.psa, .guid>,  'SafeArraySetIID',  \
    SafeArraySetRecordInfo, <.psa, .prinfo>,  'SafeArraySetRecordInfo',  \
    SafeArrayUnaccessData, <.psa>,  'SafeArrayUnaccessData',  \
    SafeArrayUnlock, <.psa>,  'SafeArrayUnlock',  \
    SetErrorInfo_Aut, <.dwReserved, .perrinfo>,  'SetErrorInfo',  \
    SetOaNoCache, <NONE>,  'SetOaNoCache',  \
    SetVarConversionLocaleSetting, <NONE>,  'SetVarConversionLocaleSetting',  \
    SysAllocString, <.pOlechar>,  'SysAllocString',  \
    SysAllocStringByteLen, <.m_pBase, .FunctionCall>,  'SysAllocStringByteLen',  \
    SysAllocStringLen, <.pOlechar, .uint>,  'SysAllocStringLen',  \
    SysFreeString, <.bstr>,  'SysFreeString',  \
    SysReAllocString, <.pBstr, .pOlechar>,  'SysReAllocString',  \
    SysReAllocStringLen, <.pBstr, .pOlechar, .uint>,  'SysReAllocStringLen',  \
    SysStringByteLen, <.bstr>,  'SysStringByteLen',  \
    SysStringLen, <.bstr>,  'SysStringLen',  \
    SystemTimeToVariantTime, <.lpSystemTime, .pvtime>,  'SystemTimeToVariantTime',  \
    UnRegisterTypeLib, <.libID, .wVerMajor, .wVerMinor, .lcid, .syskind>,  'UnRegisterTypeLib',  \
    UnRegisterTypeLibForUser, <NONE>,  'UnRegisterTypeLibForUser',  \
    VARIANT_UserFree, <.pLong, .pVariant>,  'VARIANT_UserFree',  \
    VARIANT_UserMarshal, <.pLong, .pChar, .pVariant>,  'VARIANT_UserMarshal',  \
    VARIANT_UserSize, <.pLong, .lLong, .pVariant>,  'VARIANT_UserSize',  \
    VARIANT_UserUnmarshal, <.pLong, .pChar, .pVariant>,  'VARIANT_UserUnmarshal',  \
    VarAbs, <.pvarIn, .pvarResult>,  'VarAbs',  \
    VarAdd, <.pvarLeft, .pvarRight, .pvarResult>,  'VarAdd',  \
    VarAnd, <.pvarLeft, .pvarRight, .pvarResult>,  'VarAnd',  \
    VarBoolFromCy, <.cyIn, .pboolOut>,  'VarBoolFromCy',  \
    VarBoolFromDate, <.dateIn, .pboolOut>,  'VarBoolFromDate',  \
    VarBoolFromDec, <.pdecIn, .pboolOut>,  'VarBoolFromDec',  \
    VarBoolFromDisp, <.pdispIn, .lcid, .pboolOut>,  'VarBoolFromDisp',  \
    VarBoolFromI1, <.cIn, .pboolOut>,  'VarBoolFromI1',  \
    VarBoolFromI2, <.sIn, .pboolOut>,  'VarBoolFromI2',  \
    VarBoolFromI4, <.lIn, .pboolOut>,  'VarBoolFromI4',  \
    VarBoolFromI8, <NONE>,  'VarBoolFromI8',  \
    VarBoolFromR4, <.fltIn, .pboolOut>,  'VarBoolFromR4',  \
    VarBoolFromR8, <.dblIn, .pboolOut>,  'VarBoolFromR8',  \
    VarBoolFromStr, <.strIn, .lcid, .dwFlags, .pboolOut>,  'VarBoolFromStr',  \
    VarBoolFromUI1, <.bIn, .pboolOut>,  'VarBoolFromUI1',  \
    VarBoolFromUI2, <.uiIn, .pboolOut>,  'VarBoolFromUI2',  \
    VarBoolFromUI4, <.ulIn, .pboolOut>,  'VarBoolFromUI4',  \
    VarBoolFromUI8, <NONE>,  'VarBoolFromUI8',  \
    VarBstrCat, <.bstrLeft, .bstrRight, .pbstrResult>,  'VarBstrCat',  \
    VarBstrCmp, <.bstrLeft, .bstrRight, .lcid, .dwFlags>,  'VarBstrCmp',  \
    VarBstrFromBool, <.boolIn, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromBool',  \
    VarBstrFromCy, <.cyIn, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromCy',  \
    VarBstrFromDate, <.dateIn, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromDate',  \
    VarBstrFromDec, <.pdecIn, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromDec',  \
    VarBstrFromDisp, <.pdispIn, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromDisp',  \
    VarBstrFromI1, <.cIn, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromI1',  \
    VarBstrFromI2, <.iVal, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromI2',  \
    VarBstrFromI4, <.lIn, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromI4',  \
    VarBstrFromI8, <NONE>,  'VarBstrFromI8',  \
    VarBstrFromR4, <.fltIn, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromR4',  \
    VarBstrFromR8, <.dblIn, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromR8',  \
    VarBstrFromUI1, <.bVal, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromUI1',  \
    VarBstrFromUI2, <.uiIn, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromUI2',  \
    VarBstrFromUI4, <.ulIn, .lcid, .dwFlags, .pbstrOut>,  'VarBstrFromUI4',  \
    VarBstrFromUI8, <NONE>,  'VarBstrFromUI8',  \
    VarCat, <.pvarLeft, .pvarRight, .pvarResult>,  'VarCat',  \
    VarCmp, <.pvarLeft, .pvarRight, .lcid, .dwFlags>,  'VarCmp',  \
    VarCyAbs, <.cyIn, .pcyResult>,  'VarCyAbs',  \
    VarCyAdd, <.cyLeft, .cyRight, .pcyResult>,  'VarCyAdd',  \
    VarCyCmp, <.cyLeft, .cyRight>,  'VarCyCmp',  \
    VarCyCmpR8, <.cyLeft, .dblRight>,  'VarCyCmpR8',  \
    VarCyFix, <.cyIn, .pcyResult>,  'VarCyFix',  \
    VarCyFromBool, <.boolIn, .pcyOut>,  'VarCyFromBool',  \
    VarCyFromDate, <.dateIn, .pcyOut>,  'VarCyFromDate',  \
    VarCyFromDec, <.pdecIn, .pcyOut>,  'VarCyFromDec',  \
    VarCyFromDisp, <.pdispIn, .lcid, .pcyOut>,  'VarCyFromDisp',  \
    VarCyFromI1, <.cIn, .pcyOut>,  'VarCyFromI1',  \
    VarCyFromI2, <.sIn, .pcyOut>,  'VarCyFromI2',  \
    VarCyFromI4, <.lIn, .pcyOut>,  'VarCyFromI4',  \
    VarCyFromI8, <NONE>,  'VarCyFromI8',  \
    VarCyFromR4, <.fltIn, .pcyOut>,  'VarCyFromR4',  \
    VarCyFromR8, <.dblIn, .pcyOut>,  'VarCyFromR8',  \
    VarCyFromStr, <.strIn, .lcid, .dwFlags, .pcyOut>,  'VarCyFromStr',  \
    VarCyFromUI1, <.bIn, .pcyOut>,  'VarCyFromUI1',  \
    VarCyFromUI2, <.uiIn, .pcyOut>,  'VarCyFromUI2',  \
    VarCyFromUI4, <.ulIn, .pcyOut>,  'VarCyFromUI4',  \
    VarCyFromUI8, <NONE>,  'VarCyFromUI8',  \
    VarCyInt, <.cyIn, .pcyResult>,  'VarCyInt',  \
    VarCyMul, <.cyLeft, .cyRight, .pcyResult>,  'VarCyMul',  \
    VarCyMulI4, <.cyLeft, .lRight, .pcyResult>,  'VarCyMulI4',  \
    VarCyMulI8, <NONE>,  'VarCyMulI8',  \
    VarCyNeg, <.cyIn, .pcyResult>,  'VarCyNeg',  \
    VarCyRound, <.cyIn, .cDecimals, .pcyResult>,  'VarCyRound',  \
    VarCySub, <.cyLeft, .cyRight, .pcyResult>,  'VarCySub',  \
    VarDateFromBool, <.boolIn, .pdateOut>,  'VarDateFromBool',  \
    VarDateFromCy, <.cyIn, .pdateOut>,  'VarDateFromCy',  \
    VarDateFromDec, <.pdecIn, .pdateOut>,  'VarDateFromDec',  \
    VarDateFromDisp, <.pdispIn, .lcid, .pdateOut>,  'VarDateFromDisp',  \
    VarDateFromI1, <.cIn, .pdateOut>,  'VarDateFromI1',  \
    VarDateFromI2, <.sIn, .pdateOut>,  'VarDateFromI2',  \
    VarDateFromI4, <.lIn, .pdateOut>,  'VarDateFromI4',  \
    VarDateFromI8, <NONE>,  'VarDateFromI8',  \
    VarDateFromR4, <.fltIn, .pdateOut>,  'VarDateFromR4',  \
    VarDateFromR8, <.dblIn, .pdateOut>,  'VarDateFromR8',  \
    VarDateFromStr, <.strIn, .lcid, .dwFlags, .pdateOut>,  'VarDateFromStr',  \
    VarDateFromUI1, <.bIn, .pdateOut>,  'VarDateFromUI1',  \
    VarDateFromUI2, <.uiIn, .pdateOut>,  'VarDateFromUI2',  \
    VarDateFromUI4, <.ulIn, .pdateOut>,  'VarDateFromUI4',  \
    VarDateFromUI8, <NONE>,  'VarDateFromUI8',  \
    VarDateFromUdate, <.pudateIn, .dwFlags, .pdateOut>,  'VarDateFromUdate',  \
    VarDateFromUdateEx, <.pudateIn, .lcid, .dwFlags, .pdateOut>,  'VarDateFromUdateEx',  \
    VarDecAbs, <.pdecIn, .pdecResult>,  'VarDecAbs',  \
    VarDecAdd, <.pdecLeft, .pdecRight, .pdecResult>,  'VarDecAdd',  \
    VarDecCmp, <.pdecLeft, .pdecRight>,  'VarDecCmp',  \
    VarDecCmpR8, <.pdecLeft, .dblRight>,  'VarDecCmpR8',  \
    VarDecDiv, <.pdecLeft, .pdecRight, .pdecResult>,  'VarDecDiv',  \
    VarDecFix, <.pdecIn, .pdecResult>,  'VarDecFix',  \
    VarDecFromBool, <.boolIn, .pdecOut>,  'VarDecFromBool',  \
    VarDecFromCy, <.cyIn, .pdecOut>,  'VarDecFromCy',  \
    VarDecFromDate, <.dateIn, .pdecOut>,  'VarDecFromDate',  \
    VarDecFromDisp, <.pdispIn, .lcid, .pdecOut>,  'VarDecFromDisp',  \
    VarDecFromI1, <.cIn, .pdecOut>,  'VarDecFromI1',  \
    VarDecFromI2, <.uiIn, .pdecOut>,  'VarDecFromI2',  \
    VarDecFromI4, <.lIn, .pdecOut>,  'VarDecFromI4',  \
    VarDecFromI8, <NONE>,  'VarDecFromI8',  \
    VarDecFromR4, <.fltIn, .pdecOut>,  'VarDecFromR4',  \
    VarDecFromR8, <.dblIn, .pdecOut>,  'VarDecFromR8',  \
    VarDecFromStr, <.strIn, .lcid, .dwFlags, .pdecOut>,  'VarDecFromStr',  \
    VarDecFromUI1, <.bIn, .pdecOut>,  'VarDecFromUI1',  \
    VarDecFromUI2, <.uiIn, .pdecOut>,  'VarDecFromUI2',  \
    VarDecFromUI4, <.ulIn, .pdecOut>,  'VarDecFromUI4',  \
    VarDecFromUI8, <NONE>,  'VarDecFromUI8',  \
    VarDecInt, <.pdecIn, .pdecResult>,  'VarDecInt',  \
    VarDecMul, <.pdecLeft, .pdecRight, .pdecResult>,  'VarDecMul',  \
    VarDecNeg, <.pdecIn, .pdecResult>,  'VarDecNeg',  \
    VarDecRound, <.pdecIn, .cDecimals, .pdecResult>,  'VarDecRound',  \
    VarDecSub, <.pdecLeft, .pdecRight, .pdecResult>,  'VarDecSub',  \
    VarDiv, <.pvarLeft, .pvarRight, .pvarResult>,  'VarDiv',  \
    VarEqv, <.pvarLeft, .pvarRight, .pvarResult>,  'VarEqv',  \
    VarFix, <.pvarIn, .pvarResult>,  'VarFix',  \
    VarFormat, <.pvarIn, .pstrFormat, .iFirstDay, .iFirstWeek, .dwFlags, .pbstrOut>,  'VarFormat',  \
    VarFormatCurrency, <.pvarIn, .ByValumDig, .iIncLead, .iUseParens, .iGroup, .dwFlags, .pbstrOut>,  'VarFormatCurrency',  \
    VarFormatDateTime, <.pvarIn, .ByValamedFormat, .dwFlags, .pbstrOut>,  'VarFormatDateTime',  \
    VarFormatFromTokens, <.pvarIn, .pstrFormat, .pbTokCur, .dwFlags, .pbstrOut, .lcid>,  'VarFormatFromTokens',  \
    VarFormatNumber, <.pvarIn, .ByValumDig, .iIncLead, .iUseParens, .iGroup, .dwFlags, .pbstrOut>,  'VarFormatNumber',  \
    VarFormatPercent, <.pvarIn, .ByValumDig, .iIncLead, .iUseParens, .iGroup, .dwFlags, .pbstrOut>,  'VarFormatPercent',  \
    VarI1FromBool, <.boolIn, .pcOut>,  'VarI1FromBool',  \
    VarI1FromCy, <.cyIn, .pcOut>,  'VarI1FromCy',  \
    VarI1FromDate, <.dateIn, .pcOut>,  'VarI1FromDate',  \
    VarI1FromDec, <.pdecIn, .pcOut>,  'VarI1FromDec',  \
    VarI1FromDisp, <.pdispIn, .lcid, .pcOut>,  'VarI1FromDisp',  \
    VarI1FromI2, <.uiIn, .pcOut>,  'VarI1FromI2',  \
    VarI1FromI4, <.lIn, .pcOut>,  'VarI1FromI4',  \
    VarI1FromI8, <NONE>,  'VarI1FromI8',  \
    VarI1FromR4, <.fltIn, .pcOut>,  'VarI1FromR4',  \
    VarI1FromR8, <.dblIn, .pcOut>,  'VarI1FromR8',  \
    VarI1FromStr, <.strIn, .lcid, .dwFlags, .pcOut>,  'VarI1FromStr',  \
    VarI1FromUI1, <.bIn, .pcOut>,  'VarI1FromUI1',  \
    VarI1FromUI2, <.uiIn, .pcOut>,  'VarI1FromUI2',  \
    VarI1FromUI4, <.ulIn, .pcOut>,  'VarI1FromUI4',  \
    VarI1FromUI8, <NONE>,  'VarI1FromUI8',  \
    VarI2FromBool, <.boolIn, .psOut>,  'VarI2FromBool',  \
    VarI2FromCy, <.cyIn, .psOut>,  'VarI2FromCy',  \
    VarI2FromDate, <.dateIn, .psOut>,  'VarI2FromDate',  \
    VarI2FromDec, <.pdecIn, .psOut>,  'VarI2FromDec',  \
    VarI2FromDisp, <.pdispIn, .lcid, .psOut>,  'VarI2FromDisp',  \
    VarI2FromI1, <.cIn, .psOut>,  'VarI2FromI1',  \
    VarI2FromI4, <.lIn, .psOut>,  'VarI2FromI4',  \
    VarI2FromI8, <NONE>,  'VarI2FromI8',  \
    VarI2FromR4, <.fltIn, .psOut>,  'VarI2FromR4',  \
    VarI2FromR8, <.dblIn, .psOut>,  'VarI2FromR8',  \
    VarI2FromStr, <.strIn, .lcid, .dwFlags, .psOut>,  'VarI2FromStr',  \
    VarI2FromUI1, <.bIn, .psOut>,  'VarI2FromUI1',  \
    VarI2FromUI2, <.uiIn, .psOut>,  'VarI2FromUI2',  \
    VarI2FromUI4, <.ulIn, .psOut>,  'VarI2FromUI4',  \
    VarI2FromUI8, <NONE>,  'VarI2FromUI8',  \
    VarI4FromBool, <.boolIn, .plOut>,  'VarI4FromBool',  \
    VarI4FromCy, <.cyIn, .plOut>,  'VarI4FromCy',  \
    VarI4FromDate, <.dateIn, .plOut>,  'VarI4FromDate',  \
    VarI4FromDec, <.pdecIn, .plOut>,  'VarI4FromDec',  \
    VarI4FromDisp, <.pdispIn, .lcid, .plOut>,  'VarI4FromDisp',  \
    VarI4FromI1, <.cIn, .plOut>,  'VarI4FromI1',  \
    VarI4FromI2, <.sIn, .plOut>,  'VarI4FromI2',  \
    VarI4FromI8, <NONE>,  'VarI4FromI8',  \
    VarI4FromR4, <.fltIn, .plOut>,  'VarI4FromR4',  \
    VarI4FromR8, <.dblIn, .plOut>,  'VarI4FromR8',  \
    VarI4FromStr, <.strIn, .lcid, .dwFlags, .plOut>,  'VarI4FromStr',  \
    VarI4FromUI1, <.bIn, .plOut>,  'VarI4FromUI1',  \
    VarI4FromUI2, <.uiIn, .plOut>,  'VarI4FromUI2',  \
    VarI4FromUI4, <.ulIn, .plOut>,  'VarI4FromUI4',  \
    VarI4FromUI8, <NONE>,  'VarI4FromUI8',  \
    VarI8FromBool, <NONE>,  'VarI8FromBool',  \
    VarI8FromCy, <NONE>,  'VarI8FromCy',  \
    VarI8FromDate, <NONE>,  'VarI8FromDate',  \
    VarI8FromDec, <NONE>,  'VarI8FromDec',  \
    VarI8FromDisp, <NONE>,  'VarI8FromDisp',  \
    VarI8FromI1, <NONE>,  'VarI8FromI1',  \
    VarI8FromI2, <NONE>,  'VarI8FromI2',  \
    VarI8FromR4, <NONE>,  'VarI8FromR4',  \
    VarI8FromR8, <NONE>,  'VarI8FromR8',  \
    VarI8FromStr, <NONE>,  'VarI8FromStr',  \
    VarI8FromUI1, <NONE>,  'VarI8FromUI1',  \
    VarI8FromUI2, <NONE>,  'VarI8FromUI2',  \
    VarI8FromUI4, <NONE>,  'VarI8FromUI4',  \
    VarI8FromUI8, <NONE>,  'VarI8FromUI8',  \
    VarIdiv, <.pvarLeft, .pvarRight, .pvarResult>,  'VarIdiv',  \
    VarImp, <.pvarLeft, .pvarRight, .pvarResult>,  'VarImp',  \
    VarInt, <.pvarIn, .pvarResult>,  'VarInt',  \
    VarMod, <.pvarLeft, .pvarRight, .pvarResult>,  'VarMod',  \
    VarMonthName, <.iMonth, .fAbbrev, .dwFlags, .pbstrOut>,  'VarMonthName',  \
    VarMul, <.pvarLeft, .pvarRight, .pvarResult>,  'VarMul',  \
    VarNeg, <.pvarIn, .pvarResult>,  'VarNeg',  \
    VarNot, <.pvarIn, .pvarResult>,  'VarNot',  \
    VarNumFromParseNum, <.pnumprs, .rgbDig, .dwVtBits, .pvar>,  'VarNumFromParseNum',  \
    VarOr, <.pvarLeft, .pvarRight, .pvarResult>,  'VarOr',  \
    VarParseNumFromStr, <.strIn, .lcid, .dwFlags, .pnumprs, .rgbDig>,  'VarParseNumFromStr',  \
    VarPow, <.pvarLeft, .pvarRight, .pvarResult>,  'VarPow',  \
    VarR4CmpR8, <.fltLeft, .dblRight>,  'VarR4CmpR8',  \
    VarR4FromBool, <.boolIn, .pfltOut>,  'VarR4FromBool',  \
    VarR4FromCy, <.cyIn, .pfltOut>,  'VarR4FromCy',  \
    VarR4FromDate, <.dateIn, .pfltOut>,  'VarR4FromDate',  \
    VarR4FromDec, <.pdecIn, .pfltOut>,  'VarR4FromDec',  \
    VarR4FromDisp, <.pdispIn, .lcid, .pfltOut>,  'VarR4FromDisp',  \
    VarR4FromI1, <.cIn, .pfltOut>,  'VarR4FromI1',  \
    VarR4FromI2, <.sIn, .pfltOut>,  'VarR4FromI2',  \
    VarR4FromI4, <.lIn, .pfltOut>,  'VarR4FromI4',  \
    VarR4FromI8, <NONE>,  'VarR4FromI8',  \
    VarR4FromR8, <.dblIn, .pfltOut>,  'VarR4FromR8',  \
    VarR4FromStr, <.strIn, .lcid, .dwFlags, .pfltOut>,  'VarR4FromStr',  \
    VarR4FromUI1, <.bIn, .pfltOut>,  'VarR4FromUI1',  \
    VarR4FromUI2, <.uiIn, .pfltOut>,  'VarR4FromUI2',  \
    VarR4FromUI4, <.ulIn, .pfltOut>,  'VarR4FromUI4',  \
    VarR4FromUI8, <NONE>,  'VarR4FromUI8',  \
    VarR8FromBool, <.boolIn, .pdblOut>,  'VarR8FromBool',  \
    VarR8FromCy, <.cyIn, .pdblOut>,  'VarR8FromCy',  \
    VarR8FromDate, <.dateIn, .pdblOut>,  'VarR8FromDate',  \
    VarR8FromDec, <.pdecIn, .pdblOut>,  'VarR8FromDec',  \
    VarR8FromDisp, <.pdispIn, .lcid, .pdblOut>,  'VarR8FromDisp',  \
    VarR8FromI1, <.cIn, .pdblOut>,  'VarR8FromI1',  \
    VarR8FromI2, <.sIn, .pdblOut>,  'VarR8FromI2',  \
    VarR8FromI4, <.lIn, .pdblOut>,  'VarR8FromI4',  \
    VarR8FromI8, <NONE>,  'VarR8FromI8',  \
    VarR8FromR4, <.fltIn, .pdblOut>,  'VarR8FromR4',  \
    VarR8FromStr, <.strIn, .lcid, .dwFlags, .pdblOut>,  'VarR8FromStr',  \
    VarR8FromUI1, <.bIn, .pdblOut>,  'VarR8FromUI1',  \
    VarR8FromUI2, <.uiIn, .pdblOut>,  'VarR8FromUI2',  \
    VarR8FromUI4, <.ulIn, .pdblOut>,  'VarR8FromUI4',  \
    VarR8FromUI8, <NONE>,  'VarR8FromUI8',  \
    VarR8Pow, <.dblLeft, .dblRight, .pdblResult>,  'VarR8Pow',  \
    VarR8Round, <.dblIn, .cDecimals, .pdblResult>,  'VarR8Round',  \
    VarRound, <.pvarIn, .cDecimals, .pvarResult>,  'VarRound',  \
    VarSub, <.pvarLeft, .pvarRight, .pvarResult>,  'VarSub',  \
    VarTokenizeFormatString, <.pstrFormat, .rgbTok, .cbTok, .iFirstDay, .iFirstWeek, .lcid, .pcbActual>,  'VarTokenizeFormatString',  \
    VarUI1FromBool, <.boolIn, .pbOut>,  'VarUI1FromBool',  \
    VarUI1FromCy, <.cyIn, .pbOut>,  'VarUI1FromCy',  \
    VarUI1FromDate, <.dateIn, .pbOut>,  'VarUI1FromDate',  \
    VarUI1FromDec, <.pdecIn, .pbOut>,  'VarUI1FromDec',  \
    VarUI1FromDisp, <.pdispIn, .lcid, .pbOut>,  'VarUI1FromDisp',  \
    VarUI1FromI1, <.cIn, .pbOut>,  'VarUI1FromI1',  \
    VarUI1FromI2, <.sIn, .pbOut>,  'VarUI1FromI2',  \
    VarUI1FromI4, <.lIn, .pbOut>,  'VarUI1FromI4',  \
    VarUI1FromI8, <NONE>,  'VarUI1FromI8',  \
    VarUI1FromR4, <.fltIn, .pbOut>,  'VarUI1FromR4',  \
    VarUI1FromR8, <.dblIn, .pbOut>,  'VarUI1FromR8',  \
    VarUI1FromStr, <.strIn, .lcid, .dwFlags, .pbOut>,  'VarUI1FromStr',  \
    VarUI1FromUI2, <.uiIn, .pbOut>,  'VarUI1FromUI2',  \
    VarUI1FromUI4, <.ulIn, .pbOut>,  'VarUI1FromUI4',  \
    VarUI1FromUI8, <NONE>,  'VarUI1FromUI8',  \
    VarUI2FromBool, <.boolIn, .puiOut>,  'VarUI2FromBool',  \
    VarUI2FromCy, <.cyIn, .puiOut>,  'VarUI2FromCy',  \
    VarUI2FromDate, <.dateIn, .puiOut>,  'VarUI2FromDate',  \
    VarUI2FromDec, <.pdecIn, .puiOut>,  'VarUI2FromDec',  \
    VarUI2FromDisp, <.pdispIn, .lcid, .puiOut>,  'VarUI2FromDisp',  \
    VarUI2FromI1, <.cIn, .puiOut>,  'VarUI2FromI1',  \
    VarUI2FromI2, <.uiIn, .puiOut>,  'VarUI2FromI2',  \
    VarUI2FromI4, <.lIn, .puiOut>,  'VarUI2FromI4',  \
    VarUI2FromI8, <NONE>,  'VarUI2FromI8',  \
    VarUI2FromR4, <.fltIn, .puiOut>,  'VarUI2FromR4',  \
    VarUI2FromR8, <.dblIn, .puiOut>,  'VarUI2FromR8',  \
    VarUI2FromStr, <.strIn, .lcid, .dwFlags, .puiOut>,  'VarUI2FromStr',  \
    VarUI2FromUI1, <.bIn, .puiOut>,  'VarUI2FromUI1',  \
    VarUI2FromUI4, <.ulIn, .puiOut>,  'VarUI2FromUI4',  \
    VarUI2FromUI8, <NONE>,  'VarUI2FromUI8',  \
    VarUI4FromBool, <.boolIn, .pulOut>,  'VarUI4FromBool',  \
    VarUI4FromCy, <.cyIn, .pulOut>,  'VarUI4FromCy',  \
    VarUI4FromDate, <.dateIn, .pulOut>,  'VarUI4FromDate',  \
    VarUI4FromDec, <.pdecIn, .pulOut>,  'VarUI4FromDec',  \
    VarUI4FromDisp, <.pdispIn, .lcid, .pulOut>,  'VarUI4FromDisp',  \
    VarUI4FromI1, <.cIn, .pulOut>,  'VarUI4FromI1',  \
    VarUI4FromI2, <.uiIn, .pulOut>,  'VarUI4FromI2',  \
    VarUI4FromI4, <.lIn, .pulOut>,  'VarUI4FromI4',  \
    VarUI4FromI8, <NONE>,  'VarUI4FromI8',  \
    VarUI4FromR4, <.fltIn, .pulOut>,  'VarUI4FromR4',  \
    VarUI4FromR8, <.dblIn, .pulOut>,  'VarUI4FromR8',  \
    VarUI4FromStr, <.strIn, .lcid, .dwFlags, .pulOut>,  'VarUI4FromStr',  \
    VarUI4FromUI1, <.bIn, .pulOut>,  'VarUI4FromUI1',  \
    VarUI4FromUI2, <.uiIn, .pulOut>,  'VarUI4FromUI2',  \
    VarUI4FromUI8, <NONE>,  'VarUI4FromUI8',  \
    VarUI8FromBool, <NONE>,  'VarUI8FromBool',  \
    VarUI8FromCy, <NONE>,  'VarUI8FromCy',  \
    VarUI8FromDate, <NONE>,  'VarUI8FromDate',  \
    VarUI8FromDec, <NONE>,  'VarUI8FromDec',  \
    VarUI8FromDisp, <NONE>,  'VarUI8FromDisp',  \
    VarUI8FromI1, <NONE>,  'VarUI8FromI1',  \
    VarUI8FromI2, <NONE>,  'VarUI8FromI2',  \
    VarUI8FromI8, <NONE>,  'VarUI8FromI8',  \
    VarUI8FromR4, <NONE>,  'VarUI8FromR4',  \
    VarUI8FromR8, <NONE>,  'VarUI8FromR8',  \
    VarUI8FromStr, <NONE>,  'VarUI8FromStr',  \
    VarUI8FromUI1, <NONE>,  'VarUI8FromUI1',  \
    VarUI8FromUI2, <NONE>,  'VarUI8FromUI2',  \
    VarUI8FromUI4, <NONE>,  'VarUI8FromUI4',  \
    VarUdateFromDate, <.dateIn, .dwFlags, .pudateOut>,  'VarUdateFromDate',  \
    VarWeekdayName, <.iWeekday, .fAbbrev, .iFirstDay, .dwFlags, .pbstrOut>,  'VarWeekdayName',  \
    VarXor, <.pvarLeft, .pvarRight, .pvarResult>,  'VarXor',  \
    VariantChangeType, <.pvargDest, .pvarSrc, .wFlags, .vt>,  'VariantChangeType',  \
    VariantChangeTypeEx, <.pvargDest, .pvarSrc, .lcid, .wFlags, .vt>,  'VariantChangeTypeEx',  \
    VariantClear, <.pvarg>,  'VariantClear',  \
    VariantCopy, <.pvargDest, .pvargSrc>,  'VariantCopy',  \
    VariantCopyInd, <.pvarDest, .pvargSrc>,  'VariantCopyInd',  \
    VariantInit, <.pvarg>,  'VariantInit',  \
    VariantTimeToDosDateTime, <.vtime, .pwDosDate, .pwDosTime>,  'VariantTimeToDosDateTime',  \
    VariantTimeToSystemTime, <.vtime, .lpSystemTime>,  'VariantTimeToSystemTime',  \
    VectorFromBstr, <.bstr, .ppsa>,  'VectorFromBstr'

Added freshlib/imports/Win32/sdl.inc.

















































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: SDL v1.2.11 API functions.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;
; SDL 1.2.11 includes written by Raedwulf
; a.k.a. Tai Chi Minh Ralph Eastwood
;
; There's no warranty for the correctness nor completeness of this file
; However, please mail me at tcmreastwood@ntlworld.com if you spot
; any errors in here.
;
; Version Date: 07/11/2006 (dd/mm/yyyy)
;_________________________________________________________________________________________

import_proto sdl,                                       \
    SDL_AddTimer, <NONE>, 'SDL_AddTimer',               \
    SDL_AllocRW, <NONE>, 'SDL_AllocRW',                 \
    SDL_AudioDriverName, <NONE>, 'SDL_AudioDriverName', \
    SDL_AudioInit, <NONE>, 'SDL_AudioInit',             \
    SDL_AudioQuit, <NONE>, 'SDL_AudioQuit',             \
    SDL_BuildAudioCVT, <NONE>, 'SDL_BuildAudioCVT',     \
    SDL_CDClose, <NONE>, 'SDL_CDClose',                 \
    SDL_CDEject, <NONE>, 'SDL_CDEject',                 \
    SDL_CDName, <NONE>, 'SDL_CDName',                   \
    SDL_CDNumDrives, <NONE>, 'SDL_CDNumDrives',         \
    SDL_CDOpen, <NONE>, 'SDL_CDOpen',                   \
    SDL_CDPause, <NONE>, 'SDL_CDPause',                 \
    SDL_CDPlay, <NONE>, 'SDL_CDPlay',                   \
    SDL_CDPlayTracks, <NONE>, 'SDL_CDPlayTracks',\
    SDL_CDResume, <NONE>, 'SDL_CDResume',\
    SDL_CDStatus, <NONE>, 'SDL_CDStatus',\
    SDL_CDStop, <NONE>, 'SDL_CDStop',\
    SDL_ClearError, <NONE>, 'SDL_ClearError',\
    SDL_CloseAudio, <NONE>, 'SDL_CloseAudio',\
    SDL_CondBroadcast, <NONE>, 'SDL_CondBroadcast',\
    SDL_CondSignal, <NONE>, 'SDL_CondSignal',\
    SDL_CondWait, <NONE>, 'SDL_CondWait',\
    SDL_CondWaitTimeout, <NONE>, 'SDL_CondWaitTimeout',\
    SDL_ConvertAudio, <NONE>, 'SDL_ConvertAudio',\
    SDL_ConvertSurface, <NONE>, 'SDL_ConvertSurface',\
    SDL_CreateCond, <NONE>, 'SDL_CreateCond',\
    SDL_CreateCursor, <NONE>, 'SDL_CreateCursor',\
    SDL_CreateMutex, <NONE>, 'SDL_CreateMutex',\
    SDL_CreateRGBSurface, <NONE>, 'SDL_CreateRGBSurface',\
    SDL_CreateRGBSurfaceFrom, <NONE>, 'SDL_CreateRGBSurfaceFrom',\
    SDL_CreateSemaphore, <NONE>, 'SDL_CreateSemaphore',\
    SDL_CreateThread, <NONE>, 'SDL_CreateThread',\
    SDL_CreateYUVOverlay, <NONE>, 'SDL_CreateYUVOverlay',\
    SDL_Delay, <NONE>, 'SDL_Delay',\
    SDL_DestroyCond, <NONE>, 'SDL_DestroyCond',\
    SDL_DestroyMutex, <NONE>, 'SDL_DestroyMutex',\
    SDL_DestroySemaphore, <NONE>, 'SDL_DestroySemaphore',\
    SDL_DisplayFormat, <NONE>, 'SDL_DisplayFormat',\
    SDL_DisplayFormatAlpha, <NONE>, 'SDL_DisplayFormatAlpha',\
    SDL_DisplayYUVOverlay, <NONE>, 'SDL_DisplayYUVOverlay',\
    SDL_EnableKeyRepeat, <NONE>, 'SDL_EnableKeyRepeat',\
    SDL_EnableUNICODE, <NONE>, 'SDL_EnableUNICODE',\
    SDL_Error, <NONE>, 'SDL_Error',\
    SDL_EventState, <NONE>, 'SDL_EventState',\
    SDL_FillRect, <NONE>, 'SDL_FillRect',\
    SDL_Flip, <NONE>, 'SDL_Flip',\
    SDL_FreeCursor, <NONE>, 'SDL_FreeCursor',\
    SDL_FreeRW, <NONE>, 'SDL_FreeRW',\
    SDL_FreeSurface, <NONE>, 'SDL_FreeSurface',\
    SDL_FreeWAV, <NONE>, 'SDL_FreeWAV',\
    SDL_FreeYUVOverlay, <NONE>, 'SDL_FreeYUVOverlay',\
    SDL_GL_GetAttribute, <NONE>, 'SDL_GL_GetAttribute',\
    SDL_GL_GetProcAddress, <NONE>, 'SDL_GL_GetProcAddress',\
    SDL_GL_LoadLibrary, <NONE>, 'SDL_GL_LoadLibrary',\
    SDL_GL_Lock, <NONE>, 'SDL_GL_Lock',\
    SDL_GL_SetAttribute, <NONE>, 'SDL_GL_SetAttribute',\
    SDL_GL_SwapBuffers, <NONE>, 'SDL_GL_SwapBuffers',\
    SDL_GL_Unlock, <NONE>, 'SDL_GL_Unlock',\
    SDL_GL_UpdateRects, <NONE>, 'SDL_GL_UpdateRects',\
    SDL_GetAppState, <NONE>, 'SDL_GetAppState',\
    SDL_GetAudioStatus, <NONE>, 'SDL_GetAudioStatus',\
    SDL_GetClipRect, <NONE>, 'SDL_GetClipRect',\
    SDL_GetCursor, <NONE>, 'SDL_GetCursor',\
    SDL_GetError, <NONE>, 'SDL_GetError',\
    SDL_GetEventFilter, <NONE>, 'SDL_GetEventFilter',\
    SDL_GetGammaRamp, <NONE>, 'SDL_GetGammaRamp',\
    SDL_GetKeyName, <NONE>, 'SDL_GetKeyName',\
    SDL_GetKeyRepeat, <NONE>, 'SDL_GetKeyRepeat',\
    SDL_GetKeyState, <NONE>, 'SDL_GetKeyState',\
    SDL_GetModState, <NONE>, 'SDL_GetModState',\
    SDL_GetMouseState, <NONE>, 'SDL_GetMouseState',\
    SDL_GetRGB, <NONE>, 'SDL_GetRGB',\
    SDL_GetRGBA, <NONE>, 'SDL_GetRGBA',\
    SDL_GetRelativeMouseState, <NONE>, 'SDL_GetRelativeMouseState',\
    SDL_GetThreadID, <NONE>, 'SDL_GetThreadID',\
    SDL_GetTicks, <NONE>, 'SDL_GetTicks',\
    SDL_GetVideoInfo, <NONE>, 'SDL_GetVideoInfo',\
    SDL_GetVideoSurface, <NONE>, 'SDL_GetVideoSurface',\
    SDL_GetWMInfo, <NONE>, 'SDL_GetWMInfo',\
    SDL_Has3DNow, <NONE>, 'SDL_Has3DNow',\
    SDL_Has3DNowExt, <NONE>, 'SDL_Has3DNowExt',\
    SDL_HasAltiVec, <NONE>, 'SDL_HasAltiVec',\
    SDL_HasMMX, <NONE>, 'SDL_HasMMX',\
    SDL_HasMMXExt, <NONE>, 'SDL_HasMMXExt',\
    SDL_HasRDTSC, <NONE>, 'SDL_HasRDTSC',\
    SDL_HasSSE, <NONE>, 'SDL_HasSSE',\
    SDL_HasSSE2, <NONE>, 'SDL_HasSSE2',\
    SDL_Init, <NONE>, 'SDL_Init',\
    SDL_InitSubSystem, <NONE>, 'SDL_InitSubSystem',\
    SDL_JoystickClose, <NONE>, 'SDL_JoystickClose',\
    SDL_JoystickEventState, <NONE>, 'SDL_JoystickEventState',\
    SDL_JoystickGetAxis, <NONE>, 'SDL_JoystickGetAxis',\
    SDL_JoystickGetBall, <NONE>, 'SDL_JoystickGetBall',\
    SDL_JoystickGetButton, <NONE>, 'SDL_JoystickGetButton',\
    SDL_JoystickGetHat, <NONE>, 'SDL_JoystickGetHat',\
    SDL_JoystickIndex, <NONE>, 'SDL_JoystickIndex',\
    SDL_JoystickName, <NONE>, 'SDL_JoystickName',\
    SDL_JoystickNumAxes, <NONE>, 'SDL_JoystickNumAxes',\
    SDL_JoystickNumBalls, <NONE>, 'SDL_JoystickNumBalls',\
    SDL_JoystickNumButtons, <NONE>, 'SDL_JoystickNumButtons',\
    SDL_JoystickNumHats, <NONE>, 'SDL_JoystickNumHats',\
    SDL_JoystickOpen, <NONE>, 'SDL_JoystickOpen',\
    SDL_JoystickOpened, <NONE>, 'SDL_JoystickOpened',\
    SDL_JoystickUpdate, <NONE>, 'SDL_JoystickUpdate',\
    SDL_KillThread, <NONE>, 'SDL_KillThread',\
    SDL_Linked_Version, <NONE>, 'SDL_Linked_Version',\
    SDL_ListModes, <NONE>, 'SDL_ListModes',\
    SDL_LoadBMP_RW, <NONE>, 'SDL_LoadBMP_RW',\
    SDL_LoadFunction, <NONE>, 'SDL_LoadFunction',\
    SDL_LoadObject, <NONE>, 'SDL_LoadObject',\
    SDL_LoadWAV_RW, <NONE>, 'SDL_LoadWAV_RW',\
    SDL_LockAudio, <NONE>, 'SDL_LockAudio',\
    SDL_LockSurface, <NONE>, 'SDL_LockSurface',\
    SDL_LockYUVOverlay, <NONE>, 'SDL_LockYUVOverlay',\
    SDL_LowerBlit, <NONE>, 'SDL_LowerBlit',\
    SDL_MapRGB, <NONE>, 'SDL_MapRGB',\
    SDL_MapRGBA, <NONE>, 'SDL_MapRGBA',\
    SDL_MixAudio, <NONE>, 'SDL_MixAudio',\
    SDL_NumJoysticks, <NONE>, 'SDL_NumJoysticks',\
    SDL_OpenAudio, <NONE>, 'SDL_OpenAudio',\
    SDL_PauseAudio, <NONE>, 'SDL_PauseAudio',\
    SDL_PeepEvents, <NONE>, 'SDL_PeepEvents',\
    SDL_PollEvent, <NONE>, 'SDL_PollEvent',\
    SDL_PumpEvents, <NONE>, 'SDL_PumpEvents',\
    SDL_PushEvent, <NONE>, 'SDL_PushEvent',\
    SDL_Quit, <NONE>, 'SDL_Quit',\
    SDL_QuitSubSystem, <NONE>, 'SDL_QuitSubSystem',\
    SDL_RWFromConstMem, <NONE>, 'SDL_RWFromConstMem',\
    SDL_RWFromFP, <NONE>, 'SDL_RWFromFP',\
    SDL_RWFromFile, <NONE>, 'SDL_RWFromFile',\
    SDL_RWFromMem, <NONE>, 'SDL_RWFromMem',\
    SDL_ReadBE16, <NONE>, 'SDL_ReadBE16',\
    SDL_ReadBE32, <NONE>, 'SDL_ReadBE32',\
    SDL_ReadBE64, <NONE>, 'SDL_ReadBE64',\
    SDL_ReadLE16, <NONE>, 'SDL_ReadLE16',\
    SDL_ReadLE32, <NONE>, 'SDL_ReadLE32',\
    SDL_ReadLE64, <NONE>, 'SDL_ReadLE64',\
    SDL_RegisterApp, <NONE>, 'SDL_RegisterApp',\
    SDL_RemoveTimer, <NONE>, 'SDL_RemoveTimer',\
    SDL_SaveBMP_RW, <NONE>, 'SDL_SaveBMP_RW',\
    SDL_SemPost, <NONE>, 'SDL_SemPost',\
    SDL_SemTryWait, <NONE>, 'SDL_SemTryWait',\
    SDL_SemValue, <NONE>, 'SDL_SemValue',\
    SDL_SemWait, <NONE>, 'SDL_SemWait',\
    SDL_SemWaitTimeout, <NONE>, 'SDL_SemWaitTimeout',\
    SDL_SetAlpha, <NONE>, 'SDL_SetAlpha',\
    SDL_SetClipRect, <NONE>, 'SDL_SetClipRect',\
    SDL_SetColorKey, <NONE>, 'SDL_SetColorKey',\
    SDL_SetColors, <NONE>, 'SDL_SetColors',\
    SDL_SetCursor, <NONE>, 'SDL_SetCursor',\
    SDL_SetError, <NONE>, 'SDL_SetError',\
    SDL_SetEventFilter, <NONE>, 'SDL_SetEventFilter',\
    SDL_SetGamma, <NONE>, 'SDL_SetGamma',\
    SDL_SetGammaRamp, <NONE>, 'SDL_SetGammaRamp',\
    SDL_SetModState, <NONE>, 'SDL_SetModState',\
    SDL_SetModuleHandle, <NONE>, 'SDL_SetModuleHandle',\
    SDL_SetPalette, <NONE>, 'SDL_SetPalette',\
    SDL_SetTimer, <NONE>, 'SDL_SetTimer',\
    SDL_SetVideoMode, <NONE>, 'SDL_SetVideoMode',\
    SDL_ShowCursor, <NONE>, 'SDL_ShowCursor',\
    SDL_SoftStretch, <NONE>, 'SDL_SoftStretch',\
    SDL_ThreadID, <NONE>, 'SDL_ThreadID',\
    SDL_UnloadObject, <NONE>, 'SDL_UnloadObject',\
    SDL_UnlockAudio, <NONE>, 'SDL_UnlockAudio',\
    SDL_UnlockSurface, <NONE>, 'SDL_UnlockSurface',\
    SDL_UnlockYUVOverlay, <NONE>, 'SDL_UnlockYUVOverlay',\
    SDL_UnregisterApp, <NONE>, 'SDL_UnregisterApp',\
    SDL_UpdateRect, <NONE>, 'SDL_UpdateRect',\
    SDL_UpdateRects, <NONE>, 'SDL_UpdateRects',\
    SDL_UpperBlit, <NONE>, 'SDL_UpperBlit',\
    SDL_VideoDriverName, <NONE>, 'SDL_VideoDriverName',\
    SDL_VideoInit, <NONE>, 'SDL_VideoInit',\
    SDL_VideoModeOK, <NONE>, 'SDL_VideoModeOK',\
    SDL_VideoQuit, <NONE>, 'SDL_VideoQuit',\
    SDL_WM_GetCaption, <NONE>, 'SDL_WM_GetCaption',\
    SDL_WM_GrabInput, <NONE>, 'SDL_WM_GrabInput',\
    SDL_WM_IconifyWindow, <NONE>, 'SDL_WM_IconifyWindow',\
    SDL_WM_SetCaption, <NONE>, 'SDL_WM_SetCaption',\
    SDL_WM_SetIcon, <NONE>, 'SDL_WM_SetIcon',\
    SDL_WM_ToggleFullScreen, <NONE>, 'SDL_WM_ToggleFullScreen',\
    SDL_WaitEvent, <NONE>, 'SDL_WaitEvent',\
    SDL_WaitThread, <NONE>, 'SDL_WaitThread',\
    SDL_WarpMouse, <NONE>, 'SDL_WarpMouse',\
    SDL_WasInit, <NONE>, 'SDL_WasInit',\
    SDL_WriteBE16, <NONE>, 'SDL_WriteBE16',\
    SDL_WriteBE32, <NONE>, 'SDL_WriteBE32',\
    SDL_WriteBE64, <NONE>, 'SDL_WriteBE64',\
    SDL_WriteLE16, <NONE>, 'SDL_WriteLE16',\
    SDL_WriteLE32, <NONE>, 'SDL_WriteLE32',\
    SDL_WriteLE64, <NONE>, 'SDL_WriteLE64',\
    SDL_getenv, <NONE>, 'SDL_getenv',\
    SDL_iconv, <NONE>, 'SDL_iconv',\
    SDL_iconv_close, <NONE>, 'SDL_iconv_close',\
    SDL_iconv_open, <NONE>, 'SDL_iconv_open',\
    SDL_iconv_string, <NONE>, 'SDL_iconv_string',\
    SDL_lltoa, <NONE>, 'SDL_lltoa',\
    SDL_mutexP, <NONE>, 'SDL_mutexP',\
    SDL_mutexV, <NONE>, 'SDL_mutexV',\
    SDL_putenv, <NONE>, 'SDL_putenv',\
    SDL_revcpy, <NONE>, 'SDL_revcpy',\
    SDL_snprintf, <NONE>, 'SDL_snprintf',\
    SDL_strdup, <NONE>, 'SDL_strdup',\
    SDL_strlcat, <NONE>, 'SDL_strlcat',\
    SDL_strlcpy, <NONE>, 'SDL_strlcpy',\
    SDL_strtoull, <NONE>, 'SDL_strtoull',\
    SDL_ulltoa, <NONE>, 'SDL_ulltoa',\
    SDL_vsnprintf, <NONE>, 'SDL_vsnprintf'

Added freshlib/imports/Win32/sdl_image.inc.

































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: SDL_image v1.2 API functions.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
; _______________________________________________________________________________________

import_proto sdl_image,                         \
    IMG_Load, <NONE>, 'IMG_Load'

Added freshlib/imports/Win32/shell32.inc.



































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: shell32.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto shell32,  \
    Activate_RunDLL, <NONE>,  'Activate_RunDLL',  \
    AppCompat_RunDLLW, <NONE>,  'AppCompat_RunDLLW',  \
    CDefFolderMenu_Create, <NONE>,  'CDefFolderMenu_Create',  \
    CDefFolderMenu_Create2, <NONE>,  'CDefFolderMenu_Create2',  \
    CallCPLEntry16, <NONE>,  'CallCPLEntry16',  \
    CheckEscapesA, <NONE>,  'CheckEscapesA',  \
    CheckEscapesW, <NONE>,  'CheckEscapesW',  \
    CommandLineToArgvW, <.lpCmdLine, .pNumArgs>,  'CommandLineToArgvW',  \
    Control_FillCache_RunDLL, <NONE>,  'Control_FillCache_RunDLL',  \
    Control_FillCache_RunDLLA, <NONE>,  'Control_FillCache_RunDLLA',  \
    Control_FillCache_RunDLLW, <NONE>,  'Control_FillCache_RunDLLW',  \
    Control_RunDLL, <NONE>,  'Control_RunDLL',  \
    Control_RunDLLA, <NONE>,  'Control_RunDLLA',  \
    Control_RunDLLAsUserW, <NONE>,  'Control_RunDLLAsUserW',  \
    Control_RunDLLW, <NONE>,  'Control_RunDLLW',  \
    DAD_AutoScroll, <NONE>,  'DAD_AutoScroll',  \
    DAD_DragEnterEx, <NONE>,  'DAD_DragEnterEx',  \
    DAD_DragEnterEx2, <NONE>,  'DAD_DragEnterEx2',  \
    DAD_DragLeave, <NONE>,  'DAD_DragLeave',  \
    DAD_DragMove, <NONE>,  'DAD_DragMove',  \
    DAD_SetDragImage, <NONE>,  'DAD_SetDragImage',  \
    DAD_ShowDragImage, <NONE>,  'DAD_ShowDragImage',  \
    DoEnvironmentSubstA, <.szString, .cbString>,  'DoEnvironmentSubstA',  \
    DoEnvironmentSubstW, <.szString, .cbString>,  'DoEnvironmentSubstW',  \
    DragAcceptFiles, <.hwnd, .fAccept>,  'DragAcceptFiles',  \
    DragFinish, <.hDrop>,  'DragFinish',  \
    DragQueryFile, <.HDROP, .UINT, .lpStr, .ch>,  'DragQueryFile',  \
    DragQueryFileA, <.HDROP, .UINT, .lpStr, .ch>,  'DragQueryFileA',  \
    DragQueryFileAorW, <NONE>,  'DragQueryFileAorW',  \
    DragQueryFileW, <.HDROP, .UINT, .lpStr, .ch>,  'DragQueryFileW',  \
    DragQueryPoint, <.HDROP, .lpPoint>,  'DragQueryPoint',  \
    DriveType, <NONE>,  'DriveType',  \
    DuplicateIcon, <.hInst, .hIcon>,  'DuplicateIcon',  \
    ExtractAssociatedIconA, <.hInst, .lpIconPath, .lpiIcon>,  'ExtractAssociatedIconA',  \
    ExtractAssociatedIconExA, <NONE>,  'ExtractAssociatedIconExA',  \
    ExtractAssociatedIconExW, <NONE>,  'ExtractAssociatedIconExW',  \
    ExtractAssociatedIconW, <.hInst, .lpIconPath, .lpiIcon>,  'ExtractAssociatedIconW',  \
    ExtractIconA, <.hInst, .lpszExeFileName, .nIconIndex>,  'ExtractIconA',  \
    ExtractIconEx, <.lpszFile, .nIconIndex, .phiconLarge, .phiconSmall, .nIcons>,  'ExtractIconEx',  \
    ExtractIconExA, <.lpszFile, .nIconIndex, .phiconLarge, .phiconSmall, .nIcons>,  'ExtractIconExA',  \
    ExtractIconExW, <.lpszFile, .nIconIndex, .phiconLarge, .phiconSmall, .nIcons>,  'ExtractIconExW',  \
    ExtractIconResInfoA, <NONE>,  'ExtractIconResInfoA',  \
    ExtractIconResInfoW, <NONE>,  'ExtractIconResInfoW',  \
    ExtractIconW, <.hInst, .lpszExeFileName, .nIconIndex>,  'ExtractIconW',  \
    ExtractVersionResource16W, <NONE>,  'ExtractVersionResource16W',  \
    FindExeDlgProc, <NONE>,  'FindExeDlgProc',  \
    FindExecutableA, <.lpFile, .lpDirectory, .lpResult>,  'FindExecutableA',  \
    FindExecutableW, <.lpFile, .lpDirectory, .lpResult>,  'FindExecutableW',  \
    FreeIconList, <NONE>,  'FreeIconList',  \
    GetFileNameFromBrowse, <NONE>,  'GetFileNameFromBrowse',  \
    ILAppendID, <NONE>,  'ILAppendID',  \
    ILClone, <NONE>,  'ILClone',  \
    ILCloneFirst, <NONE>,  'ILCloneFirst',  \
    ILCombine, <NONE>,  'ILCombine',  \
    ILCreateFromPath, <NONE>,  'ILCreateFromPath',  \
    ILCreateFromPathA, <NONE>,  'ILCreateFromPathA',  \
    ILCreateFromPathW, <NONE>,  'ILCreateFromPathW',  \
    ILFindChild, <NONE>,  'ILFindChild',  \
    ILFindLastID, <NONE>,  'ILFindLastID',  \
    ILFree, <NONE>,  'ILFree',  \
    ILGetNext, <NONE>,  'ILGetNext',  \
    ILGetSize, <NONE>,  'ILGetSize',  \
    ILIsEqual, <NONE>,  'ILIsEqual',  \
    ILIsParent, <NONE>,  'ILIsParent',  \
    ILLoadFromStream, <NONE>,  'ILLoadFromStream',  \
    ILRemoveLastID, <NONE>,  'ILRemoveLastID',  \
    ILSaveToStream, <NONE>,  'ILSaveToStream',  \
    InternalExtractIconListA, <NONE>,  'InternalExtractIconListA',  \
    InternalExtractIconListW, <NONE>,  'InternalExtractIconListW',  \
    IsLFNDrive, <NONE>,  'IsLFNDrive',  \
    IsLFNDriveA, <NONE>,  'IsLFNDriveA',  \
    IsLFNDriveW, <NONE>,  'IsLFNDriveW',  \
    IsNetDrive, <NONE>,  'IsNetDrive',  \
    IsUserAnAdmin, <NONE>,  'IsUserAnAdmin',  \
    OpenAs_RunDLL, <NONE>,  'OpenAs_RunDLL',  \
    OpenAs_RunDLLA, <NONE>,  'OpenAs_RunDLLA',  \
    OpenAs_RunDLLW, <NONE>,  'OpenAs_RunDLLW',  \
    OpenRegStream, <NONE>,  'OpenRegStream',  \
    Options_RunDLL, <NONE>,  'Options_RunDLL',  \
    Options_RunDLLA, <NONE>,  'Options_RunDLLA',  \
    Options_RunDLLW, <NONE>,  'Options_RunDLLW',  \
    PathCleanupSpec, <NONE>,  'PathCleanupSpec',  \
    PathGetShortPath, <NONE>,  'PathGetShortPath',  \
    PathIsExe, <NONE>,  'PathIsExe',  \
    PathIsSlowA, <NONE>,  'PathIsSlowA',  \
    PathIsSlowW, <NONE>,  'PathIsSlowW',  \
    PathMakeUniqueName, <NONE>,  'PathMakeUniqueName',  \
    PathProcessCommand, <NONE>,  'PathProcessCommand',  \
    PathQualify, <NONE>,  'PathQualify',  \
    PathResolve, <NONE>,  'PathResolve',  \
    PathYetAnotherMakeUniqueName, <NONE>,  'PathYetAnotherMakeUniqueName',  \
    PickIconDlg, <NONE>,  'PickIconDlg',  \
    PifMgr_CloseProperties, <NONE>,  'PifMgr_CloseProperties',  \
    PifMgr_GetProperties, <NONE>,  'PifMgr_GetProperties',  \
    PifMgr_OpenProperties, <NONE>,  'PifMgr_OpenProperties',  \
    PifMgr_SetProperties, <NONE>,  'PifMgr_SetProperties',  \
    PrintersGetCommand_RunDLL, <NONE>,  'PrintersGetCommand_RunDLL',  \
    PrintersGetCommand_RunDLLA, <NONE>,  'PrintersGetCommand_RunDLLA',  \
    PrintersGetCommand_RunDLLW, <NONE>,  'PrintersGetCommand_RunDLLW',  \
    ReadCabinetState, <NONE>,  'ReadCabinetState',  \
    RealDriveType, <NONE>,  'RealDriveType',  \
    RealShellExecuteA, <NONE>,  'RealShellExecuteA',  \
    RealShellExecuteExA, <NONE>,  'RealShellExecuteExA',  \
    RealShellExecuteExW, <NONE>,  'RealShellExecuteExW',  \
    RealShellExecuteW, <NONE>,  'RealShellExecuteW',  \
    RegenerateUserEnvironment, <NONE>,  'RegenerateUserEnvironment',  \
    RestartDialog, <NONE>,  'RestartDialog',  \
    RestartDialogEx, <NONE>,  'RestartDialogEx',  \
    SHAddFromPropSheetExtArray, <NONE>,  'SHAddFromPropSheetExtArray',  \
    SHAddToRecentDocs, <.uFlags, .pv>,  'SHAddToRecentDocs',  \
    SHAlloc, <NONE>,  'SHAlloc',  \
    SHAllocShared, <NONE>,  'SHAllocShared',  \
    SHAppBarMessage, <.dwMessage, .pData>,  'SHAppBarMessage',  \
    SHBindToParent, <.pidl, .riid, .ppv, .ppidlLast>,  'SHBindToParent',  \
    SHBrowseForFolder, <.lpbi>,  'SHBrowseForFolder',  \
    SHBrowseForFolderA, <.lpbi>,  'SHBrowseForFolderA',  \
    SHBrowseForFolderW, <.lpbi>,  'SHBrowseForFolderW',  \
    SHCLSIDFromString, <NONE>,  'SHCLSIDFromString',  \
    SHChangeNotification_Lock, <NONE>,  'SHChangeNotification_Lock',  \
    SHChangeNotification_Unlock, <NONE>,  'SHChangeNotification_Unlock',  \
    SHChangeNotify, <.wEventId, .uFlags, .dwItem1, .dwItem2>,  'SHChangeNotify',  \
    SHChangeNotifyDeregister, <NONE>,  'SHChangeNotifyDeregister',  \
    SHChangeNotifyRegister, <NONE>,  'SHChangeNotifyRegister',  \
    SHChangeNotifySuspendResume, <NONE>,  'SHChangeNotifySuspendResume',  \
    SHCloneSpecialIDList, <NONE>,  'SHCloneSpecialIDList',  \
    SHCoCreateInstance, <NONE>,  'SHCoCreateInstance',  \
    SHCreateDirectory, <NONE>,  'SHCreateDirectory',  \
    SHCreateDirectoryExA, <.hwnd, .pszPath, .psa>,  'SHCreateDirectoryExA',  \
    SHCreateDirectoryExW, <.hwnd, .pszPath, .psa>,  'SHCreateDirectoryExW',  \
    SHCreateFileExtractIconW, <NONE>,  'SHCreateFileExtractIconW',  \
    SHCreateLocalServerRunDll, <NONE>,  'SHCreateLocalServerRunDll',  \
    SHCreateProcessAsUserW, <NONE>,  'SHCreateProcessAsUserW',  \
    SHCreatePropSheetExtArray, <NONE>,  'SHCreatePropSheetExtArray',  \
    SHCreateQueryCancelAutoPlayMoniker, <NONE>,  'SHCreateQueryCancelAutoPlayMoniker',  \
    SHCreateShellFolderView, <NONE>,  'SHCreateShellFolderView',  \
    SHCreateShellFolderViewEx, <NONE>,  'SHCreateShellFolderViewEx',  \
    SHCreateShellItem, <NONE>,  'SHCreateShellItem',  \
    SHCreateStdEnumFmtEtc, <NONE>,  'SHCreateStdEnumFmtEtc',  \
    SHDefExtractIconA, <NONE>,  'SHDefExtractIconA',  \
    SHDefExtractIconW, <NONE>,  'SHDefExtractIconW',  \
    SHDestroyPropSheetExtArray, <NONE>,  'SHDestroyPropSheetExtArray',  \
    SHDoDragDrop, <NONE>,  'SHDoDragDrop',  \
    SHEmptyRecycleBinA, <.hwnd, .pszRootPath, .dwFlags>,  'SHEmptyRecycleBinA',  \
    SHEmptyRecycleBinW, <.hwnd, .pszRootPath, .dwFlags>,  'SHEmptyRecycleBinW',  \
    SHEnableServiceObject, <NONE>,  'SHEnableServiceObject',  \
    SHEnumerateUnreadMailAccountsW, <NONE>,  'SHEnumerateUnreadMailAccountsW',  \
    SHExtractIconsW, <NONE>,  'SHExtractIconsW',  \
    SHFileOperation, <.lpFileOp>,  'SHFileOperation',  \
    SHFileOperationA, <.lpFileOp>,  'SHFileOperationA',  \
    SHFileOperationW, <.lpFileOp>,  'SHFileOperationW',  \
    SHFindFiles, <NONE>,  'SHFindFiles',  \
    SHFind_InitMenuPopup, <NONE>,  'SHFind_InitMenuPopup',  \
    SHFlushClipboard, <NONE>,  'SHFlushClipboard',  \
    SHFlushSFCache, <NONE>,  'SHFlushSFCache',  \
    SHFormatDrive, <NONE>,  'SHFormatDrive',  \
    SHFree, <NONE>,  'SHFree',  \
    SHFreeNameMappings, <.hNameMappings>,  'SHFreeNameMappings',  \
    SHFreeShared, <NONE>,  'SHFreeShared',  \
    SHGetAttributesFromDataObject, <NONE>,  'SHGetAttributesFromDataObject',  \
    SHGetDataFromIDListA, <.psf, .pidl, .nFormat, .pv, .cb>,  'SHGetDataFromIDListA',  \
    SHGetDataFromIDListW, <.psf, .pidl, .nFormat, .pv, .cb>,  'SHGetDataFromIDListW',  \
    SHGetDesktopFolder, <.ppshf>,  'SHGetDesktopFolder',  \
    SHGetDiskFreeSpaceA, <NONE>,  'SHGetDiskFreeSpaceA',  \
    SHGetDiskFreeSpaceExA, <.pszDirectoryName, .pulFreeBytesAvailableToCaller, .pulTotalNumberOfBytes, .pulTotalNumberOfFreeBytes,  \
      >,  'SHGetDiskFreeSpaceExA',  \
    SHGetDiskFreeSpaceExW, <.pszDirectoryName, .pulFreeBytesAvailableToCaller, .pulTotalNumberOfBytes, .pulTotalNumberOfFreeBytes,  \
      >,  'SHGetDiskFreeSpaceExW',  \
    SHGetFileInfo, <.pszPath, .dwFileAttributes, .psfi, .cbFileInfo, .uFlags>,  'SHGetFileInfo',  \
    SHGetFileInfoA, <.pszPath, .dwFileAttributes, .psfi, .cbFileInfo, .uFlags>,  'SHGetFileInfoA',  \
    SHGetFileInfoW, <.pszPath, .dwFileAttributes, .psfi, .cbFileInfo, .uFlags>,  'SHGetFileInfoW',  \
    SHGetFolderLocation, <.hwnd, .csidl, .hToken, .dwFlags, .ppidl>,  'SHGetFolderLocation',  \
    SHGetFolderPathA, <.hwnd, .csidl, .hToken, .dwFlags, .pszPath>,  'SHGetFolderPathA',  \
    SHGetFolderPathAndSubDirA, <NONE>,  'SHGetFolderPathAndSubDirA',  \
    SHGetFolderPathAndSubDirW, <NONE>,  'SHGetFolderPathAndSubDirW',  \
    SHGetFolderPathW, <.hwnd, .csidl, .hToken, .dwFlags, .pszPath>,  'SHGetFolderPathW',  \
    SHGetIconOverlayIndexA, <.pszIconPath, .iIconIndex>,  'SHGetIconOverlayIndexA',  \
    SHGetIconOverlayIndexW, <.pszIconPath, .iIconIndex>,  'SHGetIconOverlayIndexW',  \
    SHGetImageList, <NONE>,  'SHGetImageList',  \
    SHGetInstanceExplorer, <.ppunk>,  'SHGetInstanceExplorer',  \
    SHGetMalloc, <.ppMalloc>,  'SHGetMalloc',  \
    SHGetNewLinkInfo, <.pszLinkto, .pszDir, .pszName, .pfMustCopy, .uFlags>,  'SHGetNewLinkInfo',  \
    SHGetNewLinkInfoA, <.pszLinkto, .pszDir, .pszName, .pfMustCopy, .uFlags>,  'SHGetNewLinkInfoA',  \
    SHGetNewLinkInfoW, <.pszLinkto, .pszDir, .pszName, .pfMustCopy, .uFlags>,  'SHGetNewLinkInfoW',  \
    SHGetPathFromIDList, <.pidl, .pszPath>,  'SHGetPathFromIDList',  \
    SHGetPathFromIDListA, <.pidl, .pszPath>,  'SHGetPathFromIDListA',  \
    SHGetPathFromIDListW, <.pidl, .pszPath>,  'SHGetPathFromIDListW',  \
    SHGetRealIDL, <NONE>,  'SHGetRealIDL',  \
    SHGetSetFolderCustomSettingsW, <NONE>,  'SHGetSetFolderCustomSettingsW',  \
    SHGetSetSettings, <NONE>,  'SHGetSetSettings',  \
    SHGetSettings, <.lpsfs, .dwMask>,  'SHGetSettings',  \
    SHGetShellStyleHInstance, <NONE>,  'SHGetShellStyleHInstance',  \
    SHGetSpecialFolderLocation, <.hwnd, .csidl, .ppidl>,  'SHGetSpecialFolderLocation',  \
    SHGetSpecialFolderPathA, <.hwnd, .pszPath, .csidl, .fCreate>,  'SHGetSpecialFolderPathA',  \
    SHGetSpecialFolderPathW, <.hwnd, .pszPath, .csidl, .fCreate>,  'SHGetSpecialFolderPathW',  \
    SHGetUnreadMailCountW, <NONE>,  'SHGetUnreadMailCountW',  \
    SHHandleUpdateImage, <NONE>,  'SHHandleUpdateImage',  \
    SHHelpShortcuts_RunDLL, <NONE>,  'SHHelpShortcuts_RunDLL',  \
    SHHelpShortcuts_RunDLLA, <NONE>,  'SHHelpShortcuts_RunDLLA',  \
    SHHelpShortcuts_RunDLLW, <NONE>,  'SHHelpShortcuts_RunDLLW',  \
    SHILCreateFromPath, <NONE>,  'SHILCreateFromPath',  \
    SHInvokePrinterCommandA, <.hwnd, .uAction, .lpBuf1, .lpBuf2, .fModal>,  'SHInvokePrinterCommandA',  \
    SHInvokePrinterCommandW, <.hwnd, .uAction, .lpBuf1, .lpBuf2, .fModal>,  'SHInvokePrinterCommandW',  \
    SHIsFileAvailableOffline, <.pwszPath, .pdwStatus>,  'SHIsFileAvailableOffline',  \
    SHLimitInputEdit, <NONE>,  'SHLimitInputEdit',  \
    SHLoadInProc, <.rclsid>,  'SHLoadInProc',  \
    SHLoadNonloadedIconOverlayIdentifiers, <VOID>,  'SHLoadNonloadedIconOverlayIdentifiers',  \
    SHLoadOLE, <NONE>,  'SHLoadOLE',  \
    SHLockShared, <NONE>,  'SHLockShared',  \
    SHMapIDListToImageListIndexAsync, <NONE>,  'SHMapIDListToImageListIndexAsync',  \
    SHMapPIDLToSystemImageListIndex, <NONE>,  'SHMapPIDLToSystemImageListIndex',  \
    SHMultiFileProperties, <NONE>,  'SHMultiFileProperties',  \
    SHObjectProperties, <NONE>,  'SHObjectProperties',  \
    SHOpenFolderAndSelectItems, <NONE>,  'SHOpenFolderAndSelectItems',  \
    SHOpenPropSheetW, <NONE>,  'SHOpenPropSheetW',  \
    SHParseDisplayName, <NONE>,  'SHParseDisplayName',  \
    SHPathPrepareForWriteA, <.hwnd, .punkEnableModless, .pszPath, .dwFlags>,  'SHPathPrepareForWriteA',  \
    SHPathPrepareForWriteW, <.hwnd, .punkEnableModless, .pszPath, .dwFlags>,  'SHPathPrepareForWriteW',  \
    SHPropStgCreate, <NONE>,  'SHPropStgCreate',  \
    SHPropStgReadMultiple, <NONE>,  'SHPropStgReadMultiple',  \
    SHPropStgWriteMultiple, <NONE>,  'SHPropStgWriteMultiple',  \
    SHQueryRecycleBinA, <.pszRootPath, .pSHQueryRBInfo>,  'SHQueryRecycleBinA',  \
    SHQueryRecycleBinW, <.pszRootPath, .pSHQueryRBInfo>,  'SHQueryRecycleBinW',  \
    SHReplaceFromPropSheetExtArray, <NONE>,  'SHReplaceFromPropSheetExtArray',  \
    SHRestricted, <NONE>,  'SHRestricted',  \
    SHRunControlPanel, <NONE>,  'SHRunControlPanel',  \
    SHSetInstanceExplorer, <NONE>,  'SHSetInstanceExplorer',  \
    SHSetLocalizedName, <NONE>,  'SHSetLocalizedName',  \
    SHSetUnreadMailCountW, <NONE>,  'SHSetUnreadMailCountW',  \
    SHShellFolderView_Message, <NONE>,  'SHShellFolderView_Message',  \
    SHSimpleIDListFromPath, <NONE>,  'SHSimpleIDListFromPath',  \
    SHStartNetConnectionDialogW, <NONE>,  'SHStartNetConnectionDialogW',  \
    SHTestTokenMembership, <NONE>,  'SHTestTokenMembership',  \
    SHUnlockShared, <NONE>,  'SHUnlockShared',  \
    SHUpdateImageA, <NONE>,  'SHUpdateImageA',  \
    SHUpdateImageW, <NONE>,  'SHUpdateImageW',  \
    SHUpdateRecycleBinIcon, <NONE>,  'SHUpdateRecycleBinIcon',  \
    SHValidateUNC, <NONE>,  'SHValidateUNC',  \
    SheChangeDirA, <NONE>,  'SheChangeDirA',  \
    SheChangeDirExA, <NONE>,  'SheChangeDirExA',  \
    SheChangeDirExW, <NONE>,  'SheChangeDirExW',  \
    SheChangeDirW, <NONE>,  'SheChangeDirW',  \
    SheConvertPathW, <NONE>,  'SheConvertPathW',  \
    SheFullPathA, <NONE>,  'SheFullPathA',  \
    SheFullPathW, <NONE>,  'SheFullPathW',  \
    SheGetCurDrive, <NONE>,  'SheGetCurDrive',  \
    SheGetDirA, <NONE>,  'SheGetDirA',  \
    SheGetDirExW, <NONE>,  'SheGetDirExW',  \
    SheGetDirW, <NONE>,  'SheGetDirW',  \
    SheGetPathOffsetW, <NONE>,  'SheGetPathOffsetW',  \
    SheRemoveQuotesA, <NONE>,  'SheRemoveQuotesA',  \
    SheRemoveQuotesW, <NONE>,  'SheRemoveQuotesW',  \
    SheSetCurDrive, <NONE>,  'SheSetCurDrive',  \
    SheShortenPathA, <NONE>,  'SheShortenPathA',  \
    SheShortenPathW, <NONE>,  'SheShortenPathW',  \
    ShellAboutA, <.hwnd, .szApp, .szOtherStuff, .hIcon>,  'ShellAboutA',  \
    ShellAboutW, <.hwnd, .szApp, .szOtherStuff, .hIcon>,  'ShellAboutW',  \
    ShellExec_RunDLL, <NONE>,  'ShellExec_RunDLL',  \
    ShellExec_RunDLLA, <NONE>,  'ShellExec_RunDLLA',  \
    ShellExec_RunDLLW, <NONE>,  'ShellExec_RunDLLW',  \
    ShellExecuteA, <.hwnd, .lpOperation, .lpFile, .lpParameters, .lpDirectory, .nCmdShow>,  'ShellExecuteA',  \
    ShellExecuteEx, <.lpExecInfo>,  'ShellExecuteEx',  \
    ShellExecuteExA, <.lpExecInfo>,  'ShellExecuteExA',  \
    ShellExecuteExW, <.lpExecInfo>,  'ShellExecuteExW',  \
    ShellExecuteW, <.hwnd, .lpOperation, .lpFile, .lpParameters, .lpDirectory, .nCmdShow>,  'ShellExecuteW',  \
    ShellHookProc, <NONE>,  'ShellHookProc',  \
    ShellMessageBoxA, <NONE>,  'ShellMessageBoxA',  \
    ShellMessageBoxW, <NONE>,  'ShellMessageBoxW',  \
    Shell_GetCachedImageIndex, <NONE>,  'Shell_GetCachedImageIndex',  \
    Shell_GetImageLists, <NONE>,  'Shell_GetImageLists',  \
    Shell_MergeMenus, <NONE>,  'Shell_MergeMenus',  \
    Shell_NotifyIcon, <.dwMessage, .lpData>,  'Shell_NotifyIcon',  \
    Shell_NotifyIconA, <.dwMessage, .lpData>,  'Shell_NotifyIconA',  \
    Shell_NotifyIconW, <.dwMessage, .lpData>,  'Shell_NotifyIconW',  \
    SignalFileOpen, <NONE>,  'SignalFileOpen',  \
    StrChrA, <.lpStart, .wMatch>,  'StrChrA',  \
    StrChrIA, <.lpStart, .wMatch>,  'StrChrIA',  \
    StrChrIW, <.lpStart, .wMatch>,  'StrChrIW',  \
    StrChrW, <.lpStart, .wMatch>,  'StrChrW',  \
    StrCmpNA, <.lpStr1, .lpStr2, .nChar>,  'StrCmpNA',  \
    StrCmpNIA, <.lpStr1, .lpStr2, .nChar>,  'StrCmpNIA',  \
    StrCmpNIW, <.lpStr1, .lpStr2, .nChar>,  'StrCmpNIW',  \
    StrCmpNW, <.lpStr1, .lpStr2, .nChar>,  'StrCmpNW',  \
    StrCpyNA, <NONE>,  'StrCpyNA',  \
    StrCpyNW, <NONE>,  'StrCpyNW',  \
    StrNCmpA, <NONE>,  'StrNCmpA',  \
    StrNCmpIA, <NONE>,  'StrNCmpIA',  \
    StrNCmpIW, <NONE>,  'StrNCmpIW',  \
    StrNCmpW, <NONE>,  'StrNCmpW',  \
    StrNCpyA, <NONE>,  'StrNCpyA',  \
    StrNCpyW, <NONE>,  'StrNCpyW',  \
    StrRChrA, <.lpStart, .lpEnd, .wMatch>,  'StrRChrA',  \
    StrRChrIA, <.lpStart, .lpEnd, .wMatch>,  'StrRChrIA',  \
    StrRChrIW, <.lpStart, .lpEnd, .wMatch>,  'StrRChrIW',  \
    StrRChrW, <.lpStart, .lpEnd, .wMatch>,  'StrRChrW',  \
    StrRStrA, <NONE>,  'StrRStrA',  \
    StrRStrIA, <.lpSource, .lpLast, .lpSrch>,  'StrRStrIA',  \
    StrRStrIW, <.lpSource, .lpLast, .lpSrch>,  'StrRStrIW',  \
    StrRStrW, <NONE>,  'StrRStrW',  \
    StrStrA, <.lpFirst, .lpSrch>,  'StrStrA',  \
    StrStrIA, <.lpFirst, .lpSrch>,  'StrStrIA',  \
    StrStrIW, <.lpFirst, .lpSrch>,  'StrStrIW',  \
    StrStrW, <.lpFirst, .lpSrch>,  'StrStrW',  \
    WOWShellExecute, <NONE>,  'WOWShellExecute',  \
    Win32DeleteFile, <NONE>,  'Win32DeleteFile',  \
    WriteCabinetState, <NONE>,  'WriteCabinetState'

Added freshlib/imports/Win32/sqleet.inc.





































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: sqlite3.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto sqleet,  \
    sqliteAggregateContext, <.context, .nbytes>,  'sqlite3_aggregate_context',  \
    sqliteAggregateCount_OLD, <VOID>,  'sqlite3_aggregate_count',  \
    sqliteAutoExtension, <.ptrCallback>,  'sqlite3_auto_extension',  \
    sqliteBackupFinish, <.ptrBackup>,  'sqlite3_backup_finish',  \
    sqliteBackupInit, <.ptrDestDB, .ptrDestName, .ptrSourceDB, .ptrSourceName>,  'sqlite3_backup_init',  \
    sqliteBackupPageCount, <.ptrBackup>,  'sqlite3_backup_pagecount',  \
    sqliteBackupRemaining, <.ptrBackup>,  'sqlite3_backup_remaining',  \
    sqliteBackupStep, <.ptrBackup, .nPage>,  'sqlite3_backup_step',  \
    sqliteBindBlob, <.stmt, .index, .ptrData, .nbytes, .destructor>,  'sqlite3_bind_blob',  \
    sqliteBindDouble, <.stmt, .index, .value>,  'sqlite3_bind_double',  \
    sqliteBindInt, <.stmt, .index, .value>,  'sqlite3_bind_int',  \
    sqliteBindInt64, <.stmt, .index, .valueLo, .valueHi>,  'sqlite3_bind_int64',  \
    sqliteBindNull, <.stmt, .index>,  'sqlite3_bind_null',  \
    sqliteBindParameterCount, <.stmt>,  'sqlite3_bind_parameter_count',  \
    sqliteBindParameterIndex, <.stmt, .paramName>,  'sqlite3_bind_parameter_index',  \
    sqliteBindParameterName, <.stmt, .paramIndex>,  'sqlite3_bind_parameter_name',  \
    sqliteBindText, <.stmt, .index, .ptrText, .nbytes, .destructor>,  'sqlite3_bind_text',  \
    sqliteBindText16, <.stmt, .index, .ptrText, .nbytes, .destructor>,  'sqlite3_bind_text16',  \
    sqliteBindValue, <.stmt, .index, .ptrValue>,  'sqlite3_bind_value',  \
    sqliteBindZeroblob, <.stmt, .index, .size>,  'sqlite3_bind_zeroblob',  \
    sqliteBlobBytes, <.hBlob>,  'sqlite3_blob_bytes',  \
    sqliteBlobClose, <.hBlob>,  'sqlite3_blob_close',  \
    sqliteBlobOpen, <.ptrDB, .DBname, .Table, .Column, .iRow, .flags, .ptrVarBlob>,  'sqlite3_blob_open',  \
    sqliteBlobRead, <.hBlob, .ptrBuffer, .bytes, .iOffset>,  'sqlite3_blob_read',  \
    sqliteBlobWrite, <.hBlob, .ptrBuffer, .bytes, .iOffset>,  'sqlite3_blob_write',  \
    sqliteBusyHandler, <.ptrDB, .ptrProc, .lParam>,  'sqlite3_busy_handler',  \
    sqliteBusyTimeout, <.ptrDB, .time_ms>,  'sqlite3_busy_timeout',  \
    sqliteChanges, <.ptrDB>,  'sqlite3_changes',  \
    sqliteClearBindings, <.stmt>,  'sqlite3_clear_bindings',  \
    sqliteClose, <.ptrDatabase>,  'sqlite3_close',  \
    sqliteCollationNeeded, <.ptrDB, .lparam, .ptrCallback>,  'sqlite3_collation_needed',  \
    sqliteCollationNeeded16, <.ptrDB, .lparam, .ptrCallback>,  'sqlite3_collation_needed16',  \
    sqliteColumnBlob, <.stmt, .iCol>,  'sqlite3_column_blob',  \
    sqliteColumnBytes, <.stmt, .iCol>,  'sqlite3_column_bytes',  \
    sqliteColumnBytes16, <.stmt, .iCol>,  'sqlite3_column_bytes16',  \
    sqliteColumnCount, <.stmt>,  'sqlite3_column_count',  \
    sqliteColumnDatabaseName, <.stmt, .index>,  'sqlite3_column_database_name',  \
    sqliteColumnDatabaseName16, <.stmt, .index>,  'sqlite3_column_database_name16',  \
    sqliteColumnDeclType, <.stmt, .index>,  'sqlite3_column_decltype',  \
    sqliteColumnDeclType16, <.stmt, .index>,  'sqlite3_column_decltype16',  \
    sqliteColumnDouble, <.stmt, .iCol>,  'sqlite3_column_double',  \
    sqliteColumnInt, <.stmt, .iCol>,  'sqlite3_column_int',  \
    sqliteColumnInt64, <.stmt, .iCol>,  'sqlite3_column_int64',  \
    sqliteColumnName, <.stmt, .index>,  'sqlite3_column_name',  \
    sqliteColumnName16, <.stmt, .index>,  'sqlite3_column_name16',  \
    sqliteColumnOriginName, <.stmt, .index>,  'sqlite3_column_origin_name',  \
    sqliteColumnOriginName16, <.stmt, .index>,  'sqlite3_column_origin_name16',  \
    sqliteColumnTableName, <.stmt, .index>,  'sqlite3_column_table_name',  \
    sqliteColumnTableName16, <.stmt, .index>,  'sqlite3_column_table_name16',  \
    sqliteColumnText, <.stmt, .iCol>,  'sqlite3_column_text',  \
    sqliteColumnText16, <.stmt, .iCol>,  'sqlite3_column_text16',  \
    sqliteColumnType, <.stmt, .iCol>,  'sqlite3_column_type',  \
    sqliteColumnValue, <.stmt, .iCol>,  'sqlite3_column_value',  \
    sqliteCommitHook, <.ptrDB, .ptrHook, .lparam>,  'sqlite3_commit_hook',  \
    sqliteCompileOptionGet, <.N>,  'sqlite3_compileoption_get',  \
    sqliteCompileOptionUsed, <.ptrOptName>,  'sqlite3_compileoption_used',  \
    sqliteComplete, <.ptrSQL>,  'sqlite3_complete',  \
    sqliteComplete16, <.ptrSQL>,  'sqlite3_complete16',  \
    sqliteConfig, <.index, ...>,  'sqlite3_config',  \
    sqliteContextDBHandle, <.context>,  'sqlite3_context_db_handle',  \
    sqliteCreateCollation, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare>,  'sqlite3_create_collation',  \
    sqliteCreateCollation16, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare>,  'sqlite3_create_collation16',  \
    sqliteCreateCollation_v2, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare, .ptrDestroy>,  'sqlite3_create_collation_v2',  \
    sqliteCreateFunction, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal>,  'sqlite3_create_function',  \
    sqliteCreateFunction16, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal>,  'sqlite3_create_function16',  \
    sqliteCreateFunction_v2, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal, .procDestroy>,  'sqlite3_create_function_v2',  \
    sqliteCreateModule, <.ptrDB, .ptrModuleName, .ptrVTableModule, .lparam>,  'sqlite3_create_module',  \
    sqliteCreateModule_v2, <.ptrDB, .ptrModuleName, .ptrVTableModule, .lparam, .procDestroy>,  'sqlite3_create_module_v2',  \
    sqliteDBConfig, <.ptrDB, .index, ...>,  'sqlite3_db_config',  \
    sqliteDBHandle, <.stmt>,  'sqlite3_db_handle',  \
    sqliteDBMutex, <.ptrDB>,  'sqlite3_db_mutex',  \
    sqliteDBStatus, <.ptrDB, .index, .ptrRetCurrent, .ptrRetHighest, .flagReset>,  'sqlite3_db_status',  \
    sqliteDataCount, <.stmt>,  'sqlite3_data_count',  \
    sqliteDeclareVtab, <.ptrDB, .ptrSQL>,  'sqlite3_declare_vtab',  \
    sqliteEnableLoadExtension, <.ptrDB, .flagEnable>,  'sqlite3_enable_load_extension',  \
    sqliteEnableSharedCache, <.flagEnable>,  'sqlite3_enable_shared_cache',  \
    sqliteErrCode, <.ptrDB>,  'sqlite3_errcode',  \
    sqliteErrMsg, <.ptrDB>,  'sqlite3_errmsg',  \
    sqliteErrMsg16, <.ptrDB>,  'sqlite3_errmsg16',  \
    sqliteExec, <.ptrDB, .ptrSQL, .procCallback, .lparam, .ptrVarErrMsg>,  'sqlite3_exec',  \
    sqliteExpired, <VOID>,  'sqlite3_expired',  \
    sqliteExtendedErrCode, <.ptrDB>,  'sqlite3_extended_errcode',  \
    sqliteExtendedResultCodes, <.ptrDB, .flagEnable>,  'sqlite3_extended_result_codes',  \
    sqliteFileControl, <.ptrDB, .ptrDBName, .wparam, .lparam>,  'sqlite3_file_control',  \
    _sqliteFinalize, <.stmt>,  'sqlite3_finalize',  \
    sqliteFree, <.ptrmem>,  'sqlite3_free',  \
    sqliteFreeTable, <.ptrVarResult>,  'sqlite3_free_table',  \
    sqliteGetAutocommit, <.ptrDB>,  'sqlite3_get_autocommit',  \
    sqliteGetAuxdata, <.context, .N>,  'sqlite3_get_auxdata',  \
    sqliteGetTable, <.ptrDB, .ptrSQL, .ptrVarResult, .ptrVarRows, .ptrVarColumns, .ptrVarErrorMsg>,  'sqlite3_get_table',  \
    sqliteGlobalRecover_OLD, <VOID>,  'sqlite3_global_recover',  \
    sqliteInitialize, <VOID>,  'sqlite3_initialize',  \
    sqliteInterrupt, <.ptrDB>,  'sqlite3_interrupt',  \
    sqliteKey, <.ptrDB, .pKey, .pKeyLen>, 'sqlite3_key',                     \
    sqliteKey_v2, <.ptrDB, .pDbName, .pKey, .pKeyLen>, 'sqlite3_key_v2',     \
    sqliteLastInsertRowID, <.ptrDB>,  'sqlite3_last_insert_rowid',  \
    sqliteLibVersion, <VOID>,  'sqlite3_libversion',  \
    sqliteLibversionNumber, <VOID>,  'sqlite3_libversion_number',  \
    sqliteLimit, <.ptrDB, .idLimit, .newVal>,  'sqlite3_limit',  \
    sqliteLoadExtension, <.ptrDB, .nameDLL, .entryProc, .ptrVarErrMsg>,  'sqlite3_load_extension',  \
    sqliteLog, <.iErrCode, .ptrFormat, ...>,  'sqlite3_log',  \
    sqliteMAlloc, <.size>,  'sqlite3_malloc',  \
    sqliteMemoryAlarm_OLD, <VOID>,  'sqlite3_memory_alarm',  \
    sqliteMemoryHighWater, <.flagReset>,  'sqlite3_memory_highwater',  \
    sqliteMemoryUsed, <VOID>,  'sqlite3_memory_used',  \
    sqliteMprintf, <.ptrString, ...>,  'sqlite3_mprintf',  \
    sqliteMutexAlloc, <.type>,  'sqlite3_mutex_alloc',  \
    sqliteMutexEnter, <.hMutex>,  'sqlite3_mutex_enter',  \
    sqliteMutexFree, <.hMutex>,  'sqlite3_mutex_free',  \
    sqliteMutexLeave, <.hMutex>,  'sqlite3_mutex_leave',  \
    sqliteMutexTry, <.hMutex>,  'sqlite3_mutex_try',  \
    sqliteNextStmt, <.ptrDB, .stmt>,  'sqlite3_next_stmt',  \
    sqliteOSEnd, <VOID>,  'sqlite3_os_end',  \
    sqliteOSInit, <VOID>,  'sqlite3_os_init',  \
    sqliteOpen, <.ptrFileName, .ptrVarDB>,  'sqlite3_open',  \
    sqliteOpen16, <.ptrFileName, .ptrVarDB>,  'sqlite3_open16',  \
    sqliteOpen_v2, <.ptrFileName, .ptrVarDB, .flags, .ptrVFSName>,  'sqlite3_open_v2',  \
    sqliteOverloadFunction, <.ptrDB, .ptrFuncName, .lparam>,  'sqlite3_overload_function',  \
    sqlitePrepare, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare',  \
    sqlitePrepare16, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare16',  \
    sqlitePrepare16_v2, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare16_v2',  \
    _sqlitePrepare_v2, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare_v2',  \
    sqliteProfile, <.ptrDB, .procProfiler, .lparam>,  'sqlite3_profile',  \
    sqliteProgressHandler, <.ptrDB, .N, .procProgress, .lparam>,  'sqlite3_progress_handler',  \
    sqliteRandomness, <.bytes, .buffer>,  'sqlite3_randomness',  \
    sqliteReAlloc, <.ptrmem, .newsize>,  'sqlite3_realloc',  \
    sqliteRekey, <.ptrDB, .pNewKey, .nKeyLen>, 'sqlite3_rekey',                            \
    sqliteRekey_v2, <.ptrDB, .pDbName, .pNewKey, .nKeyLen>, 'sqlite3_rekey_v2',         \
    sqliteReleaseMemory, <.bytes>,  'sqlite3_release_memory',  \
    sqliteReset, <.stmt>,  'sqlite3_reset',  \
    sqliteResetAutoExtension, <VOID>,  'sqlite3_reset_auto_extension',  \
    sqliteResultBlob, <.context, .ptrdata, .size, .procDestroy>,  'sqlite3_result_blob',  \
    sqliteResultDouble, <.context, .double>,  'sqlite3_result_double',  \
    sqliteResultError, <.context, .ptrErrMsg, .size>,  'sqlite3_result_error',  \
    sqliteResultError16, <.context, .ptrErrMsg, .size>,  'sqlite3_result_error16',  \
    sqliteResultErrorCode, <.context, .errcode>,  'sqlite3_result_error_code',  \
    sqliteResultErrorNoMem, <.context>,  'sqlite3_result_error_nomem',  \
    sqliteResultErrorTooBig, <.context>,  'sqlite3_result_error_toobig',  \
    sqliteResultInt, <.context, .integer>,  'sqlite3_result_int',  \
    sqliteResultInt64, <.context, .int64Lo, .int64Hi>,  'sqlite3_result_int64',  \
    sqliteResultNULL, <.context>,  'sqlite3_result_null',  \
    sqliteResultText, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text',  \
    sqliteResultText16, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16',  \
    sqliteResultText16be, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16be',  \
    sqliteResultText16le, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16le',  \
    sqliteResultValue, <.context, .ptrValue>,  'sqlite3_result_value',  \
    sqliteResultZeroBlob, <.context, .size>,  'sqlite3_result_zeroblob',  \
    sqliteRollbackHook, <.ptrDB, .ptrHook, .lparam>,  'sqlite3_rollback_hook',  \
    sqliteRtreeGeometryCallback, <NONE>,  'sqlite3_rtree_geometry_callback',  \
    sqliteSQL, <.stmt>,  'sqlite3_sql',  \
    sqliteSetAuthorizer, <.ptrDB, .procAuthorizer, .lparam>,  'sqlite3_set_authorizer',  \
    sqliteSetAuxdata, <.context, .N, .ptrData, .procDestructor>,  'sqlite3_set_auxdata',  \
    sqliteShutdown, <VOID>,  'sqlite3_shutdown',  \
    sqliteSleep, <.sleep_ms>,  'sqlite3_sleep',  \
    sqliteSnprintf, <.size, .ptrBuffer, .ptrString, ...>,  'sqlite3_snprintf',  \
    sqliteSoftHeapLimit, <.N>,  'sqlite3_soft_heap_limit',  \
    sqliteSoftHeapLimit64, <.sizeLo, .sizeHi>,  'sqlite3_soft_heap_limit64',  \
    sqliteSourceID, <VOID>,  'sqlite3_sourceid',  \
    sqliteStatus, <.paramIndex, .ptrVarResult, .ptrVarHighwater, .flagReset>,  'sqlite3_status',  \
    sqliteStep, <.stmt>,  'sqlite3_step',  \
    sqliteStmtStatus, <.stmt, .paramIndex, .flagReset>,  'sqlite3_stmt_status',  \
    sqliteStrnicmp, <.ptrStr1, .ptrStr2, .size>,  'sqlite3_strnicmp',  \
    sqliteTableColumnMetadata, <.ptrDB, .ptrDBName, .ptrTableName, .ptrColumnName, .ptrVarDataType, .ptrVarCollSeq, .ptrVarNotNull,  \
        .ptrVarPrimaryKey, .ptrVarAutoInc>,  'sqlite3_table_column_metadata',  \
    sqliteTestControl, <.opCode, ...>,  'sqlite3_test_control',  \
    sqliteThreadCleanup, <VOID>,  'sqlite3_thread_cleanup',  \
    sqliteThreadsafe, <VOID>,  'sqlite3_threadsafe',  \
    sqliteTotalChanges, <.ptrDB>,  'sqlite3_total_changes',  \
    sqliteTrace, <.ptrDB, .procTrace, .lparam>,  'sqlite3_trace',  \
    sqliteTransferBindings, <VOID>,  'sqlite3_transfer_bindings',  \
    sqliteUpdateHook, <.ptrDB, .procUpdateHook, .lparam>,  'sqlite3_update_hook',  \
    sqliteUserData, <.context>,  'sqlite3_user_data',  \
    sqliteValueBlob, <.ptrValue>,  'sqlite3_value_blob',  \
    sqliteValueBytes, <.ptrValue>,  'sqlite3_value_bytes',  \
    sqliteValueBytes16, <.ptrValue>,  'sqlite3_value_bytes16',  \
    sqliteValueDouble, <.ptrValue>,  'sqlite3_value_double',  \
    sqliteValueInt, <.ptrValue>,  'sqlite3_value_int',  \
    sqliteValueInt64, <.ptrValue>,  'sqlite3_value_int64',  \
    sqliteValueNumericType, <.ptrValue>,  'sqlite3_value_numeric_type',  \
    sqliteValueText, <.ptrValue>,  'sqlite3_value_text',  \
    sqliteValueText16, <.ptrValue>,  'sqlite3_value_text16',  \
    sqliteValueText16be, <.ptrValue>,  'sqlite3_value_text16be',  \
    sqliteValueText16le, <.ptrValue>,  'sqlite3_value_text16le',  \
    sqliteValueType, <.ptrValue>,  'sqlite3_value_type',  \
    sqliteVersion, <VOID>,  'sqlite3_version',  \
    sqliteVfsFind, <.ptrVFSName>,  'sqlite3_vfs_find',  \
    sqliteVfsRegister, <.hVFS, .flagDefault>,  'sqlite3_vfs_register',  \
    sqliteVfsUnregister, <.hVFS>,  'sqlite3_vfs_unregister',  \
    sqliteVmprintf, <.ptrString, .va_list>,  'sqlite3_vmprintf',  \
    sqliteWalAutocheckpoint, <.ptrDB, .N>,  'sqlite3_wal_autocheckpoint',  \
    sqliteWalCheckpoint, <.ptrDB, .ptrDBName>,  'sqlite3_wal_checkpoint',  \
    sqliteWalCheckpoint_v2, <.ptrDB, .ptrDBName, .eMode, .pvarLog, .pvarCkpt>,  'sqlite3_wal_checkpoint_v2',  \
    sqliteWalHook, <.ptrDB, .procCommitHook, .lparam>,  'sqlite3_wal_hook',  \
    sqliteWin32_MbcsToUtf8, <NONE>,  'sqlite3_win32_mbcs_to_utf8'

Added freshlib/imports/Win32/sqlite3.inc.































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: sqlite3.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto sqlite3,  \
    sqliteAggregateContext, <.context, .nbytes>,  'sqlite3_aggregate_context',  \
    sqliteAggregateCount_OLD, <VOID>,  'sqlite3_aggregate_count',  \
    sqliteAutoExtension, <.ptrCallback>,  'sqlite3_auto_extension',  \
    sqliteBackupFinish, <.ptrBackup>,  'sqlite3_backup_finish',  \
    sqliteBackupInit, <.ptrDestDB, .ptrDestName, .ptrSourceDB, .ptrSourceName>,  'sqlite3_backup_init',  \
    sqliteBackupPageCount, <.ptrBackup>,  'sqlite3_backup_pagecount',  \
    sqliteBackupRemaining, <.ptrBackup>,  'sqlite3_backup_remaining',  \
    sqliteBackupStep, <.ptrBackup, .nPage>,  'sqlite3_backup_step',  \
    sqliteBindBlob, <.stmt, .index, .ptrData, .nbytes, .destructor>,  'sqlite3_bind_blob',  \
    sqliteBindDouble, <.stmt, .index, .value>,  'sqlite3_bind_double',  \
    sqliteBindInt, <.stmt, .index, .value>,  'sqlite3_bind_int',  \
    sqliteBindInt64, <.stmt, .index, .valueLo, .valueHi>,  'sqlite3_bind_int64',  \
    sqliteBindNull, <.stmt, .index>,  'sqlite3_bind_null',  \
    sqliteBindParameterCount, <.stmt>,  'sqlite3_bind_parameter_count',  \
    sqliteBindParameterIndex, <.stmt, .paramName>,  'sqlite3_bind_parameter_index',  \
    sqliteBindParameterName, <.stmt, .paramIndex>,  'sqlite3_bind_parameter_name',  \
    sqliteBindText, <.stmt, .index, .ptrText, .nbytes, .destructor>,  'sqlite3_bind_text',  \
    sqliteBindText16, <.stmt, .index, .ptrText, .nbytes, .destructor>,  'sqlite3_bind_text16',  \
    sqliteBindValue, <.stmt, .index, .ptrValue>,  'sqlite3_bind_value',  \
    sqliteBindZeroblob, <.stmt, .index, .size>,  'sqlite3_bind_zeroblob',  \
    sqliteBlobBytes, <.hBlob>,  'sqlite3_blob_bytes',  \
    sqliteBlobClose, <.hBlob>,  'sqlite3_blob_close',  \
    sqliteBlobOpen, <.ptrDB, .DBname, .Table, .Column, .iRow, .flags, .ptrVarBlob>,  'sqlite3_blob_open',  \
    sqliteBlobRead, <.hBlob, .ptrBuffer, .bytes, .iOffset>,  'sqlite3_blob_read',  \
    sqliteBlobWrite, <.hBlob, .ptrBuffer, .bytes, .iOffset>,  'sqlite3_blob_write',  \
    sqliteBusyHandler, <.ptrDB, .ptrProc, .lParam>,  'sqlite3_busy_handler',  \
    sqliteBusyTimeout, <.ptrDB, .time_ms>,  'sqlite3_busy_timeout',  \
    sqliteChanges, <.ptrDB>,  'sqlite3_changes',  \
    sqliteClearBindings, <.stmt>,  'sqlite3_clear_bindings',  \
    sqliteClose, <.ptrDatabase>,  'sqlite3_close',  \
    sqliteCollationNeeded, <.ptrDB, .lparam, .ptrCallback>,  'sqlite3_collation_needed',  \
    sqliteCollationNeeded16, <.ptrDB, .lparam, .ptrCallback>,  'sqlite3_collation_needed16',  \
    sqliteColumnBlob, <.stmt, .iCol>,  'sqlite3_column_blob',  \
    sqliteColumnBytes, <.stmt, .iCol>,  'sqlite3_column_bytes',  \
    sqliteColumnBytes16, <.stmt, .iCol>,  'sqlite3_column_bytes16',  \
    sqliteColumnCount, <.stmt>,  'sqlite3_column_count',  \
    sqliteColumnDatabaseName, <.stmt, .index>,  'sqlite3_column_database_name',  \
    sqliteColumnDatabaseName16, <.stmt, .index>,  'sqlite3_column_database_name16',  \
    sqliteColumnDeclType, <.stmt, .index>,  'sqlite3_column_decltype',  \
    sqliteColumnDeclType16, <.stmt, .index>,  'sqlite3_column_decltype16',  \
    sqliteColumnDouble, <.stmt, .iCol>,  'sqlite3_column_double',  \
    sqliteColumnInt, <.stmt, .iCol>,  'sqlite3_column_int',  \
    sqliteColumnInt64, <.stmt, .iCol>,  'sqlite3_column_int64',  \
    sqliteColumnName, <.stmt, .index>,  'sqlite3_column_name',  \
    sqliteColumnName16, <.stmt, .index>,  'sqlite3_column_name16',  \
    sqliteColumnOriginName, <.stmt, .index>,  'sqlite3_column_origin_name',  \
    sqliteColumnOriginName16, <.stmt, .index>,  'sqlite3_column_origin_name16',  \
    sqliteColumnTableName, <.stmt, .index>,  'sqlite3_column_table_name',  \
    sqliteColumnTableName16, <.stmt, .index>,  'sqlite3_column_table_name16',  \
    sqliteColumnText, <.stmt, .iCol>,  'sqlite3_column_text',  \
    sqliteColumnText16, <.stmt, .iCol>,  'sqlite3_column_text16',  \
    sqliteColumnType, <.stmt, .iCol>,  'sqlite3_column_type',  \
    sqliteColumnValue, <.stmt, .iCol>,  'sqlite3_column_value',  \
    sqliteCommitHook, <.ptrDB, .ptrHook, .lparam>,  'sqlite3_commit_hook',  \
    sqliteCompileOptionGet, <.N>,  'sqlite3_compileoption_get',  \
    sqliteCompileOptionUsed, <.ptrOptName>,  'sqlite3_compileoption_used',  \
    sqliteComplete, <.ptrSQL>,  'sqlite3_complete',  \
    sqliteComplete16, <.ptrSQL>,  'sqlite3_complete16',  \
    sqliteConfig, <.index, ...>,  'sqlite3_config',  \
    sqliteContextDBHandle, <.context>,  'sqlite3_context_db_handle',  \
    sqliteCreateCollation, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare>,  'sqlite3_create_collation',  \
    sqliteCreateCollation16, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare>,  'sqlite3_create_collation16',  \
    sqliteCreateCollation_v2, <.ptrDB, .ptrName, .eTextRep, .lparam, .procCompare, .ptrDestroy>,  'sqlite3_create_collation_v2',  \
    sqliteCreateFunction, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal>,  'sqlite3_create_function',  \
    sqliteCreateFunction16, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal>,  'sqlite3_create_function16',  \
    sqliteCreateFunction_v2, <.ptrDB, .ptrFunctionName, .nArg, .eTextRep, .lparam, .procFunc, .procStep, .procFinal, .procDestroy>,  'sqlite3_create_function_v2',  \
    sqliteCreateModule, <.ptrDB, .ptrModuleName, .ptrVTableModule, .lparam>,  'sqlite3_create_module',  \
    sqliteCreateModule_v2, <.ptrDB, .ptrModuleName, .ptrVTableModule, .lparam, .procDestroy>,  'sqlite3_create_module_v2',  \
    sqliteDBConfig, <.ptrDB, .index, ...>,  'sqlite3_db_config',  \
    sqliteDBHandle, <.stmt>,  'sqlite3_db_handle',  \
    sqliteDBMutex, <.ptrDB>,  'sqlite3_db_mutex',  \
    sqliteDBStatus, <.ptrDB, .index, .ptrRetCurrent, .ptrRetHighest, .flagReset>,  'sqlite3_db_status',  \
    sqliteDataCount, <.stmt>,  'sqlite3_data_count',  \
    sqliteDeclareVtab, <.ptrDB, .ptrSQL>,  'sqlite3_declare_vtab',  \
    sqliteEnableLoadExtension, <.ptrDB, .flagEnable>,  'sqlite3_enable_load_extension',  \
    sqliteEnableSharedCache, <.flagEnable>,  'sqlite3_enable_shared_cache',  \
    sqliteErrCode, <.ptrDB>,  'sqlite3_errcode',  \
    sqliteErrMsg, <.ptrDB>,  'sqlite3_errmsg',  \
    sqliteErrMsg16, <.ptrDB>,  'sqlite3_errmsg16',  \
    sqliteErrStr, <.err_code>, 'sqlite3_errstr',    \
    sqliteExec, <.ptrDB, .ptrSQL, .procCallback, .lparam, .ptrVarErrMsg>,  'sqlite3_exec',  \
    sqliteExpired, <VOID>,  'sqlite3_expired',  \
    sqliteExtendedErrCode, <.ptrDB>,  'sqlite3_extended_errcode',  \
    sqliteExtendedResultCodes, <.ptrDB, .flagEnable>,  'sqlite3_extended_result_codes',  \
    sqliteFileControl, <.ptrDB, .ptrDBName, .wparam, .lparam>,  'sqlite3_file_control',  \
    sqliteFinalize, <.stmt>,  'sqlite3_finalize',  \
    sqliteFree, <.ptrmem>,  'sqlite3_free',  \
    sqliteFreeTable, <.ptrVarResult>,  'sqlite3_free_table',  \
    sqliteGetAutocommit, <.ptrDB>,  'sqlite3_get_autocommit',  \
    sqliteGetAuxdata, <.context, .N>,  'sqlite3_get_auxdata',  \
    sqliteGetTable, <.ptrDB, .ptrSQL, .ptrVarResult, .ptrVarRows, .ptrVarColumns, .ptrVarErrorMsg>,  'sqlite3_get_table',  \
    sqliteGlobalRecover_OLD, <VOID>,  'sqlite3_global_recover',  \
    sqliteInitialize, <VOID>,  'sqlite3_initialize',  \
    sqliteInterrupt, <.ptrDB>,  'sqlite3_interrupt',  \
    sqliteLastInsertRowID, <.ptrDB>,  'sqlite3_last_insert_rowid',  \
    sqliteLibVersion, <VOID>,  'sqlite3_libversion',  \
    sqliteLibversionNumber, <VOID>,  'sqlite3_libversion_number',  \
    sqliteLimit, <.ptrDB, .idLimit, .newVal>,  'sqlite3_limit',  \
    sqliteLoadExtension, <.ptrDB, .nameDLL, .entryProc, .ptrVarErrMsg>,  'sqlite3_load_extension',  \
    sqliteLog, <.iErrCode, .ptrFormat, ...>,  'sqlite3_log',  \
    sqliteMAlloc, <.size>,  'sqlite3_malloc',  \
    sqliteMemoryAlarm_OLD, <VOID>,  'sqlite3_memory_alarm',  \
    sqliteMemoryHighWater, <.flagReset>,  'sqlite3_memory_highwater',  \
    sqliteMemoryUsed, <VOID>,  'sqlite3_memory_used',  \
    sqliteMprintf, <.ptrString, ...>,  'sqlite3_mprintf',  \
    sqliteMutexAlloc, <.type>,  'sqlite3_mutex_alloc',  \
    sqliteMutexEnter, <.hMutex>,  'sqlite3_mutex_enter',  \
    sqliteMutexFree, <.hMutex>,  'sqlite3_mutex_free',  \
    sqliteMutexLeave, <.hMutex>,  'sqlite3_mutex_leave',  \
    sqliteMutexTry, <.hMutex>,  'sqlite3_mutex_try',  \
    sqliteNextStmt, <.ptrDB, .stmt>,  'sqlite3_next_stmt',  \
    sqliteOSEnd, <VOID>,  'sqlite3_os_end',  \
    sqliteOSInit, <VOID>,  'sqlite3_os_init',  \
    sqliteOpen, <.ptrFileName, .ptrVarDB>,  'sqlite3_open',  \
    sqliteOpen16, <.ptrFileName, .ptrVarDB>,  'sqlite3_open16',  \
    sqliteOpen_v2, <.ptrFileName, .ptrVarDB, .flags, .ptrVFSName>,  'sqlite3_open_v2',  \
    sqliteOverloadFunction, <.ptrDB, .ptrFuncName, .lparam>,  'sqlite3_overload_function',  \
    sqlitePrepare, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare',  \
    sqlitePrepare16, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare16',  \
    sqlitePrepare16_v2, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare16_v2',  \
    sqlitePrepare_v2, <.ptrDB, .ptrSQL, .lenSQL, .ptrVarStmt, .ptrVarNext>,  'sqlite3_prepare_v2',  \
    sqliteProfile, <.ptrDB, .procProfiler, .lparam>,  'sqlite3_profile',  \
    sqliteProgressHandler, <.ptrDB, .N, .procProgress, .lparam>,  'sqlite3_progress_handler',  \
    sqliteRandomness, <.bytes, .buffer>,  'sqlite3_randomness',  \
    sqliteReAlloc, <.ptrmem, .newsize>,  'sqlite3_realloc',  \
    sqliteReleaseMemory, <.bytes>,  'sqlite3_release_memory',  \
    sqliteReset, <.stmt>,  'sqlite3_reset',  \
    sqliteResetAutoExtension, <VOID>,  'sqlite3_reset_auto_extension',  \
    sqliteResultBlob, <.context, .ptrdata, .size, .procDestroy>,  'sqlite3_result_blob',  \
    sqliteResultDouble, <.context, .double>,  'sqlite3_result_double',  \
    sqliteResultError, <.context, .ptrErrMsg, .size>,  'sqlite3_result_error',  \
    sqliteResultError16, <.context, .ptrErrMsg, .size>,  'sqlite3_result_error16',  \
    sqliteResultErrorCode, <.context, .errcode>,  'sqlite3_result_error_code',  \
    sqliteResultErrorNoMem, <.context>,  'sqlite3_result_error_nomem',  \
    sqliteResultErrorTooBig, <.context>,  'sqlite3_result_error_toobig',  \
    sqliteResultInt, <.context, .integer>,  'sqlite3_result_int',  \
    sqliteResultInt64, <.context, .int64Lo, .int64Hi>,  'sqlite3_result_int64',  \
    sqliteResultNULL, <.context>,  'sqlite3_result_null',  \
    sqliteResultText, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text',  \
    sqliteResultText16, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16',  \
    sqliteResultText16be, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16be',  \
    sqliteResultText16le, <.context, .ptrText, .size, .procDestroy>,  'sqlite3_result_text16le',  \
    sqliteResultValue, <.context, .ptrValue>,  'sqlite3_result_value',  \
    sqliteResultZeroBlob, <.context, .size>,  'sqlite3_result_zeroblob',  \
    sqliteRollbackHook, <.ptrDB, .ptrHook, .lparam>,  'sqlite3_rollback_hook',  \
    sqliteRtreeGeometryCallback, <NONE>,  'sqlite3_rtree_geometry_callback',  \
    sqliteSQL, <.stmt>,  'sqlite3_sql',  \
    sqliteSetAuthorizer, <.ptrDB, .procAuthorizer, .lparam>,  'sqlite3_set_authorizer',  \
    sqliteSetAuxdata, <.context, .N, .ptrData, .procDestructor>,  'sqlite3_set_auxdata',  \
    sqliteShutdown, <VOID>,  'sqlite3_shutdown',  \
    sqliteSleep, <.sleep_ms>,  'sqlite3_sleep',  \
    sqliteSnprintf, <.size, .ptrBuffer, .ptrString, ...>,  'sqlite3_snprintf',  \
    sqliteSoftHeapLimit, <.N>,  'sqlite3_soft_heap_limit',  \
    sqliteSoftHeapLimit64, <.sizeLo, .sizeHi>,  'sqlite3_soft_heap_limit64',  \
    sqliteSourceID, <VOID>,  'sqlite3_sourceid',  \
    sqliteStatus, <.paramIndex, .ptrVarResult, .ptrVarHighwater, .flagReset>,  'sqlite3_status',  \
    sqliteStep, <.stmt>,  'sqlite3_step',  \
    sqliteStmtStatus, <.stmt, .paramIndex, .flagReset>,  'sqlite3_stmt_status',  \
    sqliteStrnicmp, <.ptrStr1, .ptrStr2, .size>,  'sqlite3_strnicmp',  \
    sqliteTableColumnMetadata, <.ptrDB, .ptrDBName, .ptrTableName, .ptrColumnName, .ptrVarDataType, .ptrVarCollSeq, .ptrVarNotNull,  \
        .ptrVarPrimaryKey, .ptrVarAutoInc>,  'sqlite3_table_column_metadata',  \
    sqliteTestControl, <.opCode, ...>,  'sqlite3_test_control',  \
    sqliteThreadCleanup, <VOID>,  'sqlite3_thread_cleanup',  \
    sqliteThreadsafe, <VOID>,  'sqlite3_threadsafe',  \
    sqliteTotalChanges, <.ptrDB>,  'sqlite3_total_changes',  \
    sqliteTrace, <.ptrDB, .procTrace, .lparam>,  'sqlite3_trace',  \
    sqliteTransferBindings, <VOID>,  'sqlite3_transfer_bindings',  \
    sqliteUpdateHook, <.ptrDB, .procUpdateHook, .lparam>,  'sqlite3_update_hook',  \
    sqliteUserData, <.context>,  'sqlite3_user_data',  \
    sqliteValueBlob, <.ptrValue>,  'sqlite3_value_blob',  \
    sqliteValueBytes, <.ptrValue>,  'sqlite3_value_bytes',  \
    sqliteValueBytes16, <.ptrValue>,  'sqlite3_value_bytes16',  \
    sqliteValueDouble, <.ptrValue>,  'sqlite3_value_double',  \
    sqliteValueInt, <.ptrValue>,  'sqlite3_value_int',  \
    sqliteValueInt64, <.ptrValue>,  'sqlite3_value_int64',  \
    sqliteValueNumericType, <.ptrValue>,  'sqlite3_value_numeric_type',  \
    sqliteValueText, <.ptrValue>,  'sqlite3_value_text',  \
    sqliteValueText16, <.ptrValue>,  'sqlite3_value_text16',  \
    sqliteValueText16be, <.ptrValue>,  'sqlite3_value_text16be',  \
    sqliteValueText16le, <.ptrValue>,  'sqlite3_value_text16le',  \
    sqliteValueType, <.ptrValue>,  'sqlite3_value_type',  \
    sqliteVersion, <VOID>,  'sqlite3_version',  \
    sqliteVfsFind, <.ptrVFSName>,  'sqlite3_vfs_find',  \
    sqliteVfsRegister, <.hVFS, .flagDefault>,  'sqlite3_vfs_register',  \
    sqliteVfsUnregister, <.hVFS>,  'sqlite3_vfs_unregister',  \
    sqliteVmprintf, <.ptrString, .va_list>,  'sqlite3_vmprintf',  \
    sqliteWalAutocheckpoint, <.ptrDB, .N>,  'sqlite3_wal_autocheckpoint',  \
    sqliteWalCheckpoint, <.ptrDB, .ptrDBName>,  'sqlite3_wal_checkpoint',  \
    sqliteWalCheckpoint_v2, <.ptrDB, .ptrDBName, .eMode, .pvarLog, .pvarCkpt>,  'sqlite3_wal_checkpoint_v2',  \
    sqliteWalHook, <.ptrDB, .procCommitHook, .lparam>,  'sqlite3_wal_hook',  \
    sqliteWin32_MbcsToUtf8, <NONE>,  'sqlite3_win32_mbcs_to_utf8'

Added freshlib/imports/Win32/ucrtbase.inc.













>
>
>
>
>
>
1
2
3
4
5
6
;   msvcrt.dll API calls (ASCII)
import_proto ucrtbase,  \
    _aligned_free, <.p_mem>,  '_aligned_free',                          \
    _aligned_malloc, <.size, .alignment>,  '_aligned_malloc',           \
    _aligned_realloc, <.p_mem, .size, .alignment>,  '_aligned_realloc', \
    _aligned_msize, <.p_mem, .alignment, .offset>, '_aligned_msize'

Added freshlib/imports/Win32/user32.inc.





























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: user32.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

;   user32.dll API calls
import_proto user32,  \
    ActivateKeyboardLayout, <.HKL, .flags>,  'ActivateKeyboardLayout',  \
    AdjustWindowRect, <.lpRect, .dwStyle, .bMenu>,  'AdjustWindowRect',  \
    AdjustWindowRectEx, <.lpRect, .dwStyle, .bMenu, .dwExStyle>,  'AdjustWindowRectEx',  \
    AlignRects, <NONE>,  'AlignRects',  \
    AllowForegroundActivation, <NONE>,  'AllowForegroundActivation',  \
    AllowSetForegroundWindow, <.dwProcessId>,  'AllowSetForegroundWindow',  \
    AnimateWindow, <.hwnd, .dwTime, .dwFlags>,  'AnimateWindow',  \
    AnyPopup, <VOID>,  'AnyPopup',  \
    AppendMenuA, <.hMenu, .wFlags, .wIDNewItem, .lpNewItem>,  'AppendMenuA',  \
    AppendMenuW, <.hMenu, .wFlags, .wIDNewItem, .lpNewItem>,  'AppendMenuW',  \
    ArrangeIconicWindows, <.hwnd>,  'ArrangeIconicWindows',  \
    AttachThreadInput, <.idAttach, .idAttachTo, .fAttach>,  'AttachThreadInput',  \
    BeginDeferWindowPos, <.nNumWindows>,  'BeginDeferWindowPos',  \
    BeginPaint, <.hwnd, .lpPaint>,  'BeginPaint',  \
    BlockInput, <.fBlockIt>,  'BlockInput',  \
    BringWindowToTop, <.hwnd>,  'BringWindowToTop',  \
    BroadcastSystemMessage, <.dw, .pdw, .un, .wParam, .lParam>,  'BroadcastSystemMessage',  \
    BroadcastSystemMessageA, <.dw, .pdw, .un, .wParam, .lParam>,  'BroadcastSystemMessageA',  \
    BroadcastSystemMessageExA, <NONE>,  'BroadcastSystemMessageExA',  \
    BroadcastSystemMessageExW, <NONE>,  'BroadcastSystemMessageExW',  \
    BroadcastSystemMessageW, <.dw, .pdw, .un, .wParam, .lParam>,  'BroadcastSystemMessageW',  \
    BuildReasonArray, <NONE>,  'BuildReasonArray',  \
    CalcMenuBar, <NONE>,  'CalcMenuBar',  \
    CallMsgFilter, <.lpMsg, .ncode>,  'CallMsgFilter',  \
    CallMsgFilterA, <.lpMsg, .ncode>,  'CallMsgFilterA',  \
    CallMsgFilterW, <.lpMsg, .ncode>,  'CallMsgFilterW',  \
    CallNextHookEx, <.hHook, .ncode, .wParam, .lParam>,  'CallNextHookEx',  \
    CallWindowProcA, <.lpPrevWndFunc, .hWnd, .Msg, .wParam, .lParam>,  'CallWindowProcA',  \
    CallWindowProcW, <.lpPrevWndFunc, .hWnd, .Msg, .wParam, .lParam>,  'CallWindowProcW',  \
    CascadeChildWindows, <NONE>,  'CascadeChildWindows',  \
    CascadeWindows, <.hwndParent, .wHow, .lpRect, .cKids, .lpkids>,  'CascadeWindows',  \
    ChangeClipboardChain, <.hwnd, .hWndNext>,  'ChangeClipboardChain',  \
    ChangeDisplaySettingsA, <.lpDevMode, .dwFlags>,  'ChangeDisplaySettingsA',  \
    ChangeDisplaySettingsExA, <.lpszDeviceName, .lpDevMode, .hwnd, .dwflags, .lParam>,  'ChangeDisplaySettingsExA',  \
    ChangeDisplaySettingsExW, <.lpszDeviceName, .lpDevMode, .hwnd, .dwflags, .lParam>,  'ChangeDisplaySettingsExW',  \
    ChangeDisplaySettingsW, <.lpDevMode, .dwFlags>,  'ChangeDisplaySettingsW',  \
    ChangeMenuA, <.hMenu, .cmd, .lpszNewItem, .cmdInsert, .flags>,  'ChangeMenuA',  \
    ChangeMenuW, <.hMenu, .cmd, .lpszNewItem, .cmdInsert, .flags>,  'ChangeMenuW',  \
    CharLowerA, <.lpsz>,  'CharLowerA',  \
    CharLowerBuffA, <.lpsz, .cchLength>,  'CharLowerBuffA',  \
    CharLowerBuffW, <.lpsz, .cchLength>,  'CharLowerBuffW',  \
    CharLowerW, <.lpsz>,  'CharLowerW',  \
    CharNextA, <.lpsz>,  'CharNextA',  \
    CharNextExA, <.CodePage, .lpCurrentChar, .dwFlags>,  'CharNextExA',  \
    CharNextW, <.lpsz>,  'CharNextW',  \
    CharPrevA, <.lpszStart, .lpszCurrent>,  'CharPrevA',  \
    CharPrevExA, <.CodePage, .lpStart, .lpCurrentChar, .dwFlags>,  'CharPrevExA',  \
    CharPrevW, <.lpszStart, .lpszCurrent>,  'CharPrevW',  \
    CharToOemA, <.lpszSrc, .lpszDst>,  'CharToOemA',  \
    CharToOemBuffA, <.lpszSrc, .lpszDst, .cchDstLength>,  'CharToOemBuffA',  \
    CharToOemBuffW, <.lpszSrc, .lpszDst, .cchDstLength>,  'CharToOemBuffW',  \
    CharToOemW, <.lpszSrc, .lpszDst>,  'CharToOemW',  \
    CharUpperA, <.lpsz>,  'CharUpperA',  \
    CharUpperBuffA, <.lpsz, .cchLength>,  'CharUpperBuffA',  \
    CharUpperBuffW, <.lpsz, .cchLength>,  'CharUpperBuffW',  \
    CharUpperW, <.lpsz>,  'CharUpperW',  \
    CheckDlgButton, <.hDlg, .nIDButton, .uCheck>,  'CheckDlgButton',  \
    CheckMenuItem, <.hMenu, .wIDCheckItem, .wCheck>,  'CheckMenuItem',  \
    CheckMenuRadioItem, <.hMenu, .un1, .un2, .un3, .un4>,  'CheckMenuRadioItem',  \
    CheckRadioButton, <.hDlg, .nIDFirstButton, .nIDLastButton, .nIDCheckButton>,  'CheckRadioButton',  \
    ChildWindowFromPoint, <.hWnd, .xPoint, .yPoint>,  'ChildWindowFromPoint',  \
    ChildWindowFromPointEx, <.hWnd, .pt, .un>,  'ChildWindowFromPointEx',  \
    CliImmSetHotKey, <NONE>,  'CliImmSetHotKey',  \
    ClientThreadSetup, <NONE>,  'ClientThreadSetup',  \
    ClientToScreen, <.hwnd, .lpPoint>,  'ClientToScreen',  \
    ClipCursor, <.lpRect>,  'ClipCursor',  \
    CloseClipboard, <VOID>,  'CloseClipboard',  \
    CloseDesktop, <.hDesktop>,  'CloseDesktop',  \
    CloseWindow, <.hwnd>,  'CloseWindow',  \
    CloseWindowStation, <.hWinSta>,  'CloseWindowStation',  \
    CopyAcceleratorTableA, <.hAccelSrc, .lpAccelDst, .cAccelEntries>,  'CopyAcceleratorTableA',  \
    CopyAcceleratorTableW, <.hAccelSrc, .lpAccelDst, .cAccelEntries>,  'CopyAcceleratorTableW',  \
    CopyIcon, <.hIcon>,  'CopyIcon',  \
    CopyImage, <.handle, .un1, .n1, .n2, .un2>,  'CopyImage',  \
    CopyRect, <.lpDestRect, .lpSourceRect>,  'CopyRect',  \
    CountClipboardFormats, <VOID>,  'CountClipboardFormats',  \
    CreateAcceleratorTableA, <.lpaccl, .cEntries>,  'CreateAcceleratorTableA',  \
    CreateAcceleratorTableW, <.lpaccl, .cEntries>,  'CreateAcceleratorTableW',  \
    CreateCaret, <.hwnd, .hBitmap, .nWidth, .nHeight>,  'CreateCaret',  \
    CreateCursor, <.hInstance, .nXhotspot, .nYhotspot, .nWidth, .nHeight, .lpANDbitPlane, .lpXORbitPlane>,  'CreateCursor',  \
    CreateDesktopA, <.lpszDesktop, .lpszDevice, .pDevmode, .dwFlags, .dwDesiredAccess, .lpsa>,  'CreateDesktopA',  \
    CreateDesktopW, <.lpszDesktop, .lpszDevice, .pDevmode, .dwFlags, .dwDesiredAccess, .lpsa>,  'CreateDesktopW',  \
    CreateDialogIndirectParamA, <.hInstance, .lpTemplate, .hWndParent, .lpDialogFunc, .dwInitParam>,  'CreateDialogIndirectParamA',  \
    CreateDialogIndirectParamAorW, <NONE>,  'CreateDialogIndirectParamAorW',  \
    CreateDialogIndirectParamW, <.hInstance, .lpTemplate, .hWndParent, .lpDialogFunc, .dwInitParam>,  'CreateDialogIndirectParamW',  \
    CreateDialogParamA, <.hInstance, .lpName, .hWndParent, .lpDialogFunc, .lParamInit>,  'CreateDialogParamA',  \
    CreateDialogParamW, <.hInstance, .lpName, .hWndParent, .lpDialogFunc, .lParamInit>,  'CreateDialogParamW',  \
    CreateIcon, <.hInstance, .nWidth, .nHeight, .nPlanes, .nBitsPixel, .lpANDbits, .lpXORbits>,  'CreateIcon',  \
    CreateIconFromResource, <.presbits, .dwResSize, .fIcon, .dwVer>,  'CreateIconFromResource',  \
    CreateIconFromResourceEx, <.presbits, .dwResSize, .fIcon, .dwVer, .cxDesired, .cyDesired, .Flags>,  'CreateIconFromResourceEx',  \
    CreateIconIndirect, <.piconinfo>,  'CreateIconIndirect',  \
    CreateMDIWindowA, <.lpClassName, .lpWindowName, .dwStyle, .x, .y, .nWidth, .nHeight, .hWndParent, .hInstance, .lParam>,  'CreateMDIWindowA',  \
    CreateMDIWindowW, <.lpClassName, .lpWindowName, .dwStyle, .x, .y, .nWidth, .nHeight, .hWndParent, .hInstance, .lParam>,  'CreateMDIWindowW',  \
    CreateMenu, <VOID>,  'CreateMenu',  \
    CreatePopupMenu, <VOID>,  'CreatePopupMenu',  \
    CreateSystemThreads, <NONE>,  'CreateSystemThreads',  \
    CreateWindowExA, <.dwExStyle, .lpClassName, .lpWindowName, .dwStyle, .x, .y, .nWidth, .nHeight, .hWndParent, .hMenu, .hInstance,  \
        .lpParam>,  'CreateWindowExA',  \
    CreateWindowExW, <.dwExStyle, .lpClassName, .lpWindowName, .dwStyle, .x, .y, .nWidth, .nHeight, .hWndParent, .hMenu, .hInstance,  \
        .lpParam>,  'CreateWindowExW',  \
    CreateWindowStationA, <.lpwinsta, .dwReserved, .dwDesiredAccess, .lpsa>,  'CreateWindowStationA',  \
    CreateWindowStationW, <.lpwinsta, .dwReserved, .dwDesiredAccess, .lpsa>,  'CreateWindowStationW',  \
    CsrBroadcastSystemMessageExW, <NONE>,  'CsrBroadcastSystemMessageExW',  \
    CtxInitUser32, <NONE>,  'CtxInitUser32',  \
    DdeAbandonTransaction, <.idInst, .hConv, .idTransaction>,  'DdeAbandonTransaction',  \
    DdeAccessData, <.hData, .pcbDataSize>,  'DdeAccessData',  \
    DdeAddData, <.hData, .pSrc, .cb, .cbOff>,  'DdeAddData',  \
    DdeClientTransaction, <.pData, .cbData, .hConv, .hszItem, .wFmt, .wType, .dwTimeout, .pdwResult>,  'DdeClientTransaction',  \
    DdeCmpStringHandles, <.hsz1, .hsz2>,  'DdeCmpStringHandles',  \
    DdeConnect, <.idInst, .hszService, .hszTopic, .pCC>,  'DdeConnect',  \
    DdeConnectList, <.idInst, .hszService, .hszTopic, .hConvList, .pCC>,  'DdeConnectList',  \
    DdeCreateDataHandle, <.idInst, .pSrc, .cb, .cbOff, .hszItem, .wFmt, .afCmd>,  'DdeCreateDataHandle',  \
    DdeCreateStringHandleA, <.idInst, .psz, .iCodePage>,  'DdeCreateStringHandleA',  \
    DdeCreateStringHandleW, <.idInst, .psz, .iCodePage>,  'DdeCreateStringHandleW',  \
    DdeDisconnect, <.hConv>,  'DdeDisconnect',  \
    DdeDisconnectList, <.hConvList>,  'DdeDisconnectList',  \
    DdeEnableCallback, <.idInst, .hConv, .wCmd>,  'DdeEnableCallback',  \
    DdeFreeDataHandle, <.hData>,  'DdeFreeDataHandle',  \
    DdeFreeStringHandle, <.idInst, .hsz>,  'DdeFreeStringHandle',  \
    DdeGetData, <.hData, .pDst, .cbMax, .cbOff>,  'DdeGetData',  \
    DdeGetLastError, <.idInst>,  'DdeGetLastError',  \
    DdeGetQualityOfService, <NONE>,  'DdeGetQualityOfService',  \
    DdeImpersonateClient, <.hConv>,  'DdeImpersonateClient',  \
    DdeInitializeA, <.pidInst, .pfnCallback, .afCmd, .ulRes>,  'DdeInitializeA',  \
    DdeInitializeW, <.pidInst, .pfnCallback, .afCmd, .ulRes>,  'DdeInitializeW',  \
    DdeKeepStringHandle, <.idInst, .hsz>,  'DdeKeepStringHandle',  \
    DdeNameService, <.idInst, .hsz1, .hsz2, .afCmd>,  'DdeNameService',  \
    DdePostAdvise, <.idInst, .hszTopic, .hszItem>,  'DdePostAdvise',  \
    DdeQueryConvInfo, <.hConv, .idTransaction, .pConvInfo>,  'DdeQueryConvInfo',  \
    DdeQueryNextServer, <.hConvList, .hConvPrev>,  'DdeQueryNextServer',  \
    DdeQueryStringA, <.idInst, .hsz, .psz, .cchMax, .iCodePage>,  'DdeQueryStringA',  \
    DdeQueryStringW, <.idInst, .hsz, .psz, .cchMax, .iCodePage>,  'DdeQueryStringW',  \
    DdeReconnect, <.hConv>,  'DdeReconnect',  \
    DdeSetQualityOfService, <.hWndClient, .pqosNew, .pqosPrev>,  'DdeSetQualityOfService',  \
    DdeSetUserHandle, <.hConv, .id, .hUser>,  'DdeSetUserHandle',  \
    DdeUnaccessData, <.hData>,  'DdeUnaccessData',  \
    DdeUninitialize, <.idInst>,  'DdeUninitialize',  \
    DefDlgProcA, <.hDlg, .wMsg, .wParam, .lParam>,  'DefDlgProcA',  \
    DefDlgProcW, <.hDlg, .wMsg, .wParam, .lParam>,  'DefDlgProcW',  \
    DefFrameProcA, <.hwnd, .hWndMDIClient, .wMsg, .wParam, .lParam>,  'DefFrameProcA',  \
    DefFrameProcW, <.hwnd, .hWndMDIClient, .wMsg, .wParam, .lParam>,  'DefFrameProcW',  \
    DefMDIChildProcA, <.hwnd, .wMsg, .wParam, .lParam>,  'DefMDIChildProcA',  \
    DefMDIChildProcW, <.hwnd, .wMsg, .wParam, .lParam>,  'DefMDIChildProcW',  \
    DefRawInputProc, <NONE>,  'DefRawInputProc',  \
    DefWindowProcA, <.hwnd, .wMsg, .wParam, .lParam>,  'DefWindowProcA',  \
    DefWindowProcW, <.hwnd, .wMsg, .wParam, .lParam>,  'DefWindowProcW',  \
    DeferWindowPos, <.hWinPosInfo, .hwnd, .hWndInsertAfter, .x, .y, .cx, .cy, .wFlags>,  'DeferWindowPos',  \
    DeleteMenu, <.hMenu, .nPosition, .wFlags>,  'DeleteMenu',  \
    DeregisterShellHookWindow, <NONE>,  'DeregisterShellHookWindow',  \
    DestroyAcceleratorTable, <.haccel>,  'DestroyAcceleratorTable',  \
    DestroyCaret, <VOID>,  'DestroyCaret',  \
    DestroyCursor, <.hCursor>,  'DestroyCursor',  \
    DestroyIcon, <.hIcon>,  'DestroyIcon',  \
    DestroyMenu, <.hMenu>,  'DestroyMenu',  \
    DestroyReasons, <NONE>,  'DestroyReasons',  \
    DestroyWindow, <.hwnd>,  'DestroyWindow',  \
    DeviceEventWorker, <NONE>,  'DeviceEventWorker',  \
    DialogBoxIndirectParamA, <.hInstance, .hDialogTemplate, .hWndParent, .lpDialogFunc, .dwInitParam>,  'DialogBoxIndirectParamA',  \
    DialogBoxIndirectParamAorW, <NONE>,  'DialogBoxIndirectParamAorW',  \
    DialogBoxIndirectParamW, <.hInstance, .hDialogTemplate, .hWndParent, .lpDialogFunc, .dwInitParam>,  'DialogBoxIndirectParamW',  \
    DialogBoxParamA, <.hInstance, .lpTemplateName, .hWndParent, .lpDialogFunc, .dwInitParam>,  'DialogBoxParamA',  \
    DialogBoxParamW, <.hInstance, .lpTemplateName, .hWndParent, .lpDialogFunc, .dwInitParam>,  'DialogBoxParamW',  \
    DisableProcessWindowsGhosting, <NONE>,  'DisableProcessWindowsGhosting',  \
    DispatchMessageA, <.lpMsg>,  'DispatchMessageA',  \
    DispatchMessageW, <.lpMsg>,  'DispatchMessageW',  \
    DisplayExitWindowsWarnings, <NONE>,  'DisplayExitWindowsWarnings',  \
    DlgDirListA, <.hDlg, .lpPathSpec, .nIDListBox, .nIDStaticPath, .wFileType>,  'DlgDirListA',  \
    DlgDirListComboBoxA, <.hDlg, .lpPathSpec, .nIDComboBox, .nIDStaticPath, .wFileType>,  'DlgDirListComboBoxA',  \
    DlgDirListComboBoxW, <.hDlg, .lpPathSpec, .nIDComboBox, .nIDStaticPath, .wFileType>,  'DlgDirListComboBoxW',  \
    DlgDirListW, <.hDlg, .lpPathSpec, .nIDListBox, .nIDStaticPath, .wFileType>,  'DlgDirListW',  \
    DlgDirSelectComboBoxExA, <.hWndDlg, .lpszPath, .cbPath, .idComboBox>,  'DlgDirSelectComboBoxExA',  \
    DlgDirSelectComboBoxExW, <.hWndDlg, .lpszPath, .cbPath, .idComboBox>,  'DlgDirSelectComboBoxExW',  \
    DlgDirSelectExA, <.hWndDlg, .lpszPath, .cbPath, .idListBox>,  'DlgDirSelectExA',  \
    DlgDirSelectExW, <.hWndDlg, .lpszPath, .cbPath, .idListBox>,  'DlgDirSelectExW',  \
    DragDetect, <.hWnd, .pt>,  'DragDetect',  \
    DragObject, <.hWnd1, .hWnd2, .un, .dw, .hCursor>,  'DragObject',  \
    DrawAnimatedRects, <.hwnd, .idAni, .lprcFrom, .lprcTo>,  'DrawAnimatedRects',  \
    DrawCaption, <.hWnd, .hDC, .pcRect, .uDCFlags>,  'DrawCaption',  \
    DrawCaptionTempA, <NONE>,  'DrawCaptionTempA',  \
    DrawCaptionTempW, <NONE>,  'DrawCaptionTempW',  \
    DrawEdge, <.hdc, .qrc, .edge, .grfFlags>,  'DrawEdge',  \
    DrawFocusRect, <.hdc, .lpRect>,  'DrawFocusRect',  \
    DrawFrame, <NONE>,  'DrawFrame',  \
    DrawFrameControl, <.hDC, .lpRect, .uFrameType, .uFrameState>,  'DrawFrameControl',  \
    DrawIcon, <.hdc, .x, .y, .hIcon>,  'DrawIcon',  \
    DrawIconEx, <.hdc, .xLeft, .yTop, .hIcon, .cxWidth, .cyWidth, .istepIfAniCur, .hbrFlickerFreeDraw, .diFlags>,  'DrawIconEx',  \
    DrawMenuBar, <.hwnd>,  'DrawMenuBar',  \
    DrawMenuBarTemp, <NONE>,  'DrawMenuBarTemp',  \
    DrawStateA, <.hDC, .hBrush, .lpDrawStateProc, .lParam, .wParam, .n1, .n2, .n3, .n4, .un>,  'DrawStateA',  \
    DrawStateW, <.hDC, .hBrush, .lpDrawStateProc, .lParam, .wParam, .n1, .n2, .n3, .n4, .un>,  'DrawStateW',  \
    DrawTextA, <.hdc, .lpStr, .nCount, .lpRect, .wFormat>,  'DrawTextA',  \
    DrawTextExA, <.hDC, .lpsz, .n, .lpRect, .un, .lpDrawTextParams>,  'DrawTextExA',  \
    DrawTextExW, <.hDC, .lpsz, .n, .lpRect, .un, .lpDrawTextParams>,  'DrawTextExW',  \
    DrawTextW, <.hdc, .lpStr, .nCount, .lpRect, .wFormat>,  'DrawTextW',  \
    EditWndProc, <NONE>,  'EditWndProc',  \
    EmptyClipboard, <VOID>,  'EmptyClipboard',  \
    EnableMenuItem, <.hMenu, .wIDEnableItem, .wEnable>,  'EnableMenuItem',  \
    EnableScrollBar, <.hwnd, .wSBflags, .wArrows>,  'EnableScrollBar',  \
    EnableWindow, <.hwnd, .fBoolean>,  'EnableWindow',  \
    EndDeferWindowPos, <.hWinPosInfo>,  'EndDeferWindowPos',  \
    EndDialog, <.hDlg, .nResult>,  'EndDialog',  \
    _EndMenu, <VOID>,  'EndMenu',  \
    EndPaint, <.hwnd, .lpPaint>,  'EndPaint',  \
    EndTask, <NONE>,  'EndTask',  \
    EnterReaderModeHelper, <NONE>,  'EnterReaderModeHelper',  \
    EnumChildWindows, <.hWndParent, .lpEnumFunc, .lParam>,  'EnumChildWindows',  \
    EnumClipboardFormats, <.wFormat>,  'EnumClipboardFormats',  \
    EnumDesktopWindows, <.hDesktop, .lpfn, .lParam>,  'EnumDesktopWindows',  \
    EnumDesktopsA, <.hwinsta, .lpEnumFunc, .lParam>,  'EnumDesktopsA',  \
    EnumDesktopsW, <.hwinsta, .lpEnumFunc, .lParam>,  'EnumDesktopsW',  \
    EnumDisplayDevicesA, <.lpDevice, .iDevNum, .lpDisplayDevice, .dwFlags>,  'EnumDisplayDevicesA',  \
    EnumDisplayDevicesW, <.lpDevice, .iDevNum, .lpDisplayDevice, .dwFlags>,  'EnumDisplayDevicesW',  \
    EnumDisplayMonitors, <.hdc, .lprcClip, .lpfnEnum, .dwData>,  'EnumDisplayMonitors',  \
    EnumDisplaySettingsA, <.lpszDeviceName, .iModeNum, .lpDevMode>,  'EnumDisplaySettingsA',  \
    EnumDisplaySettingsExA, <.lpszDeviceName, .iModeNum, .lpDevMode, .dwFlags>,  'EnumDisplaySettingsExA',  \
    EnumDisplaySettingsExW, <.lpszDeviceName, .iModeNum, .lpDevMode, .dwFlags>,  'EnumDisplaySettingsExW',  \
    EnumDisplaySettingsW, <.lpszDeviceName, .iModeNum, .lpDevMode>,  'EnumDisplaySettingsW',  \
    EnumPropsA, <.hWnd, .lpEnumFunc>,  'EnumPropsA',  \
    EnumPropsExA, <.hWnd, .lpEnumFunc, .lParam>,  'EnumPropsExA',  \
    EnumPropsExW, <.hWnd, .lpEnumFunc, .lParam>,  'EnumPropsExW',  \
    EnumPropsW, <.hWnd, .lpEnumFunc>,  'EnumPropsW',  \
    EnumThreadWindows, <.dwThreadId, .lpfn, .lParam>,  'EnumThreadWindows',  \
    EnumWindowStationsA, <.lpEnumFunc, .lParam>,  'EnumWindowStationsA',  \
    EnumWindowStationsW, <.lpEnumFunc, .lParam>,  'EnumWindowStationsW',  \
    EnumWindows, <.lpEnumFunc, .lParam>,  'EnumWindows',  \
    EqualRect, <.lpRect1, .lpRect2>,  'EqualRect',  \
    ExcludeUpdateRgn, <.hdc, .hwnd>,  'ExcludeUpdateRgn',  \
    ExitWindowsEx, <.uFlags, .dwReserved>,  'ExitWindowsEx',  \
    FillRect, <.hdc, .lpRect, .hBrush>,  'FillRect',  \
    FindWindowA, <.lpClassName, .lpWindowName>,  'FindWindowA',  \
    FindWindowExA, <.hWnd1, .hWnd2, .lpsz1, .lpsz2>,  'FindWindowExA',  \
    FindWindowExW, <.hWnd1, .hWnd2, .lpsz1, .lpsz2>,  'FindWindowExW',  \
    FindWindowW, <.lpClassName, .lpWindowName>,  'FindWindowW',  \
    FlashWindow, <.hwnd, .bInvert>,  'FlashWindow',  \
    FlashWindowEx, <.pfwi>,  'FlashWindowEx',  \
    FrameRect, <.hdc, .lpRect, .hBrush>,  'FrameRect',  \
    FreeDDElParam, <.msg, .lParam>,  'FreeDDElParam',  \
    GetActiveWindow, <VOID>,  'GetActiveWindow',  \
    GetAltTabInfo, <.hwnd, .iItem, .pati, .pszItemText, .cchItemText>,  'GetAltTabInfo',  \
    GetAltTabInfoA, <.hwnd, .iItem, .pati, .pszItemText, .cchItemText>,  'GetAltTabInfoA',  \
    GetAltTabInfoW, <.hwnd, .iItem, .pati, .pszItemText, .cchItemText>,  'GetAltTabInfoW',  \
    GetAncestor, <.hwnd, .gaFlags>,  'GetAncestor',  \
    GetAppCompatFlags, <NONE>,  'GetAppCompatFlags',  \
    GetAppCompatFlags2, <NONE>,  'GetAppCompatFlags2',  \
    GetAsyncKeyState, <.vKey>,  'GetAsyncKeyState',  \
    GetCapture, <VOID>,  'GetCapture',  \
    GetCaretBlinkTime, <VOID>,  'GetCaretBlinkTime',  \
    GetCaretPos, <.lpPoint>,  'GetCaretPos',  \
    GetClassInfoA, <.hInstance, .lpClassName, .lpWndClass>,  'GetClassInfoA',  \
    GetClassInfoExA, <.hinstance, .lpcstr, .lpwndclassexa>,  'GetClassInfoExA',  \
    GetClassInfoExW, <.hinstance, .lpcstr, .lpwndclassexa>,  'GetClassInfoExW',  \
    GetClassInfoW, <.hInstance, .lpClassName, .lpWndClass>,  'GetClassInfoW',  \
    GetClassLongA, <.hwnd, .nIndex>,  'GetClassLongA',  \
    GetClassLongW, <.hwnd, .nIndex>,  'GetClassLongW',  \
    GetClassNameA, <.hwnd, .lpClassName, .nMaxCount>,  'GetClassNameA',  \
    GetClassNameW, <.hwnd, .lpClassName, .nMaxCount>,  'GetClassNameW',  \
    GetClassWord, <.hwnd, .nIndex>,  'GetClassWord',  \
    GetClientRect, <.hwnd, .lpRect>,  'GetClientRect',  \
    GetClipCursor, <.lprc>,  'GetClipCursor',  \
    GetClipboardData, <.wFormat>,  'GetClipboardData',  \
    GetClipboardFormatNameA, <.wFormat, .lpString, .nMaxCount>,  'GetClipboardFormatNameA',  \
    GetClipboardFormatNameW, <.wFormat, .lpString, .nMaxCount>,  'GetClipboardFormatNameW',  \
    GetClipboardOwner, <VOID>,  'GetClipboardOwner',  \
    GetClipboardSequenceNumber, <VOID>,  'GetClipboardSequenceNumber',  \
    GetClipboardViewer, <VOID>,  'GetClipboardViewer',  \
    GetComboBoxInfo, <.hwndCombo, .pcbi>,  'GetComboBoxInfo',  \
    GetCursor, <VOID>,  'GetCursor',  \
    GetCursorFrameInfo, <NONE>,  'GetCursorFrameInfo',  \
    GetCursorInfo, <.pci>,  'GetCursorInfo',  \
    GetCursorPos, <.lpPoint>,  'GetCursorPos',  \
    GetDC, <.hwnd>,  'GetDC',  \
    GetDCEx, <.hwnd, .hrgnclip, .fdwOptions>,  'GetDCEx',  \
    GetDesktopWindow, <VOID>,  'GetDesktopWindow',  \
    GetDialogBaseUnits, <VOID>,  'GetDialogBaseUnits',  \
    GetDlgCtrlID, <.hwnd>,  'GetDlgCtrlID',  \
    GetDlgItem, <.hDlg, .nIDDlgItem>,  'GetDlgItem',  \
    GetDlgItemInt, <.hDlg, .nIDDlgItem, .lpTranslated, .bSigned>,  'GetDlgItemInt',  \
    GetDlgItemTextA, <.hDlg, .nIDDlgItem, .lpString, .nMaxCount>,  'GetDlgItemTextA',  \
    GetDlgItemTextW, <.hDlg, .nIDDlgItem, .lpString, .nMaxCount>,  'GetDlgItemTextW',  \
    GetDoubleClickTime, <VOID>,  'GetDoubleClickTime',  \
    GetFocus, <VOID>,  'GetFocus',  \
    GetForegroundWindow, <VOID>,  'GetForegroundWindow',  \
    GetGUIThreadInfo, <.idThread, .pgui>,  'GetGUIThreadInfo',  \
    GetGuiResources, <.hProcess, .uiFlags>,  'GetGuiResources',  \
    GetIconInfo, <.hIcon, .piconinfo>,  'GetIconInfo',  \
    GetInputDesktop, <NONE>,  'GetInputDesktop',  \
    GetInputState, <VOID>,  'GetInputState',  \
    GetInternalWindowPos, <NONE>,  'GetInternalWindowPos',  \
    GetKBCodePage, <VOID>,  'GetKBCodePage',  \
    GetKeyNameTextA, <.lParam, .lpBuffer, .nSize>,  'GetKeyNameTextA',  \
    GetKeyNameTextW, <.lParam, .lpBuffer, .nSize>,  'GetKeyNameTextW',  \
    GetKeyState, <.nVirtKey>,  'GetKeyState',  \
    GetKeyboardLayout, <.dwLayout>,  'GetKeyboardLayout',  \
    GetKeyboardLayoutList, <.nBuff, .lpList>,  'GetKeyboardLayoutList',  \
    GetKeyboardLayoutNameA, <.pwszKLID>,  'GetKeyboardLayoutNameA',  \
    GetKeyboardLayoutNameW, <.pwszKLID>,  'GetKeyboardLayoutNameW',  \
    GetKeyboardState, <.pbKeyState>,  'GetKeyboardState',  \
    GetKeyboardType, <.nTypeFlag>,  'GetKeyboardType',  \
    GetLastActivePopup, <.hwndOwnder>,  'GetLastActivePopup',  \
    GetLastInputInfo, <.plii>,  'GetLastInputInfo',  \
    GetLayeredWindowAttributes, <NONE>,  'GetLayeredWindowAttributes',  \
    GetListBoxInfo, <.hwnd>,  'GetListBoxInfo',  \
    GetMenu, <.hwnd>,  'GetMenu',  \
    GetMenuBarInfo, <.hwnd, .idObject, .idItem, .pmbi>,  'GetMenuBarInfo',  \
    GetMenuCheckMarkDimensions, <VOID>,  'GetMenuCheckMarkDimensions',  \
    GetMenuContextHelpId, <.hMenu>,  'GetMenuContextHelpId',  \
    GetMenuDefaultItem, <.hMenu, .fByPos, .gmdiFlags>,  'GetMenuDefaultItem',  \
    GetMenuInfo, <.hmenu, .LPMENUINFO>,  'GetMenuInfo',  \
    GetMenuItemCount, <.hMenu>,  'GetMenuItemCount',  \
    GetMenuItemID, <.hMenu, .nPos>,  'GetMenuItemID',  \
    GetMenuItemInfoA, <.hMenu, .un, .fBoolean, .lpMenuItemInfo>,  'GetMenuItemInfoA',  \
    GetMenuItemInfoW, <.hMenu, .un, .fBoolean, .lpMenuItemInfo>,  'GetMenuItemInfoW',  \
    GetMenuItemRect, <.hWnd, .hMenu, .uItem, .lprcItem>,  'GetMenuItemRect',  \
    GetMenuState, <.hMenu, .wID, .wFlags>,  'GetMenuState',  \
    GetMenuStringA, <.hMenu, .wIDItem, .lpString, .nMaxCount, .wFlags>,  'GetMenuStringA',  \
    GetMenuStringW, <.hMenu, .wIDItem, .lpString, .nMaxCount, .wFlags>,  'GetMenuStringW',  \
    GetMessageA, <.lpMsg, .hwnd, .wMsgFilterMin, .wMsgFilterMax>,  'GetMessageA',  \
    GetMessageExtraInfo, <VOID>,  'GetMessageExtraInfo',  \
    GetMessagePos, <VOID>,  'GetMessagePos',  \
    GetMessageTime, <VOID>,  'GetMessageTime',  \
    GetMessageW, <.lpMsg, .hwnd, .wMsgFilterMin, .wMsgFilterMax>,  'GetMessageW',  \
    GetMonitorInfoA, <.hMonitor, .lpmi>,  'GetMonitorInfoA',  \
    GetMonitorInfoW, <.hMonitor, .lpmi>,  'GetMonitorInfoW',  \
    GetMouseMovePointsEx, <.cbSize, .lppt, .lpptBuf, .nBufPoints, .resolution>,  'GetMouseMovePointsEx',  \
    GetNextDlgGroupItem, <.hDlg, .hCtl, .bPrevious>,  'GetNextDlgGroupItem',  \
    GetNextDlgTabItem, <.hDlg, .hCtl, .bPrevious>,  'GetNextDlgTabItem',  \
    GetOpenClipboardWindow, <VOID>,  'GetOpenClipboardWindow',  \
    GetParent, <.hwnd>,  'GetParent',  \
    GetPriorityClipboardFormat, <.lpPriorityList, .nCount>,  'GetPriorityClipboardFormat',  \
    GetProcessDefaultLayout, <.pdwDefaultLayout>,  'GetProcessDefaultLayout',  \
    GetProcessWindowStation, <VOID>,  'GetProcessWindowStation',  \
    GetProgmanWindow, <NONE>,  'GetProgmanWindow',  \
    GetPropA, <.hwnd, .lpString>,  'GetPropA',  \
    GetPropW, <.hwnd, .lpString>,  'GetPropW',  \
    GetQueueStatus, <.fuFlags>,  'GetQueueStatus',  \
    GetRawInputBuffer, <NONE>,  'GetRawInputBuffer',  \
    GetRawInputData, <NONE>,  'GetRawInputData',  \
    GetRawInputDeviceInfoA, <NONE>,  'GetRawInputDeviceInfoA',  \
    GetRawInputDeviceInfoW, <NONE>,  'GetRawInputDeviceInfoW',  \
    GetRawInputDeviceList, <NONE>,  'GetRawInputDeviceList',  \
    GetReasonTitleFromReasonCode, <NONE>,  'GetReasonTitleFromReasonCode',  \
    GetRegisteredRawInputDevices, <NONE>,  'GetRegisteredRawInputDevices',  \
    GetScrollBarInfo, <.hwnd, .idObject, .psbi>,  'GetScrollBarInfo',  \
    GetScrollInfo, <.hWnd, .n, .lpScrollInfo>,  'GetScrollInfo',  \
    GetScrollPos, <.hwnd, .nBar>,  'GetScrollPos',  \
    GetScrollRange, <.hwnd, .nBar, .lpMinPos, .lpMaxPos>,  'GetScrollRange',  \
    GetShellWindow, <NONE>,  'GetShellWindow',  \
    GetSubMenu, <.hMenu, .nPos>,  'GetSubMenu',  \
    GetSysColor, <.nSysColor>,  'GetSysColor',  \
    GetSysColorBrush, <.nSysColor>,  'GetSysColorBrush',  \
    GetSystemMenu, <.hwnd, .fBoolean>,  'GetSystemMenu',  \
    GetSystemMetrics, <.nIndex>,  'GetSystemMetrics',  \
    GetTabbedTextExtentA, <.hdc, .lpString, .nCount, .nTabPositions, .lpnTabStopPositions>,  'GetTabbedTextExtentA',  \
    GetTabbedTextExtentW, <.hdc, .lpString, .nCount, .nTabPositions, .lpnTabStopPositions>,  'GetTabbedTextExtentW',  \
    GetTaskmanWindow, <NONE>,  'GetTaskmanWindow',  \
    GetThreadDesktop, <.dwThread>,  'GetThreadDesktop',  \
    GetTitleBarInfo, <.hwnd, .pti>,  'GetTitleBarInfo',  \
    GetTopWindow, <.hwnd>,  'GetTopWindow',  \
    GetUpdateRect, <.hwnd, .lpRect, .bErase>,  'GetUpdateRect',  \
    GetUpdateRgn, <.hwnd, .hRgn, .fErase>,  'GetUpdateRgn',  \
    GetUserObjectInformationA, <.hObj, .nIndex, .pvInfo, .nLength, .lpnLengthNeeded>,  'GetUserObjectInformationA',  \
    GetUserObjectInformationW, <.hObj, .nIndex, .pvInfo, .nLength, .lpnLengthNeeded>,  'GetUserObjectInformationW',  \
    GetUserObjectSecurity, <.hObj, .pSIRequested, .pSd, .nLength, .lpnLengthNeeded>,  'GetUserObjectSecurity',  \
    GetWinStationInfo, <NONE>,  'GetWinStationInfo',  \
    GetWindow, <.hwnd, .wCmd>,  'GetWindow',  \
    GetWindowContextHelpId, <.hWnd>,  'GetWindowContextHelpId',  \
    GetWindowDC, <.hwnd>,  'GetWindowDC',  \
    GetWindowInfo, <.hwnd, .pwi>,  'GetWindowInfo',  \
    GetWindowLongA, <.hwnd, .nIndex>,  'GetWindowLongA',  \
    GetWindowLongW, <.hwnd, .nIndex>,  'GetWindowLongW',  \
    GetWindowModuleFileName, <.hwnd, .pszFileName, .cchFileNameMax>,  'GetWindowModuleFileName',  \
    GetWindowModuleFileNameA, <.hwnd, .pszFileName, .cchFileNameMax>,  'GetWindowModuleFileNameA',  \
    GetWindowModuleFileNameW, <.hwnd, .pszFileName, .cchFileNameMax>,  'GetWindowModuleFileNameW',  \
    GetWindowPlacement, <.hwnd, .lpwndpl>,  'GetWindowPlacement',  \
    GetWindowRect, <.hwnd, .lpRect>,  'GetWindowRect',  \
    GetWindowRgn, <.hWnd, .hRgn>,  'GetWindowRgn',  \
    GetWindowRgnBox, <NONE>,  'GetWindowRgnBox',  \
    GetWindowTextA, <.hwnd, .lpString, .cch>,  'GetWindowTextA',  \
    GetWindowTextLengthA, <.hwnd>,  'GetWindowTextLengthA',  \
    GetWindowTextLengthW, <.hwnd>,  'GetWindowTextLengthW',  \
    GetWindowTextW, <.hwnd, .lpString, .cch>,  'GetWindowTextW',  \
    GetWindowThreadProcessId, <.hwnd, .lpdwProcessId>,  'GetWindowThreadProcessId',  \
    GetWindowWord, <.hwnd, .nIndex>,  'GetWindowWord',  \
    GrayStringA, <.hDC, .hBrush, .lpOutputFunc, .lpData, .nCount, .X, .Y, .nWidth, .nHeight>,  'GrayStringA',  \
    GrayStringW, <.hDC, .hBrush, .lpOutputFunc, .lpData, .nCount, .X, .Y, .nWidth, .nHeight>,  'GrayStringW',  \
    HideCaret, <.hwnd>,  'HideCaret',  \
    HiliteMenuItem, <.hwnd, .hMenu, .wIDHiliteItem, .wHilite>,  'HiliteMenuItem',  \
    IMPGetIMEA, <.hwnd, .LPIMEPROA>,  'IMPGetIMEA',  \
    IMPGetIMEW, <.hwnd, .LPIMEPROA>,  'IMPGetIMEW',  \
    IMPQueryIMEA, <.LPIMEPROA>,  'IMPQueryIMEA',  \
    IMPQueryIMEW, <.LPIMEPROA>,  'IMPQueryIMEW',  \
    IMPSetIMEA, <.hwnd, .LPIMEPROA>,  'IMPSetIMEA',  \
    IMPSetIMEW, <.hwnd, .LPIMEPROA>,  'IMPSetIMEW',  \
    ImpersonateDdeClientWindow, <.hWndClient, .hWndServer>,  'ImpersonateDdeClientWindow',  \
    InSendMessage, <VOID>,  'InSendMessage',  \
    InSendMessageEx, <.lpReserved>,  'InSendMessageEx',  \
    InflateRect, <.lpRect, .x, .y>,  'InflateRect',  \
    InitializeLpkHooks, <NONE>,  'InitializeLpkHooks',  \
    InitializeWin32EntryTable, <NONE>,  'InitializeWin32EntryTable',  \
    InsertMenuA, <.hMenu, .nPosition, .wFlags, .wIDNewItem, .lpNewItem>,  'InsertMenuA',  \
    InsertMenuItemA, <.hMenu, .uItem, .bool, .ByRef>,  'InsertMenuItemA',  \
    InsertMenuItemW, <.hMenu, .uItem, .bool, .ByRef>,  'InsertMenuItemW',  \
    InsertMenuW, <.hMenu, .nPosition, .wFlags, .wIDNewItem, .lpNewItem>,  'InsertMenuW',  \
    InternalGetWindowText, <NONE>,  'InternalGetWindowText',  \
    IntersectRect, <.lpDestRect, .lpSrc1Rect, .lpSrc2Rect>,  'IntersectRect',  \
    InvalidateRect, <.hwnd, .lpRect, .fBoolean>,  'InvalidateRect',  \
    InvalidateRgn, <.hwnd, .hRgn, .bErase>,  'InvalidateRgn',  \
    InvertRect, <.hdc, .lpRect>,  'InvertRect',  \
    IsCharAlphaA, <.cChar>,  'IsCharAlphaA',  \
    IsCharAlphaNumericA, <.cChar>,  'IsCharAlphaNumericA',  \
    IsCharAlphaNumericW, <.cChar>,  'IsCharAlphaNumericW',  \
    IsCharAlphaW, <.cChar>,  'IsCharAlphaW',  \
    IsCharLowerA, <.cChar>,  'IsCharLowerA',  \
    IsCharLowerW, <.cChar>,  'IsCharLowerW',  \
    IsCharUpperA, <.cChar>,  'IsCharUpperA',  \
    IsCharUpperW, <.cChar>,  'IsCharUpperW',  \
    IsChild, <.hWndParent, .hwnd>,  'IsChild',  \
    IsClipboardFormatAvailable, <.wFormat>,  'IsClipboardFormatAvailable',  \
    IsDialogMessage, <.hDlg, .lpMsg>,  'IsDialogMessage',  \
    IsDialogMessageA, <.hDlg, .lpMsg>,  'IsDialogMessageA',  \
    IsDialogMessageW, <.hDlg, .lpMsg>,  'IsDialogMessageW',  \
    IsDlgButtonChecked, <.hDlg, .nIDButton>,  'IsDlgButtonChecked',  \
    IsGUIThread, <NONE>,  'IsGUIThread',  \
    IsHungAppWindow, <NONE>,  'IsHungAppWindow',  \
    IsIconic, <.hwnd>,  'IsIconic',  \
    IsMenu, <.hMenu>,  'IsMenu',  \
    IsRectEmpty, <.lpRect>,  'IsRectEmpty',  \
    IsServerSideWindow, <NONE>,  'IsServerSideWindow',  \
    IsWinEventHookInstalled, <NONE>,  'IsWinEventHookInstalled',  \
    IsWindow, <.hwnd>,  'IsWindow',  \
    IsWindowEnabled, <.hwnd>,  'IsWindowEnabled',  \
    IsWindowInDestroy, <NONE>,  'IsWindowInDestroy',  \
    IsWindowUnicode, <.hwnd>,  'IsWindowUnicode',  \
    IsWindowVisible, <.hwnd>,  'IsWindowVisible',  \
    IsZoomed, <.hwnd>,  'IsZoomed',  \
    KillSystemTimer, <NONE>,  'KillSystemTimer',  \
    KillTimer, <.hwnd, .nIDEvent>,  'KillTimer',  \
    LoadAcceleratorsA, <.hInstance, .lpTableName>,  'LoadAcceleratorsA',  \
    LoadAcceleratorsW, <.hInstance, .lpTableName>,  'LoadAcceleratorsW',  \
    LoadBitmapA, <.hInstance, .lpBitmapName>,  'LoadBitmapA',  \
    LoadBitmapW, <.hInstance, .lpBitmapName>,  'LoadBitmapW',  \
    LoadCursorA, <.hInstance, .lpCursorName>,  'LoadCursorA',  \
    LoadCursorFromFileA, <.lpFileName>,  'LoadCursorFromFileA',  \
    LoadCursorFromFileW, <.lpFileName>,  'LoadCursorFromFileW',  \
    LoadCursorW, <.hInstance, .lpCursorName>,  'LoadCursorW',  \
    LoadIconA, <.hInstance, .lpIconName>,  'LoadIconA',  \
    LoadIconW, <.hInstance, .lpIconName>,  'LoadIconW',  \
    LoadImageA, <.hInst, .lpsz, .uType, .n1, .n2, .uFlags>,  'LoadImageA',  \
    LoadImageW, <.hInst, .lpsz, .uType, .n1, .n2, .uFlags>,  'LoadImageW',  \
    LoadKeyboardLayoutA, <.pwszKLID, .flags>,  'LoadKeyboardLayoutA',  \
    LoadKeyboardLayoutEx, <NONE>,  'LoadKeyboardLayoutEx',  \
    LoadKeyboardLayoutW, <.pwszKLID, .flags>,  'LoadKeyboardLayoutW',  \
    LoadLocalFonts, <NONE>,  'LoadLocalFonts',  \
    LoadMenuA, <.hInstance, .lpString>,  'LoadMenuA',  \
    LoadMenuIndirectA, <.lpMenuTemplate>,  'LoadMenuIndirectA',  \
    LoadMenuIndirectW, <.lpMenuTemplate>,  'LoadMenuIndirectW',  \
    LoadMenuW, <.hInstance, .lpString>,  'LoadMenuW',  \
    LoadRemoteFonts, <NONE>,  'LoadRemoteFonts',  \
    LoadStringA, <.hInstance, .wID, .lpBuffer, .nBufferMax>,  'LoadStringA',  \
    LoadStringW, <.hInstance, .wID, .lpBuffer, .nBufferMax>,  'LoadStringW',  \
    LockSetForegroundWindow, <.uLockCode>,  'LockSetForegroundWindow',  \
    LockWindowStation, <NONE>,  'LockWindowStation',  \
    LockWindowUpdate, <.hwndLock>,  'LockWindowUpdate',  \
    LockWorkStation, <VOID>,  'LockWorkStation',  \
    LookupIconIdFromDirectory, <.presbits, .fIcon>,  'LookupIconIdFromDirectory',  \
    LookupIconIdFromDirectoryEx, <.presbits, .fIcon, .cxDesired, .cyDesired, .Flags>,  'LookupIconIdFromDirectoryEx',  \
    MBToWCSEx, <NONE>,  'MBToWCSEx',  \
    MB_GetString, <NONE>,  'MB_GetString',  \
    MapDialogRect, <.hDlg, .lpRect>,  'MapDialogRect',  \
    MapVirtualKeyA, <.wCode, .wMapType>,  'MapVirtualKeyA',  \
    MapVirtualKeyExA, <.uCode, .uMapType, .dwhkl>,  'MapVirtualKeyExA',  \
    MapVirtualKeyExW, <.uCode, .uMapType, .dwhkl>,  'MapVirtualKeyExW',  \
    MapVirtualKeyW, <.wCode, .wMapType>,  'MapVirtualKeyW',  \
    MapWindowPoints, <.hwndFrom, .hwndTo, .lppt, .cPoints>,  'MapWindowPoints',  \
    MenuItemFromPoint, <.hWnd, .hMenu, .ptScreen>,  'MenuItemFromPoint',  \
    MenuWindowProcA, <NONE>,  'MenuWindowProcA',  \
    MenuWindowProcW, <NONE>,  'MenuWindowProcW',  \
    MessageBeep, <.wType>,  'MessageBeep',  \
    MessageBoxA, <.hwnd, .lpText, .lpCaption, .wType>,  'MessageBoxA',  \
    MessageBoxExA, <.hwnd, .lpText, .lpCaption, .wType, .wLanguageId>,  'MessageBoxExA',  \
    MessageBoxExW, <.hwnd, .lpText, .lpCaption, .wType, .wLanguageId>,  'MessageBoxExW',  \
    MessageBoxIndirectA, <.lpMsgBoxParams>,  'MessageBoxIndirectA',  \
    MessageBoxIndirectW, <.lpMsgBoxParams>,  'MessageBoxIndirectW',  \
    MessageBoxTimeoutA, <NONE>,  'MessageBoxTimeoutA',  \
    MessageBoxTimeoutW, <NONE>,  'MessageBoxTimeoutW',  \
    MessageBoxW, <.hwnd, .lpText, .lpCaption, .wType>,  'MessageBoxW',  \
    ModifyMenuA, <.hMenu, .nPosition, .wFlags, .wIDNewItem, .lpString>,  'ModifyMenuA',  \
    ModifyMenuW, <.hMenu, .nPosition, .wFlags, .wIDNewItem, .lpString>,  'ModifyMenuW',  \
    MonitorFromPoint, <.pt, .dwFlags>,  'MonitorFromPoint',  \
    MonitorFromRect, <.lprc, .dwFlags>,  'MonitorFromRect',  \
    MonitorFromWindow, <.hwnd, .dwFlags>,  'MonitorFromWindow',  \
    MoveWindow, <.hwnd, .x, .y, .nWidth, .nHeight, .fBoolean>,  'MoveWindow',  \
    MsgWaitForMultipleObjects, <.nCount, .pHandles, .fWaitAll, .dwMilliseconds, .dwWakeMask>,  'MsgWaitForMultipleObjects',  \
    MsgWaitForMultipleObjectsEx, <.nCount, .pHandles, .dwMilliseconds, .dwWakeMask, .dwFlags>,  'MsgWaitForMultipleObjectsEx',  \
    NotifyWinEvent, <.lEvent, .hwnd, .idObject, .idChild>,  'NotifyWinEvent',  \
    OemKeyScan, <.wOemChar>,  'OemKeyScan',  \
    OemToCharA, <.lpszSrc, .lpszDst>,  'OemToCharA',  \
    OemToCharBuffA, <.lpszSrc, .lpszDst, .cchDstLength>,  'OemToCharBuffA',  \
    OemToCharBuffW, <.lpszSrc, .lpszDst, .cchDstLength>,  'OemToCharBuffW',  \
    OemToCharW, <.lpszSrc, .lpszDst>,  'OemToCharW',  \
    OffsetRect, <.lpRect, .x, .y>,  'OffsetRect',  \
    OpenClipboard, <.hwnd>,  'OpenClipboard',  \
    OpenDesktopA, <.lpszDesktop, .dwFlags, .fInherit, .dwDesiredAccess>,  'OpenDesktopA',  \
    OpenDesktopW, <.lpszDesktop, .dwFlags, .fInherit, .dwDesiredAccess>,  'OpenDesktopW',  \
    OpenIcon, <.hwnd>,  'OpenIcon',  \
    OpenInputDesktop, <.dwFlags, .fInherit, .dwDesiredAccess>,  'OpenInputDesktop',  \
    OpenWindowStationA, <.lpszWinSta, .fInherit, .dwDesiredAccess>,  'OpenWindowStationA',  \
    OpenWindowStationW, <.lpszWinSta, .fInherit, .dwDesiredAccess>,  'OpenWindowStationW',  \
    PackDDElParam, <.msg, .uiLo, .uiHi>,  'PackDDElParam',  \
    PaintDesktop, <.hdc>,  'PaintDesktop',  \
    PaintMenuBar, <NONE>,  'PaintMenuBar',  \
    PeekMessageA, <.lpMsg, .hwnd, .wMsgFilterMin, .wMsgFilterMax, .wRemoveMsg>,  'PeekMessageA',  \
    PeekMessageW, <.lpMsg, .hwnd, .wMsgFilterMin, .wMsgFilterMax, .wRemoveMsg>,  'PeekMessageW',  \
    PostMessageA, <.hwnd, .wMsg, .wParam, .lParam>,  'PostMessageA',  \
    PostMessageW, <.hwnd, .wMsg, .wParam, .lParam>,  'PostMessageW',  \
    PostQuitMessage, <.nExitCode>,  'PostQuitMessage',  \
    PostThreadMessageA, <.idThread, .msg, .wParam, .lParam>,  'PostThreadMessageA',  \
    PostThreadMessageW, <.idThread, .msg, .wParam, .lParam>,  'PostThreadMessageW',  \
    PrintWindow, <.hWnd, .hdcBlt, .nFlags>,  'PrintWindow',  \
    PrivateExtractIconExA, <NONE>,  'PrivateExtractIconExA',  \
    PrivateExtractIconExW, <NONE>,  'PrivateExtractIconExW',  \
    PrivateExtractIconsA, <NONE>,  'PrivateExtractIconsA',  \
    PrivateExtractIconsW, <NONE>,  'PrivateExtractIconsW',  \
    PrivateSetDbgTag, <NONE>,  'PrivateSetDbgTag',  \
    PrivateSetRipFlags, <NONE>,  'PrivateSetRipFlags',  \
    PtInRect, <.lpRect, .x, .y>,  'PtInRect',  \
    QuerySendMessage, <NONE>,  'QuerySendMessage',  \
    QueryUserCounters, <NONE>,  'QueryUserCounters',  \
    RealChildWindowFromPoint, <.hwndParent, .ptParentClientCoords>,  'RealChildWindowFromPoint',  \
    RealGetWindowClass, <.hwnd, .pszType, .cchType>,  'RealGetWindowClass',  \
    RealGetWindowClassA, <.hwnd, .pszType, .cchType>,  'RealGetWindowClassA',  \
    RealGetWindowClassW, <.hwnd, .pszType, .cchType>,  'RealGetWindowClassW',  \
    ReasonCodeNeedsBugID, <NONE>,  'ReasonCodeNeedsBugID',  \
    ReasonCodeNeedsComment, <NONE>,  'ReasonCodeNeedsComment',  \
    RecordShutdownReason, <NONE>,  'RecordShutdownReason',  \
    RedrawWindow, <.hwnd, .lprcUpdate, .hrgnUpdate, .fuRedraw>,  'RedrawWindow',  \
    RegisterClassA, <.Class>,  'RegisterClassA',  \
    RegisterClassExA, <.pcWndClassEx>,  'RegisterClassExA',  \
    RegisterClassExW, <.pcWndClassEx>,  'RegisterClassExW',  \
    RegisterClassW, <.Class>,  'RegisterClassW',  \
    RegisterClipboardFormatA, <.lpString>,  'RegisterClipboardFormatA',  \
    RegisterClipboardFormatW, <.lpString>,  'RegisterClipboardFormatW',  \
    RegisterDeviceNotificationA, <.hRecipient, .NotificationFilter, .Flags>,  'RegisterDeviceNotificationA',  \
    RegisterDeviceNotificationW, <.hRecipient, .NotificationFilter, .Flags>,  'RegisterDeviceNotificationW',  \
    RegisterHotKey, <.hwnd, .id, .fsModifiers, .vk>,  'RegisterHotKey',  \
    RegisterLogonProcess, <NONE>,  'RegisterLogonProcess',  \
    RegisterMessagePumpHook, <NONE>,  'RegisterMessagePumpHook',  \
    RegisterRawInputDevices, <NONE>,  'RegisterRawInputDevices',  \
    RegisterServicesProcess, <NONE>,  'RegisterServicesProcess',  \
    RegisterShellHookWindow, <NONE>,  'RegisterShellHookWindow',  \
    RegisterSystemThread, <NONE>,  'RegisterSystemThread',  \
    RegisterTasklist, <NONE>,  'RegisterTasklist',  \
    RegisterUserApiHook, <NONE>,  'RegisterUserApiHook',  \
    RegisterWindowMessageA, <.lpString>,  'RegisterWindowMessageA',  \
    RegisterWindowMessageW, <.lpString>,  'RegisterWindowMessageW',  \
    ReleaseCapture, <VOID>,  'ReleaseCapture',  \
    ReleaseDC, <.hwnd, .hdc>,  'ReleaseDC',  \
    RemoveMenu, <.hMenu, .nPosition, .wFlags>,  'RemoveMenu',  \
    RemovePropA, <.hwnd, .lpString>,  'RemovePropA',  \
    RemovePropW, <.hwnd, .lpString>,  'RemovePropW',  \
    ReplyMessage, <.lReply>,  'ReplyMessage',  \
    ResolveDesktopForWOW, <NONE>,  'ResolveDesktopForWOW',  \
    ReuseDDElParam, <.lParam, .msgIn, .msgOut, .uiLo, .uiHi>,  'ReuseDDElParam',  \
    ScreenToClient, <.hwnd, .lpPoint>,  'ScreenToClient',  \
    ScrollChildren, <NONE>,  'ScrollChildren',  \
    ScrollDC, <.hdc, .dx, .dy, .lprcScroll, .lprcClip, .hrgnUpdate, .lprcUpdate>,  'ScrollDC',  \
    ScrollWindow, <.hWnd, .XAmount, .YAmount, .lpRect, .lpClipRect>,  'ScrollWindow',  \
    ScrollWindowEx, <.hwnd, .dx, .dy, .lprcScroll, .lprcClip, .hrgnUpdate, .lprcUpdate, .fuScroll>,  'ScrollWindowEx',  \
    SendDlgItemMessageA, <.hDlg, .nIDDlgItem, .wMsg, .wParam, .lParam>,  'SendDlgItemMessageA',  \
    SendDlgItemMessageW, <.hDlg, .nIDDlgItem, .wMsg, .wParam, .lParam>,  'SendDlgItemMessageW',  \
    SendIMEMessageExA, <.hwnd, .lparam>,  'SendIMEMessageExA',  \
    SendIMEMessageExW, <.hwnd, .lparam>,  'SendIMEMessageExW',  \
    SendInput, <.cInputs, .pInputs, .cbSize>,  'SendInput',  \
    SendMessageA, <.hwnd, .wMsg, .wParam, .lParam>,  'SendMessageA',  \
    SendMessageCallbackA, <.hwnd, .wMsg, .wParam, .lParam, .lpResultCallBack, .dwData>,  'SendMessageCallbackA',  \
    SendMessageCallbackW, <.hwnd, .wMsg, .wParam, .lParam, .lpResultCallBack, .dwData>,  'SendMessageCallbackW',  \
    SendMessageTimeoutA, <.hwnd, .msg, .wParam, .lParam, .fuFlags, .uTimeout, .lpdwResult>,  'SendMessageTimeoutA',  \
    SendMessageTimeoutW, <.hwnd, .msg, .wParam, .lParam, .fuFlags, .uTimeout, .lpdwResult>,  'SendMessageTimeoutW',  \
    SendMessageW, <.hwnd, .wMsg, .wParam, .lParam>,  'SendMessageW',  \
    SendNotifyMessageA, <.hwnd, .msg, .wParam, .lParam>,  'SendNotifyMessageA',  \
    SendNotifyMessageW, <.hwnd, .msg, .wParam, .lParam>,  'SendNotifyMessageW',  \
    SetActiveWindow, <.hwnd>,  'SetActiveWindow',  \
    SetCapture, <.hwnd>,  'SetCapture',  \
    SetCaretBlinkTime, <.wMSeconds>,  'SetCaretBlinkTime',  \
    SetCaretPos, <.x, .y>,  'SetCaretPos',  \
    SetClassLongA, <.hwnd, .nIndex, .dwNewLong>,  'SetClassLongA',  \
    SetClassLongW, <.hwnd, .nIndex, .dwNewLong>,  'SetClassLongW',  \
    SetClassWord, <.hwnd, .nIndex, .wNewWord>,  'SetClassWord',  \
    SetClipboardData, <.uFormat, .hMem>,  'SetClipboardData',  \
    SetClipboardViewer, <.hwnd>,  'SetClipboardViewer',  \
    SetConsoleReserveKeys, <NONE>,  'SetConsoleReserveKeys',  \
    SetCursor, <.hCursor>,  'SetCursor',  \
    SetCursorContents, <NONE>,  'SetCursorContents',  \
    SetCursorPos, <.x, .y>,  'SetCursorPos',  \
    SetDebugErrorLevel, <.dwLevel>,  'SetDebugErrorLevel',  \
    SetDeskWallpaper, <NONE>,  'SetDeskWallpaper',  \
    SetDlgItemInt, <.hDlg, .nIDDlgItem, .wValue, .bSigned>,  'SetDlgItemInt',  \
    SetDlgItemTextA, <.hDlg, .nIDDlgItem, .lpString>,  'SetDlgItemTextA',  \
    SetDlgItemTextW, <.hDlg, .nIDDlgItem, .lpString>,  'SetDlgItemTextW',  \
    SetDoubleClickTime, <.wCount>,  'SetDoubleClickTime',  \
    SetFocus, <.hwnd>,  'SetFocus',  \
    SetForegroundWindow, <.hwnd>,  'SetForegroundWindow',  \
    SetInternalWindowPos, <NONE>,  'SetInternalWindowPos',  \
    SetKeyboardState, <.lppbKeyState>,  'SetKeyboardState',  \
    SetLastErrorEx, <.dwErrCode, .dwType>,  'SetLastErrorEx',  \
    SetLayeredWindowAttributes, <.hwnd, .crKey, .bAlpha, .dwFlags>,  'SetLayeredWindowAttributes',  \
    SetLogonNotifyWindow, <NONE>,  'SetLogonNotifyWindow',  \
    SetMenu, <.hwnd, .hMenu>,  'SetMenu',  \
    SetMenuContextHelpId, <.hMenu, .dw>,  'SetMenuContextHelpId',  \
    SetMenuDefaultItem, <.hMenu, .uItem, .fByPos>,  'SetMenuDefaultItem',  \
    SetMenuInfo, <.hmenu, .LPCMENUINFO>,  'SetMenuInfo',  \
    SetMenuItemBitmaps, <.hMenu, .nPosition, .wFlags, .hBitmapUnchecked, .hBitmapChecked>,  'SetMenuItemBitmaps',  \
    SetMenuItemInfoA, <.hMenu, .un, .fBoolean, .lpcMenuItemInfo>,  'SetMenuItemInfoA',  \
    SetMenuItemInfoW, <.hMenu, .un, .fBoolean, .lpcMenuItemInfo>,  'SetMenuItemInfoW',  \
    SetMessageExtraInfo, <.lParam>,  'SetMessageExtraInfo',  \
    SetMessageQueue, <.cMessagesMax>,  'SetMessageQueue',  \
    SetParent, <.hWndChild, .hWndNewParent>,  'SetParent',  \
    SetProcessDefaultLayout, <.dwDefaultLayout>,  'SetProcessDefaultLayout',  \
    SetProcessWindowStation, <.hWinSta>,  'SetProcessWindowStation',  \
    SetProgmanWindow, <NONE>,  'SetProgmanWindow',  \
    SetPropA, <.hwnd, .lpString, .hData>,  'SetPropA',  \
    SetPropW, <.hwnd, .lpString, .hData>,  'SetPropW',  \
    SetRect, <.lpRect, .X1, .Y1, .X2, .Y2>,  'SetRect',  \
    SetRectEmpty, <.lpRect>,  'SetRectEmpty',  \
    SetScrollInfo, <.hWnd, .n, .lpcScrollInfo, .bool>,  'SetScrollInfo',  \
    SetScrollPos, <.hwnd, .nBar, .nPos, .fBoolean>,  'SetScrollPos',  \
    SetScrollRange, <.hwnd, .nBar, .nMinPos, .nMaxPos, .bRedraw>,  'SetScrollRange',  \
    SetShellWindow, <NONE>,  'SetShellWindow',  \
    SetShellWindowEx, <NONE>,  'SetShellWindowEx',  \
    SetSysColors, <.nChanges, .lpSysColor, .lpColorValues>,  'SetSysColors',  \
    SetSysColorsTemp, <NONE>,  'SetSysColorsTemp',  \
    SetSystemCursor, <.hcur, .id>,  'SetSystemCursor',  \
    SetSystemMenu, <NONE>,  'SetSystemMenu',  \
    SetSystemTimer, <NONE>,  'SetSystemTimer',  \
    SetTaskmanWindow, <NONE>,  'SetTaskmanWindow',  \
    SetThreadDesktop, <.hDesktop>,  'SetThreadDesktop',  \
    SetTimer, <.hWnd, .nIDEvent, .uElapse, .lpTimerFunc>,  'SetTimer',  \
    SetUserObjectInformationA, <.hObj, .nIndex, .pvInfo, .nLength>,  'SetUserObjectInformationA',  \
    SetUserObjectInformationW, <.hObj, .nIndex, .pvInfo, .nLength>,  'SetUserObjectInformationW',  \
    SetUserObjectSecurity, <.hObj, .pSIRequested, .pSd>,  'SetUserObjectSecurity',  \
    SetWinEventHook, <.eventMin, .eventMax, .hmodWinEventProc, .pfnWinEventProc, .idProcess, .idThread, .dwFlags>,  'SetWinEventHook',  \
    SetWindowContextHelpId, <.hWnd, .dw>,  'SetWindowContextHelpId',  \
    SetWindowLongA, <.hwnd, .nIndex, .dwNewLong>,  'SetWindowLongA',  \
    SetWindowLongW, <.hwnd, .nIndex, .dwNewLong>,  'SetWindowLongW',  \
    SetWindowPlacement, <.hwnd, .lpwndpl>,  'SetWindowPlacement',  \
    SetWindowPos, <.hwnd, .hWndInsertAfter, .x, .y, .cx, .cy, .wFlags>,  'SetWindowPos',  \
    SetWindowRgn, <.hWnd, .hRgn, .bRedraw>,  'SetWindowRgn',  \
    SetWindowStationUser, <NONE>,  'SetWindowStationUser',  \
    SetWindowTextA, <.hwnd, .lpString>,  'SetWindowTextA',  \
    SetWindowTextW, <.hwnd, .lpString>,  'SetWindowTextW',  \
    SetWindowWord, <.hwnd, .nIndex, .wNewWord>,  'SetWindowWord',  \
    SetWindowsHookA, <.nFilterType, .pfnFilterProc>,  'SetWindowsHookA',  \
    SetWindowsHookExA, <.idHook, .lpfn, .hmod, .dwThreadId>,  'SetWindowsHookExA',  \
    SetWindowsHookExW, <.idHook, .lpfn, .hmod, .dwThreadId>,  'SetWindowsHookExW',  \
    SetWindowsHookW, <.nFilterType, .pfnFilterProc>,  'SetWindowsHookW',  \
    ShowCaret, <.hwnd>,  'ShowCaret',  \
    ShowCursor, <.bShow>,  'ShowCursor',  \
    ShowOwnedPopups, <.hwnd, .fBoolean>,  'ShowOwnedPopups',  \
    ShowScrollBar, <.hwnd, .wBar, .bShow>,  'ShowScrollBar',  \
    ShowStartGlass, <NONE>,  'ShowStartGlass',  \
    ShowWindow, <.hwnd, .nCmdShow>,  'ShowWindow',  \
    ShowWindowAsync, <.hWnd, .nCmdShow>,  'ShowWindowAsync',  \
    SoftModalMessageBox, <NONE>,  'SoftModalMessageBox',  \
    SubtractRect, <.lprcDst, .lprcSrc1, .lprcSrc2>,  'SubtractRect',  \
    SwapMouseButton, <.bSwap>,  'SwapMouseButton',  \
    SwitchDesktop, <.hDesktop>,  'SwitchDesktop',  \
    SwitchToThisWindow, <NONE>,  'SwitchToThisWindow',  \
    SystemParametersInfoA, <.uAction, .uParam, .ByRef, .fuWinIni>,  'SystemParametersInfoA',  \
    SystemParametersInfoW, <.uAction, .uParam, .ByRef, .fuWinIni>,  'SystemParametersInfoW',  \
    TabbedTextOutA, <.hdc, .x, .y, .lpString, .nCount, .nTabPositions, .lpnTabStopPositions, .nTabOrigin>,  'TabbedTextOutA',  \
    TabbedTextOutW, <.hdc, .x, .y, .lpString, .nCount, .nTabPositions, .lpnTabStopPositions, .nTabOrigin>,  'TabbedTextOutW',  \
    TileChildWindows, <NONE>,  'TileChildWindows',  \
    TileWindows, <.hwndParent, .wHow, .lpRect, .cKids, .lpKids>,  'TileWindows',  \
    ToAscii, <.uVirtKey, .uScanCode, .lpbKeyState, .lpwTransKey, .fuState>,  'ToAscii',  \
    ToAsciiEx, <.uVirtKey, .uScanCode, .lpKeyState, .lpChar, .uFlags, .dwhkl>,  'ToAsciiEx',  \
    ToUnicode, <.wVirtKey, .wScanCode, .lpKeyState, .pwszBuff, .cchBuff, .wFlags>,  'ToUnicode',  \
    ToUnicodeEx, <.wVirtKey, .wScanCode, .lpKeyState, .pwszBuff, .cchBuff, .wFlags, .dwhkl>,  'ToUnicodeEx',  \
    TrackMouseEvent, <.lpEventTrack>,  'TrackMouseEvent',  \
    TrackPopupMenu, <.hMenu, .uFlags, .x, .y, .nReserved, .hwnd, .lprc>,  'TrackPopupMenu',  \
    TrackPopupMenuEx, <.hMenu, .un, .n1, .n2, .hWnd, .lpTPMParams>,  'TrackPopupMenuEx',  \
    TranslateAccelerator, <.hwnd, .hAccTable, .lpMsg>,  'TranslateAccelerator',  \
    TranslateAcceleratorA, <.hwnd, .hAccTable, .lpMsg>,  'TranslateAcceleratorA',  \
    TranslateAcceleratorW, <.hwnd, .hAccTable, .lpMsg>,  'TranslateAcceleratorW',  \
    TranslateMDISysAccel, <.hWndClient, .lpMsg>,  'TranslateMDISysAccel',  \
    TranslateMessage, <.lpMsg>,  'TranslateMessage',  \
    TranslateMessageEx, <NONE>,  'TranslateMessageEx',  \
    UnhookWinEvent, <.hWinEventHook>,  'UnhookWinEvent',  \
    UnhookWindowsHook, <.nCode, .pfnFilterProc>,  'UnhookWindowsHook',  \
    UnhookWindowsHookEx, <.hHook>,  'UnhookWindowsHookEx',  \
    UnionRect, <.lpDestRect, .lpSrc1Rect, .lpSrc2Rect>,  'UnionRect',  \
    UnloadKeyboardLayout, <.HKL>,  'UnloadKeyboardLayout',  \
    UnlockWindowStation, <NONE>,  'UnlockWindowStation',  \
    UnpackDDElParam, <.msg, .lParam, .puiLo, .puiHi>,  'UnpackDDElParam',  \
    UnregisterClassA, <.lpClassName, .hInstance>,  'UnregisterClassA',  \
    UnregisterClassW, <.lpClassName, .hInstance>,  'UnregisterClassW',  \
    UnregisterDeviceNotification, <.Handle>,  'UnregisterDeviceNotification',  \
    UnregisterHotKey, <.hwnd, .id>,  'UnregisterHotKey',  \
    UnregisterMessagePumpHook, <NONE>,  'UnregisterMessagePumpHook',  \
    UnregisterUserApiHook, <NONE>,  'UnregisterUserApiHook',  \
    UpdateLayeredWindow, <.hWnd, .hdcDst, .pptDst, .psize, .hdcSrc, .pptSrc, .crKey, .pblend, .dwFlags>,  'UpdateLayeredWindow',  \
    UpdatePerUserSystemParameters, <NONE>,  'UpdatePerUserSystemParameters',  \
    UpdateWindow, <.hwnd>,  'UpdateWindow',  \
    User32InitializeImmEntryTable, <NONE>,  'User32InitializeImmEntryTable',  \
    UserClientDllInitialize, <NONE>,  'UserClientDllInitialize',  \
    UserHandleGrantAccess, <.hUserHandle, .hJob, .bGrant>,  'UserHandleGrantAccess',  \
    UserLpkPSMTextOut, <NONE>,  'UserLpkPSMTextOut',  \
    UserLpkTabbedTextOut, <NONE>,  'UserLpkTabbedTextOut',  \
    UserRealizePalette, <NONE>,  'UserRealizePalette',  \
    UserRegisterWowHandlers, <NONE>,  'UserRegisterWowHandlers',  \
    VRipOutput, <NONE>,  'VRipOutput',  \
    VTagOutput, <NONE>,  'VTagOutput',  \
    ValidateRect, <.hwnd, .lpRect>,  'ValidateRect',  \
    ValidateRgn, <.hwnd, .hRgn>,  'ValidateRgn',  \
    VkKeyScanA, <.cChar>,  'VkKeyScanA',  \
    VkKeyScanExA, <.ch, .dwhkl>,  'VkKeyScanExA',  \
    VkKeyScanExW, <.ch, .dwhkl>,  'VkKeyScanExW',  \
    VkKeyScanW, <.cChar>,  'VkKeyScanW',  \
    WCSToMBEx, <NONE>,  'WCSToMBEx',  \
    WINNLSEnableIME, <.hwnd, .bool>,  'WINNLSEnableIME',  \
    WINNLSGetEnableStatus, <.hwnd>,  'WINNLSGetEnableStatus',  \
    WINNLSGetIMEHotkey, <.hwnd>,  'WINNLSGetIMEHotkey',  \
    WaitForInputIdle, <.hProcess, .dwMilliseconds>,  'WaitForInputIdle',  \
    WaitMessage, <VOID>,  'WaitMessage',  \
    Win32PoolAllocationStats, <NONE>,  'Win32PoolAllocationStats',  \
    WinHelpA, <.hwnd, .lpHelpFile, .wCommand, .dwData>,  'WinHelpA',  \
    WinHelpW, <.hwnd, .lpHelpFile, .wCommand, .dwData>,  'WinHelpW',  \
    WindowFromDC, <.hdc>,  'WindowFromDC',  \
    WindowFromPoint, <.xPoint, .yPoint>,  'WindowFromPoint',  \
    keybd_event, <.bVk, .bScan, .dwFlags, .dwExtraInfo>,  'keybd_event',  \
    mouse_event, <.dwFlags, .dx, .dy, .cButtons, .dwExtraInfo>,  'mouse_event',  \
    wsprintfA, <.lpOut, .lpFmt, .etc>,  'wsprintfA',  \
    wsprintfW, <.lpOut, .lpFmt, .etc>,  'wsprintfW',  \
    wvsprintfA, <NONE>,  'wvsprintfA',  \
    wvsprintfW, <NONE>,  'wvsprintfW'

Added freshlib/imports/Win32/ws2_32.inc.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: ws2_32.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

import_proto ws2_32,  \
    freeaddrinfo, <.pAddrInfo>,                                    'freeaddrinfo',           \
    FreeAddrInfoW, <.pAddrInfo>,                                   'FreeAddrInfoW',          \
    getaddrinfo, <.pNodeName, .pServiceName, .pHints, .ppResult>, 'getaddrinfo',             \
    GetAddrInfoW, <.pNodeName, .pServiceName, .pHints, .ppResult>, 'GetAddrInfoW'

Added freshlib/imports/Win32/wsock32.inc.



































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: wsock32.dll API calls
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


import_proto wsock32,  \
    AcceptEx, <.sListenSocket, .sAcceptSocket, .lpOutputBuffer, .dwReceiveDataLength, .dwLocalAddressLength, .dwRemoteAddressLength,  \
        .lpdwBytesReceived, .lpOverlapped>,  'AcceptEx',  \
    EnumProtocolsA, <.lpiProtocols, .lpProtocolBuffer, .lpdwBufferLength>,  'EnumProtocolsA',  \
    EnumProtocolsW, <.lpiProtocols, .lpProtocolBuffer, .lpdwBufferLength>,  'EnumProtocolsW',  \
    GetAcceptExSockaddrs, <.lpOutputBuffer, .dwReceiveDataLength, .dwLocalAddressLength, .dwRemoteAddressLength, .LocalSockaddr, .LocalSockaddrLength,  \
        .RemoteSockaddr, .RemoteSockaddrLength>,  'GetAcceptExSockaddrs',  \
    GetAddressByNameA, <.dwNameSpace, .lpServiceType, .lpServiceName, .lpiProtocols, .dwResolution, .lpServiceAs, .lpCsaddrBuffer,  \
        .lpdwBufferLength, .lpAliasBuffer, .lpdwAliasBufferLength>,  'GetAddressByNameA',  \
    GetAddressByNameW, <.dwNameSpace, .lpServiceType, .lpServiceName, .lpiProtocols, .dwResolution, .lpServiceAs, .lpCsaddrBuffer,  \
        .lpdwBufferLength, .lpAliasBuffer, .lpdwAliasBufferLength>,  'GetAddressByNameW',  \
    GetNameByTypeA, <.lpServiceType, .lpServiceName, .dwNameLength>,  'GetNameByTypeA',  \
    GetNameByTypeW, <.lpServiceType, .lpServiceName, .dwNameLength>,  'GetNameByTypeW',  \
    GetServiceA, <.dwNameSpace, .lpGuid, .lpServiceName, .dwProperties, .lpBuffer, .lpdwBufferSize, .lpServiceAs>,  'GetServiceA',  \
    GetServiceW, <.dwNameSpace, .lpGuid, .lpServiceName, .dwProperties, .lpBuffer, .lpdwBufferSize, .lpServiceAs>,  'GetServiceW',  \
    GetTypeByNameA, <.lpServiceName, .lpServiceType>,  'GetTypeByNameA',  \
    GetTypeByNameW, <.lpServiceName, .lpServiceType>,  'GetTypeByNameW',  \
    MigrateWinsockConfiguration, <NONE>,  'MigrateWinsockConfiguration',  \
    NPLoadNameSpaces, <NONE>,  'NPLoadNameSpaces',  \
    SetServiceA, <.dwNameSpace, .dwOperation, .dwFlags, .lpServiceInfo, .lpServiceAsyncInfo, .lpdwStatusFlags>,  'SetServiceA',  \
    SetServiceW, <.dwNameSpace, .dwOperation, .dwFlags, .lpServiceInfo, .lpServiceAsyncInfo, .lpdwStatusFlags>,  'SetServiceW',  \
    TransmitFile, <.hSocket, .hFile, .nNumberOfBytesToWrite, .nNumberOfBytesPerSend, .lpOverlapped, .lpTransmitBuffers, .dwReserved,  \
      >,  'TransmitFile',  \
    WEP, <NONE>,  'WEP',  \
    WSAAsyncGetHostByAddr, <.hWnd, .wMsg, .addr, .lLen, .lType, .buf, .buflen>,  'WSAAsyncGetHostByAddr',  \
    WSAAsyncGetHostByName, <.hWnd, .wMsg, .name, .buf, .buflen>,  'WSAAsyncGetHostByName',  \
    WSAAsyncGetProtoByName, <.hWnd, .wMsg, .name, .buf, .buflen>,  'WSAAsyncGetProtoByName',  \
    WSAAsyncGetProtoByNumber, <.hWnd, .wMsg, .number, .buf, .buflen>,  'WSAAsyncGetProtoByNumber',  \
    WSAAsyncGetServByName, <.hWnd, .wMsg, .name, .proto, .buf, .buflen>,  'WSAAsyncGetServByName',  \
    WSAAsyncGetServByPort, <.hWnd, .wMsg, .port, .proto, .buf, .buflen>,  'WSAAsyncGetServByPort',  \
    WSAAsyncSelect, <.s, .hWnd, .wMsg, .lEvent>,  'WSAAsyncSelect',  \
    WSACancelAsyncRequest, <.hAsyncTaskHandle>,  'WSACancelAsyncRequest',  \
    WSACancelBlockingCall, <VOID>,  'WSACancelBlockingCall',  \
    WSACleanup, <VOID>,  'WSACleanup',  \
    WSAGetLastError, <VOID>,  'WSAGetLastError',  \
    WSAIsBlocking, <VOID>,  'WSAIsBlocking',  \
    WSARecvEx, <.s, .buf, .lLen, .flags>,  'WSARecvEx',  \
    WSASetBlockingHook, <.lpBlockFunc>,  'WSASetBlockingHook',  \
    WSASetLastError, <.iError>,  'WSASetLastError',  \
    WSAStartup, <.wVersionRequired, .lpWSAData>,  'WSAStartup',  \
    WSAUnhookBlockingHook, <VOID>,  'WSAUnhookBlockingHook',  \
    WSApSetPostRoutine, <NONE>,  'WSApSetPostRoutine',  \
    __WSAFDIsSet, <NONE>,  '__WSAFDIsSet',  \
    accept, <.s, .addr, .addrlen>,  'accept',  \
    bind, <.s, .addr, .namelen>,  'bind',  \
    closesocket, <.s>,  'closesocket',  \
    connect, <.s, .name, .namelen>,  'connect',  \
    dn_expand, <NONE>,  'dn_expand',  \
    gethostbyaddr, <.addr, .len, .type>,  'gethostbyaddr',  \
    gethostbyname, <.name>,  'gethostbyname',  \
    gethostname, <.name, .namelen>,  'gethostname',  \
    getnetbyname, <NONE>,  'getnetbyname',  \
    getpeername, <.s, .name, .namelen>,  'getpeername',  \
    getprotobyname, <.name>,  'getprotobyname',  \
    getprotobynumber, <.number>,  'getprotobynumber',  \
    getservbyname, <.name, .proto>,  'getservbyname',  \
    getservbyport, <.port, .proto>,  'getservbyport',  \
    getsockname, <.s, .name, .namelen>,  'getsockname',  \
    getsockopt, <.s, .level, .optname, .optval, .optlen>,  'getsockopt',  \
    htonl, <.hostlong>,  'htonl',  \
    htons, <.hostshort>,  'htons',  \
    inet_addr, <.cp>,  'inet_addr',  \
    inet_network, <NONE>,  'inet_network',  \
    inet_ntoa, <.lIn>,  'inet_ntoa',  \
    ioctlsocket, <.s, .cmd, .argp>,  'ioctlsocket',  \
    listen, <.s, .backlog>,  'listen',  \
    ntohl, <.netlong>,  'ntohl',  \
    ntohs, <.netshort>,  'ntohs',  \
    rcmd, <NONE>,  'rcmd',  \
    recv, <.s, .buf, .lLen, .flags>,  'recv',  \
    recvfrom, <.s, .buf, .lLen, .flags, .from, .fromlen>,  'recvfrom',  \
    rexec, <NONE>,  'rexec',  \
    rresvport, <NONE>,  'rresvport',  \
    s_perror, <NONE>,  's_perror',  \
    select, <NONE>,  'select',  \
    send, <.s, .buf, .lLen, .flags>,  'send',  \
    sendto, <.s, .buf, .lLen, .flags, .to, .tolen>,  'sendto',  \
    sethostname, <NONE>,  'sethostname',  \
    setsockopt, <.s, .level, .optname, .optval, .optlen>,  'setsockopt',  \
    shutdown, <.s, .how>,  'shutdown',  \
    socket, <.af, .lType, .protocol>,  'socket'

Deleted freshlib/imports/allimports.asm.

1
include '%TargetOS%/allimports.asm'
<


Added freshlib/macros/Dummy/_executable.inc.

















































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Executable file formating macro library.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

TargetOS equ Dummy

macro @BinaryType type {
  if type eq GUI
  end if

  if type eq console
  end if

  if type eq DLL
  end if

}


macro @AllDataSection {
  IncludeAllGlobals
}


macro @AllDataEmbeded {
  @AllDataSection
}


macro __create_dll_list {
  DynamicLibList equ
  rept DynamicLibList@count i:1 \{
    match any, DynamicLibList \\{
      match name:filename, DynamicLibList\\#i \\\{
        DynamicLibList equ DynamicLibList, name, \\\`name\\\#'.dll'
      \\\}
    \\}

    match , DynamicLibList \\{
      match name:filename, DynamicLibList\\#i \\\{
        DynamicLibList equ name, \\\`name\\\#'.dll'
      \\\}
    \\}
  \}
}

macro __create_all_imports {
   __create_dll_list

   match liblist, DynamicLibList \{
     library liblist
   \}

  rept DynamicLibList@count i:1 \{
    match name:filename, DynamicLibList\#i \\{
      \\include filename
    \\}
  \}
}


macro @AllImportSection {
;  section '.idata' import readable
;    __create_all_imports
}


macro @AllImportEmbeded {
;  data import
;    __create_all_imports
;  end data
}






Added freshlib/macros/Dummy/allmacros.inc.





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Combined include of all Win32 specific macros.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

Added freshlib/macros/KolibriOS/_executable.inc.



































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Executable file formating macro library.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

TargetOS equ KolibriOS
strTargetOS equ 'KolibriOS'

STACK_SIZE = 1024 * 1024 ; 1MB

hdrVersionConsole = 1

macro @BinaryType type, model {
  if type eq GUI | type eq console
        format binary as 'kex'
        use32
        org     $0

        db      'MENUET01'
        dd      hdrVersionConsole
        dd      start
        dd      __end_code
        dd      __end_data + STACK_SIZE
        dd      __end_data + STACK_SIZE
        dd      __bufferArguments
        dd      __bufferPath

  STDIO  dd     0
  STDDBG dd     0
  end if

  addrHeapStart = __end_data + STACK_SIZE

; ???????????????????????
  if type eq DLL
    format PE GUI 4.0 DLL
    entry EntryPoint
    section '.code' code readable writeable executable
  end if

  postpone \{
    ?FAKE_COMPILE = 0
    match =TRUE, ___FAKE_COMPILE \\{
      ?FAKE_COMPILE = 1
    \\}

    if ?FAKE_COMPILE = 0

      __AllDataSection
      __AllImportSection

    end if
  \}


}


macro __AllDataSection {
  local begin

  align 4
  begin = $
  disp 3, 'Initialized data address: $', <begin, 16>, 13
  IncludeIGlobals
  DispSize 'Initialized data', ($ - begin)

  align 4
  begin = $
  disp 3, 'Strings address: $', <$, 16>, 13
  _IncludeAllStrings
  DispSize 'String data', ($ - begin)

  align 4
  begin = $
  disp 3, 'I18n strings data:', <begin, 16>, 13
  __IncludeI18nStrings
  DispSize 'I18n strings data', ($ - begin)

  __end_code:

  if used bufferArguments
    bufferArguments rb 1024
    __bufferArguments = bufferArguments
  else
    __bufferArguments = 0
  end if

  if used bufferPath
    bufferPath       rb 1024
    __bufferPath = bufferPath
  else
    __bufferPath = 0
  end if

  align 4
  begin = $
  disp 3, 'Uninitialized data address: $', <begin, 16>, 13
  IncludeUGlobals
  DispSize 'Uninitialized data', ($ - begin)

  align 4
  begin = $
  disp 3, 'I18n strings placeholders: $', <begin, 16>, 13
  IncludeI18nLabels
  DispSize 'I18n strings placeholders', ($ - begin)

  align 4096
  __end_data:
}


macro __create_dll_list {
  DynamicLibList equ
  rept DynamicLibList@count i:1 \{
    match any, DynamicLibList \\{
      match name:filename, DynamicLibList\\#i \\\{
        DynamicLibList equ DynamicLibList, name, \\\`name\\\#'.dll'
      \\\}
    \\}

    match , DynamicLibList \\{
      match name:filename, DynamicLibList\\#i \\\{
        DynamicLibList equ name, \\\`name\\\#'.dll'
      \\\}
    \\}
  \}
}

macro __create_all_imports {
   __create_dll_list

   match liblist, DynamicLibList \{
     library liblist
   \}

  rept DynamicLibList@count i:1 \{
    match name:filename, DynamicLibList\#i \\{
      \\include filename
    \\}
  \}
}


macro __AllImportSection {
;  section '.idata' import readable
;    __create_all_imports
}




Added freshlib/macros/KolibriOS/allmacros.inc.





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Combined include of all Win32 specific macros.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

Changes to freshlib/macros/Linux/_elf.inc.















1
2
3
4
5
6
7















macro Elf32_Sym name,value,size,bind,type,other,shndx
{
 dd name+0
 dd value+0
 dd size+0
 db (bind+0) shl 4 + (type+0)
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: ELF format macros. Used internally in _import.inc
;
;  Target OS: Linux (ELF)
;
;  Dependencies:
;
;  Notes: The form and use of these macros is somehow unsystematic.
;_________________________________________________________________________________________


macro Elf32_Sym name,value,size,bind,type,other,shndx
{
 dd name+0
 dd value+0
 dd size+0
 db (bind+0) shl 4 + (type+0)

Added freshlib/macros/Linux/_executable.inc.





































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Executable file formating macro library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

TargetOS equ Linux
strTargetOS equ 'Linux'

match =LINUX_INTERPRETER, LINUX_INTERPRETER {
  LINUX_INTERPRETER equ '/lib/ld-linux.so.2'
}


macro @BinaryType type, model {
  if type eq GUI
    format ELF executable 3
    entry start
  end if

  if type eq console
    format ELF executable 3
    entry start
  end if

  if type eq DLL
    format ELF executable  ; is it correct???
  end if

  postpone \{
    ?FAKE_COMPILE = 0
    match =TRUE, ___FAKE_COMPILE \\{
      ?FAKE_COMPILE = 1
    \\}

    if ?FAKE_COMPILE = 0

      ; global data
      if (model eq )|(model eq default)
        segment readable writeable
      end if

      if ~(model eq manual)
        \IncludeAllGlobals
      end if

      ; imports
      \__create_all_imports
    end if
  \}

  if __imported_count > 0
    segment interpreter readable
    interpreter LINUX_INTERPRETER
  end if

  segment readable writeable executable
}



macro __create_all_imports {

    rept DynamicLibList@count i:1 \{
      match name:filename, DynamicLibList\#i \\{
        \\include filename
      \\}
    \}

    __ImportAll
}



Changes to freshlib/macros/Linux/_import.inc.






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














; macroinstruction for importing functions in Linux











include '_elf.inc'


macro interpreter [library]
{
 db library,0
}

macro needed [library]
{


 local str
 match needed,needed@dynamic \{ define needed@dynamic needed,str:library \}





















 match ,needed@dynamic \{ define needed@dynamic str:library \}
}
define needed@dynamic








macro import [name]






{










 common
  local strtab,strsz,symtab,rel,relsz,hash
  segment dynamic readable
  match needed,needed@dynamic
  \{ irp item,needed \\{ match str:library,item \\\{ dd DT_NEEDED,str-strtab \\\} \\} \}
  dd DT_STRTAB,strtab


  dd DT_STRSZ,strsz
  dd DT_SYMTAB,symtab
  dd DT_SYMENT,sizeof.Elf32_Sym
  dd DT_REL,rel
  dd DT_RELSZ,relsz
  dd DT_RELENT,sizeof.Elf32_Rel
  dd DT_HASH,hash

  dd DT_NULL,0







  segment readable writeable

  symtab: Elf32_Sym

 forward





  if used name
    local fstr
    Elf32_Sym fstr-strtab,0,0,STB_GLOBAL,STT_FUNC,0,0
  end if


 common




  rel:




  local counter
  counter = 1
 forward






   if used name





     Elf32_Rel name,counter,R_386_32








     counter = counter+1
   end if


 common
  relsz = $-rel
  hash:
  dd 1,counter
  dd 0

  repeat counter
   if %=counter
    dd 0
   else
    dd %
   end if
  end repeat
  strtab db 0
 forward


  if used name
    fstr db `name,0
  end if


 common

  match needed,needed@dynamic






  \{ irp item,needed \\{ match str:library,item \\\{ str db library,0 \\\} \\} \}
  strsz = $-strtab
 forward


  if used name
    name dd 0


  end if






}









>
>
>
>
>
|
|
>
>
>
>
>
>
>
>
>
>

>






<
|
>
>
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
>
>
>
>
>
>

>
|
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
<
>
>
|
|
<
|
<
<
<
>
|
>
>
>
>
>
>
>
|
>
|
>
|
>
>
>
>
>
|
<
|
|
>
>
|
>
>
>
>
|
>
>
>
>
|
|
|
>
>
>
>
>
>
|
>
>
>
>
>
|
>
>
>
>
>
>
>
>
|
|
>
>
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
>
>
|
|
|
>
>
|
>
|
>
>
>
>
>
>
|
|
|
>
>
|
|
>
>
|
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110

111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Macros for importing functions in Linux
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


options.AlignStackExt = 1       ;  SYSTEM V ABI requires stack aligned on 16 bytes on calls.

include '_elf.inc'


macro interpreter [library]
{
 db library,0
}



macro __define_import_arguments [arg] {
common
  local ..start

  if arg eq VOID
    .__info.argtype=1
  else
    if arg eq NONE
      .__info.argtype = 0
    else
      virtual at ebp+8
        ..start:
forward
        if ~arg eq ...
          arg dd ?
        else
          label .more_arguments dword
        end if
common
        .__info.argsize = $ - ..start
      end virtual
      .__info.argtype = 2
    end if
  end if
}



macro __InitImportMacros {
common
  local libs, func

  libs equ 0
  func equ 0

  ; creates symbols list with needed libraries.
  macro import_proto library, [iname, arg, ename] \{
    \common
      \local str, cnt, use
      rept 1 i:libs+1 \\{
        libs equ i
        libs\\#i equ str:cnt:use:library
      \\}

    \forward
      \local fstr
      rept 1 i:func+1 \\{
        func equ i
        func\\#i equ fstr:cnt:iname:ename:arg
        iname\\#.@here = 1
      \\}
  \}

  macro __ImportAll \{
  \common
    \local strtab,strsz,symtab,rel,relsz,hash,tcnt, size1, size2

    tcnt = 0


    if defined options.ShowImported & options.ShowImported
      disp 3, 'Imported functions: ', <__imported_count, 10>, $09
    end if


    rept func i:1 \\{



      match fstr:cnt:iname:ename:arg, func\\#i \\\{
        if used iname
          tcnt = tcnt + 1
          if defined options.ShowImported & options.ShowImported
            display 3, 'Imported "', \\\`iname, '" function.', $0a
          end if
        end if
      \\\}
    \\}

    __imported_count = tcnt;

    size1 = 0

    if __imported_count>0
      segment dynamic readable
      rept libs i:1 \\{
        match str:cnt:use:library, libs\\#i \\\{
          cnt = 0
          if use > 0

            dd DT_NEEDED, str-strtab
          end if
        \\\}
      \\}

      dd DT_STRTAB, strtab
      dd DT_STRSZ, strsz
      dd DT_SYMTAB, symtab
      dd DT_SYMENT, sizeof.Elf32_Sym
      dd DT_REL, rel
      dd DT_RELSZ, relsz
      dd DT_RELENT, sizeof.Elf32_Rel
      dd DT_HASH, hash
      dd DT_NULL, 0

      size1 = $ - $$

      zalign 4, ?
      segment readable writeable
      symtab: Elf32_Sym

      rept func i:1 \\{
        match fstr:cnt:iname:ename:arg, func\\#i \\\{
          if used iname
            Elf32_Sym fstr-strtab,0,0,STB_GLOBAL,STT_FUNC,0,0
            cnt = cnt + 1
          end if
        \\\}
      \\}

      rel:
      \local counter
      counter = 1

      rept func i:1 \\{
        match fstr:cnt:iname:ename:arg, func\\#i \\\{
          if used iname
            Elf32_Rel iname, counter, R_386_32
            counter = counter + 1
          end if
        \\\}
      \\}

      relsz = $-rel
      hash:
      dd 1, counter
      dd 0

      repeat counter
       if % = counter
        dd 0
       else
        dd %
       end if
      end repeat
      strtab db 0

      rept func i:1 \\{
        match fstr:cnt:iname:ename:arg, func\\#i \\\{
          if used iname
            fstr db ename, 0
          end if
        \\\}
      \\}

      rept libs i:1 \\{
        match str:cnt:use:library, libs\\#i \\\{
          use = cnt
          if use > 0
            str db library, 0
          end if
        \\\}
      \\}

      strsz = $-strtab

      rept func i:1 \\{
        match fstr:cnt:iname:ename:arg, func\\#i \\\{
          if used iname
            iname dd 0
          else
            iname = 0
          end if
           __define_import_arguments arg
        \\\}
      \\}
    else
      size1 = $ - $$
    end if

    size2 = $ - $$

    DispSize 'ELF Import data1:', size1
    DispSize 'ELF Import data2:', size2
  \}
}


__InitImportMacros

Added freshlib/macros/Linux/_linproc.inc.











































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Linux variant or return instruction for thread procedures.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

macro thread_return {
  cret
}




Changes to freshlib/macros/Linux/allmacros.inc.















1















include '_import.inc'

>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Combined include of all Linux specific macros.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

include '_import.inc'
include '_linproc.inc'

Added freshlib/macros/Win32/_com32.inc.



























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Win32 COM interface macros.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

macro cominvk ptr_object, method, [arg] {
common
      if ~ arg eq
reverse
        pushx arg
common
      end if

      if ~defined ptr_object#.com.object
        ERROR! `ptr_object is not a com object.
      end if

        mov     eax, [ptr_object]
        push    eax
        mov     eax,[eax]
        call    [eax+ptr_object#.#method]
}


macro comcall handle, interface, proc,[arg] {
common
      if ~ arg eq
reverse
        pushx arg
common
      end if

      if ~defined interface#.com.interface
        ERROR! `interface is not a com interface.
      end if

      if handle eqtype eax | handle eqtype 0    ; ???
        local ..handle
        label ..handle at handle
        push    handle
        mov     eax, [..handle]
      else
        mov     eax, handle
        push    eax
        mov     eax, [eax]
      end if

      call [eax+interface#.#proc]
}


macro com_interface name, [proc] {
common
    struc name \{
      match , @struct \\{ define field@struct .,name, \\}
      match no, @struct \\{
        . dd ?
        virtual at 0
forward
          .#proc dd ?
common
          .\\#\\.com.object = name#.com.interface
        end virtual
      \\}
    \}

   virtual at 0
forward
     name#.#proc dd ?
common
     name#.com.interface = $ shr 2
   end virtual
}


struc GUID def {
  if used .
  label . dword
  match d1-d2-d3-d4-d5, def \{
    .Data1 dd $\#d1
    .Data2 dw $\#d2
    .Data3 dw $\#d3
    .Data4 db $\#d4 shr 8, $\#d4 and 0FFh
    .Data5 db $\#d5 shr 40, $\#d5 shr 32 and 0FFh, $\#d5 shr 24 and 0FFh
           db $\#d5 shr 16 and 0FFh, $\#d5 shr 8 and 0FFh, $\#d5 and 0FFh
  \}
  end if
}


; ends with two word zero terminators.

struc BSTR [txt] {
common
  local ..len
  .length dd ..len
  . du txt
  ..len = $ - .
    dw 0, 0
}

Changes to freshlib/macros/Win32/_exceptions.inc.















1
2
3
4
5
6
7














..TryLevel = 0

macro beginTry {
  common
    ptrExceptionContext equ esp+$0c
    ptrExceptionRecord  equ esp+$04

>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Win32 exception handling macros.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

..TryLevel = 0

macro beginTry {
  common
    ptrExceptionContext equ esp+$0c
    ptrExceptionRecord  equ esp+$04

Added freshlib/macros/Win32/_executable.inc.













































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Executable file formating macro library.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

TargetOS equ Win32
strTargetOS equ 'Win32'

; model can be "compact", "default", "manual"

macro @BinaryType type, model {
  if type eq GUI
    format PE GUI 4.0
    entry start
  end if

  if type eq console
    format PE Console 4.0
    entry start
  end if

  if type eq DLL
    format PE GUI 4.0 DLL
    entry EntryPoint
  end if


  postpone \{
    ?FAKE_COMPILE = 0
    match =TRUE, ___FAKE_COMPILE \\{
      ?FAKE_COMPILE = 1
    \\}

    if ?FAKE_COMPILE = 0
  ; imports
      if model eq compact
        data import
      else
        if (model eq )|(model eq default)
          section '.idata' import readable
        else
        end if
      end if

      if ~(model eq manual)
        \__create_all_imports
      end if

      if model eq compact
        end data
      end if

  ; global data
      if (model eq )|(model eq default)
        section '.data' data readable writeable
      end if

      if ~(model eq manual)
        \IncludeAllGlobals
      end if

      if type eq DLL
        section '.reloc' fixups data readable discardable
        DispSize "fixups section", $-$$
        if $=$$
          dd 0,8          ; if there are no fixups, generate dummy entry
        end if
      end if
    end if
  \}

  section '.code' code readable writeable executable
}



macro __create_dll_list {
  DynamicLibList equ
  rept DynamicLibList@count i:1 \{
    match any, DynamicLibList \\{
      match name:filename, DynamicLibList\\#i \\\{
        DynamicLibList equ DynamicLibList, name, \\\`name\\\#'.dll'
      \\\}
    \\}

    match , DynamicLibList \\{
      match name:filename, DynamicLibList\\#i \\\{
        DynamicLibList equ name, \\\`name\\\#'.dll'
      \\\}
    \\}
  \}
}

macro __create_all_imports {
   __create_dll_list

   match liblist, DynamicLibList \{
     library liblist
   \}

  rept DynamicLibList@count i:1 \{
    match name:filename, DynamicLibList\#i \\{
      \\include filename
    \\}
  \}
}


;macro @AllImportSection {
;  section '.idata' import readable
;    __create_all_imports
;}


;macro @AllImportEmbeded {
;  data import
;    __create_all_imports
;  end data
;}






Changes to freshlib/macros/Win32/_export.inc.














1
2
3
4
5
6
7














; macroinstruction for making export section

macro export dllname,[label,string]     ; strings must be sorted
 { common
    local module,addresses,names,ordinal,count
    count = 0
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Win32 export sections creating macros.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

; macroinstruction for making export section

macro export dllname,[label,string]     ; strings must be sorted
 { common
    local module,addresses,names,ordinal,count
    count = 0

Changes to freshlib/macros/Win32/_import.inc.




















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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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



















; macroinstruction for making import section
macro library [name,string] {
forward
    local _label
    if ~ name#.needed
    dd 0,0,0,RVA _label,RVA name
    end if
common
    dd 0,0,0,0,0
forward
    if ~ name#.needed
    _label db string,0
;    display 'Import from:', string, $0d, $0a
    end if
 }


macro import name,[label, string]
 { common
    name:
   forward
    if used label
     local _label
     label dd RVA _label
    end if
   common
    if $ > name
     name#.needed = FALSE
     dd 0
    else
     name#.needed = TRUE
    end if
   forward
    if used label
    _label dw 0
           db string,0
    end if
  }



macro define_import_arguments [argument] {
common
  virtual at ebp+8
forward

    argument dd ?



common
  end virtual
}



macro import_proto name, [lbl, api, arg, string] {
common
    name:
forward
    local ..lbl, ..used

    match =N, api \{ @label equ lbl\}
    match =W, api \{
      match =ascii, GlobalAPI \\{ @label equ lbl#W \\}
      match =unicode, GlobalAPI \\{ @label equ lbl \\}
      match , GlobalAPI \\{ @label equ lbl#W \\}
    \}
    match =A, api \{
      match =ascii, GlobalAPI \\{ @label equ lbl \\}
      match =unicode, GlobalAPI \\{ @label equ lbl#A \\}
      match , GlobalAPI \\{ @label equ lbl#A \\}
    \}

    ..used = 0
    if used @label
      @label dd RVA ..lbl
      ..used = 1


    end if

   if ~(arg eq NONE)
     if arg eq VOID
       .__info.argtype = 1
     else
       define_import_arguments arg
       .__info.argtype = 2
     end if
   else
     .__info.argtype = 0
   end if

   restore @label

common
    if $ > name
     name#.needed = FALSE
     dd 0
    else
     name#.needed = TRUE
    end if

forward
    if ..used
    ..lbl dw 0
          db string,0
    end if
}



macro U_library [name,string]
 { forward
     local _label
     dd 0,0,0,RVA _label,RVA name
   common
     dd 0,0,0,0,0
   forward
    _label db string,0
 }


macro U_import name,[label,string]
{ common
    name:
   forward
     local _label
     label dd RVA _label
   common
     dd 0
   forward
    _label dw 0
           db string,0
}


macro ImportLib [lib] {
forward
    local _label
    if ~ lib#.needed
      dd 0, 0, 0, RVA _label, RVA lib
    end if

common
    dd 0, 0, 0, 0, 0

forward
  if ~ lib#.needed
    _label db `lib#'.dll', 0
  end if

forward
  \include "%finc%\win32\api\"#`lib#".inc"
}


GlobalAPI equ
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>




|





|

<




|



|

|



|


|


|











>

>
>
>




>
>
|





|
<
<
<
<
<
<
<
<
<
<


|
|

>
>


|
|
|
|
|
|
|
|

|
<
<



|


|











<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
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
97
98
99
100


101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118








119





































; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Win32 import macros.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes: Only import_proto should be used in portable applications. Here we have some
;         old macros that needs revision or even removing.
;_________________________________________________________________________________________


options.AlignStackExt = 0       ; Windows needs regular stack alignment on 4.


; macroinstruction for making import section
macro library [name,string] {
forward
    local _label
    if name#.needed
    dd 0,0,0,RVA _label,RVA name
    end if
common
    dd 0,0,0,0,0
forward
    if name#.needed
    _label db string,0

    end if
 }


macro import name, [lbl, string]
 { common
    name:
   forward
    if used lbl
     local _label
     lbl dd RVA _label
    end if
   common
    if $ > name
     name#.needed = TRUE
     dd 0
    else
     name#.needed = FALSE
    end if
   forward
    if used lbl
    _label dw 0
           db string,0
    end if
  }



macro define_import_arguments [argument] {
common
  virtual at ebp+8
forward
  if ~ argument eq ...
    argument dd ?
  else
    label .more… dword
  end if
common
  end virtual
}



macro import_proto name, [lbl, arg, string] {
common
    name:
forward
    local ..lbl, ..used

    @label equ lbl











    ..used = 0
    if used lbl
      lbl dd RVA ..lbl
      ..used = 1
    else
      label lbl dword at 0
    end if

    if ~(arg eq NONE)
      if arg eq VOID
        .__info.argtype = 1
      else
        define_import_arguments arg
        .__info.argtype = 2
      end if
    else
     .__info.argtype = 0
    end if



common
    if $ > name
     name#.needed = TRUE
     dd 0
    else
     name#.needed = FALSE
    end if

forward
    if ..used
    ..lbl dw 0
          db string,0
    end if
}

















































Deleted freshlib/macros/Win32/_winproc.inc.

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
;-----------------------------------------
; This file is part of Fresh standard
; macro library.
;-----------------------------------------


macro winproc name, [arg] {
common

  \err@endp

  macro err@endp \{
    end if
    Missing 'endwp' before the procedure.
  \}


  if ~ used name
    if options.ShowSkipped
      display 1,'Message procedure skiped: ',`name, $0d, $0a
    end if
  else

 name:
    .__info.id = 2

  if arg eq
    virtual at ebp+8
      .hwnd dd ?
      .wmsg dd ?
      .wparam dd ?
      .lparam dd ?
      .__info.argsize = 16
    end virtual
  else
    virtual at ebp+8
      forward
        arg dd ?
        if ~ defined name#arg
          ERROR! the argument `arg MUST begin with dot
        end if
      common
        .__info.argsize = $ - ebp - 8
    end virtual
  end if

  if .__info.argsize <> 16
    Error! The count of `name arguments MUST be 4 dwords.
  end if

  virtual at ebp - .__info.commonframe.size
  .__info.commonframe.begin:
}



macro ondefault {  ; begins procedure instructions
  common
    local ..msgcounter, ..msglist
    msgcounter equ ..msgcounter
    msglist equ ..msglist

    ..msgcounter = 0

    call JumpTo
    ..msglist:
    rd   .__info.msgcount
    dd   0

    .ondefault:
}


macro onmessage message {
  .#message:
  .#message#.__info.id = 3
  .#message#.__info.number = msgcounter / 4
     store word message at (msglist + msgcounter)
     store word ($ - msglist - msgcounter - 4 ) at (msglist + msgcounter + 2)
  msgcounter = msgcounter + 4
}


macro endwp {
    .__info.msgcount = msgcounter / 4
    .__info.framesize = maxsize + .__info.commonframe.size
  end if
  restore maxsize, msgcounter, msglist
  purge err@endp
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































Changes to freshlib/macros/Win32/allmacros.inc.














1
2
3
4














include '_winproc.inc'
include '_import.inc'
include '_export.inc'
include '_exceptions.inc'

>
>
>
>
>
>
>
>
>
>
>
>
>
|



>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Combined include of all Win32 specific macros.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

include '_import.inc'
include '_export.inc'
include '_exceptions.inc'
include '_com32.inc'

Changes to freshlib/macros/_datamacros.inc.















































1
2
3
4
5
6
7














































macro IndexedStrings [lparam, string] {
  forward
    local ..lbl
    dd  ..lbl, lparam
  common
    dd  0
  forward
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Several data definition/manipulation macros.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

macro zalign number*, fill {
  local ..sz
  if fill eq
    align number
  else
    virtual
      align number
      ..sz = $ - $$
    end virtual
    db ..sz dup fill
  end if
}


macro getfile lblname*, filename* {
  if used lblname
    lblname file filename
    .size = $ - lblname
  end if
}

macro StringTable [string] {
  forward
    local ..lbl
    dd  ..lbl
  common
    dd  0
  forward
..lbl db string, 0
}


macro IndexedStrings [lparam, string] {
  forward
    local ..lbl
    dd  ..lbl, lparam
  common
    dd  0
  forward
15
16
17
18
19
20
21
22













































































  macro seqname [name] \{
    name = seqname#.current
    seqname#.current = seqname#.current + 1
    if defined seqname#.display & seqname#.display
      disp iconInfo, `seqname, ' value: ', \`#name, ' = $', <name, 16>, $0d
    end if
  \}
}





















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
  macro seqname [name] \{
    name = seqname#.current
    seqname#.current = seqname#.current + 1
    if defined seqname#.display & seqname#.display
      disp iconInfo, `seqname, ' value: ', \`#name, ' = $', <name, 16>, $0d
    end if
  \}
}





struc StripText source_file, syntax {
local ..lbl, source, string, len, rawlen, char, pchar, j, flag, quot

  label . byte
  ..lbl:
        rb len
  .length = len
        dd 0

  virtual at 0
    source::
    string file source_file
           rawlen = $
  end virtual

  if rawlen = 0
    err
  end if

  j = 0
  pchar = ' '
  flag = 1
  quot = 0

  repeat rawlen
    load char byte from source:(%-1)

    if ~quot & (syntax eq SQL)
      if flag
        if (char = '*' & pchar = "/") | (char = "-" & pchar = "-")
          flag = 0
          char = ' '
          pchar = ' '
          j = j - 1
        end if
      else
        if (char = "/" & pchar = "*" ) | char = 13 | char = 10
          flag = 1
          char = ' '
          pchar = ' '
        end if
      end if
    end if

    if flag & (char = "'" | char = '"' | char = "`") & (syntax eq SQL)
      if ~quot
        quot = char
      else
         if quot = char
           quot = 0
         end if
      end if
    end if

    if ~quot & ( char < ' ' )
      char = ' '
    end if

    if quot | (flag & ( char > ' ' | (char = ' ' & pchar<>' ')))
      if j < len
        store byte char at ..lbl + j
      end if
      j = j + 1
    end if

    pchar = char

  end repeat

  len = j

}

Added freshlib/macros/_dispatch.inc.



















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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


macro dispatch arg {  ; begins procedure instructions
  common
    local ..caselist, ..caseaddr, ..casesize

    case@size equ ..casesize
    case@list equ ..caselist
    case@addr equ ..caseaddr

    macro oncase idname \{
      \local ..offset

      store byte $3d at ..caseaddr               ; cmp eax, dword imm    ; 5 bytes
      store dword idname at ..caseaddr+1
      ..caseaddr = ..caseaddr + 5
      ..offset = $ - ..caseaddr - 2

      store word $840f at ..caseaddr             ; je dword offset       ; 6 bytes
      store dword ..offset - 4 at ..caseaddr+2
      ..caseaddr = ..caseaddr + 6
    \}


    mov  eax, arg

    ..caselist:
    ..caseaddr = $

    rb ..casesize
}


macro enddispatch {
  case@size = case@addr - case@list
  restore case@size, case@addr, case@list
  purge oncase
}



Changes to freshlib/macros/_display.inc.















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














iconWarning = 1
iconError = 2
iconInfo = 3
iconFind = 4
iconNone  = 5
iconDebug = 6


macro __digit num
{
   if num < 10
    display '0'+num
   else
    display 'A'+num-10
   end if
}


macro __disp arg1,arg2
{
   if arg2 eq
    display arg1
   else
    local ..tmp


    ..tmp = arg1




    virtual at 0
     repeat 32
      if ..tmp > 0
       db ..tmp mod arg2
       ..tmp = ..tmp / arg2
      end if
     end repeat
     repeat $
      load ..tmp byte from $-%
      __digit ..tmp
     end repeat
     if $ = 0
      display '0'
     end if
    end virtual
   end if
}

macro disp [arg] { __disp arg }


macro DispSize Text, Sz {


  if defined options.ShowSizes & options.ShowSizes


    disp 3,"Sizeof [", Text, "] is: "




    if Sz>10000

      disp <Sz/1024,10>, 'K',$0d,$0a
    else
      disp <Sz,10>, ' bytes.',$0d,$0a

    end if
  end if
}
>
>
>
>
>
>
>
>
>
>
>
>
>
>


















|




|
>
>
|
>
>
>
>


















|



>
>

>
>
|
>
>
>
>
|
>
|
|
|
>



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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Macro library for displaying compile time messages.
;
;  Target OS: Any (FASM compiler)
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

iconWarning = 1
iconError = 2
iconInfo = 3
iconFind = 4
iconNone  = 5
iconDebug = 6


macro __digit num
{
   if num < 10
    display '0'+num
   else
    display 'A'+num-10
   end if
}


macro _disp arg1, arg2
{
   if arg2 eq
    display arg1
   else
    local ..tmp, ..val

    if arg1 relativeto 0
      ..tmp = arg1
    else
      ..tmp = rva arg1
    end if

    virtual at 0
     repeat 32
      if ..tmp > 0
       db ..tmp mod arg2
       ..tmp = ..tmp / arg2
      end if
     end repeat
     repeat $
      load ..tmp byte from $-%
      __digit ..tmp
     end repeat
     if $ = 0
      display '0'
     end if
    end virtual
   end if
}

macro disp [arg] { _disp arg }


macro DispSize Text, Sz {
  local size
  size = Sz;
  if defined options.ShowSizes & options.ShowSizes
    if ~(defined options.SkipZeroSizes & options.SkipZeroSizes & Sz=0)
      if Text eqtype "A"
        disp 3,"Sizeof [", Text, "] is: "
      else
        disp 3,"Sizeof [", `Text, "] is: "
      end if

      if Sz>10000
        size = size / 1024
        disp <size,10>, 'K',$0d,$0a
      else
        disp <size,10>, ' bytes.',$0d,$0a
      end if
    end if
  end if
}

Added freshlib/macros/_executable.inc.





























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Executable file formating macro library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Includes OS dependent versions of the library.
;_________________________________________________________________________________________


include '%TargetOS%/_executable.inc'


macro module name {
  ___StartLibAddress = $
  ___LibraryName equ name
}

macro endmodule {
  DispSize ___LibraryName, $-___StartLibAddress
  restore ___LibraryName
}


macro uses [libname] {
forward
  local nm, fn
  nm equ libname
  fn equ '%lib%/imports/%TargetOS%/'#`libname#'.inc'
  match name:filename, libname \{
    nm equ name
    fn equ filename
  \}
  ppAddUniqueList DynamicLibList, nm#:#fn
}

ppInitList DynamicLibList




Changes to freshlib/macros/_globals.inc.

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
;**********************************************
; Macros for global variables handling.
; This macro library is part of Fresh project.
;
; (C)2003, 2004, 2010
;
; Authors:
;   John Found
;   Tomasz Grisztar
;
; usage:
;   1. Include this library in the begining
;      of your source file.
;   2. Use it as blocks anywhere in the source.
;        iglobal
;           somelabel dd 1234h
;           otherlabel RECT
;           lbl3       db 12h
;        endg
;
;   3. Data section must be at the end of the
;      source file. Use 'IncludeAllGlobals' to
;      really define variables.
;
;**********************************************




;------------------------------------------------------------------
; use "iglobal" for inserting initialized global data definitions.
;------------------------------------------------------------------
macro iglobal {
  IGlobals equ IGlobals,
  macro __IGlobalBlock \{
|
|
|
|
<

<
|
<

<
<
<
<
<
<
<
<
|

<
<
|

<
|
|
<







1
2
3
4

5

6

7








8
9


10
11

12
13

14
15
16
17
18
19
20
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|

;

;   Description: Macto library for global variables handling.

;








;   Target OS: Any
;


;   Dependencies:
;

;   Notes:
;_________________________________________________________________________________________


;------------------------------------------------------------------
; use "iglobal" for inserting initialized global data definitions.
;------------------------------------------------------------------
macro iglobal {
  IGlobals equ IGlobals,
  macro __IGlobalBlock \{
77
78
79
80
81
82
83


84




85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

104
105
106
107
108
109
110
111
112


113
114

115
116
117
118
119

120
121
122


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
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
235
236
237
238
  \}
  match U, UGlobals \{
    U
  \}
}










macro InitStringList {
  local r,v,c
  c equ 0

  struc text [val] \{
    \common
      if ~val eqtype 1
      virtual at 0
    \forward
        db val
    \common
      .length = $
      end virtual
      end if
    rept 1 x:c+1 \\{
      c equ x
      r\\#x equ .
      v\\#x equ val

    \\}
  \}

  macro __IncludeAllStrings \{
    \common
    \local ..start, len, i, j, f, ch1, ch2
    label ..start byte
    if defined options.ShowSizes and options.ShowSizes
      disp 3, 'String data address: $', <..start, 16>, 13


    end if


    rept c x \\{
      if ~v\\#x eqtype 1
        r\\#x db v\\#x, 0
      else
        label r\\#x byte at v\\#x

      end if
    \\}
  \}


}

;macro InitStringList {
;  local r,v,c
;  c equ 0
;  struc string [val] \{
;    \common
;    rept 1 x:c+1 \\{
;      c equ x
;      r\\#x equ .
;      v\\#x equ val
;    \\}

;  \}
;
;  macro __IncludeAllStrings \{
;    \common
;    \local ..start
;    label ..start byte
;    if defined options.ShowSizes and options.ShowSizes
;      disp 3, 'String data address: $', <..start, 16>, 13


;    end if
;    rept c x \\{
;      \\common
;      \\forward
;      \\local len, i, j, f, ch1, ch2, hash, hash2
;      if ~v\\#x eqtype 1
;        virtual at 0
;          db v\\#x, 0
;          len = $
;
;          i = 0
;          hash = 1234


;          while i<len





;            load ch1 byte from i
;            hash = hash + ch1
;            i=i+1




;          end while
;        end virtual

;

;        i = ..start
;        j = 0
;        f = 0
;        while i<=($-len)
;          j = 0
;          f = 0
;          hash2 = 1234
;          while j<len



;            load ch1 byte from i+j
;            hash2=hash2+ch1
;            if hash2>=hash
;              break
;            end if
;            j=j+1
;          end while
;

;          if hash2=hash
;            j=0
;            while j<len
;              load ch1 byte from i+j
;              virtual at 0

;                db v\\#x, 0

;                load ch2 byte from j
;              end virtual
;              if ch1 <> ch2
;                break
;              end if
;              j=j+1

;            end while
;            if (ch1 =0) & (ch2 = 0)

;              f = 1
;              break
;            end if

;          end if

;          i = i + 1
;        end while



;
;        if ~f
;          r\\#x db v\\#x, 0
;          sizeof.#r\\#x = len
;        else
;          label r\\#x byte at i
;        end if

;      else
;        label r\\#x byte at v\\#x
;      end if

;    \\}
;  \}
;}

InitStringList


macro IncludeAllGlobals {
  local begin

  begin = $
  IncludeIGlobals
  DispSize 'Initialized data', ($ - begin)

  begin = $
  __IncludeAllStrings
  DispSize 'String data', ($ - begin)



  begin = $
  IncludeUGlobals
  DispSize 'Uninitialized data', ($ - begin)
}









iglobal
endg

uglobal
endg







>
>

>
>
>
>

<
<
|

|
|
<
<
<
<
<
<
<
<
|
|
|
<
>



|
|
|
|
|
|
>
>
|

>
|
<
<
<
|
>
|
|
<
>
>
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
>
>
|
|
|
<
<
|
|
|
|
<
|
|
>
>
|
>
>
>
>
>
|
<
|
>
>
>
>
|
|
>
|
>
|
<
<
<
<
<
|
|
>
>
>
|
|
<
<
|
|
<
|
>
|
|
|
<
|
>
|
>
|
|
<
|
|
<
>
|
|
>
|
|
|
>
|
>
|
<
>
>
>
|
|
<
|
<
<
<
>
|
<
|
>
|
<
<

<

|
<
|
|
|
|
<
|
|
<
<
>
>
|
<
<
<
|

>
>
>
>
>
|







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
97
98
99



100
101
102
103

104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119

120
121
122
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
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
  \}
  match U, UGlobals \{
    U
  \}
}


macro __InitStringEngine {
local ..hashtable, ..strbase, strlist

  virtual at 0
    ..hashtable::
         dd 65536 dup ($ffffffff)
  end virtual



  strlist equ 0

  struc text [arg] \{
  \common








    rept 1 x:strlist+1 \\{
      strlist equ x
      strlist\\#x equ ., arg

      .@here = 0
    \\}
  \}

  macro _add_one_str lbl, [dta] \{
  \common
    \local ..buff, sz, h, sh, ch1, ch2, i, f
    if used lbl
      virtual at 0
        ..buff::
            db dta, 0
            sz = $
      end virtual

      h = $811C9DC5
      repeat sz



        load ch1 byte from ..buff:(%-1)
        h = ((h xor ch1) * $01000193) and $ffffffff
      end repeat


      h = ((h shr 16) xor h) and $ffff
      sh = h

      while 1
        load i dword from ..hashtable: h*4
        if i = $ffffffff
          break
        else
          f = 1
          repeat sz/8
            load ch1 qword from ..buff:((%-1)*8)
            load ch2 qword from $$+i+(%-1)*8
            if ch1<>ch2
              f = 0
              break
            end if

          end repeat
          if f
            repeat sz mod 8
              load ch1 byte from ..buff:((sz and $fffffff8)+(%-1))
              load ch2 byte from $$+i+(sz and $fffffff8)+(%-1)
              if ch1<>ch2
                f = 0
                break
              end if
            end repeat
          end if


          if f
            break
          end if
        end if

        h = (h+1) and $ffff
        if h = sh
          err "Hash table full."
        end if
      end while
      if i = $ffffffff
        store dword $-$$ at ..hashtable:4*h
        lbl db dta, 0
        align 4
      else
        label lbl byte at i+$$

      end if
      lbl\#.length = sz-1
    else
      if defined options.ShowSkipped & options.ShowSkipped
        display 1, 'String <', dta, '> skipped, because not used.', 13
      end if
    end if
  \}

  macro _IncludeAllStrings \{
    ..strbase:





    rept strlist x \\{
      match onestr, _add_one_str strlist\\#x \\\{ onestr \\\}
    \\}
  \}
}




__InitStringEngine



macro IncludeAllGlobals {
  local ..start

  align 4

  ..start = $
  disp 3, 'Initialized data address: $', <..start, 16>, 13
  IncludeIGlobals
  DispSize 'Initialized data', ($ - ..start)

  align 4

  ..start = $
  disp 3, 'Strings address: $', <..start, 16>, 13

  _IncludeAllStrings
  DispSize 'String data', ($ - ..start)

  align 4
  ..start = $
  disp 3, 'I18n strings data:', <..start, 16>, 13
  __IncludeI18nStrings
  DispSize 'I18n strings data', ($ - ..start)

  align 4
  ..start = $

  disp 3, 'Uninitialized data address: $', <..start, 16>, 13
  IncludeUGlobals
  DispSize 'Uninitialized data', ($ - ..start)

  align 4

  ..start = $



  disp 3, 'I18n strings placeholders: $', <..start, 16>, 13
  IncludeI18nLabels

  DispSize 'I18n strings placeholders', ($ - ..start)
}






macro var expr {

common
  match name==value, expr \{
    if used name
      name dd value

    else
      name = 0


    end if
  \}
}





macro movx target, txt {
common
  local ..txt
  ..txt text txt
        mov     target, ..txt
}


iglobal
endg

uglobal
endg

Added freshlib/macros/_itext.inc.





















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122

; r - list with the labels
; v - list with the values
; c - counter for the strings
; lc - counter for the languages
; ll - list with the languages

macro __InitI18nEngine {
  local r, v, c, lc, lf, ll
  c equ 0
  lc equ 0

  macro _max_length lbl, [arg] \{
  \common
    \local max
    max=0
  \forward
     virtual at 0
       match lang:text, arg \\{
         db text
         if $ > max
           max = $
         end if
       \\}
     end virtual
   \common
     lbl\#.maxlen = max
  \}

  struc itext [val] \{
    \common
    .@here = 0
    \local max
      rept 1 x:c+1 \\{
        c equ x
        r\\#x equ .
      \\}
    _max_length ., val
    \forward
      match lang:text, val \\{
        rept 1 x:c \\\{
          v\\\#lang\\\#x equ text
        \\\}
        lf equ FALSE
        rept lc x:1 \\\{
          match =lang, ll\\\#x \\\\{
            lf equ TRUE
          \\\\}
        \\\}
        match =FALSE, lf \\\{
          rept 1 x:lc+1 \\\\{
            lc equ x
            ll\\\\#x equ lang
          \\\\}
        \\\}
      \\}
  \}

  macro __IncludeI18nStrings \{
    \common

    label I18nLanguages dword
    rept lc y \\{ match lang, ll\\#y \\\{
      dd \\\`lang
      dd Language\\\#lang
    \\\} \\}
    if lc>0
      dd 0
    end if

    rept lc y \\{ match lang, ll\\#y \\\{

      times (($ + 15) and $fffffff0) - $ db 0

      label Language\\\#lang byte

      rept c x \\\\{
        \\\\local f
        f equ TRUE
        match =v\\\\#lang\\\\#x, v\\\\#lang\\\\#x \\\\\{
          f equ FALSE
        \\\\\}

        times (($ + 3) and $fffffffc) - $ db 0

        match lbl1, r\\\\#x \\\\\{
          label lbl1\\\\\#.\\\\\#lang byte
        \\\\\}

        match =TRUE, f \\\\\{
          db v\\\\\#lang\\\\\#x
          db 0
        \\\\\}

        match lbl1, r\\\\#x \\\\\{
          match lbl2, lbl1\\\\\#.\\\\\#lang \\\\\\{
            times (lbl1\\\\\\#.maxlen - ($ - lbl2)+1) db 0
          \\\\\\}
        \\\\\}

      \\\\}
      Language\\\#lang\\\#.length = $ - Language\\\#lang
    \\\} \\}
  \}

  macro IncludeI18nLabels \{
    \common
    label I18nStrings byte

    rept c x \\{
      rb (($ + 3) and $fffffffc) - $
      match lbl, r\\#x \\\{
        lbl rb lbl\\\#.maxlen
            rb 1
      \\\}
    \\}

    I18nStrings.length = $ - I18nStrings
  \}
}

__InitI18nEngine

Added freshlib/macros/_minihash.inc.





























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
; Pearsons hash function table:

struct TPHashItem
  .pKeyname    dd ?     ; pointer to the key name. on [.pKeyname-1] is 1 byte key length.
  .Value       dd ?     ; user defined value of the hash table cell.
ends

;
; Builds static Pearsons hash table.
; The table contains 256 elements of TPHashItem (in total 2048 bytes)
;
; Arguments:
;   table - the lable of the hash table.
;   Pfunc - table of 256 random (or not random) bytes - values of the Pearsons hash function.
;   key   - string that to be hashed. Pointer to this string is placed in the .pKeyname field of
;           the respective record of the hash table. The hash of the key is computed case insensitive.
;   value - user data. Placed in the .Value field of the respective TPHashItem element.
;
; Notice, that the table does not resolve hash collisions. If collision happens, the compilation ends
; with error. The conflict can be resolved in two ways - changing the hash function in order to
; avoid collisions, or changing the key that causes collision.
;
macro PHashTable table, Pfunc, [key, value] {
common
if used table
  local ..error
  ..error = 0

  if defined options.ShowHashes & options.ShowHashes
    disp 3, 'Hash table "', `table, '"', 9
  end if

  table dd 256 dup(0,0)

forward
local ..keynm, ..len, ..hash, ..char, ..prev

          db ..len
  ..keynm db key
  ..len = $ - ..keynm
         db 0

  if value
    ..hash = 0
    repeat ..len
      load ..char byte from ..keynm + % - 1
      if ..char and $40
        ..char = ..char or $20
      end if
      ..hash = ..hash xor ..char
      load ..hash byte from Pfunc + ..hash
      store byte ..char at ..keynm + % - 1
    end repeat

    if defined options.ShowHashes & options.ShowHashes
      disp 3,'Keyword hash : ', <..hash, 10>, ' on "', key, '"', 10
    end if

    load ..prev dword from table + ..hash * 8

    if ..prev = 0
      store dword ..keynm at table + ..hash * 8
      store dword value at table + ..hash * 8 + 4
    else
      disp 2,'Hash collision: ', <..hash, 10>, ' on "', key, '"', 10
      ..error = 1
    end if
  end if

common
  if defined options.ShowHashes & options.ShowHashes
    disp 6, '---', 13
  end if
  assert ~..error

  end if
}

;
; Computes the Pearsons hash in the same way as PHashTable macro.
; Useful for defining constants with the hash value of some key.
;
; usage:
;   MyHashConst phash PFUNK, "my_string"
;
struc phash Pfunc, key {
local ..keynm, ..len, ..hash, ..char

  virtual at 0
    ..keynm::
      db key
    ..len = $
  end virtual

  ..hash = 0
  repeat ..len
    load ..char byte from ..keynm:(% - 1)
    if ..char and $40
      ..char = ..char or $20
    end if
    ..hash = ..hash xor ..char
    load ..hash byte from Pfunc + ..hash
  end repeat

  if defined options.ShowHashes & options.ShowHashes
    disp 3,'Keyword hash : ', <..hash, 10>, ' on "', key, '"', 10
  end if

  . = ..hash
}

Added freshlib/macros/_realobjects.inc.





















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
cParamMask = $fffe0000
cMethodMask = $ffff0000


macro __search_method flag, num, count, list, cname, method {
  define flag FALSE
  rept count i:1 \{ match mname, method \\{ match class | name , list\\#i \\\{ match =mname, name \\\\{
    define flag TRUE
    num equ i
  \\\\} \\\} \\} \}
}


macro object name, parent {
  obj@name   equ name
  obj@parent equ parent

  name#.param?num = 0

  name#@count equ 0

  match any, parent \{
    name\#@count equ parent\#@count
    rept parent\#@count i:1 \\{
      name\\#@method\\#i equ parent\\#@method\\#i
      match class | mname, parent\\#@method\\#i \\\{
        name\\\#mname\\\#.arguments equ parent\\\#mname\\\#.arguments
      \\\}
    \\}
  \}

  macro param paramname*, getval*, setval* \{
    paramname = name#.param?num or cParamMask
    name#.param?num = name#.param?num + 1

      if getval eq NONE
        paramname\#.get = -1
      else
        paramname\#.get = getval
      end if

      if setval eq NONE  ; read only
        paramname\#.set = -1
      else
        if setval eqtype 1
          paramname\#.set = setval
        else
          match name : arg, setval \\{
            paramname\\#.set = name
            paramname\\#.set.arg = arg
          \\}
        end if
      end if
  \}

  macro method mname, [marg] \{
  \common
  \local f1, n1
    name\#mname\#.arguments equ marg
    define f1 FALSE
    __search_method f1, n1, name\#@count, name\#@method, parent, mname
    match =FALSE, f1 \\{
      rept 1 x:name\\#@count+1 \\\{
        name\\\#@count equ x
        name\\\#@method\\\#x equ name | mname
;        display 3,'New method:', \\\`name,\\\`mname, ' = ', \\\`x, 13, 10
        methods.\\\#name\\\#mname\\\#.inherited equ NONE
      \\\}
    \\}
    match =TRUE, f1 \\{
      match num, n1 \\\{
        match class | mmname, name\\\#@method\\\#num \\\\{
          methods.\\\\#name\\\\#mname\\\\#.inherited equ methods.\\\\#class\\\\#mmname
        \\\\}
        name\\\#@method\\\#num equ name | mname
;        display 3,'Redefinition:', \\\`name,\\\`mname, ' = ', \\\`num, 13, 10
      \\\}
    \\}
  \}

  macro abstract mname, [marg] \{
  \common
    method mname, marg
    methods.\#name\#mname = 0
  \}


  macro name#@members \{
    macro method mname, [marg] \\{ \\}
    macro abstract mname, [marg] \\{ \\}
    match any, parent \\{
      parent\\#@members
    \\}
    purge method, abstract
}


endobj fix } obj_helper

macro stack_arguments method, [arg] {
common
  virtual at ebp+8
forward
    method#arg dd ?
;    display 1, `method, "::::", `arg, 13
common
  end virtual
}

macro obj_helper {
  local f1
  match name, obj@name \{
    local vtable

    virtual at 0
      name dd ?           ; pointer to the methods table.
      name\#@members

      sizeof.\#name = $
    end virtual

    rept name\#@count i:1 \\{
      match class | meth, name\\#@method\\#i \\\{
        name\\\#meth = (i-1) or cMethodMask
        f1 equ TRUE
        match =class\\\#meth\\\#.arguments, class\\\#meth\\\#.arguments \\\\{ f1 equ FALSE \\\\}
        match =TRUE, f1 \\\\{
          match args, class\\\\#meth\\\#.arguments \\\\\{
            stack_arguments meth, args
          \\\\\}
        \\\\}
      \\\}
    \\}

    label vtable
    label vtables.\#name dword

    if used vtables.\#name\#.parent | used vtables.\#name
      .parent dd 0
    end if

    match parent, obj@parent \\{
      if defined vtables.\\#parent\\#.parent
        store dword vtables.\\#parent\\#.parent at .parent
      end if
    \\}

    if used vtables.\#name
      .mcount dd name\#@count     ; methods count
      rept name\#@count i:1 \\{
        match class | meth, name\\#@method\\#i \\\{
            dd methods.\\\#class\\\#meth
        \\\}
      \\}
    end if
    .size = $ - vtable
  \}
  purge method, param
  restore obj@name, obj@parent
}


macro method name {
  local f1, f2
  define f1 TRUE
  if used methods.#name
    match =NONE, methods.#name#.inherited \{
      define f1 FALSE
      dd 0
    \}
    match =TRUE, f1 \{
      dd methods.\#name\#.inherited
    \}
  end if
  match =name#.arguments, name#.arguments \{
    "Error! Method not defined in any object."
  \}

  f2 equ FALSE
  match arguments, name#.arguments \{
    f2 equ TRUE
    proc methods.\#name, .self, arguments
  \}
  match =FALSE, f2 \{
    proc methods.\#name, .self
  \}
  name#.@here = 1
}



; Object manipulation macros. They all generate some assembly code and its syntax is
; designed to resemble the usual assembly language syntax. These macros are some
; kind of quasiinstructions.

; These macros uses FreshLib in order to allocate/deallocate dynamic memory.



macro create target, class, [arg] {
common
   if ~target eq eax
        push    eax
   end if

        stdcall GetMem, sizeof.#class
        mov     dword [eax], vtables.#class

   if ~target eq eax
        mov     target, eax
        pop     eax
   end if

reverse
   if ~arg eq
        pushx   arg
   end if
common

   if defined class#.Create & (class#.Create and $ffff0000) = cMethodMask
        exec    target, class#:Create
   end if
}


macro destroy ptrObj {
   if defined TObject.Destroy & (TObject.Destroy and $ffff0000) = cMethodMask
        push    eax
        exec    ptrObj, TObject:Destroy
        pop     eax
   end if
       stdcall  FreeMem, ptrObj
}


macro exec ptrobj, method, [arg] {
common
  local ind
        ind equ NONE
        match class:meth, method \{
          ind equ class\#.\#meth
        \}

        match =NONE, ind \{
          disp 2, "Error! Invalid syntax. Use class:method.", 13, 10
          err
        \}

        if defined ind & ~(ind and $ffff0000) = cMethodMask
          match meth, ind \{
            disp 2, 'Error! ', \`meth, ' is not a method.', 13, 10
            err
          \}
        end if

reverse
        if ~arg eq
          pushx   arg
        end if
common
        if ptrobj eqtype 1
          pushd [ptrobj]
        else
          pushd   ptrobj          ; push .self argument
        end if

        if ptrobj eqtype eax
          mov  eax, [ptrobj]
        else
          if ptrobj eqtype 1
            mov  eax, [ptrobj]
            mov  eax, [eax]
          else
            mov  eax, ptrobj
            mov  eax, [eax]
          end if
        end if

        call dword [eax+8+4*(ind and $ffff)]
}


macro getm  target, ptrobj, method {
  local ind
  ind equ NONE
  match class:meth, method \{
    ind equ class\#.\#meth
  \}

  match =NONE, ind \{
    disp 2, "Error! Invalid syntax. Use class:method.", 13, 10
    err
  \}

  if defined ind & ~(ind and $ffff0000) = cMethodMask
    match meth, ind \{
      disp 2, 'Error! ', \`meth, ' is not a method.', 13, 10
      err
    \}
  end if

  if ~target eq eax
    push  eax
  end if

  if ptrobj eqtype eax
    mov  eax, [ptrobj]
  else
    if ptrobj eqtype 1
      mov  eax, [ptrobj]
      mov  eax, [eax]
    else
      mov  eax, ptrobj
      mov  eax, [eax]
    end if
  end if

  push  dword [eax+8+4*(ind and $ffff)]
  pop   target

  if ~target eq eax
    pop eax
  end if
}


macro inherited [arg] {
common
  if ~arg eq
reverse
    pushx arg
common
  end if
  push [.self]
  call  dword [.__info.start-4]
}



macro get target, obj, param {
local flag

  flag equ FALSE

  match class:par, param \{
    flag equ TRUE
  \}

  match =FALSE, flag \{
    disp 2, "Error! Invalid syntax. Use class:method.", 13, 10
    err
  \}

  match class:par, param \{

    if class\#.\#par\#.get < sizeof.\#class ; field
      if obj eqtype eax
        if target eqtype eax
          mov target, [obj+class\#.\#par\#.get]
        else
          pushd [obj+class\#.\#par\#.get]
          popd  target
        end if
      else
        if ~target eq eax
          push eax
        end if
        if obj eqtype 1
          mov eax, [obj]
        else
          mov eax, obj
        end if
        if target eqtype eax
          mov target, [eax+class\#.\#par\#.get]
        else
          pushd [eax+class\#.\#par\#.get]
          popd  target
        end if
        if ~target eq eax
          pop eax
        end if
      end if
    else        ; by method
      if ~target eq eax
        push eax
      end if
      exec obj, class\#:\#par\#.get
      if ~target eq eax
        mov target, eax
        pop eax
      end if
    end if
  \}
}


macro set obj, param, value {
local flag

  flag equ FALSE

  match class:par, param \{
    flag equ TRUE
  \}

  match =FALSE, flag \{
    disp 2, "Error! Invalid syntax. Use class:method.", 13, 10
    err
  \}

  match class:par, param \{

    if class\#.\#par\#.set < sizeof.\#class ; field
      if obj eqtype eax
        if value eqtype eax
          mov [obj+class\#.\#par\#.set], value
        else
          pushd value
          popd  [obj+class\#.\#par\#.set]
        end if
      else
        if value eq eax
          push ecx
          mov  ecx, obj
          mov [ecx+class\#.\#par\#.set], value
          pop ecx
        else
          push eax
          mov  eax, obj
          if value eqtype eax
            mov [eax+class\#.\#par\#.set], value
          else
            pushd value
            popd  [eax+class\#.\#par\#.set]
          end if
          pop eax
        end if
      end if
    else        ; by method
      push eax
      if defined class\#.\#par\#.set.arg
        if  class\#.\#par\#.set.arg = 3
          exec obj, class\#:\#par\#.set, class\#.\#par, class\#.\#par\#.get, value
        else
          if class\#.\#par\#.set.arg = 2
            exec obj, class\#:\#par\#.set, class\#.\#par, value
          else
            if class\#.\#par\#.set.arg = 1
              exec obj, class\#:\#par\#.set, value
            else
              disp 2, "Error! The set method can have only 1 or 2 arguments in this implementation.", 13, 10
              err
            end if
          end if
        end if
      else
        exec obj, class\#:\#par\#.set, value
      end if
      pop  eax
    end if
  \}
}


; returns ZF = 1 if the type matches
; returns ZF = 0 if the type does not matches.

macro istype ptrobj, class {
  local ..itis, ..loop
        push    ecx

  if ptrobj eqtype eax    ; register
    if ~ptrobj eq ecx
        mov     ecx, ptrobj
    end if
  else
        mov     ecx, ptrobj
  end if

        test    ecx, ecx

..loop:
        mov     ecx, [ecx]    ; get vtable, or the parent vtable
        jecxz   ..itis        ; if jump, ZF=0
        cmp     ecx, vtables.#class
        jne     ..loop
; here ZF = 1
..itis:
        pop     ecx
}

Changes to freshlib/macros/_stdcall.inc.

1
2









3

4
5
6
7
8
9
10
11
;-----------------------------------------
; This file is part of Fresh standard









; macro library.

;-----------------------------------------

macro locals {
  local ..locsize
  locsize equ ..locsize
  virtual at ebp - ..locsize - .__info.commonframe.size
  @@:
}
|
|
>
>
>
>
>
>
>
>
>
|
>
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Macros for create and call of high level procedures.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


macro locals {
  local ..locsize
  locsize equ ..locsize
  virtual at ebp - ..locsize - .__info.commonframe.size
  @@:
}
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
  restore locsize
}


macro err@endp { }


macro proc name, [arg] {
  common
    \err@endp

    macro err@endp \{
      end if
      Missing 'endp' or 'endwp' before the procedure.
    \}





  name:
    .__info.id = 1


    virtual at ebp+8
      if ~ arg eq
        forward
          arg dd ?
          if ~ defined name#arg
            ERROR! the argument `arg MUST begins with dot
          end if
        common
      end if
        .__info.argsize = $-ebp-8
    end virtual

    if ~ used name
      if defined options.ShowSkipped & options.ShowSkipped
        display 1,'Procedure skiped: ',`name, $0d, $0a
      end if
    else

    virtual at ebp - .__info.commonframe.size
    .__info.commonframe.begin:
}































macro begin {
      rb (4 - ($ - .__info.commonframe.begin) and 11b) and 11b
      .__info.commonframe.size = $ - .__info.commonframe.begin
    end virtual

    local ..maxsize







|

|



|


>
>
>
>
|

>















|







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
  restore locsize
}


macro err@endp { }


macro proc2 name, [arg] {
  common
    err@endp

    macro err@endp \{
      end if
      Missing 'endp' before the procedure.
    \}

  if defined options.AlignCode & options.AlignCode
    align 16
  end if

  label name
    .__info.id = 1
    .__info.start = $

    virtual at ebp+8
      if ~ arg eq
        forward
          arg dd ?
          if ~ defined name#arg
            ERROR! the argument `arg MUST begins with dot
          end if
        common
      end if
        .__info.argsize = $-ebp-8
    end virtual

    if ~ used name
      if defined options.ShowSkipped & options.ShowSkipped
        display 1,'Procedure skipped: ',`name, $0d, $0a
      end if
    else

    virtual at ebp - .__info.commonframe.size
    .__info.commonframe.begin:
}


macro doas name1, name2, [arg] {
common
  proc2 name1, arg
}


macro proc name, [arg] {
common
  local ..norm

  define ..norm TRUE

  match pname =as iface, name \{
    define ..norm FALSE

    if ~defined interfaces.\#iface
      ERROR! Not defined \`iface interface.
    end if
    match interface, interface@\#iface \\{
      doas pname, interface
    \\}
  \}

  match =TRUE, ..norm \{
    proc2 name, arg
  \}
}


macro begin {
      rb (4 - ($ - .__info.commonframe.begin) and 11b) and 11b
      .__info.commonframe.size = $ - .__info.commonframe.begin
    end virtual

    local ..maxsize
116
117
118
119
120
121
122

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
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
235
236
237
  end if
}



macro endp {
    .__info.framesize = maxsize + .__info.commonframe.size

  end if
  restore maxsize
  purge err@endp
}














macro __InitInitializeEngine {
  local i,f,ci,cf
  ci equ 0
  cf equ 0

  macro initialize procname \{
    \common
    rept 1 x:ci+1 \\{
      ci equ x
      i\\#x equ procname
      proc procname
    \\}
  \}

  macro finalize procname \{
    \common
    rept 1 x:cf+1 \\{
      cf equ x
      f\\#x equ procname
      proc procname
    \\}
  \}


  macro InitializeAll \{
    \common
    rept ci x \\{



      \\forward
      call i\\#x
    \\}
  \}


  macro FinalizeAll \{
    \common
    rept cf x \\{
      \\reverse
      call f\\#x
    \\}
  \}
}

__InitInitializeEngine



;*****************************************
; Call macroses
;*****************************************














































macro stdcall proc, [arg] {    ; call procedure
common
  local ..argsize
  ..argsize = 0
  if ~ arg eq
reverse
    pushd arg
    ..argsize = ..argsize + 4
common
  end if
  if defined options.CheckArguments & options.CheckArguments
    if (defined proc#.__info.argsize) & (proc#.__info.argsize <> ..argsize)
      ERROR! wrong argument count for procedure call.
    end if
  end if

  call proc
}


macro invoke proc,[arg] {   ; invoke procedure (indirect)
common
  if ~ arg eq
reverse
    pushd arg
common
  end if
  call [proc]
}


macro ccall proc,[arg]                  ; call procedure in C calling convention
 { common local ..size
   ..size = 0
   reverse
   pushd arg
   ..size = ..size+4
   common
   call proc






   add esp,..size }





macro cinvoke proc,[arg]                ; invoke procedure (indirect)
 { common


    if ~ arg eq


     ccall [proc],arg


    else




















     call [proc]



    end if }






;****************************************
; INT3 break point, when first = second.
;****************************************

macro BreakEq first, second {
  local .lbl







>






>
>
>

>
>
>
>
|

>

|
<
<
|
|
<
|
<
<
<
|
<
<
|
<
<
<
<
<
<
<
<


|
|
<
>
>
>
|
<
<
<
>
|
<
<
<
<
<
<
<
|

<






>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







|




|
|











|






|
|

|
|

|

>
>
>
>
>
>
|
>
>
|
>
>
|
|
>
>
|
>
>
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
|

>
>
>
>







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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
  end if
}



macro endp {
    .__info.framesize = maxsize + .__info.commonframe.size
    .__info.codesize = $ - .__info.start
  end if
  restore maxsize
  purge err@endp
}


; Defines procedure interface, separate from the procedure body. Useful for
; portable libraries, where the body is an OS dependent, but the interface should not.
; Must be defined prior to the "body" definition.

macro interface name, [arg] {
common
  \interface@#name equ name, arg
  interfaces.#name = 1
}

; Defines procedure body, for already defined interface.

macro body name {


  if ~defined interfaces.#name
    ERROR! Not defined interface for `name procedure.

  end if



  match interface, interface@#name \{ proc interface \}


}










macro event name, [arg] {
common

  name dd ?
  interfaces.#name = 1
  interface@#name equ name
forward



  match var, interface@#name \{ \interface@#name equ var, .#arg \}
}













;*****************************************
; Call macroses
;*****************************************


macro pushx [arg] {
common
  local f1, f2, cnt, sz
  cnt = 0
  sz = 0
  f1 = 1
  f2 equ FALSE
forward
  match any, arg \{
    match `arg, arg \\{ f2 equ TRUE \\}
  \}

  cnt = cnt + 1
  if arg eqtype ''
    virtual at 0
      db arg
      sz = sz + $
    end virtual
  end if

common
  local lbl

  match =txt string, arg \{
    f1 = 0
    lbl text string
    f2 equ FALSE
  \}

  if (sz > 4) | (cnt>1)
    f1 = 0
  end if

  if f1
    pushd arg
  else
    pushd lbl
  end if
  match =TRUE, f2 \{ lbl text arg \}
}




macro stdcall proc, [arg] {    ; call procedure
common
  local ..argsize
  ..argsize = 0
  if ~ arg eq
reverse
    pushx arg
    ..argsize = ..argsize + 4
common
  end if
  if defined options.CheckArguments & options.CheckArguments
    if (proc eqtype 1) & (defined proc#.__info.argsize) & (proc#.__info.argsize <> ..argsize)
      display 1, 'Warning! Argument count on call of: <<',`proc, '>>  ', $0d
    end if
  end if

  call proc
}


macro invoke proc,[arg] {   ; invoke procedure (indirect)
common
  if ~ arg eq
reverse
    pushx arg
common
  end if
  call [proc]
}


macro ccall proc,[arg]  {                ; call procedure in C calling convention
common local ..size
   ..size = 0
reverse
   pushx arg
   ..size = ..size+4
common
   call proc
   if defined proc#.__info.argsize
     if proc#.__info.argsize > 0
       add esp, proc#.__info.argsize
     end if
   else
     if ..size > 0
       add esp,..size
     end if
   end if
}


macro cinvoke proc, [arg] {               ; invoke procedure (indirect)
common local ..size, ..ofs
   ..size = 0

   if ~ arg eq
reverse
   ..size = ..size + 4

common
   end if

   if defined options.AlignStackExt & options.AlignStackExt
     mov  [esp-$10], esp
     mov  [esp-$0c], esp
     mov  [esp-$08], esp
     mov  [esp-$04], esp

     sub  esp, ..size + 4
     and  esp, $fffffff0

     if ..size > 0
       add  esp, ..size
     end if
   end if

   if ..size > 0
reverse
     pushx arg
common
   end if

   call [proc]

   if ..size > 0
     add  esp, ..size
   end if

   if defined options.AlignStackExt & options.AlignStackExt
     mov  esp, [esp]
   end if
}

;****************************************
; INT3 break point, when first = second.
;****************************************

macro BreakEq first, second {
  local .lbl

Changes to freshlib/macros/_struct.inc.






1
2







3
4


5
















6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23





; structure definition helper








macro struct name {
  macro name@struct \{ name name \}


  macro size@struct \{ sizeof.#name = $ \}
















  struc name \{
}


ends fix } struct_helper


macro struct_helper {
  virtual at 0
    name@struct
    size@struct
  end virtual
  purge name@struc
  purge size@struct
}



>
>
>
>
>
|
|
>
>
>
>
>
>
>

|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>








<
|
<
<

<


<
<
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


; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Macro to make complex data structures.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

macro struct name {
  macro name@struct \{
    virtual at 0
      name name
      sizeof.#name = $
    end virtual
  \}
  struc name \{
}


macro rstruct name {
  macro name@struct \{
    \local ..start, ..size
    virtual at -..size
      ..start:
      name name
      ..size = $ - ..start
      sizeof.#name = ..size
    end virtual
  \}
  struc name \{
}


ends fix } struct_helper


macro struct_helper {

  name@struct


  purge name@struc

}



Added freshlib/macros/_uniquelists.inc.























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; list - name of the list.
; list@count - count of the list items.

macro __search_list flag, list, item {
forward
  flag equ FALSE
  rept list#@count i:1 \{ match iitem, item \\{ match =iitem, list\\#i \\\{ define flag TRUE \\\} \\} \}
}


macro ppAddUniqueList list, [listitem] {
forward
  local fFound
  __search_list fFound, list, listitem
  match =FALSE, fFound \{
    rept 1 x:list#\@count+1 \\{
      list\\#@count equ x
      list\\#x equ listitem
    \\}
  \}
}

macro ppInitList list {
  list#@count equ 0
}



macro __InitInitializeEngine {
  local i,f,ci,cf
  ci equ 0
  cf equ 0

  macro add_initialize procname \{
    \common
    rept 1 x:ci+1 \\{
      ci equ x
      i\\#x equ procname
    \\}
  \}

  macro add_finalize procname \{
    \common
    rept 1 x:cf+1 \\{
      cf equ x
      f\\#x equ procname
    \\}
  \}

  macro initialize procname \{
    \common
    rept 1 x:ci+1 \\{
      ci equ x
      i\\#x equ procname
      proc procname
    \\}
  \}

  macro finalize procname \{
    \common
    rept 1 x:cf+1 \\{
      cf equ x
      f\\#x equ procname
      proc procname
    \\}
  \}


  macro InitializeAll \{
    \common
    rept ci x \\{
      \\forward
      if defined i\\#x
        call i\\#x
      end if
    \\}
  \}

  macro FinalizeAll \{
    \common
    rept cf x \\{
      \\reverse
      if defined f\\#x
        call f\\#x
      end if
    \\}
  \}
}

__InitInitializeEngine

Changes to freshlib/macros/allmacros.inc.

















1
2
3

4
5



6
7
















include '_struct.inc'
include '_stdcall.inc'
include '_display.inc'

include '_globals.inc'
include '_datamacros.inc'




include '%TargetOS%/allmacros.inc'
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|

>


>
>
>


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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Includes all macro libraries at once.
;
;  Target OS:
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

include '_uniquelists.inc'
include '_executable.inc'
include '_stdcall.inc'
include '_struct.inc'
include '_display.inc'
include '_itext.inc'
include '_globals.inc'
include '_datamacros.inc'
include '_dispatch.inc'
include '_realobjects.inc'
include '_minihash.inc'

include '%TargetOS%/allmacros.inc'

Deleted freshlib/mouse/Linux/mouse.asm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
proc SetMouseCursor, .hCursor
begin
        push    ecx edx
        cinvoke XRootWindow, [hApplicationDisplay], 0
        cinvoke XDefineCursor, [hApplicationDisplay], eax, [.hCursor]
        pop     edx ecx
        return
endp


proc GetStockCursor, .index
begin
        push    ecx edx
        mov     eax, [.index]
        and     eax, 7
        movzx   eax, [_cursors+eax]
        cinvoke XCreateFontCursor, [hApplicationDisplay], eax
        pop     edx ecx
        return
endp

_cursors db 68, 152, 34, 108, 116, 40, 40, 150   ; X standard cursor font
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































Deleted freshlib/mouse/Win32/mouse.asm.

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
; OS depending part of mouse library.
; It provides needed cursors.
;
; ToDo: Arbitrary mouse cursors, B&W for the begining.

proc SetMouseCursor, .hCursor
begin
        push    ecx edx
        invoke  SetCursor, [.hCursor]
        pop     edx ecx
        return
endp


proc GetStockCursor, .index
begin
        push    ecx edx
        mov     eax, [.index]
        and     eax, 7
        movzx   eax, [_cursors+2*eax]
        invoke  LoadCursor, 0, eax
        pop     edx ecx
        return
endp


_cursors dw IDC_ARROW, IDC_IBEAM, IDC_CROSS, IDC_SIZEWE, IDC_SIZENS, IDC_SIZENWSE, IDC_SIZENESW, IDC_WAIT

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































Deleted freshlib/mouse/mouse.asm.

1
2
3
4
5
6
7
8
9
10
mcArrow = 0
mcText  = 1
mcCross = 2
mcSizeH = 3
mcSizeV = 4
mcSizeUL_LR = 5
mcSizeLL_UR = 6
mcWait      = 7

include '%TargetOS%/mouse.asm'
<
<
<
<
<
<
<
<
<
<




















Changes to freshlib/readme.txt.








1
2
3


4



5








6



7

8



9



10







FreshLib is standard Fresh library, containing macros, 
equates and code to allow writing of portable applications.



The test project, that uses FreshLib is "TestFreshLib.fpr"



You can compile and run it as Win32, or as Linux application.












In order to use FreshLib in your application you have to define

"lib" directory alias, either in the Fresh global aliases: 



"Options|IDE options|Directories",



or project specific one in "Project|Project options".
>
>
>
>
>
>
>
|


>
>
|
>
>
>
|
>
>
>
>
>
>
>
>

>
>
>
|
>
|
>
>
>
|
>
>
>
|
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
 _______________________________________________________________________________________
|                                                                                       |
| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
|                                                                                       |
| (c)2003, 2004, 2005, 2010, 2011, 2012 Fresh developement team                         |
|_______________________________________________________________________________________|

FreshLib is standard Fresh IDE library. FreshLib contains macros, 
equates and code to allow writing of portable applications.

FreshLib is free, open source project, distributed under the terms of 
"BSD 2-clause license". The text of the license is in the file "License.txt"

FreshLib is created and maintained by Fresh development team. Every member of the team
have some contribution to the project. Here is the list of people contributed to the
project (in order of appearance; newer first):

vid
pelaillo
scientica (Fredrik Klasson)
tommy 	  (Tommy Lilehagen)
VeSCeRa	  (Yunus Sina Gulsen)
roticv	  (Victor Loh)
decard 	  (Mateusz Tymek)
John Found 

Special thanks to Tomasz Grysztar for creating FASM.
Tomasz also provided some really useful macros.
_________________________________________________________________________________________

For additional information about Fresh and FreshLib, look at following locations:

http://fresh.flatassembler.net	- main site of the project Fresh.
http://board.flatassembler.net	- Flat assembler message board.
_________________________________________________________________________________________

The test project for FreshLib is "TestFreshLib.fpr"
You can compile and run it as Win32, or as Linux application. 
Use Fresh IDE or compile TestLib.asm file with FASM compiler.

Added freshlib/simpledebug/Dummy/debug.asm.





































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: SimpleDebug library.
;
;  Target OS: Dummy
;
;  Dependencies: Not dependent on other libraries.
;
;  Notes:
;_________________________________________________________________________________________


proc Output, .ptrStr
begin
        pushad
        popad
        return
endp



proc GetTimestamp
begin
        pushad
        popad
        return
endp




Added freshlib/simpledebug/KolibriOS/debug.asm.















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license.           |
;|_______________________________________________________________________________________|
;
;  Description: SimpleDebug library.
;
;  Target OS: KolibriOS
;
;  Dependencies: Not dependent on other libraries.
;
;  Notes:
;_________________________________________________________________________________________

DBG_CHAR_NEWLINE equ $0d, $0a

CONSOLE_X_SIZE = 128
CONSOLE_X_SHIFT = 7

CONSOLE_Y_SIZE = 256
CONSOLE_Y_SHIFT = 8

FONT_HEIGHT = 9
FONT_WIDTH  = 6

CONSOLE_TEXT_COLOR = $00000000
CONSOLE_BG_COLOR = $fffff0


if used CharOut | used STDIN | used STDOUT | used STDERR
initialize InitConsole
begin
        mov     eax, sys_threads
        mov     ebx, 1
        mov     ecx, ConsoleThread
        mov     edx, ConsoleSP
        int     $40

        mov     [hConsoleThread], eax

        return
endp

end if


uglobal
  if used ConsoleSP
                rd 16383
    ConsoleSP   dd ?
  end if

  if used DebugBuffer
    xDebugBuffer dd ?           ; current X position
    yDebugBuffer dd ?           ; current Y position
    rDebugBuffer dd ?           ; the top row of the console
    sDebugBuffer dd ?           ; start of the debug buffer.
    fDebugRefresh dd ?          ; flag that the console needs refresh.

    hConsoleThread dd ?

    DebugBuffer rb CONSOLE_X_SIZE * CONSOLE_Y_SIZE

    KeyboardHead   dd 0
    KeyboardTail   dd 0
    KeyboardBuffer rb 1024
  end if
endg



proc Output, .ptrString
begin
        push    eax esi

        mov     esi, [.ptrString]

.loop:
        lodsb

        test    al, al
        jz      .end_output

        stdcall CharOut, eax
        jmp     .loop

.end_output:
        pop     esi eax
        return
endp


; this one writes to the KolibriOS debug message board.

;proc Output, .ptrStr
;begin
;        pushad
;
;        mov     esi, [.ptrStr]
;        mov     eax, sys_msg_board
;        mov     ebx, 1
;
;.loop:
;        mov     cl, [esi]
;        test    cl,cl
;        jz      .finish
;        lea     esi, [esi+1]
;        int     $40
;        jmp     .loop
;
;.finish:
;        popad
;        return
;endp



proc GetTimestamp
begin
        pushad

        mov     eax, sys_getsetup
        mov     ebx, 9
        int     $40

        imul    eax, 10                 ; in [ms]
        mov     [esp+4*regEAX], eax
        popad
        return
endp


proc GetFineTimestamp
begin
        return
endp



proc ConsoleThread
.info __TThreadInfo
begin
        mov     eax, sys_process_def
        mov     ebx, 1
        mov     ecx, 0
        int     $40

        stdcall DrawConsole, 1

        mov     eax, sys_set_app_param
        mov     ebx, emaskRedraw or emaskGUIButton or emaskKeyboard or emaskMouse or emaskNetwork
        int     $40

.event_loop:
        cmp     [fDebugRefresh], 0
        jne     .redraw

        mov     eax, sys_wait_event_timeout
        mov     ebx, 1
        int     $40

        test    eax, eax
        jz      .event_loop

        cmp     eax, eventRedraw
        je      .redraw

        cmp     eax, eventKeyboard
        je      .keyboard

        cmp     eax, eventGUIButton
        je      .button

        cmp     eax, eventMouse
        je      .mouse

        cmp     eax, eventNetwork
        je      .network

        jmp     .event_loop

.network:
        jmp     .event_loop


.redraw:
        stdcall DrawConsole, [fDebugRefresh]
        mov     [fDebugRefresh], 0
        jmp     .event_loop

.keyboard:
        mov     eax, sys_getkey
        int     $40

;        jmp     .ascii
;
;        cmp     eax, 1
;        je      .event_loop
;
;        test    al, al
;        jz      .ascii
;
;        cmp     ah, keyUp
;        je      .up1
;        cmp     ah, keyDown
;        je      .dn1
;        cmp     ah, keyPgUp
;        je      .up2
;        cmp     ah, keyPgDown
;        je      .dn2
;
;        jmp     .event_loop
;
;.ascii:

        mov     ebx, [KeyboardHead]
        mov     ecx, ebx

        inc     ebx
        and     ebx, $fff
        cmp     ebx, [KeyboardTail]     ; overflow? Don't store then.
        je      .event_loop

        mov     [KeyboardBuffer+ecx], ah
        mov     [KeyboardHead], ebx

        movzx   eax, ah
        stdcall CharOut, eax

        jmp     .event_loop

.up1:
        mov     eax, -1
        jmp     .scroll

.dn1:
        mov     eax, 1
        jmp     .scroll

.up2:
        call    .get_info
        neg     eax
        jmp     .scroll

.dn2:
        call    .get_info
        jmp     .scroll

.mouse:
        mov     eax, sys_readmousepos
        mov     ebx, 7
        int     $40
        cwde
        shl     eax, 1

.scroll:
        mov     edx, [rDebugBuffer]

        test    eax, eax
        jz      .event_loop
        js      .minusloop

.plusloop:
        inc     edx
        and     edx, CONSOLE_Y_SIZE - 1
        cmp     edx, [sDebugBuffer]
        je      .redraw
        mov     [rDebugBuffer], edx
        dec     eax
        jnz     .plusloop
        jmp     .redraw

.minusloop:
        dec     edx
        and     edx, CONSOLE_Y_SIZE - 1
        mov     ecx, [sDebugBuffer]
        dec     ecx
        and     ecx, CONSOLE_Y_SIZE - 1
        cmp     edx, ecx
        je      .redraw
        mov     [rDebugBuffer], edx
        inc     eax
        jnz     .minusloop
        jmp     .redraw

.button:
        mov     eax, sys_getbutton
        int     $40

        cmp     ah, 1
        jne     .event_loop

.finish:
        mov     eax, sys_end
        int     $40


.get_info:
        mov     eax, sys_cpuusage
        lea     ebx, [.info]
        mov     ecx, -1
        int     $40

        mov     eax, [.info.ClientHeight]
        cdq
        mov     ecx, FONT_HEIGHT
        sub     eax, ecx
        div     ecx
        retn


endp






cDebugWindowHeader text 'FreshLib console'


proc DrawConsole, .fScroll
.info __TThreadInfo
begin
; start draw
        mov     eax, 12
        mov     ebx, 1
        int     $40

; draw standard elements.
        mov     eax, sys_drawwindow
        mov     ebx, 480+8
        mov     ecx, 320+32
        mov     edx, $33000000 or CONSOLE_BG_COLOR
        mov     edi, cDebugWindowHeader
        int     $40

; draw the text from the buffer

; get the window size:
        mov     eax, sys_cpuusage
        lea     ebx, [.info]
        mov     ecx, -1
        int     $40

        sub     [.info.ClientHeight], FONT_HEIGHT

; check for scroll
        cmp     [.fScroll], 0
        je      .scrollok

        mov     eax, [.info.ClientHeight]
        cdq
        mov     ecx, FONT_HEIGHT
        div     ecx

        mov     edx, [yDebugBuffer]
        sub     edx, [rDebugBuffer]
        and     edx, CONSOLE_Y_SIZE - 1

        cmp     edx, eax
        jbe     .scrollok

        sub     edx, eax
        add     [rDebugBuffer], edx

.scrollok:
        mov     eax, sys_writetext
        xor     ebx, ebx
        mov     ecx, CONSOLE_TEXT_COLOR     ; text color and options.
        mov     edi, [rDebugBuffer]
        mov     esi, CONSOLE_X_SIZE

.text_loop:
        mov     edx, edi
        shl     edx, CONSOLE_X_SHIFT
        add     edx, DebugBuffer

        int     $40

        inc     edi
        and     edi, CONSOLE_Y_SIZE - 1
        cmp     edi, [sDebugBuffer]
        je      .text_ok

        add     ebx, FONT_HEIGHT
        cmp     ebx, [.info.ClientHeight]
        jbe     .text_loop

.text_ok:
        mov     eax, 12
        mov     ebx, 2
        int     $40
        return
endp





proc CharOut, .char
begin
        pushad

        mov     ecx, [xDebugBuffer]
        mov     edx, [yDebugBuffer]

        mov     eax, [.char]

        cmp     al, $20
        jb      .control

.charout:
        mov     edi, edx
        shl     edi, CONSOLE_X_SHIFT
        add     edi, ecx
        mov     [edi+DebugBuffer], al

        inc     ecx
        cmp     ecx, CONSOLE_X_SIZE
        jb      .end_output

        xor     ecx, ecx
.LF:
        inc     edx
        and     edx, CONSOLE_Y_SIZE - 1

        cmp     edx, [sDebugBuffer]
        jne     @f
        inc     [sDebugBuffer]
        and     [sDebugBuffer], CONSOLE_Y_SIZE - 1
@@:
        call    .clearEOL

.end_output:
        mov     [xDebugBuffer], ecx
        mov     [yDebugBuffer], edx
        mov     [fDebugRefresh], 1

        popad
        return

.control:
        cmp     al, $0d
        je      .CR
        cmp     al, $0a
        je      .LF

        mov     al, '.'        ; replace ctrl code with "."
        jmp     .charout

.CR:
        xor     ecx, ecx
        jmp     .end_output

; clear the row.
.clearEOL:
        xor     eax, eax
        mov     edi, edx
        shl     edi, CONSOLE_X_SHIFT
        add     edi, ecx
        add     edi, DebugBuffer
        push    ecx
        mov     ecx, CONSOLE_X_SIZE / 4
        rep stosd
        pop     ecx
        retn
endp



Changes to freshlib/simpledebug/Linux/debug.asm.



















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




























proc Output, .ptrStr
begin
        pushad

        stdcall __simpStrLength, [.ptrStr]
        mov     edx, ecx

        mov     eax, 4
        mov     ebx, 1















        mov     ecx, [.ptrStr]
        int     $80

        popad
        return
endp








proc GetTimestamp

begin
        pushad


        mov     eax, 78
        mov     ebx, _timestamp

        xor     ecx, ecx
        int     $80

        mov     eax,dword [_timestamp]
        mov     ecx,1000


        mul     ecx

        mov     ebx,eax
        mov     eax,dword [_timestamp+4]
        div     ecx
        add     eax,ebx




        mov     [esp+4*regEAX], eax
        popad
        return





endp

uglobal


 _timestamp dq 0

endg











>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>








|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>









>
>
>
>
>
|
>


>
>
|
|
>
|
|

|
|
>
>
|
>
|
<
<
|
>
>
>

<



>
>
>
>


<
>
>
|
>
|

>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: SimpleDebug library.
;
;  Target OS: Linux
;
;  Dependencies: Not dependent on other libraries.
;
;  Notes:
;_________________________________________________________________________________________

DBG_CHAR_NEWLINE equ $0a



proc Output, .ptrStr
begin
        pushad

        stdcall __simpStrLength, [.ptrStr]
        mov     edx, ecx

        mov     eax, 4
        mov     ebx, 2
        mov     ecx, [.ptrStr]
        int     $80

        popad
        return
endp


proc OutputSz, .ptrStr, .size
begin
        pushad

        mov     edx, [.size]
        mov     eax, 4
        mov     ebx, 2
        mov     ecx, [.ptrStr]
        int     $80

        popad
        return
endp



macro OutputEvent event {
if defined options.DebugMode & options.DebugMode
        stdcall __OutputEvent, event
end if
}

proc __OutputEvent, .pEvent
begin
        pushad
        stdcall Output, cEventLabel
        mov     esi, [.pEvent]
        mov     eax, [esi+XEvent.type]
        cmp     eax, 2
        jl      .bynumber
        cmp     eax, 35
        jg      .bynumber

        sub     eax, 2
        mov     eax, [__EventStrings+4*eax]
        stdcall Output, eax
        stdcall Output, cEventLabel1

.window:
        mov     eax, [esi+XEvent.type]


        stdcall OutputNumber, eax, 10, 3
        stdcall Output, cEventLabel2
        stdcall OutputNumber, [esi+XEvent.window], 16, 8
        stdcall Output, cEventLabel3


        popad
        return

.bynumber:
        stdcall OutputNumber, eax, 10, 3
        jmp     .window

endp


if used __OutputEvent
  cEventLabel db 'X event: "', 0
  cEventLabel1 db ' (', 0
  cEventLabel2 db ')" for window: $', 0
  cEventLabel3 db 10, 0

  ; From number 2..35
  __EventStrings:
  StringTable              \
  `KeyPress, `KeyRelease, `ButtonPress, `ButtonRelease, `MotionNotify, `EnterNotify, \
  `LeaveNotify, `FocusIn, `FocusOut, `KeymapNotify, `Expose, `GraphicsExpose, `NoExpose, \
  `VisibilityNotify, `CreateNotify, `DestroyNotify, `UnmapNotify, `MapNotify, `MapRequest, \
  `ReparentNotify, `ConfigureNotify, `ConfigureRequest, `GravityNotify, `ResizeRequest,    \
  `CirculateNotify, `CirculateRequest, `PropertyNotify, `SelectionClear, `SelectionRequest, \
  `SelectionNotify, `ColormapNotify, `ClientMessage, `MappingNotify, `LASTEvent
end if

Changes to freshlib/simpledebug/Win32/debug.asm.

















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
















uglobal

  debug_con_handle dd ?

endg


iglobal

  cConsoleTitle text 'Fresh simple debug console.'

endg



initialize InitDebugConsole
begin
        invoke  AllocConsole
        invoke  GetStdHandle, STD_OUTPUT_HANDLE
        mov     [debug_con_handle], eax
        invoke  SetConsoleTitle, cConsoleTitle












        return
endp







proc Output, .ptrStr
.dummy dd ?
begin
        pushad

        stdcall __simpStrLength, [.ptrStr]
        lea     eax, [.dummy]
        invoke  WriteConsole, [debug_con_handle], [.ptrStr], ecx, eax, 0

        popad

        return



endp










proc GetTimestamp
begin
        pushad
        invoke  GetTickCount
        mov     [esp+4*regEAX], eax
        popad
        return
endp




>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
|
>




>
|
>



>



|

|
>
>
>
>
>
>
>
>
>
>
>
>



>
>

>
>







|
<

|
>
|
>
>
>
|

>
>
>
>
>

>
>

<
|
<
<
<







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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: SimpleDebug library.
;
;  Target OS: Win32
;
;  Dependencies: Not dependent on other libraries.
;
;  Notes:
;_________________________________________________________________________________________

DBG_CHAR_NEWLINE equ $0d, $0a

uglobal
  if used debug_con_handle
    debug_con_handle dd ?
  end if
endg


iglobal
  if used cConsoleTitle
    cConsoleTitle du 'Fresh simple debug console.', 0
  end if
endg


if (defined options.DebugMode & options.DebugMode) | used Output | (defined options.DebugMode.ShowFPS & options.DebugMode.ShowFPS)
initialize InitDebugConsole
begin
        invoke  AllocConsole
        invoke  GetStdHandle, STD_ERROR_HANDLE
        mov     [debug_con_handle], eax
        invoke  SetConsoleTitleW, cConsoleTitle
        return
endp
end if


if (defined options.DebugMode & options.DebugMode) | used Output | (defined options.DebugMode.ShowFPS & options.DebugMode.ShowFPS)
finalize FinishDebugConsole
.string rb 10
begin
        invoke  WriteFile, [STDERR], ___CloseMsg, ___CloseMsg.length, 0, 0
        lea     eax, [.string]
        invoke  ReadFile, [STDIN], eax, 1, 0, 0
        return
endp

___CloseMsg text "Press ENTER to close."
end if


maxConsoleWrite = 1024

proc Output, .ptrStr
.dummy dd ?
begin
        pushad

        stdcall __simpStrLength, [.ptrStr]
        mov     ebx, ecx


.loop:
        mov     ecx, ebx
        cmp     ecx, maxConsoleWrite
        jb      @f
        mov     ecx, maxConsoleWrite
@@:
        sub     ebx, ecx

        push    ecx
        lea     eax, [.dummy]
        invoke  WriteConsoleA, [debug_con_handle], [.ptrStr], ecx, eax, 0
        pop     ecx
        add     [.ptrStr], ecx

        test    ebx, ebx
        jnz     .loop


.finish:



        popad
        return
endp




Changes to freshlib/simpledebug/debug.asm.


















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

















include "%TargetOS%/debug.asm"



















macro DebugMsg msg {


local ..msg, ..skip

      stdcall Output, ..msg
      jmp     ..skip
..msg db msg, 10, 0









label ..skip






















































































































































































}



proc OutputNumber, .number, .radix, .digits
begin
        pushad

        cld
        mov     edi, _simpdebugstr

        mov     eax, [.number]
        mov     ecx, [.radix]
        mov     esi, [.digits]













        call    __simpNumToStrUF


        xor     eax, eax
        stosd

        stdcall Output, __simpdebugstr

.exit:
        popad
        return
endp







regEDI = 0
regESI = 1
regEBP = 2
regESP = 3
regEBX = 4
regEDX = 5
regECX = 6
regEAX = 7



proc OutputRegister, .reg, .radix
begin
        pushad

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
|

|
<
<

>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>















>
>
>
>
>
>
>
>
>
>
>
>

>
>



|







|
>
>
>
|
<
<
<
<
<
<
<
<







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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281








282
283
284
285
286
287
288
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: SimpleDebug library. Provides simple debugging macros and code.
;
;  Target OS: Any
;
;  Dependencies: Not dependent on other libraries.
;
;  Notes: use options.DebugMode={1|0} to enable/disable debug output of this library.
;_________________________________________________________________________________________
module "Simple debug library"

SimpleDebugLoaded = 1

include "%TargetOS%/debug.asm"




match =DBG_CHAR_NEWLINE, DBG_CHAR_NEWLINE {
  DBG_CHAR_NEWLINE equ $0d, $0a
}


cDbgNewLine text DBG_CHAR_NEWLINE, 0


macro dbrk {
if defined options.DebugBreaks & options.DebugBreaks
        int3
        nop
end if
}

macro DebugMsg msg {
common
if defined options.DebugMode & options.DebugMode
  local ..msg, ..skip

        stdcall DebugLock



        stdcall Output, ..msg
        jmp     ..skip
  label ..msg byte
    if ~msg eq
        db msg
    end if
        db DBG_CHAR_NEWLINE, 0

  label ..skip

        stdcall DebugUnlock
end if
}


macro Message msg {
common
  local ..msg, ..skip

        stdcall Output, ..msg
        jmp     ..skip
  ..msg db msg, DBG_CHAR_NEWLINE, 0

  label ..skip
}



macro Output string {
if defined options.DebugMode & options.DebugMode = 1
        stdcall Output, string
end if
}


macro OutputLn string {
if defined options.DebugMode & options.DebugMode = 1
if ~string eq
        stdcall Output, string
end if
        stdcall Output, <txt DBG_CHAR_NEWLINE>
end if
}



proc OutputMemory, .ptr, .size
begin
        pushad

        mov     esi, [.ptr]
        mov     edx, [.size]

.loop:
        stdcall OutputNumber, esi, 16, 8
        stdcall Output, .cSimpDbgSep1

        mov     ecx, 4

.lineloop:
        stdcall OutputNumber, [esi], 16, 8
        stdcall Output, .cSimpDbgSep2
        lea     esi, [esi+4]

        sub     edx, 4
        cmp     edx, 0
        jle     .exit

        dec     ecx
        jnz     .lineloop

.exit:
        stdcall Output, .cSimpDbgNewLine

        cmp     edx, 0
        jg      .loop

        stdcall Output, .cSimpDbgNewLine

        popad
        return

.cSimpDbgSep1 db ': ',0
.cSimpDbgSep2 db '  ',0
.cSimpDbgNewLine db DBG_CHAR_NEWLINE,0


endp

macro OutputMemory pointer, size {
if defined options.DebugMode & options.DebugMode
        stdcall OutputMemory, pointer, size
end if
}


proc OutputMemoryByte, .ptr, .size
.buffer dd ?
begin
        pushad

        mov     esi, [.ptr]
        mov     edx, [.size]

.loop:
        mov     eax, esi
        sub     eax, [.ptr]
        stdcall OutputNumber, eax, 16, 8
        stdcall Output, .cSimpDbgSep1

        mov     ecx, 16

        push    esi edx

.lineloop1:
        movzx   eax, byte [esi]

        stdcall OutputNumber, eax, 16, 2
        stdcall Output, .cSimpDbgSep2

        inc     esi
        dec     edx
        dec     ecx
        jz      .ascii

        test    edx, edx
        jnz     .lineloop1


.align_loop:
        jecxz   .ascii

        stdcall Output, .cSimpDbgSep3
        dec     ecx
        jnz     .align_loop


.ascii:
        stdcall Output, .cSimpDbgSep1

        mov     ecx, 16
        pop     edx esi

.lineloop2:

        xor     eax, eax
        mov     al, [esi]
        mov     ah, " "

        cmp     al, ah
        jae     @f
        mov     al, "."
@@:
        mov     [.buffer], eax

        lea     eax, [.buffer]
        stdcall Output, eax

        inc     esi
        dec     edx
        dec     ecx
        jz      .exit

        test    edx, edx
        jnz     .lineloop2


.exit:
        stdcall Output, .cSimpDbgNewLine

        cmp     edx, 0
        jne     .loop

        stdcall Output, .cSimpDbgNewLine

        popad
        return

.cSimpDbgSep1 db ': ',0
.cSimpDbgSep2 db '  ',0
.cSimpDbgSep3 db '    ',0
.cSimpDbgNewLine db DBG_CHAR_NEWLINE,0


endp


macro OutputMemoryByte pointer, size {
if defined options.DebugMode & options.DebugMode
        stdcall OutputMemoryByte, pointer, size
end if
}



proc OutputNumber, .number, .radix, .digits
begin
        pushad

        cld
        mov     edi, _simpdebugstr

        mov     eax, [.number]
        mov     ecx, [.radix]
        mov     esi, [.digits]

        test    esi, esi
        jz      .varU
        jns     .fixed

        call    __simpNumToStr
        jmp     .end

.varU:
        call    __simpNumToStrU
        jmp     .end

.fixed:
        call    __simpNumToStrUF

.end:
        xor     eax, eax
        stosd

        stdcall Output, _simpdebugstr

.exit:
        popad
        return
endp


macro OutputNumber number, radix, digits {
if defined options.DebugMode & options.DebugMode
        stdcall OutputNumber, number, radix, digits
end if
}











proc OutputRegister, .reg, .radix
begin
        pushad

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
97
98
99
100
101
102
103
104
105
106


107
108
109
110
111
112
113


114
115
116
117
118
119
120
        stosd

        mov     eax, [esp+4*ebx]
        mov     ecx, [.radix]
        mov     esi, 8

        call    __simpNumToStrUF
        mov     eax, $0a
        stosd

        stdcall Output, _simpdebugstr

.exit:
        popad
        return




  .regnames:
        dd      'edi='
        dd      'esi='
        dd      'ebp='
        dd      'esp='
        dd      'ebx='
        dd      'edx='
        dd      'ecx='
        dd      'eax='
endp
























































































uglobal
  if used _simpdebugstr
    _simpdebugstr rb 256
  end if
endg







proc __simpStrLength;, .pString
begin
        mov     ecx, [esp+4]


.scan:
        cmp     byte [ecx], 0
        lea     ecx, [ecx+1]
        jne     .scan

        stc
        sbb     ecx, [esp+4]


        retn 4
endp


;*****************************************************
; NumToStrF:
;   Converts signed integer value to string.







|







>
>
>












>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>









<
<
<
<



>
>







>
>







297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421




422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
        stosd

        mov     eax, [esp+4*ebx]
        mov     ecx, [.radix]
        mov     esi, 8

        call    __simpNumToStrUF
        mov     eax, dword [.tempstr]
        stosd

        stdcall Output, _simpdebugstr

.exit:
        popad
        return
  .tempstr db DBG_CHAR_NEWLINE
           dd 0
           align 4

  .regnames:
        dd      'edi='
        dd      'esi='
        dd      'ebp='
        dd      'esp='
        dd      'ebx='
        dd      'edx='
        dd      'ecx='
        dd      'eax='
endp



macro OutputRegister reg, radix {
if defined options.DebugMode & options.DebugMode
        stdcall OutputRegister, reg, radix
end if
}


macro OutputRect x, y, width, height {
if defined options.DebugMode & options.DebugMode
  local ..crlf, ..skip, ..ss

  stdcall  Output, 'Rectangle: x='
  stdcall  OutputNumber, x, 10, -1
  stdcall  Output, ..ss
  stdcall  OutputNumber, y, 10, -1
  stdcall  Output, '  width='
  stdcall  OutputNumber, width, 10, -1
  stdcall  Output, '  height='
  stdcall  OutputNumber, height, 10, -1
  stdcall  Output, ..crlf
  jmp      ..skip
  ..crlf db DBG_CHAR_NEWLINE, 00
  ..ss   db ' y=', 0
label ..skip
end if
}


macro OutputValue lbl, val, radix, digits {
if defined options.DebugMode & options.DebugMode
  local ..crlf, ..txt, ..skip

  stdcall  DebugLock

  stdcall  Output, ..txt
  stdcall  OutputNumber, val, radix, digits
  stdcall  Output, ..crlf
  jmp      ..skip

  ..txt  db lbl, 0
  ..crlf db DBG_CHAR_NEWLINE, 00

label ..skip
  stdcall  DebugUnlock
end if
}



macro OutputCallStack depth {
if defined options.DebugMode & options.DebugMode
  local ..txt, ..skip, ..loop

        pushf
        pushad

        stdcall DebugLock

        mov     ecx, depth

..loop:
        stdcall OutputNumber, [ebp+4], 16, 8
        stdcall Output, ..txt

        mov     ebp, [ebp]
        dec     ecx
        jnz     ..loop
        jmp     ..skip

  ..txt  db 'h', DBG_CHAR_NEWLINE, 00

..skip:
        stdcall DebugUnlock


        popad
        popf
end if
}






uglobal
  if used _simpdebugstr
    _simpdebugstr rb 256
  end if
endg







proc __simpStrLength;, .pString
begin
        mov     ecx, [esp+4]
        jecxz   .ret

.scan:
        cmp     byte [ecx], 0
        lea     ecx, [ecx+1]
        jne     .scan

        stc
        sbb     ecx, [esp+4]

.ret:
        retn 4
endp


;*****************************************************
; NumToStrF:
;   Converts signed integer value to string.
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
; returns: edi - pointer to the end of converted num
;
; Note: Don't use 1 as radix.
;*****************************************************
proc __simpNumToStrF
begin
        test    eax,eax
        jns     NumToStrUF
        neg     eax
        mov     byte [edi],'-'
        push    esi
        dec     esi
        add     edi,esi
        push    edi
        jmp     __simpNumToStrUF.loopc







|







451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
; returns: edi - pointer to the end of converted num
;
; Note: Don't use 1 as radix.
;*****************************************************
proc __simpNumToStrF
begin
        test    eax,eax
        jns     __simpNumToStrUF
        neg     eax
        mov     byte [edi],'-'
        push    esi
        dec     esi
        add     edi,esi
        push    edi
        jmp     __simpNumToStrUF.loopc
163
164
165
166
167
168
169




















































































        jnz     .loopc
        pop     edi
        pop     esi
        return
endp





























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
        jnz     .loopc
        pop     edi
        pop     esi
        return
endp


;*****************************************************
; _simpNumToStr:
;   Converts signed integer value to string.
; _simpNumToStrU:
;   Converts unsigned integer value to string.
;
; edi - pointer to string buffer
; eax - Number to convert
; ecx - radix from 2 to $ff
;
; returns: edi - pointer to the end of converted num
;
; Note: Don't use 1 as radix.
;*****************************************************
proc __simpNumToStr
begin
    test  eax,eax
    jns   __simpNumToStrU
    neg   eax
    mov   byte [edi],"-"
    inc   edi
endp

proc __simpNumToStrU
begin
    cmp   eax,ecx
    jb    .lessA
    xor   edx,edx
    div   ecx
    push  edx
    call  __simpNumToStrU
    pop   eax
.lessA:
    cmp   al, 10
    sbb   al, 69h
    das
    stosb
    return
endp



uglobal
  DebugBusy dd ?
endg


proc DebugLock
begin
        pushad
        mov     ebx, 10

.loop:
        xor     eax, eax
        dec     eax

        xchg    eax, [DebugBusy]
        test    eax, eax
        jz      .lock_ok

        stdcall Sleep, 10
        dec     ebx
        jnz     .loop

        and     [DebugBusy], 0

.lock_ok:
        popad
        return
endp



proc DebugUnlock
begin
        and     [DebugBusy], 0
        return
endp





endmodule

Changes to freshlib/sqlite/sqlite.asm.

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
;-------------------------------------------------------------------
; Procedures for convenient work with SQLite database angine.
;-------------------------------------------------------------------




;-------------------------------------------------------------------
; If the file in [.ptrFileName] exists, the function opens it.
; if the file does not exists, new database is created and the
; initialization script from [.ptrInitScript] is executed on it.
;
; Returns:
;    CF: 0 - database was open successfully
;      eax = 0 - Existing database was open successfuly.
;      eax = 1 - New database was created and init script was
;                executed successfully.
;      eax = 2 - New database was created but init script exits
;                with error.
;    CF: 1 - the database could not be open. (error)
;-------------------------------------------------------------------
proc OpenOrCreate, .ptrFileName, .ptrDatabase, .ptrInitScript
   .hSQL dd ?
.ptrNext dd ?
begin
        push    esi ebx

        mov     esi, [.ptrDatabase]
        cinvoke sqliteOpen, [.ptrFileName], esi
        test    eax, eax
        jz      .openok


        stc
        pop     esi
        return

.openok:
        xor     ebx, ebx



        cinvoke sqliteExec, [esi], .sqlCheckEmpty, .AbortCallback, ebx, ebx



        cmp     eax, SQLITE_ABORT

        je      .finish

        cinvoke sqliteExec, [esi], [.ptrInitScript], -1, ebx, ebx, ebx
        inc     ebx

        test    eax, eax     ; SQLITE_OK
        jz      .finish

        inc     ebx

.finish:
        cinvoke sqliteFinalize, [.hSQL]
        mov     eax, ebx
        clc
        pop     ebx esi
        return

.AbortCallback:
        xor     eax, eax
        inc     eax
        retn

.sqlCheckEmpty db 'select * from sqlite_master',0

endp

|

>
>
>









|
<
|
<




<

|


|


>
>

|




>
>
>
|
>
>
>
|
>
|

<

>
|





<


|

<
<
<
<
<
<
<
<

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
;-------------------------------------------------------------------
; Procedures for convenient work with SQLite database engine.
;-------------------------------------------------------------------

sqlCheckEmpty text 'select count() from sqlite_master'


;-------------------------------------------------------------------
; If the file in [.ptrFileName] exists, the function opens it.
; if the file does not exists, new database is created and the
; initialization script from [.ptrInitScript] is executed on it.
;
; Returns:
;    CF: 0 - database was open successfully
;      eax = 0 - Existing database was open successfuly.
;      eax = 1 - New database was created and init script was executed successfully.

;      eax = 2 - New database was created but init script exits with error.

;    CF: 1 - the database could not be open. (error)
;-------------------------------------------------------------------
proc OpenOrCreate, .ptrFileName, .ptrDatabase, .ptrInitScript
   .hSQL dd ?

begin
        push    edi esi ebx

        mov     esi, [.ptrDatabase]
        cinvoke sqliteOpen_v2, [.ptrFileName], esi, SQLITE_OPEN_READWRITE or SQLITE_OPEN_CREATE or SQLITE_OPEN_FULLMUTEX, 0
        test    eax, eax
        jz      .openok

.error:
        stc
        pop     ebx esi edi
        return

.openok:
        xor     ebx, ebx
        lea     eax, [.hSQL]
        cinvoke sqlitePrepare_v2, [esi], sqlCheckEmpty, sqlCheckEmpty.length, eax, 0

        cinvoke sqliteStep, [.hSQL]
        cinvoke sqliteColumnInt, [.hSQL], 0
        push    eax
        cinvoke sqliteFinalize, [.hSQL]
        pop     eax
        test    eax, eax
        jnz     .finish


        inc     ebx
        cinvoke sqliteExec, [esi], [.ptrInitScript], NULL, NULL, NULL
        test    eax, eax
        jz      .finish

        inc     ebx

.finish:

        mov     eax, ebx
        clc
        pop     ebx esi edi
        return








endp

Added freshlib/system/Dummy/clipboard.asm.



























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Clipboard management library.
;
;  Target OS: Dummy
;
;  Dependencies:
;_________________________________________________________________________________________

; returns eax = handle to string with the clipboard data.
proc ClipboardRead
begin
        return
endp



; writes the string .hstring to the clipboard.
; returns nothing.

proc ClipboardWrite, .hstring
begin
        return
endp


Added freshlib/system/Dummy/environment.asm.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Environment management library. OS dependent part.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

proc GetAllEnvironment
begin
        return
endp



proc GetEnvVariable, .varname
begin
        return
endp

Added freshlib/system/Dummy/files.asm.































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Files manipulation library.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

DIR_SLASH equ '\'

fsFromBegin     = 0
fsFromEnd       = 0
fsFromCurrent   = 0


;--------------------------------------
; if CF = 0, eax is handle to the file.
; if CF = 1, eax is error code.
;--------------------------------------
proc FileOpen, .filename
begin
        stc
        return
endp



proc FileCreate, .filename
begin
        stc
        return
endp




proc FileClose, .handle
begin
        stc
        return
endp


; returns 32bit file size in eax
proc FileSize, .handle
begin
        stc
        return
endp



proc FileRead, .handle, .buffer, .count
begin
        stc
        return
endp




proc FileWrite, .handle, .buffer, .count
begin
        stc
        return
endp




;----------------------------------------------------
; if CF = 0, eax is the new possition in the file
; if CF = 1, eax is error code.
;----------------------------------------------------
proc FileSeek, .handle, .dist, .direction
begin
        stc
        return
endp



;----------------------------------------------------
; if CF = 0 - the file was deleted
; if CF = 1, eax is error code.
;----------------------------------------------------
proc FileDelete, .filename
begin
        stc
        return
endp



proc GetCurrentDir
begin
        return
endp




proc SetCurrentDir, .hDirectory
begin
        return
endp




proc GetErrorString, .code
begin
        return
endp



proc FreeErrorString, .ptrString
begin
        return
endp



ftUnknown    =  0
ftDirectory  =  1
ftFile       =  2



; reads all items of the directory and fills them in the TArray of type TDirItem.
; arguments:
;   dir - string with the path to the directory.
;
; returns:
;   if not error: CF=0; eax = pointer to TArray of TDirItem;
;   if error:     CF=1; eax = error code;

proc DirectoryRead, .dir
begin
        stc
        return
endp




proc GetFileInfo, .hFile, .ptrFileInfo
begin
        stc
        return
endp

Added freshlib/system/Dummy/heapmgr.asm.













































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Dynamic memory management library. OS dependent part.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;
;_________________________________________________________________________________________


proc mem.alloc_heap, .size
begin
        stc
        return
endp




proc mem.free_heap, .block, .size
begin
        stc
        return
endp



proc mem.realloc_heap, .heapptr, .newsize, .oldsize
begin
        stc
        return
endp

Added freshlib/system/Dummy/memory.asm.







































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Dynamic memory management library.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;
;_________________________________________________________________________________________


; Allocates memory block with given size.
; Returns: CF=1 if error.
;          if CF=0, eax = pointer to the memory block allocated.

proc GetMem, .size
begin
        stc
        return
endp



proc FreeMem, .ptr
begin
        return
endp




proc ResizeMem, .ptr, .newsize
begin
        stc
        return
endp




proc SpaceAllocate, .size
begin
        return
endp


Added freshlib/system/Dummy/network.asm.

























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS dependent part of the network library.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;
;_________________________________________________________________________________________



proc SocketCreate, .protocol_family, .socket_type, .protocol
begin
        stc
        return
endp



proc SocketClose, .hSocket
begin
        stc
        return
endp



proc SocketConnect, .hSocket, .pAddress
begin
        stc
        return
endp



proc SocketBind, .hSocket, .pAddressIn
begin
        stc
        return
endp



proc SocketListen, .hSocket, .maxPending
begin
        stc
        return
endp



proc SocketAccept, .hSocket, .pAddress
begin
        stc
        return
endp



proc SocketSend, .hSocket, .pBuffer, .DataLen, .flags
begin
        stc
        return
endp


proc SocketReceive, .hSocket, .pBuffer, .BufferSize, .flags
begin
        stc
        return
endp


proc SocketSendTo, .hSocket, .pBuffer, .DataLen, .flags, .pAddressTo
begin
        stc
        return
endp


proc SocketReceiveFrom, .hSocket, .pBuffer, .BufferSize, .flags, .pAddressFrom
begin
        stc
        return
endp

Added freshlib/system/Dummy/process.asm.



































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Process management library.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


struct TMutex
ends

proc Terminate, .exit_code
begin
        return
endp


; Terminate current process
; Returns: nothing.

proc TerminateAll, .exit_code
begin
        return
endp



proc GetCmdArguments
begin
        stc
        return
endp



; Creates a new execution thread
; Returns: CF=1 if error.
;          CF=0, eax = pid of the new process being created

proc ThreadCreate, .ptr_to_function, .ptr_to_args
begin
        stc
        return
endp



proc FreeThreadID, .ThreadID
begin
        return
endp



; MUTEX functions
;_________________________________________________________________________________________

proc MutexCreate, .ptrName, .ptrMutex
begin
        return
endp




proc WaitForMutex, .ptrMutex, .timeout
begin
        clc
        return
endp




proc MutexRelease, .ptrMutex
begin
        pushf
        popf
        return
endp



proc MutexDestroy, .ptrMutex
begin
        pushf
        popf
        return
endp

Added freshlib/system/Dummy/serial.asm.













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Serial IO interface library. Linux part.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


proc SerSetParams, .hSerial, .Baudrate, .Parity, .Flow, .Timeout
begin



        return
endp

Added freshlib/system/Dummy/timers.asm.





























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Asynchronous timer library.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________




proc GetSysTime
begin
        return
endp





proc GetTime
begin
        return
endp




proc GetLocalTimeOffset
begin
        return
endp




proc Sleep, .ms
begin
        return
endp

Added freshlib/system/KolibriOS/environment.asm.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Environment management library. OS dependent
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

proc GetAllEnvironment
begin
        return
endp



proc GetEnvVariable, .varname
begin
        return
endp

Added freshlib/system/KolibriOS/files.asm.





































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Files manipulation library. KolibriOS part.
;
;  Target OS: KolibriOS
;
;  Dependencies: Uses system calls for file processing and memory.asm for memory
;                allocations.
;
;  Notes:
;_________________________________________________________________________________________

DIR_SLASH equ '/'
DIR_SEP_PAIR equ '\/'   ; for use with StrNormalizePath and StrNormalizePath2


FILE_SEARCH_ONE_ATEMPT = 10

fsFromBegin     = 0
fsFromEnd       = 2
fsFromCurrent   = 1


faReadOnly   = accessRead
faWriteOnly  = accessWrite
faReadWrite  = accessRead or accessWrite

faOpenAlways   = $100    ; if the file does not exists it will be created.
faCreateAlways = $200    ; Creates new file always. If the file exists, truncates it.
faCreateOnly   = $400    ; Creates new file only if not exists, else error.




fileErrorUndefinedBase = 1
fileErrorFunctionNotAvailable = 2
fileErrorUnknownFileSystem    = 3
fileErrorFileNotFound         = 5
fileErrorEOF                  = 6
fileErrorBadPointer           = 7
fileErrorDiskFull             = 8
fileErrorBrokenFAT            = 9
fileErrorAccessDenied         = 10
fileErrorDeviceError          = 11
fileErrorOutOfMemory          = 30
fileErrorNotExecutable        = 31
fileErrorTooManyProcesses     = 32


if used STDIN | used STDOUT | used STDERR | used pFileList

initialize InitStdHandles
begin
  if used STDIN | used STDOUT
        mov     eax, [STDIO]
  end if

  if used STDIN
        mov     dword [__std_handle_in], eax
  end if

  if used STDOUT
        mov     dword [__std_handle_out], eax
  end if

  if used STDERR
        mov     eax, [STDDBG]
        mov     dword [__std_handle_err], eax
  end if

  if used ptrFileList
    if options.Threads
        stdcall MutexCreate, 0, FileMutex
        stdcall MutexRelease, FileMutex
    end if

        stdcall CreateArray, 4
        mov     [__ptr_file_list], eax
  end if

        return
endp

end if


fattrReadOnly = 1
fattrHidden   = 2
fattrSystem   = 4
fattrVolume   = 8
fattrDirectory= 16
fattrArchive  = 32


struct __TFileInfo
  .attr          dd ?
  .encoding      db ?
                 rb 3
  .creation_time dd ?
  .creation_date dd ?
  .access_time   dd ?
  .access_date   dd ?
  .modify_time   dd ?
  .modify_date   dd ?
  .file_size     dd ?
  .file_sizeH    dd ?
ends


struct __TFileOp
  .subfunc   dd ?
  .offset    dd ?
  .flags     dd ?
  .size      dd ?
  .ptrBuffer dd ?
  .filename    db 0
  .ptrFilename dd ?
ends


struct __TFile
  .hFilename dd ?
  .pointer   dd ?
  .access    dd ?

  .info __TFileInfo
ends



uglobal

  if used ptrFileList
    FileMutex  TMutex

    __ptr_file_list:
    ptrFileList   dd ?
  end if

endg


body FileExists
begin
        return
endp



body FileOpenAccess
.op __TFileOp
begin
        pushad

        stdcall GetMem, sizeof.__TFile
        mov     esi, eax

        stdcall StrDup, [.filename]

        mov     [esi+__TFile.hFilename], eax
        mov     [esi+__TFile.pointer], 0

        mov     eax, [.access]
        mov     [esi+__TFile.access], eax

        xor     eax, eax
        mov     [.op.offset], eax
        mov     [.op.flags], eax
        mov     [.op.size], eax
        mov     [.op.filename], al

        lea     eax, [esi+__TFile.info]
        mov     [.op.ptrBuffer], eax

        stdcall StrPtr, [esi+__TFile.hFilename]
        mov     [.op.ptrFilename], eax

.read_info:
        mov     [.op.subfunc], fsfFileInfo
        mov     eax, sys_file_system_lfn
        lea     ebx, [.op]
        int     $40

        cmp     eax, errFileNotFound
        jne     .file_exists

; file does not exists

        test    [.access], faCreateAlways or faOpenAlways or faCreateOnly
        jz      .error

        mov     [.op.subfunc], fsfCreate

        mov     eax, sys_file_system_lfn
        lea     ebx, [.op]
        int     $40

        test    eax, eax
        jnz     .error

; read again the info

        mov     [.op.subfunc], fsfFileInfo
        mov     eax, sys_file_system_lfn
        lea     ebx, [.op]
        int     $40

        test    eax, eax
        jnz     .error
        jmp     .exit_ok


.file_exists:

        test    eax, eax
        jnz     .error

        mov     eax, errFileAlreadyExists
        test    [.access], faCreateOnly
        jnz     .error

        test    [.access], faCreateAlways
        jz      .exit_ok

; trunkate the existing file

        mov     [.op.subfunc], fsfCreate
        mov     eax, sys_file_system_lfn
        lea     ebx, [.op]
        int     $40

        test    eax, eax
        jnz     .error

; read again the info

        mov     [.op.subfunc], fsfFileInfo
        mov     eax, sys_file_system_lfn
        lea     ebx, [.op]
        int     $40

        test    eax, eax
        jnz     .error

.exit_ok:

        stdcall __GetFileHandle, esi
        jc      .error

        mov     [esp+4*regEAX], eax
        clc
        popad
        return

.error:
        stdcall StrDel, [esi+__TFile.hFilename]
        stdcall FreeMem, esi
        stc
        popad
        return
endp





proc __GetFileHandle, .pFileStruc
begin
        pushad

if options.Threads
        stdcall WaitForMutex, FileMutex, 2
        jc      .finish
end if

; Search for first empty place.

        mov     edx, [ptrFileList]

        mov     ecx, FILE_SEARCH_ONE_ATEMPT       ; search only limited count of items
        cmp     ecx, [edx+TArray.count]
        jb      @f
        mov     ecx, [edx+TArray.count]
@@:
        mov     esi,[edx+TArray.lparam]         ; from where to search
        xor     eax,eax

.search:
        dec     ecx
        js      .notfound

        inc     esi
        cmp     esi, [edx+TArray.count]
        jb      @f
        xor     esi,esi
@@:
        cmp     [edx+TArray.array+4*esi], eax
        je      .found
        jmp     .search

.notfound:
        mov     [edx+TArray.lparam], esi        ; store the place where the search ends this time.
        mov     esi, [edx+TArray.count]
        cmp     esi, $7fff
        ja      .error

        stdcall AddArrayItems, edx, 1
        mov     [ptrFileList], edx
        jmp     .store

.found:
        mov     [edx+TArray.lparam], esi

.store:
        mov     eax, [.pFileStruc]
        mov     [edx+TArray.array+4*esi], eax

        or      esi, $00008000
        mov     [esp+4*regEAX], esi

        clc

.exit:
if options.Threads
        stdcall MutexRelease, FileMutex
end if


.finish:
        popad
        return

.error:
        stc
        jmp     .exit
endp




proc __GetFileStruct, .handle
begin
        push    edx
if options.Threads
        stdcall WaitForMutex, FileMutex, 2
        jc      .finish
end if

        mov     eax, [.handle]
        and     eax, $7fff
        mov     edx, [ptrFileList]

        cmp     eax, [edx+TArray.count]
        ja      .error

        mov     eax, [edx+TArray.array+4*eax]
        test    eax, eax
        jz      .error

.exit:
if options.Threads
        stdcall MutexRelease, FileMutex
end if

.finish:
        pop     edx
        return


.error:
        xor     eax, eax
        stc
        jmp     .exit
endp





;--------------------------------------
; if CF = 0, the file was closed.
; if CF = 1, eax is error code.
;--------------------------------------
body FileClose
begin
        pushad

if options.Threads
        stdcall WaitForMutex, FileMutex, 2
        jc      .finish
end if

        mov     eax, [.handle]
        cmp     eax, $ffff
        ja      .error

        and     eax, $7fff
        mov     edx, [ptrFileList]

        cmp     eax, [edx+TArray.count]
        ja      .error

        xor     ecx, ecx
        xchg    ecx, [edx+TArray.array+4*eax]
        test    ecx, ecx
        jz      .error

        stdcall StrDel, [ecx+__TFile.hFilename]
        stdcall FreeMem, ecx

        clc

.exit:
if options.Threads
        stdcall MutexRelease, FileMutex
end if


.finish:
        popad
        return

.error:
        stc
        jmp     .exit
endp


; returns 32bit file size in eax
body FileSize
begin
        stdcall __GetFileStruct, [.handle]
        jc      .finish

        mov     eax, [eax+__TFile.info.file_size]
        clc

.finish:
        return
endp



body FileRead
.op   __TFileOp
begin
        push    ebx esi

        mov     esi, [.handle]
        cmp     esi, [STDIN]
        je      .console_read

        cmp     esi, [STDOUT]
        je      .console_read

        cmp     esi, [STDERR]
        je      .console_read

        stdcall __GetFileStruct, esi
        jc      .error

        mov     esi, eax
        xor     eax, eax

        mov     [.op.subfunc], eax
        mov     [.op.flags], eax
        mov     [.op.filename], al

        mov     eax, [esi+__TFile.pointer]
        mov     [.op.offset], eax

        mov     eax, [.count]
        mov     [.op.size], eax

        mov     eax, [.buffer]
        mov     [.op.ptrBuffer], eax

        stdcall StrPtr, [esi+__TFile.hFilename]
        mov     [.op.ptrFilename], eax

        mov     eax, sys_file_system_lfn
        lea     ebx, [.op]
        int     $40

        test    eax, eax
        jz      .readok

        cmp     eax, fileErrorEOF
        jne     .error

.readok:
        add     [esi+__TFile.pointer], ebx
        mov     eax, ebx
        clc
        pop     esi ebx
        return

.error:
        stc
        pop     esi ebx
        return

.console_read:
        cmp     [.handle], 0
        je      .error

        mov     esi, [.buffer]

.read_loop:
        stdcall SocketReceive, [.handle], esi, 1, 0
        jc      .finish

        inc     esi

        cmp     byte [esi-1], $0d
        je      .return

        dec     [.count]
        jnz     .read_loop

.return:
        sub     esi, [.buffer]
        mov     eax, esi

.finish:
        pop     esi ebx
        return
endp




body FileWrite
.op   __TFileOp
begin
        push    ebx esi

        mov     esi, [.handle]

        cmp     esi, [STDIN]
        je      .console_write

        cmp     esi, [STDOUT]
        je      .console_write

        cmp     esi, [STDERR]
        je      .console_write

        stdcall __GetFileStruct, esi
        jc      .finish

        mov     esi, eax
        xor     eax, eax

        mov     [.op.subfunc], 3
        mov     [.op.flags], eax
        mov     [.op.filename], al

        mov     eax, [esi+__TFile.pointer]
        mov     [.op.offset], eax

        mov     eax, [.count]
        mov     [.op.size], eax

        mov     eax, [.buffer]
        mov     [.op.ptrBuffer], eax

        stdcall StrPtr, [esi+__TFile.hFilename]
        mov     [.op.ptrFilename], eax

        mov     eax, sys_file_system_lfn
        lea     ebx, [.op]
        int     $40

        add     ebx, [esi+__TFile.pointer]

        cmp     [esi+__TFile.info.file_size], ebx
        ja      @f
        mov     [esi+__TFile.info.file_size], ebx
@@:
        mov     [esi+__TFile.pointer], ebx

        cmp     eax, 1
        cmc                     ; CF = 1 if eax==0;

        mov     eax, ebx

.finish:
        pop     esi ebx
        return


.console_write:
        test    esi, esi
        jz      .finish

        stdcall SocketSend, esi, [.buffer], [.count], 0
        pop     esi ebx
        return

endp


;----------------------------------------------------
; if CF = 0, eax is the new possition in the file
; if CF = 1, eax is error code.
;----------------------------------------------------
body FileSeek
begin
        push    esi

        stdcall __GetFileStruct, [.handle]
        jc      .error

        mov     esi, eax
        mov     eax, [.dist]

        cmp     [.direction], fsFromCurrent
        je      .rel
        cmp     [.direction], fsFromBegin
        je      .begin
        cmp     [.direction], fsFromEnd
        je      .end

.error:
        stc
        mov     eax, [esi+__TFile.pointer]
        pop     esi
        return

.ok:
        clc
        pop     esi
        return

.rel:
        add     eax, [esi+__TFile.pointer]

.begin:
        cmp     [esi+__TFile.info.file_size], eax
        jae     @f
        mov     eax, [esi+__TFile.info.file_size]
@@:
        mov     [esi+__TFile.pointer], eax
        jmp     .ok

.end:
        add     eax, [esi+__TFile.info.file_size]
        js      .error
        jmp     .begin
endp



body FileTruncate
.op   __TFileOp
begin
        mov     [.op.subfunc], fsfSetSize


        return
endp



;--------------------------------------
; if CF = 0, the file was deleted.
; if CF = 1, eax is error code.
;--------------------------------------
body FileDelete
.op   __TFileOp
begin
        push    ebx esi

        xor     eax, eax

        mov     [.op.subfunc], fsfDel
        mov     [.op.offset], eax
        mov     [.op.size], eax
        mov     [.op.ptrBuffer], eax
        mov     [.op.flags], eax
        mov     [.op.filename], al

        stdcall StrPtr, [.filename]
        mov     [.op.ptrFilename], eax

        mov     eax, sys_file_system_lfn
        lea     ebx, [.op]
        int     $40

        cmp     eax, 1
        cmc
        pop     esi ebx
        return
endp





body GetCurrentDir
.buffer rb 1024
begin
        push    ebx ecx edx

        mov     eax, sys_current_directory
        mov     ebx, 2          ; get current dir
        lea     ecx, [.buffer]
        mov     edx, 1024
        int     $40

        stdcall StrDup, ecx
        push    eax

        stdcall StrPtr, eax
        mov     ecx, [eax+string.len]
        cmp     ecx, 1
        je      @f

        cmp     byte [eax+ecx-1], '/'
        jne     @f
        dec     [eax+string.len]
        mov     dword [eax+ecx-1], 0
@@:
        pop     eax
        clc
        pop     ecx ebx
        return
endp




body SetCurrentDir
begin
        push    eax ebx ecx

        stdcall StrPtr, [.hDirectory]
        mov     ecx, eax
        mov     eax, sys_current_directory
        mov     ebx, 1  ; set current dir
        int     $40

        clc
        pop     ecx ebx eax
        return
endp







body GetErrorString
begin
        mov     eax, [.code]
        test    eax, eax
        jz      .finish

        cmp     eax, 30
        jb      .normal

        sub     eax, 30
        cmp     eax, 2
        ja      .unknown

        mov     eax, [.error2+4*eax]
        jmp     .finish

.normal:
        cmp     eax, 11
        ja      .unknown

        mov     eax, [.error+4*eax]

.finish:
        clc
        return

.unknown:
        mov     eax, cErrorUnknown
        jmp     .finish

.error   dd cErrorOK, cErrorMissingBase, cErrorFnNotSupported, cErrorUnknownFS, cErrorReserved, cErrorFileNotFound, cErrorEndOfFile, cErrorBadPointer, cErrorDiskFull, cErrorBadFAT, cErrorAccessDenied, cErrorDeviceError
.error2  dd cErrorOutOfMemory, cErrorNotExecutable, cErrorTooManyProcesses
endp

cErrorOK             text    'No error.'
cErrorMissingBase    text    'Missing base.'      ;???
cErrorFnNotSupported text    'Function not supported on this FS.'
cErrorUnknownFS      text    'Not supported file system.'
cErrorReserved       text    'Reserved error code! Kernel bug?'
cErrorFileNotFound   text    'File not found.'
cErrorEndOfFile      text    'End of file reached.'
cErrorBadPointer     text    'Bad buffer pointer.'
cErrorDiskFull       text    'Disk full.'
cErrorBadFAT         text    'Bad FAT.'
cErrorAccessDenied   text    'Access denied.'
cErrorDeviceError    text    'Device error.'

cErrorUnknown        text    'Unknown error code.'

cErrorOutOfMemory    text    'Out of memory.'
cErrorNotExecutable  text    'File is not executable.'
cErrorTooManyProcesses text  'Too many processes.'



body FreeErrorString
begin
        return
endp




ftDirectory  =  1
ftUnknown    =  2
ftFile       =  3
ftLinkMask   =  $80000000


; reads all items of the directory and fills them in the TArray of type TDirItem.
; arguments:
;   dir - string with the path to the directory.
;
; returns:
;   if not error: CF=0; eax = pointer to TArray of TDirItem;
;   if error:     CF=1; eax = error code;

body DirectoryRead
.op       __TFileOp
          rb  256
.buffer   rb  1024
begin
        push    ebx ecx edx esi edi

        stdcall StrDup, [.dir]
        mov     [.dir], eax

        xor     esi, esi        ; file number

        stdcall CreateArray, sizeof.TDirItem
        mov     edx, eax

.loop:
        lea     ebx, [.op]
        mov     [.op.subfunc], fsfReadDir
        mov     [.op.offset], esi
        mov     [.op.flags], 0        ; ASCII
        mov     [.op.size], 1         ; read one block
        lea     edi, [.buffer]
        mov     [.op.ptrBuffer], edi

        xor     eax, eax
        mov     ecx, 1024/4
        rep stosd

        mov     [.op.filename], 0
        stdcall StrPtr, [.dir]
        mov     [.op.ptrFilename], eax

        mov     eax, sys_file_system_lfn
        int     $40

        test    eax, eax
        jnz     .end_read

        test    dword [.buffer+$20], $08      ; flag volume label
        jnz     .next

        lea     eax, [.buffer+$48]      ; filename in widechar (UTF-16)
        stdcall StrDup, eax
;        stdcall WideCharToUtf8, eax
        mov     ecx, eax

        stdcall AddArrayItems, edx, 1

        mov     [eax+TDirItem.hFilename], ecx

        mov     ecx, ftDirectory
        test    dword [.buffer+$20], $10      ; flag directory
        jnz     @f
        mov     ecx, ftFile
@@:
        mov     [eax+TDirItem.Type], ecx

.next:
        inc     esi
        jmp     .loop

.end_read:
        stdcall StrDel, [.dir]

        cmp     esi, dword [.buffer+8]       ; the count of the elements in the directory.
        jae     .finish_ok

        stdcall FreeDirArray, edx
        xor     eax, eax
        stc
        pop     esi edx ecx ebx
        return


.finish_ok:
        mov     eax, edx        ; the TArray
        clc
        pop     edi esi edx ecx ebx
        return

endp





body GetFileInfo
begin
        stc
        return
endp



proc __ConsoleWrite, .ptrData, .count
begin
        push    eax ecx esi

        mov     esi, [.ptrData]
        mov     ecx, [.count]

.loop:
        test    ecx, ecx
        jz      .end_output

        dec     ecx
        movzx   eax, byte [esi]
        lea     esi, [esi+1]

        stdcall CharOut, eax
        jmp     .loop

.end_output:
        pop     esi ecx eax
        return
endp




body IsRelativePath     ;, .hPath
begin
        push    eax
        stdcall StrLen, [.hPath]
        cmp     eax, 3
        jb      .relative

        stdcall StrPtr, [.hPath]
        cmp     byte [eax], DIR_SLASH
        jne      .drive
        cmp      byte [eax+1], DIR_SLASH
        jmp      .absolute

.drive:
        cmp     byte [eax], 'A'
        jb      .relative
        cmp     byte [eax], 'Z'
        jbe     .maybe_drive

        cmp     byte [eax], 'a'
        jb      .relative
        cmp     byte [eax], 'Z'
        ja      .relative

.maybe_drive:
        cmp     byte [eax+1], ':'
        jne     .relative

        cmp     byte [eax+2], DIR_SLASH
        jne     .relative

.absolute:
        clc
        pop     eax
        return

.relative:
        stc
        pop     eax
        return
endp



body GetCurrentPrefix
begin
        stdcall GetCurrentDir
        push    eax

        stdcall StrPtr, eax
        and     dword [eax+2], 0
        mov     [eax+string.len], 2

        pop     eax
        return
endp

Added freshlib/system/KolibriOS/heapmgr.asm.

























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Dynamic memory management library. OS dependent part.
;
;  Target OS: Dummy
;
;  Dependencies:
;
;  Notes:
;
;_________________________________________________________________________________________


MAX_HEAP_SIZE = $60000000

uglobal
  var __ptrHeapStart = ?
  var __HeapMaxSize  = ?
endg


if used mem.alloc_heap

initialize InitMenuetHeap
begin
        mov     eax, sys_f68
        mov     ebx, 11
        int     $40

        OutputValue "The maximal heap memory size: ", eax, 10, -1

        mov     ecx, eax
        mov     eax, sys_f68
        mov     ebx, 12
        int     $40
        test    eax, eax
        jz      .error

        mov     [__ptrHeapStart], eax
        return

.error:
        int3
endp
end if


proc mem.alloc_heap ;, .size
begin
        mov     eax, [__ptrHeapStart]
        test    eax, eax
        jz      .error
        clc
        retn 4

.error:
        stc
        retn 4
endp




proc mem.free_heap, .block, .size
begin
        push    eax ebx ecx
        mov     eax, sys_f68
        mov     ebx, 13
        mov     ecx, [.block]
        int     $40
        clc
        pop     ecx ebx eax
        return
endp



proc mem.realloc_heap, .heapptr, .newsize, .oldsize
begin
        push    eax ebx ecx edx

        mov     eax, sys_f68
        mov     ebx, 20
        mov     ecx, [.newsize]
        mov     edx, [__ptrHeapStart]
        int     $40

        cmp     eax, [__ptrHeapStart]
        jne     .error

        mov     eax, sys_f68
        mov     ebx, 20
        mov     ecx, MAX_HEAP_SIZE
        mov     edx, [__ptrHeapStart]
        int     $40

        cmp     eax, [__ptrHeapStart]
        jne     .error

        pop     edx ecx ebx eax
        return

.error:
        int3
endp

Added freshlib/system/KolibriOS/memory.asm.





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Dynamic memory management library. KolibriOS part.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;_________________________________________________________________________________________

include '../heapmgr.asm'

Added freshlib/system/KolibriOS/network.asm.





































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license.           |
;|_______________________________________________________________________________________|
;
;  Description: OS dependent part of the network library.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;
;  Author: hidnplayr, KolibriOS development team. (c)2012
;
;_________________________________________________________________________________________

serrTimeout = EWOULDBLOCK
serrAborted = ECONNABORTED


body SocketCreate
;.sock dd ?
;.opt  rd 4
begin
        push    ebx ecx edx esi

        mov     eax, sys_socket
        mov     ebx, sockOpen
        mov     ecx, [.protocol_family]
        mov     edx, [.socket_type]
        mov     esi, [.protocol]
        int     $40

;        mov     [.sock], eax

;        cmp     eax, -1
;        je      .finish

;        mov     [.opt], SOL_SOCKET
;        mov     [.opt+4], SO_BLOCK
;        mov     [.opt+8], 1
;
;        mov     ecx, eax
;        mov     eax, sys_socket
;        mov     ebx, sockSetOptions
;        lea     edx, [.opt]
;        int     $40

;        cmp     eax, -1                 ; if eax is -1, set carry flag
;        je      .finish

;        mov     eax, [.sock]

.finish:
        cmp     eax, -1                 ; if eax is -1, set carry flag
        cmc

        pop     esi edx ecx ebx
        return
endp



body SocketClose
begin
        push    ebx ecx

        mov     eax, sys_socket
        mov     ebx, sockClose
        mov     ecx, [.hSocket]
        int     $40

        cmp     eax, -1                 ; if eax is -1, set carry flag
        cmc
        cmovc   eax, ebx                ; eax = error code.

        pop     ecx ebx
        return
endp



body SocketConnect
begin
        push    ebx ecx edx esi

        mov     eax, sys_socket
        mov     ebx, sockConnect
        mov     ecx, [.hSocket]
        mov     edx, [.pAddress]
        mov     esi, sizeof.TSocketAddress
        int     $40

        cmp     eax, -1                 ; if eax is -1, set carry flag
        cmc
        cmovc   eax, ebx                ; eax = error code.

        pop     esi edx ecx ebx
        return
endp



body SocketBind
begin
        push    ebx ecx edx esi

;        stdcall __InternetByteOrder, [.pAddressIn]

        mov     eax, sys_socket
        mov     ebx, sockBind
        mov     ecx, [.hSocket]
        mov     edx, [.pAddress]
        mov     esi, sizeof.TSocketAddressIn
        int     $40

        cmp     eax, -1                 ; if eax is -1, set carry flag
        cmc
        cmovc   eax, ebx                ; eax = error code.

        pop     esi edx ecx ebx
        return
endp



body SocketListen
begin
        push    ebx ecx edx

        mov     eax, sys_socket
        mov     ebx, sockListen
        mov     ecx, [.hSocket]
        mov     edx, [.maxPending]
        int     $40

        cmp     eax, -1                 ; if eax is -1, set carry flag
        cmc
        cmovc   eax, ebx                ; eax = error code.

        pop     edx ecx ebx
        return
endp



body SocketAccept
.dummy TSocketAddress
       rb 256
begin
        push    ebx ecx edx esi

        mov     edx, [.pAddress]
        mov     esi, sizeof.TSocketAddress
        test    edx, edx
        cmovz   esi, edx

;        test    edx, edx
;        jnz     .targetok
;        lea     edx, [.dummy]
;.targetok:
        mov     eax, sys_socket
        mov     ebx, sockAccept
        mov     ecx, [.hSocket]
        int     $40

        OutputRegister regEAX, 16

        cmp     eax, -1                 ; if eax is -1, set carry flag
        cmc
        cmovc   eax, ebx                ; eax = error code.

        pop     esi edx ecx ebx
        return
endp



body SocketSend
begin
        push    ebx ecx edx esi edi

.send_loop:
        mov     eax, sys_socket
        mov     ebx, sockSend
        mov     ecx, [.hSocket]
        mov     edx, [.pBuffer]
        mov     esi, [.DataLen]
        mov     edi, [.flags]
        int     $40

        cmp     eax, -1                 ; if eax is -1, set carry flag
        je      .error

        add     [.pBuffer], eax
        sub     [.DataLen], eax
        jnz     .send_loop

        clc

.finish:
        pop     edi esi edx ecx ebx
        return

.error:
        mov     eax, ebx
        stc
        jmp     .finish

endp


body SocketReceive
begin
        push    ebx ecx edx esi edi

        mov     eax, sys_socket
        mov     ebx, sockReceive
        mov     ecx, [.hSocket]
        mov     edx, [.pBuffer]
        mov     esi, [.BufferSize]
        mov     edi, [.flags]
        int     $40

        cmp     eax, -1                 ; if eax is -1, set carry flag
        cmc

        pop     edi esi edx ecx ebx
        return
endp


body SocketSendTo
begin
        stc
        return
endp


body SocketReceiveFrom
begin
        stc
        return
endp





body SocketGetOption
begin
        stc
        return
endp



body SocketSetOption
.opt rd 8
begin
        pushad

        mov     eax, [.idOption]
        mov     ecx, [.Value]

        mov     [.opt], SOL_SOCKET
        mov     [.opt+4], eax
        mov     [.opt+8], 1
        mov     [.opt+12], ecx

        mov     eax, sys_socket
        mov     ebx, sockSetOptions
        mov     ecx, [.hSocket]
        lea     edx, [.opt]
        int     $40

        cmp     eax, -1                 ; if eax is -1, set carry flag
        cmc
        jnc     @f
        mov     [esp+4*regEAX], ebx
@@:
        popad
        return
endp















; Creates pair of IPC sockets and return them in EAX and EDX
; Returns CF=1 on error.

proc SocketPair
begin
        push    ebx

        mov     eax, sys_socket
        mov     ebx, sockPair
        int     $40

        cmp     eax, -1
        cmc

        mov     edx, ebx

        pop     ebx
        return
endp






proc __WaitForNetworkEvent
begin
        pushad

        mov     eax, sys_set_app_param
        mov     ebx, $fffffffe
        int     $40

.loop:
        mov     eax, sys_wait_event_timeout
        mov     ebx, 100
        int     $40

        test    eax, eax
        jz      .timeout

        stdcall Output, "Event accepted: "
        stdcall OutputNumber, eax, 16, 8
        cmp     eax, 8
        jne     .loop

        popad
        return

.timeout:
        DebugMsg "Timeout waiting event."
        jmp      .loop

endp

Added freshlib/system/KolibriOS/process.asm.













































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Process management library.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


struct TMutex
  .value        dd ?
  .threadID     dd ?
  .counter      dd ?
  .reserved     dd ?
ends


struct TThreadInfo
  .cpu_usage   dd ?
  .zposWindow  dw ?
  .nWindowSlot dw ?
  .reserve1    dw ?
  .ProcessName rb 11
  .reserve2    db ?
  .processAddr dd ?
  .processSize dd ?
  .TID         dd ?
  .wndPosX     dd ?
  .wndPosY     dd ?
  .wndSizeX    dd ?
  .wndSizeY    dd ?
  .ThreadState dw ?
  .reserve3    dw ?
  .ClientPosX  dd ?
  .ClientPosY  dd ?
  .ClientWidth dd ?
  .ClientHeight dd ?
  .WindowState  db ?
  .EventMask    dd ?
  .min_size = $$ - $
                rb 1024 - .min_size
ends


struct TThreadRecord
  .ThreadID dd ?
  .ptrStack dd ?
ends


uglobal
  __ThreadList TThreadRecord
               rb 255*sizeof.TThreadRecord

  var __ThreadLock = ?
endg


; This procedure should be removed. But only after the file managers and the shell
; of KolibriOS start to set the current directory properly. :)

initialize InitDefaultPath
begin
        mov     esi, bufferPath
        mov     edi, esi
.len:
        lodsb
        cmp     al, '/'
        jne     @f
        mov     edi, esi
@@:
        test    al, al
        jnz     .len

        push    dword [edi]
        mov     dword [edi], 0

        mov     eax, sys_current_directory
        mov     ebx, 1
        mov     ecx, bufferPath
        int     $40

        pop     dword [edi]
        return
endp



body Terminate
begin
; lock the thread list.
        xor     eax, eax
        inc     eax

.wait_loop:
        xchg    eax, [__ThreadLock]
        test    eax, eax
        jz      .locked

        mov     eax, sys_f68    ; switch to another thread.
        mov     ebx, 1
        int     $40
        jmp     .wait_loop

.locked:
        DebugMsg "Thread terminate locked."

        mov     esi, __ThreadList - sizeof.TThreadRecord
        mov     ecx, $100

        call    __GetThreadID

.loop:
        dec     ecx
        jz      .error

        add     esi, sizeof.TThreadRecord
        cmp     [esi+TThreadRecord.ThreadID], eax
        jne     .loop

        xor     ecx, ecx
        mov     [esi+TThreadRecord.ThreadID], ecx
        xchg    ecx, [esi+TThreadRecord.ptrStack]

        mov     [__ThreadLock], 0       ; no need to be locked anymore.

        DebugMsg "Thread will be terminated now."

; free the stack

        mov     eax, sys_f68
        mov     ebx, 13
        int     $40

; terminate the thread

        mov     eax,-1                  ; Function -1 : close the thread
        int     $40

.error:                         ; something very wrong.
        DebugMsg "Thread terminate error. Stop it with INT3"
        int3
endp


; Terminate current process
; Returns: nothing.

body TerminateAll
begin

.wait_loop:
        mov     eax, 1
        xchg    eax, [__ThreadLock]
        test    eax, eax
        jz      .locked

        mov     eax, sys_f68    ; switch to another thread.
        mov     ebx, 1
        int     $40

        jmp     .wait_loop

.locked:
        mov     esi, __ThreadList - sizeof.TThreadRecord
        mov     edx, $100

.loop:
        dec     edx
        jz      .threads_ok

        lea     esi, [esi+sizeof.TThreadRecord]
        cmp     [esi+TThreadRecord.ThreadID], 0
        je      .loop

        mov     eax, sys_system
        mov     ebx, 18
        mov     ecx, [esi+TThreadRecord.ThreadID]
        int     $40
        jmp     .loop

; then terminate the main thread, but what if TerminateAll is called from another thread???
.threads_ok:
        mov     [__ThreadLock], 0

        mov     eax,-1
        int     $40
        int3
endp



body GetCmdArguments
begin
        push    ebx ecx edx esi
        stdcall CreateArray, 4
        mov     edx, eax

        stdcall StrDup, bufferPath
        push    eax
        stdcall AddArrayItems, edx, 1
        pop     dword [eax]

        mov     esi, bufferArguments

.main_loop:
        mov     al, [esi]
        test    al, al
        jz      .end_of_arg

        cmp     al, ' '
        ja      .nospace

        inc     esi
        jmp     .main_loop

.nospace:
        xor     ah, ah
        cmp     al, '"'
        jne     .begin

        mov     ah, al
        inc     esi

.begin:
        mov     ebx, esi

.argloop:
        mov     al, [esi]
        test    al, al
        jz      .end_found

        cmp     al, ah
        je      .end_found

        cmp     al, ' '
        jbe     .end_found

        inc     esi
        jmp     .argloop

.end_found:
        mov     ecx, esi
        sub     ecx, ebx

        test    al, al
        jz      .endok

        test    ah,ah
        jz      .endok
        inc     esi
.endok:
        stdcall StrExtract, ebx, 0, ecx

        push    eax
        stdcall AddArrayItems, edx, 1
        pop     dword [eax]
        jmp     .main_loop

.end_of_arg:
        mov     eax, edx
        pop     esi edx ecx ebx
        clc
        return
endp



; Creates a new execution thread
; Returns: CF=1 if error.
;          CF=0, eax = pid of the new process being created

body ThreadCreate
begin
        push    ebx ecx edx edi

.wait_loop:
        mov     ebx, 1
        xchg    ebx, [__ThreadLock]
        test    ebx, ebx
        jz      .locked

        mov     eax, sys_f68    ; switch to another thread.
        mov     ebx, 1
        int     $40

        jmp     .wait_loop


; search for free slot:

.locked:
        mov     edi, __ThreadList - sizeof.TThreadRecord
        mov     ecx, $100
        xor     eax, eax

.loop:
        dec     ecx
        jz      .error         ; no empty slot.

        lea     edi, [edi+sizeof.TThreadRecord]
        cmp     [edi+TThreadRecord.ThreadID], eax
        jne     .loop

; edi points to the TThreadRecord structure

        mov     eax, sys_f68
        mov     ebx, 12
        mov     ecx, STACK_SIZE
        int     $40
        test    eax, eax
        jz      .error

        mov     [edi+TThreadRecord.ptrStack], eax
        lea     edx, [eax + STACK_SIZE - 8]

        mov     eax, [.ptrArguments]
        mov     ebx, [.ptrFunction]
        mov     [edx+4], eax
        mov     [edx], ebx

        mov     eax, sys_threads
        mov     ebx, 1          ; create thread
        mov     ecx, __CommonThreadProc
        int     $40

        cmp     eax, -1
        je      .error

        DebugMsg "Thread created."

        mov     [edi+TThreadRecord.ThreadID], eax
        clc

.finish:
        mov     [__ThreadLock], 0
        pop     edi edx ecx ebx
        return

.error:
        DebugMsg "ThreadCreate ERROR!"
        stc
        jmp     .finish
endp



proc __CommonThreadProc
begin
        DebugMsg "Thread start!"

        pop     eax
        call    eax     ; the argument is already in the stack.

        DebugMsg "Thread terminate."

        stdcall Terminate, eax
endp



body FreeThreadID
begin
        return
endp


; returns the threadID of the current thread.
proc __GetThreadID
.info TThreadInfo
begin
        push    ebx ecx
; what is TID?
        mov     eax, sys_cpuusage
        lea     ebx, [.info]
        mov     ecx, -1
        int     $40

        mov     eax, [.info.TID]
        pop     ecx ebx
        return
endp



; MUTEX functions
;_________________________________________________________________________________________

body MutexCreate
begin
        push    eax ecx
        mov     ecx, [.ptrMutex]
        xor     eax, eax
        mov     dword [ecx+TMutex.value], eax
        mov     dword [ecx+TMutex.threadID], eax
        mov     dword [ecx+TMutex.counter], 0
        clc
        pop     ecx eax
        return
endp




body WaitForMutex
begin
        pushad

        mov     eax, [.timeout]
        test    eax, eax
        jns     .compute_timeout

        mov     ecx, -1
        jmp     .timeout_ok


.compute_timeout:
        cdq
        mov     ebx, 10
        div     ebx
        mov     edx, eax        ; wait_to
        xor     ecx, ecx        ; wait_to_carry

        mov     eax, sys_getsetup
        mov     ebx, 9
        int     $40

        add     edx, eax
        adc     ecx, ecx

.timeout_ok:
        call    __GetThreadID
        mov     edi, eax

        mov     esi, [.ptrMutex]

.loop:
        xor     eax, eax
        inc     eax
        lock xchg    eax, [esi+TMutex.value]
        test    eax, eax
        jz      .lockok                 ; now it is locked and it was unlocked

        cmp     [esi+TMutex.threadID], edi
        je      .lockok                 ; it is locked by the same thread before.

; check the timeout
        test    ecx, ecx
        js      .wait_more              ; the timeout is disabled.

        mov     eax, sys_getsetup
        mov     ebx, 9
        int     $40

        cmp     eax, edx                ; is the current time above the waitto time?
        ja      .maybetimeout

        xor     ecx, ecx                ; reset the carry.
        jmp     .wait_more

.maybetimeout:
        test    ecx, ecx                ; there is a carry in the counter.
        jz      .error

.wait_more:
        mov     eax, sys_f68    ; switch to another thread.
        mov     ebx, 1
        int     $40
        jmp     .loop

.lockok:
        inc     [esi+TMutex.counter]
        mov     [esi+TMutex.threadID], edi
        clc
        popad
        return

.error:
        stc
        popad
        return
endp




body MutexRelease
begin
        pushf
        pushad

        stdcall __GetThreadID
        mov     edi, eax
        mov     esi, [.ptrMutex]

        cmp     edi, [esi+TMutex.threadID]
        jne     .unlock_ok

        cmp     [esi+TMutex.counter], 0
        je      .dec_ok                 ; it is error actually, but... well...

        dec     [esi+TMutex.counter]
        jnz     .unlock_ok

.dec_ok:
        mov     [esi+TMutex.threadID], 0
        mov     [esi+TMutex.value], 0

.unlock_ok:
        popad
        popf
        return
endp



body MutexDestroy
begin
        return
endp



body Exec2
begin


        return
endp



body FreeProcessID
begin
        return
endp



; DLL procedures.

body LibLoad
begin
        stc
        return
endp


body LibRelease
begin
        stc
        return
endp


body LibImport
begin
        stc
        return
endp

Added freshlib/system/KolibriOS/serial.asm.













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Serial IO interface library. Linux part.
;
;  Target OS: Kolibri OS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


proc SerSetParams, .hSerial, .Baudrate, .Parity, .Flow, .Timeout
begin


        stc
        return
endp

Added freshlib/system/KolibriOS/timers.asm.





































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Asynchronous timer library.
;
;  Target OS: KolibriOS
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

__sys_time_slice = 10 ;[ms]


if used TimerCreate

initialize __InitTimers
begin
        mov     eax, sys_threads
        mov     ebx, 1
        mov     ecx, __TimerProc
        mov     edx, __timerstack
        int     $40

        return
endp


finalize __StopTimers
begin
        mov     [__timer_stop], 1

.loop:
        mov     eax, sys_f68
        mov     ebx, 1
        int     $40

        cmp     [__timer_stop], 0
        jne     .loop
        return
endp


end if


proc GetTime
begin
        push    ebx ecx edx

        mov     eax, sys_clock
        int     $40

        mov     edx, eax

        mov     ah, al
        and     ah, $0f ; low digit
        and     al, $f0
        and     dl, $f0
        shr     al, 1   ; *8
        shr     dl, 3   ; *2
        add     al, dl
        add     al, ah
        movzx   ebx, al
        imul    ebx, 60*60      ; hours in seconds.

        shr     edx, 8

        mov     ah, dl
        mov     al, dl

        and     ah, $0f ; low digit
        and     al, $f0
        and     dl, $f0
        shr     al, 1   ; *8
        shr     dl, 3   ; *2
        add     al, dl
        add     al, ah
        movzx   eax, al
        imul    eax, $60        ; minutes in seconds

        add     ebx, eax

        shr     edx, 8

        mov     ah, dl
        mov     al, dl

        and     ah, $0f ; low digit
        and     al, $f0
        and     dl, $f0
        shr     al, 1   ; *8
        shr     dl, 3   ; *2
        add     al, dl
        add     al, ah
        movzx   eax, al
        add     ebx, eax        ; seconds

; here ebx contains the time of the day in seconds...
; now, compute the current date in Unix time...

        mov     eax, sys_date
        int     $40




        mov     eax, ebx
        pop     edx ecx ebx
        return
endp




proc GetLocalTimeOffset
begin
        xor     eax, eax
        return
endp




proc Sleep, .ms
begin
        push    eax ebx ecx edx

        mov     ecx, 10
        mov     eax, [.ms]
        cdq
        div     ecx
        mov     ebx, eax

        mov     eax, sys_delay_hs
        int     $40

        pop     edx ecx ebx eax
        return
endp



uglobal
  rd 1024
  label __timerstack dword

  __timer_stop dd ?
endg



proc __TimerProc
begin

        mov     eax, sys_getsetup
        mov     ebx, 9
        int     $40
        mov     edi, eax

.main_timer_loop:
        cmp     [__timer_stop], 0
        jne     .end_thread

        mov     eax, sys_getsetup
        mov     ebx, 9
        int     $40

        cmp     edi, eax
        jne     .process_timers

        mov     eax, sys_f68
        mov     ebx, 1
        int     $40
        jmp     .main_timer_loop

.process_timers:
        mov     ebx, eax
        sub     ebx, edi
        imul    ebx, __sys_time_slice
        mov     edi, eax

        lea     eax, [__ptrFirstTimer]

.loop:
        mov     eax, [eax+TTimer.next]
.loop2:
        test    eax, eax
        jz      .main_timer_loop

        test    [eax+TTimer.flags], tmfRunning
        jz      .loop

        mov     ecx, [eax+TTimer.value]
        add     ecx, ebx
        mov     [eax+TTimer.value], ecx

        cmp     ecx, [eax+TTimer.interval]
        jl      .loop

.exploop:
        inc     [eax+TTimer.Expired]

        mov     ecx, [eax+TTimer.interval]
        sub     [eax+TTimer.value], ecx
        cmp     [eax+TTimer.value], ecx
        jge     .exploop

        cmp     [eax+TTimer.Callback], 0
        je      .end_event

        mov     ecx, [eax+TTimer.flags]
        and     ecx, $0f
        cmp     ecx, tmfDoNothing
        je      .end_event

; call the callback procedure.
.execloop:
        pushad
        stdcall [eax+TTimer.Callback], eax
        popad

        sub     [eax+TTimer.Expired], 1
        jg      .execloop

.end_event:
        test    [eax+TTimer.flags], tmfSyncDestroy
        jz      .loop

        push    eax
        mov     eax, [eax+TTimer.next]  ; after the destruction, this pointer will be lost.
        stdcall TimerDestroy ; pointer from the stack.
        jmp     .loop2

.end_thread:
        mov     [__timer_stop], 0
        mov     eax, sys_end
        int     $40
endp

Added freshlib/system/Linux/_process_native.asm.

































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
__ThreadStackSize = 1024*1024


; Creates a new execution thread
; Returns: CF=1 if error.
;          CF=0, eax = pid of the new process being created
body ThreadCreate
begin
        push    ebx ecx edx esi edi

        push    ebp
        mov     eax, sys_mmap2
        xor     ebx, ebx
        mov     ecx, __ThreadStackSize
        mov     edx, PROT_READ or PROT_WRITE or PROT_EXEC
        mov     esi, MAP_ANONYMOUS or MAP_PRIVATE or MAP_STACK
        mov     edi, -1
        xor     ebp, ebp
        int $80
        pop     ebp

        cmp     eax, $ffffff00
        jae     .error

; set the guard page:
        push    eax
        mov     ebx, eax
        mov     eax, sys_mprotect
        mov     ecx, 4096               ; one page
        mov     edx, PROT_NONE
        pop     eax

        lea     ecx, [eax+__ThreadStackSize-8-$c00]

; transfer arguments in the new stack.
        mov     eax, [.ptrFunction]
        mov     [ecx], eax
        mov     eax, [.ptrArguments]
        mov     [ecx+4], eax
        lea     esi, [ecx+4]

        mov     eax, sys_clone
        mov     ebx, CLONE_SIGHAND or CLONE_THREAD or CLONE_FILES or         \
                     CLONE_FS or CLONE_VM or CLONE_PARENT
        int 0x80

        test    eax, eax
        js      .error
        jz      .is_clone

;        push    eax

;; release the stack.
;        mov     eax, sys_munmap

;        mov     ebx, ecx
;        lea     ebx, [ecx-__ThreadStackSize+8]

;        mov     ecx, __ThreadStackSize
;        int $80

;        pop     eax
        clc
        pop     edi esi edx ecx ebx
        return

; The stack is not allocated or sys_clone exits with error.
.error:
        stc
        pop     edi esi edx ecx ebx
        return

; this is the clone process - call the thread.
.is_clone:

        pop     eax
        call    eax       ; the argument is already in the stack.
        mov     ebx, eax  ; the thread procedure can return exit code. Save it in esi.

; and exit the process  - the question is - how to free the stack allocated...
        mov     eax, sys_exit
        int     0x80
endp



; Terminate current thread
; Returns: eax = 0
body Terminate
begin
        mov     eax, sys_exit
        mov     ebx, [.exit_code]
        int     $80
        return
endp




body Exec
begin
        return
endp



body FreeThreadID
begin
        return
endp



; MUTEX functions
;_________________________________________________________________________________________


MUTEX_LOCK_CONTEND = $0101

struct TMutex
  .value        dd ?
  .threadID     dd ?
  .counter      dd ?
  .reserved     dd ?
ends


body MutexCreate
begin
        push    eax ecx
        mov     ecx, [.ptrMutex]
        xor     eax, eax
        mov     dword [ecx+TMutex.value], eax
        mov     dword [ecx+TMutex.threadID], eax
        mov     dword [ecx+TMutex.counter], 0
        clc
        pop     ecx eax
        return
endp



body WaitForMutex
.time lnx_timespec
begin
        pushad
        mov     ecx, 100                ; why 100?
        mov     ebx, [.ptrMutex]

        mov     eax, sys_gettid
        int     $80
        mov     edi, eax

        cmp     byte [ebx+TMutex.value], 0      ; locked?
        je      .loop1                          ; no, try to get it

; if locked, check who own it
        cmp     edi, [ebx+TMutex.threadID]
        je      .lock_ok

.loop1:
        mov     dl, 1
        xchg    byte [ebx+TMutex.value], dl
        test    dl, dl
        jz      .lock_ok

        pause   ; causes performance problems in the newest Intel Skylake CPU
        loop    .loop1

; Set up syscall details
        mov      edx, MUTEX_LOCK_CONTEND
        mov      ecx, FUTEX_WAIT or FUTEX_PRIVATE_FLAG
        xor      esi, esi        ; timeout
        jmp      .check

; Wait loop
.wait:
        mov     eax, sys_futex
        int     $80

.check:
        mov     eax, edx
        xchg    eax, [ebx+TMutex.value]
        test    eax, 1
        jnz     .wait

.lock_ok:
        inc     [ebx+TMutex.counter]
        mov     [ebx+TMutex.threadID], edi
        clc
        popad
        return

.err_timeout:
        stc
        popad
        return
endp




body MutexRelease
begin
        pushf
        pushad

        mov     ebx, [.ptrMutex]
        mov     eax, sys_gettid
        int     $80
        mov     edi, eax

        cmp     edi, [ebx+TMutex.threadID]
        jne     .unlock_ok

        cmp     [ebx+TMutex.counter], 0
        je      .dec_ok
        dec     [ebx+TMutex.counter]
        jnz     .unlock_ok

.dec_ok:
        cmp     dword [ebx+TMutex.value], 1
        jne     .unlock

        mov     eax, 1
        xor     ecx, ecx
        lock cmpxchg [ebx+TMutex.value], ecx
        jz      .unlock_ok

.unlock:
        mov     byte [ebx+TMutex.value], 0

; Spin, and hope someone takes the lock
        mov     ecx, 200

.wait:
        test    byte [ebx], 1
        jnz     .unlock_ok

        rep nop
        loop    .wait

; Wake up someone
        mov     byte [ebx+1], 0
        mov     eax, sys_futex
        mov     ecx, FUTEX_WAKE or FUTEX_PRIVATE_FLAG
        mov     edx, 1
        int     $80

.unlock_ok:
        popad
        popf
        clc
        return
endp



body MutexDestroy
begin
        return
endp





; DLL procedures.

body LibLoad
begin
        stc
        return
endp


body LibRelease
begin
        stc
        return
endp


body LibImport
begin
        stc
        return
endp

Added freshlib/system/Linux/_process_posix.asm.











































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293

uses pthreads, libc, libdl


body ThreadCreate
.threadid dd ?
begin
        push    ecx edx
        lea     eax, [.threadid]
        mov     [.threadid], 0
        cinvoke pthread_create, eax, NULL, [.ptrFunction], [.ptrArguments]
        test    eax, eax
        jnz     .error

        cinvoke pthread_detach, [.threadid]
        mov     eax, [.threadid]
        clc
        pop     edx ecx
        return

.error:
        stc
        pop     edx ecx
        return
endp


; Terminate current thread
; Returns: eax = 0
body Terminate
begin
        cinvoke pthread_exit, [.exit_code]
        return
endp




body FreeThreadID
begin
        return
endp




; MUTEX functions
;_________________________________________________________________________________________


;struct TMutex
;  .value     dd ?
;  .recursion dd ?
;  .kind      dd ?
;  .owner     dd ?
;  .event     dd ?
;ends

struct TMutex
  .array rb 48
ends


;TODO: This implementation ignores the .ptrName argument and this way creates only
;private proces mutexes.

body MutexCreate
.attr rb 256
begin
        pushad

        lea     esi, [.attr]
        cinvoke pthread_mutexattr_init, esi
        cinvoke pthread_mutexattr_settype, esi, PTHREAD_MUTEX_RECURSIVE

        cinvoke pthread_mutex_init, [.ptrMutex], esi
        cinvoke pthread_mutex_lock, [.ptrMutex]

        cinvoke pthread_mutexattr_destroy, esi

        popad
        return
endp




body WaitForMutex
.time lnx_timespec
begin
        pushad

        cinvoke pthread_mutex_trylock, [.ptrMutex]
        test    eax, eax
        jz      .finish

        mov     eax, [.timeout]
        test    eax, eax
        js      .no_timeout

        mov     eax, sys_clock_gettime
        mov     ebx, CLOCK_REALTIME
        lea     ecx, [.time]
        int     $80

        mov     eax, [.timeout]
        mov     ecx, 1000
        cdq
        div     ecx
        imul    edx, 1000000

        add     [.time.tv_sec], eax
        add     [.time.tv_nsec], edx
        cmp     [.time.tv_nsec], 1000000000
        jb      @f
        sub     [.time.tv_nsec], 1000000000
        inc     [.time.tv_sec]
@@:

        lea     eax, [.time]
        cinvoke pthread_mutex_timedlock, [.ptrMutex], eax
        test    eax, eax
        jnz     .error
        jmp     .finish

.no_timeout:
        cinvoke pthread_mutex_lock, [.ptrMutex]

.finish:
        clc
        popad
        return

.error:
        mov     [esp+4*regEAX], eax

        stc
        popad
        return
endp




body MutexRelease
begin
        pushf
        push    eax ecx edx
        cinvoke pthread_mutex_unlock, [.ptrMutex]
        pop     edx ecx eax
        popf
        return
endp



body MutexDestroy
begin
        push    eax ecx edx

        cinvoke pthread_mutex_destroy, [.ptrMutex]

        pop     edx ecx eax
        return
endp



proc WaitForFutex, .pFutex, .value, .timeout
  .timeout lnx_timespec
begin
        pushad

        mov     eax, [.timeout]
        mov     ecx, 1000
        cdq
        div     ecx
        imul    edx, 1000000

        mov     [.timeout.tv_sec], eax
        mov     [.timeout.tv_nsec], edx
        cmp     [.timeout.tv_nsec], 1000000000
        jb      @f
        sub     [.timeout.tv_nsec], 1000000000
        inc     [.timeout.tv_sec]
@@:

        mov     eax, sys_futex
        mov     ebx, [.pFutex]

        mov     ecx, FUTEX_WAIT
        mov     edx, [.value]
        lea     esi, [.timeout]

        cmp     edx, [ebx]      ; don't make system call if obvious.
        jne     .no_wait

        int     $80
        test    eax, eax
        jz      .no_wait

        cmp     eax, EINTR
        je      .forced_exit

.no_wait:
        clc
        popad
        return

.forced_exit:
        stc
        popad
        return
endp



proc FutexIncValue, .pFutex
begin
        pushad
        mov     ebx, [.pFutex]

        lock inc [ebx]

        mov     eax, sys_futex
        mov     ecx, FUTEX_WAKE
        mov     edx, $7fffffff
        int     $80

        popad
        return
endp







; DLL procedures.

body LibLoad
begin
        pushad
        stdcall StrPtr, [.hLibName]

        cinvoke dlopen, eax, RTLD_LAZY
        test    eax, eax
        jnz     .finish

        not     eax
        stc

.finish:
        mov     [esp+4*regEAX], eax
        popad
        return
endp



body LibRelease
begin
        pushad
        cinvoke dlclose, [.hLibrary]
        test    eax, eax
        jz      .finish ; test clears CF!
        stc
.finish:
        popad
        return
endp



body LibImport
begin
        pushad

        cinvoke dlerror ; clear the error code.

        stdcall StrPtr, [.hObjectName]
        cinvoke dlsym, [.hLibrary], eax
        mov     [esp+4*regEAX], eax

        cinvoke dlerror
        test    eax, eax
        jz      .finish
        stc
.finish:
        popad
        return
endp

Added freshlib/system/Linux/environment.asm.



































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Linux environment management library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


uglobal
  var _ptrEnvironment = ?
endg


if used _ptrEnvironment
initialize LinuxEnvironmentLibrary
begin
        lea     eax, [esp+4]
        mov     [_ptrEnvironment], eax
        return
endp
end if



proc GetAllEnvironment
.return dd ?
begin
        pushad

        mov     [.return], 0
        mov     eax, [_ptrEnvironment]
        test    eax, eax
        jz      .finish

        mov     ecx, [eax]              ; argument count

        lea     eax, [eax+4*ecx+8]      ; env table.

        mov     esi, [eax]
        test    esi, esi
        jz      .finish

        push    esi

.end_loop:
        cmp     word [esi], 0
        lea     esi, [esi+1]
        jne     .end_loop

        stc
        sbb     esi, [esp]
        lea     ecx, [esi+8]

        stdcall GetMem, ecx
        mov     [.return], eax
        mov     edi, eax
        mov     ecx, esi
        pop     esi
        rep movsb
        xor     eax, eax
        stosd

.finish:
        popad
        mov     eax, [.return]
        return
endp



proc GetEnvVariable, .varname
begin
        push    ebx ecx edx esi edi

        mov     esi, [_ptrEnvironment]         ; points to argc
        mov     eax, [esi]                     ; argc
        lea     esi, [esi+4*eax+8]             ; pointer to the first env pointer.

        stdcall StrPtr, [.varname]
        mov     ebx, eax

.outer:
        mov     edx, [esi]
        lea     esi, [esi+4]

        test    edx, edx                       ; last env element?
        jz      .not_found

        mov     edi, ebx                       ; ptr to name.

.inner:
        mov     al, [edx]
        mov     ah, [edi]
        lea     edx, [edx+1]
        lea     edi, [edi+1]

        test    ah, ah
        jnz     .check_al

        cmp     al, '='
        je      .found

.check_al:
        test    al, al
        jz      .outer

        cmp     al, ah
        je      .inner
        jmp     .outer

.not_found:
        xor     eax, eax
        stc
        pop     edi esi edx ecx ebx
        return

.found:
        stdcall StrDupMem, edx
        pop     edi esi edx ecx ebx
        clc
        return
endp

Changes to freshlib/system/Linux/files.asm.

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
; ____________________________________________________________________
;|                                                                    |
;| This file is part of the project:                                  |
;|                                                                    |
;| ..::FreshGUI::.. - portable, assembler based GUI toolkit.          |
;| __________________________________________________________________ |
;|                                                                    |
;|                          This file                                 |
;|                          ~~~~~~~~~                                 |
;|   Author: John Found                                               |
;|                                                                    |

;|   Title: files.asm  Files management library. OS dependent         |
;|                                                                    |

;|   OS: Linux                                                        |


;|                                                                    |

;|   Notes and changes: This library provides unified interface to    |
;|                      access files for Linux OS                     |
;|                                                                    |
;|____________________________________________________________________|






fsFromBegin     = 0

fsFromEnd       = 1
fsFromCurrent   = 2









































































;--------------------------------------
; if CF = 0, eax is handle to the file.
; if CF = 1, eax is error code.
;--------------------------------------
proc FileOpen, .filename
begin








        return





endp



proc FileCreate, .filename
begin









        return
endp














proc FileClose, .handle
begin



        return






endp




proc FileRead, .handle, .buffer, .count
begin










        return






endp
























;----------------------------------------------------
; if CF = 0, eax is the new possition in the file
; if CF = 1, eax is error code.
;----------------------------------------------------
proc FileSeek, .handle, .dist, .direction
begin






































































































































































































































































































































































































































































































        return
endp



proc FileDelete, .filename










begin










        return
endp




proc GetErrorString, .code

begin















        return
endp



proc FreeErrorString, .ptrString
begin

        return
endp
|
|
<
<
|
|
<
<
<
<
<
>
|
<
>
|
>
>
|
>
|
<
<
|
>
>
>
>
>


>
|
|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|


|

>
>
>
>
>
>
>
>

>
>
>
>
>




|

>
>
>
>
>
>
>
>
>




>
>
>
>
>

>
>
>
>

>
|
|
>
>
>

>
>
>
>
>
>




<
|

>
>
>
>
>
>
>
>
>
>

>
>
>
>
>
>



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>






|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





|
>
>
>
>
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>






|
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





|

>


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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
; _______________________________________________________________________________________
;|                                                                                       |


;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|





;
;  Description: Files manipulation library. Linux part.

;
;  Target OS: Linux
;
;  Dependencies: Uses system calls for file processing and memory.asm for memory
;                allocations.
;
;  Notes:


;_________________________________________________________________________________________

uses libc

DIR_SLASH equ '/'
DIR_SEP_PAIR equ '/\' ; for use with StrNormalizePath and StrNormalizePath2

fsFromBegin     = 0
fsFromCurrent   = 1
fsFromEnd       = 2


faReadOnly   = O_RDONLY
faWriteOnly  = O_WRONLY
faReadWrite  = O_RDWR

faOpenAlways   = O_CREAT             ; if the file does not exists it will be created.
faCreateAlways = O_CREAT or O_TRUNC  ; Creates new file always. If the file exists, truncates it.
faCreateOnly   = O_CREAT or O_EXCL   ; Creates new file only if not exists, else error.

faNonBlocking =  O_NONBLOCK

lockExclusive   = LOCK_EX
lockShared      = LOCK_SH
lockUnlock      = LOCK_UN
lockTryOnly     = LOCK_NB


if used STDIN | used STDOUT | used STDERR
  initialize InitStdHandles
  begin
    if used STDIN
          mov     dword [__std_handle_in], 0
    end if

    if used STDOUT
          mov     dword [__std_handle_out], 1
    end if

    if used STDERR
          mov     dword [__std_handle_err], 2
    end if
          return
  endp
end if



body FileOpenAccess
begin
        push    edx ecx ebx

        if defined ptrStrTable
          stdcall StrPtr, [.filename]
          mov     ebx, eax
        else
          mov   ebx, [.filename]
        end if

        mov     eax, sys_open
        mov     ecx, [.access]
        mov     edx, S_IRUSR+S_IWUSR+S_IRGRP+S_IWGRP+S_IROTH
        int     $80
        cmp     eax, -1
        jle     .error
        clc
        pop     ebx ecx edx
        return

.error:
        neg     eax

if defined options.DebugMode & options.DebugMode
        stdcall __FileErrorDisplay, eax, [.filename]
end if

        stc
        pop     ebx ecx edx
        return
endp




;--------------------------------------
; if CF = 0, the file was closed.
; if CF = 1, eax is error code.
;--------------------------------------
body FileClose
begin
        push    ebx
        mov     eax, sys_close
        mov     ebx, [.handle]
        int     $80
        cmp     eax, -1
        jle     .error
        clc
        pop     ebx
        return
.error:
        neg     eax
        stc
        pop     ebx
        return
endp



body FileLock
begin
        push    eax ebx ecx

        mov     ebx, [.handle]
        mov     eax, sys_flock
        mov     ecx, [.lock]
        int     $80

        shl     eax, 1  ; CF = 1 if eax<0
        pop     ecx ebx eax
        return
endp


; returns 32bit file size in eax
body FileSize
.stat STAT
begin
        push    edx ecx ebx

        mov     eax, sys_newfstat
        mov     ebx, [.handle]
        lea     ecx, [.stat]
        int     $80

        cmp     eax, -1
        jle     .error

        mov     eax, [.stat.st_size]
        clc
        pop     ebx ecx edx
        return

.error:
        neg     eax
        stc
        pop     ebx ecx edx
        return
endp




body FileRead
begin
        push    edx ecx ebx
        mov     eax, sys_read
        mov     ebx, [.handle]
        mov     ecx, [.buffer]
        mov     edx, [.count]
        int     $80
        cmp     eax, -1
        jle     .error
        clc
        pop     ebx ecx edx
        return

.error:
        neg     eax
        stc
        pop     ebx ecx edx
        return
endp


body FileWrite
begin
        push    edx ecx ebx
        mov     eax, sys_write
        mov     ebx, [.handle]
        mov     ecx, [.buffer]
        mov     edx, [.count]
        int     $80
        cmp     eax, -1
        jle     .error
        clc
        pop     ebx ecx edx
        return

.error:
        neg     eax
        stc
        pop     ebx ecx edx
        return
endp


;----------------------------------------------------
; if CF = 0, eax is the new possition in the file
; if CF = 1, eax is error code.
;----------------------------------------------------
body FileSeek
begin
        push    edx ecx ebx
        mov     eax,sys_lseek
        mov     ebx,[.handle]
        mov     ecx,[.dist]
        mov     edx,[.direction]
        int     $80
        cmp     eax,-1
        jle     .error
        clc
        pop     ebx ecx edx
        return

.error:
        neg     eax
        stc
        pop     ebx ecx edx
        return
endp



body FileTruncate
begin
        push    edx ecx ebx

        mov     eax, sys_lseek
        mov     ebx, [.handle]
        xor     ecx, ecx
        mov     edx, fsFromCurrent
        int     $80
        cmp     eax, -1
        jle     .error

        mov     ecx, eax
        mov     eax, sys_ftruncate
        mov     ebx, [.handle]
        int     $80
        cmp     eax,-1
        jle     .error

        clc
        pop     ebx ecx edx
        return

.error:
        neg     eax
        stc
        pop     ebx ecx edx
        return
endp


body FileTruncateTo     ; , .handle, .length
begin
        push    edx ecx ebx

        mov     eax, sys_ftruncate
        mov     ecx, [.length]
        mov     ebx, [.handle]
        int     $80
        cmp     eax,-1
        jle     .error

        clc
        pop     ebx ecx edx
        return

.error:
        neg     eax
        stc
        pop     ebx ecx edx
        return
endp



;--------------------------------------
; if CF = 0, the file was deleted.
; if CF = 1, eax is error code.
;--------------------------------------
body FileDelete
begin
        push    ebx

        if defined ptrStrTable
          stdcall StrPtr, [.filename]
          mov     ebx, eax
        else
          mov   ebx, [.filename]
        end if

        mov     eax,sys_unlink
        int     $80
        cmp     eax,-1
        jle     .error
        clc
        pop     ebx
        return

.error:
        neg     eax
        stc
        pop     ebx
        return
endp




body GetCurrentDir
.buffer rb 1024
begin
        push    ebx ecx

        mov     eax, sys_getcwd
        lea     ebx, [.buffer]
        mov     ecx, 1024
        int     $80
        cmp     eax, -1
        jle     .error

        stdcall StrDupMem, ebx
        clc
        pop     ecx ebx
        return

.error:
        neg     eax
        stc
        pop     ecx ebx
        return
endp




body SetCurrentDir
begin
        push    ebx eax

        stdcall StrPtr, [.hDirectory]
        mov     ebx, eax
        mov     eax, sys_chdir
        int     $80

        clc
        test    eax, eax
        jns     .finish

        neg     eax
        stc

.finish:
        pop     eax ebx
        return
endp



body GetErrorString
.buffer rb 1024
begin
        push    ecx edx

        lea     eax, [.buffer]
        cinvoke strerror_r, [.code], eax, 1024
        test    eax, eax
        jnz     @f
        lea     eax, [.buffer]
@@:
        stdcall StrDupMem, eax

        pop     edx ecx
        clc
        return
endp




body FreeErrorString
begin
        stdcall StrDel, [.ptrString]
        return
endp




ftDirectory  =  DT_DIR
ftUnknown    =  DT_UNKNOWN
ftFile       =  DT_REG
ftLinkMask   =  $80000000


; reads all items of the directory and fills them in the TArray of type TDirItem.
; arguments:
;   dir - string with the path to the directory.
;
; returns:
;   if not error: CF=0; eax = pointer to TArray of TDirItem;
;   if error:     CF=1; eax = error code;

body DirectoryRead
.size   dd ?
.stat STAT64
begin
        push    ebx ecx edx esi edi

        stdcall GetMem, 1024
        mov     esi, eax

        stdcall CreateArray, sizeof.TDirItem
        mov     edi, eax

; open the file
        if defined ptrStrTable
          stdcall StrPtr, [.dir]
          mov     ebx, eax
        else
          mov   ebx, [.dir]
        end if

        mov     eax, sys_open
        mov     ecx, O_RDONLY or O_DIRECTORY
        mov     edx, S_IWUSR+S_IWGRP+S_IWOTH
        int     $80
        test    eax, eax
        js      .error

        mov     ebx, eax

.read_loop:

        mov     eax, sys_getdents64
        mov     ecx, esi
        mov     edx, 1024
        int     $80

; process read information

        test    eax, eax
        jz      .end_of_directory
        js      .error

        mov     [.size], eax

        xor     ecx, ecx

.buffer_parse:
        lea     eax, [esi+ecx+linux_dirent64.d_name]
        stdcall StrDup, eax
        push    eax

        stdcall AddArrayItems, edi, 1
        mov     edi, edx

        pop     [eax+TDirItem.hFilename]

        movzx   edx, byte [esi+ecx+linux_dirent64.d_type]

        call    .get_file_details

        movzx   edx, word [esi+ecx+linux_dirent64.d_reclen]
        add     ecx, edx

        cmp     ecx, [.size]
        jb      .buffer_parse

        jmp     .read_loop

.end_of_directory:

        mov     eax, sys_close
        int     $80

        stdcall FreeMem, esi
        mov     eax, edi
        pop     edi esi edx ecx ebx
        clc
        return

.error:
        stdcall FreeMem, esi
        neg     eax
        pop     edi esi edx ecx ebx
        stc
        return

.get_file_details:
        push    ecx edx esi edi
        mov     edi, eax        ; TDirItem

        stdcall StrPtr, [eax+TDirItem.hFilename]
        mov     ecx, eax

        mov     eax, sys_fstatat64
        lea     edx, [.stat]
        xor     esi, esi
        int     $80

        test    eax, eax
        jnz     .end_file

        mov     eax, [.stat.st_mode]
        mov     [edi+TDirItem.Perm], eax

        mov     edx, [esp+8]
        cmp     edx, DT_LNK
        jne     .type_ok

        mov     edx, [.stat.st_mode]
        shr     edx, 12
        or      edx, ftLinkMask

.type_ok:
        mov     [edi+TDirItem.Type], edx

        mov     eax, dword [.stat.st_size]
        mov     edx, dword [.stat.st_size+4]

        mov     dword [edi+TDirItem.Size], eax
        mov     dword [edi+TDirItem.Size+4], edx

        mov     eax, [.stat.st_mtime]
        xor     edx, edx
        mov     dword [edi+TDirItem.mTime], eax
        mov     dword [edi+TDirItem.mTime+4], edx

.end_file:
        pop     edi esi edx ecx
        retn
endp





body CreateDirectory
begin
        pushad

        if defined ptrStrTable
          stdcall StrPtr, [.DirName]
          mov     ebx, eax
        else
          mov   ebx, [.DirName]
        end if

        mov     eax, sys_mkdir
        mov     ecx, 755o
        int     $80

        cmp     eax, -1
        jle     .error
        clc
        popad
        return

.error:
        neg     eax
        mov     [esp+4*regEAX], eax
        stc
        popad
        return
endp








body GetFileInfo
.fstat STAT
begin
        push    edi ebx ecx eax

        lea     edi, [.fstat]
        mov     ecx, sizeof.STAT / 4
        xor     eax, eax
        rep stosd

        mov     eax, sys_newfstat
        mov     ebx, [.hFile]
        lea     ecx, [.fstat]
        int     $80

        test    eax, eax
        jnz     .error

        lea     ecx, [.fstat]
        mov     ebx, [.ptrFileInfo]

        mov     eax, [ecx+STAT.st_atime]
        cdq
        mov     dword [ebx+TFileInfo.timeAccessed], eax
        mov     dword [ebx+TFileInfo.timeAccessed+4], edx

        mov     eax, [ecx+STAT.st_mtime]
        cdq
        mov     dword [ebx+TFileInfo.timeModified], eax
        mov     dword [ebx+TFileInfo.timeModified+4], edx

; linux does not support creation time, so we set it as the modified time.
        mov     dword [ebx+TFileInfo.timeCreated], eax
        mov     dword [ebx+TFileInfo.timeCreated+4], edx

        pop     eax ecx ebx edi
        clc
        return

.error:
        neg     eax
        mov     [esp], eax

        pop     eax ecx ebx edi
        stc
        return

endp



; Returns:
; CF=1 if the file NOT EXISTS
; CF=0 if the file EXISTS
body FileExists
.fstat STAT
begin
        pushad

        lea     edi, [.fstat]
        mov     ecx, sizeof.STAT / 4
        xor     eax, eax
        rep stosd

        if defined ptrStrTable
          stdcall StrPtr, [.hFileName]
          mov     ebx, eax
        else
          mov   ebx, [.hFileName]
        end if

        mov     eax, sys_newstat
        lea     ecx, [.fstat]
        int     80h
        test    eax, eax
        jz      .exists

; error
        stc
        popad
        return

.exists:
        clc
        popad
        return
endp




body CreatePipe
.hRead  dd ?
.hWrite dd ?
begin
        push    ebx

        mov     eax, sys_pipe
        lea     ebx, [.hRead]
        int     $80
        neg     eax
        jnz     .err

        clc
        mov     eax, [.hRead]
        mov     edx, [.hWrite]
        pop     ebx
        return

.err:
        stc
        pop     ebx
        return
endp






flushInput = 0
flushOutput = 1
flushInputOutput = 2

TCFLSH  = $540B         ; Linux constant.


proc TerminalFlush, .hFile, .flush_what
begin
        pushad
        mov     eax, sys_ioctl
        mov     ebx, [.hFile]
        mov     ecx, TCFLSH
        mov     edx, [.flush_what]
        int     $80

        mov     [esp+4*regEAX], eax
        bt      eax, 31         ; if negative - error
        popad
        return
endp





body IsRelativePath     ;, .hPath
begin
        push    eax
        stdcall StrLen, [.hPath]
        test    eax, eax
        jz      .relative

        stdcall StrPtr, [.hPath]
        cmp     byte [eax], DIR_SLASH
        clc
        je      .finish

.relative:
        stc     ; relative!

.finish:
        pop     eax
        return
endp



body GetCurrentPrefix
begin
        stdcall StrNew
        return
endp

Added freshlib/system/Linux/heapmgr.asm.































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
;this is internal procedure to be used with heap manager's mem.init.
;Don't call this procedure directly.

;; @name mem.alloc_heap
;; @desc
;;    This is internal procedure of heap manager, that handles
;;    platform-dependent aspect of allocating entire heap.
;;    Do not call this procedure.
;; @arg size
;;    Initial size of heap to allocate.
;; @ret
;;    CF set on error, otherwise
;;    EAX = pointer to allocated memory block
;; @err ERR_OUT_OF_MEM
;;     Not enough memory
;; @err ERR_ZERO_SIZE
;;     size = 0
;; @err ERR_OUT_OF_RANGE
;;     size is negative (or larger than 7FFFFFFFh if viewed as unsigned)
;; @err ERR_UNKNOWN
;;     System returned error that wasn't translated to FASMLIB error.
;;     You can {contact} author about this, and translation can be added.
;; @warn Don't call this procedure!
;; @note Returned pointer is always >= 10000h to make it easily distinguishable from handles.
;; @note This procedure is used only on platforms where FASM heap manager is used.
proc mem.alloc_heap, .size
begin
        push    ebx ecx

        ;error if size=0
        cmp     [.size], 0
        je      .error_size_zero

        ;error is size>=80000000h
        cmp     [.size], 70000000h
        ja      .error_size_too_big

        ;call brk(0) to find beginning of heap
        xor   ebx, ebx
        mov     eax, sys_brk
        int     80h
        cmp     eax, -4096
        ja      .error_brk
        mov     ecx, eax

        ;call brk(ecx+.size) to set up heap size
        mov     ebx, ecx
        add     ebx, [.size]
        mov     eax, sys_brk
        int     80h
        cmp     eax, -4096
        ja      .error_brk

        ;return address of heap
        mov     eax, ecx

.rnc:   clc
.r:     pop     ecx ebx
        return

.rc:    stc
        jmp     .r

.error_brk:

        ;catch out-of-memory
        cmp     eax, -12 ;ENOMEM
        jne     @f
        mov     eax, ERR_OUT_OF_MEM
        jmp     .rc
@@:
        mov     eax, ERR_UNKNOWN
        jmp     .rc

.error_size_zero:
        mov     eax, ERR_ZERO_SIZE
        jmp     .rc

.error_size_too_big:
        mov     eax, ERR_OUT_OF_RANGE
        jmp     .rc
endp




;internal procedure to be used with heap manager's mem.init.
;Don't call this procedure directly.

;; @name mem.realloc_heap
;; @desc
;;    This is internal procedure of heap manager, that handles
;;    platform-dependent aspect of resizing entire heap.
;;    Do not call this procedure.
;; @arg heapptr
;;    Pointer to heap block returned by {mem.alloc_heap} or by this procedure.
;; @arg oldsize
;;    Current size of heap. Must be provided by caller.
;; @arg newsize
;;    Desired size of heap.
;; @ret
;;    CF set on error, otherwise
;;    EAX = heapptr
;; @err ERR_INVALID_POINTER
;;    Heap pointer is invalid
;; @err ERR_OUT_OF_MEM
;;     Not enough memory
;; @err ERR_ZERO_SIZE
;;     newsize = 0
;; @err ERR_OUT_OF_RANGE
;;     size is negative (or larger than 7FFFFFFFh if viewed as unsigned)
;; @err ERR_UNKNOWN
;;     System returned error that wasn't translated to FASMLIB error.
;;     You can {contact} author about this, and translation can be added.
;; @warn Don't call this procedure!
;; @warn Heap cannot be moved during resizing.
;; @note Data in heap must be preserved.
;; @note If block is enlarging, then contents of added memory are unknown
proc mem.realloc_heap, .heapptr, .newsize, .oldsize
begin
        push    ebx

        ;call sys_brk(blockptr)
        mov     ebx, [.heapptr] ;pointer to block
        add     ebx, [.newsize]
        mov     eax, sys_brk        ;sys_brk
        int     80h

        ;check error
        cmp     eax, -4096
        ja      .error_brk

.rnc:   clc
.r:     pop     ebx
        return
.rc:    stc
        jmp     .r

.error_brk:
        ;catch invalid block pointer
        cmp     eax, -22 ;EINVAL
        jne     @f
        mov     eax, ERR_INVALID_POINTER
        jmp     .rc
@@:

        ;catch out-of-memory
        cmp     eax, -12 ;ENOMEM
        jne     @f
        mov     eax, ERR_OUT_OF_MEM
        jmp     .rc
@@:

        mov     eax, ERR_UNKNOWN
        jmp     .rc

.error_newsize_zero:
        mov     eax, ERR_ZERO_SIZE
        jmp     .rc

.error_newsize_too_big:
        mov     eax, ERR_OUT_OF_RANGE
        jmp     .rc
endp






;internal procedure to be used with heap manager's mem.init.
;Don't call this procedure directly.


;; @name mem.free_heap
;; @desc
;;    This is internal procedure of heap manager, that handles
;;    platform-dependent aspect of deallocating entire heap.
;;    Do not call this procedure.
;; @arg heapptr
;;    Pointer to heap, returned by {mem.alloc_heap} or {mem.realloc_heap}.
;; @arg heapsize
;;    Current size of heap. Must be provided by caller.
;; @err ERR_INVALID_POINTER
;;    Heap pointer is invalid
;; @err ERR_UNKNOWN
;;     System returned error that wasn't translated to FASMLIB error.
;;     You can {contact} author about this, and translation can be added.
proc mem.free_heap, .heapptr, .heapsize
begin
        push    ebx ecx

        ;call sys_brk(heapptr)
        mov     ebx, [.heapptr]  ;pointer to block
        mov     eax, sys_brk
        int     80h

        ;check error
        cmp     eax, -4096
        ja      .error_brk

        clc

.r:     pop     ecx ebx
        return

.error_brk:

        ;catch invalid block pointer
        cmp eax, -22 ;EINVAL
        jne @f
        mov eax, ERR_INVALID_POINTER
        stc
        jmp .r
@@:
        mov eax, ERR_UNKNOWN
        stc
        jmp     .r

endp



Changes to freshlib/system/Linux/memory.asm.

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


























; ____________________________________________________________________
;|                                                                    |
;| This file is part of the project:                                  |
;|                                                                    |
;| ..::FreshLib::.. - portable, assembler library and GUI toolkit.    |
;|____________________________________________________________________|
;|                                                                    |
;|                          This file                                 |
;|                          _________                                 |
;|   Author: John Found                                               |
;|                                                                    |

;|   Title: memory.asm  Memory management library. OS dependent       |
;|                                                                    |
;|   OS: Linux                                                        |
;|                                                                    |
;|   Notes and changes: This library provides unified interface to    |
;|                      memory manager of the Linux OS                |
;|                                                                    |
;|____________________________________________________________________|



initialize InitMemoryManager
begin
        return
endp






proc GetMem, .size
begin
        push    ebx ecx edx esi edi

        mov     ebx, [.size]
        add     ebx, 3
        and     bl, $fc          ; align to dword.

        cinvoke malloc, ebx
        test    eax, eax
        jz      .error
        push    eax


        cld
        mov     edi, eax
        mov     ecx, ebx
        shr     ecx, 2
        xor     eax, eax
        rep stosd

        pop     eax
        clc
        pop     edi esi edx ecx ebx
        return

.error:
        stc
        pop     edi esi edx ecx ebx
        return

endp



proc FreeMem, .ptr
begin



        pushad
        cinvoke free, [.ptr]
        popad
        clc

        return
endp




proc ResizeMem, .ptr, .newsize
begin
        push    ebx ecx edx esi edi

        mov     ebx, [.newsize]
        add     ebx, 3
        and     bl, $fc          ; align to dword.

        cinvoke realloc, [.ptr], ebx
        test    eax, eax
        jz      .error

        clc
        pop     edi esi edx ecx ebx
        return

.error:
        stc
        pop     edi esi edx ecx ebx
        return
endp


























|
|
<
<
|
|
<
<
<
<
<
>
|
<
<
<
<
<
<
<
|
>
|
<
<
<
|
|
>
>

>
>
|

|








|
>








<

|




|

<




|

>
>
>



<
>






|




















>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
; _______________________________________________________________________________________
;|                                                                                       |


;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|





;
;  Description: Dynamic memory management library. Linux part.







;
;  Target OS: Linux
;



;  Dependencies:
;
;  Notes: Uses libc (malloc etc.) heap management functions.
;_________________________________________________________________________________________

uses libc

body GetMem
begin
        pushad

        mov     ebx, [.size]
        add     ebx, 3
        and     bl, $fc          ; align to dword.

        cinvoke malloc, ebx
        test    eax, eax
        jz      .error

        mov     [esp+4*regEAX], eax

        cld
        mov     edi, eax
        mov     ecx, ebx
        shr     ecx, 2
        xor     eax, eax
        rep stosd


        clc
        popad
        return

.error:
        stc
        popad
        return

endp



body FreeMem
begin
        cmp     [.ptr], 0
        je      @f

        pushad
        cinvoke free, [.ptr]
        popad

@@:
        return
endp




body ResizeMem
begin
        push    ebx ecx edx esi edi

        mov     ebx, [.newsize]
        add     ebx, 3
        and     bl, $fc          ; align to dword.

        cinvoke realloc, [.ptr], ebx
        test    eax, eax
        jz      .error

        clc
        pop     edi esi edx ecx ebx
        return

.error:
        stc
        pop     edi esi edx ecx ebx
        return
endp




if used SpaceAllocate & ~ used GetMem
initialize ReserveAddressSpace
begin
        mov     eax, sys_brk
        xor     ebx, ebx
        int     $80
        mov     [_MemoryFreeSpace], eax
        return
endp
end if


body SpaceAllocate
begin
        push ebx
        mov     eax, sys_brk
        mov     ebx, [_MemoryFreeSpace]
        add     ebx, [.size]
        int     $80
        pop  ebx
        return
endp

Added freshlib/system/Linux/network.asm.

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS dependent part of the network library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

uses libc

serrAccess              = EACCES
serrNoMemory            = ENOMEM
serrProtocolNotSupported= EPROTONOSUPPORT

serrAddessInUse         = EADDRINUSE
serrNotASocket          = ENOTSOCK

serrWouldBlock          = EWOULDBLOCK
serrBadSocket           = EBADF
serrConnRefused         = ECONNREFUSED
serrConnReset           = ECONNRESET
serrDestAddrReq         = EDESTADDRREQ
serrInvalidAddress      = EFAULT
serrInterrupt           = EINTR
serrInvalidArgument     = EINVAL
serrIsConnected         = EISCONN

serrTimeout = EWOULDBLOCK
serrAborted = EINVAL


proc __SocketError
begin
        test    eax, eax
        jns     .no_error
        neg     eax
        stc
        return

.no_error:
        clc
        return
endp


body SocketCreate
begin
        push    ebx ecx edx

        mov     eax, sys_socketcall
        mov     ebx, SYS_SOCKET
        lea     ecx, [.protocol_family]
        int     $80

        call    __SocketError
        pop     edx ecx ebx
        return
endp


body SocketShutDown
.sock dd ?
.dir  dd ?
begin
        push    ebx ecx edx

        push    [.hSocket]
        pop     [.sock]
        mov     [.dir], SHUT_RDWR

        mov     eax, sys_socketcall
        mov     ebx, SYS_SHUTDOWN
        lea     ecx, [.sock]
        int     $80

        call    __SocketError

        pop     edx ecx ebx
        return
endp



body SocketClose
.params rd 2
.buffer rb 256
begin
        push    ebx ecx edx

        push    [.hSocket]
        pop     [.params]
        mov     [.params+4], SHUT_RDWR

        mov     eax, sys_socketcall
        mov     ebx, SYS_SHUTDOWN
        lea     ecx, [.params]
        int     $80
        call    __SocketError
        jc      .finish

.loop:
        lea     ecx, [.buffer]
        stdcall SocketReceive, [.hSocket], ecx, 256, 0
        jc      .finish
        test    eax, eax
        jnz     .loop

.finish:

        mov     eax, sys_close
        mov     ebx, [.hSocket]
        int     $80
        call    __SocketError

        pop     edx ecx ebx
        return
endp



body SocketConnect
.socket    dd ?
.paddr     dd ?
.addrsize  dd ?
begin
        push    ebx ecx edx

        mov     eax, [.hSocket]
        mov     ebx, [.pAddress]
        mov     [.socket], eax
        mov     [.paddr], ebx

        mov     ecx, sizeof.TSocketAddressIn
        cmp     [ebx+TSocketAddress.saFamily], AF_INET
        je      .do_connect

        mov     ecx, sizeof.TSocketAddressIn6
        cmp     [ebx+TSocketAddress.saFamily], AF_INET6
        je      .do_connect

        mov     eax, -EINVAL
        cmp     [ebx+TSocketAddress.saFamily], AF_UNIX
        jne     .finish

        mov     ecx, sizeof.TSocketAddressUn

.do_connect:
        mov     [.addrsize], ecx

        mov     eax, sys_socketcall
        mov     ebx, SYS_CONNECT
        lea     ecx, [.socket]
        int     $80

.finish:
        call    __SocketError
        pop     edx ecx ebx
        return
endp



body SocketBind
.socket   dd ?
.paddr    dd ?
.addrsize dd ?
begin
        push    ebx ecx edx

        mov     eax, [.hSocket]
        mov     ebx, [.pAddress]
        mov     [.socket], eax
        mov     [.paddr], ebx

        mov     ecx, sizeof.TSocketAddressIn
        cmp     [ebx+TSocketAddress.saFamily], AF_INET
        je      .do_bind

        mov     ecx, sizeof.TSocketAddressIn6
        cmp     [ebx+TSocketAddress.saFamily], AF_INET6
        je      .do_bind

        mov     eax, -EINVAL
        cmp     [ebx+TSocketAddress.saFamily], AF_UNIX
        jne     .finish

        mov     ecx, sizeof.TSocketAddressUn

.do_bind:
        mov     [.addrsize], ecx

        mov     eax, sys_socketcall
        mov     ebx, SYS_BIND
        lea     ecx, [.socket]
        int     $80

.finish:
        call    __SocketError
        pop     edx ecx ebx
        return
endp



body SocketListen
begin
        push    ebx ecx edx

        mov     eax, sys_socketcall
        mov     ebx, SYS_LISTEN
        lea     ecx, [.hSocket]
        int     $80

        call    __SocketError
        pop     edx ecx ebx
        return
endp



body SocketAccept
.sock    dd ?
.addr    dd ?
.plen    dd ?

.addrlen dd ?
begin
        push    ebx edx

        mov     eax, [.hSocket]
        lea     ebx, [.addrlen]
        mov     ecx, [.pAddress]
        mov     edx, sizeof.TSocketAddressIn

        test    ecx, ecx
        cmovz   edx, ecx

        mov     [.sock], eax
        mov     [.plen], ebx
        mov     [.addr], ecx
        mov     [.addrlen], edx

        mov     eax, sys_socketcall
        mov     ebx, SYS_ACCEPT
        lea     ecx, [.sock]
        int     $80

        call    __SocketError
        mov     ecx, [.addrlen]

        pop     edx ebx
        return
endp



body SocketSend
begin
        push    ebx ecx edx

        or      [.flags], MSG_NOSIGNAL
        mov     eax, sys_socketcall
        mov     ebx, SYS_SEND
        lea     ecx, [.hSocket]
        int     $80
        call    __SocketError
        pop     edx ecx ebx
        return
endp


body SocketReceive
begin
        push    ebx ecx edx
        mov     eax, sys_socketcall
        mov     ebx, SYS_RECV
        lea     ecx, [.hSocket]
        int     $80
        call    __SocketError
        pop     edx ecx ebx
        return
endp


body SocketSendTo
.sock  dd ?
.buff  dd ?
.len   dd ?
.flgs  dd ?
.addr  dd ?
.alen  dd ?
begin
        push    ebx ecx edx

        lea     ecx, [.sock]
        mov     edx, 16

.copy:
        mov     eax, [.hSocket+4*edx]
        mov     [ecx+4*edx], eax
        dec     edx
        jns     .copy
        mov     [.alen], sizeof.TSocketAddress

        mov     eax, sys_socketcall
        mov     ebx, SYS_SENDTO
        int     $80
        call    __SocketError

        pop     edx ecx ebx
        return
endp


body SocketReceiveFrom
.sock  dd ?
.buff  dd ?
.len   dd ?
.flgs  dd ?
.addr  dd ?
.alen  dd ?
begin
        push    ebx edx

        lea     ecx, [.sock]
        mov     edx, 16

.copy:
        mov     eax, [.hSocket+4*edx]
        mov     [ecx+4*edx], eax
        dec     edx
        jns     .copy
        mov     [.alen], sizeof.TSocketAddress

        mov     eax, sys_socketcall
        mov     ebx, SYS_RECVFROM
        int     $80
        call    __SocketError
        mov     ecx, [.alen]
        pop     edx ebx
        return
endp



body SocketGetOption
.socket     dd ?
.level      dd ?
.option     dd ?
.ptr_buffer dd ?
.ptr_size   dd ?

.ret_size dd ?
.buffer   rd 4
begin
        push    ebx ecx edx

        mov     eax, [.hSocket]
        mov     ebx, [.idOption]
        lea     ecx, [.buffer]

        mov     [.socket], eax
        mov     [.level], SOL_SOCKET
        mov     [.option], ebx
        mov     [.ptr_buffer], ecx
        lea      eax, [.ret_size]
        mov      [.ptr_size], eax
        mov      [.ret_size], 16

        mov     eax, sys_socketcall
        mov     ebx, SYS_GETSOCKOPT
        lea     ecx, [.socket]
        int     $80

        call    __SocketError
        jc      .finish

        cmp     [.idOption], soSendTimeout
        je      .timeouts
        cmp     [.idOption], soRecvTimeout
        je      .timeouts
        cmp     [.idOption], soLinger
        je      .linger

        mov     eax, [.buffer]
        clc

.finish:
        pop     edx ecx ebx
        return

.timeouts:
        mov     eax, [.buffer+lnx_timeval.tv_usec]
        cdq
        mov     ecx, 1000
        idiv    ecx
        mov     edx, [.buffer+lnx_timeval.tv_sec]
        imul    edx, 1000
        add     eax, edx
        clc
        jmp     .finish

.linger:
        mov     eax, [.buffer]          ; linger flag
        test    eax, eax
        jz      .finish

        mov     eax, [.buffer+4]
        clc
        jmp     .finish
endp



body SocketSetOption
.socket     dd ?
.level      dd ?
.option     dd ?
.ptr_buffer dd ?
.buf_size   dd ?

.buffer rd 4
begin
        push    ebx ecx edx

        mov     eax, [.hSocket]
        mov     ebx, [.idOption]
        lea     ecx, [.buffer]

        mov     [.socket], eax
        mov     [.level], SOL_SOCKET
        mov     [.option], ebx
        mov     [.ptr_buffer], ecx

        cmp     ebx, soRecvTimeout
        je      .timeouts
        cmp     ebx, soSendTimeout
        jne     .not_timeout

.timeouts:
        mov     eax, [.Value]   ; time in [ms]
        cdq
        mov     ecx, 1000
        div     ecx

        imul    edx, 1000       ; in [us]

        lea     ecx, [.buffer]
        mov     [ecx+lnx_timeval.tv_sec], eax   ; the seconds.
        mov     [ecx+lnx_timeval.tv_usec], edx  ; the microseconds.
        mov     [.buf_size], sizeof.lnx_timeval
        jmp     .call_socket

.not_timeout:
        cmp     ebx, soLinger
        jne     .not_linger

        mov     eax, [.Value]
        mov     [.buffer], eax
        mov     [.buffer+4], eax
        mov     [.buf_size], 8
        jmp     .call_socket

.not_linger:
        mov     eax, [.Value]
        mov     [.buffer], eax
        mov     [.buf_size], 4

.call_socket:
        mov     eax, sys_socketcall
        mov     ebx, SYS_SETSOCKOPT
        lea     ecx, [.socket]
        int     $80

        call    __SocketError

        pop     edx ecx ebx
        return
endp



struct TAddrInfo
  .flags       dd ?
  .family      dd ?
  .sock_type   dd ?
  .protocol    dd ?
  .addrlen     dd ?
  .p_sock_addr dd ?
  .p_canonname dd ?
  .p_next      dd ?     ; next addrinfo structure.
ends



; returns the IP address of some domain in EAX

body ResolveDomainIP;, .hDomain
.result dd ?
begin
        pushad

        stdcall StrPtr, [.hDomain]

        lea     ecx, [.result]

        mov     edi, esp
        and     esp, $fffffff0
        cinvoke getaddrinfo, eax, 0, 0, ecx
        mov     esp, edi

        test    eax, eax
        jnz     .error

        mov     esi, [.result]

.loop:
        test    esi, esi
        jz      .not_found

        cmp     [esi+TAddrInfo.family], AF_INET
        jne     .next

        cmp     [esi+TAddrInfo.sock_type], SOCK_STREAM
        jne     .next

        cmp     [esi+TAddrInfo.protocol], IPPROTO_TCP
        jne     .next

        cmp     [esi+TAddrInfo.addrlen], sizeof.TSocketAddressIn
        je      .found

.next:
        mov     esi, [esi+TAddrInfo.p_next]
        jmp     .loop

.end_loop:


.found:
        mov     edx, [esi+TAddrInfo.p_sock_addr]
        mov     eax, [edx+TSocketAddressIn.saAddress]
        bswap   eax
        mov     [esp+4*regEAX], eax

        clc

.finish:

        pushf
        cinvoke freeaddrinfo, [.result]
        popf

.exit:
;        mov     esp, [.stack]
        popad
        return

.not_found:
        stc
        jmp     .finish

.error:
        stc
        jmp     .exit

endp




body ResolveDomainIP6;, .hDomain
.result dd ?
begin
        pushad

        stdcall StrPtr, [.hDomain]

        lea     ecx, [.result]

        mov     edi, esp
        and     esp, $fffffff0
        cinvoke getaddrinfo, eax, 0, 0, ecx
        mov     esp, edi

        test    eax, eax
        jnz     .error

        mov     esi, [.result]

.loop:
        test    esi, esi
        jz      .not_found

        cmp     [esi+TAddrInfo.family], AF_INET6
        jne     .next

        cmp     [esi+TAddrInfo.sock_type], SOCK_STREAM
        jne     .next

        cmp     [esi+TAddrInfo.protocol], IPPROTO_TCP
        jne     .next

        cmp     [esi+TAddrInfo.addrlen], sizeof.TSocketAddressIn6
        je      .found

.next:
        mov     esi, [esi+TAddrInfo.p_next]
        jmp     .loop

.end_loop:


.found:
        mov     edx, [esi+TAddrInfo.p_sock_addr]
        mov     eax, [edx+TSocketAddressIn6.saAddress.addr32]
        mov     ebx, [edx+TSocketAddressIn6.saAddress.addr32+4]
        mov     ecx, [edx+TSocketAddressIn6.saAddress.addr32+8]
        mov     edx, [edx+TSocketAddressIn6.saAddress.addr32+12]

        mov     [esp+4*regEAX], eax
        mov     [esp+4*regEBX], ebx
        mov     [esp+4*regECX], ecx
        mov     [esp+4*regEDX], edx
        clc

.finish:

        pushf
        cinvoke freeaddrinfo, [.result]
        popf

.exit:
;        mov     esp, [.stack]
        popad
        return

.not_found:
        stc
        jmp     .finish

.error:
        stc
        jmp     .exit

endp

Added freshlib/system/Linux/process.asm.





































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Process management library. Linux part
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________



; Terminate all process threads
body TerminateAll
begin
        mov     eax, sys_exit_group
        mov     ebx, [.exit_code]
        int     $80
        return
endp




body SetForcedTerminateHandler

  .action lnx_sigaction

begin
        pushad

        mov     eax, [.procHandler]
        mov     [__UserSignalsProc], eax

        mov     [.action.sa_handler], __TerminateSignalsHandler
        mov     [.action.sa_sigaction], 0
        mov     [.action.sa_mask], 0
        mov     [.action.sa_flags], 0
        mov     [.action.sa_restorer], 0

        mov     eax, sys_sigaction
        mov     ebx, SIGTERM
        lea     ecx, [.action]
        xor     edx, edx
        int     $80

        mov     eax, sys_sigaction
        mov     ebx, SIGINT
        lea     ecx, [.action]
        xor     edx, edx
        int     $80

        mov     eax, sys_sigaction
        mov     ebx, SIGQUIT
        lea     ecx, [.action]
        xor     edx, edx
        int     $80

        mov     eax, sys_sigaction
        mov     ebx, SIGHUP
        lea     ecx, [.action]
        xor     edx, edx
        int     $80

        mov     eax, sys_sigaction
        mov     ebx, SIGUSR1
        lea     ecx, [.action]
        xor     edx, edx
        int     $80

        popad
        return
endp


uglobal
  __UserSignalsProc dd ?
  __MemoryFault     dd ?
endg


proc __TerminateSignalsHandler, .signal
begin
        pushad
        DebugMsg "Terminating event received!"

        cmp     [__UserSignalsProc], 0
        je      .finish

        stdcall [__UserSignalsProc], [.signal]

.finish:
        popad
        cret
endp






body GetCmdArguments
begin
        push    ecx edx esi

        mov     esi, [_ptrEnvironment]

        mov     ecx, [esi]
        add     esi, 4

        stdcall CreateArray, 4
        mov     edx, eax
        jecxz   .array_ok

        stdcall AddArrayItems, eax, ecx

.array_ok:
        push    edx
        jecxz   .arg_ok

        lea     edx, [edx+TArray.array]

.loop:
        lodsd
        stdcall StrDupMem, eax
        mov     [edx], eax
        add     edx, 4
        loop    .loop

.arg_ok:
        pop     eax
        pop     esi edx ecx
        return
endp







proc SetSegmentationFaultHandler, .procHandler

  .action lnx_sigaction

begin
        pushad

        mov     eax, [.procHandler]
        mov     [__MemoryFault], eax

        mov     [.action.sa_handler], __ExceptionHandler
        mov     [.action.sa_sigaction], 0
        mov     [.action.sa_mask], 0
        mov     [.action.sa_flags], 0
        mov     [.action.sa_restorer], 0

        mov     eax, sys_sigaction
        mov     ebx, SIGSEGV
        lea     ecx, [.action]
        xor     edx, edx
        int     $80

        popad
        return
endp



if used __ExceptionHandler

__reg_names db  'eax', sig_context.eax
            db  'ebx', sig_context.ebx
            db  'ecx', sig_context.ecx
            db  'edx', sig_context.edx
            db  'esi', sig_context.esi
            db  'edi', sig_context.edi
            db  'ebp', sig_context.ebp
            db  'esp', sig_context.esp
            dd  0

__ExceptionHandler:

        lea     esi, [esp+8]    ; the start of sig_context structure.

        stdcall GetCmdArguments
        mov     edx, eax

        stdcall StrSplitFilename, [edx+TArray.array]
        stdcall StrDel, eax

        stdcall StrCat, [edx+TArray.array], "fault.txt"

        stdcall FileOpenAccess, [edx+TArray.array], faCreateAlways or faWriteOnly
        mov     ebx, eax

        stdcall ListFree, edx, StrDel

; Write the registers to the file:

        mov     edi, __reg_names

.reg_loop:
        cmp     byte [edi], 0
        je      .dump_stack

        stdcall FileWrite, ebx, edi, 3
        stdcall FileWrite, ebx, txt " = ", 3

        movzx   eax, byte [edi+3]
        stdcall NumToStr, [esi + eax], ntsHex or ntsUnsigned or ntsFixedWidth + 8
        stdcall FileWriteString, ebx, eax
        stdcall FileWriteString, ebx, <txt 13, 10>
        add     edi, 4
        jmp     .reg_loop

; Write the stack backtrace to the file:

.dump_stack:
        stdcall FileWriteString, ebx, <txt 13, 10>
        mov     eax, [esi+sig_context.eip]

        stdcall NumToStr, eax, ntsHex or ntsUnsigned or ntsFixedWidth + 8
        stdcall FileWriteString, ebx, eax
        stdcall FileWriteString, ebx, <txt 13, 10, 13, 10>

        lea     ebp, [esi+sig_context.ebp]

.loop:
        cmp     dword [ebp], 0
        cmove   eax, [ebp+8]
        cmovne  ebp, [ebp]
        cmovne  eax, [ebp+4]    ; return address
        cmove   ebp, [ebp]
        
        stdcall NumToStr, eax, ntsHex or ntsUnsigned or ntsFixedWidth + 8
        stdcall FileWriteString, ebx, eax
        stdcall FileWriteString, ebx, <txt 13, 10>

        test    ebp, ebp
        jz      .finish
        
        cmp     dword [ebp+4], $b0000000
        jb      .loop

.finish:
        stdcall FileClose, ebx

        cmp     [__MemoryFault], 0
        je      .return

        jmp     [__MemoryFault]

.return:
        stdcall TerminateAll, -1

end if



body Exec2
.pArgs dd ?
begin
        pushad

        stdcall StrSplitArg, [.hCommand]
        mov     [.pArgs], eax

        mov     eax, sys_fork
        int     $80

        test    eax, eax
        jnz     .parent         ; this is the parent process

; here is the child.

        DebugMsg "Child process here!"

        mov     eax, sys_dup2
        mov     ebx, [.hStdIn]
        xor     ecx, ecx
        int     $80

        mov     eax, sys_dup2
        mov     ebx, [.hStdOut]
        inc     ecx
        int     $80

        mov     eax, sys_dup2
        mov     ebx, [.hStdErr]
        inc     ecx
        int     $80

        mov     ecx, [.pArgs]
        mov     ebx, [ecx]                      ; the first argument is the executable name.

        mov     edx, [_ptrEnvironment]
        mov     eax, [edx]                      ; argument count
        lea     edx, [edx + 4*eax + 8]          ; +4 for argc and +4 for the termination 0; edx points to the env table here.

        mov     eax, sys_execve
        int     $80

        OutputValue "Error Exec2: ", eax, 10, -1

        stdcall TerminateAll, eax   ; This is the forked process after sys_execve error. So, terminate it.


.parent:
        stdcall FreeMem, [.pArgs]
        bt      eax, 31
        mov     [esp+4*regEAX], eax
        popad
        return
endp


body FreeProcessID
begin
        return
endp



body WaitProcessExit
begin
        pushad
        mov     eax, sys_waitpid
        mov     ebx, [.ProcessID]
        xor     ecx, ecx
        xor     edx, edx
        int     $80
        clc
        popad
        return
endp



; Splits the string on spaces and forms one-memory-block area that contains, zero terminated
; array of pointers to every part of the string.
; The spaces inside double or single quotes are ignored.
;
; The format of the memory block is the same as used in the sys_execve system function.

proc StrSplitArg, .hCommand
begin
        pushad

if defined StrLib & StrLib
        stdcall StrPtr, [.hCommand]
        mov     esi, eax
        mov     ebx, eax
else
        mov     esi, [.hCommand]
        mov     ebx, esi
end if
        xor     ecx, ecx
        xor     edx, edx

; find the maximal possible count of the arguments (edx)
; and the length of the string.

.loop1:
        lodsb
        test    al, al
        jz      .endstr1
        inc     ecx
        cmp     al, ' '
        jne     .loop1
        inc     edx
        jmp     .loop1

.endstr1:
        mov     esi, ebx

        add     edx, 3
        lea     edx, [4*edx + ecx]
        add     edx, 3
        and     edx, $fffffffc

        stdcall GetMem, edx
        mov     ebx, eax

        sub     edx, ecx
        sub     edx, 4
        and     edx, $fffffffc

        lea     edi, [ebx+edx]
        rep movsb

        mov     edi, ebx
        lea     esi, [ebx+edx]  ; start of the string.

.search_loop:
        mov     [edi], esi
        add     edi, 4

.loop_to_space:
        lodsb
        test    al, al
        jz      .end_of_string

        cmp     al, '"'
        je      .skip_quoted

        cmp     al, "'"
        je      .skip_quoted

        cmp     al, ' '
        jne     .next

        cmp     ah, ' '
        je      .loop_to_space

        mov     byte [esi-1], 0
        jmp     .search_loop

.next:
        mov     ah, al
        jmp     .loop_to_space


.skip_quoted:
        mov     ah, al

.loop_quote:
        lodsb
        test    al, al
        jz      .end_of_string

        cmp     al, ah
        jne     .loop_quote
        jmp     .loop_to_space


.end_of_string:
        mov     [esp+4*regEAX], ebx
        popad
        return
endp






match =LinuxThreads, LinuxThreads {
  define LinuxThreads posix
}

match =native, LinuxThreads {
  include '_process_native.asm'
}

match =posix, LinuxThreads {
  include '_process_posix.asm'
}




Added freshlib/system/Linux/serial.asm.































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Serial IO interface library. Linux part.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

macro brate  [baud, mask] {
forward
  dd baud
  dw mask
}



proc SerSetParams, .hSerial, .Baudrate, .Parity, .Flow, .Timeout
.settings termios
begin
        pushad

        mov     esi, .speeds

.speed_loop:
        mov     eax, [esi]

        test    eax, eax
        jz      .error

        cmp     eax, [.Baudrate]
        je      .found

        add     esi, 6
        jmp     .speed_loop

.found:
        movzx   edx, word [esi+4]
        or      edx, CS8 or CREAD or CLOCAL

        cmp     [.Parity], cParityNo
        je      @f
        or      edx, PARENB
@@:
        cmp     [.Parity], cParityOdd
        jne     @f
        or      edx, PARODD
@@:
        cmp     [.Flow], cFlowHW
        jne     @f
        or      edx, CRTSCTS
@@:

        xor     eax, eax        ; zero

        lea     edi, [.settings]
        mov     ecx, sizeof.termios / 4
        rep stosd

        mov     [.settings.c_iflag], IGNBRK
        mov     [.settings.c_cflag], edx

        mov     eax, [.Timeout]         ; in [ms]
        xor     edx, edx
        mov     ecx, 100
        div     ecx
        mov     [.settings.c_cc+VTIME], al       ; in [100ms] units

        mov     eax, sys_ioctl
        mov     ebx, [.hSerial]
        mov     ecx, TCSETS
        lea     edx, [.settings]
        int     $80

        test    eax, eax
        jnz     .error

        clc
        popad
        return


.error:
        stc
        popad
        return

.speeds:
        brate 50, B50
        brate 75, B75
        brate 110, B110
        brate 134, B134
        brate 150, B150
        brate 200, B200
        brate 300, B300
        brate 600, B600
        brate 1200, B1200
        brate 1800, B1800
        brate 2400, B2400
        brate 4800, B4800
        brate 9600, B9600
        brate 19200, B19200
        brate 38400, B38400
        brate 57600, B57600
        brate 115200, B115200
        brate 230400, B230400
        brate 460800, B460800
        brate 500000, B500000
        brate 576000, B576000
        brate 921600, B921600
        brate 1000000, B1000000
        brate 11520000, B1152000
        brate 15000000, B1500000
        brate 20000000, B2000000
        brate 25000000, B2500000
        brate 30000000, B3000000
        brate 35000000, B3500000
        brate 40000000, B4000000
        brate 0, 0
endp


Added freshlib/system/Linux/timers.asm.



































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Asynchronous timer library.
;
;  Target OS: Linux
;
;  Dependencies:
;
;  Notes: Linux port of the library uses independent thread to manage timers.
;_________________________________________________________________________________________

__sys_time_slice = 100 ;[ms]


uglobal
  if used TimerCreate
    __InternalTimerID     dd ?
    __InternalTimerThread dd ?
    __FlagTimerTerminate  dd ?
  end if
endg



if used TimerCreate
  if ~(defined options.DebugMode.NoTimers & options.DebugMode.NoTimers)

initialize InitLinuxTimers
  .action lnx_sigaction
  .timer lnx_sigevent
  .time  lnx_itimerspec
begin
; set the signal handler.
        mov     eax, sys_sigaction
        mov     ebx, SIGALRM
        lea     ecx, [.action]
        mov     [ecx+lnx_sigaction.sa_handler], __TimerProc
        mov     [ecx+lnx_sigaction.sa_mask], 0
        mov     [ecx+lnx_sigaction.sa_flags], 0
        xor     edx, edx

        int $80

        DebugMsg 'Signal hadler set.'

; create the interval timer
        mov     [.timer.notify], SIGEV_SIGNAL
        mov     [.timer.signo], SIGALRM

        mov     eax, sys_timer_create
        mov     ebx, CLOCK_REALTIME
        lea     ecx, [.timer]
        mov     edx, __InternalTimerID

        int $80

        DebugMsg 'Interval timer created.'

; then start a thread that will process timer expiration events.

        stdcall ThreadCreate, __TimerHandler, 0

        OutputValue 'Timer thread created. ID=$', eax, 16, 8

        mov     [__InternalTimerThread], eax

; start the timer
        mov     ebx, [__InternalTimerID]
        mov     eax, sys_timer_settime
        lea     edx, [.time]
        mov     [edx+lnx_itimerspec.it_interval.tv_sec], 0
        mov     [edx+lnx_itimerspec.it_interval.tv_nsec], __sys_time_slice*1000000
        mov     [edx+lnx_itimerspec.it_value.tv_sec], 0
        mov     [edx+lnx_itimerspec.it_value.tv_nsec], __sys_time_slice*1000000
        xor     esi, esi
        int $80

        DebugMsg 'Timer started'

        return
endp




finalize FreeLinuxTimers
begin

        DebugMsg 'Finalizing timers.'

; stop the timer
        mov     eax, sys_timer_delete
        mov     ebx, [__InternalTimerID]
        int $80

        DebugMsg 'Timer stopped.'


        mov     [__FlagTimerTerminate], 1

; signal the thread (because it is probably in waiting state.
match =native, LinuxThreads {
        mov     eax, sys_tkill
        mov     ebx, [__InternalTimerThread]
        mov     ecx, SIGRTMAX
        int     $80
}

match =posix, LinuxThreads {
        cinvoke pthread_kill, [__InternalTimerThread], SIGRTMAX
}

        cmp     [__InternalTimerThread], 0
        je      .finish

; waiting to timer thread to finish. This is bad implementation,
; here should be timer wait with signal terminate on timeout.

@@:
        stdcall Sleep, 10
        cmp     [__InternalTimerThread], 0
        jne     @b


.finish:
        DebugMsg 'Timer thread terminated.'
        return
endp
  end if
end if






; This procedure is called by the system on every time quantum.
; It is Linux signal handler, so the actions this procedure can
; perform are limited.

proc __TimerProc, .signal
begin
        push    ebx edi

        lea     eax, [__ptrFirstTimer]
        xor     edi, edi

.loop:
        mov     eax, [eax+TTimer.next]
        test    eax, eax
        jz      .end_timers

        test    [eax+TTimer.flags], tmfRunning
        jz      .loop

        mov     ecx, [eax+TTimer.value]
        add     ecx, __sys_time_slice

        mov     [eax+TTimer.value], ecx
        cmp     ecx, [eax+TTimer.interval]
        jl     .loop

@@:
        inc     [eax+TTimer.Expired]
        inc     edi

        mov     ecx, [eax+TTimer.interval]
        sub     [eax+TTimer.value], ecx
        cmp     [eax+TTimer.value], ecx
        jge     @b
        jmp     .loop


.end_timers:
        test    edi, edi
        jz      .exit

; signal the timers thread that some timer is changed.

match =native, LinuxThreads {
        mov     eax, sys_tkill
        mov     ebx, [__InternalTimerThread]
        mov     ecx, SIGRTMAX
        int     $80
}

match =posix, LinuxThreads {
        cinvoke pthread_kill, [__InternalTimerThread], SIGRTMAX
}

.exit:
        pop     edi ebx
        cret
endp



; This is thread procedure, that checks the timer expiration and then executes the timer callback procedure (if any)

proc __TimerHandler, .argument
.remain dd ?
.action lnx_sigaction
begin
        mov     eax, sys_sigaction
        mov     ebx, SIGRTMAX
        lea     ecx, [.action]
        mov     [ecx+lnx_sigaction.sa_handler], __continue_proc
        mov     [ecx+lnx_sigaction.sa_mask], 0
        mov     [ecx+lnx_sigaction.sa_flags], 0;SA_NODEFER
        xor     edx, edx
        int $80

        mov     [__FlagTimerTerminate], 0

.from_begin:

        cmp     [__FlagTimerTerminate], 0
        jne     .quit

        mov     [.remain], 0
        lea     eax, [__ptrFirstTimer]

.listloop:
        mov     eax, [eax+TTimer.next]

.listloop2:
        test    eax, eax
        jz      .end_list

        mov     ecx, [eax+TTimer.Expired]
        jecxz   .listloop

        dec     ecx
        mov     [eax+TTimer.Expired], ecx
        add     [.remain], ecx

        cmp     [eax+TTimer.Callback], 0
        je      .listloop

        mov     ecx, [eax+TTimer.flags]
        and     ecx, $0f
        cmp     ecx, tmfDoNothing
        je      .end_event

; call the callback procedure.
        pushad
        push    eax
        cinvoke XLockDisplay, [hApplicationDisplay]
        pop     eax
        stdcall [eax+TTimer.Callback], eax
        cinvoke XUnlockDisplay, [hApplicationDisplay]
        popad

.end_event:
        test    [eax+TTimer.flags], tmfSyncDestroy
        jz      .listloop

        push    eax
        mov     eax, [eax+TTimer.next]  ; after the destruction, this pointer will be lost.
        stdcall TimerDestroy ; pointer from the stack.
        jmp     .listloop2


.end_list:
        cmp     [.remain], 0
        jne     .from_begin

; wait for signal
        mov eax, sys_pause
        int $80
        jmp     .from_begin

.quit:
        mov     [__InternalTimerThread], 0

        stdcall Terminate, 0
endp



proc __continue_proc, .signal
begin
        cret
endp


; this procedure provides easy way to make time delays
; it is independent and does not lead to including whole timer library.

proc Sleep, .msec
.time lnx_timespec
begin
        pushad

        mov     eax, [.msec]
        xor     edx, edx
        mov     ecx, 1000
        div     ecx

        mov     [.time.tv_sec], eax     ; seconds
        imul    edx, 1000000
        mov     [.time.tv_nsec], edx

        mov     eax, sys_nanosleep
        lea     ebx, [.time]
        xor     ecx, ecx
        int $80

        popad
        return
endp




proc GetTime
begin
        push    ebx

        mov     eax, sys_time
        xor     ebx, ebx
        int     $80

        cdq
        pop     ebx
        return
endp



struct lnx_timeb
  .time    dd ?
  .millitm dd ?
  .timezone dd ?
  .dstflag  dd ?
ends


proc GetLocalTimeOffset
;.time lnx_timespec
begin
;        stdcall GetTime
;        push    eax
;
;        mov     eax, sys_clock_gettime
;        mov     ebx, CLOCK_REALTIME
;        lea     ecx, [.time]
;
;        int     $80
;
;
;        pop     edx
;        mov     eax, [.time.tv_sec]
;
;        OutputRegister regEAX, 10
;        OutputRegister regEDX, 10
;        int3

        xor     eax, eax
        return
endp



proc GetTimestamp
.time lnx_timeval
begin
        pushad
        mov     eax, sys_gettimeofday
        lea     ebx, [.time]
        xor     ecx, ecx
        int     $80

        mov     eax, [.time.tv_sec]  ; seconds
        mov     ecx, 1000
        mul     ecx
        mov     ebx,eax

        mov     eax, [.time.tv_usec] ; us
        xor     edx, edx
        div     ecx
        add     eax, ebx

        mov     [esp+4*regEAX], eax
        popad
        return
endp


; returns dword timestamp in uS

proc GetFineTimestamp
.time lnx_timeval
begin
        pushad

        mov     eax, sys_gettimeofday
        lea     ebx, [.time]
        xor     ecx, ecx
        int     $80

        mov     eax, [.time.tv_sec]  ; seconds

        mov     ecx, 1000000
        mul     ecx
        mov     ebx, eax

        mov     eax, [.time.tv_usec]
        add     eax, ebx

        mov     [esp+4*regEAX], eax
        popad
        return
endp



; Alternative implementation!
;
;proc GetFineTimestamp
;.time lnx_timespec
;begin
;        pushad
;
;        mov     eax, sys_clock_gettime
;        mov     ebx, CLOCK_PROCESS_CPUTIME_ID
;        lea     ecx, [.time]
;        int     $80
;
;        mov     eax, [.time.tv_sec]  ; seconds
;
;        mov     ecx, 1000000
;        mul     ecx
;        mov     ebx, eax
;
;        mov     eax, [.time.tv_nsec]
;        mov     ecx, 1000
;        xor     edx, edx
;        div     ecx
;
;        add     eax, ebx
;
;        mov     [esp+4*regEAX], eax
;        popad
;        return
;endp

Added freshlib/system/Win32/com32.asm.





























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: com32 (common object module) procedures.
;
;  Target OS: Win32
;
;  Dependencies:
;_________________________________________________________________________________________
uses ole32

; compares two GUID. Returns CF=1 if equal, CF=0 if not.

proc cmpGUID, .ptrGUID1, .ptrGUID2
begin
        push esi edi ecx

        mov     esi, [.ptrGUID1]
        mov     edi, [.ptrGUID2]
        mov     ecx, 4

        repe cmpsd
        clc
        jne  .finish
        stc
.finish:
        pop ecx edi esi
        return
endp


iglobal
 IID_IUnknown          GUID  00000000-0000-0000-C000-000000000046
 IID_IClassFactory     GUID  00000001-0000-0000-C000-000000000046
 IID_IOleObject        GUID  00000112-0000-0000-C000-000000000046
 IID_IOleInPlaceObject GUID  00000113-0000-0000-C000-000000000046
 IID_IOleInPlaceSite   GUID  00000119-0000-0000-C000-000000000046
 IID_IOleClientSite    GUID  00000118-0000-0000-C000-000000000046

 IID_IDocHostUIHandler GUID  BD3F23C0-D43E-11CF-893B-00AA00BDCE1A
 CLSID_WebBrowser      GUID  8856F961-340A-11D0-A96B-00C04FD705A2
 IID_IWebBrowser2      GUID  D30C1661-CDAF-11D0-8A3E-00C04FC9E26E
 IID_IHTMLDocument2    GUID  332C4425-26CB-11D0-B483-00C04FD90119
endg

Added freshlib/system/Win32/environment.asm.



























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Win32 environment management library.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________
uses kernel32, user32

proc GetAllEnvironment
.return dd ?
begin
        pushad

        invoke  GetEnvironmentStringsA
        push    eax
        mov     esi, eax

.end_loop:
        cmp     word [esi], 0
        lea     esi, [esi+1]
        jne     .end_loop

        stc
        sbb     esi, [esp]
        lea     ecx, [esi+8]

        stdcall GetMem, ecx
        mov     [.return], eax
        mov     edi, eax
        mov     ecx, esi
        mov     esi, [esp]
        rep movsb
        xor     eax, eax
        stosd

        invoke  FreeEnvironmentStringsA ; from the stack
        popad
        mov     eax, [.return]
        return
endp



proc GetEnvVariable, .varname
.buffer rb 1024
begin
        push    ebx ecx edx

        stdcall utf8ToWideChar, [.varname]
        mov     [.varname], eax

        lea     ebx, [.buffer]
        invoke  GetEnvironmentVariableW, [.varname], ebx, 512
        test    eax, eax
        jz      .missing

        stdcall FreeMem, [.varname]
        stdcall WideCharToUtf8, ebx
        clc
        pop     edx ecx ebx
        return

.missing:
        stdcall FreeMem, [.varname]
        stc
        pop     edx ecx ebx
        return


endp

Changes to freshlib/system/Win32/files.asm.

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
97
98
99
100
101
102
103
104
105
106
107
108
109

110

111
112
113
114
115
116
117
118
119
120
121
122
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
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
; ____________________________________________________________________
;|                                                                    |
;| This file is part of the project:                                  |
;|                                                                    |
;| ..::FreshGUI::.. - portable, assembler based GUI toolkit.          |
;| __________________________________________________________________ |
;|                                                                    |
;|                          This file                                 |
;|                          ~~~~~~~~~                                 |
;|   Author: John Found                                               |
;|                                                                    |

;|   Title: files.asm  Files management library. OS dependent         |
;|                                                                    |

;|   OS: Win32                                                        |
;|                                                                    |



;|   Notes and changes: This library provides unified interface to    |
;|                      access files for Win32 OS                     |
;|                                                                    |
;|____________________________________________________________________|






fsFromBegin     = FILE_BEGIN
fsFromEnd       = FILE_END
fsFromCurrent   = FILE_CURRENT




;--------------------------------------



; if CF = 0, eax is handle to the file.
; if CF = 1, eax is error code.
;--------------------------------------
























proc FileOpen, .filename
begin
        push    edx ecx



        invoke  CreateFile, [.filename], GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0










        cmp     eax, INVALID_HANDLE_VALUE
        je      .error

        clc
        pop     ecx edx
        return

.error:
        invoke  GetLastError
        stc
        pop     ecx edx
        return
endp



proc FileCreate, .filename
begin
        push    edx ecx

        invoke  CreateFile, [.filename], GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0
        cmp     eax, INVALID_HANDLE_VALUE
        je      .error

        clc
        pop     ecx edx
        return

.error:
        invoke  GetLastError
        stc
        pop     ecx edx
        return
endp




proc FileClose, .handle
begin
        push    edx ecx eax
        invoke  CloseHandle, [.handle]
        test    eax, eax
        jz      .error

        clc
        pop     eax ecx edx
        return

.error:
        pop     eax

        invoke  GetLastError

























        stc
        pop     ecx edx
        return
endp




proc FileRead, .handle, .buffer, .count
.read dd ?
begin
        push    edx ecx

        lea     eax, [.read]
        invoke  ReadFile, [.handle], [.buffer], [.count], eax, 0
        test    eax, eax
        jz      .error

        mov     eax, [.read]
        clc
        pop     ecx edx
        return

.error:

        invoke  GetLastError

        stc
        pop     ecx edx
        return
endp




proc FileWrite, .handle, .buffer, .count
.bytes dd ?
begin
        push    edx ecx

        lea     ecx, [.bytes]
        invoke  WriteFile, [.handle], [.buffer], [.count], ecx, NULL
        test    eax, eax
        jz      .error

        mov     eax, [.bytes]
        clc
        pop     ecx edx
        return

.error:

        invoke  GetLastError

        stc
        pop     ecx edx
        return
endp




;----------------------------------------------------
; if CF = 0, eax is the new possition in the file
; if CF = 1, eax is error code.
;----------------------------------------------------
proc FileSeek, .handle, .dist, .direction
begin
        push    edx ecx
        invoke  SetFilePointer, [.handle], [.dist], 0, [.direction]
        cmp     eax, -1
        je      .error

        clc
        pop     ecx edx
        return

.error:

        invoke  GetLastError


















































        stc
        pop     ecx edx
        return
endp



;----------------------------------------------------
; if CF = 0 - the file was deleted
; if CF = 1, eax is error code.
;----------------------------------------------------
proc FileDelete, .filename
begin
        push    ecx edx eax



        invoke  DeleteFile, [.filename]

















































































































































































































        test    eax, eax
        jz      .error
        clc
        pop     eax edx ecx
        return

.error:
        pop     eax

        invoke  GetLastError

        stc
        pop     edx ecx
        return
endp




proc GetErrorString, .code
.buff dd ?











































































begin
        push    edx ecx

        lea     eax, [.buff]

        invoke  FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM, 0, [.code], LANG_NEUTRAL or SUBLANG_DEFAULT, eax, 0, 0





        mov     eax, [.buff]



















        clc
        pop     ecx edx





        return
endp



proc FreeErrorString, .ptrString

begin

        push    edx ecx
        invoke  LocalFree, [.ptrString]




        pop     ecx edx
        return
endp
|
|
<
<
|
|
<
<
<
<
<
>
|
<
>
|
<
>
>
>
|
<
<
|
>
>
>
>
>





>
>
>
|
>
>
>
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|



>
>
|
>
>
>
>
>
>
>
>
>
>









<
<
<
<

|
|
<
<
<
|
<
<
<

<
<
<
<
<
<








|












>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







<
|















>

>








|















>

>












|











>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>




<






|


>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


|





>

>








|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|
>
|
>
|
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|
>
>
>
>
>





|
>

>
|
|
>
>
>
>
|


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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269

270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
; _______________________________________________________________________________________
;|                                                                                       |


;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|





;
;  Description: Files manipulation library. Win32 part.

;
;  Target OS: Win32

;
;  Dependencies:
;
;  Notes:


;_________________________________________________________________________________________

uses kernel32

DIR_SLASH equ '\'
DIR_SEP_PAIR equ '\/'   ; for use with StrNormalizePath and StrNormalizePath2

fsFromBegin     = FILE_BEGIN
fsFromEnd       = FILE_END
fsFromCurrent   = FILE_CURRENT

faReadOnly   = GENERIC_READ
faWriteOnly  = GENERIC_WRITE
faReadWrite  = GENERIC_READ or GENERIC_WRITE

faOpenAlways   = OPEN_ALWAYS      ; if the file does not exists it will be created.
faCreateAlways = CREATE_ALWAYS    ; Creates new file always. If the file exists, truncates it.
faCreateOnly   = CREATE_NEW       ; Creates new file only if not exists, else error.



if used STDIN | used STDOUT | used STDERR

  initialize InitStdHandles
  begin
    if used STDIN
          invoke  GetStdHandle, STD_INPUT_HANDLE
          mov     [__std_handle_in], eax
    end if

    if used STDOUT
          invoke  GetStdHandle, STD_OUTPUT_HANDLE
          mov     [__std_handle_out], eax
    end if

    if used STDERR
          invoke  GetStdHandle, STD_ERROR_HANDLE
          mov     [__std_handle_err], eax
    end if
          return
  endp

end if


body FileOpenAccess
begin
        push    edx ecx

        stdcall utf8ToWideChar, [.filename]
        push    eax

        mov     ecx, [.access]
        mov     edx, [.access]
        and     ecx, $ffff0000
        and     edx, $0000ffff
        jnz     @f
        mov     edx, OPEN_EXISTING
@@:
        invoke  CreateFileW, eax, ecx, FILE_SHARE_READ, 0, edx, 0, 0
        stdcall FreeMem ; from the stack

        cmp     eax, INVALID_HANDLE_VALUE
        je      .error

        clc
        pop     ecx edx
        return

.error:
        invoke  GetLastError





if defined options.DebugMode & options.DebugMode
        stdcall __FileErrorDisplay, eax, [.filename]



end if










        stc
        pop     ecx edx
        return
endp




body FileClose
begin
        push    edx ecx eax
        invoke  CloseHandle, [.handle]
        test    eax, eax
        jz      .error

        clc
        pop     eax ecx edx
        return

.error:
        pop     eax
if used GetErrorString
        invoke  GetLastError
end if
        stc
        pop     ecx edx
        return
endp


; returns 32bit file size in eax
body FileSize
begin
        push    edx ecx

        xor     eax, eax
        invoke  GetFileSize, [.handle], eax
        cmp     eax, -1
        je      .error

        clc
        pop     ecx edx
        return

.error:
if used GetErrorString
        invoke  GetLastError
end if
        stc
        pop     ecx edx
        return
endp




body FileRead
.read dd ?
begin
        push    edx ecx

        lea     eax, [.read]
        invoke  ReadFile, [.handle], [.buffer], [.count], eax, 0
        test    eax, eax
        jz      .error

        mov     eax, [.read]
        clc
        pop     ecx edx
        return

.error:
if used GetErrorString
        invoke  GetLastError
end if
        stc
        pop     ecx edx
        return
endp




body FileWrite
.bytes dd ?
begin
        push    edx ecx

        lea     ecx, [.bytes]
        invoke  WriteFile, [.handle], [.buffer], [.count], ecx, NULL
        test    eax, eax
        jz      .error

        mov     eax, [.bytes]
        clc
        pop     ecx edx
        return

.error:
if used GetErrorString
        invoke  GetLastError
end if
        stc
        pop     ecx edx
        return
endp




;----------------------------------------------------
; if CF = 0, eax is the new possition in the file
; if CF = 1, eax is error code.
;----------------------------------------------------
body FileSeek
begin
        push    edx ecx
        invoke  SetFilePointer, [.handle], [.dist], 0, [.direction]
        cmp     eax, -1
        je      .error

        clc
        pop     ecx edx
        return

.error:
if used GetErrorString
        invoke  GetLastError
end if
        stc
        pop     ecx edx
        return
endp




body FileTruncate
begin
        push    ecx edx
        invoke  SetEndOfFile, [.handle]
        test    eax, eax
        jz      .error

        clc
        pop     edx ecx
        return

.error:
if used GetErrorString
        invoke  GetLastError
end if
        stc
        pop     ecx edx
        return
endp


body FileTruncateTo ;, .handle, .length
begin
        push    ecx edx

        invoke  SetFilePointer, [.handle], [.length], 0, fsFromBegin
        cmp     eax, -1
        je      .error

        invoke  SetEndOfFile, [.handle]
        test    eax, eax
        jz      .error

        clc
        pop     edx ecx
        return

.error:
if used GetErrorString
        invoke  GetLastError
end if
        stc
        pop     ecx edx
        return
endp



;----------------------------------------------------
; if CF = 0 - the file was deleted
; if CF = 1, eax is error code.
;----------------------------------------------------
body FileDelete
begin
        push    ecx edx eax

        stdcall utf8ToWideChar, [.filename]
        push    eax
        invoke  DeleteFileW, eax
        stdcall FreeMem ; from the stack

        test    eax, eax
        jz      .error
        clc
        pop     eax edx ecx
        return

.error:
        pop     eax
if used GetErrorString
        invoke  GetLastError
end if
        stc
        pop     edx ecx
        return
endp





body GetCurrentDir
.buffer rb 1024
begin
        push    ecx edx esi

        lea     esi, [.buffer]
        invoke  GetCurrentDirectoryW, 1024, esi
        test    eax, eax
        jz      .error

        stdcall WideCharToUtf8, esi
        clc

.finish:
        pop     esi edx ecx
        return

.error:
if used GetErrorString
        invoke  GetLastError
end if

        stc
        jmp     .finish

endp



body SetCurrentDir
begin
        push    ecx edx eax
        stdcall utf8ToWideChar, [.hDirectory]
        push    eax
        invoke  SetCurrentDirectoryW, eax
        stdcall FreeMem ; from the stack

        test    eax, eax
        jz      .error

        pop     eax edx ecx
        return

.error:
        pop     eax
if used GetErrorString
        invoke  GetLastError
end if
        stc
        pop     edx ecx
        return
endp



body GetErrorString
.buff dd ?
begin
        push    edx ecx
        lea     eax, [.buff]
        invoke  FormatMessageW, FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM, 0, [.code], LANG_NEUTRAL or SUBLANG_DEFAULT, eax, 0, 0

        stdcall WideCharToUtf8, [.buff]
        stdcall StrClipSpacesR, eax
        stdcall StrClipSpacesL, eax
        push    eax

        invoke  LocalFree, [.buff]

        pop     eax
        clc
        pop     ecx edx
        return
endp



body FreeErrorString
begin
        stdcall StrDel, [.ptrString]
        return
endp



ftUnknown    =  0
ftDirectory  =  1
ftFile       =  2
ftLinkMask   =  $80000000


; reads all items of the directory and fills them in the TArray of type TDirItem.
; arguments:
;   dir - string with the path to the directory.
;
; returns:
;   if not error: CF=0; eax = pointer to TArray of TDirItem;
;   if error:     CF=1; eax = error code;

body DirectoryRead
.finddata FINDDATAW
.size   dd ?
begin
        push    ebx ecx edx edi

; open the file
        stdcall StrDup, [.dir]
        push    eax
        stdcall StrCat, eax, .searchall

        stdcall utf8ToWideChar, eax
        stdcall StrDel ; from the stack

        push    eax

        lea     ecx, [.finddata]
        invoke  FindFirstFileW, eax, ecx
        stdcall FreeMem ; from the stack

        cmp     eax, INVALID_HANDLE_VALUE
        je      .error

        mov     ebx, eax

        stdcall CreateArray, sizeof.TDirItem
        mov     edi, eax

.addloop:
        lea     eax, [.finddata.cFileName]
        stdcall WideCharToUtf8, eax
        push    eax

        stdcall AddArrayItems, edi, 1
        mov     edi, edx

        pop     [eax+TDirItem.hFilename]

        mov     ecx, ftDirectory
        test    [.finddata.dwFileAttributes], FILE_ATTRIBUTE_DIRECTORY
        jnz     .typeok
        mov     ecx, ftFile
.typeok:
        mov     [eax+TDirItem.Type], ecx

        lea     eax, [.finddata]
        invoke  FindNextFileW, ebx, eax
        test    eax, eax
        jnz     .addloop

        invoke  GetLastError
        push    eax

.end_of_directory:

        invoke  FindClose, ebx

        pop     eax
        cmp     eax, ERROR_NO_MORE_FILES
        jne     .finish_error

        mov     eax, edi
        pop     edi edx ecx ebx
        clc
        return

.error:
        invoke  GetLastError

.finish_error:
        pop     edi edx ecx ebx
        stc
        return

.searchall db '\*.*', 0
endp




body CreateDirectory
begin
        push    ecx edx eax
        stdcall utf8ToWideChar, [.DirName]
        push    eax
        invoke  CreateDirectoryW, eax, 0
        stdcall FreeMem ; from the stack

        test    eax, eax
        jz      .error

        pop     eax edx ecx
        return

.error:
        pop     eax
if used GetErrorString
        invoke  GetLastError
end if
        stc
        pop     edx ecx
        return
endp






body GetFileInfo
begin
        pushad

        mov     esi, [.ptrFileInfo]
        lea     ecx, [esi+TFileInfo.timeAccessed]
        lea     edx, [esi+TFileInfo.timeModified]

        invoke  GetFileTime, [.hFile], esi, ecx, edx
        test    eax, eax
        jz      .error

        mov     eax, dword [esi+TFileInfo.timeCreated]
        mov     edx, dword [esi+TFileInfo.timeCreated+4]
        call    FileTimeToUnixTime
        mov     dword [esi+TFileInfo.timeCreated], eax
        mov     dword [esi+TFileInfo.timeCreated+4], edx

        mov     eax, dword [esi+TFileInfo.timeAccessed]
        mov     edx, dword [esi+TFileInfo.timeAccessed+4]
        call    FileTimeToUnixTime
        mov     dword [esi+TFileInfo.timeAccessed], eax
        mov     dword [esi+TFileInfo.timeAccessed+4], edx

        mov     eax, dword [esi+TFileInfo.timeModified]
        mov     edx, dword [esi+TFileInfo.timeModified+4]
        call    FileTimeToUnixTime
        mov     dword [esi+TFileInfo.timeModified], eax
        mov     dword [esi+TFileInfo.timeModified+4], edx

        clc
        popad
        return

.error:
        stc
        popad
        return

endp





; Returns:
; CF=1 if the file NOT EXISTS
; CF=0 if the file EXISTS
body FileExists
begin
        pushad

        stdcall utf8ToWideChar, [.hFileName]
        push    eax

        invoke  GetFileAttributesW, eax
        stdcall FreeMem ; from the stack
        cmp     eax, -1
        je      .notexists

        clc
        popad
        return

.notexists:
        stc
        popad
        return
endp





body IsRelativePath     ;, .hPath
begin
        push    eax
        stdcall StrLen, [.hPath]
        cmp     eax, 3
        jb      .relative

        stdcall StrPtr, [.hPath]
        cmp     byte [eax], DIR_SLASH
        jne      .drive
        cmp      byte [eax+1], DIR_SLASH
        jmp      .absolute

.drive:
        cmp     byte [eax], 'A'
        jb      .relative
        cmp     byte [eax], 'Z'
        jbe     .maybe_drive

        cmp     byte [eax], 'a'
        jb      .relative
        cmp     byte [eax], 'Z'
        ja      .relative

.maybe_drive:
        cmp     byte [eax+1], ':'
        jne     .relative

        cmp     byte [eax+2], DIR_SLASH
        jne     .relative

.absolute:
        clc
        pop     eax
        return

.relative:
        stc
        pop     eax
        return
endp




body GetCurrentPrefix
begin
        stdcall GetCurrentDir
        push    eax

        stdcall StrPtr, eax
        and     dword [eax+2], 0
        mov     [eax+string.len], 2

        pop     eax
        return
endp

Added freshlib/system/Win32/heapmgr.asm.































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
;FASM STANDARD LIBRARY
;Win32 memory routines for use with FASMLIB heap manager

;you can replace src/win32/mem.inc with this file, to use FASMLIB heap manager
;instead of Heap*** Win32API functions. Useful to test heap manager on win32,
;but with this way VirtualAlloc often cannot enlarge block enough

NEED_HEAP_MANAGER equ 1

HEAP_MAX_SIZE = 1024 * 1024 * 1024  ; = 1GB address space.


uglobal
  __heap_start dd ?
endg


initialize InitHeapManager
.info SYSTEM_INFO
begin
        invoke  VirtualAlloc, 0, HEAP_MAX_SIZE, MEM_RESERVE, PAGE_READWRITE
        test    eax, eax
        jz      .error

        mov     [__heap_start], eax
        return

.error:
        int3
        return

endp



proc mem.alloc_heap, .size
begin
        push    ecx edx

        invoke  VirtualAlloc, [__heap_start], [.size], MEM_COMMIT, PAGE_EXECUTE_READWRITE
        test    eax, eax
        jz      .error_VirtualAlloc

        clc
        pop     edx ecx
        return

.error_VirtualAlloc:
        mov     eax, ERR_OUT_OF_MEM
        stc
        pop     edx ecx
        return
endp




proc mem.free_heap, .block, .size
begin
        push    ecx edx eax

        invoke  VirtualFree, [.block], [.size], MEM_DECOMMIT
        test    eax, eax
        jz      .error

        clc
.r:
        pop     eax edx ecx
        return

.error: stc
        mov     dword [esp], ERR_UNKNOWN
        jmp     .r
endp



proc mem.realloc_heap, .heapptr, .newsize, .oldsize
begin
        push    ecx edx

        invoke  VirtualAlloc, [.heapptr], [.newsize], MEM_COMMIT, PAGE_EXECUTE_READWRITE
        test    eax,eax
        jz      .error_GlobalReAlloc

.rnc:   clc
        pop     edx ecx
        return

.error_GlobalReAlloc:
        mov     eax, ERR_OUT_OF_MEM
        stc
        pop     edx ecx
        return
endp

Changes to freshlib/system/Win32/memory.asm.

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
97




98


99

100

101
102
103
104


105
106
107
108
109
110
111
112

113
114
115
116
117
118
119
120
121



122
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
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
235
236

237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274






275
276
; ____________________________________________________________________
;|                                                                    |
;| This file is part of the project:                                  |
;|                                                                    |
;| ..::FreshLib::.. - portable, assembler library and GUI toolkit.    |
;|____________________________________________________________________|
;|                                                                    |
;|                          This file                                 |
;|                          _________                                 |
;|   Author: John Found                                               |
;|                                                                    |
;|                                                                    |

;|   Title: memory.asm  Memory management library. OS dependent       |
;|                                                                    |

;|   OS: Win32                                                        |




;|                                                                    |
;|   Notes and changes: This library provides unified interface to    |
;|                      heap memory manager of the Win32 OS           |
;|                                                                    |
;|____________________________________________________________________|









uglobal
  _hHeap  dd  ?

endg



if DebugMemory

    struct TMemoryItem

      .pointer dd ?

      .callfrom dd ?
    ends

    uglobal
      ptrMemoryStack dd ?
      flagNoDebug    dd ?
    endg


    proc InitAllocStack
    begin
            mov     [flagNoDebug], 1
            stdcall CreateArray, sizeof.TMemoryItem
            mov     [ptrMemoryStack], eax
            mov     [flagNoDebug], 0
            return
    endp

end if













initialize InitMemoryManager
begin
        invoke  GetProcessHeap
        mov     [_hHeap], eax

if DebugMemory
        call    InitAllocStack
end if
        return
endp





finalize FinalizeMemoryManager
begin

if DebugMemory
        mov     eax, [ptrMemoryStack]

        int3
        xor     eax, eax
        xchg    eax, [ptrMemoryStack]
        stdcall FreeMem, eax
end if
        return
endp




; Allocates memory block with given size.
; Returns: CF=1 if error.
;          if CF=0, eax = pointer to the memory block allocated.
align 16

proc GetMem, .size
begin
        push    ecx edx

        invoke  HeapAlloc, [_hHeap], HEAP_ZERO_MEMORY, [.size]



        test    eax, eax
        jz      .error

if DebugMemory




            cmp     [flagNoDebug], 0


            jne     .exit



            pushad
            push    [flagNoDebug]
            mov     [flagNoDebug], 1



            mov     ecx, eax
            stdcall AddArrayItem, [ptrMemoryStack]
            mov     [ptrMemoryStack], edx
            jnc     @f

            int3
@@:
            mov     [eax+TMemoryItem.pointer], ecx

            mov     ecx, [esp+12*4]
            cmp     ecx, CreateArray.retaddr
            jne     @f
            mov     ecx, [esp+12*4+5*4]
@@:
            mov     [eax+TMemoryItem.callfrom], ecx

            pop     [flagNoDebug]
            popad




    .exit:

end if
        clc
        pop     edx ecx
        return

.error:
        stc
        pop     edx ecx
        return
endp


align 16

proc FreeMem, .ptr
begin
        push    eax ecx edx

if DebugMemory
            cmp     [flagNoDebug], 0
            jne     .exit

            pushad



            mov     esi, [ptrMemoryStack]
            mov     ebx, [esi+TArray.count]
            mov     eax, [.ptr]

            xor     ebx, ebx

    .loop:
            cmp     ebx, [esi+TArray.count]
            jae     .notfound

            cmp     [esi+TArray.array+8*ebx], eax
            je      .found

            inc     ebx

            jmp     .loop

    .notfound:
            int3
            jmp     .exit2

    .found:
            push    [flagNoDebug]
            mov     [flagNoDebug], 1

            stdcall DeleteArrayItem2, esi, ebx
            jnc     @f

            int3
@@:
            mov     [ptrMemoryStack], edx

            pop     [flagNoDebug]

    .exit2:

            popad
    .exit:
end if

        invoke  HeapFree, [_hHeap], 0 , [.ptr]
        pop     edx ecx eax
        return
endp




proc ResizeMem, .ptr, .newsize
begin
        push    ecx edx
        invoke  HeapReAlloc, [_hHeap], HEAP_ZERO_MEMORY, [.ptr], [.newsize]









        test    eax, eax
        jz      .error

if DebugMemory





            cmp     [flagNoDebug], 0

            jne     .exit









            pushad



            mov     esi, [ptrMemoryStack]
            mov     ebx, [esi+TArray.count]
            mov     ecx, [.ptr]

            xor     ebx, ebx

    .loop:
            cmp     ebx, [esi+TArray.count]
            jae     .notfound

            cmp     [esi+TArray.array+8*ebx], ecx
            je      .found

            inc     ebx
            jmp     .loop

    .notfound:
            int3
            jmp     .exit2

    .found:
            mov     [esi+TArray.array+8*ebx], eax

            mov     ecx, [esp+11*4]
            cmp     ecx, AddArrayItem2.retaddr
            jne     @f
            mov     ecx, [esp+12*4+5*4]
@@:
            mov     [esi+TArray.array+8*ebx+4], ecx

    .exit2:

            popad
    .exit:
end if

        clc
        pop     edx ecx
        return

.error:
        mov     eax, [.ptr]
        stc
        pop     edx ecx
        return
endp



;
;proc GetMemSize, .ptr
;begin
;        push    ecx edx
;        invoke  HeapSize, [_hHeap], 0, [.ptr]
;        cmp     eax, -1
;        je      .error
;        clc
;        pop     edx ecx
;        return
;
;.error:
;        stc
;        pop     edx ecx
;        return
;endp













|
|
<
<
|
|
<
<
<
<
<
<
>
|
<
>
|
>
>
>
>
|
<
<
<
|

>

>
>
>
>
>
>

|
>

<





>
|
>


<
<
<
<
<
<



<
|
|
<






>
>
>
>
>
>
>
>


>


<
<
<
<

<


>



>


>
|
|


<
<
<
<


>






<

|

|

|
>
>
>



|
>
>
>
>
|
>
>
|
>

>

|
|

>
>
|
<
<
<

<
<
|
>
|


|

|

|
<
>
>
>

|
>


|




|




<

|




|
<

<
>

>
|
<


<
<

|
|

|


|
>







<
|
|
<
<

<
<
<
|
<


>

<


|







|

|
|
>
>
>
>
>
>
>
>
>



|
>
>
>
>
>
|
>
|
>
>
>
>
>

>
>
>


>
>
|
<


<
<

|
|

|
|

|







|
>

|

|

|


>

<



|












|

















|
|
>
>
>
>
>
>


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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116



117


118
119
120
121
122
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
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


235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261

262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
; _______________________________________________________________________________________
;|                                                                                       |


;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|






;
;  Description: Dynamic memory management library. Win32 part.

;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes: Uses Heap functions of Win32 API. Also contains some debug and profiling code,
;         that needs some revision in order to be either removed, or legalized.



;_________________________________________________________________________________________

uses ucrtbase

MEM_ALIGNMENT_PWR = 4
MEM_ALIGNMENT = 1 shl MEM_ALIGNMENT_PWR
MEM_ALIGNMENT_OFS = MEM_ALIGNMENT - 1
MEM_ALIGNMENT_MSK = not MEM_ALIGNMENT_OFS


uglobal
  var ptrMemoryList  = ?
  var MemMutex       = ?
endg



if DebugMemory

    struct TMemoryItem
      .next     dd ?
      .pointer  dd ?
      .resized  dd ?
      .callfrom dd ?
    ends







    proc InitAllocStack
    begin

            stdcall MutexCreate, 0, MemMutex
            stdcall MutexRelease, MemMutex

            return
    endp

end if


if used SpaceAllocate & ~ used GetMem
initialize ReserveAddressSpace
begin
        invoke  VirtualAlloc, 0, 1024*1024*1024, MEM_RESERVE, PAGE_READWRITE
        mov     [_MemoryFreeSpace], eax
        return
endp
end if


if  DebugMemory & used GetMem & ~ used SpaceAllocate
initialize InitMemoryManager
begin




        call    InitAllocStack

        return
endp
end if



if DebugMemory
finalize FinalizeMemoryManager
begin
        stdcall MutexDestroy, MemMutex

        mov     eax, [ptrMemoryList]

        int3




        return
endp
end if



; Allocates memory block with given size.
; Returns: CF=1 if error.
;          if CF=0, eax = pointer to the memory block allocated.


body GetMem
begin
        push    ebx ecx edx

        mov     ebx, [.size]
        add     ebx, MEM_ALIGNMENT_OFS
        and     bl, MEM_ALIGNMENT_MSK
        cinvoke _aligned_malloc, ebx, MEM_ALIGNMENT
        test    eax, eax
        jz      .error

if ~ defined options.NoZeroMemory | ~ options.NoZeroMemory
        push     eax edi
        mov      edi, eax
        cinvoke  _aligned_msize, edi, MEM_ALIGNMENT, 0
        mov      ecx, eax
        shr      ecx, 2
        xor      eax, eax
        rep stosd
        pop      edi eax
end if

if DebugMemory
            pushad

            mov     esi, eax    ; allocated address

            stdcall WaitForMutex, MemMutex, -1
            cinvoke _alignned_malloc, sizeof.TMemoryItem, 16
            mov     edi, eax






            mov     [edi+TMemoryItem.pointer], esi

            mov     ecx, [esp+11*4]
            cmp     ecx, CreateArray.retaddr
            jne     @f
            mov     ecx, [esp+11*4+5*4]
@@:
            mov     [edi+TMemoryItem.callfrom], ecx

            mov     ecx, edi

            xchg    [ptrMemoryList], ecx
            mov     [edi+TMemoryItem.next], ecx
            and     [edi+TMemoryItem.resized], 0

            stdcall MutexRelease, MemMutex
            popad
end if
        clc
        pop     edx ecx ebx
        return

.error:
        stc
        pop     edx ecx ebx
        return
endp




body FreeMem
begin
        push    eax ecx edx

if DebugMemory
            pushad



            stdcall WaitForMutex, MemMutex, -1

            mov     ebx, ptrMemoryList
            mov     esi, [ptrMemoryList]

            mov     eax, [.ptr]



    .loop:
            test    esi, esi
            jz      .notfound

            cmp     [esi+TMemoryItem.pointer], eax
            je      .found

            mov     ebx, esi
            mov     esi, [esi+TMemoryItem.next]
            jmp     .loop

    .notfound:
            int3
            jmp     .exit2

    .found:

            mov     eax, [esi+TMemoryItem.next]
            mov     [ebx+TMemoryItem.next], eax






            cinvoke _aligned_free, esi


    .exit2:
            stdcall MutexRelease, MemMutex
            popad

end if

        cinvoke _aligned_free, [.ptr]
        pop     edx ecx eax
        return
endp




body ResizeMem
begin
        push    ebx ecx edx

if ~ defined options.NoZeroMemory | ~ options.NoZeroMemory
        cinvoke _aligned_msize, [.ptr], MEM_ALIGNMENT, 0
        mov     ebx, eax
end if

        mov     eax, [.newsize]
        add     eax, MEM_ALIGNMENT_OFS
        and     al, MEM_ALIGNMENT_MSK
        cinvoke _aligned_realloc, [.ptr], eax, MEM_ALIGNMENT
        test    eax, eax
        jz      .error

if ~ defined options.NoZeroMemory | ~ options.NoZeroMemory
        push     eax edi
        lea      edi, [eax+ebx]
        cinvoke  _aligned_msize, eax, MEM_ALIGNMENT, 0
        mov      ecx, eax
        sub      ecx, ebx
        jc       @f
        shr      ecx, 2
        jz       @f
        xor      eax, eax
        rep stosd
@@:
        pop      edi eax
end if



if DebugMemory
            pushad

            stdcall WaitForMutex, MemMutex, -1

            mov     esi, [ptrMemoryList]

            mov     ecx, [.ptr]



    .loop:
            test    esi, esi
            jz      .notfound

            cmp     [esi+TMemoryItem.pointer], ecx
                        je      .found

            mov     esi, [esi+TMemoryItem.next]
            jmp     .loop

    .notfound:
            int3
            jmp     .exit2

    .found:
            mov     [esi+TMemoryItem.pointer], eax
            inc     [esi+TMemoryItem.resized]
            mov     ecx, [esp+11*4]
            cmp     ecx, AddArrayItems.readdr
            jne     @f
            mov     ecx, [esp+11*4+6*4]
@@:
            mov     [esi+TMemoryItem.callfrom], ecx

    .exit2:
            stdcall MutexRelease, MemMutex
            popad

end if

        clc
        pop     edx ecx ebx
        return

.error:
        mov     eax, [.ptr]
        stc
        pop     edx ecx
        return
endp



;
;body GetMemSize, .ptr
;begin
;        push    ecx edx
;        invoke  HeapSize, [_hHeap], 0, [.ptr]
;        cmp     eax, -1
;        je      .error
;        clc
;        pop     edx ecx
;        return
;
;.error:
;        stc
;        pop     edx ecx
;        return
;endp



body SpaceAllocate
begin
        push    ecx edx
        invoke  VirtualAlloc, [_MemoryFreeSpace], [.size], MEM_COMMIT, PAGE_READWRITE
        test    eax, eax
        pop     edx ecx
        return
endp


Added freshlib/system/Win32/network.asm.













































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS dependent part of the network library.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes: This library follows the rules of Berkley sockets library with some small
;         differences (for example in the return values)
;_________________________________________________________________________________________

uses wsock32, ws2_32

serrTimeout = WSAETIMEDOUT
serrAborted = WSA_OPERATION_ABORTED



uglobal
  __wsaData WSADATA
endg


if used SocketCreate

initialize InitWindowsSockets
begin
        invoke  WSAStartup, $0101, __wsaData
        test    eax, eax
        jz      @f
        int3
@@:
        return
endp


finalize FinishWindowsSockets
begin
        invoke  WSACleanup
        return
endp

end if


proc __SocketError
begin
        cmp     eax, SOCKET_ERROR
        jne     .no_error

        push    ecx edx
        invoke  WSAGetLastError
        pop     edx ecx
        stc
        return

.no_error:
        clc
        return
endp


body SocketCreate
begin
        push    ecx edx
        invoke  socket, [.protocol_family], [.socket_type], [.protocol]
        call    __SocketError
        pop     edx ecx
        return
endp


body SocketShutDown
begin
        push    ecx edx

        invoke  shutdown, [.hSocket], SD_BOTH
        call    __SocketError

        pop     edx ecx
        return
endp



body SocketClose
.buffer rb 1024
begin
        push    ecx edx
;        invoke  shutdown, [.hSocket], SD_RECEIVE
;        call    __SocketError
;        jc      .finish
;
;.loop:
;        lea     ecx, [.buffer]
;        invoke  recv, [.hSocket], ecx, 1024, 0
;
;        call    __SocketError
;        jc      .finish
;        test    eax, eax
;        jnz     .loop

        invoke  closesocket, [.hSocket]
        call    __SocketError

.finish:
        pop     edx ecx
        return
endp



body SocketConnect
begin
        push    ecx edx
        invoke  connect, [.hSocket], [.pAddress], sizeof.TSocketAddress
        call    __SocketError
        pop     edx ecx
        return
endp



body SocketBind
begin
        push    ecx edx

        mov     edx, [.pAddress]

        mov     ecx, sizeof.TSocketAddressIn
        cmp     [edx+TSocketAddress.saFamily], AF_INET
        je      .do_bind

        mov     ecx, sizeof.TSocketAddressIn6
        cmp     [edx+TSocketAddress.saFamily], AF_INET6
        je      .do_bind

        mov     ecx, sizeof.TSocketAddressUn
        cmp     [edx+TSocketAddress.saFamily], AF_UNIX
        je      .do_bind

        invoke  WSASetLastError, WSAEINVAL
        jmp     .finish

.do_bind:
        invoke  bind, [.hSocket], [.pAddress], ecx

.finish:
        call    __SocketError
        pop     edx ecx
        return
endp



body SocketListen
begin
        push    ecx edx
        invoke  listen, [.hSocket], [.maxPending]
        call    __SocketError
        pop     edx ecx
        return
endp



body SocketAccept
.addrlen dd ?
begin
        push    edx

        mov     [.addrlen], sizeof.TSocketAddress
        lea     ecx, [.addrlen]
        cmp     [.pAddress], 0
        jne     @f
        xor     ecx, ecx
        mov     [.addrlen], ecx
@@:
        invoke  accept, [.hSocket], [.pAddress], ecx
        mov     ecx, [.addrlen]
        call    __SocketError
        pop     edx
        return
endp



body SocketSend
begin
        push    ecx edx
        invoke  send, [.hSocket], [.pBuffer], [.DataLen], [.flags]
        call    __SocketError
        pop     edx ecx
        return
endp


body SocketReceive
begin
        push    ecx edx
        invoke  recv, [.hSocket], [.pBuffer], [.BufferSize], [.flags]
        call    __SocketError
        pop     edx ecx
        return
endp


body SocketSendTo
begin
        push    ecx edx
        invoke  sendto, [.hSocket], [.pBuffer], [.DataLen], [.flags], [.pAddressTo], sizeof.TSocketAddress
        call    __SocketError
        pop     edx ecx
        return
endp


body SocketReceiveFrom
.addrlen dd ?
begin
        push    edx
        mov     [.addrlen], sizeof.SocketAddress
        lea     ecx,  [.addrlen]
        invoke  recvfrom, [.hSocket], [.pBuffer], [.BufferSize], [.flags], [.pAddressFrom], ecx
        call    __SocketError
        mov     ecx, [.addrlen]
        pop     edx
        return
endp


;body SetLinger
;begin
;        push    ecx edx
;        lea     ecx, [.fLinger]
;        invoke  setsockopt, [.hSocket], SOL_SOCKET, SO_LINGER, ecx, 8
;        call    __SocketError
;        pop     edx ecx
;        return
;endp


body SocketGetOption
.len    dd ?
.option rd 4
begin
        push    ecx edx

        mov     [.len], 16

        lea     eax, [.option]
        lea     ecx, [.len]
        invoke  getsockopt, [.hSocket], SOL_SOCKET, [.idOption], eax, ecx
        call    __SocketError
        jc      .finish
        mov     eax, [.option]
.finish:
        pop     edx ecx
        return
endp



body SocketSetOption
.option rd 4
begin
        push    ecx edx

        mov     eax, [.Value]
        mov     [.option], eax
        mov     ecx, 4

        cmp     [.idOption], soLinger
        jne     .callit

        mov     [.option+4], eax
        mov     ecx, 8

.callit:
        lea     eax, [.option]
        invoke  setsockopt, [.hSocket], SOL_SOCKET, [.idOption], eax, ecx
        call    __SocketError
        pop     edx ecx
        return
endp




struct TAddrInfo
  .flags       dd ?
  .family      dd ?
  .sock_type   dd ?
  .protocol    dd ?
  .addrlen     dd ?
  .p_canonname dd ?
  .p_sock_addr dd ?
  .p_next      dd ?     ; next addrinfo structure.
ends



; returns the IP address of some domain in EAX

body ResolveDomainIP;, .hDomain
.result dd ?
begin
        pushad

        stdcall StrPtr, [.hDomain]

        lea     ecx, [.result]

        invoke getaddrinfo, eax, 0, 0, ecx

        test    eax, eax
        jnz     .error

        mov     esi, [.result]

.loop:
        test    esi, esi
        jz      .not_found

        cmp     [esi+TAddrInfo.family], AF_INET
        jne     .next

        cmp     [esi+TAddrInfo.sock_type], SOCK_STREAM
        jne     .next

        cmp     [esi+TAddrInfo.protocol], IPPROTO_TCP
        jne     .next

        cmp     [esi+TAddrInfo.addrlen], sizeof.TSocketAddressIn
        je      .found

.next:
        mov     esi, [esi+TAddrInfo.p_next]
        jmp     .loop

.end_loop:


.found:
        mov     edx, [esi+TAddrInfo.p_sock_addr]
        mov     eax, [edx+TSocketAddressIn.saAddress]
        bswap   eax
        mov     [esp+4*regEAX], eax

        clc

.finish:

        pushf
        invoke  freeaddrinfo, [.result]
        popf

.exit:
        popad
        return

.not_found:
        stc
        jmp     .finish

.error:
        stc
        jmp     .exit

endp

Added freshlib/system/Win32/process.asm.





























































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Process management library. Win32 part.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

uses kernel32, shell32

__mutex_not_initialized = 0
__mutex_mutex = 1
__mutex_critical_section = 2

struct TMutex
  .type   dd ?
  .handle dd ?
  .critical_section CRITICAL_SECTION
ends


body Terminate
begin
        invoke ExitThread, [.exit_code]
        return
endp


; Terminate current process
; Returns: nothing.

body TerminateAll
begin
        invoke ExitProcess, [.exit_code]
        return
endp



body SetForcedTerminateHandler
begin
        pushad
        invoke  SetConsoleCtrlHandler, [.procHandler], TRUE
        popad
        return
endp


; no-op for compatibility with Linux library, where this debug
; function is implemented in very slopy manner. :)

proc SetSegmentationFaultHandler, .procHandler
begin
        pushad
        invoke  SetUnhandledExceptionFilter, [.procHandler]
        popad
        return
endp


body GetCmdArguments
.argc dd ?
.array dd ?
begin
        pushad
        invoke  GetCommandLineW
        lea     ecx, [.argc]
        invoke  CommandLineToArgvW, eax, ecx
        test    eax, eax
        jz      .error

        push    eax
        mov     esi, eax

        stdcall CreateArray, 4
        mov     [.array], eax

.argloop:
        cmp     [.argc], 0
        je      .endarg

        stdcall WideCharToUtf8, [esi]
        push    eax
        stdcall AddArrayItems, [.array], 1
        mov     [.array], edx
        pop     dword [eax]

        add     esi, 4
        dec     [.argc]
        jmp     .argloop

.endarg:
        invoke  LocalFree ; from the stack...
        popad
        mov     eax, [.array]
        clc
        return

.error:
        popad
        stc
        return
endp



; Creates a new execution thread
; Returns: CF=1 if error.
;          CF=0, eax = pid of the new process being created

body ThreadCreate
begin
        push    ecx edx

        invoke  CreateThread, NULL, 0, [.ptrFunction], [.ptrArguments], 0, 0
        test    eax, eax
        jz      .error

        clc
        pop     edx ecx
        return

.error:
        stc
        pop     edx ecx
        return
endp



body FreeThreadID
begin
        push    eax ecx edx
        invoke  CloseHandle, [.ThreadID]
        pop     edx ecx eax
        return
endp




body Exec2
.startup STARTUPINFO
.process PROCESS_INFORMATION
begin
        push    ecx esi edi

        stdcall utf8ToWideChar, [.hCommand]
        mov     esi, eax

        lea     edi, [.startup]
        mov     ecx, (sizeof.STARTUPINFO + sizeof.PROCESS_INFORMATION)/4
        xor     eax, eax
        rep     stosd

        mov     [.startup.cb], sizeof.STARTUPINFO
        mov     [.startup.dwFlags], STARTF_USESTDHANDLES
        mov     eax, [.hStdIn]
        mov     ecx, [.hStdOut]
        mov     edx, [.hStdErr]
        mov     [.startup.hStdInput], eax
        mov     [.startup.hStdOutput], ecx
        mov     [.startup.hStdError], edx

        lea     ecx, [.startup]
        lea     edx, [.process]
        invoke  CreateProcessW, 0, esi, 0, 0, TRUE, NORMAL_PRIORITY_CLASS, 0, 0, ecx, edx
        stdcall FreeMem, esi
        test    eax, eax
        jz      .error

        mov     eax, [.process.hProcess]
        mov     edx, [.process.hThread]

        clc
        pop     edi esi ecx
        return

.error:
        xor     eax, eax
        xor     edx, edx
        stc
        pop     edi esi ecx
        return
endp


body FreeProcessID
begin
        push    eax ecx edx
        invoke  CloseHandle, [.ProcessID]
        pop     edx ecx eax
        return
endp


; Waits for the process to exit and returns the exit code.
; Returns:
;    CF = 0; eax=exit code
;    CF = 1; eax=0 - the process is running
;    CF = 1; eax=-1 - another error.
;
body WaitProcessExit
.exit_code dd ?
begin
        push    ecx edx
        invoke  WaitForSingleObject, [.ProcessID], [.timeout]
        cmp     eax, WAIT_TIMEOUT
        je      .err_time
        cmp     eax, WAIT_FAILED
        je      .error

        lea     eax, [.exit_code]
        invoke  GetExitCodeProcess, [.ProcessID], eax
        test    eax, eax
        jz      .error

        mov     eax, [.exit_code]
        clc

.finish:
        pop     edx ecx
        return

.err_time:
        xor     eax, eax
        stc
        jmp     .finish

.error:
        or      eax, -1
        stc
        jmp     .finish
endp



; MUTEX functions
;_________________________________________________________________________________________

body MutexCreate
begin
        push    eax ecx edx

        cmp     [.ptrName], 0
        je      .critical_section

.mutex:
        stdcall utf8ToWideChar, [.ptrName]
        push    eax

        invoke  CreateMutexW, 0, TRUE, eax
        mov     ecx, [.ptrMutex]
        mov     [ecx+TMutex.handle], eax
        mov     [ecx+TMutex.type], __mutex_mutex

        stdcall FreeMem ; from the stack

.finish:
        pop     edx ecx eax
        return

.critical_section:
        mov     eax, [.ptrMutex]
        mov     [eax+TMutex.type], __mutex_critical_section
        lea     eax, [eax+TMutex.critical_section]
        push    eax
        invoke  InitializeCriticalSectionAndSpinCount, eax, 4000
        invoke  EnterCriticalSection ; from the stack
        jmp     .finish
endp




body WaitForMutex
begin
        push    eax ecx edx

        mov     ecx, [.ptrMutex]
        cmp     [ecx+TMutex.type], __mutex_mutex
        je      .mutex

        lea     eax, [ecx+TMutex.critical_section]
        invoke  EnterCriticalSection, eax
        clc
        jmp     .finish

.mutex:
        invoke  WaitForSingleObject, [ecx+TMutex.handle], [.timeout]
        cmp     eax, WAIT_TIMEOUT
        je      .error
        cmp     eax, WAIT_FAILED
        je      .error

        clc
.finish:
        pop     edx ecx eax
        return

.error:
        stc
        jmp     .finish
endp




body MutexRelease
begin
        pushf
        push    eax ecx edx

        mov     eax, [.ptrMutex]
        cmp     [eax+TMutex.type], __mutex_mutex
        je      .mutex

        lea     eax, [eax+TMutex.critical_section]
        invoke  LeaveCriticalSection, eax
        jmp     .finish

.mutex:
        invoke  ReleaseMutex, [eax+TMutex.handle]

.finish:
        pop     edx ecx eax
        popf
        return
endp



body MutexDestroy
begin
        push    eax ecx edx
        mov     eax, [.ptrMutex]

        mov     [eax+TMutex.type], __mutex_not_initialized

        cmp     [eax+TMutex.type], __mutex_mutex
        je      .mutex

        lea     eax, [eax+TMutex.critical_section]
        invoke  DeleteCriticalSection, eax
        jmp     .finish

.mutex:
        pushd   [eax+TMutex.handle]
        mov     dword [eax+TMutex.handle], 0
        invoke  CloseHandle ; from the stack

.finish:
        pop     edx ecx eax
        return
endp




; DLL procedures.

body LibLoad
begin
        pushad

        stdcall StrDup, [.hLibName]
        push    eax
        stdcall StrNormalizePath2, eax, '\/'
        stdcall utf8ToWideChar, eax
        stdcall StrDel ; from the stack.
        push    eax

        invoke  LoadLibraryExW, eax, NULL, 0
        stdcall FreeMem ; from the stack

        test    eax, eax
        jnz     .finish

        invoke  GetLastError
        stc

.finish:
        mov     [esp+4*regEAX], eax
        popad
        return
endp



body LibRelease
begin
        pushad

        invoke  FreeLibrary, [.hLibrary]
        test    eax, eax
        jnz     .finish

        invoke  GetLastError
        mov     [esp+4*regEAX], eax
        stc

.finish:
        popad
        return
endp


body LibImport
begin
        pushad

        stdcall StrPtr, [.hObjectName]
        invoke  GetProcAddress, [.hLibrary], eax
        test    eax, eax
        jnz     .finish

        invoke  GetLastError
        stc

.finish:
        mov     [esp+4*regEAX], eax
        popad
        return
endp

Added freshlib/system/Win32/serial.asm.







































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Serial IO interface library. Linux part.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________


proc SerSetParams, .hSerial, .Baudrate, .Parity, .Flow, .Timeout
.dcb smallDCB
.cto COMMTIMEOUTS
begin
        pushad

        lea     esi, [.dcb]
        mov     [esi+DCB.DCBlength], sizeof.DCB
        invoke  GetCommState, [.hSerial], esi
        test    eax, eax
        jz      .error

        mov     eax, [.Baudrate]
        mov     ecx, [.Parity]
        mov     [.dcb.BaudRate], eax
        mov     [.dcb.Parity], cl       ; the constants are defined to be the same.
;        mov     [.dcb.StopBits], 0
        mov     [.dcb.ByteSize], 8

;        mov     ecx, [.Flow]
;        mov     [.dcb.fOutxCtsFlow], ecx
;        mov     [.dcb.fOutxDsrFlow], ecx

;        xor     ecx, ecx
;        mov     [.dcb.fOutX], ecx         ; no xon/xoff
;        mov     [.dcb.fInX], ecx          ;
;        mov     [.dcb.fAbortOnError], ecx ; no abort on error

        invoke  SetCommState, [.hSerial], esi
        test    eax, eax
        jz      .error

        mov     eax, [.Timeout]
        mov     [.cto.ReadIntervalTimeout], eax
        mov     [.cto.ReadTotalTimeoutMultiplier], eax
        mov     [.cto.ReadTotalTimeoutConstant], eax
        mov     [.cto.WriteTotalTimeoutMultiplier], eax
        mov     [.cto.WriteTotalTimeoutConstant], eax
        lea     eax, [.cto]
        invoke  SetCommTimeouts, [.hSerial], eax
        test    eax, eax
        jz      .error

        clc
        popad
        return

.error:
        stc
        popad
        return
endp

Added freshlib/system/Win32/timers.asm.



















































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Asynchronous timer library.
;
;  Target OS: Win32
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

uses user32

__sys_time_slice = 10 ;[ms]


uglobal
  if used TimerCreate
    __InternalTimerID     dd ?
    __InternalTimerThread dd ?
  end if
endg



if used TimerCreate & ~ ( defined options.DebugMode.NoTimers & options.DebugMode.NoTimers )

initialize InitWin32Timers
begin
        invoke  SetTimer, 0, 0, __sys_time_slice, __TimerProc
        mov     [__InternalTimerID], eax

        return
endp



finalize FreeWin32Timers
begin
; stop the timer
        invoke  KillTimer, 0, [__InternalTimerID]
        return
endp

end if


; This procedure is called by the system on every time quantum.
; this procedure is Win32 TimerProc

proc __TimerProc, .hwnd, .msg, .timerID, .time
begin
        lea     eax, [__ptrFirstTimer]

.loop:
        mov     eax, [eax+TTimer.next]
.loop2:
        test    eax, eax
        jz      .end_timers

        test    [eax+TTimer.flags], tmfRunning
        jz      .loop

        mov     ecx, [eax+TTimer.value]
        add     ecx, __sys_time_slice
        mov     [eax+TTimer.value], ecx

        cmp     ecx, [eax+TTimer.interval]
        jl      .loop

.exploop:
        inc     [eax+TTimer.Expired]

        mov     ecx, [eax+TTimer.interval]
        sub     [eax+TTimer.value], ecx
        cmp     [eax+TTimer.value], ecx
        jge     .exploop

        cmp     [eax+TTimer.Callback], 0
        je      .end_event

        mov     ecx, [eax+TTimer.flags]
        and     ecx, $0f
        cmp     ecx, tmfDoNothing
        je      .end_event

; call the callback procedure.
.execloop:
        pushad
        stdcall [eax+TTimer.Callback], eax
        popad

        sub     [eax+TTimer.Expired], 1
        jg      .execloop

.end_event:
        test    [eax+TTimer.flags], tmfSyncDestroy
        jz      .loop

        push    eax
        mov     eax, [eax+TTimer.next]  ; after the destruction, this pointer will be lost.
        stdcall TimerDestroy ; pointer from the stack.
        jmp     .loop2

.end_timers:
        return
endp




proc GetSysTime
.time dq ?
begin
        pushad

        lea     eax, [.time]
        invoke  GetSystemTimeAsFileTime, eax

        popad
        return
endp



__filetimeOffset = $19DB1DED53E8000


proc FileTimeToUnixTime
begin
        push    ebx ecx

        sub     eax, __filetimeOffset and $ffffffff
        sbb     edx, __filetimeOffset shr 32

        mov     ebx, eax
        mov     ecx, 10000000   ; 100 ns -> s

        mov     eax, edx
        cdq
        idiv    ecx

        xchg    eax, ebx

        idiv    ecx
        mov     edx, ebx

        pop     ecx ebx
        return
endp



proc GetTime
.time dq ?
begin
        push    ecx

        lea     eax, [.time]
        invoke  GetSystemTimeAsFileTime, eax

        mov     eax, dword [.time]
        mov     edx, dword [.time+4]

        call    FileTimeToUnixTime

        pop     ecx
        return
endp



proc GetLocalTimeOffset
.info TIME_ZONE_INFORMATION
begin
        push    ecx edx

        lea     eax, [.info]
        invoke  GetTimeZoneInformation, eax
        mov     ecx, [.info.bias]

        cmp     eax, TIME_ZONE_ID_DAYLIGHT
        jne     @f
        add     ecx, [.info.DaylightBias]
@@:

        cmp     eax, TIME_ZONE_ID_STANDARD
        jne     @f
        add     ecx, [.info.StandardBias]
@@:

        imul    ecx, 60
        neg     ecx

        mov     eax, ecx
        pop     edx ecx
        return
endp


proc Sleep, .ms
begin
        push    eax ecx edx
        invoke  SleepWin, [.ms]
        pop     edx ecx eax
        return
endp





proc GetTimestamp
begin
        pushad
        invoke  GetTickCount
        mov     [esp+4*regEAX], eax
        popad
        return
endp

uglobal
if used GetFineTimestamp
  __FPerfCnt dd ?
end if
endg


if used GetFineTimestamp
  initialize InitPerformanceCounter
  .freq rd 2
  begin
          pushad
          lea     eax, [.freq]
          invoke  QueryPerformanceFrequency, eax
          mov     eax, [.freq]
          mov     [__FPerfCnt], eax
          popad
          return
  endp
end if


; returns dword timestamp in uS

proc GetFineTimestamp
.time dq ?
begin
        push    ecx edx

        lea     eax, [.time]
        invoke  QueryPerformanceCounter, eax

        mov     eax, dword [.time]
        xor     edx, edx
        mov     ecx, 1000000
        mul     ecx
        div     dword [__FPerfCnt]

        pop     edx ecx
        return
endp

Added freshlib/system/all.asm.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: System amalgamation include file. Includes all system libraries of FreshLib
;
;  Target OS: Any
;_________________________________________________________________________________________


include 'process.asm'
include 'memory.asm'
include 'files.asm'
include 'serial.asm'
include 'environment.asm'
include 'timers.asm'
include 'network.asm'

Added freshlib/system/environment.asm.













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: OS environment functions.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: This file contains the OS independent part of the library and includes the
;         respective OS dependent file.
;_________________________________________________________________________________________

module "Environment library"


include '%TargetOS%/environment.asm'


endmodule

Changes to freshlib/system/files.asm.
















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















include '%TargetOS%/files.asm'









































































































































































































































































































































































































































;--------------------------------------------------------------------
; Allocates needed memory and loads the entire file in this memory.
; Returns pointer to memory block or NULL if there is error.
; Returns size in ecx
;--------------------------------------------------------------------
proc LoadBinaryFile, .ptrFileName
begin
        push    esi edi ebx

        stdcall FileOpen, [.ptrFileName]
        jc      .error

        mov     edi, eax

        stdcall FileSeek, edi, 0, fsFromEnd
        jc      .errorclose
        mov     ebx, eax


        lea     ecx, [ebx+4]    ; It is for the case that the file is
                                ; text and we want to use it as null terminated
                                ; string.

        stdcall GetMem, ecx
        jc      .errorclose

        mov     esi, eax
        stdcall FileSeek, edi, 0, fsFromBegin
        jc      .errorclosemem
        stdcall FileRead, edi, esi, ebx
        jc      .errorclosemem

        mov     ecx, eax

        stdcall FileClose, edi

        mov     eax, esi
        clc
        pop     ebx edi esi
        return


.errorclosemem:
        push    eax
        stdcall FreeMem, esi
        pop     eax

.errorclose:
        push    eax
        stdcall FileClose, edi
        pop     eax

.error:
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>




|
|





|




|

<

>
|


>


<

|
<







|




<

<

<







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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457

458
459
460
461
462
463
464
465

466
467

468
469
470
471
472
473
474
475
476
477
478
479

480

481

482
483
484
485
486
487
488
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Files manipulation library.
;
;  Target OS: Any
;
;  Dependencies: Uses memory.asm for memory allocations.
;
;  Notes: This file contains OS independent part of the library and also include
;         the respective OS dependent part.
;_________________________________________________________________________________________
module "Files library"

struct TFileInfo
  .timeCreated   dq ?
  .timeAccessed  dq ?
  .timeModified  dq ?
ends

iglobal
__std_handle_in:
  var STDIN  = 0
__std_handle_out:
  var STDOUT = 1
__std_handle_err:
  var STDERR = 2
endg


;----------------------------------------------------
; Returns:
;   CF = 1 if the path is relative.
;
;   CF = 0 if the path is absolute.
;          In this case ZF=0 indicates that the
;          path is relative towards the current root
;          prefix (drive letter in Windows)
;          ZF=1 indicates that the path is fully absolute.
;
;   CF = 1 - the path is fully relative.
;   CF = 0, ZF = 1 - the path is fully absolute.
;   CF = 0, ZF = 0 - the path is absolute, but needs
;                    the current root prefix ahead.
;
; This procedure is OS dependent, because the
; paths are different in the different OSes.
;----------------------------------------------------
interface IsRelativePath, .hPath

; Returns the current root prefix if any. Can be empty string.
interface GetCurrentPrefix

interface FileOpenAccess, .filename, .access

interface FileClose, .handle

; returns 32bit file size in eax
interface FileSize, .handle

interface FileRead, .handle, .buffer, .count

interface FileWrite, .handle, .buffer, .count

interface FileLock, .handle, .lock

;----------------------------------------------------
; if CF = 0, eax is the new possition in the file
; if CF = 1, eax is error code.
;----------------------------------------------------
interface FileSeek, .handle, .dist, .direction

interface FileTruncate, .handle

interface FileTruncateTo, .handle, .length

;----------------------------------------------------
; if CF = 0 - the file was deleted
; if CF = 1, eax is error code.
;----------------------------------------------------
interface FileDelete, .filename

interface GetCurrentDir

interface SetCurrentDir, .hDirectory

interface GetErrorString, .code

interface FreeErrorString, .ptrString

; reads all items of the directory and fills them in the TArray of type TDirItem.
; arguments:
;   dir - string with the path to the directory.
;
; returns:
;   if not error: CF=0; eax = pointer to TArray of TDirItem;
;   if error:     CF=1; eax = error code;

interface DirectoryRead, .dir


interface GetFileInfo, .hFile, .ptrFileInfo

interface FileExists, .hFileName

interface CreateDirectory, .DirName


; returns the read handle in eax and write handle in edx

interface CreatePipe


;--------------------------------------
; if CF = 0, eax is handle to the file.
; if CF = 1, eax is error code.
;--------------------------------------
proc FileOpen, .filename
begin
        stdcall FileOpenAccess, [.filename], faReadOnly
        return
endp


proc FileCreate, .filename
begin
        stdcall FileOpenAccess, [.filename], faReadWrite or faCreateAlways
        return
endp


;if defined StrLib
; strlib.asm depending procedures.


; reads the whole file content in a string and returns its handle.
proc StrLoadFromFile, .ptrFileName
begin
        push    ecx

        stdcall LoadBinaryFile, [.ptrFileName]
        jc      .finish

        push    eax
        stdcall StrDup, eax
        stdcall FreeMem ; from the stack

        clc

.finish:
        pop     ecx
        return
endp



proc StrSaveToFile, .ptrFileName, .hString
begin
        stdcall StrLen, [.hString]
        push    eax
        stdcall StrPtr, [.hString]
        push    eax
        stdcall SaveBinaryFile, [.ptrFileName] ; remaining already in the stack.
        return
endp


; reads a line from the text file and positions the file pointer to the begining of
; the next line.
; returns string handle with the line in EAX
; returns CF=1 and EAX=error code on error.

FILE_LINE_BUFFER = 64

proc FileReadLine, .hfile
.result dd ?
.buffer  rb FILE_LINE_BUFFER
         dd 0
begin
        pushad

        stdcall StrNew
        mov     [.result], eax

        xor     edi, edi

.read_loop:
        lea     esi, [.buffer]
        stdcall FileRead, [.hfile], esi, FILE_LINE_BUFFER
        jc      .error_read
        test    eax, eax
        jz      .end_of_file

        mov     ebx, eax
        mov     dword [esi+ebx], 0

        cmp     ebx, 3
        jbe     .proceed

        test    edi, edi
        jz      .check_bom      ; this is the first chunk.

.proceed:
        mov     edi, esi        ; start of the line.

.char_loop:
        mov     al, [esi]
        lea     esi, [esi+1]

        cmp     al, $0d
        je      .found
        cmp     al, $0a
        je      .found
        test    al, al
        jnz     .char_loop

.found:
        mov     byte [esi-1], 0
        stdcall StrCat, [.result], edi

        test    al, al
        jnz     .end_of_line
        cmp     ebx, FILE_LINE_BUFFER
        je      .read_loop
        jmp     .file_ok

.end_of_line:
        cmp     byte [esi], 0
        jne     .check_next

; when on the end of the buffer CR or LF were found, check one more byte...

        push    eax
        stdcall FileRead, [.hfile], esi, 1      ; read one more byte.
        jc      .error_read
        test    eax, eax
        pop     eax
        jz      .end_of_file

        xor     al, $0d xor $0a
        cmp     byte [esi], al
        je      .file_ok
        inc     esi
        jmp     .eol_ok

.check_next:
        xor     al, $0d xor $0a
        cmp     byte [esi], al
        jne     .eol_ok
        inc     esi

.eol_ok:
        lea     eax, [.buffer]
        sub     esi, eax
        sub     esi, ebx
        jz      .file_ok

        stdcall FileSeek, [.hfile], esi, fsFromCurrent

.file_ok:
        clc

.finish:
        popad
        mov     eax, [.result]
        return

.error_read:
        stdcall StrDel, [.result]
        mov     [.result], eax
        stc
        jmp     .finish

.end_of_file:
        stdcall StrLen, [.result]
        test    eax, eax
        jnz     .file_ok

        stdcall StrDel, [.result]
        mov     [.result], 0
        jmp     .file_ok

.check_bom:
        cmp     word [esi], $bbef
        jne     .proceed
        cmp     byte [esi+2], $bf
        jne     .proceed

        add     esi, 3
        jmp     .proceed
endp


STREAM_LINE_BUFFER = 256

struct TStreamContext
  .buffer rb STREAM_LINE_BUFFER
  .size   dd ?
  .pos    dd ?
ends


; Reads a line from a file, only reading forward.
; Suitable for reading from streams, sockets, devices and pipes.
; Also, it is faster than the FileReadLine because
; reads bigger chunks from the file and only once.
;
; The disadvantage is that it is context dependent
;
; Arguments:
;   .hStream: Handle of a file, socket, pipe, etc.
;   .pContext: pointer to the context structure TStreamContext
;              if 0 a new structure is allocated and returned without reading
;              from the stream.
; Returns:
;   CF=0, EAX: string handle of the line read or new created and initialized
;              structure TStreamContext
;
;   CF=1, EAX: Read error code.

proc StreamReadLine, .hStream, .pContext
begin
        pushad
        mov     esi, [.pContext]
        test    esi, esi
        jnz     .do_read_stream

        stdcall GetMem, sizeof.TStreamContext
        xor     ecx, ecx
        mov     [eax+TStreamContext.pos], ecx
        mov     [eax+TStreamContext.size], ecx
        mov     [esp+4*regEAX], eax
        clc
        popad
        return

.do_read_stream:
        stdcall StrNew
        mov     edx, eax
        mov     [esp+4*regEAX], edx

        mov     ebx, [esi+TStreamContext.pos]
        cmp     ebx, [esi+TStreamContext.size]
        jb      .start

.read_chunk:
        call    .chunk
        jc      .error
        jz      .error

.start:
        mov     edi, ebx

.scan:
        mov     al, [esi+ebx]

        cmp     al, $0d
        je      .eol
        cmp     al, $0a
        je      .eol

        inc     ebx
        cmp     ebx, [esi+TStreamContext.size]
        jb      .scan

        call    .append
        jmp     .read_chunk

.eol:
        call    .append

        inc     ebx
        cmp     ebx, [esi+TStreamContext.size]
        jb      @f

        push    eax
        call    .chunk
        pop     eax
        jc      .error
        jz      .finish

@@:
        xor     al, $0d xor $0a
        cmp     al, [esi+ebx]
        jne     @f
        inc     ebx
@@:
        mov     [esi+TStreamContext.pos], ebx

.finish:
        popad
        return

.error:
        mov     [esp+4*regEAX], eax
        stdcall StrDel, edx
        popad
        return

.append:
        mov     ecx, ebx
        sub     ecx, edi
        jz      @f
        add     edi, esi
        stdcall StrCatMem, edx, edi, ecx
@@:
        retn

.chunk:
        stdcall FileRead, [.hStream], esi, STREAM_LINE_BUFFER
        jc      @f
        mov     [esi+TStreamContext.size], eax
        xor     ebx, ebx
        mov     [esi+TStreamContext.pos], ebx
        test    eax, eax
@@:
        retn
endp




proc FileWriteString, .file, .hString
begin
        push    ecx

        stdcall StrLen, [.hString]
        mov     ecx, eax
        stdcall StrPtr, [.hString]
        stdcall FileWrite, [.file], eax, ecx

        pop     ecx
        return
endp





;--------------------------------------------------------------------
; Allocates needed memory and loads the entire file in this memory.
; Returns pointer to memory block or error code.
; Returns size in ecx or NULL if there is error.
;--------------------------------------------------------------------
proc LoadBinaryFile, .ptrFileName
begin
        push    esi edi ebx

        stdcall FileOpenAccess, [.ptrFileName], faReadOnly
        jc      .error

        mov     edi, eax

        stdcall FileSize, edi
        jc      .errorclose


        mov     ebx, eax
        lea     ecx, [eax+8]    ; It is for the case that the file is
                                ; text and we want to use it as null terminated
                                ; string.

        stdcall GetMem, ecx
        jc      .errorclose

        mov     esi, eax


        stdcall FileRead, edi, esi, ebx
        jc      .errorclosemem

        mov     ecx, eax

        stdcall FileClose, edi

                mov     eax, esi
        clc
        pop     ebx edi esi
        return


.errorclosemem:

        stdcall FreeMem, esi


.errorclose:
        push    eax
        stdcall FileClose, edi
        pop     eax

.error:
92
93
94
95
96
97
98
99


100








101
102
103

104
105
106
107


108


109
110


111
112

113
114
115







































































































































































        stc
        pop     edi
        return
endp



; Returns:


; CF=1 if the file NOT EXISTS








; CF=0 if the file EXISTS

proc FileExists, .ptrFileName

begin
        push    eax

        push    [.ptrFileName]


        stdcall FileOpen


        jc      .exit
        stdcall FileClose, eax


        clc
.exit:

        pop     eax
        return
endp














































































































































































|
>
>
|
>
>
>
>
>
>
>
>
|

|
>

|

|
>
>
|
>
>
|
|
>
>
|

>
|


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
        stc
        pop     edi
        return
endp




; This structure contains one directory item information.
;

struct TDirItem
  .hFilename dd ?       ; handle of string with the filename.
  .Type      dd ?       ; type of the file. Value of type ftXXXXXX (defined in the OS depending library).
  .Size      dq ?
  .mTime     dq ?
  .Perm      dd ?
             dd ?
ends



proc FreeDirArray, .pDirArray
begin
        push    eax ecx

        mov     eax, [.pDirArray]
        mov     ecx, [eax+TArray.count]
        lea     eax, [eax+TArray.array]

.freelist:
        dec     ecx
        js      .exit

        stdcall StrDel, [eax+TDirItem.hFilename]
        add     eax, sizeof.TDirItem
        jmp     .freelist
.exit:
        stdcall FreeMem, [.pDirArray]
        pop     ecx eax
        return
endp


; dsXXXX means "directory sort"

dsByName = 1
dsByExt  = 2
dsBySize = 3
dsByDate = 4

fdsDescending = $40000000
fdsDirsFirst  = $80000000

; This procedure is to be used for sorting arrays of TDirItem with the
; procedure SortArray.
;
; Use it following way:
;
;       stdcall SortArray, [.pDirArray], DirItemCompare, DIR_SORT_FLAGS
;
; DIR_SORT_FLAGS is a set of fdsXXXXX flags, and dsXXXX const defined above.

proc DirItemCompare, .pElement1, .pElement2, .param
begin
        pushad

        mov     ebx, [.pElement1]
        mov     edx, [.pElement2]

        test    [.param], fdsDirsFirst
        jz      .comp_other

        mov     eax, [ebx+TDirItem.Type]
        mov     ecx, [edx+TDirItem.Type]
        and     eax, not ftLinkMask
        and     ecx, not ftLinkMask

        cmp     eax, ftDirectory
        setne   al
        cmp     ecx, ftDirectory
        setne   cl

        cmp     al, cl
        je      .comp_dir_more

; flags are ok here!
.finish:
        popad
        return

.comp_dir_more:

        test    al, al
        jnz     .comp_other

        cmp     byte [.param], dsByDate
        je      .comp_other

        mov     [.param], dsByName

.comp_other:
        cmp     byte [.param], dsByName
        je      .name

        cmp     byte [.param], dsBySize
        je      .size

        cmp     byte [.param], dsByDate
        jne     .name

; date:
        mov     eax, dword [ebx+TDirItem.mTime]
        mov     ecx, dword [ebx+TDirItem.mTime+4]
        mov     esi, dword [edx+TDirItem.mTime]
        mov     edi, dword [edx+TDirItem.mTime+4]
        jmp     .integer

.size:
        mov     eax, dword [ebx+TDirItem.Size]
        mov     ecx, dword [ebx+TDirItem.Size+4]
        mov     esi, dword [edx+TDirItem.Size]
        mov     edi, dword [edx+TDirItem.Size+4]

.integer:
        test    [.param], fdsDescending
        jz      @f
        xchg    eax, esi
        xchg    ecx, edi
        and     [.param], not fdsDescending
@@:
        cmp     ecx, edi
        jne     .endint

        cmp     eax, esi
        je      .name           ; universal fall-down.

.endint:
        popad
        return


.name:
        mov     eax, [ebx+TDirItem.hFilename]
        mov     ecx, [edx+TDirItem.hFilename]

.comp_strings:
        test    [.param], fdsDescending
        jz      @f
        xchg    eax, ecx
@@:
        stdcall StrCompSort2, eax, ecx, FALSE
        shl     eax, 1

; if less -> CF = 1, ZF=0       (JB will be taken)
; if equal -> CF = 0, ZF=1      (JE will be taken)
; if more -> CF=0, ZF=0         (JA will be taken)
        popad
        return
endp




proc __FileErrorDisplay, .error_code, .filename
begin
        pushad

        stdcall NumToStr, [.error_code], ntsDec or ntsUnsigned
        mov     ebx, eax

        stdcall StrDupMem, .cErrorOpenString
        push    eax
        stdcall StrCat, eax, ebx
        stdcall StrCharCat, eax, $0a0d
        stdcall StrDel, ebx

        stdcall StrPtr, eax
        stdcall Output, eax
        stdcall StrDel ; from the stack.

        stdcall GetErrorString, [.error_code]
        push    eax
        stdcall StrPtr, eax
        stdcall Output, eax
        stdcall Output, .ccrlf
        stdcall FreeErrorString ; from the stack

        cmp     [.filename], 0
        je      .finish

        stdcall Output, .cErrorFilename
        stdcall StrPtr, [.filename]
        stdcall Output, eax
        stdcall Output, .ccrlf

.finish:
        popad
        return

        .cErrorOpenString db "Error code:", 0
        .cErrorFilename   db "Filename: ", 0
        .ccrlf            db 13, 10, 0
endp


include '%TargetOS%/files.asm'

endmodule

Added freshlib/system/heapmgr.asm.































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535

options.DebugHeap = 0


module "Heap manager"


include "%TargetOS%/heapmgr.asm"


ERR_FASMLIB = 0                 ;Internal FASMLIB assertion failed. This is bug in FASMLIB. Please report
ERR_UNKNOWN = 1                 ;Unknown error
ERR_MODULE_NOT_INITIALIZED = 3  ;(internal) Module not initialized
ERR_OUT_OF_MEM = 4              ;Out of memory
ERR_HEAP_CORRUPT = 5            ;(internal) Heap corrupt
ERR_MEMORY_LEAK = 6             ;(internal) Memory leak
ERR_INVALID_POINTER = 7         ;(internal) Invalid pointer
ERR_OUT_OF_RANGE = 12           ;Out of range
ERR_ZERO_SIZE = 14              ;(internal) Zero size


;interface of HEAPBLOCK and heap manager constants
struct HEAPBLOCK
  .sign  dw 'HB'         ;signature of block. must be 'HB' (heap block)
  .used  db ?            ;0 = block is unused, 1 = block is used
  .last  db ?            ;0 = block isn't last, 1 = block is last
                         ;only valid for used blocks
  .size  dd ?            ;real size of this block (not including header)
  .prev  dd ?            ;pointer to previous block. 0=this is first block
  .asize dd ?            ;allocated size of this block (can be smaller than real size)
ends


;heap size alignment (default = 4KB)
;it's value must be power of two!!!
match =HEAP_SIZE_ALIGN, HEAP_SIZE_ALIGN {
  HEAP_SIZE_ALIGN equ 4096
}

;intial heap size (default = 16KB)
;must be multiple of HEAP_SIZE_ALIGN
match =HEAP_INIT_SIZE, HEAP_INIT_SIZE {
  HEAP_INIT_SIZE equ 16384
}

;sizes of block will be multiples of this value (default = 8 bytes)
;any smaller free block will be left out as padding
;it's value must be power of two!!!
match =HEAP_BLOCK_ALIGN, HEAP_BLOCK_ALIGN {
  HEAP_BLOCK_ALIGN equ 16
}

;minimal size of block, when it is split from block whose size shrinked
;must be multiple of HEAP_BLOCK_ALIGN
match =HEAP_MIN_SPLIT_SIZE, HEAP_MIN_SPLIT_SIZE {
  HEAP_MIN_SPLIT_SIZE equ HEAP_BLOCK_ALIGN
}



iglobal
  var mem.initialized = 0    ;0 = module not initialized, 1=initialized
endg


uglobal
  var mem.heap.start = ?      ;pointer to beginning of heap
  var mem.heap.size = ?       ;size of heap
  var mem.alloc_count  = ?    ;number of allocations (to discover memory leak)
  var mem.heap_corrupt = ?    ;0 = okay, 1 = heap corrupt

  if used mem.access_mutex
    align 4
    mem.access_mutex TMutex
  end if
endg




if used GetMem
;============================================================================
; mem.init
; desc: initalizes mem module (and it's heap manager)
; args: none
; ret: CF set on error
; note: initialization is required for allocation
; error: ERR_UNKNOWN - platform-specific error
;        +mem.alloc_heap (in platform-dependant part of mem module)
;============================================================================
initialize mem.init
begin
        ;if module is already initialized, just return
        cmp     [mem.initialized], 0
        jne     .rnc

        ; call platform-dependant heap allocation
        stdcall mem.alloc_heap, HEAP_INIT_SIZE
        jc      .rc

        ; save heap info
        mov     [mem.heap.start], eax
        mov     [mem.heap.size], HEAP_INIT_SIZE

        ; create first heap block
        mov     [eax + HEAPBLOCK.sign], 'HB'
        mov     [eax + HEAPBLOCK.size], HEAP_INIT_SIZE - sizeof.HEAPBLOCK
        mov     [eax + HEAPBLOCK.prev], 0
        mov     [eax + HEAPBLOCK.last], 1
        mov     [eax + HEAPBLOCK.used], 0

        ; initialized
        mov     [mem.alloc_count], 0
        mov     [mem.heap_corrupt], 0
        mov     [mem.initialized], 1

        if options.Threads
          stdcall MutexCreate, 0, mem.access_mutex
          stdcall MutexRelease, mem.access_mutex
        end if


.rnc:   clc
.r:     return

.rc:    stc
        return
endp




;============================================================================
; mem.uninit
; desc: uninitalizes mem module (and it's heap manager)
; args: none
; ret: CF set on error
; error: ERR_UNKNOWN     - platform-specific error
;        ERR_MEMORY_LEAK - you didn't free some allocated block
;        +mem.free_heap (in platform-dependant part of mem module)
;============================================================================
finalize mem.uninit
begin
  if options.Threads
        stdcall WaitForMutex, mem.access_mutex, -1
        stdcall MutexDestroy, mem.access_mutex
  end if

        ;is module initialized?
        cmp     [mem.initialized], 0
        jz      .error_not_initialized

        cmp     [mem.heap_corrupt],0
        jne     .dont_test_heap

        ; check heap
        stdcall __mem.test_heap
        jc      .rc

.dont_test_heap:

        ; call platform-dependant free heap
        stdcall mem.free_heap, [mem.heap.start], [mem.heap.size]
        jc      .rc

        ; uninitialized
        mov     [mem.initialized], 0

        ; return error if there is some memory leak
        cmp     [mem.alloc_count], 0
        ja      .error_memory_leak

        clc
        return

.rc:    mov     [mem.initialized], 0
        stc
        return

.error_memory_leak:
        mov     eax, ERR_MEMORY_LEAK
        jmp     .rc

.error_not_initialized:
        mov     eax, ERR_MODULE_NOT_INITIALIZED
        jmp     .rc
endp


end if


uglobal
  if used LogMemory
    align 4
    __LogMemoryMutex TMutex
  end if
endg


if used LogMemory

initialize InitLogMemory
begin
        stdcall MutexCreate, 0, __LogMemoryMutex
        stdcall MutexRelease, __LogMemoryMutex
        return
endp

finalize FreeLogMemory
begin
        stdcall MutexDestroy, __LogMemoryMutex
        return
endp

end if


proc LogMemory, .pmsg, .address, .argcount
begin
        pushad

        mov     esi, [ebp]      ; caller stack frame.
        mov     edi, [esi]      ; one level back.

        cmp     edi, ebp
        ja      .ediok

        mov     edi, esi
.search:
        add     edi, 4
        cmp     [edi], esp
        jb      .search

.ediok:
        stdcall WaitForMutex, __LogMemoryMutex, -1

        stdcall Output, [.pmsg]
        stdcall OutputNumber, [.address], 16, 8
        stdcall Output, '; Call from: $'
        stdcall OutputNumber, [esi+4], 16, 8

        stdcall Output, <',',' $'>
        stdcall OutputNumber, [edi+4], 16, 8

        xor     ecx, ecx
        inc     ecx
.argloop:
        stdcall Output, ';  Arg('
        stdcall OutputNumber, ecx, 10, 2
        stdcall Output, ') = $'
        stdcall OutputNumber, [esi+4*ecx+4], 16, 8
        inc     ecx
        cmp     ecx, [.argcount]
        jbe     .argloop

        stdcall Output, .cCRLF

        stdcall MutexRelease, __LogMemoryMutex
        popad
        return

.cCRLF db 13, 10, 0
endp




body GetMem
begin
  if options.Threads
        stdcall WaitForMutex, mem.access_mutex, -1
        jc      .errmutex
  end if

        stdcall mem.alloc0, [.size]

  if options.Threads
        stdcall MutexRelease, mem.access_mutex
  end if
        jc      .error

if options.DebugHeap
        stdcall LogMemory, 'Allocate:', eax, 1
        clc
end if
        return

.error:
if options.DebugHeap
        stdcall LogMemory, 'Allocate error:', eax, 1
        stc
end if
        xor     eax, eax
        return

.errmutex:
if options.DebugHeap
        stdcall LogMemory, 'Mutex timeout:', eax, 1
        stc
end if
        jmp     .error

endp


body FreeMem
begin
        push    eax

  if options.Threads
        stdcall WaitForMutex, mem.access_mutex, -1
        jc      .finish
  end if

        stdcall mem.free, [.ptr]

  if options.Threads
        stdcall MutexRelease, mem.access_mutex
  end if

if options.DebugHeap
        jnc     .ok
        stdcall LogMemory, 'Free error:', [.ptr], 1
        stc
        jmp     .finish

.ok:
        stdcall LogMemory, 'Free:', [.ptr], 1
        clc
end if

.finish:
        pop     eax
        return
endp




body ResizeMem
begin
if options.DebugHeap
        stdcall LogMemory, 'Reallocate attempt:', [.ptr], 2
end if

  if options.Threads
        stdcall WaitForMutex, mem.access_mutex, -1
        jc      .error
  end if

        stdcall mem.realloc0, [.ptr], [.newsize]

  if options.Threads
        stdcall MutexRelease, mem.access_mutex
  end if
        jnc     .finish

.error:
        mov     eax, [.ptr]

if options.DebugHeap
        jnc     .ok
        stdcall LogMemory, 'Reallocate failed:', eax, 2
        stc
        jmp     .finish

.ok:
        stdcall LogMemory, 'Reallocate success:', eax, 2
        clc
end if

.finish:
        return
endp




;; @name mem.alloc0
;; @desc
;;    Allocates block of memory, and fills it with zeroes.
;; @arg size
;;    Size of memory to allocate
;; @ret
;;    CF set on error, otherwise
;;    EAX = pointer to beginning of allocated memory block
;; @err ERR_OUT_OF_MEM
;;    Not enough memory
;; @err ERR_ZERO_SIZE
;;    size = 0
;; @err ERR_OUT_OF_RANGE
;;     size is negative (or larger than 7FFFFFFFh if viewed as unsigned)
;; @err ERR_HEAP_CORRUPT
;;    {heap:Heap is corrupted}. You was writing to memory outside of allocated block.
;; @err ERR_MODULE_NOT_INITIALIZED
;;    Module is not initialized. Initialize module with {mem.init} to use this procedure.
;; @err ERR_UNKNOWN
;;    System returned error that wasn't translated to FASMLIB error.
;;    You can {contact} author about this, and translation can be added.
;; @warn Don't forget to release allocated block with {mem.free}!
;; @note returned pointer must be always >= 10000h
;; @note Returned pointer is always >= 10000h to make it easily distinguishable from handles.
;; @note Maximal allowed size is 7FFFFFFFh, to catch errors with negative values.
;; @note Altough returned block may have bigger size than requested on some implementations,
;;       don't use this additional memory.
;;       It is not zeroes, an {mem.realloc} doesn't preserve this memory.
;; @note Memory management must be {mem.init:initialized} for this procedure to work.
;; @note This is platform-specific procedure
proc mem.alloc0, .size
begin
        push    ebx

        ;error if size=0
        cmp     [.size], 0
        je      .error_size_zero

        ;allocate
        stdcall mem.alloc, [.size]
        jc      .rc
        mov     ebx, eax

        ;zero memory
        stdcall mem.fill, ebx, [.size], 0
        jc      .rc

        mov     eax, ebx

.rnc:   clc
.r:     pop     ebx
        return

.rc:    stc
        int3
        jmp     .r

.error_size_zero:
        mov     eax, ERR_ZERO_SIZE
        jmp     .rc
endp




;============================================================================
;; @name mem.realloc0
;; @desc
;;    Rellocates (resizes) block of memory.
;;    Block can be moved during this process, so you need to update pointer(s) to it.
;;    Contents of block are preserved.
;;    If block is enlarging, contents of added space are filled with zeroes.
;; @arg blockptr
;;    Pointer to block to relocate.
;;    This must be same pointer as returned from allocation function, pointer into block is not enough.
;; @arg newsize
;;    New size of block, in bytes
;; @ret
;;    CF set on error, orherwise
;;    EAX = pointer to reallocated memory block
;; @err ERR_INVALID_POINTER
;;    Blockptr is not a valid allocated block pointer.
;;    This could also mean {heap:heap corruption}, these two cases cannot be properly distinguished.
;; @err ERR_OUT_OF_MEM
;;     Not enough memory
;; @err ERR_ZERO_SIZE
;;     size = 0
;; @err ERR_OUT_OF_RANGE
;;     size is negative (or larger than 7FFFFFFFh if viewed as unsigned)
;; @err ERR_HEAP_CORRUPT
;;     {heap:Heap is corrupted}. You was writing to memory outside of allocated block.
;; @err ERR_MODULE_NOT_INITIALIZED
;;      Module is not initialized. Initialize module with {mem.init} to use this procedure.
;; @err ERR_UNKNOWN
;;     System returned error that wasn't translated to FASMLIB error.
;;     You can {contact} author about this, and translation can be added.
;; @dep mem.realloc_heap
;;     Only on platforms where FASMLIB heap manager is used.
;; @warn
;;     Block can be moved during realocation! If you had any pointers to block,
;;     they become invalid (so rather prefer using indexes to allocated blocks).
;;     If you saved block pointer in variable, you need to rewrite it with
;;     returned value.
;; @note Returned pointer is always >= 10000h to make it easily distinguishable from handles.
;; @note Maximal allowed newsize is 7FFFFFFFh, to catch errors with negative values.
;; @note Altough returned block may have bigger size than requested on some implementations,
;;       don't use this additional memory. {mem.realloc} doesn't preserve this memory.
;; @note Memory management must be {mem.init:initialized} for this procedure to work.
;; @note This is platform-specific procedure
proc mem.realloc0, .blockptr, .newsize
begin
        push    ebx esi

        ;error if newsize=0
        cmp     [.newsize], 0
        je      .error_newsize_zero

        ;ESI = save old block size
        stdcall GetMemSize, [.blockptr]
        mov     esi, eax

        ;reallocate
        stdcall mem.realloc, [.blockptr], [.newsize]
        jc      .r
        mov     ebx, eax

        ;number of bytes to zero = newsize-oldsize
        mov     eax, [.newsize]
        sub     eax, esi

        ;zero new memory
        pushd   0
        pushd   eax
        lea     eax, [ebx+esi]
        pushd   eax
        call    mem.fill
        jc      .r

        mov     eax, ebx

.rnc:   clc
.r:     pop     esi ebx
        return

.rc:    stc
        int3
        jmp     .r

.error_newsize_zero:
        mov     eax, ERR_ZERO_SIZE
        jmp     .rc

endp




;============================================================================
; mem.alloc
; desc: allocates <size> bytes of memory
; args: size - size of memory to allocate
; ret: CF set on error, otherwise
;      eax = pointer to beginning of allocated memory block
; note: - returned pointer must be always >= 10000h
;       - contents of allocated memory are unknown
;         (use alloc0 to have block zeroed)
;       - don't forget to mem.free allocated memory!
;       - maximal allowed size if 7FFFFFFFh, to catch errors with negative value
; error: ERR_OUT_OF_MEM   - out of memory
;        ERR_ZERO_SIZE    - size=0
;        ERR_OUT_OF_RANGE - size >= 80000000h
;        ERR_HEAP_CORRUPT - you was overwriting memory outside allocated block
;        ERR_UNKNOWN
;        ERR_MODULE_NOT_INITIALIZED
;        mem.heap_alloc
;============================================================================
proc mem.alloc, .size
begin
        push    ebx ecx edx esi edi

        ;is module initialized?
        cmp     [mem.initialized], 0
        je      .error_not_initialized

        ;was heap corruption detected?
        cmp     [mem.heap_corrupt], 0
        jne     .error_heap_corrupt

        ;error if size=0
        cmp     [.size], 0
        je      .error_size_zero
        jl      .error_size_too_big

        ;ECX = size to allocate, aligned to HEAP_BLOCK_ALIGN
        mov     ecx, [.size]
        add     ecx, HEAP_BLOCK_ALIGN-1
        and     ecx, not (HEAP_BLOCK_ALIGN-1)

        ;EBX = pointer to first HEAP block
        mov     ebx, [mem.heap.start]

        ;find unused block with enough space
.find_block:

        ;check if block is okay
        cmp     [ebx + HEAPBLOCK.sign], 'HB'
        jne     .error_heap_corrupt

        ;is the block unused?
        cmp     [ebx + HEAPBLOCK.used], 1
        ja      .error_heap_corrupt
        je      .try_next_block

        ;is the block large enough?
        cmp     [ebx + HEAPBLOCK.size], ecx
        jae     .block_found

.try_next_block:

        ;is there some next block?
        cmp     [ebx + HEAPBLOCK.last], 1
        ja      .error_heap_corrupt
        je      .no_block_found

        ;go to next block
        add     ebx, [ebx + HEAPBLOCK.size]
        add     ebx, sizeof.HEAPBLOCK
        jmp     .find_block

        ;no suitable block found. we need to enlarge heap
        ;EBX = pointer to last block
.no_block_found:
.resize_heap:

        ; increasize heap size by needed size + header size aligned to HEAP_SIZE_ALIGN
        mov     edx, ecx
        add     edx, sizeof.HEAPBLOCK
        add     edx, HEAP_SIZE_ALIGN-1
        and     edx, not (HEAP_SIZE_ALIGN-1)
        add     edx, [mem.heap.size]
        stdcall mem.realloc_heap, [mem.heap.start], edx, [mem.heap.size]
        mov     [mem.heap_corrupt], 1  ;if this call failed, we are screwed
        jc      .rc
        mov     [mem.heap_corrupt], 0
        xchg    [mem.heap.size], edx

        ;edx = size of added block
        mov     eax, [mem.heap.size]
        sub     eax, edx
        mov     edx, eax

        ;if last block was free, we append new space to it
        cmp     [ebx + HEAPBLOCK.used], 1
        jne     .add_new_space_to_last_block

        ;last block is used, but first we need to check if we can take enough unused space from last block
        ;if there is at least sizeof.HEAPBLOCK unused bytes after alignation, we take them
        mov     esi, [ebx + HEAPBLOCK.asize]
        add     esi, HEAP_BLOCK_ALIGN-1
        and     esi, not (HEAP_BLOCK_ALIGN-1)
        mov     eax, [ebx + HEAPBLOCK.size]
        sub     eax, esi
        jc      .create_block_in_added_space  ;if size is not even aligned. shouldn't happen but anyway...

        cmp     eax, sizeof.HEAPBLOCK
        jb      .create_block_in_added_space

        ;EBX = last block, ESI = new size of EBX block
.take_space_from_last_block:

        ;set up EBX
        mov     [ebx + HEAPBLOCK.last], 0
        mov     [ebx + HEAPBLOCK.size], esi

        ;set up ESI
        lea     esi, [ebx + esi + sizeof.HEAPBLOCK]
        mov     [esi + HEAPBLOCK.sign], 'HB'
        mov     [esi + HEAPBLOCK.last], 1
        mov     [esi + HEAPBLOCK.prev], ebx
        mov     eax, [mem.heap.start]
        add     eax, [mem.heap.size]
        sub     eax, esi
        sub     eax, sizeof.HEAPBLOCK
        mov     [esi + HEAPBLOCK.size], eax  ;size = up to end of block
        mov     [esi + HEAPBLOCK.used], 0

        mov     ebx, esi
        jmp     .block_found

.create_block_in_added_space:

        ;esi = new block
        lea     esi, [ebx + sizeof.HEAPBLOCK]
        add     esi, [ebx + HEAPBLOCK.size]

        ;set up the block
        mov     [ebx + HEAPBLOCK.last], 0
        mov     [esi + HEAPBLOCK.sign], 'HB'
        mov     [esi + HEAPBLOCK.last], 1
        mov     [esi + HEAPBLOCK.prev], ebx
        sub     edx, sizeof.HEAPBLOCK
        mov     [esi + HEAPBLOCK.size], edx
        mov     [esi + HEAPBLOCK.used], 0

        mov     ebx, esi
        jmp     .block_found


.add_new_space_to_last_block:
        add     [ebx + HEAPBLOCK.size], edx

        ;suitable block found, we will use it for allocation
        ;EBX = pointer to block, ecx=size to allocate
.block_found:

        ;EDI = beginning of new block aligned
        lea     edi, [ebx + sizeof.HEAPBLOCK + ecx]

        ;EDX = space left in block
        mov     edx, [ebx + HEAPBLOCK.size]
        sub     edx, ecx
        jz      .set_block ;if zero, we can skip it

        ;ESI = next block
        cmp     [ebx + HEAPBLOCK.last], 1
        ja      .error_heap_corrupt
        je      .is_last_block
        lea     esi, [ebx + sizeof.HEAPBLOCK]
        add     esi, [ebx + HEAPBLOCK.size]

        jmp     .not_last_block


.is_last_block:
        sub     edx, sizeof.HEAPBLOCK

        ;if following space is not big enough, leave it as padding
        cmp     edx, HEAP_BLOCK_ALIGN
        jb      .set_block

        ;there is enough space, create new block (EDI)
        mov     [ebx + HEAPBLOCK.last], 0
        mov     [ebx + HEAPBLOCK.size], ecx
        mov     [edi + HEAPBLOCK.sign], 'HB'
        mov     [edi + HEAPBLOCK.used], 0
        mov     [edi + HEAPBLOCK.last], 1
        mov     [edi + HEAPBLOCK.size], edx
        mov     [edi + HEAPBLOCK.prev], ebx

        jmp     .set_block

.not_last_block:

        ;if next block is unused, move it to rest of buffer append space
        cmp     [esi + HEAPBLOCK.used], 0
        jne     .next_block_used

.next_block_unused:

        ;no moving if gained space is <= sizeof.HEAPBLOCK (could case problems)
        cmp     edx, sizeof.HEAPBLOCK
        jbe     .set_block

        ;next block is unused, move it to EDI
        mov     [ebx + HEAPBLOCK.size], ecx
        mov     [esi + HEAPBLOCK.sign], 0 ;clean sign of the next block, to prevent identifying it as valid block in future
        mov     [edi + HEAPBLOCK.sign], 'HB'
        mov     [edi + HEAPBLOCK.used], 0     ;newblock.used = 0
        mov     al, [esi + HEAPBLOCK.last]
        mov     [edi + HEAPBLOCK.last], al
        mov     eax, [esi + HEAPBLOCK.size]
        add     eax, [edx - sizeof.HEAPBLOCK]
        add     [edi + HEAPBLOCK.size], eax   ;newblock.size = newblock.size + nextblock.size - nextblock_header_size
        mov     [edi + HEAPBLOCK.prev], ebx   ;newblock.prev = previous block (EBX)
        mov     [eax + HEAPBLOCK.prev], edi   ;nextblock.next.prev = newblock

        jmp     .set_block

        ;following block (ESI) is used
.next_block_used:
        sub     edx, sizeof.HEAPBLOCK

        ;if remaining space is not big enough to create new block, leave it as padding
        cmp     edx, HEAP_BLOCK_ALIGN
        jb      .set_block

        ;it's big enough, so create new block
        mov     [ebx + HEAPBLOCK.size], ecx
        mov     [edi + HEAPBLOCK.sign], 'HB'
        mov     [edi + HEAPBLOCK.size], edx
        mov     [edi + HEAPBLOCK.prev], ebx
        mov     [edi + HEAPBLOCK.used], 0
        mov     [edi + HEAPBLOCK.last], 0
        lea     eax, [edi + edx + sizeof.HEAPBLOCK]
        mov     [eax + HEAPBLOCK.prev], edi             ;ebx->next->prev = ebx->next

        ;set current block we are going to allocate
.set_block:
        mov     eax, [.size]
        mov     [ebx + HEAPBLOCK.asize], eax
        mov     [ebx + HEAPBLOCK.used], 1

        ;another block successfully allocated
        inc     [mem.alloc_count]

        ;return pointer to block
        lea     eax, [ebx + sizeof.HEAPBLOCK]

.rnc:   clc
.r:     pop     edi esi edx ecx ebx
        return

.rc:
        DebugMsg "Error mem.alloc"
        stc
        jmp     .r

.error_not_initialized:
        mov     eax, ERR_MODULE_NOT_INITIALIZED
        jmp     .rc

.error_heap_corrupt:
        int3
        mov     [mem.heap_corrupt], 1
        mov     eax, ERR_HEAP_CORRUPT
        jmp     .rc

.error_size_zero:
        mov     eax, ERR_ZERO_SIZE
        jmp     .rc

.error_size_too_big:
        mov     eax, ERR_OUT_OF_RANGE
        jmp     .rc

endp






;=============================================================================
; mem.free
; desc: deallocates memory block
; args: blockptr - pointer to memory block returned by mem.alloc
; ret: CF set on error
; note: after error, consider block as freed, don't use it anymore
; error: ERR_INVALID_POINTER - if blockptr isn't valid block pointer
;        ERR_HEAP_CORRUPT - you was overwriting memory outside allocated block
;        ERR_UNKNOWN
;        ERR_MODULE_NOT_INITIALIZED
;        ERR_FASMLIB
;=============================================================================
proc mem.free, .blockptr
begin
        push    eax ebx edi

        ;is module initialized?
        cmp     [mem.initialized], 0
        je      .error_not_initialized

        ;was heap corruption detected?
        cmp     [mem.heap_corrupt], 0
        jne     .error_heap_corrupt

        ;EBX = pointer to heap block
        mov     ebx, [.blockptr]
        sub     ebx, sizeof.HEAPBLOCK

        ;check if pointer lies inside heap
        mov     eax, ebx
        sub     eax, [mem.heap.start]
        jb      .error_bad_pointer
        sub     eax, [mem.heap.size]
        jae     .error_bad_pointer

        ;check block
        cmp     [ebx + HEAPBLOCK.sign], 'HB'
        jne     .error_bad_pointer
        cmp     [ebx + HEAPBLOCK.used], 1
        ja      .error_heap_corrupt
        jb      .error_bad_pointer

        ;free block
        mov     [ebx + HEAPBLOCK.used], 0

.check_following_block:

        ;EDI = following block (if any)
        cmp     [ebx + HEAPBLOCK.last], 1
        ja      .error_heap_corrupt
        je      .check_previous_block
        lea     edi, [ebx + sizeof.HEAPBLOCK]
        add     edi, [ebx + HEAPBLOCK.size]

        ;check following block
        cmp     [edi + HEAPBLOCK.sign], 'HB'
        jne     .error_heap_corrupt
        cmp     [edi + HEAPBLOCK.prev], ebx
        jne     .error_heap_corrupt

        ;if following block is unused, append it
        cmp     [edi + HEAPBLOCK.used], 1
        ja      .error_heap_corrupt
        je      .check_previous_block

        ;append block
        mov     [edi + HEAPBLOCK.sign], 0
        mov     eax, [edi + HEAPBLOCK.size]
        add     eax, sizeof.HEAPBLOCK
        add     [ebx + HEAPBLOCK.size], eax
        mov     al, [edi + HEAPBLOCK.last]
        mov     [ebx + HEAPBLOCK.last], al

.check_previous_block:

        ;EDI = previous block (if any)
        mov     edi,[ebx + HEAPBLOCK.prev]
        test    edi, edi
        jz      .done

        ;check EDI block
        cmp     [edi + HEAPBLOCK.sign], 'HB'
        jne     .error_heap_corrupt
        cmp     [edi + HEAPBLOCK.last], 0
        jne     .error_heap_corrupt
        lea     eax, [edi + sizeof.HEAPBLOCK]
        add     eax, [edi + HEAPBLOCK.size]
        cmp     eax, ebx
        jne     .error_heap_corrupt

        ;if EDI block is unused, append EBX block to to it
        cmp     [edi + HEAPBLOCK.used], 1
        ja      .error_heap_corrupt
        je      .done

        ;append block
        mov     [ebx + HEAPBLOCK.sign], 0
        mov     eax, [ebx + HEAPBLOCK.size]
        add     eax, sizeof.HEAPBLOCK
        add     [edi + HEAPBLOCK.size], eax
        mov     al, [ebx + HEAPBLOCK.last]
        mov     [edi + HEAPBLOCK.last], al

        mov     ebx, edi

.done:

        ;if this isn't last block, set prev of next block
        cmp     [ebx + HEAPBLOCK.last], 1
        je      @f
        lea     eax, [ebx + sizeof.HEAPBLOCK]
        add     eax, [ebx + HEAPBLOCK.size]
        mov     [eax + HEAPBLOCK.prev], ebx
        @@:

        ;another block successfully released
        dec     [mem.alloc_count]
        jc      .error_alloc_count_overflow

        ;TODO - reduce heap size if ebx is last?

.rnc:   clc
.r:     pop     edi ebx eax
        return

.rc:    stc
        jmp     .r

.error_not_initialized:
        mov     eax, ERR_MODULE_NOT_INITIALIZED
        jmp     .rc

.error_heap_corrupt:
        int3
        mov     [mem.heap_corrupt], 1
        mov     eax, ERR_HEAP_CORRUPT
        jmp     .rc

.error_bad_pointer:
        mov     eax, ERR_INVALID_POINTER
        jmp     .rc

.error_alloc_count_overflow:
        mov     eax, ERR_FASMLIB
        jmp     .rc
endp





;=============================================================================
; mem.realloc
; desc: reallocates memory block
; args: blockptr - pointer to memory block returned by mem.(re)alloc
;       newsize  - new size of memory block
; ret: CF set on error, orherwise
;      eax = pointer to reallocated memory block
; note: returned pointer must be always >= 10000h
;       - data in block are is modified (only data at the end of block is
;         lost if newsize < previous size)
;       - if block is enlarging, then contents of added memory are unknown
;         (use realloc0 to have it zeroed)
;       - block can move to other place in memory, so previous pointers into
;         block become invalid (so rather use indexes in block than pointers)
;       - maximal allowed size if 7FFFFFFFh, to catch errors with negative value
;       - if you had pointer stored in variable, don't forget to restore it:
;           libcall mem.realloc, [blockptr], [newsize]
;           jc error
;           mov [blockptr], eax     ;without this, it's hard-to-find bug
; error: ERR_INVALID_POINTER - blockptr isn't a valid block pointer
;        ERR_HEAP_CORRUPT    - you was overwriting memory outside allocated block
;        ERR_ZERO_SIZE       - newsize = 0
;        ERR_OUT_OF_RANGE    - newsize >= 80000000h
;        ERR_MODULE_NOT_INITIALIZED
;        +mem.alloc
;        +mem.free
;=============================================================================
proc mem.realloc, .blockptr, .newsize
begin
        push    ebx ecx edx esi edi

        ;is module initialized?
        cmp     [mem.initialized], 0
        je      .error_not_initialized

        ;was heap corruption detected?
        cmp     [mem.heap_corrupt], 0
        jne     .error_heap_corrupt

        ;error if newsize=0
        cmp     [.newsize], 0
        je      .error_newsize_zero
        jl      .error_newsize_too_big

        ;EBX = pointer to heap block
        mov     ebx, [.blockptr]
        sub     ebx, sizeof.HEAPBLOCK

        ;check if pointer lies inside heap
        mov     eax, ebx
        sub     eax, [mem.heap.start]
        jb      .error_bad_pointer
        sub     eax, [mem.heap.size]
        jae     .error_bad_pointer

        ;check block
        cmp     [ebx + HEAPBLOCK.sign], 'HB'
        jne     .error_bad_pointer
        cmp     [ebx + HEAPBLOCK.used], 1
        ja      .error_heap_corrupt
        jb      .error_bad_pointer

        ;if newsize fits into real size of block, just reset size
        mov     ecx, [.newsize]
        cmp     ecx, [ebx + HEAPBLOCK.size]
        ja      .current_block_too_small
        mov     [ebx + HEAPBLOCK.asize], ecx
        jmp     .done

.current_block_too_small:

        ;ECX = requested size of block aligned
        add     ecx, HEAP_BLOCK_ALIGN-1
        and     ecx, not (HEAP_BLOCK_ALIGN-1)

        ;EDX = required additional size
        mov     edx, ecx
        sub     edx, [ebx + HEAPBLOCK.size]

        ;if there is no following block, we must allocate
        cmp     [ebx + HEAPBLOCK.last], 1
        je      .allocate_new_block
        ja      .error_heap_corrupt

        ;ESI = following block
        lea     esi, [ebx + sizeof.HEAPBLOCK]
        add     esi, [ebx + HEAPBLOCK.size]

        ;check following block
        cmp     [esi + HEAPBLOCK.sign], 'HB'
        jne     .error_heap_corrupt
        cmp     [esi + HEAPBLOCK.prev], ebx
        jne     .error_heap_corrupt

        ;if following block is used, we must allocate
        cmp     [esi + HEAPBLOCK.used], 1
        ja      .error_heap_corrupt
        je      .allocate_new_block

        ;if following block is not big enough, we must allocate
        mov     eax, [esi + HEAPBLOCK.size]
        add     eax, sizeof.HEAPBLOCK
        cmp     edx, eax
        ja      .allocate_new_block

.append_following_block:

        ;EBX = our block, ESI=following block, EAX=size of new block (header included)
        add     [ebx + HEAPBLOCK.size], eax
        mov     eax, [.newsize]
        mov     [ebx + HEAPBLOCK.asize], eax
        mov     [esi + HEAPBLOCK.sign], 0 ;delete mark

        ;if next block was last, set this one as last
        mov     al, [esi + HEAPBLOCK.last]
        mov     [ebx + HEAPBLOCK.last], al
        cmp     al, 1
        ja      .error_heap_corrupt
        je      .block_created

        ;otherwise point nextblock.prev to ours block
        add     esi, [esi + HEAPBLOCK.size] ;move to next block
        add     esi, sizeof.HEAPBLOCK
        mov     [esi + HEAPBLOCK.prev], ebx

        jmp     .block_created

.allocate_new_block:

        ;allocate new block
        mov     ecx, [.newsize]
        stdcall mem.alloc, ecx
        jc      .rc

        ;copy contents of old block into new block
        mov     edi, eax
        lea     esi, [ebx+sizeof.HEAPBLOCK]
        stdcall mem.copy, edi, esi, [ebx+HEAPBLOCK.asize]
        jc      .rc

        ;free old block
        stdcall mem.free, esi
        jc      .rc

        ;return new block
        mov     eax, edi
        jmp     .rnc

.block_created:

        ;now check whether to split unused part from created block

        ;ECX = aligned real size of block
        mov     ecx, [ebx + HEAPBLOCK.asize]
        add     ecx, HEAP_BLOCK_ALIGN-1
        and     ecx, not (HEAP_BLOCK_ALIGN-1)

        ;EDX = gained space
        mov     edx, [ebx + HEAPBLOCK.size]
        sub     edx, ecx

        ;if it's at least sizeof.HEAPBLOCK + HEAP_BLOCK_ALIGN, create new block
        sub     edx, sizeof.HEAPBLOCK
        jb      .done
        cmp     edx, HEAP_BLOCK_ALIGN
        jb      .done

        ;ESI = new block
        mov     [ebx + HEAPBLOCK.size], ecx
        lea     esi, [ebx + ecx + sizeof.HEAPBLOCK]
        mov     [esi + HEAPBLOCK.sign], 'HB'
        mov     [esi + HEAPBLOCK.used], 0
        mov     [esi + HEAPBLOCK.size], edx
        mov     [esi + HEAPBLOCK.prev], ebx
        mov     al, [ebx + HEAPBLOCK.last]
        mov     [ebx + HEAPBLOCK.last], 0
        mov     [esi + HEAPBLOCK.last], al

        ;if esi isn't last, set esi->next->prev = esi
        cmp     al, 1
        ja      .error_heap_corrupt
        je      @f
        lea     eax, [esi + edx + sizeof.HEAPBLOCK]
        mov     [eax + HEAPBLOCK.prev], esi
        @@:

.done:
        ;return pointer
        lea     eax, [ebx + sizeof.HEAPBLOCK]

.rnc:   clc
.r:     pop     edi esi edx ecx ebx
        return

.rc:    stc
        jmp     .r

.error_not_initialized:
        mov     eax, ERR_MODULE_NOT_INITIALIZED
        jmp     .rc

.error_heap_corrupt:
        int3
        mov     [mem.heap_corrupt], 1
        mov     eax, ERR_HEAP_CORRUPT
        jmp     .rc

.error_newsize_zero:
        mov     eax, ERR_ZERO_SIZE
        jmp     .rc

.error_newsize_too_big:
        mov     eax, ERR_OUT_OF_RANGE
        jmp     .rc

.error_bad_pointer:
        mov     eax, ERR_INVALID_POINTER
        jmp     .rc
endp





;=============================================================================
; mem.size
; desc: returns size of memory block
; args: blockptr - pointer to memory block returned by mem.alloc
; ret: CF set on error, orherwise
;      eax = size of memory block
; error: ERR_INVALID_POINTER - blockptr isn't a valid block pointer
;        ERR_HEAP_CORRUPT    - you was overwriting memory outside allocated block
;        ERR_UNKNOWN
;        ERR_MODULE_NOT_INITIALIZED
;=============================================================================
proc GetMemSize, .blockptr
begin
        push    ebx

        ;is module initialized?
        cmp     [mem.initialized], 0
        je      .error_not_initialized

        ;was heap corruption detected?
        cmp     [mem.heap_corrupt], 0
        jne     .error_heap_corrupt

        ;EBX = pointer to heap block
        mov     ebx, [.blockptr]
        sub     ebx, sizeof.HEAPBLOCK

        ;check if pointer lies inside heap
        mov     eax, ebx
        sub     eax, [mem.heap.start]
        jb      .error_bad_pointer
        sub     eax, [mem.heap.size]
        jae     .error_bad_pointer

        ;check block
        cmp     [ebx + HEAPBLOCK.sign], 'HB'
        jne     .error_bad_pointer
        cmp     [ebx + HEAPBLOCK.used], 1
        ja      .error_heap_corrupt
        jb      .error_bad_pointer
        cmp     [ebx + HEAPBLOCK.last], 1
        ja      .error_heap_corrupt

        ;return size
        mov     eax, [ebx + HEAPBLOCK.asize]
        cmp     eax, [ebx + HEAPBLOCK.size]
        ja      .error_heap_corrupt

.rnc:   clc
.r:     pop     ebx
        return

.rc:    stc
        pop     ebx
        return

.error_not_initialized:
        mov     eax, ERR_MODULE_NOT_INITIALIZED
        jmp     .rc

.error_heap_corrupt:
        int3
        mov     [mem.heap_corrupt], 1
        mov     eax, ERR_HEAP_CORRUPT
        jmp     .rc

.error_bad_pointer:
        mov     eax, ERR_INVALID_POINTER
        jmp     .rc
endp



;_______________________________________________________________________________________________


;===================================================================
; internal - for testing heap
proc __mem.test_heap
begin
        push    ebx edx

        ;is module initialized?
        cmp     [mem.initialized], 0
        je      .error_not_initialized

        ;was heap corruption detected?
        cmp     [mem.heap_corrupt], 0
        jne     .error_heap_corrupt

        mov     ebx, [mem.heap.start]
        mov     edx, 0

.process_block:

        ;check if block lies in heap
        mov     eax, ebx
        sub     eax, [mem.heap.start]
        jb      .error_heap_corrupt
        cmp     eax, [mem.heap.size]
        jae     .error_heap_corrupt

        ;check block
        cmp     [ebx + HEAPBLOCK.sign], 'HB'
        jne     .error_heap_corrupt
        cmp     [ebx + HEAPBLOCK.used], 1
        ja      .error_heap_corrupt
        cmp     [ebx + HEAPBLOCK.prev], edx
        jne     .error_heap_corrupt

        ;if used, check 0 < asize <= size
        cmp     [ebx + HEAPBLOCK.used], 1
        ja      .error_heap_corrupt
        jb      @f
        mov     eax, [ebx + HEAPBLOCK.asize]
        test    eax, eax
        je      .error_heap_corrupt
        cmp     eax, [ebx + HEAPBLOCK.size]
        ja      .error_heap_corrupt
        @@:

        ;check if last block fills entire heap
        cmp     [ebx + HEAPBLOCK.last], 1
        ja      .error_heap_corrupt
        jb      @f
        lea     eax, [ebx + sizeof.HEAPBLOCK]
        add     eax, [ebx + HEAPBLOCK.size]
        sub     eax, [mem.heap.start]
        cmp     eax, [mem.heap.size]
        jne     .error_heap_corrupt
        @@:

        ;if this was last block, end
        cmp     [ebx + HEAPBLOCK.last], 1
        je      .done

        ;move to next block
        mov     edx, ebx
        add     ebx, [ebx + HEAPBLOCK.size]
        add     ebx, sizeof.HEAPBLOCK
        jmp     .process_block

.done:
        ;does last block fill entire heap?
        lea     eax, [ebx + sizeof.HEAPBLOCK]
        add     eax, [ebx + HEAPBLOCK.size]
        sub     eax, [mem.heap.start]
        cmp     eax, [mem.heap.size]
        jne     .error_heap_corrupt

.rnc:   clc
.r:     pop     edx ebx
        return

.rc:    stc
        jmp     .r

.error_not_initialized:
        mov     eax, ERR_MODULE_NOT_INITIALIZED
        jmp     .rc

.error_heap_corrupt:
        int3
        mov     [mem.heap_corrupt], 1
        mov     eax, ERR_HEAP_CORRUPT
        jmp     .rc
endp





;; @name mem.copy
;; @desc
;;    Copies contents block of memory of given size to another place.
;;    Supports overlapped copy (like "memmove" in C).
;; @arg dest
;;    pointer to destination place, to where the block will be copied
;; @arg src
;;    pointer to source place, from where the block will be copied
;; @arg size
;;    number of bytes to copy
;; @ret
;;    CF = 1 on error, otherwise
;;    EAX = dest
;; @err ERR_INVALID_POINTER
;;    some of pointers point to inaccessible area
;; @note Supports overlapped copy, eg. case when src < dest < src+size.
;; @note Does nothing when size=0
;; @note Memory management doesn't have to be initalized for this to work
proc mem.copy, .dest, .src, .size
begin
        push    ecx esi edi
        pushf

        mov     edi, [.dest]
        mov     esi, [.src]
        mov     ecx, [.size]

        ;just return when copying 0 bytes
        cmp     ecx, 0
        je      .done

        ;check if dest area is overlapping src (when src < dest < src+size)
        cmp     esi, edi
        je      .done ;if dest=src, we don't need to move
        ja      .not_overlapping
        lea     eax, [esi+ecx]
        cmp     edi, eax
        jae     .not_overlapping


        ;if it's overlapping
.overlapping:
        ;start moving from end of buffers
        add     esi, ecx
        add     edi, ecx

        ;classical unoptimized unalgined move
        std
        dec     esi
        dec     edi
        shr     ecx, 1
        jnc     @f
        movsb
@@:

        dec     esi
        dec     edi
        shr     ecx, 1
        jnc     @f
        movsw
@@:     jecxz   @f

        sub     esi, 2
        sub     edi, 2
        rep     movsd
@@:

        jmp     .done


.not_overlapping:

        ;classical unoptimized unalgined move
        cld
        shr     ecx, 1
        jnc     @f
        movsb
@@:     shr     ecx, 1
        jnc     @f
        movsw
@@:     jecxz   @f
        rep     movsd
@@:
        ;everything is okay
.done:  and     byte [esp],not 1     ;clear CF in stack
        mov     eax,[.dest]

.r:     popf
        pop     edi esi ecx
        return
endp


;============================================================================
;; @name mem.fill
;; @desc
;;    Fills block of memory with given dword pattern.
;; @arg dest
;;    Pointer to block which we will fill.
;; @arg size
;;    Size of block to fill.
;;    If size isn't multiple of 4, remaining bytes will be filled with according
;;    bytes of filler (little endian).
;; @arg value
;;    Dword value with which the block is filled.
;; @ret
;;    CF = 1 on error, otherwise
;;    EAX = dest
;; @err ERR_INVALID_POINTER
;;    dest points to inaccessible area
;; @note Does nothing when size=0
;; @note Memory management doesn't have to be initalized for this to work
proc mem.fill, .dest, .size, .value
begin
        push    ecx edi
        pushf
        cld

        mov     edi, [.dest]
        mov     ecx, [.size]
        mov     eax, [.value]

        ;just return if size=0
        cmp     ecx,0
        je      .done

        ;align filling pointer to dword
        test    edi, 1b
        jz      @f
        stosb
        ror     eax, 8
        dec     ecx
@@:     test    edi, 10b
        jz      @f
        stosw
        ror     eax, 16
        dec     ecx
        dec     ecx
@@:
        ;do the main fill
        push    ecx
        shr     ecx, 2
        rep     stosd
        pop     ecx

        ;fill rest
        shr     ecx, 1
        jnc     @f
        stosb
        ror     eax, 8
@@:     shr     ecx, 1
        jnc     @f
        stosw
@@:
        ;everything is okay
.done:  and     byte [esp],not 1  ;clear CF in stack
        mov     eax, [.dest]

.r:     popf
        pop     edi ecx
        return
endp




endmodule

Changes to freshlib/system/memory.asm.

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
; ____________________________________________________________________
;|                                                                    |
;| This file is part of the project:                                  |
;|                                                                    |
;| ..::FreshLib::.. - portable, assembler library and GUI toolkit.    |
;|____________________________________________________________________|
;|                                                                    |



;|                          This file                                 |
;|                          _________                                 |

;|   Author: John Found                                               |
;|                                                                    |

;|   Title: memory.asm  Memory management library. OS independent.    |
;|                                                                    |
;|   OS: Any supported                                                |
;|____________________________________________________________________|

DebugMemory = 0


cInitialCapacity = 10



















include '%TargetOS%/memory.asm'





iglobal

  ;___________________________________________________________________________
  ;
  ; This is a pointer to the active resize strategy procedure.
  ; There can be many different strategyes for resizing dynamic memory objects.
  ; ResizeIt points to a procedure that resizes ecx, according to the particular
  ; strategy.
  ; The resize procedure returns CF=1 if the resize can not be provided.
  ;____________________________________________________________________________

  ResizeIt dd StrategyGentle
endg





;____________________________
;
; NewSize = (OldSize+1)*2
; Very aggressive strategy.
;____________________________

proc StrategyAgressive
begin
        add     ecx, 1
        jc      @f

        shl     ecx, 1
@@:





        return
endp



;____________________________
;
; NewSize = (OldSize+2)*1.5
; Very aggressive strategy.
;____________________________

proc StrategyMedium
begin
        push    ecx
        add     ecx, 1
        jc      .exit
|
|
<
<
|
|
<
>
>
>
|
<
>
|
<
>
|
|
<
|

|

>



>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
|
|

>
>
>
|
>



|




|
|
|

|
>
>










|
>

|
>
>
>
>
>








|







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
; _______________________________________________________________________________________
;|                                                                                       |


;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|

;
;  Description: Dynamic memory management library.
;
;  Target OS: Any

;
;  Dependencies:

;
;  Notes: This file contains the OS independent part of the library and includes the
;         respective OS dependent file.

;_________________________________________________________________________________________

module "Memory library"

DebugMemory = 0
cInitialCapacity = 10


; Allocates memory block with given size.
; Returns: CF=1 if error.
;          if CF=0, eax = pointer to the memory block allocated.
interface GetMem, .size

interface FreeMem, .ptr

interface ResizeMem, .ptr, .newsize

interface SpaceAllocate, .size


match =HeapManager, HeapManager {
  define HeapManager OS
}

match =OS, HeapManager {
  include '%TargetOS%/memory.asm'
}

match =ASM, HeapManager {
  include 'heapmgr.asm'
}


  ;___________________________________________________________________________
  ;
  ; This is a pointer to the active resize strategy procedure.
  ; There can be many different strategies for resizing dynamic memory objects.
  ; ResizeIt points to a procedure that resizes ecx, according to the particular
  ; strategy.
  ; The resize procedure returns CF=1 if the resize can not be provided.
  ;____________________________________________________________________________
  if used ResizeIt
    ResizeIt dd StrategyGentle
  end if

uglobal
  var _MemoryFreeSpace=?
endg

;____________________________
;
; NewSize = (OldSize+1)*2
; Very aggressive strategy.
;____________________________

proc StrategyAgressive
begin
        add     ecx, 1
        jc      .exit

        shl     ecx, 1

        cmp     ecx, cInitialCapacity
        jae     .exit
        mov     ecx, cInitialCapacity
        clc
.exit:
        return
endp



;____________________________
;
; NewSize = (OldSize+2)*1.5
; Normal strategy.
;____________________________

proc StrategyMedium
begin
        push    ecx
        add     ecx, 1
        jc      .exit
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105

        return
endp


;____________________________
;
; NewSize = (OldSize+2)*1.25
; Very aggressive strategy.
;____________________________

proc StrategyGentle
begin
        push    ecx
        add     ecx, 1
        jc      .exit
        shr     ecx, 2
        add     [esp], ecx
        pop     ecx

        cmp     ecx, cInitialCapacity
        jae     .exit
        mov     ecx, cInitialCapacity
        clc
.exit:
        return
endp










|




















>
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
        return
endp


;____________________________
;
; NewSize = (OldSize+2)*1.25
; Memory spare strategy.
;____________________________

proc StrategyGentle
begin
        push    ecx
        add     ecx, 1
        jc      .exit
        shr     ecx, 2
        add     [esp], ecx
        pop     ecx

        cmp     ecx, cInitialCapacity
        jae     .exit
        mov     ecx, cInitialCapacity
        clc
.exit:
        return
endp


endmodule

Added freshlib/system/network.asm.











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Network library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes:
;_________________________________________________________________________________________

module "Network library"


struct TSocketAddress
  .saFamily  dw ?
  .saAddress rb 14
ends


struct TSocketAddressIn
  .saFamily  dw ?
  .saPort    dw ?
  .saAddress dd ?
  .saZero    rb 8
ends


struct TAddrIn6
  label .addr8 byte
  label .addr16 word
  .addr32 rd 4
ends


struct TSocketAddressIn6
  .saFamily   dw ?
  .saPort     dw ?
  .saFlowInfo dd ?
  .saAddress  TAddrIn6
  .saScopeID  dd ?
ends



struct TSocketAddressUn
  .saFamily dw ?
  .saPath   rb UNIX_PATH_MAX
ends



soReuseAddr = SO_REUSEADDR
soDontRoute = SO_DONTROUTE
soRecvBuffer = SO_RCVBUF
soSendBuffer = SO_SNDBUF
soRecvTimeout = SO_RCVTIMEO     ; timeout in [ms] for all OSes
soSendTimeout = SO_SNDTIMEO     ; timeout in [ms] for all OSes
soLinger      = SO_LINGER       ; timout in [s]



interface SocketCreate, .protocol_family, .socket_type, .protocol

interface SocketShutDown, .hSocket

interface SocketClose, .hSocket

interface SocketConnect, .hSocket, .pAddress

interface SocketBind, .hSocket, .pAddress

interface SocketListen, .hSocket, .maxPending

interface SocketAccept, .hSocket, .pAddress

interface SocketSend, .hSocket, .pBuffer, .DataLen, .flags

interface SocketReceive, .hSocket, .pBuffer, .BufferSize, .flags

interface SocketSendTo, .hSocket, .pBuffer, .DataLen, .flags, .pAddressTo

interface SocketReceiveFrom, .hSocket, .pBuffer, .BufferSize, .flags, .pAddressFrom

interface SocketGetOption, .hSocket, .idOption

interface SocketSetOption, .hSocket, .idOption, .Value

interface ResolveDomainIP, .hDomain

interface ResolveDomainIP6, .hDomain


include "%TargetOS%/network.asm"



proc SocketSendStr, .hSocket, .hString
begin
        pushad

        stdcall StrLen, [.hString]
        push    eax

        stdcall StrPtr, [.hString]
        stdcall SocketSendAll, [.hSocket], eax     ; remaining arguments from the stack.

        popad
        return
endp




proc SocketSendAll, .hSocket, .pData, .Size
begin
        pushad

;        stdcall GetTimestamp
;        mov     edi, eax

        mov     esi, [.pData]
        mov     ecx, [.Size]
        jecxz   .finish_ok

.loop:
        stdcall SocketSend, [.hSocket], esi, ecx, 0
        jc      .finish_err

        test    eax, eax
        jz      .finish_err

;        OutputValue "Send bytes:", eax, 10, -1

        add     esi, eax
        sub     ecx, eax
        jnz     .loop

.finish_ok:

;        stdcall GetTimestamp
;        sub     eax, edi
;
;        OutputValue "SendAll time: ", eax, 10, -1

        clc
        popad
        return

.finish_err:
        stc
        mov     [esp+4*regEAX], eax
        popad
        return
endp




struct __s_readln
  .capacity = 1024
  .buffer rb .capacity
  .len    dd ?   ; the count of valid bytes in the buffer.
ends


; Reads a line from the socket and concatenate it to the provided
; string hString.
;
; If there is no data for a whole line, and the timeout expires,
; returns what has been read.
;
; All possible combinations of CR/LF are recognized as a line end.
; After end of line is detected, the remaining data read is returned
; in the buffer and the same pointer should be passed the next time
; the function is call.
;
; Arguments:
;   .hSocket - the socket to be read;
;   .pBuffer - the buffer, returned from the previous call to the procedure.
;              should be NULL on the first call.
;   .timeout - timeout in ms for detection of end-of-transmission.
;
; Returns:
;   eax - the string with the line.
;   edx - pointer to the buffer that to be passed to the procedure next time.
;         can be NULL, if there is no more data to be processed. The buffer is
;         allocated on the first call to the procedure. Should be free with FreeMem
;         when not needed.
;  CF = 1 on socket read error. In this case, ECX returns the error code.
;


proc SocketReadLine, .hSocket, .pBuffer, .timeout
begin
        pushad

        xor     edx, edx
        mov     [esp+4*regEAX], edx

        stdcall SocketSetOption, [.hSocket], soRecvTimeout, [.timeout]

        stdcall StrNew
        mov     ebx, eax

        mov     edi, [.pBuffer]
        test    edi, edi
        jnz     .scan_buffer

        stdcall GetMem, sizeof.__s_readln
        mov     edi, eax
        mov     [edi+__s_readln.len], eax

.read_loop:
        stdcall SocketReceive, [.hSocket], edi, __s_readln.capacity, 0
        jc      .socket_error

        mov     [edi+__s_readln.len], eax
        test    eax, eax
        jz      .free_buffer      ; the socket has been closed from the remote side and the buffer is empty.


.scan_buffer:
        xor     ecx, ecx

        mov     eax, edx
        test    eax, eax
        jnz     .eol_ok

.inner_loop:
        mov     al, [edi+ecx]
        inc     ecx

        cmp     al, $0d
        je      .end_of_line
        cmp     al, $0a
        je      .end_of_line

        cmp     ecx, [edi+__s_readln.len]
        jne     .inner_loop

;end of buffer

        inc     ecx
        xor     eax, eax

.end_of_line:
        dec     ecx
        jz      .cat_ok

        stdcall StrCatMem, ebx, edi, ecx

.cat_ok:
        mov     [esp+4*regEAX], ebx

        inc     ecx
        cmp     ecx, [edi+__s_readln.len]
        jb      .eol_ok

        mov     edx, eax
        jmp     .read_loop

.eol_ok:
        xor     al, $0d xor $0a
        cmp     [edi+ecx], al
        jne     .line_ok

        inc     ecx

.line_ok:

; copy the buffer to the beginning.

        lea     esi, [edi+ecx]

        sub     ecx, [edi+__s_readln.len]
        jnz     .copy_buffer

.free_buffer:

        stdcall FreeMem, edi
        xor     edi, edi
        jmp     .finish


.copy_buffer:

        neg     ecx
        mov     [edi+__s_readln.len], ecx

        cmp     esi, edi
        je      .finish

        push    edi
        rep movsb
        pop     edi

.finish:
        clc

.err:
        pushf
        cmp     dword [esp+4*regEAX+4], 0
        jne     .str_ok

        stdcall StrDel, ebx

.str_ok:
        popf
        mov     [esp+4*regEDX], edi
        popad
        return


.socket_error:

        cmp     eax, serrTimeout
        je      .free_buffer

        mov     [esp+4*regECX], eax

        stc
        jmp     .err


endp




proc SocketReadAllLines, .hSocket, .timeout
.pbuffer dd ?
.result  dd ?
.eol     dd ?
begin
        pushad

        stdcall SocketSetOption, [.hSocket], soRecvTimeout, [.timeout]

        stdcall CreateArray, 4
        mov     edx, eax

        stdcall GetMem, 1028
        mov     [.pbuffer], eax

        stdcall StrNew
        mov     [.result], eax

        xor     eax, eax
        mov     [.eol], eax

.read_loop:
        mov     edi, [.pbuffer]
        stdcall SocketReceive, [.hSocket], edi, 1024, 0
        jnc     .no_error

        cmp     eax, EAGAIN
        jne     .error_receive
        jmp     .finalize_ok

.no_error:
        OutputValue "Socket receive:", eax, 10, -1

        test    eax, eax
        jz      .finalize_ok

        mov     esi, edi
        lea     ebx, [edi+eax]  ; the end of the buffer.

        mov     eax, [.eol]
        test    eax, eax
        jnz     .eol_ok

.inner_loop:
        cmp     esi, ebx
        je      .end_of_buffer

        lodsb

        cmp     al, $0d
        je      .end_of_line
        cmp     al, $0a
        je      .end_of_line

        jmp     .inner_loop


.end_of_buffer:
        mov     eax, esi
        sub     eax, edi
        stdcall StrCatMem, [.result], edi, eax

        jmp     .read_loop


.end_of_line:
        push    eax

        lea     eax, [esi-1]
        sub     eax, edi
        stdcall StrCatMem, [.result], edi, eax

        stdcall AddArrayItems, edx, 1
        pushd   [.result]
        popd    [eax]

        stdcall StrNew
        mov     [.result], eax

        pop     eax
        cmp     esi, ebx
        jne     .eol_ok

        mov     [.eol], eax
        jmp     .read_loop


.eol_ok:
        xor     al, $0d xor $0a
        cmp     [esi], al
        jne     .line_ok

        inc     esi

.line_ok:
        xor     eax, eax
        mov     [.eol], eax
        mov     edi, esi        ; move the start of the string.
        jmp     .inner_loop

.finalize_ok:

        clc

.finalize:
        pushf

        stdcall StrLen, [.result]
        test    eax, eax
        jnz     .add_last

        stdcall StrDel, [.result]
        jmp     .finish

.add_last:
        stdcall AddArrayItems, edx, 1
        pushd   [.result]
        popd    [eax]

.finish:
        stdcall FreeMem, [.pbuffer]

        popf
        mov     [esp+4*regEAX], edx

        popad
        return


.error_receive:

        DebugMsg "Error receive"

        stdcall GetErrorString, eax
        mov     ebx, eax

        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel, ebx

        stc
        jmp     .finalize

endp








endmodule

Added freshlib/system/process.asm.































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Process management library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: Includes the proper OS dependent part of the library.
;_________________________________________________________________________________________
module "Process library"

; The current process procedures.

interface Terminate, .exit_code

interface TerminateAll, .exit_code

interface SetForcedTerminateHandler, .procHandler

interface procForcedTerminateHandler, .reason

interface GetCmdArguments


; Thread procedures.

interface ThreadCreate, .ptrFunction, .ptrArguments

interface FreeThreadID, .ThreadID


; Process procedures.

; Executes the command .hCommand, gets the STDIN from [.hStdIn] file handle,
; Outputs the STDOUT to [.hStdOut] file handle and STDERR to [.hStdErr] handle.

interface Exec2, .hCommand, .hStdIn, .hStdOut, .hStdErr

interface FreeProcessID, .ProcessID

interface WaitProcessExit, .ProcessID, .timeout


; DLL procedures.

; Loads a DLL in run-time.
; Returns a CF=0 and handle to the loaded library, or CF=1 and error code.
interface LibLoad, .hLibName

; Decrements the reference count of the library. If 0 removes the library from the memory.
interface LibRelease, .hLibrary

; Returns CF=0 and the address of the object from the library, or CF=1 and error code.
interface LibImport, .hLibrary, .hObjectName


; Mutex procedures.

interface MutexCreate, .ptrName, .ptrMutex

interface WaitForMutex, .ptrMutex, .timeout

interface MutexRelease, .ptrMutex

interface MutexDestroy, .ptrMutex




; Simple wrapper on Exec2;
; See Exec2

proc Exec, .hCommand
begin
        stdcall Exec2, [.hCommand], [STDIN], [STDOUT], [STDERR]
        return
endp




include '%TargetOS%/process.asm'


if used ThreadCreate
  options.Threads = 1
else
  options.Threads = 0
end if

endmodule

Added freshlib/system/serial.asm.























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Serial IO interface library.
;
;  Target OS: Any
;
;  Dependencies:
;
;  Notes: This file contains OS independent part of the library and also include
;         the respective OS dependent part.
;_________________________________________________________________________________________
module "Serial IO library"

cParityNo   = 0
cParityOdd  = 1
cParityEven = 2

cFlowOFF = 0
cFlowHW  = 1


include '%TargetOS%/serial.asm'

endmodule

Added freshlib/system/timers.asm.





















































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: Asynchronous timer library.
;
;  Target OS: Any
;
;  Dependencies: memory.asm
;
;  Notes: This is OS independent part. Includes OS dependent part files as well.
;_________________________________________________________________________________________
module "Timers library"

tmfDoNothing  = 0       ; when the timer expires no action should be performed. .Expired field of the timer will be incremented.
tmfCallProc   = 1       ; [.callback] contains pointer to procedure that to be executed once per timer expiration.

tmfSyncDestroy = $10    ; If this flag is set, the timer will be destroyed on the next timer expiration. In this case, the configured event is fired and then the timer is destroyed.
                        ; The flag is checked after the event returns, so the event handler can reset this flag and thus to prevent destruction.

tmfRunning     = $80    ; If this flag is set, the timer runs. If the event handler resets this flag, the timer will fire only once and will be suspended.



struct TTimer
; internal pointers of the linked list. The field .next MUST have offset = 0
  .next dd ?            ; don't touch this

; timers parameters.
  .interval dd ?        ; in ms
  .value    dd ?        ; current value in ms. When this value becomes higher than [.interval] an event is fired and the value becomes 0.
                        ; the value is incremented by the system dependent time - probably something like 1..100ms

  .flags    dd ?        ; set of tmfXXXX values.
  .Callback dd ?        ; callback - proc Timer, .ptrTimer; TWindow or 0
  .Expired  dd ?        ; count of the timer expirations.
  .tag      dd ?        ; user value associated with the timer.
ends


struct TDateTime
  .date    dd ?         ; [1..31] depending on month
  .month   dd ?         ; [1..12]
  .year    dd ?         ;
  .hour    dd ?         ; [0..23]
  .minute  dd ?         ; [0..59]
  .second  dd ?         ; [0..59]
  .day     dd ?         ; [0..6] == [monday..sanday]
ends



uglobal
  if used __ptrFirstTimer
    __ptrFirstTimer dd ?
  end if
endg











; Creates a timer and returns pointer to TTimer structure.
; the timer is created suspended. The user can set or reset tmfRunning in [.flags] in order to start or stop the timer.
; also, the user have to enter proper values in the remaining fields.
proc TimerCreate
begin
        push    ecx

        stdcall GetMem, sizeof.TTimer
        jc      .finish

        mov     ecx, [__ptrFirstTimer]
        mov     [eax+TTimer.next], ecx
        mov     [__ptrFirstTimer], eax
        clc

.finish:
        pop     ecx
        return
endp





proc TimerDestroy, .ptrTimer
begin
        push    eax ecx

        mov     eax, [__ptrFirstTimer]
        mov     ecx, __ptrFirstTimer

        test    eax, eax
        jz      .finish                 ; if the list is empty - returns no error.

.loop:
        cmp     eax, [.ptrTimer]
        je      .found

        mov     ecx, eax
        mov     eax, [eax+TTimer.next]
        test    eax, eax
        jnz     .loop

;not found
        pop     ecx eax
        stc
        return

.found:
        push    [eax+TTimer.next]
        pop     [ecx+TTimer.next]       ; if this is the first timer, ecx == __ptrFirstTimer

        stdcall FreeMem, eax

.finish:
        pop     ecx eax
        clc
        return
endp



SECONDS_PER_DAY = 24*60*60
YEAR_EPOCH_START     = 1970


proc TimeToDateTime, .pTime, .pDateTime
.days   dd ?
begin
        pushad

        mov     edi, [.pDateTime]
        mov     esi, [.pTime]

        mov     eax, [esi+4]
        cdq

        mov     ecx, SECONDS_PER_DAY

        idiv    ecx

        mov     eax, [esi]

        idiv    ecx

        test    edx, edx
        jns     @f
        add     edx, ecx        ;SECONDS_PER_DAY
        sub     eax, 1
@@:
        mov     [.days], eax  ; dword [esi] := time div SECONDS_PER_DAY

        mov     eax, edx
        mov     ecx, 60
        cdq                    ; the time should be positive here...

        idiv    ecx
        mov     [edi+TDateTime.second], edx

        cdq
        idiv    ecx
        mov     [edi+TDateTime.minute], edx
        mov     [edi+TDateTime.hour], eax

; date processing. I will assume it is 32bit
; some time in the future, it will overflow (around the 5000000 year), so it will needs a fix. ;)

        mov     edx, [.days]    ; days after YEAR_EPOCH_START
        xor     ebx, ebx        ; years after YEAR_EPOCH_START

.year_loop:
        test    edx, edx
        jns     .positive
; negative days

        dec     ebx
        lea     eax, [ebx+YEAR_EPOCH_START]
        stdcall DaysPerYear, eax
        add     edx, eax
        jmp     .year_loop

.positive:
        lea     eax, [ebx+YEAR_EPOCH_START]
        stdcall DaysPerYear, eax

        cmp     edx, eax
        jb      .finish_year

        sub     edx, eax
        inc     ebx
        jmp     .year_loop

.finish_year:
        add     ebx, YEAR_EPOCH_START
        mov     [edi+TDateTime.year], ebx

; edx contains the days since the current year. It is positive here.
        xor     ebx, ebx

.months_loop:
        stdcall DaysPerMonth, ebx, [edi+TDateTime.year]
        cmp     edx, eax
        jb      .month_ok

        sub     edx, eax
        inc     ebx
        jmp     .months_loop

.month_ok:
        inc     edx
        inc     ebx
        mov     [edi+TDateTime.date], edx
        mov     [edi+TDateTime.month], ebx

; day of the week.

        mov     eax, [.days]      ; days after YEAR_EPOCH_START
        add     eax, 3            ; it was Thursday on 1.1.1970
        cdq
        mov     ecx, 7
        idiv    ecx
        mov     [edi+TDateTime.day], edx

        popad
        return
endp


; returns the days in the given month or CF=1 on invalid month.
; month should be in [0..11] range.

proc DaysPerMonth, .month, .year
begin
        push    ecx

        mov     ecx, [.month]
        cmp     ecx, 11
        ja      .error

        movzx   ecx, byte [.month_list+ecx]
        cmp     ecx, 28
        jne     .finish

        stdcall DaysPerYear, [.year]
        cmp     eax, 365
        je      .finish

        inc     ecx

.finish:
        mov     eax, ecx
        clc
        pop     ecx
        return

.error:
        xor     eax, eax
        stc
        pop     ecx
        return

.month_list db 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
endp


proc DaysPerYear, .year
begin
        push    ebx ecx edx

        mov     eax, [.year]
        mov     ecx, 400
        cdq
        idiv    ecx

        test    edx, edx
        jz      .leap

        mov     eax, edx
        mov     ecx, 100
        cdq
        idiv    ecx
        test    edx, edx
        jz      .not_leap

        test    edx, $03
        jz      .leap

.not_leap:
        mov     eax, 365
        pop     edx ecx ebx
        return

.leap:
        mov     eax, 366
        pop     edx ecx ebx
        return
endp





proc DateTimeToTime, .pDateTime

.timeLo dd ?
.timeHi dd ?

begin
        push    ecx esi

        mov     esi, [.pDateTime]
        xor     eax, eax
        mov     [.timeLo], eax
        mov     [.timeHi], eax

; year loop:

        mov     ecx, 1970

        cmp     [esi+TDateTime.year], ecx
        jl      .year_loop_negative
        je      .process_months

; positive

.year_loop_plus:

        stdcall DaysPerYear, ecx

        add     [.timeLo], eax
        adc     [.timeHi], 0

        inc     ecx
        cmp     ecx, [esi+TDateTime.year]
        jne     .year_loop_plus
        jmp     .process_months


.year_loop_negative:
        dec     ecx

        stdcall DaysPerYear, ecx

        sub     [.timeLo], eax
        sbb     [.timeHi], 0

        cmp     ecx, [esi+TDateTime.year]
        jne     .year_loop_negative

.process_months:

        xor     ecx, ecx
        mov     edx, [esi+TDateTime.month]
        dec     edx

.month_loop:
        cmp     ecx, edx
        je      .process_date

        stdcall DaysPerMonth, ecx, [esi+TDateTime.year]

        add     [.timeLo], eax
        adc     [.timeHi], 0

        inc     ecx
        jmp     .month_loop

.process_date:

        mov     eax, [esi+TDateTime.date]
        dec     eax

        add     [.timeLo], eax
        adc     [.timeHi], 0

; process hour

        mov     ecx, SECONDS_PER_DAY
        mov     eax, [.timeLo]
        imul    ecx

        mov     [.timeLo], eax

        mov     eax, [.timeHi]
        imul    eax, ecx
        add     eax, edx

        mov     [.timeHi], eax          ; now the time is in seconds

        mov     ecx, 60
        mov     eax, [esi+TDateTime.hour]
        imul    eax, ecx
        add     eax, [esi+TDateTime.minute]
        imul    eax, ecx
        add     eax, [esi+TDateTime.second]

        add     [.timeLo], eax
        adc     [.timeHi], 0

        mov     eax, [.timeLo]
        mov     edx, [.timeHi]

        pop     esi ecx
        return
endp





include '%TargetOS%/timers.asm'


endmodule



Added freshlib/test_code/FileFunctionsTest.asm.

































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable GUI application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI

options.ShowSizes = 1
options.DebugMode = 1

include "%lib%/freshlib.asm"


start:
        InitializeAll


        DebugMsg "This is begin of the program."

        xor     esi, esi

        stdcall FileOpen, '/hd0/1/filetest/test.txt'
        jc      .error

        DebugMsg "File is open now."
        DebugMsg "So, write to the console..."

        mov     esi, eax

.loop:
        stdcall FileReadLine, esi
        jc      .close

        push    eax
        stdcall StrCharCat, eax, $0a0d
        stdcall FileWriteString, [STDOUT], eax
        stdcall StrDel ; from the stack.
        jmp     .loop

.close:
        stdcall FileClose, esi

.end:
        stdcall Sleep, 30000

        FinalizeAll
        stdcall TerminateAll, 0


.error:
        stdcall GetErrorString, eax
        push    eax eax
        stdcall FileWriteString, [STDERR], 'ERROR: '
        stdcall FileWriteString, [STDERR] ; from the stack
        stdcall FileWriteString, [STDERR], cCRLF
        stdcall FreeErrorString ; from the stack
        test    esi, esi
        jnz     .close
        jmp     .end

.error_readln:
        stdcall FileWriteString, [STDERR], < 'Error reading line!', $0d, $0a >
        jmp     .close


cCRLF text 13, 10

@AllImportEmbeded       ; or @AllImportSection
@AllDataEmbeded         ; or @AllDataSection

Added freshlib/test_code/FileFunctionsTest.fpr.

cannot compute difference between binary files

Added freshlib/test_code/FreshLibHello.asm.



































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable GUI application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI

options.ShowSizes = 1
options.DebugMode = 1

include "%lib%/freshlib.asm"

uglobal
  Timer1 dd ?
endg


start:
        InitializeAll


        stdcall StrDup, 'This is strlib test.'
        push    eax
        stdcall StrCat, eax, ' This is the second sentence.'
        stdcall StrCharCat, eax, $0a0d

        stdcall StrPtr, eax
        stdcall Output, eax
        stdcall StrDel ; from the stack



        stdcall TimerCreate
        mov     [Timer1], eax

        mov     [eax+TTimer.interval], 100
        mov     [eax+TTimer.Callback], procTimer1
        mov     [eax+TTimer.flags], tmfCallProc or tmfRunning


; then do some threads test

;        stdcall ThreadCreate, thread1, 'A'
;        stdcall ThreadCreate, thread2, 0
;        stdcall ThreadCreate, thread3, 0

        stdcall Sleep, 20000

        FinalizeAll
        stdcall TerminateAll, 0




proc thread1, .lparam
begin

.loop:
        mov     eax, sys_msg_board
        mov     ebx, 1
        mov     ecx, [.lparam]
        int     $40

        stdcall Sleep, 1000
        jmp     .loop
endp


proc thread2, .lparam
begin

.loop:
        mov     eax, sys_msg_board
        mov     ebx, 1
        mov     ecx, $0d
        int     $40

        mov     eax, sys_msg_board
        mov     ebx, 1
        mov     ecx, $0a
        int     $40

        stdcall Sleep, 5000
        jmp     .loop
endp



proc thread3, .lparam
begin
        mov     esi, 7

.loop:
        stdcall Sleep, 1333

        mov     eax, sys_msg_board
        mov     ebx, 1
        mov     ecx, 'Z'
        int     $40

        dec     esi
        jnz     .loop

        DebugMsg "Thread 3 ends."

        return
endp


proc procTimer1, .ptrTimer
begin
        stdcall Output, <'Timer 1 event.', 13, 10>
        return
endp


@AllImportEmbeded       ; or @AllImportSection
@AllDataEmbeded         ; or @AllDataSection

Added freshlib/test_code/FreshLibHello.fpr.

cannot compute difference between binary files

Added freshlib/test_code/FreshLibUse.fpr.

cannot compute difference between binary files

Added freshlib/test_code/FreshLibUse2.fpr.

cannot compute difference between binary files

Added freshlib/test_code/FreshLibUse3.fpr.

cannot compute difference between binary files

Added freshlib/test_code/I18nTest.asm.

























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
include "../freshlib.inc"

@BinaryType console

options.ShowSizes = 1

include "../freshlib.asm"


proc WriteAllLanguages
.string rd 2
begin
        pushad
        mov     [.string+4],0
        mov     esi, I18nLanguages

.loop:
        lodsd
        test    eax, eax
        jz      .finish

        mov     [.string], eax
        lea     eax, [.string]
        stdcall WriteLn, eax

        lea     esi, [esi+4]
        jmp     .loop

.finish:
        popad
        return
endp



proc WriteLn, .string
begin
        stdcall FileWriteString, [STDOUT], [.string]
        stdcall FileWriteString, [STDOUT], cCRLF
        return
endp



start:
        InitializeAll

        stdcall GetCmdArguments
        mov     esi, eax

        cmp     [esi+TArray.count], 2
        jb      .unknown

        stdcall StrPtr, [esi+TArray.array+4]    ; the second argument.
        mov     eax, [eax]

.load:
        stdcall SetLanguage, eax
        jnc     .print

.unknown:
        stdcall WriteLn, 'Unknown language. Use one of the following:'
        stdcall WriteAllLanguages
        jmp     .finish

.print:
        stdcall WriteLn, Istring1
        stdcall WriteLn, Istring2
        stdcall WriteLn, Istring3
        stdcall WriteLn, Istring4
        stdcall WriteLn, Istring5

.finish:
        stdcall ListFree, esi, StrDel

        FinalizeAll
        stdcall TerminateAll, 0

cCRLF text 13, 10


Istring1 itext <EN:'Hello there.', 13, 10, 'This is a test program that demonstrates how to make internazionalized programs with FreshLib.'>,    \
               <SP:'Hola.', 13, 10, 'Se trata de un programa de prueba que muestra cómo hacer que los programas internazionalized con FreshLib.'>,       \
               <DE:'Hallo.', 13, 10, 'Dies ist ein Test-Programm, das wie internazionalized Programme mit FreshLib machen demonstriert.'>,               \
               <BG:'Здравейте.', 13, 10, 'Това е теÑтова програма, коÑто демонÑтрира как да правим интернационализирани програми Ñ FreshLib.'>

Istring2 itext <EN:'This approach consists of three parts:'>,    \
               <DE:'Dieser Ansatz besteht aus drei Teilen:'>,     \
               <SP:'Este enfoque consiste en tres partes:'>,      \
               <BG:'Този подход Ñе ÑÑŠÑтои от 3 чаÑти:'>

Istring3 itext <EN:'1. Macro library "_itext.inc" that allows definitions of one string in multiply languages.'>,       \
               <DE:'1. Makro-Bibliothek "_itext.inc", die Definitionen von einer Zeichenfolge in mehrfach Sprachen ermöglicht.'>,      \
               <SP:'1. Macro biblioteca "_itext.inc" que permite la definición de una cadena en lenguas se multiplican.'>,            \
               <BG:'1. Макро библиотека "_itext.inc" коÑто позволÑва дефинициÑта на един Ñтринг на много езици.'>

Istring4 itext <EN:'2. Code library, that to change the i18n strings on the fly in runtime.'>,       \
               <DE:'2. Code-Bibliothek, die zu den i18n strings on the fly in Laufzeit andern.'>,      \
               <SP:'2. Biblioteca de código, que para cambiar las cuerdas i18n sobre la marcha en tiempo de ejecución.'>, \
               <BG:'2. Библиотека Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸, които заменÑÑ‚ Ñъдържанието на Ñтринговете в движение.'>


Istring5 itext <EN:'3. Translation tool (part of Fresh IDE) that allows to edit all such strings from one place.'>,       \
               <DE:'3. Translation-Tool (Teil von Fresh IDE), die alle diese Strings von einem Ort bearbeiten konnen.'>,      \
               <SP:'3. Herramienta de traducción (parte de Fresh IDE) que permite editar todas esas cadenas de un lugar.'>,  \
               <BG:'3. ИнÑтрумент за превод (чаÑÑ‚ от Fresh IDE) който позволÑва да Ñе редактират Ñтринговете за различни езици от едно мÑÑто.'>


Added freshlib/test_code/I18nTest.fpr.

cannot compute difference between binary files

Added freshlib/test_code/TestBBCode/angry.gif.

cannot compute difference between binary files

Added freshlib/test_code/TestBBCode/anon.svg.





>
>
1
2
<?xml version="1.0" encoding="UTF-8"?>
<svg width="36" height="36" version="1.1" viewBox="0 0 20.135672 20.135672" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><g id="Anonym__x2F__Guy_Fawkes" transform="scale(.0703)"><path d="m169 34.6c2.69 1.96 8.78 1.77 12.3-2.43 1.98-2.38 19.1-20.3 43.1-20.3 30.8 0 42.3 10.3 42.3 10.3-11-19.8-34.6-22.2-41.5-22.2-33.5 0-52.6 16-57.6 22.7-4.98 6.77-1.02 10.1 1.43 11.9zm94.9 54.9c-4.3 0-4.48 7.02-4.48 8.95-2e-3 12.6-7.11 24.9-13.4 31.3-18.2 18.6-47.9 2.26-47.9 2.26-5.02-2.03 0.445 3 0.445 3 2.86 2.96 11 12.1 27.1 14.1-0.743 0.786-20 20.9-20 20.9h-17.9l-17.9-26.8c-4.76 6.29-8.95 8.95-17.9 8.95-4.91 0-10.5-0.84-14.4-5.17-3.68-4.07-3.5-9.43-3.5-12.7-0.018-13.4 0-47.6 0-53.7v-15.4c0-7.83-8.79-15-8.79-15-10.4-7.16-17.8 8.97-17.8 8.97l-0.114 0.087c-8.58-3.12-17.7-5.02-27.2-5.02-11.7 0-25.4 1.28-35.6 5.8v-6.25c0-64.1 69.2-22.1 78.9-18.6 9.09 3.23 7.25-7.22 5.67-8.96-21.8-24.1-58.9-26.1-58.9-26.1-50.7 0-52.5 49.6-52.5 71.6v46.5c0 56.8 72.4 154 117 162-0.218 0.104 4.78 1.28 6.79 2.74 0.078 0.053 0.209 0 0.28 0.044 2.59 2.16 5.85 3.59 9.51 3.59 3.56 0 6.69-1.38 9.22-3.41 0 0 3.16-1.83 7.81-3.32 5.31-1.41 14.4-6.93 20.1-11.5 22.9-18.4 46.1-46.9 62.2-87.9 0 0 2.16-9.66-0.612-10.2-2.46-0.499-4.1 0.035-10.8 12-25.4 45.7-60.7 76.6-78.7 77.5v-35.8c11.4-1.76 31.7-10.8 45.5-23.3 8.95-8.14-7.11-6.28-9.68-5.24-11 4.42-13.2 10.6-44.7 10.6-30.1 0-48.1-12.7-53.7-17.9h35.8l17.9-17.9 17.9 17.9h35.8l32.6-38.6c27.3-2.42 30.2-34.1 30.2-37.4v-13.4c0-2.11-0.072-8.95-4.48-8.95zm-165 118c24 15.1 36.5 15 44.3 16.2v35.8c-42.4-10.8-44.8-41.5-44.3-52zm14.2-93.9c-6.68 29.5-40.1 29.5-40.1 29.5-19.8 0-28.3-10.2-28.3-37v-39.8c10.2 4.53 23.9 8.38 35.6 8.38 10.3 0 20.2-2.13 29.4-5.76 0.026 0 0.051 9e-3 0.051 9e-3 3.38 0 5.27 2.65 5.27 2.65s5.52 9.08-1.92 42zm63.8-49.2c11.9 6.39 25.1 10.3 39.2 10.3 14.1 0 27.4-3.92 39.3-10.3-11.9-6.39-25.1-10.3-39.3-10.3-14.1 0-27.3 3.92-39.2 10.3z" clip-rule="evenodd" fill="#3f3f3f" fill-rule="evenodd"/></g></svg>

Added freshlib/test_code/TestBBCode/bbcode.asm.































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType console, compact

options.DebugMode = 0
options.ShowSizes = 1

EMOTICONS_PATH equ './'
include "%lib%/freshlib.asm"

include "hash_function.asm"


FILE_READ_CHUNK = 4096

rb 237

start:
        InitializeAll

        or      ecx, -1
        shr     ecx, 3
.hot:
        dec     ecx
        jnz     .hot

        stdcall TextCreate, sizeof.TText
        mov     edx, eax

.read_loop:
        stdcall TextMoveGap, edx, -1
        stdcall TextSetGapSize, edx, FILE_READ_CHUNK
        mov     eax, [edx+TText.GapBegin]
        add     eax, edx

        stdcall FileRead, [STDIN], eax, FILE_READ_CHUNK
        jc      .translate

        test    eax, eax
        jz      .translate

        add     [edx+TText.GapBegin], eax
        jmp     .read_loop

.translate:

        stdcall GetFineTimestamp
        push    eax

        stdcall TranslateBBCode, edx, 0

        stdcall GetFineTimestamp
        pop     ecx
        sub     eax, ecx

        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        push    eax eax

        stdcall FileWriteString, [STDERR], 'TranslateBBCode time: '
        stdcall FileWriteString, [STDERR] ; from the stack
        stdcall StrDel ; from the stack
        stdcall FileWriteString, [STDERR], <txt ' us', 13, 10>


        stdcall TextCompact, edx

;        stdcall FileWrite, [STDOUT], cPrefix, cPrefix.length
;        stdcall FileWriteString, [STDOUT], edx

.finish:
        push    eax
        FinalizeAll
        stdcall TerminateAll ; from the stack

iglobal
  cPrefix file "prefix.tpl"
  .length = $ - cPrefix
          dd 0
endg


Added freshlib/test_code/TestBBCode/bbcode.fpr.

cannot compute difference between binary files

Added freshlib/test_code/TestBBCode/cry.gif.

cannot compute difference between binary files

Added freshlib/test_code/TestBBCode/hash_function.asm.











































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
iglobal
if used tpl_func
tpl_func:
          db 148,  24,  71,  46, 179,   0, 106, 157,  70,   1, 102, 126, 120, 134, 151, 183
          db  47, 103,  92, 201,  62, 156,  13,  10, 254, 218, 248,  28,  85, 185, 245, 112
          db 236, 237, 150,  37, 172,  63, 203, 198, 116, 196,  25, 107, 239,  44,  15, 175
          db  38, 161, 140,  98,  33,  79,  99, 133,   2,  59, 174, 115,  69, 188,  51,  36
          db 229, 143, 231,  84,  22,  78,  89, 166, 104, 145,  34, 225, 180,  12, 230, 205
          db  97,  39,  49, 190, 182, 202,  17, 219, 176, 170,  80,  74,  73, 194,  41,  26
          db 243, 142,  60, 131, 244, 249, 119,  61, 138,  16,  77,  54, 210,  23,  29, 147
          db 204, 110, 130,  93, 213, 223, 146, 216, 123, 247,  90, 124,  75, 135,  57, 128
          db 226,  50, 224, 127, 139, 152, 193, 101, 207, 122,   9,  58, 184, 250,  96,  67
          db 241, 109,  87, 168, 187, 167, 240, 171, 233, 155, 173, 215,  43, 227, 160,   5
          db 246, 129,  20,  14, 100, 209, 137, 169,  68,  40,  42, 165, 121, 113, 200,  95
          db 189, 251,  82,  72, 154, 235, 195, 136, 186,  55, 212,  35,  32, 253,  66, 132
          db 214,  88, 192,   4,  31,  65, 114, 211,  19,  83,  21,   3,   6, 177,  76, 255
          db 252, 199, 141,  56, 105,  11, 117, 163, 220,  27, 222, 234, 178,  52,  64, 221
          db  18, 232, 164,  53, 206, 153, 118,  48, 158, 162, 159, 191, 242, 125, 144,  94
          db 108,  91, 197, 111,  30,   7,  81, 181, 149,  45, 217, 208,  86, 238,   8, 228
end if
endg

Added freshlib/test_code/TestBBCode/lol.gif.

cannot compute difference between binary files

Added freshlib/test_code/TestBBCode/prefix.tpl.





























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>BBCode translator test page.</title>
  <style>
    body {font-family: sans-serif;}
    h1, h2, h3, h4, h5, h6 {margin: 1rem 0 1rem 0;}:
    h1 {font-size: 2em}
    h2 {font-size: 1.8em}
    h3 {font-size: 1.6em}
    h4 {font-size: 1.4em}
    h5 {font-size: 1.2em}
    h6 {font-size: 1em}
    code {display: inline; font-size: 14px;}
    code.block {display: block; white-space: pre; background: #e0ffff; color: #000080; border-left: 8px solid #008080; padding: 1em 1ch; margin: 1em 2ch; }
    code.asm {background: black; color:lime; }
    table {border: 1px solid red;}
    td, th {border: 1px solid red; padding: 1em 2ch; }
    blockquote { border: 2px solid green; padding: 1em 2ch; }
    header {background-color: yellow; padding: 0 2ch; }
    img {display: block; margin: 1em auto; text-align: center;}
    img.emoticon { display: inline; margin: 0 4px; }
    p {color: green;}
    a.back::after {content: "^";}
    span.underlined {text-decoration: underline;}
  </style>

<body>

Added freshlib/test_code/TestBBCode/readme.txt.









>
>
>
>
1
2
3
4
This project is the code of a parser for BBCode and the test cases.
Later this code should be merged in FreshLib and used in AsmBB forum engine
This way, two different markup languages will be allowed simultaneously.

Added freshlib/test_code/TestBBCode/rofl.gif.

cannot compute difference between binary files

Added freshlib/test_code/TestBBCode/sad.gif.

cannot compute difference between binary files

Added freshlib/test_code/TestBBCode/smile.gif.

cannot compute difference between binary files

Added freshlib/test_code/TestBBCode/test.bbcode.



















































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
[h1]Header 1[/h1]

[h2]Header 2[/h2]

[h3]Header 3[/h3]

[h4]Header 4[/h4]

[h5]Header 5[/h5]

[h6]Header 6[/h6]

<script>alert('Hi!')</script> << This ""MUST"" be escaped & the tags will be displayed.

[b]This paragraph should be formatted with <strong></strong> tags.[/b]

[i]This paragraph should be formatted with <em></em> tags.[/i]

[u]This paragraph should be formatted with <span class="underlined"></span> tags.[/u]

[s]This paragraph should be formatted with <del></del> tags.[/s]

[c]This paragraph should be formatted with <code></code> tags and monospaced font.[/c]

[url="><span style="color: red">]This is a XSS test. It should [b]NOT[/b] be colored in red![/url]

[url=https://board.asm32.info]This is a link <a href=""></a>[/url]

[url]https://board.asm32.info[/url]

A little bit strange, but valid:

[img=anon.svg[/img]

Standard image definition:

[img]anon.svg[/img]

An image with alt text:

[img=Anonymous user picture]anon.svg[/img]

Missing image alt text displayed and properly encoded:

[img=>>>>>>Anonymous user picture<<<<<<<]someimage.svg[/img]


[quote]Block quote
with paragraphs.

Another paragraph.
And it is multiline
paragraph actually.

[/quote]

[quote=Author name]<<Block quote with author name.>>[/quote]

This is multiline paragraph
and should be formatted as such.
All text should be grouped in one text block.

[quote=Anonymous]
<<Block quote with author name. and nested block quote with formatting>>
[quote=johnfound]
Here is my [b]super asm[/b] code!
[code=asm]
        stdcall LoadBinaryFile, "prefix.tpl"
        jc      .prefix_ok
        push    eax
        stdcall FileWrite, [STDOUT], eax, ecx
        pop     eax
.prefix_ok:
[/code]
[/quote]

Your [i]code[/i] [b]sucks![/b]

[/quote]




[code]
This is a block of code formatted with <code></code> tags.

        [b]This tag should not be formatted[/b], because in [code] tag.

        stdcall LoadBinaryFile, "prefix.tpl"
        jc      .prefix_ok
        push    eax
        stdcall FileWrite, [STDOUT], eax, ecx
        pop     eax
.prefix_ok:
[/code]

[code=asm]
This is a block of code formatted with <code class="asm"></code> tags.
        stdcall LoadBinaryFile, "prefix.tpl"
        jc      .prefix_ok
        push    eax
        stdcall FileWrite, [STDOUT], eax, ecx
        pop     eax
.prefix_ok:

[/code]

[size=48px]Text [color=#ff00ff]with[/color] different size.[/size]

[color=#ff00ff]Text with different color.[/color]

Unordered list 1:

[list]
[*] Item 1
[*] Item 2

[*] Item 3
[/list]

Unordered list 2:

[ul]
[*] Item 1
[*] Item 2
[*] Item 3
Item 3 as well!

Not an item?

[/ul]

Nested ordered lists:

[ol]
[*] Item 1
[*] Item 2 has subitems.
  [ol=a]
     [*] Item 1

     [*] Item 2
     [*] Item 3
     [*] Item 4
   [/ol]

[*] Item 3

[/ol]


[table]
   [tr]
      [td] 1 [/td]
      [td] 2 [/td]
      [td] 3 [/td]
   [/tr]
   [tr]
      [td] 4 [/td]
      [td] 5 [/td]
      [td] 6 [/td]
   [/tr]
   [tr]
      [td] 7 [/td]
      [td] 8 [/td]
      [td] 9 [/td]
   [/tr]
[/table]

[:)] [:D] [:lol:] [;)] [:P] [:(] [:`(] [>:(]


[email]email@email.com[/email]

[email=email@email.com]My email[/email]

[spoiler]
  Vader is Luke's father!
[/spoiler]


[b][i][u]Multi tags[/u][/i][/b]

[b][i][u]Wrong multi tags[/i][/b][/u]

[/asdf]<test for bad closing tag.>

[/<script>alert('hi!')</script>]XSS test for invalid closing tags!

[<script>alert('hi!')</script>=<script>alert('hi!')</script>]XSS test for invalid tags!


[b=some extra attribute ignore!]<<Not needed attributes should be simply deleted/ignored, but the text should be properly formatted>>[/b]

Not finished tag:

[[[[[[[[[b=<script>alert('Hi!')</script>


The following is a not finished tag at the end of the file:

[<script>alert('Hi!')</script>

Added freshlib/test_code/TestBBCode/tongue.gif.

cannot compute difference between binary files

Added freshlib/test_code/TestBBCode/wink.gif.

cannot compute difference between binary files

Added freshlib/test_code/TestConfig.asm.





























































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________


include "%lib%/freshlib.inc"

@BinaryType console

options.ShowSizes = 1
options.SkipZeroSizes = 1
options.DebugMode = 1

LinuxThreads equ native

include "%lib%/freshlib.asm"

cCRLF       text CRLF

;rb $07  ;  does not work
;rb $08  ; works!
rb $ff


struc AETHEME synproc,tfg,tbg,sfg,sbg,mbg,mfg,mw,gw,focusfg,focusbg,[syn]
{
   common
     .syntax_proc       dd synproc
     .text_color        dd tfg
     .text_background   dd tbg
     .sel_text          dd sfg
     .sel_background    dd sbg
     .margin_background dd mbg
     .margin_border     dd mfg
     .margin_width      dd mw
     .margin_gap        dd gw
     .focus_color       dd focusfg
     .focus_background  dd focusbg
     .syntax_colors:
   forward
     if ~ syn eq
       dd syn
     end if
   common
     .syntax_colors_count = ($ - .syntax_colors) / 4
 }


virtual at 0
  aeTheme AETHEME 0,0,0,0,0,0,1,0,0,0,0
  sizeof.aeTheme = $
end virtual

clDefaultText   = 0
clSymbol        = 1
clNumber        = 2
clString        = 3
clComment       = 4
clRegister      = 5
clInstruction   = 6
clDirective     = 7
clPreprocessor  = 8

iglobal
  cSynListboxColors:
          IndexedStrings                                          \
            aeTheme.text_color,      'Default text',              \
            aeTheme.text_background, 'Default background',        \
            aeTheme.sel_text,        'Selected text',             \
            aeTheme.sel_background,  'Selected background',       \
            aeTheme.focus_color,     'Focused line text',         \
            aeTheme.focus_background,'Focused line background',   \
            aeTheme.margin_background,'Left margin background',   \
            aeTheme.margin_border,    'Left margin border',       \
            aeTheme.syntax_colors+4*(clDirective-1),   'Assembler directive',     \
            aeTheme.syntax_colors+4*(clPreprocessor-1), 'Preprocessor directive', \
            aeTheme.syntax_colors+4*(clInstruction-1), 'Instruction',   \
            aeTheme.syntax_colors+4*(clRegister-1),    'Register',      \
            aeTheme.syntax_colors+4*(clSymbol-1),      'Symbol',        \
            aeTheme.syntax_colors+4*(clNumber-1),      'Number',        \
            aeTheme.syntax_colors+4*(clString-1),      'String',        \
            aeTheme.syntax_colors+4*(clComment-1),     'Comment'

defaultAETHEME  dd  $00000000, $00400000, $00FFFFFF, $00FFFFFF, $00800000, $00C0C0C0, $00808080, \
                    $00000014, $00000004, $00FFFFFF, $00008000, $00000000, $00A000A0, $000080FF, \
                    $00808080, $00808000, $00FF0000, $00800000, $00008000

endg

;MutexCreate

uglobal
  StartTime dd ?
endg

start:
        InitializeAll
; test append value

;        stdcall StrDup, 'test.conf2'
;        mov     ecx, eax

;        stdcall FileOpenAccess, 'test.conf2', faReadWrite or faOpenAlways
;        mov     ecx, eax

;        stdcall CfgSetStr, ecx, 'Section with space', 'one_key with space', 'And value with space'
;
;        stdcall CfgSetStr, ecx, 'dir1.dir2', 'unique1', 'TestString1'
;        stdcall CfgSetStr, ecx, 'dir1.dir2', 'unique2', 'TestString2'
;        stdcall CfgSetStr, ecx, 'dir1.dir2', 'unique3', 'TestString3'
;
;; read section test
;        stdcall CfgGetSection, ecx, 'dir1.dir2'
;        jnc     .read_ok
;
;        stdcall FileWriteString, [STDOUT], <'Error reading section!', 13, 10>
;        jmp     .end_test_section
;
;.read_ok:
;        mov     esi, eax
;        xor     ebx, ebx
;        cmp     [esi+TArray.count], ebx
;        je      .end_disp
;
;.disp_loop:
;        stdcall FileWriteString, [STDOUT], [esi+TArray.array+8*ebx+TCfgRecord.key]
;        stdcall FileWriteString, [STDOUT], ' key has value of: '
;        stdcall FileWriteString, [STDOUT], [esi+TArray.array+8*ebx+TCfgRecord.value]
;        stdcall FileWriteString, [STDOUT], cCRLF
;
;        inc     ebx
;        cmp     ebx, [esi+TArray.count]
;        jne     .disp_loop
;
;.end_disp:
;        stdcall DeleteArrayItems, esi, 3, 2
;        mov     esi, edx
;
;        stdcall CfgSaveSection, ecx, 'dir1.dir2', esi
;        stdcall CfgFreeSection, esi
;
;
;.end_test_section:
;
;        mov     edi, 20
;
;        stdcall GetTimestamp
;        mov     esi, eax
;
;.loop:
;
;        stdcall CfgGetStr, ecx, 'Section with space', 'one_key with space'
;        push    eax
;        stdcall FileWriteString, [STDOUT], eax
;        stdcall StrDel
;        stdcall FileWriteString, [STDOUT], cCRLF
;
;; Time per one loop:
;;
;; Linux: 100uS; Wine: 1ms;
;;        stdcall CfgGetInt, ecx, 'SomeDir', 'kokolino', 0
;;        inc     eax
;;        stdcall CfgSetInt, ecx, 'SomeDir', 'kokolino', eax
;
;; Wine: 1.5ms per loop;
;;        invoke  GetPrivateProfileIntA, 'dir1.dir2', 'kokolino', 0, './test.conf2'
;;        inc     eax
;;        stdcall NumToStr, eax, ntsDec or ntsUnsigned
;;        push    eax
;;        stdcall StrPtr, eax
;;        invoke  WritePrivateProfileStringA, 'dir1.dir2', 'kokolino', eax, './test.conf2'
;;        stdcall StrDel ; from the stack;
;
;        dec     edi
;        jnz     .loop

        stdcall GetTimestamp
        mov     [StartTime], eax

; timing of StrNew function.

        mov     ecx, 1000

.loop:
        stdcall StrNew
        stdcall StrDel, eax
        dec     ecx
        jnz     .loop


        stdcall GetTimestamp
        sub     eax, [StartTime]

        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        push    eax eax

        stdcall FileWriteString, [STDOUT], 'StrNew/StrDel time:'
        stdcall FileWriteString, [STDOUT] ; from the stack
        stdcall FileWriteString, [STDOUT], cNewLine
        stdcall StrDel ; from the stack




        stdcall FileOpenAccess, 'test.conf2', faReadOnly
        mov     ebx, eax

        stdcall GetMem, 1024
        mov     edi, eax

        mov     esi, cSynListboxColors

; debug
        stdcall GetTimestamp
        mov     [StartTime], eax
; /debug

.color_loop:
        lodsd   ; pointer to the key name.
        test    eax, eax
        jz      .end_colors

        mov     edx, eax
        lodsd   ; offset in the theme.
        mov     ecx, eax

        stdcall CfgGetInt, ebx, 'Theme.Colors', edx, 0
        jnc     .store_color

        stdcall FileWriteString, [STDOUT], <'Error reading.', 13, 10>
        mov     eax, [defaultAETHEME+ecx]

.store_color:
        mov     [edi+ecx], eax
        jmp     .color_loop

.end_colors:

        stdcall GetTimestamp
        sub     eax, [StartTime]

        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        push    eax eax

        stdcall FileWriteString, [STDOUT], 'Total time:'
        stdcall FileWriteString, [STDOUT] ; from the stack
        stdcall FileWriteString, [STDOUT], cNewLine
        stdcall StrDel ; from the stack

        stdcall FileReadLine, [STDIN]

        stdcall FileClose, ebx

.finish:
        FinalizeAll
        stdcall TerminateAll, 0

        stdcall ThreadCreate

@EndCode:

Added freshlib/test_code/TestConfig.fpr.

cannot compute difference between binary files

Added freshlib/test_code/TestData/TestHashTree.asm.

























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType console, compact

options.DebugMode = 1

include "%lib%/freshlib.asm"


include "%lib%/data/hashtree.asm"

start:
        InitializeAll

        mov     [ResizeIt], StrategyAgressive

        stdcall CreateArray, sizeof.THashTreeNode
        mov     edx, eax
        jmp     .free_tree

        mov     ecx, 10000000

.add_loop:
        stdcall StrDupMem, "Test string"
        mov     ebx, eax

        stdcall NumToStr, ecx, ntsDec or ntsUnsigned
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax

        stdcall SearchHashTree, edx, ebx, TRUE
        test    eax, eax
        jnz     @f

        stdcall StrDel, ebx
        OutputValue "String add error on ECX=", ecx, 10, -1
@@:
        loop    .add_loop

        OutputValue "Hash tree size: ", [edx+TArray.count], 10, -1

.free_tree:
        stdcall FreeHashTree, edx

        FinalizeAll
        stdcall TerminateAll, 0

Added freshlib/test_code/TestData/TestHashTree.fpr.

cannot compute difference between binary files

Added freshlib/test_code/TestGapBuffers.asm.





























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType console, compact

include "%lib%/freshlib.asm"

start:
        InitializeAll

        stdcall TextCreate, sizeof.TText
        mov     edx, eax

        stdcall TextAddString, edx, 0, "This is test"
        stdcall TextAddString, edx, 8, "simply a small, simple but reliable "

        stdcall TextMoveGap, edx, -100000
        stdcall TextMoveGap, edx, +100000

        stdcall TextMoveGap, edx, 4
        sub     [edx+TText.GapBegin], 4

        stdcall TextAddString, edx, 0, txt "Katakana"

        stdcall TextMoveGap, edx, -1
        sub     [edx+TText.GapBegin], 4

        stdcall TextAddString, edx, [edx+TText.GapBegin], "alphabet."

;        int3
        stdcall TextCompact, edx

        push    eax

        stdcall FileWrite, [STDERR], edx, eax
        stdcall FileWriteString, [STDERR], <txt "<<<<<<<", 13, 10, "Text length: ">

        pop     eax
        stdcall NumToStr, eax, ntsDec or ntsUnsigned

        stdcall FileWriteString, [STDERR], eax
        stdcall FileWriteString, [STDERR], <txt 13, 10>

        stdcall NumToStr, [edx+TText.GapEnd], ntsDec
        push    eax

        stdcall NumToStr, [edx+TText.GapBegin], ntsDec
        push    eax

        stdcall NumToStr, [edx+TText.Length], ntsDec
        push    eax

        stdcall FileWriteString, [STDERR], "TText length: "
        stdcall FileWriteString, [STDERR] ; from the stack

        stdcall FileWriteString, [STDERR], <txt 13, 10, "Gap begin: ">
        stdcall FileWriteString, [STDERR] ; from the stack

        stdcall FileWriteString, [STDERR], <txt 13, 10, "Gap end: ">
        stdcall FileWriteString, [STDERR] ; from the stack

        stdcall FileWriteString, [STDERR], <txt 13, 10>

        FinalizeAll
        stdcall TerminateAll, 0

Added freshlib/test_code/TestGapBuffers.fpr.

cannot compute difference between binary files

Added freshlib/test_code/TestKolibriOS.asm.





















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType console


include "%lib%/freshlib.asm"

options.DebugMode = 1

; include your includes here.

start:
        InitializeAll


        stdcall FileWriteString, [STDOUT], <'This is test for the console keyboard read.', 13, 10>

.read_loop:
        stdcall FileReadLine, [STDIN]
        jc      .read_loop

        test    eax, eax
        jz      .read_loop

        push    eax eax

        stdcall StrPtr, eax
        cmp     dword [eax], 'quit'
        je      .quit

        stdcall FileWriteString, [STDOUT] ; from the stack
        stdcall FileWriteString, [STDOUT], cCRLF
        stdcall StrDel ; from the stack
        jmp     .read_loop

cCRLF text 13, 10

.quit:
        pop     eax
        stdcall StrDel ; from the stack...

        stdcall FileWriteString, [STDOUT], <'Goodbye master!', 13, 10>
        FinalizeAll
        stdcall TerminateAll, 0

Added freshlib/test_code/TestKolibriOS.fpr.

cannot compute difference between binary files

Added freshlib/test_code/TestMarkdown/TestMarkdown.asm.













































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType console

include "%lib%/freshlib.asm"


uglobal
  Result TMarkdownResults
endg

iglobal
  cHeader file "../TestBBCode/prefix.tpl"
          dd 0
endg



start:
        InitializeAll

; place your code here.

        stdcall ReadTheInputSlow

        stdcall TranslateMarkdown2, edi, 0, TRUE, Result, 0

        stdcall FileWriteString, [STDOUT], cHeader
        stdcall FileWriteString, [STDOUT], [Result.hIndex]
        stdcall FileWriteString, [STDOUT], [Result.hContent]


        FinalizeAll
        stdcall TerminateAll, 0


uglobal
  SizeSource dd ?
endg



START_SIZE = 1024

proc ReadTheInputSlow
begin
        mov     [SizeSource], START_SIZE
        xor     esi, esi
        stdcall GetMem, [SizeSource]
        mov     edi, eax

.allocloop:
        stdcall ResizeMem, edi, [SizeSource]
        mov     edi, eax

.readloop:
        mov     ecx, [SizeSource]
        lea     eax, [edi+esi]
        sub     ecx, esi
        stdcall FileRead, [STDIN], eax, ecx
        jc      .endoffile
        test    eax, eax
        jz      .endoffile

        add     esi, eax

        mov     eax, [SizeSource]
        sub     eax, esi

        cmp     eax, START_SIZE
        jae     .readloop

        mov     eax, [SizeSource]
        lea     eax, [3*eax]
        shr     eax, 1

        add     eax, $fff
        and     eax, $fffff000
        mov     [SizeSource], eax
        jmp     .allocloop

.endoffile:
        xor     eax, eax
        mov     [edi+esi], eax  ; zero terminated...
        mov     [SizeSource], esi

        return
endp
















Added freshlib/test_code/TestMarkdown/TestMarkdown.bat.





>
>
1
2
TestMarkdown < test.markdown > TestMarkdown.html
pause

Added freshlib/test_code/TestMarkdown/TestMarkdown.fpr.

cannot compute difference between binary files

Added freshlib/test_code/TestMarkdown/test.markdown.























































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
# Test of the MiniMagAsm markup.

This is a test file for the MiniMagAsm kind of markdown parser.


## Header 1

Here are some images:

           [!img1][Some alt text]

           [!../TestBBCode/anon.svg]

;And here, some object:
;
;        [$128x48:test.swf][With inline address.]
;
;        [$Flash1][This is simple demonstration of Fresh IDE power.]
;
;        [$Flash2][Broken link processing]
;
;        [$test.swf][There should be no size, but the animation should appear.]
;
;        [$x480test.swf][Broken3]

## Code block without syntax specified

;begin
        stdcall LoadBinaryFile, "prefix.tpl"
        jc      .prefix_ok
        push    eax
        stdcall FileWrite, [STDOUT], eax, ecx
        pop     eax
.prefix_ok:

;end


Another paragraph.

;quote Anonymous
<<Block quote with author name. and nested block quote with formatting>>
;quote johnfound
Here is my *super asm* code! (Code block with language specified.)

;begin asm
        stdcall LoadBinaryFile, "prefix.tpl"
        jc      .prefix_ok
        push    eax
        stdcall FileWrite, [STDOUT], eax, ecx
        pop     eax
.prefix_ok:

;end

;end

Your /code/ *sucks!*

;end

Some more text to test the sub-chapters.

### Bold and italic.

Another chapter.

   *This is bold*

   /This is italic/

#### Level 4

;ulist
* List item 1

* List item 2

* List item 3
;end

;olist
* List item 1

* List item 2
;ulist
* Subitem 1

* Subitem 2

* Subitem 3
;end

* List item 3
;end

##### Level 5

Table formatting:

;table
1

2

3

;-------------------

4

5

6

;---------------------

7

8

9

;end

###### Level 6

  The maximal level of H tags.

;spoiler Spoiler
  Vader is Luke's father!
;end


### Underlined and Strikethrough.

  _This is underlined_

  -Deleted text-

### One more header.

 This is inline `code formatting`, displayed with monospaced font.


[$Flash1] 64x48:test.swf
[$Flash2] 64:test.swf
[!img1] ../TestBBCode/anon.svg







Added freshlib/test_code/TestMarkdown/test.swf.

cannot compute difference between binary files

Added freshlib/test_code/TestNetwork.asm.





































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
include "%lib%/freshlib.inc"


@BinaryType console

options.DebugMode = 1

include "%lib%/freshlib.asm"




start:
        InitializeAll



        stdcall TestSocketRead


.finish:
        FinalizeAll
        stdcall TerminateAll, 0










proc TestSocketRead
.address TSocketAddressIn
begin
        pushad

        stdcall StrNew
        mov     edi, eax

        stdcall SocketCreate, PF_INET, SOCK_STREAM, 0
        jc      .finish

        mov     ebx, eax



        mov     [.address.saFamily], AF_INET

        stdcall StrIP2Num, '127.0.0.1'
        bswap   eax

        mov     edx, 8080
        xchg    dl, dh

        mov     [.address.saPort], dx
        mov     [.address.saAddress], eax
        xor     eax, eax
        mov     dword [.address.saZero], eax
        mov     dword [.address.saZero+4], eax

        lea     eax, [.address]
        stdcall SocketConnect, ebx, eax
        jc      .end_lines


        stdcall SocketSendStr, ebx, <"GET /all.css HTTP/1.1", 13, 10>
        stdcall SocketSendStr, ebx, <"Host: board.asm32.info", 13, 10>
        stdcall SocketSendStr, ebx, <"Accept: text/html", 13, 10>
        stdcall SocketSendStr, ebx, <"Connection: keep-alive", 13, 10, 13, 10>

        xor     edx, edx

.read_loop:
        stdcall SocketReadLine, ebx, edx, 25000
        test    eax, eax
        jz      .end_lines

        push    eax
        stdcall FileWriteString, [STDOUT], eax
        stdcall FileWriteString, [STDOUT], <txt 13, 10>
        stdcall StrDel ; from the stack

        jmp     .read_loop


.end_lines:
        DebugMsg "Transmission ended!"

        stdcall SocketClose, ebx

.finish:
        popad
        return


endp

Added freshlib/test_code/TestNetwork.fpr.

cannot compute difference between binary files

Added freshlib/test_code/TestPThreads.asm.













































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType console

options.DebugMode = 0

include "%lib%/freshlib.asm"


; include your includes here.

iglobal
  Stop dd 0
endg

start:
        InitializeAll


        stdcall FileOpenAccess, "./TestPThreads.asm", faReadOnly
        mov     ebx, eax

        stdcall FileOpenAccess, "./out.txt", faWriteOnly or faCreateAlways
        mov     edi, eax

        stdcall Exec2, '/usr/bin/grep "stdcall Exec2"', ebx, edi, edi   ; Runs in WINE as well, but will not in the original Windows.
        jmp     .finish

        stdcall ThreadCreate, TestThread, 0

.wait:
        stdcall Sleep, 100
        cmp     [Stop], 0
        je      .wait


.finish:
        FinalizeAll
        stdcall TerminateAll, 0


proc TestThread, .arg
begin
        mov     esi, esp
        mov     ecx, 8000

.touch:
        sub     esp, 2048
        mov     eax, [esp]
        loop    .touch

        mov     [Stop], 1
        mov     esp, esi
        cret
endp

Added freshlib/test_code/TestPThreads.fpr.

cannot compute difference between binary files

Added freshlib/test_code/TestSplitURL.asm.





























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType console, compact

include "%lib%/freshlib.asm"


uglobal
  url TSplitURL
endg

start:
        InitializeAll

        stdcall FileReadLine, [STDIN]
        mov     esi, eax

        stdcall StrSplitURL, esi, url

        stdcall Print, "  Scheme", [url.scheme]
        stdcall Print, "    Host", [url.host]
        stdcall Print, "    Port", [url.port]
        stdcall Print, "    Path", [url.path]
        stdcall Print, "   Query", [url.query]
        stdcall Print, "Fragment", [url.fragment]

        stdcall StrDel, esi

        FinalizeAll
        stdcall TerminateAll, 0



proc Print, .name, .val
begin
        stdcall FileWriteString, [STDOUT], [.name]
        stdcall FileWriteString, [STDOUT], txt ' = '

        cmp     [.val], 0
        je      .skip

        stdcall FileWriteString, [STDOUT], [.val]

.skip:
        stdcall FileWriteString, [STDOUT], <txt 13, 10>

        return
endp

Added freshlib/test_code/TestSplitURL.fpr.

cannot compute difference between binary files

Added freshlib/test_code/TestStrLib.asm.



























































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________
include "%lib%/freshlib.inc"

@BinaryType console

options.DisableMMX = 0
options.DebugMode = 1

include "%lib%/freshlib.asm"

; include your includes here.

MIN_STR_LEN = 1
MAX_STR_LEN = 1500
COLUMNS     = 4

uglobal
  align 16
  TestString rb MAX_STR_LEN + 256

  align 16
  Result     rd COLUMNS * (MAX_STR_LEN+1)
endg


iglobal
             rb 6
  cLowerCase db "THIS is TEST case string. /\"
             dd 0
             db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff
  cLowerCase2 db "THISISTH"
              dd 0
             db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff


endg

TestPosHeap text  'saasoidhjaasdfsijoa;aijdfasi;ojaryiaejnkjfvnarfui;adnv'
TestPosNeedle text 'b'


proc TestNP, .pString
begin
        stdcall StrDupMem, [.pString]
        mov     ebx, eax

        stdcall FileWriteString, [STDOUT], txt 'From: '
        stdcall FileWriteString, [STDOUT], ebx
        stdcall FileWriteString, [STDOUT], <txt 13, 10>

;        stdcall StrNormalizePath2, ebx, "/\"

        stdcall FileWriteString, [STDOUT], txt '  To: '
        stdcall FileWriteString, [STDOUT], ebx
        stdcall FileWriteString, [STDOUT], <txt 13, 10, 13, 10>

        stdcall StrDel ; from the stack.
        return
endp


start:
        InitializeAll


; Test StrNormalizePath

        stdcall TestNP, "../../work./asm.work/test.asm"
        stdcall TestNP, "/usr/./lib/./../../work./asm.work/test.asm"
        stdcall TestNP, "/usr/./././lib/test.asm"
        stdcall TestNP, "/usr/../lib/test.asm"
        stdcall TestNP, "./usr/../lib/test.asm"
        stdcall TestNP, "usr/../lib/test.asm"
        stdcall TestNP, "usr/././lib/../test.asm"
        stdcall TestNP, "././lib/../test.asm"
        stdcall TestNP, "./././lib/test.asm"
        stdcall TestNP, "/usr/lib/../../../../work./asm.work/test.asm"
        stdcall TestNP, "/usr/lib\../..\../..\work./asm.work\test.asm"


        stdcall FileReadLine, [STDIN]
        jmp     .finish



; Test StrPos procedure


        stdcall StrDupMem, TestPosHeap
        mov     esi, eax

        stdcall StrDupMem, TestPosNeedle
        mov     ebx, eax

        stdcall StrPos, esi, txt 'sdaoluhfas;iodfhjas;oidjf;sioajf;oasijf;ioasj;iodjfs;aiojd;ioj;dofija;iojf;oiasjd;fioajs;iojfas;iojf;saoij_'

        OutputValue "Found StrPos: ", eax, 16, 8

        jmp     .finish







        xor     ebx, ebx

.all_loop:

        stdcall NumToStr, ebx, ntsHex or ntsUnsigned or ntsFixedWidth + 8
        stdcall StrCharCat, eax, "h"
        push    eax

        test    ebx, $000fffff
        jz      .progress

.back:
        stdcall StrToNumEx, eax

        cmp     eax, ebx
        jne     .fail

.next:
        stdcall StrDel ; from the stacks

        inc     ebx
        jnz     .all_loop
        jmp     .finish


.progress:
        stdcall FileWriteString, [STDOUT], eax
        stdcall FileWriteString, [STDOUT], <txt 13, 10>
        mov     eax, [esp]
        jmp     .back

.fail:
        stdcall FileWriteString, [STDOUT], "Test failed on: "
        mov     eax, [esp]
        stdcall FileWriteString, [STDOUT], eax
        stdcall FileWriteString, [STDOUT], <txt 13, 10>
        jmp     .next


        stdcall StrLCase, cLowerCase

        stdcall StrLCase, cLowerCase2

        jmp     .finish


; first create an array of strings with different sizes:

        mov     ecx, MAX_STR_LEN+16
        mov     al, 'A'
        mov     edi, TestString
        rep stosb

        mov     ecx, MAX_STR_LEN
        mov     edx, 0                ; missalignment

;        stdcall TestLoop, MIN_STR_LEN, MAX_STR_LEN, 0, 4,  StrLenMMX2_1
;        stdcall TestLoop, MIN_STR_LEN, MAX_STR_LEN, 1, 8,  StrLenMMX2
        stdcall TestLoop, MIN_STR_LEN, MAX_STR_LEN, 1, 12, StrLen

        stdcall FileWriteString, [STDOUT], <'Len: MMX2_1, MMX2, MMX', 13, 10>

        mov     ecx, MAX_STR_LEN

.output_loop:
        mov     edi, ecx
        imul    edi, 4*COLUMNS

        stdcall OutputVal, ecx, ': '

        stdcall OutputVal, [Result+edi+4],  ', '
        stdcall OutputVal, [Result+edi+8],  ', '
        stdcall OutputVal, [Result+edi+12], $0a0d ;', '
;        stdcall OutputVal, [Result+edi+12], ', '
;        stdcall OutputVal, [Result+edi+16], $0a0d

        dec     ecx
        cmp     ecx, MIN_STR_LEN
        jae     .output_loop

.finish:
        FinalizeAll
        stdcall TerminateAll, 0




proc TestLoop, .min, .max, .missalignment, .offsResult, .proc
begin
        pushad

        mov     ecx, [.max]
        add     ecx, 16
        mov     al, 'A'
        mov     edi, TestString
        rep stosb

        mov     ecx, [.max]
        mov     edx, 0                ; missalignment

.test_loop:
        mov     byte [TestString+ecx+edx], 0
        mov     dword [TestString+ecx+edx+1], 'XXXX'

        mov     edi, ecx
        imul    edi, 4*COLUMNS
        add     edi, [.offsResult]

        lea     eax, [TestString+edx]
        stdcall Benchmark2, eax, [.proc], ecx
        mov     [Result+edi], eax

        dec     ecx
        cmp     ecx, [.min]
        jae     .test_loop

        popad
        return
endp




proc CreateTestArray, .array, .strlen, .offset
.len dd ?
begin
        pushad

        mov     edx, [.array]

        mov     eax, [.offset]
        mov     [edx+TArray.lparam], eax

        mov     ecx, [.strlen]
        add     ecx, [.offset]
        add     ecx, 16
        mov     [.len], ecx

        mov     esi, [edx+TArray.count]
        lea     edx, [edx+TArray.array]

.loop:
        stdcall GetMem, [.len]
        mov     edi, eax
        add     edi, [.offset]

        mov     [edx], edi
        add     edx, 4

        mov     ecx, [.strlen]
        mov     al, 'a'
        rep stosb
        xor     al, al
        stosb

        dec     esi
        jnz     .loop

        popad
        return
endp


proc FreeTestArray, .ptrArray
begin
        pushad

        mov     esi, [.ptrArray]
        mov     ecx, [esi+TArray.count]
        mov     edx, [esi+TArray.lparam]
        lea     esi, [esi+TArray.array]

.loop:
        mov     eax, [esi]
        sub     eax, edx
        stdcall FreeMem, eax
        add     esi, 4
        loop    .loop

        popad
        return
endp



proc Benchmark, .test_array, .proc, .len
begin
        pushad

        mov     esi, [.test_array]
        mov     ecx, [esi+TArray.count]
        lea     esi, [esi+TArray.array]

        stdcall GetTimestamp
        mov     ebx, eax

.loop:
        stdcall [.proc], [esi]
        add     esi, 4
        dec     ecx
        jnz     .loop

        stdcall GetTimestamp
        sub     eax, ebx
        mov     [esp+4*regEAX], eax
        popad
        return
endp




proc Benchmark2, .String, .proc, .len
begin
        pushad

        mov     ecx, 100

        stdcall GetFineTimestamp
        mov     ebx, eax

.loop:
        stdcall [.proc], [.String]
        stdcall [.proc], [.String]
        stdcall [.proc], [.String]
        stdcall [.proc], [.String]
        stdcall [.proc], [.String]
        stdcall [.proc], [.String]
        stdcall [.proc], [.String]
        stdcall [.proc], [.String]
        stdcall [.proc], [.String]
        stdcall [.proc], [.String]
        dec     ecx
        jnz     .loop

        mov     edx, eax

        stdcall GetFineTimestamp
        sub     eax, ebx
        mov     [esp+4*regEAX], eax

        cmp     edx, [.len]
        je      .OK

;        stdcall FileWriteString, [STDOUT], <$0d, $0a, 'ERROR: Wrong length!', $0d, $0a>
        mov     dword [esp+4*regEAX], edx

.OK:
        popad
        return
endp









proc OutputVal, .time, .char
begin
        push    eax
        stdcall NumToStr, [.time], ntsSigned or ntsDec
        push    eax
        stdcall StrCharCat, eax, [.char]
        stdcall FileWriteString, [STDOUT], eax
        stdcall StrDel ; from the stack
        pop     eax
        return
endp


proc StrLenByte, .ptrString
begin
        mov     eax, [.ptrString]
        dec     eax

.loop:
        inc     eax
        cmp     byte [eax], 0
        jne     .loop

        sub     eax, [.ptrString]
        return
endp


proc StrLenByte2, .ptrString
begin
        push    edi ecx

        mov     edi, [.ptrString]
        or      ecx, -1
        xor     eax, eax

        repne scasb
        lea     eax, [edi-1]
        sub     eax, [.ptrString]

        pop     ecx edi
        return
endp








Added freshlib/test_code/TestStrLib.fpr.

cannot compute difference between binary files

Added freshlib/test_code/main.asm.













































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
include '%lib%/freshlib.inc'

@BinaryType console, compact

include '%lib%/freshlib.asm'



start:
        InitializeAll

uglobal
  ttime dq ?

  file_info TFileInfo
endg

.loop:
        stdcall GetTime

        stdcall NumToStr, eax, ntsDec or ntsSigned
        stdcall StrCharCat, eax, $0a

        push    eax eax

        stdcall StrLen, eax
        mov     ecx, eax

        stdcall StrPtr ; from the stack

        stdcall FileWrite, [STDOUT], eax, ecx
        stdcall StrDel ; from the stack

        stdcall FileOpen, filename
        mov     ebx, eax

        stdcall GetFileInfo, ebx, file_info
        jc      .show_error

        mov     eax, dword [file_info.timeModified]

.show_error:
        stdcall NumToStr, eax, ntsDec or ntsSigned
        stdcall StrCharCat, eax, $0a0a

        push    eax eax

        stdcall StrLen, eax
        mov     ecx, eax

        stdcall StrPtr ; from the stack

        stdcall FileWrite, [STDOUT], eax, ecx
        stdcall StrDel ; from the stack

        stdcall FileClose, ebx

        stdcall Sleep, 1000
        jmp     .loop

        FinalizeAll
        stdcall Terminate, 0

filename text 'eve.asm'

uglobal
  buffer rb 1000
endg


Added freshlib/test_code/main2.asm.



































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
include '%lib%/freshlib.inc'

@BinaryType console

include '%lib%/freshlib.asm'

__filetimeoffset = 116444736000000000
__filetimescale  = 10000000             ; 100ns -> 1s

start:

        InitializeAll

.main_loop:
        invoke  GetSystemTimeAsFileTime, time64
        mov     eax, dword [time64]
        mov     edx, dword [time64+4]

        sub     eax, __filetimeoffset and $ffffffff
        sbb     edx, __filetimeoffset shr 32

        mov     ecx, __filetimescale

        mov     ebx, eax
        mov     eax, edx
        cdq

        idiv    ecx
        xchg    eax, ebx        ; hi part is in ebx now
        idiv    ecx
        mov     edx, ebx

; here the unix time is in edx:eax


        stdcall NumToStr, eax, ntsDec or ntsSigned
        mov     ecx, eax

        stdcall StrLen, ecx
        push    eax
        stdcall StrPtr, ecx
        push    eax
        stdcall FileWrite, [STDOUT]

        stdcall FileWrite, [STDOUT], message, message.length
        stdcall FileRead,  [STDIN],  buffer, 100
        cmp     byte [buffer], 'q'
        jne     .main_loop

        FinalizeAll
        stdcall Terminate, 0

message text 13, 10

uglobal
  buffer rb 1000

  time64 dq ?
endg


@AllImportEmbeded


@AllDataEmbeded

Added freshlib/test_code/main3.asm.

























































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
172
include '%lib%/freshlib.inc'

@BinaryType console

include '%lib%/freshlib.asm'

options.AlignCode = 0

LOOP_COUNT = 1000000000

start:
        InitializeAll

        stdcall GetTimestamp
        mov     ebx, eax

        mov     ecx, LOOP_COUNT

.loop1:
        stdcall Dispatch1, $02345678, 1, 1
        dec     ecx
        jnz     .loop1

        stdcall GetTimestamp
        sub     eax, ebx

        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        mov     esi, eax

        stdcall FileWriteString, [STDOUT], cMessage1
        stdcall FileWriteString, [STDOUT], esi
        stdcall FileWriteString, [STDOUT], cCRLF

; cmp based dispatch

        stdcall GetTimestamp
        mov     ebx, eax

        mov     ecx, LOOP_COUNT

.loop2:
        stdcall Dispatch2,  $02345678, 1, 1
        dec     ecx
        jnz     .loop2

        stdcall GetTimestamp
        sub     eax, ebx

        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        mov     esi, eax

        stdcall FileWriteString, [STDOUT], cMessage2
        stdcall FileWriteString, [STDOUT], esi
        stdcall FileWriteString, [STDOUT], cCRLF

        stdcall FileReadLine, [STDIN]
        stdcall StrDel, eax

        FinalizeAll
        stdcall Terminate, 0


cMessage1 text 'dproc based dispatch time: '
cMessage2 text 'cmp based dispatch time: '
cCRLF     text 13, 10


dproc Dispatch1, .arg1, .arg2, .arg3
begin
        dispatch [.arg1]
        return

oncase $12345678
       return
       rb 256

oncase $12345679
       return
       rb 256

oncase $12345680
       return
       rb 256

oncase $12345681
       return
       rb 256

enddp


proc Dispatch2, .arg1, .arg2, .arg3
begin
        mov     eax, [.arg1]

        cmp     eax, $12345678
        je      .case1

        cmp     eax, $12345679
        je      .case2

        cmp     eax, $12345680
        je      .case3

        cmp     eax, $12345681
        je      .case4

        return

.case1:
        return
        rb 256

.case2:
        return
        rb 256

.case3:
        return
        rb 256

.case4:
        return
        rb 256

endp


proc Dispatch3, .arg1, .arg2, .arg3
begin
        cmp     [.arg1], $12345678
        je      .case1

        cmp     [.arg1], $12345679
        je      .case2

        cmp     [.arg1], $12345680
        je      .case3

        cmp     [.arg1], $12345681
        je      .case4

        return

.case1:
        return
        rb 256

.case2:
        return
        rb 256

.case3:
        return
        rb 256

.case4:
        return
        rb 256

endp

call Dispatch2
call Dispatch3

; Dispatch1.__info.codesize = $442
; Dispatch2.__info.codesize = $442
; Dispatch3.__info.codesize = $447


@AllImportEmbeded
@AllDataEmbeded

Added freshlib/test_code/md5_test/MD5_test.fpr.

cannot compute difference between binary files

Added freshlib/test_code/md5_test/md5_test.asm.











































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
include "%lib%/freshlib.inc"
@BinaryType console

options.DebugMode = 0

include "%lib%/freshlib.asm"

start:
        InitializeAll

        stdcall GetCmdArguments
        mov     esi, eax

        cmp     [esi+TArray.count], 2
        jne     .finish

        stdcall LoadBinaryFile, [esi+TArray.array+4]
        lea     edx, [ecx+1024]
        stdcall ResizeMem, eax, edx
        mov     edi, eax

        stdcall DataSHA1, edi, ecx
        push    eax

        stdcall StrSHA1, eax
        stdcall StrLCase, eax
        stdcall FreeMem; from the stack
        push    eax

        stdcall FileWriteString, [STDOUT], eax
        stdcall StrDel ; from the stack

        stdcall FileWriteString, [STDOUT], <txt 13, 10>

.finish:
        FinalizeAll
        stdcall TerminateAll, 0

Added freshlib/test_code/test.conf.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; This is the new hierarchical database format.
dir1:
  key1=$1234
  dir2:
    key1=4567
    key2='test param'
    dir3:
      koko='koko'
      dir4:
        key1='lolo'
        lolo='key1'
        dir5:
          dodo='dodo'
          momo='momo'
          key3="secret"
        dir4= This can be extracted only with GetConfigDir
      key1=1025 bottles on the wall
    key3=12

Added freshlib/test_code/test.txt.







>
>
>
1
2
3
This is test file line 1
This is the second line of this file.
FreshLib is really portable assembly language library.

Added freshlib/test_code/test_real_obj.asm.



































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
include "%lib%/freshlib.inc"

@BinaryType GUI

options.DebugMode = 0

include "%lib%/freshlib.asm"

uglobal
  MainWindow dd ?
endg

iglobal
  if used TestTemplate
    TestTemplate:
        ObjTemplate  tfParent or tfEnd, TForm, NULL, x, 200, y, 100, width, 480, height, 200, Visible, TRUE
          ObjTemplate tfChild, TButton, NULL, x, 10, y, 10, width, 64, height, 24, TextAlign, dtfAlignCenter  or dtfAlignMiddle, Caption, 'OK',     ModalResult, mrOK, Visible, TRUE
          ObjTemplate tfEnd, TButton, NULL, x, 84, y, 10, width, 64, height, 24, TextAlign, dtfAlignCenter  or dtfAlignMiddle, Caption, 'Cancel', ModalResult, mrCancel, Visible, TRUE
  end if
endg

;used.TButton = 1
;used.TForm = 1

start:
        InitializeAll
        create  [pApplication], TApplication

;        create  [MainWindow], TForm
;        mov     ebx, [MainWindow]

;        set     [pApplication], TApplication:MainWindow, MainWindow

;        set     ebx, TWindow:borderKind, borderFull
;        set     ebx, TWindow:width, 640
;        set     ebx, TWindow:height, 480
;        exec    ebx, TWindow:UpdateBounds
;
;        set     ebx, TWindow:Visible, TRUE
;
;        create  ebx, TButton
;
;        set     ebx, TButton:Parent, [MainWindow]
;
;        set     ebx, TButton:Caption, 'Button 1'
;        set     ebx, TButton:TextAlign, dtfAlignCenter or dtfAlignMiddle
;        set     ebx, TButton:width, 96
;        set     ebx, TButton:height, 48
;        set     ebx, TButton:x, 100
;        set     ebx, TButton:y, 50
;        exec    ebx, TButton:UpdateBounds
;        set     ebx, TButton:Visible, TRUE

        stdcall CreateFromTemplate, TestTemplate, 0
        mov     [MainWindow], ebx

        set     [pApplication], TApplication:MainWindow, MainWindow

;        stdcall ShowMessage, [MainWindow], iconInfo, 'Test dialog', 'Assembly programming is easy with the proper tools.', smbOK or smbYes or smbCancel

        stdcall Run

        FinalizeAll
        stdcall TerminateAll, 0

Added freshlib/test_code/test_real_obj.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/Sample_CP866.txt.









>
>
>
>
1
2
3
4
Œë ¢á¥å ¯ à §¨â®¢ ¤®áâ ­¥¬,
ˆ ïá­® ¯®©¬¥â ª ¦¤ë© £ ¤,
‘ª®«ì ¤®¡àë¬ ª®£¤ -â® ¡ë« ‘â «¨­,
¨ ¢ í⮬ «¨èì ¡ë« ¢¨­®¢ â!

Added freshlib/test_code0/TestAsmEdit.asm.

















































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI, compact

options.DebugMode = 1
  options.DebugMode.NoTimers = 0
  options.DebugMode.XSync = 0
  options.DebugMode.XErrors =0

  options.DebugMode.ComputeFPS = 0
  options.DebugMode.ShowFPS = 0

options.ShowSizes = 1
options.SkipZeroSizes = 1

ThemeGUI equ flat_gui
;ThemeGUI equ win_gui

include "%lib%/freshlib.asm"

include '%lib%/gui/TAsmEdit.asm'

iglobal

  TemplateMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain,         \
                     x = 100,                                   \
                     y = 50,                                    \
                     width = 640,                               \
                     height = 480,                              \
                     OnCreate = FormOnCreate,                   \
                     OnClose = MainFormOnClose,                 \
                     OnDestroy = FormOnDestroy,                 \
                     SplitGrid = SplitTest,                     \
                     Caption = 'Split grids test form'

          ObjTemplate tfChild, TTabBar, tabEditors,             \
                     Visible = TRUE,                            \
                     OnCreate = TabCreate,                      \
                     SplitCell = SplitTest.cellTabControl

          ObjTemplate  tfChild, TButton, btnZebra,              \
                     SplitCell = SplitTest.cellZebra,           \
                     Caption = "Z",                             \
                     Visible = TRUE, \
                     OnClick = ToggleZebra

          ObjTemplate  tfChild, TButton, btnScrollY,            \
                     SplitCell = SplitTest.cellMoreY,           \
                     Caption = "sY",                            \
                     Visible = TRUE, \
                     OnClick = ToggleScrollY

          ObjTemplate  tfChild, TButton, btnScrollX,            \
                     SplitCell = SplitTest.cellMoreX,           \
                     Caption = "sX",                            \
                     Visible = TRUE, \
                     OnClick = ToggleScrollX

          ObjTemplate  tfChild, TButton, btnUndo,               \
                     SplitCell = SplitTest.cellUndo,            \
                     Caption = "U",                             \
                     Visible = TRUE, \
                     OnClick = DoUndo

          ObjTemplate  tfChild, TButton, btnRedo,               \
                     SplitCell = SplitTest.cellRedo,            \
                     Caption = "R",                             \
                     Visible = TRUE, \
                     OnClick = DoRedo

          ObjTemplate  tfChild, TButton, btnCaretWrap,          \
                     SplitCell = SplitTest.cellCaretWrap,       \
                     Caption = "CWr",                           \
                     Visible = TRUE, \
                     OnClick = ToggleCaretWrap

          ObjTemplate  tfChild, TButton, btnConsoleCaret,       \
                     SplitCell = SplitTest.cellConsoleCaret,    \
                     Caption = "Con",                            \
                     Visible = TRUE,                            \
                     OnClick = ToggleConsoleCaret

          ObjTemplate  tfChild or tfEnd, TAsmEdit, AsmEdit,     \
                     x = 10, y = 40, width = 200, height = 200, \
                     SplitCell = SplitTest.cellAsmEdit,         \
                     Visible = TRUE


;utf8_long file "unicode_test.txt"
;utf8_long file "test_utf8.asm"

utf8_long dd 0 ;db  " "
          dd   0



if ThemeGUI eq win_gui
  getfile imgArrowRight, '_test_images/right2.png'
end if


if ThemeGUI eq flat_gui
  getfile imgArrowRight, '_test_images/right.png'
end if


endg

SplitStart SplitTest
  Split stVert or stJustGap, 2, 24, 16, 48
    Split stHoriz or stJustGap, 2, 32, 32, 32
      Cell cellZebra
      Split stHoriz or stJustGap, 2, 32, 32, 32
        Cell cellMoreY
        Split stHoriz or stJustGap, 2, 32, 32, 32
          Cell cellMoreX
          Split stHoriz or stJustGap, 2, 32, 32, 32
            Cell cellUndo
            Split stHoriz or stJustGap, 2, 32, 0, 100
              Cell cellRedo
              Split stHoriz or stJustGap, 2, 64, 0, 100
                Cell cellCaretWrap
                  Split stHoriz or stJustGap, 2, 64, 0, 100
                    Cell cellConsoleCaret
                    Cell cellEmpty
    Split stVert or stJustGap or stAutosize, 0, .cellTabControl, 16, 48
      Cell cellTabControl
      Split stVert or stJustGap or stOriginBR, 0, 16, 16, 16
        Cell cellAsmEdit
        Cell cellStatusBar

SplitEnd




uglobal
  iconArrowRight dd ?
endg


;rb 123


start:
        InitializeAll

        create  [pApplication], TApplication

        stdcall GUI.Init
        stdcall ASM.Init

        stdcall CreateFromTemplate, TemplateMainForm, 0

        set     [pApplication], TApplication:MainWindow, frmMain

        set     [frmMain], TWindow:Visible, TRUE                ; must be set visible after creation, because it loads
                                                                ; needed images in OnCreate event handler.

        stdcall Run

        FinalizeAll
        stdcall TerminateAll, 0



; Sample event handlers. They work with other objects on the form.

proc FormOnCreate as TObject.OnCreate
begin
        DebugMsg "Form OnCreate event handler."

        stdcall CreateImagePNG, imgArrowRight, imgArrowRight.size
        mov     [iconArrowRight], eax

        return
endp


proc TabCreate as TObject.OnCreate
begin
        exec    [tabEditors], TTabBar:InsertTab, -1, "Tab editor 1", 0, 0
        exec    [tabEditors], TTabBar:InsertTab, -1, "Tab editor 2", 0, 0
        exec    [tabEditors], TTabBar:InsertTab, -1, "Tab editor 3", 0, 0
        exec    [tabEditors], TTabBar:InsertTab, -1, "Tab editor 4", 0, 0

        exec    [tabEditors], TTabBar:InsertTab, -1, "Noname1.asm", 0, 0
        exec    [tabEditors], TTabBar:InsertTab, -1, "Noname2.asm", 0, 0
        exec    [tabEditors], TTabBar:InsertTab, -1, "Noname3.asm", 0, 0
        exec    [tabEditors], TTabBar:InsertTab, -1, "Noname4.asm", 0, 0
        exec    [tabEditors], TTabBar:InsertTab, -1, "Noname5.asm", 0, 0
        exec    [tabEditors], TTabBar:InsertTab, -1, "Noname6.asm", 0, 0

        return
endp

proc EditOnCreate as TObject.OnCreate
begin

        return
endp


proc FormOnDestroy as TObject.OnDestroy
begin
        DebugMsg "MainForm destroy event handler."
        return
endp



proc MainFormOnClose as TForm.OnClose
begin
        DebugMsg "Main form OnClose event handler"
        clc
        return
endp





proc OpenFileClick as TButton.OnClick
begin
        pushad





        popad
        return

.error:
        stdcall GetErrorString, eax
        push    eax

        stdcall ShowMessage, [frmMain], smiError, "File error", eax, smbOK

        stdcall FreeErrorString ; from the stack
        popad
        return
endp




proc ToggleZebra as TButton.OnClick
begin
        get     eax, [AsmEdit], TAsmEdit:Options
        xor     eax, aeoStripedBackground
        set     [AsmEdit], TAsmEdit:Options, eax
        return
endp


proc ToggleScrollX as TButton.OnClick
begin
        get     eax, [AsmEdit], TAsmEdit:Options
        xor     eax, aeoScrollXMore
        set     [AsmEdit], TAsmEdit:Options, eax
        return
endp


proc ToggleScrollY as TButton.OnClick
begin
        get     eax, [AsmEdit], TAsmEdit:Options
        xor     eax, aeoScrollYMore
        set     [AsmEdit], TAsmEdit:Options, eax
        return
endp


proc ToggleCaretWrap as TButton.OnClick
begin
        get     eax, [AsmEdit], TAsmEdit:Options
        xor     eax, aeoNavXCaretWrap
        set     [AsmEdit], TAsmEdit:Options, eax
        return
endp


proc ToggleConsoleCaret as TButton.OnClick
begin
        get     eax, [AsmEdit], TAsmEdit:Options
        xor     eax, aeoConsoleCaret
        set     [AsmEdit], TAsmEdit:Options, eax
        return
endp


proc DoUndo as TButton.OnClick
begin
        pushad

        exec    [AsmEdit], TAsmEdit:Undo

        popad
        return
endp


proc DoRedo as TButton.OnClick
begin
        pushad

        exec    [AsmEdit], TAsmEdit:Redo

        popad
        return
endp

Added freshlib/test_code0/TestAsmEdit.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestDeflate.asm.











































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType console, compact

options.DebugMode = 0
options.ShowSizes = 1
options.SkipZeroSizes = 1

;ThemeGUI equ win_gui


include "%lib%/freshlib.asm"


struc htlen [length] {
common
  local ..start
  label ..start byte
forward
   local flag
   flag equ FALSE
   match count =* len, length \{
     rept count \\{
       db len
     \\}
     flag equ TRUE
   \}

   match =FALSE, flag \{
     db length
   \}

common
  .count = $ - ..start
}


iglobal
; The example from RFC-1951
;  TestArray htlen 5*3, 2, 2*4

;  TestArray htlen 5*2, 3, 2*4  ; invalid array!
;  TestArray htlen 5*3, 3, 2*4  ; invalid array!
;   TestArray htlen 27*0, 1*1, 2*2;, 2*2

  Sum dd ?

endg

;rb 273

start:
        InitializeAll

        stdcall LoadBinaryFile, 'test_inflate.gz'
        jc      .error
        mov     esi, eax

        mov     edx, [esi+ecx-4]        ; the original size

        stdcall GetMem, edx
        mov     edi, eax

;        stdcall GetTimestamp
;        mov     ebx, eax

        sub     ecx, 10+8       ; the header and the end of the gzip archive.
        lea     eax, [esi+10]

        mov     ebx, 0


.test_loop:

        xor     byte [eax+ebx], $ff

        stdcall Inflate, edi, edx, eax, ecx
        jnc     .false_positive

        xor     byte [eax+ebx], $ff
        inc     ebx
        cmp     ebx, edx
        jb      .test_loop

        stdcall FileWriteString, [STDOUT], 'All tests ended with error, as expected.'
        jmp     .finish

.false_positive:
        stdcall FileWriteString, [STDOUT], 'A test ended WITHOUT error!'
        jmp     .finish

;        stdcall GetTimestamp
;        sub     eax, ebx

;        stdcall NumToStr, eax, ntsDec or ntsUnsigned
;        push    eax

;        stdcall FileWriteString, [STDOUT], 'Inflate time:'
;        stdcall FileWriteString, [STDOUT] ; from the stack

;        stdcall SaveBinaryFile, 'test_inflate.txt', edi, edx

;        jmp     .finish

.error:
        stdcall FileWrite, [STDOUT], cError, cError.length


.finish:
        stdcall FreeMem, edi
        stdcall FreeMem, esi

        FinalizeAll
        stdcall TerminateAll, 0


cError text "Error processing test file.", 13, 10
cCRLF  text 13, 10

Added freshlib/test_code0/TestDeflate.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestEdit.asm.































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI, compact

options.DebugMode = 0
  options.DebugMode.NoTimers = 0
  options.DebugMode.XSync = 0
  options.DebugMode.XErrors =0

options.ShowSizes = 1
options.SkipZeroSizes = 0

ThemeGUI equ win_gui

include "%lib%/freshlib.asm"


iglobal
TemplateMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain, \
                     x = 200,          \
                     y = 200,          \
                     width = 320,    \
                     height = 240,   \
                     OnCreate = FormOnCreate,    \
                     OnClose = MainFormOnClose,  \
                     OnDestroy = FormOnDestroy,  \
                     Caption = 'TEdit test'

          ObjTemplate tfChild, TEdit, editTest4,                 \
                     x = 10, y = 110, width = 300, height = 24, \
                     Text = "This is test TEdit control.",       \
                     Visible = TRUE

          ObjTemplate tfChild, TEdit, editTest3,                 \
                     x = 10, y = 140, width = 300, height = 24, \
                     Text = "Now you can select with the mouse and with the keyboard.",       \
                     Visible = TRUE

          ObjTemplate tfChild, TEdit, editTest2,                 \
                     x = 10, y = 170, width = 300, height = 24, \
                     Text = "Also to copy and paste.",       \
                     Visible = TRUE

          ObjTemplate tfChild, TEdit, editTest1,                 \
                     x = 10, y = 200, width = 300, height = 24, \
                     Text = "But in the Linux you can only paste, because I didn't wrote the code for copy. :P",       \
                     Visible = TRUE

          ObjTemplate tfChild, TButton, btnSkinWin,                     \
                     x = 60, y = 10, width = 84, height = 24,           \
                     Caption = "Win skin",                              \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle,      \
                     Visible = TRUE,                                    \
                     OnClick = SetWinSkin

          ObjTemplate tfChild or tfEnd, TButton, btnSkinFlat,                    \
                     x = 146, y = 10, width = 84, height = 24,          \
                     Caption = "Flat skin",                             \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle,      \
                     Visible = TRUE,                                    \
                     OnClick = SetFlatSkin


  getfile cfgFlat, "theme_flat.cfg"
          dd 0

  getfile cfgWin,  "theme_win.cfg"
          dd 0

endg



;rb 423


start:
        InitializeAll


        create  [pApplication], TApplication

        call    GUI.Init

        stdcall CreateFromTemplate, TemplateMainForm, 0
        set     [pApplication], TApplication:MainWindow, frmMain

        set     [frmMain], TWindow:Visible, TRUE                ; must be set visible after creation, because it loads
                                                                ; needed images in OnCreate event handler.

        stdcall Run

        FinalizeAll
        stdcall TerminateAll, 0



; Sample event handlers. They work with other objects on the form.

proc FormOnCreate as TObject.OnCreate
begin
        DebugMsg "Form OnCreate event handler."

        return
endp



proc FormOnDestroy as TObject.OnDestroy
begin
        DebugMsg "MainForm destroy event handler."
        return
endp



proc MainFormOnClose as TForm.OnClose
begin
        DebugMsg "Main form OnClose event handler"
        clc
        return
endp



proc SetWinSkin as TButton.OnClick
begin
        stdcall StringToNamedArray, GUI.meta, cfgWin
        exec    [frmMain], TWindow:ForceRefresh
        return
endp


proc SetFlatSkin as TButton.OnClick
begin
        stdcall StringToNamedArray, GUI.meta, cfgFlat
        exec    [frmMain], TWindow:ForceRefresh
        return
endp





Added freshlib/test_code0/TestEdit.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestGraphics.asm.



































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable GUI application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

options.DebugMode = 0
options.DebugMode.NoTimers = 0
options.DebugMode.ComputeFPS = 1
options.DebugMode.ShowFPS = 0
options.DebugMode.DisableSHM = 0

@BinaryType GUI, compact

include "%lib%/freshlib.asm"

iglobal
  tplMainForm:
        ObjTemplate  tfEnd, TForm, frmMain,     \
                     OnSelfPaint = DemoPaint,   \
                     border = borderFull,       \
                     Caption = 'FreshLib graphics and GUI library test .'

 pngBackground file "_test_images/background.png"
  .size = $ - pngBackground

endg


uglobal
  imgBackground dd ?
  Font          dd ?
  FontHeight    dd ?
  FontAsc       dd ?
  PlateW        dd ?
  PlateH        dd ?
endg


start:
        InitializeAll

        create  [pApplication], TApplication

        call    GUI.Init

        stdcall FontCreate, txt "Liberation Mono", 20, fwBold, ffMonospaced
        mov     [Font], eax

        stdcall GetFontMetrics, eax
        mov     [FontHeight], eax
        mov     [FontAsc], ebx

        lea     eax, [eax*3+16]
        mov     [PlateH], eax

        stdcall GetTextBounds, "FPS: XXXX", -1, [Font]
        add     eax, 16
        mov     [PlateW], eax

        stdcall CreateFromTemplate, tplMainForm, 0
        set     [pApplication], TApplication:MainWindow, frmMain

        stdcall CreateImagePNG, pngBackground, pngBackground.size
        mov     [imgBackground], eax

        set     [frmMain], TForm:width, [eax+TImage.width]
        set     [frmMain], TForm:height, [eax+TImage.height]
        set     [frmMain], TForm:Visible, TRUE

        set     [pApplication], TApplication:OnIdle, Scroll

        set     [frmMain], TForm:OnKeyPressed, OnKeyPress
        mov     eax, [frmMain]
        mov     [eax+TForm.__want_focus], TRUE

        stdcall Run

        FinalizeAll
        stdcall TerminateAll, 0



proc DemoPaint as TWindow.OnSelfPaint
begin
        stdcall BlendImageTileWrap, [.pDstImage], [.xDst], [.yDst], [.width], [.height], [imgBackground]
        return
endp


proc OnKeyPress as TWindow.OnKeyPressed
begin
        cmp     [.utf8], 's'
        je      .scroll

        cmp     [.utf8], 'a'
        je      .scrollback

        cmp     [.utf8], 'r'
        je      .refresh

        cmp     [.utf8], 't'
        je      .refresh2

        return

.scroll:
        stdcall Scroll, 0
        return

.scrollback:

        mov     eax, [incX]
        mov     ecx, [incY]
        neg     eax
        neg     ecx

        mov     [incX], eax
        mov     [incY], ecx
        mov     [dist], 1000
        jmp     .scroll

.refresh:
        exec    [.self], TWindow:RectChanged2, 0
        return

.refresh2:
        mov     eax, [.self]
        stdcall _RefreshWindowRect, [eax+TWindow.handle], 0, 0, [eax+TWindow._width], [eax+TWindow._height]
        return


endp



proc Scroll, .param
.rect1 dd ?
begin
        pushad

        mov     esi, [frmMain]
        test    esi, esi
        jz      .finish

        cmp     [esi+TWindow._rect_list], 0
        jne     .finish

        mov     ebx, [esi+TWindow._screen]
        test    ebx, ebx
        jz      .finish

        stdcall LockImg, ebx
        jc      .finish

        mov     edi, [imgBackground]
        stdcall LockImg, edi

; First restore the text rectangle

        stdcall BlendImageTileWrap, ebx, 32, 32, [PlateW], [PlateH], edi

; scroll the destination image.

        mov     edx, [ebx+TImage.wrapW]
        mov     ecx, [ebx+TImage.orgX]
        add     ecx, [incX]
        jns     @f
        add     ecx, edx
@@:
        cmp     ecx, edx
        jb      @f
        sub     ecx, edx
@@:
        mov     [ebx+TImage.orgX], ecx

        mov     edx, [ebx+TImage.wrapH]
        mov     ecx, [ebx+TImage.orgY]
        add     ecx, [incY]
        jns     @f
        add     ecx, edx
@@:
        cmp     ecx, edx
        jb      @f
        sub     ecx, edx
@@:
        mov     [ebx+TImage.orgY], ecx

; scroll the source image

        mov     edx, [edi+TImage.wrapW]
        mov     ecx, [edi+TImage.orgX]
        add     ecx, [incX]
        jns     @f
        add     ecx, edx
@@:
        cmp     ecx, edx
        jb      @f
        sub     ecx, edx
@@:
        mov     [edi+TImage.orgX], ecx

        mov     edx, [edi+TImage.wrapH]
        mov     ecx, [edi+TImage.orgY]
        add     ecx, [incY]
        jns     @f
        add     ecx, edx
@@:
        cmp     ecx, edx
        jb      @f
        sub     ecx, edx
@@:
        mov     [edi+TImage.orgY], ecx

; then paint the fixed rectangle again

        stdcall BlendSolidRect, ebx, 32, 32, [PlateW], [PlateH], $a0ffffff

        pushad

        mov     edi, 40
        add     edi, [FontAsc]
        mov     esi, ebx

        stdcall StrDupMem, "FPS: "
        mov     edx, eax

        cmp     [fps], 0
        je      @f

        stdcall NumToStr, [fps], ntsDec or ntsUnsigned
        stdcall StrCat, edx, eax
        stdcall StrDel, eax

@@:
        push    edx
        stdcall StrPtr, edx
        stdcall DrawString, esi, eax, [eax+string.len], 40, edi, [Font], $ff000000
        stdcall StrDel ; from the stack

        add     edi, [FontHeight]

        stdcall StrDupMem, 'Min: '
        mov     edx, eax

        cmp     [fps], 0
        je      @f

        stdcall NumToStr, [fpsmin], ntsDec or ntsUnsigned
        stdcall StrCat, edx, eax
        stdcall StrDel, eax

@@:
        push    edx
        stdcall StrPtr, edx
        stdcall DrawString, esi, eax, [eax+string.len], 40, edi, [Font], $ff000000
        stdcall StrDel ; from the stack

        add     edi, [FontHeight]

        stdcall StrDupMem, 'Max: '
        mov     edx, eax

        cmp     [fps], 0
        je      @f

        stdcall NumToStr, [fpsmax], ntsDec or ntsUnsigned
        stdcall StrCat, edx, eax
        stdcall StrDel, eax

@@:
        push    edx
        stdcall StrPtr, edx
        stdcall DrawString, esi, eax, [eax+string.len], 40, edi, [Font], $ff000000
        stdcall StrDel ; from the stack


        popad

        mov     eax, [incX]
        mov     ecx, [ebx+TImage.wrapW]
        sub     ecx, eax
        test    eax, eax
        jz      .x_ok
        jns     .ix_ok
        neg     eax
        xor     ecx, ecx
.ix_ok:
        stdcall BlendImageTileWrap, ebx, ecx, 0, eax, [ebx+TImage.wrapH], edi

.x_ok:
        mov     eax, [incY]
        mov     ecx, [ebx+TImage.wrapH]
        sub     ecx, eax
        test    eax, eax
        jz      .y_ok
        jns     .iy_ok
        neg     eax
        xor     ecx, ecx
.iy_ok:
        stdcall  BlendImageTileWrap, ebx, 0, ecx, [ebx+TImage.wrapW], eax, edi
.y_ok:

        stdcall UnlockImg, edi
        stdcall UnlockImg, ebx

        stdcall _RefreshWindowRect, [esi+TWindow.handle], 0, 0,[esi+TWindow._width], [esi+TWindow._height]
        stdcall Randomize

.finish:
        popad
        return
endp





uglobal
  incX dd ?
  incY dd ?
  dist dd ?
endg

rndMaxStep = 1
rndStepMul = 0

rndMaxCnt  = 100
rndMinCnt  = 5

proc Randomize
.random dd ?
begin
        dec     [dist]
        jns     .finish

        stdcall GetRandomBytes, 12
        mov     esi, eax

        mov     ecx, rndMaxCnt - rndMinCnt

        mov     eax, [esi]
        xor     edx, edx
        div     ecx

        add     edx, rndMinCnt
        mov     [dist], edx

        mov     ecx, 2*rndMaxStep+1

        mov     eax, [esi+4]
        xor     edx, edx
        div     ecx
        sub     edx, rndMaxStep
        shl     edx, rndStepMul
        mov     [incX], edx

        mov     eax, [esi+8]
        xor     edx, edx
        div     ecx
        sub     edx, rndMaxStep
        shl     edx, rndStepMul
        mov     [incY], edx

        or      edx, [incX]
        jnz     @f
        mov     [dist], edx
@@:
        stdcall FreeMem, esi

.finish:
;        mov     [incX], 1
;        mov     [incY], 1
        return
endp

Added freshlib/test_code0/TestGraphics.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestGrid.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestGrids.asm.









































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;   Description: TGrid test application.
;
;   Target OS: All/Linux/Win32 - depending on current test needs.
;
;   Dependencies:
;
;   Notes: The main test program calls "PrepareDemo" procedure.
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI, compact

options.DebugMode = 1
  options.DebugMode.NoTimers = 0
  options.DebugMode.XSync = 0
  options.DebugMode.XErrors = 0
  options.DebugMode.ComputeFPS = 0
  options.DebugMode.ShowFPS = 0

options.ShowSizes = 1
options.SkipZeroSizes = 1

ThemeGUI equ flat_gui
;ThemeGUI equ win_gui

include "%lib%/freshlib.asm"


object TTestGrid, TGrid
  method .DrawCell, .canvas, .ptrRect, .Col, .Row
  method .Create, .Parent
endobj

iglobal

tplMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain, \
                     width = 640, height = 496,         \
                     SplitGrid = mainSplit

          ObjTemplate  tfChild or tfEnd, TTestGrid, TestGrid,                                           \
                     Flags = gfResizeColumns or gfResizeRows or gfGridLines or gfGridLinesFixed or gfRowFocus,        \
                     Visible = TRUE, SplitCell = mainSplit.cellGrid

  SplitStart mainSplit
    Cell cellGrid
  SplitEnd

endg


start:
        InitializeAll

        create  [pApplication], TApplication
        call    GUI.Init

        stdcall CreateFromTemplate, tplMainForm, 0

        set     [pApplication], TApplication:MainWindow, frmMain
        set     [frmMain], TWindow:Visible, TRUE                ; must be set visible after creation, because it loads
                                                                ; needed images in OnCreate event handler.

        stdcall Run

        FinalizeAll
        stdcall TerminateAll, 0





; Sample event handlers. They work with other objects on the form.

proc FormOnDestroy, .self
begin
        DebugMsg "MainForm destroy event handler."
        return
endp




proc TestGetString, .Col, .Row
begin
        stdcall NumToStr, [.Row], ntsDec or ntsUnsigned
        mov     ecx, eax

        stdcall NumToStr, [.Col], ntsDec or ntsUnsigned
        stdcall StrCharCat, eax, ', '
        stdcall StrCat, eax, ecx

        stdcall StrDel, ecx
        return
endp




;-----------------------------------------------------------------------
; TGrid example event handlers.
;
;-----------------------------------------------------------------------

method TTestGrid.Create ; .Parent
begin
        inherited [.Parent]
        pushad

        mov     esi, [.self]
        exec    esi, TTestGrid:SetCounts, 16, 160

        mov     [esi+TTestGrid.FixedCols], 1
        mov     [esi+TTestGrid.FixedRows], 1

        popad
        return
endp


;-----------------------------------------------------------------------
; Simple example handler for TGrid.OnDrawItem
; It uses TGrid.OnGetString to obtain a string handler.
; After printing, the string will be deleted.
;-----------------------------------------------------------------------
method TTestGrid.DrawCell       ;, .canvas, .ptrRect, .Col, .Row
.color dd ?
.offsy dd ?
.x     dd ?
.y     dd ?
.sel   RECT
begin
        pushad

        mov     esi, [.self]

        mov     ecx, cellFixed
        mov     ebx, [.Col]
        mov     edx, [.Row]
        cmp     ebx, [esi+TListView.FixedCols]
        jl      .status_ok
        cmp     edx, [esi+TListView.FixedRows]
        jl      .status_ok

        cmp     ebx, [esi+TListView._focused.x]
        jne     .is_selected
        cmp     edx, [esi+TListView._focused.y]
        jne     .is_selected

        mov     ecx, cellFocused
        jmp     .status_ok

.is_selected:
        lea     ecx, [esi+TListView.selection]
        lea     eax, [.sel]
        stdcall RectCopy, eax, ecx
        stdcall RectSort, eax
        inc     [eax+RECT.right]
        inc     [eax+RECT.bottom]

        mov     ecx, cellSelected
        stdcall PointInRect, eax, ebx, edx
        jc      .status_ok

        mov     ecx, cellRegular

.status_ok:
        mov     [.color], ecx

        stdcall TestGetString, ebx, edx
        test    eax, eax
        jz      .drawok

        mov     ebx, eax

        mov     edi, [.ptrRect]

        mov     eax, [edi+RECT.right]
        mov     ecx, [edi+RECT.bottom]
        sub     eax, [edi+RECT.left]
        sub     ecx, [edi+RECT.top]

        mov     edx, [.color]
        stdcall DrawTextBox, [.canvas], ebx, [edi+RECT.left], [edi+RECT.top], eax, ecx, 0, dtfAlignCenter or dtfAlignMiddle or dtfSingleLine, [GUI.DefaultFont], [GUI.clGridCellTxt+4*edx]
        stdcall StrDel, ebx

.drawok:
        popad
        return
endp

Added freshlib/test_code0/TestGround.asm.





















































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;   Description: Very simple test application for FreshLib.
;                The content may change arbitrary.
;
;   Target OS: All/Linux/Win32 - depending on current test needs.
;
;   Dependencies:
;
;   Notes: The main test program calls "PrepareDemo" procedure.
;_________________________________________________________________________________________

__TestGround:

; Global data...
iglobal

__TestData:

frmMainForm:
  if used frmMainForm
        ObjTemplate  tfParent or tfEnd, TForm, frmMain, \
                     x = 300,        \
                     y = 250,        \
                     width = 360,    \
                     height = 240,   \
                     Visible = FALSE,\
                     Caption = 'FreshLib minimal application test.'

           ObjTemplate tfChild or tfEnd, TButton, btnOpenModal,                      \
                       x = 50,                                                       \
                       y = 50,                                                       \
                       width = 120,                                                  \
                       height = 75,                                                  \
                       Visible = TRUE,                                               \
                       TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfWordWrap , \
                       Caption = 'Click to check your assembly skills.',             \
                       OnClick = OpenModalForm
  end if

__TestDataSize = $ - __TestData
endg


; Prepares the demo

proc PrepareDemo
begin

        stdcall CreateFromTemplate, frmMainForm, 0
        set     [pApplication], TApplication:MainWindow, frmMain
        set     [frmMain], TWindow:Visible, TRUE

        return
endp



proc OpenModalForm, .self, .button
begin
        push    ebx

        stdcall ShowMessage, [frmMain], smiQuestion,                                    \
                'One question test:',                                                   \
                'Are you agree, that FlatAssembler is the best assembler world-wide?',  \
                smbYes or smbNo or smbMaybe ; or smbAbort or smbRetry or smbIgnore or smbYes or smbNo or smbHelp

        mov     esi, .msgYes
        mov     ecx, smiInformation
        cmp     eax, mrYes
        je      .finish

        mov     esi, .msgNo
        mov     ecx, smiError
        cmp     eax, mrNo
        je      .finish

        mov     esi, .msgMaybe
        mov     ecx, smiQuestion
        cmp     eax, mrMaybe
        je      .finish

        mov     esi, .msgRefuse
        mov     ecx, smiWarning
.finish:
        stdcall ShowMessage, [frmMain], ecx, 'Test results', esi, smbOK

        pop     ebx
        return

OpenModalForm.msgYes    text "You really understand the spirit of the assembly!", 13, "Congratulations!"
OpenModalForm.msgNo     text "So, go write some C# and don't mess with assembly. It is not for you."
OpenModalForm.msgMaybe  text "You should forget about your doubts and reject these HLL temptations, or your soul will be lost forever! Go, write some assembly and feel the power!"
OpenModalForm.msgRefuse text "It is wrong to avoid to answer, only because you are not sure..."

endp






DispSize 'Test ground dummy code:', ($-__TestGround)+__TestDataSize

Added freshlib/test_code0/TestGroundComplex.asm.





























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;   Description: Complex test application for FreshLib the content may change arbitrary.
;
;   Target OS: All/Linux/Win32 - depending on current test needs.
;
;   Dependencies:
;
;   Notes: The main test program calls "PrepareDemo" procedure.
;_________________________________________________________________________________________

__TestGround:

iglobal

__TestData:
; This is a form template.
; It will be created by the visual editor.
; This template engine can contains any count of properties for every
; component of the template. Also it can contains non visual components
; such as action lists, image lists, etc.

TemplateMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain, \
                     x = 100,        \
                     y = 50,         \
                     width = 656,    \
                     height = 496,   \
                     Visible = FALSE, \
                     OnDestroy = FormOnDestroy,  \
                     Caption = 'Fresh portable Win32/Linux application test.'

          ObjTemplate  tfChild, TButton, btnChild1,          \
                     x = 48,         \
                     y = 48,         \
                     width = 100,     \
                     height = 60,    \
                     TextAlign = dtfAlignLeft or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Button1',        \
                     Visible = TRUE, \
                     OnClick = Button1Click

          ObjTemplate  tfChild, TButton, btnChild3,          \
                     x = 48,         \
                     y = 112,         \
                     width = 100,     \
                     height = 48,    \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfWordWrap,\
                     Caption = 'Stop/Start timer1',        \
                     Visible = TRUE, \
                     OnClick = Button3Click

          ObjTemplate  tfChild, TButton, btnChild4,          \
                     x = 48,         \
                     y = 162,         \
                     width = 100,     \
                     height = 48,    \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfWordWrap,\
                     Caption = 'Stop/Start timer2',        \
                     Visible = TRUE, \
                     OnClick = Button4Click

          ObjTemplate  tfChild, TEdit, editChild1,          \
                     x = 48,         \
                     y = 8,         \
                     width = 294,     \
                     height = 24,    \
                     Visible = TRUE, \
                     Text = utf8_string

         ObjTemplate tfChild, TProgress, Progress1,      \
                     x = 48, y = 262,                      \
                     width = 314, height = 21,              \
                     Max = 1000, Pos = 350,                  \
                     Visible = TRUE

         ObjTemplate  tfChild or tfEnd, TButton, btnChild2,          \
                     x = 160,         \
                     y = 48,         \
                     width = 202,     \
                     height = 202,        \
                     TextAlign = dtfAlignJustify or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = utf8_long,       \
                     Visible = TRUE,  \
                     OnClick = Button2Click


include "UTF8_examples.asm"


  cPngIcon file '_test_images/ball.png'
  sizeof.cPngIcon = $ - cPngIcon


; example of menu structure - it is typical File menu.
; It should be created with CreateFromTemplate procedure.
; If can be child of some form as well and then it should
; appears as a main menu in the form.

;menuFile:
;    ObjTemplate tfParent or tfEnd, Menu, .PopupMenu1,        \
;                  caption, 'File'
;      ObjTemplate tfChild, MenuItem, .menuItemNew,  \
;                  kind, mikCommand,             \
;                  pAction, FileActions.actFileNew
;      ObjTemplate tfChild, MenuItem, .menuItemOpen,  \
;                  kind, mikCommand,      \
;                  pAction, FileActions.actFileOpen
;      ObjTemplate tfChild or tfParent, Menu, .menuReopen, \
;                  caption, 'Reopen'
;
;            ObjTemplate tfChild, MenuItem, .menuItemCleanup,     \
;                        kind, mikCommand,                         \
;                        pAction, FileActions.actReopenMenuCleanup
;
;            ObjTemplate tfChild or tfEnd, MenuItem, .menuSep1,   \
;                        kind, mikSeparator
;      ObjTemplate tfChild, MenuItem, .menuSep2,      \
;                  kind, mikSeparator
;      ObjTemplate tfChild, MenuItem, .menuItemSave,  \
;                  kind, mikCommand,                 \
;                  pAction, FileActions.actSave
;      ObjTemplate tfChild, MenuItem, .menuItemSaveAs,  \
;                  kind, mikCommand,                 \
;                  pAction, FileActions.actSaveAs
;      ObjTemplate tfChild, MenuItem, .menuItemSaveAll,  \
;                  kind, mikCommand,                 \
;                  pAction, FileActions.actSaveAll
;      ObjTemplate tfChild, MenuItem, .separator2,      \
;                  kind, mikSeparator
;      ObjTemplate tfChild or tfEnd, MenuItem, .menuItemExit,  \
;                  kind, mikCommand,                 \
;                  pAction, FileActions.actExit
;
; just for test

;ActionList FileActions,                                                     \
;  .actFileNew, '&New', 'Creates new file', 0, <Ctrl, 'N'>, NONE, NONE,      \
;  .actFileOpen, '&Open', 'Open file from disk', 0, <Ctrl, 'O'>, NONE, NONE, \
;  .actReopenMenuCleanup, 'Cleanup list', 'Cleans the reopen list.', 0, NONE, NONE, NONE, \
;  .actSave, '&Save', 'Save current file', 0, <Ctrl, 'S'>, NONE, NONE, \
;  .actSaveAs, 'Sa&ve as', 'Save current file with new name.', 0, <Ctrl+Alt, 'S'>, NONE, NONE, \
;  .actSaveAll, 'Save &All', 'Save all changed files.', 0, <Ctrl+Shift, 'S'>, NONE, NONE, \
;  .actExit, 'E&xit', 'Exit application', 0, <Alt, 'X'>, NONE, NONE


__TestDataSize = $ - __TestData

endg





; Sample event handlers. They work with other objects on the form.

proc FormOnDestroy, .self
begin
        pushad

        DebugMsg "MainForm destroy event handler."

;        mov     eax, [test_timer1]
;        or      [eax+TTimer.flags], tmfSyncDestroy

;        mov     eax, [test_timer2]
;        or      [eax+TTimer.flags], tmfSyncDestroy

        stdcall TimerDestroy, [test_timer1]
        stdcall TimerDestroy, [test_timer2]

        DebugMsg "MainForm end of destroy."

        mov     [frmMain], 0

        popad
        return
endp


proc Button4Click as TButton.OnClick
begin
        pushad

        mov     ecx, [test_timer2]
        xor     [ecx+TTimer.flags], tmfRunning

        set     [Progress1], TProgress:Pos, 0

        DebugMsg 'Button4 clicked'
        popad
        return
endp



proc Button3Click as TButton.OnClick
begin
        pushad

        mov     eax, [test_timer1]
        xor     [eax+TTimer.flags], tmfRunning

        DebugMsg 'Button3 clicked'
        popad
        return

        mov     ebx, [frmMain]

        get     eax, ebx, TWindow:x
        push    eax
        get     eax, ebx, TWindow:y
        push    eax

        set     [.self], TWindow:Caption, [_dual_caption+4*eax]

iglobal
  _dual_caption dd _cCaption1, _cCaption2

  _cCaption1 text 'Remove the title'
  _cCaption2 text 'Restore the title'
endg

; The old coordinates must be restored, because the window manager moves the window
; when restoring the title bar.

        pop     eax
        set     ebx, TWindow:y, eax

        pop     eax
        set     ebx, TWindow:y, eax

        popad
        return
endp




proc Button1Click as TButton.OnClick
begin
        pushad

        DebugMsg 'Button1 clicked'

        get     eax, [btnChild2], TButton:TextAlign
        mov     ecx, eax
        and     ecx, not $03
        inc     eax
        and     eax, 3
        or      eax, ecx

        set     [btnChild2], TButton:TextAlign, eax

 ;       stdcall Get, [btnChild1], TButton.Caption
 ;       stdcall Set, [editChild1], TEdit.Text, eax
 ;       stdcall StrDel, eax

iglobal
  cImgFile file '_test_images/allpng/png7.png'
  sizeof.cImgFile = $ - cImgFile
endg

        stdcall CreateImagePNG, cImgFile, sizeof.cImgFile
        mov     esi, eax

        OutputValue "Image created: ", esi, 16, 8
        OutputValue "width: ", [esi+TImage.width], 10, -1
        OutputValue "height: ", [esi+TImage.height], 10, -1

        get     edi, [frmMain], TWindow:Canvas

        stdcall BlendImage, edi, 394, 0, esi, 0, 0, [esi+TImage.width], [esi+TImage.height]

        exec    [frmMain], TWindow:RectChangedXY, 394, 0, 64, 64, FALSE

        stdcall DestroyImage, esi

        DebugMsg "Image has been destroyed."

        popad
        return
endp



proc Button2Click as TButton.OnClick
begin
       DebugMsg 'Button2 clicked'

        get     eax, [btnChild1], TButton:IconPosition
        inc     eax
        and     eax, 3
        set     [btnChild1], TButton:IconPosition, eax

        mov     eax, [_text_align_for_icon+4*eax]
        set     [btnChild1], TButton:TextAlign, eax

iglobal
  _text_align_for_icon dd dtfAlignLeft or dtfAlignMiddle
                       dd dtfAlignRight or dtfAlignMiddle
                       dd dtfAlignCenter or dtfAlignTop
                       dd dtfAlignCenter or dtfAlignBottom
endg
        get     eax, [btnChild2], TButton:Caption
        set     [editChild1], TEdit:Text, eax
        stdcall StrDel, eax

        return
endp



uglobal
  test_timer1 dd ?
  test_timer2 dd ?
endg



proc procTestTimer1, .ptrTimer
begin
        get     eax, [btnChild1], TButton:IconPosition
        and     eax, 3
        mov     eax, [__align4+4*eax]
        set     [btnChild1], TButton:IconPosition, eax

        mov     eax, [_text_align_for_icon+4*eax]
        set     [btnChild1], TButton:TextAlign, eax
        return
endp

iglobal
  __align4 dd AlignTop, AlignBottom, AlignRight, AlignLeft

endg

uglobal
  Flag dd ?
  .Y dd ?
  .X dd ?
  .incX dd ?
  .incY dd ?
endg




proc procTestTimer2, .ptrTimer
.width dd ?
.height dd ?
.win    dd ?
begin

        cmp     [Progress1], 0
        je      .progress_ok

        get     ecx, [Progress1], TProgress:Pos
        get     eax, [Progress1], TProgress:Max

        add     ecx, 10
        cmp     ecx, eax
        jle     @f
        xor     ecx, ecx
@@:
        set     [Progress1], TProgress:Pos, ecx

; animation

.progress_ok:

        mov     eax, [frmMain]
        mov     [.win], eax


        get     ebx, [.win], TWindow:Canvas
        test    ebx, ebx
        jz      .exit

        stdcall LockImg, ebx
        jc      .error

        get     eax, [.win], TWindow:width
        sub     eax, 24
        mov     [.width], eax

        get     eax, [.win], TWindow:height
        sub     eax, 24
        mov     [.height], eax

        stdcall DrawSolidRect, ebx, [Flag.X], [Flag.Y], 24, 24, [GUI.clDialogBk]       ;$ffff0000  ;c0c0c0

        exec    [.win], TWindow:RectChangedXY, [Flag.X], [Flag.Y], 24, 24, FALSE

        mov     eax, [Flag.X]
        add     eax, [Flag.incX]
        js      .backx
        cmp     eax, [.width]
        jg      .backx

        mov     [Flag.X], eax
        jmp     .xok

.backx:
        neg     [Flag.incX]

.xok:
        mov     eax, [Flag.Y]
        add     eax, [Flag.incY]
        js      .backy
        cmp     eax, [.height]
        jg      .backy

        mov     [Flag.Y], eax
        jmp     .yok

.backy:
        neg     [Flag.incY]
.yok:

        stdcall BlendImage, ebx, [Flag.X], [Flag.Y], [Flag], 0, 0, 24, 24
        exec    [.win], TWindow:RectChangedXY, [Flag.X], [Flag.Y], 24, 24, FALSE

        stdcall UnlockImg, ebx

.exit:
        return

.error:
;        DebugMsg "Error get canvas."
        jmp      .exit


endp






proc PrepareDemo
begin
;        stdcall CaretAttach, 0

        stdcall CreateFromTemplate, TemplateMainForm, 0
        set     [pApplication], TApplication:MainWindow, frmMain

        stdcall CreateImagePNG, cPngIcon, sizeof.cPngIcon

        set     [btnChild1], TButton:Icon, eax
        set     [btnChild1], TButton:IconPosition, AlignLeft

; the timers must be created before application start.
; I don't know why.
; Maybe it is safe to create timers in some event handlers... should be checked.
;
        stdcall CreateImagePNG, cPngIcon, sizeof.cPngIcon
        mov     [Flag], eax

        mov     [Flag.X], 120
        mov     [Flag.Y], 0
        mov     [Flag.incX], 1
        mov     [Flag.incY], 1


        stdcall TimerCreate
        mov     [test_timer1], eax
        mov     [eax+TTimer.interval], 500
        mov     [eax+TTimer.Callback], procTestTimer1
        mov     [eax+TTimer.flags], tmfCallProc

        stdcall TimerCreate
        mov     [test_timer2], eax
        mov     [eax+TTimer.interval], 10
        mov     [eax+TTimer.value], 0
        mov     [eax+TTimer.Callback], procTestTimer2
        mov     [eax+TTimer.flags], tmfCallProc


        mov     eax, [test_timer1]
        or      [eax+TTimer.flags], tmfRunning
        mov     eax, [test_timer2]
        or      [eax+TTimer.flags], tmfRunning


        set     [frmMain], TWindow:Visible, TRUE
;        stdcall ThreadCreate, TestThread, 0
;        stdcall ThreadCreate, TestThread2, 0

        return
endp



proc TestThread, .arg
begin
        stdcall Sleep, 1000

.loop:
        stdcall procTestTimer1, 0
        stdcall Sleep, 250
        jmp     .loop
endp



proc TestThread2, .arg
.width  dd ?
.height dd ?
begin

        stdcall Sleep, 1000
     ;   int3
.loop:
        stdcall procTestTimer2, 0
        jmp     .loop

endp




DispSize 'Test ground dummy code:', ($-__TestGround)+__TestDataSize

Added freshlib/test_code0/TestGroundConfig.asm.

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
include "%lib%/FreshEdit/FreshEdit.asm"

iglobal
frmMainForm:
; The form
        ObjTemplate  tfParent or tfEnd, Form, frmMain, x, 100, y, 50, width, 640, height, 340, Visible, TRUE, Caption, 'FreshLib uConfig files editor.'

            ; log window
            ObjTemplate tfChild, FreshEdit, editLog, x, 330, y, 0, width, 240, height, 200, Visible, TRUE, Align, waClient, _fReadOnly, froReadOnlyNoCaret

            ObjTemplate  tfParent or tfEnd, Form, frmToolPanel, borderKind, borderNone, Align, waLeft,x ,0, y, 0, width, 200, height, 340, Visible, TRUE

                ; file buttons
                ObjTemplate tfChild, Button, btnNewDB, x, 4,   y, 2, width, 64, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle,  Caption, 'New', OnClick, procOnNewDB
                ObjTemplate tfChild, Button, btnOpenDB, x, 67,  y, 2, width, 64, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'Open', OnClick, procOnOpenDB
                ObjTemplate tfChild, Button, btnSaveDB, x, 130, y, 2, width, 64, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'Save', OnClick, procOnSaveDB

                ; record buttons
                ObjTemplate tfChild, Button, btnReadRecord, x, 4, y, 194, width, 60, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'Read', OnClick, procOnRead
                ObjTemplate tfChild, Button, btnWriteRecord, x, 69, y, 194, width, 60, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'Write', OnClick, procOnWrite
                ObjTemplate tfChild, Button, btnDeleteRecord, x, 134, y, 194, width, 60, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'Delete', OnClick, procOnDelete

                ; type buttons
                ObjTemplate tfChild, Label,  lblDataType,   x, 69, y, 224,  width, 60, height, 60, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'cdtString'
                ObjTemplate tfChild, Button, btnTypeString,  x, 4, y, 224, width,  60, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'String', OnClick, procOnType
                ObjTemplate tfChild, Button, btnTypeInt,     x, 4, y, 244, width,  60, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'Number', OnClick, procOnType
                ObjTemplate tfChild, Button, btnTypeNull,    x, 4, y, 264, width,  60, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'Null', OnClick, procOnType

                ; log buttons
                ObjTemplate tfChild, Button, btnListTree, x, 134, y, 244, width, 60, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'List >>>', OnClick, procOnListTree
                ObjTemplate tfChild, Button, btnClearLog, x, 134, y, 264, width, 60, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'Clear >>>', OnClick, procOnClearLog

                ; edit boxes
                ObjTemplate tfChild, Label, lblFilename,   x, 4, y, 24,  width, 100, height, 19, Visible, TRUE, TextAlign, dtfAlignLeft or dtfAlignBottom, Caption, 'File name:'
                ObjTemplate tfChild, Edit,  editFilename,  x, 4, y, 44,  width, 190, height, 19, Visible, TRUE, Text, '../phWeb.conf'

                ObjTemplate tfChild, Label, lblSignature,  x, 4, y, 64,  width, 100, height, 19, Visible, TRUE, TextAlign, dtfAlignLeft or dtfAlignBottom, Caption, 'Signature:'
                ObjTemplate tfChild, Edit,  editSignature, x, 4, y, 84,  width, 190, height, 19, Visible, TRUE

                ObjTemplate tfChild, Label, lblKey,  x, 4, y, 104,  width, 100, height, 19, Visible, TRUE, TextAlign, dtfAlignLeft or dtfAlignBottom, Caption, 'Full key name:'
                ObjTemplate tfChild, Edit,  editKey, x, 4, y, 124,  width, 190, height, 19, Visible, TRUE

                ObjTemplate tfChild,          Label, lblValue, x, 4, y, 144,  width, 100, height, 19, Visible, TRUE, TextAlign, dtfAlignLeft or dtfAlignBottom, Caption, 'Value:'
                ObjTemplate tfChild or tfEnd, Edit,  editValue,    x, 4, y, 164,  width, 190, height, 19, Visible, TRUE
endg



proc PrepareDemo
begin
        stdcall CreateFromTemplate, frmMainForm, 0
        mov     ecx, [pApplication]
        mov     [ecx+TApplication.MainWindow], frmMain
        execute [frmMain], TForm.AlignChildren
        return
endp



uglobal
  DataBase dd ?
endg

iglobal
  DataType dd cdtString
endg


proc procOnType, .self, .button
begin
        mov     eax, [.self]
        cmp     eax, [btnTypeString]
        je      .string

        cmp     eax, [btnTypeInt]
        je      .int

        cmp     eax, [btnTypeNull]
        je      .null

        int3

.string:
;        mov     [DataType], cdtString
;        mov     eax, .txtString
;        jmp     .finish
;
.int:
;        mov     [DataType], cdtInteger
;        mov     eax, .txtInteger
;        jmp     .finish

.null:
;        mov     [DataType], cdtNULL
;        mov     eax, .txtNull

.finish:
        stdcall Set, [lblDataType], TLabel.Caption, eax
        execute [lblDataType], TLabel.Refresh
        return

.txtString db 'cdtString',0
.txtInteger db 'cdtInteger', 0
.txtNull    db 'cdtNULL', 0
endp


proc procOnClearLog, .self, .button
begin
        execute [editLog], TFreshEdit.Clear
        return
endp


proc procOnListTree, .self, .button
.prolog dd ?
begin
        push    esi

        mov     esi, [DataBase]
        test    esi, esi
        jz      .finish

        execute [editLog], TFreshEdit.Clear

        stdcall StrNew
;        stdcall StrCharCat, eax, $9c94e2
;        stdcall StrCharCat, eax, $8094e2
        stdcall __DoListTree, esi, eax

        execute [editLog], TFreshEdit.Refresh
        stdcall TFreshEdit.__UpdateScrollBars, [editLog]

.finish:
        pop     esi
        return
endp


proc __DoInsChar, .char
begin
        pushad
        execute [editLog], TFreshEdit.InsertChar, [.char]
        popad
        return
endp


proc __DoInsString, .str
begin
        pushad
        execute [editLog], TFreshEdit.InsertString, [.str]
        popad
        return
endp


proc __DoListTree, .array, .prolog
begin
        pushad

        mov     esi, [.array]
        mov     ecx, [esi+TArray.count]
        lea     esi, [esi+TArray.array]

.main_loop:
        test    ecx, ecx
        jz      .finish

        stdcall __DoInsString, [.prolog]

        mov     eax, $9c94e2
        cmp     ecx, 1
        jne     @f
        mov     eax, $9494e2
@@:
        stdcall __DoInsChar, eax
        stdcall __DoInsChar, $8094e2

        mov     ebx, [esi+TConfigRecord.KeyName]

.keynameloop:
        movzx   edx, bl
        stdcall __DoInsChar, edx
        shr     ebx, 8
        jnz     .keynameloop

        cmp     [esi+TConfigRecord.Type], cdtConfig
        je      .next_row

        stdcall __DoInsChar, '='

        cmp     [esi+TConfigRecord.Type], cdtString
        je      .handle_string

        cmp     [esi+TConfigRecord.Type], cdtInteger
        je      .handle_integer

        cmp     [esi+TConfigRecord.Type], cdtNULL
        je      .handle_null

        cmp     [esi+TConfigRecord.Type], cdtBlob
        jne     .next_row
; handle blobs
        stdcall __DoInsString, cBlobValue
        jmp     .next_row

cBlobValue text 'BLOB()'
cNULLValue text 'NULL'

.handle_null:
        stdcall __DoInsString, cNULLValue
        jmp     .next_row

.handle_integer:
        stdcall NumToStr, [esi+TConfigRecord.Data], ntsHex or ntsUnsigned
        push    eax
        stdcall __DoInsChar, '$'
        stdcall __DoInsString, eax
        stdcall StrDel ; from the stack
        jmp     .next_row

.handle_string:
        stdcall __DoInsChar, '"'
        stdcall __DoInsString, [esi+TConfigRecord.Data]
        stdcall __DoInsChar, '"'

.next_row:
        stdcall __DoInsChar, $0d

        cmp     [esi+TConfigRecord.Type], cdtConfig
        jne     .next

        stdcall StrLen, [.prolog]
        push    eax

        mov     eax, $8294e2  ;'|'
        cmp     ecx, 1
        jne     @f
        mov     eax, ' '
@@:
        stdcall StrCharCat, [.prolog], eax
        stdcall StrCharCat, [.prolog], ' '

        stdcall __DoListTree, [esi+TConfigRecord.Data], [.prolog]
        pop     edx

        stdcall StrPtr, [.prolog]
        mov     [eax+string.len], edx
        mov     dword [eax+edx], 0

.next:
        add     esi, sizeof.TConfigRecord
        dec     ecx
        jmp     .main_loop

.finish:
        mov     eax, [editLog]
        push    [eax+TFreshEdit._xCaret] [eax+TFreshEdit._yCaret]
        pop     [eax+TFreshEdit._ySelection] [eax+TFreshEdit._xSelection]
        popad
        return
endp



proc UpdateEdits, .config
.str rd 2
begin
        push    esi
        mov     esi, [.config]

        mov     eax, [esi+TArray.lparam]
        mov     [.str], eax
        mov     [.str+4], 0
        lea     eax, [.str]
        stdcall Set, [editSignature], TEdit.Text, eax

        pop     esi
        return
endp


proc procOnNewDB, .self, .button
begin
        stdcall FreeConfigDB, [DataBase]
        stdcall LoadConfigDB, 0, 'TEST'
        mov     [DataBase], eax

        stdcall UpdateEdits, eax

        stdcall LogMessage, cNewDatabase
        return
endp

cNewDatabase text 'New database created.', 13

proc procOnOpenDB, .self, .button
begin
        stdcall Get, [editFilename], TEdit.Text
        push    eax
        stdcall StrPtr, eax
        stdcall LoadBinaryFile, eax
        jc      .error_file

        mov     esi, eax
        stdcall StrDel ; from the stack

        stdcall FreeConfigDB, [DataBase]
        mov     [DataBase], 0
        stdcall LoadConfigDB, esi, -1
        jnc     .load_ok

        stdcall LogMessage, cErrorLoad

        stdcall FreeMem, esi
        return

.load_ok:
        mov     [DataBase], eax
        stdcall FreeMem, esi
        stdcall UpdateEdits, [DataBase]
        stdcall LogMessage, cLoadedOK
        return

.error_file:
        stdcall LogMessage, cErrorLoadFile
        return
endp

cErrorLoadFile text 'Error loading config database.', 13
cErrorLoad text 'Error parsing config database.', 13
cLoadedOK  text 'Database loaded successfully.', 13

proc LogMessage, .string
begin
        push    eax
        execute [editLog], TFreshEdit.InsertString, [.string]
        mov     eax, [editLog]
        push    [eax+TFreshEdit._xCaret] [eax+TFreshEdit._yCaret]
        pop     [eax+TFreshEdit._ySelection] [eax+TFreshEdit._xSelection]
        execute [editLog], TFreshEdit.Refresh
        stdcall TFreshEdit.__UpdateScrollBars, [editLog]        ; not this
        pop     eax
        return
endp


proc procOnSaveDB, .self, .button
.signature dd ?
begin
        stdcall Get, [editSignature], TEdit.Text
        push    eax
        stdcall StrPtr, eax
        mov     eax, [eax]
        mov     [.signature], eax
        stdcall StrDel ; from the stack

        stdcall Get, [editFilename], TEdit.Text
        mov     ecx, eax
        stdcall StrPtr, ecx
        mov     edx, eax

        stdcall SaveConfigFile, [DataBase], [.signature]
        mov     esi, eax
        lea     eax, [eax+TArray.array]

        mov     ebx, [esi+TArray.count]
        shl     ebx, 2
        stdcall SaveBinaryFile, edx, eax, ebx

        stdcall StrDel, ecx
        stdcall FreeMem, esi

.finish:
        return
endp


; returns edx - array to the directory.
; eax - the key name.

proc __DecodeDirectory, .hstring
begin
        push    ebx ecx esi

        stdcall CreateArray, 4
        mov     edx, eax

        stdcall StrPtr, [.hstring]
        mov     esi, eax

.main_loop:
        mov     ecx, 4
        xor     ebx, ebx

.byteloop:
        lodsb

        cmp     al, '|'
        je      .end_key
        cmp     al, 0
        je      .end_key

        ror     ebx, 8
        mov     bl, al

        loop    .byteloop

.end_key:
        inc     ecx
        shl     ecx, 3
        ror     ebx, cl

        test    al, al
        jz      .finish

        cmp     al, '|'
        je      .nameok

.search:
        lodsb
        test    al, al
        jz      .finish
        cmp     al, '|'
        jne     .search

.nameok:
        stdcall AddArrayItems, edx, 1
        mov     [eax], ebx
        jmp     .main_loop

.finish:
        stdcall AddArrayItems, edx, 1
        mov     dword [eax], 0
        mov     eax, ebx

        pop     esi ecx ebx
        return
endp





proc procOnWrite, .self, .button
begin
        push    eax ebx ecx edx

        cmp     [DataBase], 0
        je      .finish

; value
        stdcall Get, [editValue], TEdit.Text
        mov     ebx, eax

        cmp     [DataType], cdtNULL
        je      .null_handling

        cmp     [DataType], cdtInteger
        je      .int_handling

        cmp     [DataType], cdtString
        jne     .finish

; string handling.
        xor     ecx, ecx
        jmp     .continue

.int_handling:
        stdcall StrToNumEx, ebx
        stdcall StrDel, ebx
        mov     ebx, eax
        mov     ecx, 4
        jmp     .continue

.null_handling:
        stdcall StrDel, ebx
        xor     ebx, ebx
        xor     ecx, ecx

; key
.continue:
        stdcall Get, [editKey], TEdit.Text
        push    eax

        stdcall __DecodeDirectory, eax
        stdcall StrDel ; from the stack

        push    edx
        lea     edx, [edx+TArray.array]
        stdcall SetConfigParam, DataBase, edx, eax, [DataType], ebx, ecx
        stdcall FreeMem ; from the stack

        cmp     [DataType], cdtString
        jne     @f
        stdcall StrDel, ebx
@@:
        stdcall Set, [editValue], TEdit.Text, 0

.finish:
        pop     edx ecx ebx eax
        return
endp


proc procOnRead, .self, .button
begin
        push    eax
        cmp     [DataBase], 0
        je      .finish

; key
        stdcall Get, [editKey], TEdit.Text
        push    eax
        stdcall __DecodeDirectory, eax
        stdcall StrDel ; from the stack

        push    edx
        lea     edx, [edx+TArray.array]
        stdcall GetConfigParam.AsString, [DataBase], edx, eax
        stdcall FreeMem ; from the stack

        test    eax, eax
        jz      .not_found

        push    eax
        stdcall Set, [editValue], TEdit.Text, eax
        stdcall StrDel ; from the stack.

.finish:
        pop     eax
        return

.not_found:
        stdcall Set, [editValue], TEdit.Text, cNotAvailable
        jmp     .finish
endp

cNotAvailable text 'Not available'


proc procOnDelete, .self, .button
begin
        push    eax ebx ecx edx

        cmp     [DataBase], 0
        je      .finish

; key
        stdcall Get, [editKey], TEdit.Text
        push    eax

        stdcall __DecodeDirectory, eax
        stdcall StrDel ; from the stack

        push    edx
        lea     edx, [edx+TArray.array]
        stdcall DelCongigParam, DataBase, edx, eax
        stdcall FreeMem ; from the stack

.finish:
        pop     edx ecx ebx eax
        return
endp



Added freshlib/test_code0/TestGroundDirFunctions.asm.





































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
include "%lib%/FreshEdit/FreshEdit.asm"


iglobal
frmMainForm:
; The form
        ObjTemplate  tfParent or tfEnd, Form, frmMain, x, 100, y, 50, width, 640, height, 340, Visible, TRUE, Caption, 'FreshLib directory functions test.'

            ; log window
            ObjTemplate tfChild, FreshEdit, editLog, x, 330, y, 0, width, 240, height, 200, Visible, TRUE, Align, waClient, _fReadOnly, froReadOnlyWithCaret

            ObjTemplate  tfParent or tfEnd, Form, frmToolPanel, borderKind, borderNone, Align, waLeft,x ,0, y, 0, width, 200, height, 340, Visible, TRUE

                ; file buttons
                ObjTemplate tfChild, Button, btnReadFile, x, 4,  y, 2, width, 64, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'ReadLine', OnClick, procOnReadFile
                ObjTemplate tfChild, Button, btnReadDir, x, 67,  y, 2, width, 64, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'ReadDir', OnClick, procOnReadDir

                ; log buttons
                ObjTemplate tfChild, Button, btnClearLog, x, 134, y, 264, width, 60, height, 19, Visible, TRUE, TextAlign, dtfAlignCenter or dtfAlignMiddle, Caption, 'Clear >>>', OnClick, procOnClearLog

                ; edit boxes
                ObjTemplate tfChild, Label, lblFilename,   x, 4, y, 24,  width, 100, height, 19, Visible, TRUE, TextAlign, dtfAlignLeft or dtfAlignBottom, Caption, 'File name:'
                ObjTemplate tfChild or tfEnd, Edit,  editFilename,  x, 4, y, 44,  width, 190, height, 19, Visible, TRUE, Text, '_doc'

endg



proc PrepareDemo
begin

        stdcall CreateFromTemplate, frmMainForm, 0
        mov     ecx, [pApplication]
        mov     [ecx+TApplication.MainWindow], frmMain
        execute [frmMain], TForm.AlignChildren

        return
endp



proc procOnClearLog, .self, .button
begin
        execute [editLog], TFreshEdit.Clear
        return
endp



proc procOnReadDir, .self, .button
begin
        pushad

        stdcall Get, [editFilename], TEdit.Text
        mov     esi, eax

        stdcall DirectoryRead, eax
        jc      .error

        mov     esi, eax

        stdcall SortDirArray, esi, fdsByType or fdsByName ;or fdsDescending


        mov     ecx, [esi+TArray.count]
        xor     ebx, ebx

.list_loop:
        stdcall LogMessage, [esi+TArray.array+8*ebx+TDirItem.hFilename]
        stdcall LogMessage, cNewLine
        inc     ebx
        loop    .list_loop

        stdcall FreeDirArray, esi
        popad
        return

.error:
        stdcall LogMessage, cErrorRead
        stdcall GetErrorString, eax
        stdcall LogMessage, eax
        stdcall FreeErrorString, eax
        popad
        return

endp

cNewLine   text '',13
cErrorRead text 'Error read directory: '
cErrorFile text 'Error read file: '


proc procOnReadFile, .self, .button
begin
        pushad

        stdcall Get, [editFilename], TEdit.Text
        mov     esi, eax

        stdcall FileOpen, esi
        jc      .error
        mov     ebx, eax

.loop:
        stdcall FileReadLine, ebx
        jc      .error
        test    eax, eax
        jz      .end_of_file

        stdcall LogMessage, eax
        stdcall StrDel, eax
        stdcall LogMessage, cNewLine
        jmp     .loop

.end_of_file:
        stdcall FileClose, ebx
        popad
        return

.error:
        stdcall LogMessage, cErrorFile
        stdcall GetErrorString, eax
        stdcall LogMessage, eax
        stdcall FreeErrorString, eax
        stdcall LogMessage, cNewLine
        popad
        return

endp



proc LogMessage, .string
begin
        pushad
        execute [editLog], TFreshEdit.InsertString, [.string]
        mov     eax, [editLog]
        push    [eax+TFreshEdit._xCaret] [eax+TFreshEdit._yCaret]
        pop     [eax+TFreshEdit._ySelection] [eax+TFreshEdit._xSelection]
        execute [editLog], TFreshEdit.Refresh
        stdcall TFreshEdit.__UpdateScrollBars, [editLog]        ; not this
        popad
        return
endp


Added freshlib/test_code0/TestGroundFreshEdit.asm.

















































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;                                                                                        |
;   Description: Test program for TFreshEdit control.                                    |
;                                                                                        |
;   Target OS: All/Linux/Win32 - depending on current test needs.                        |
;                                                                                        |
;   Dependencies:                                                                        |
;                                                                                        |
;   Notes: The main test program calls "PrepareDemo" procedure.                          |
;________________________________________________________________________________________|

include "%lib%/FreshEdit/FreshEdit.asm"

__TestGround:

; Global data...
iglobal

__TestData:

frmMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain, \
                     x, 100,        \
                     y, 50,         \
                     width, 640,    \
                     height, 480,   \
                     borderKind, borderFull,    \
                     SplitGrid, MainSplitGrid,  \
                     Visible, TRUE, \
                     Caption, 'FreshEdit test application.'

        ObjTemplate  tfChild, TButton, btnOpen,  \
                     Visible, TRUE,              \
                     x, 112, y, 2,                        \
                     width, 64, height, 21,            \
                     SplitCell, MainSplitGrid.cellOpen,                     \
                     Caption, 'Open',                   \
                     TextAlign, dtfAlignCenter or dtfAlignMiddle,       \
                     OnClick, OnOpenFile

        ObjTemplate  tfChild, TButton, btnSave,  \
                     x, 180, y, 2,                     \
                     width, 64, height, 21,            \
                     SplitCell, MainSplitGrid.cellSave,              \
                     Caption, 'Save',                   \
                     TextAlign, dtfAlignCenter or dtfAlignMiddle,       \
                     OnClick, OnSaveFile,         \
                     Visible, TRUE

        ObjTemplate  tfChild, TButton, btnNumbers,  \
                     x, 180, y, 2,                     \
                     width, 21, height, 21,            \
                     SplitCell, MainSplitGrid.cellNumbers,           \
                     Caption, '#',                  \
                     TextAlign, dtfAlignCenter or dtfAlignMiddle,       \
                     OnClick, OnNumbers,         \
                     Visible, TRUE

        ObjTemplate  tfChild, TButton, btnZebra,  \
                     x, 180, y, 2,                     \
                     width, 21, height, 21,            \
                     SplitCell, MainSplitGrid.cellZebra,             \
                     Caption, 'Z',                  \
                     TextAlign, dtfAlignCenter or dtfAlignMiddle,       \
                     OnClick, OnZebra,                                  \
                     Visible, TRUE

        ObjTemplate  tfChild, TButton, btnTheme,       \
                     x, 180, y, 2,                     \
                     width, 21, height, 21,            \
                     SplitCell, MainSplitGrid.cellTheme,             \
                     Caption, 'T',                     \
                     TextAlign, dtfAlignCenter or dtfAlignMiddle,       \
                     OnClick, OnTheme,         \
                     Visible, TRUE

        ObjTemplate  tfChild, TEdit, FilenameEdit,      \
                     x, 2, y, 2,                        \
                     width, 100, height, 21,            \
                     SplitCell, MainSplitGrid.cellFilename,           \
                     Visible, TRUE

        ObjTemplate tfEnd, TFreshEdit, Editor,   \
                    x, 8, y, 8,                  \
                    width, 624, height, 464,     \
                    SplitCell, MainSplitGrid.cellEditor,       \
                    Visible, TRUE

  SplitStart MainSplitGrid
    Split  stVert or stJustGap or stOriginBR, 0, 20, 0, 0
    Cell   cellEditor
    Split  stHoriz or stJustGap, 0, 64, 0, 0
    Cell   cellOpen
    Split  stHoriz or stJustGap, 0, 64, 0, 0
    Cell   cellSave
    Split  stHoriz or stJustGap, 0, 21, 0, 0
    Cell   cellNumbers
    Split  stHoriz or stJustGap, 0, 21, 0, 0
    Cell   cellZebra
    Split  stHoriz or stJustGap, 0, 21, 0, 0
    Cell   cellTheme
    Cell   cellFilename
  SplitEnd



  SampleText file 'unicode_test.txt'
             dd   0

__TestDataSize = $ - __TestData
endg


uglobal
  Timer1 dd ?
endg

var FreshEditSetTheme = TFETheme.SetDefaultThemeWindows


proc OnTheme, .self, .mousebtn
begin
        xor     [FreshEditSetTheme], TFETheme.SetDefaultThemeWindows xor TFETheme.SetDefaultThemeClassic
        stdcall [FreshEditSetTheme], FreshEditTheme
        xor     [SynTheme], fasm_colors_classic xor fasm_colors_windows
        exec    [Editor], TFreshEdit:Refresh
        return
endp


proc OnZebra, .self, .mousebtn
begin
        xor     [FreshEditTheme.Options], eoStripedBackground
        exec    [Editor], TFreshEdit:Refresh
        return
endp


proc OnNumbers, .self, .mousebtn
begin
        xor     [FreshEditTheme.Options], eoLineNumbers
        exec    [Editor], TFreshEdit:Refresh
        return
endp


cErrorTitleOpen text "Error open file."
cErrorTitleSave text "Error save file."

proc OnSaveFile, .self, .mousebtn
begin
        pushad

        get     eax, [FilenameEdit], TEdit:Text
        push    eax
        stdcall StrPtr, eax
        mov     edi, eax

        get     eax, [Editor], TFreshEdit:Text
        jc      .finish

        push    eax
        stdcall StrPtr, eax

        stdcall SaveBinaryFile, edi, eax, [eax+string.len]
        jnc     .end_save

        stdcall GetErrorString, eax
        mov     esi, eax
        stdcall ShowMessage, [frmMain], smiError, cErrorTitleSave, esi, smbOK
        stdcall FreeErrorString, esi

.end_save:
        stdcall StrDel ; from the stack
.finish:
        stdcall StrDel ; from the stack
        popad
        return
endp


proc OnOpenFile, .self, .mousebtn
begin
        pushad
; Load test file

        get     eax, [FilenameEdit], TEdit:Text
        push    eax

        stdcall StrPtr, eax
        stdcall LoadBinaryFile, eax
        jnc     .loaded

        stdcall GetErrorString, eax
        mov     esi, eax
        stdcall ShowMessage, [frmMain], smiError, cErrorTitleOpen, esi, smbOK
        stdcall FreeErrorString, esi
        jmp     .exit

.loaded:
        push    eax

        set     [Editor], TFreshEdit:Text, eax
        stdcall FreeMem ; from the stack

.exit:
        stdcall StrDel ; from the stack

        mov     eax, [Editor]
        mov     [eax+TFreshEdit._xCaret], 0
        mov     [eax+TFreshEdit._yCaret], 0
        mov     [eax+TFreshEdit._xSelection], 0
        mov     [eax+TFreshEdit._ySelection], 0

        stdcall ParseFolding, [eax+TFreshEdit._pLines]

        exec    [Editor], TFreshEdit:Refresh
        exec    [Editor], TFreshEdit:Focus
        popad
        return
endp



proc PrepareDemo
begin
        stdcall CreateFromTemplate, frmMainForm, 0
        set     [pApplication], TApplication:MainWindow, frmMain

        set     [Editor], TFreshEdit:SyntaxProc, SyntaxFASM
        set     [Editor], TFreshEdit:OnControlKey, procKeyPress
        set     [Editor], TFreshEdit:Text, SampleText

        mov     esi, [Editor]
; test - set some flags on line 33
        mov     eax, [esi+TFreshEdit._pLines]
        or      [eax+TArray.array+sizeof.TEditorLine*26+TEditorLine.flags], lfBreakpoint

; test - set some flags on line 34
        mov     eax, [esi+TFreshEdit._pLines]
        or      [eax+TArray.array+sizeof.TEditorLine*27+TEditorLine.flags], lfBreakpoint
        mov     [eax+TArray.array+sizeof.TEditorLine*27+TEditorLine.debugdata], $12345
        mov     [eax+TArray.array+sizeof.TEditorLine*28+TEditorLine.debugdata], $12345
        mov     [eax+TArray.array+sizeof.TEditorLine*29+TEditorLine.debugdata], $12345

        stdcall ParseFolding, eax
.exit:
        return
endp



proc procKeyPress, .self, .keyevent
begin
        mov     ebx, [.keyevent]

        mov     eax, [ebx+TKeyboardEvent.key]

        cmp     eax, $03        ; ctrl+C
        je      .copy
        cmp     eax, $16        ; ctrl+V
        je      .paste
        cmp     eax, 12 ; ctrl+L
        je      .length_list
        cmp     eax, 18 ; ctrl+R
        je      .clipright
        cmp     eax, 19 ; ctrl+S == save
        je      .save
        cmp     eax, 20 ; ctrl+T
        je      .test_something

        cmp     [ebx+TKeyboardEvent.scancode], keyF2
        je      .toggle_breakpoint

.finish:
        mov     eax, chgfNoClearSelection
.exit:
        return

.copy:
        get     eax, [.self], TFreshEdit:Selection
        test    eax, eax
        jz      .end_copy
        stdcall ClipboardWrite, eax
        stdcall StrDel, eax
.end_copy:
        mov     eax, chgfNoClearSelection
        return

.paste:
        stdcall ClipboardRead
        test    eax, eax
        jz      .end_paste

        set     [.self], TFreshEdit:Selection, eax
        stdcall StrDel, eax

        mov     eax, chgfNeedRefresh
.end_paste:
        return


.save:
        stdcall OnSaveFile, [.self], 0
        xor     eax, eax
        return

.length_list:
        xor     eax, eax
        return

.clipright:
        get     eax, esi, TFreshEdit:CurrentLine
        jc      .finish
        stdcall StrClipSpacesR, [eax+TEditorLine.Data]
        mov     eax, chgfNeedRefresh
        return

.test_something:
        mov     eax, chgfNeedRefresh
        return


.toggle_breakpoint:
        cmp     [esi+TFreshEdit._fReadOnly], froReadWrite
        jne     .finish

        get     eax, esi, TFreshEdit:CurrentLine
        jc      .finish

        xor     [eax+TEditorLine.flags], lfBreakpoint
        mov     eax, chgfNeedRefresh or chgfNoClearSelection
        return


;. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

endp




; very primitive! To be rewrited from scratch to allow custom keywords.
proc ParseFolding, .pLines
begin
        pushad

        xor     ebx, ebx
        mov     esi, [.pLines]
        mov     ecx, [esi+TArray.count]
        lea     esi, [esi+TArray.array]

.loop:
        jecxz   .endparse

        stdcall StrPtr, [esi+TEditorLine.Data]
        jc      .forward

        cmp     [eax+string.len], 4
        jb      .forward

        cmp     dword [eax], 'proc'
        je      .up

        cmp     [eax+string.len], 6
        jb      .forward

        cmp     dword [eax], 'loca'
        jne     .forward
        cmp     word [eax+4], 'ls'
        jne     .forward

.up:
        inc     ebx
        or      [esi+TEditorLine.flags], lfFoldHeader

.forward:
        mov     [esi+TEditorLine.fold_level], ebx

        stdcall StrPtr, [esi+TEditorLine.Data]
        jc      .forward2

        cmp     [eax+string.len], 4
        jb      .forward2

        cmp     dword [eax], 'endp'
        je      .down
        cmp     dword [eax], 'endl'
        jne     .forward2

.down:
        test    ebx, ebx
        jz      .forward2
        dec     ebx

.forward2:
        add     esi, sizeof.TEditorLine
        dec     ecx
        jmp     .loop

.endparse:
        popad
        return
endp








DispSize 'Test ground dummy code:', ($-__TestGround)+__TestDataSize

; without this, the application crashes in Linux with untraceable seg fault. Why???
; It seems it crashes during the load, before even one instruction executed.
; Maybe it is some kind of bug in the elf formater...
; IT CRASHES ONLY SOMETIMES?????
;rb 64

include '%lib%/FreshEdit/fasm_syntax.asm'

Added freshlib/test_code0/TestGroundKeyboard.asm.



















































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;   Description: This test source provides some testing of the keyboard facilities
;                of FreshLib
;
;   Target OS: All/Linux/Win32 - depending on current test needs.
;
;   Dependencies:
;
;   Notes: The main test program calls "PrepareDemo" procedure.
;_________________________________________________________________________________________

__TestGround:

; Global data...
iglobal

__TestData:

frmMainForm:
        ObjTemplate  tfEnd, Form, frmMain, \
                     x, 100,        \
                     y, 50,         \
                     width, 120,    \
                     height, 80,   \
                     Visible, TRUE, \
                     OnKeyPress, MainKeyPressed,        \
                     Caption, 'FreshLib minimal application test.'

__TestDataSize = $ - __TestData
endg






cKeyMessage text 'Key pressed:'
cCRLF       db   13, 10, 0
cSpace      db   '  ', 0



proc MainKeyPressed, .self, .keyevent
begin
        mov     esi, [.self]
        mov     edi, [.keyevent]

        stdcall Output, cKeyMessage
        stdcall OutputNumber, [edi+TKeyboardEvent.key], 16, 8
        stdcall Output, cSpace
        stdcall OutputNumber, [edi+TKeyboardEvent.scancode], 16, 8
        stdcall Output, cSpace
        stdcall OutputNumber, [edi+TKeyboardEvent.kbdStatus], 16, 8
        stdcall Output, cCRLF
        return
endp








proc PrepareDemo
begin
        stdcall CreateFromTemplate, frmMainForm, 0
        mov     ecx, [pApplication]
        mov     [ecx+TApplication.MainWindow], frmMain

        return
endp












DispSize 'Test ground dummy code', ($-__TestGround)+__TestDataSize

Added freshlib/test_code0/TestGroundNull.asm.









>
>
>
>
1
2
3
4
proc PrepareDemo
begin
        return
endp

Added freshlib/test_code0/TestGroundSplitGrid.asm.



























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;   Description: Very simple test application for FreshLib.
;                The content may change arbitrary.
;
;   Target OS: All/Linux/Win32 - depending on current test needs.
;
;   Dependencies:
;
;   Notes: The main test program calls "PrepareDemo" procedure.
;_________________________________________________________________________________________

__TestGround:

; Global data...
iglobal

__TestData:

frmMainForm:
        ObjTemplate  tfEnd or tfParent, TForm, frmMain, \
                     x = 300,        \
                     y = 250,        \
                     width = 640,    \
                     height = 480,   \
                     Visible = FALSE, \
                     Caption = 'FreshLib SplitGrid editor.',\
                     SplitGrid = ExampleTemplate

        ObjTemplate  tfEnd, TButton, btn1,                       \
                     x = 100, y = 100, width = 100, height = 50,    \
                     Visible = TRUE, Caption = 'Button1',         \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle,\
                     OnClick = btn1_OnClick,                     \
                     SplitCell = ExampleTemplate.cellTop

__TestDataSize = $ - __TestData
endg



proc btn1_OnClick as TButton.OnClick
begin
        stdcall ShowMessage, [frmMain], smiInformation, 'It is assembly language!', 'Hello assembly codder!', smbOK
        return
endp



proc PrepareDemo
begin
        stdcall CreateFromTemplate, frmMainForm, 0
        set     [pApplication], TApplication:MainWindow, frmMain
        set     [frmMain], TWindow:Visible, TRUE
        return
endp


iglobal
  SplitStart ExampleTemplate
    Split  stHoriz, 4, 96, 0, 1000
      Cell   cellFolders
      Split  stVert or stRelative, 4, $2000, 0, $8000
        Split  stHoriz or stRelative, 4, $2000, 0, $8000
          Cell   cellTop
          Split  stVert or stRelative, 4, $4000, 0, $8000
            Cell   NONE
            Cell   cellPanel1
        Cell   cellPanel2
  SplitEnd
endg


DispSize 'Test ground dummy code:', ($-__TestGround)+__TestDataSize

Added freshlib/test_code0/TestLib.asm.















































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;  Description: The main file of FreshLib test application. Main file.
;
;  Target OS: Any
;
;  Dependencies: FreshLib - see includes in the source.
;
;  Notes: This is the main file of the project. It forms the common frame of the GUI
;         program. The real test code is separated in several different files,
;         named TestGround(xxxx).asm where (xxxx) is some suffix.
;         Include only one of these files.
;_________________________________________________________________________________________


include '%lib%/freshlib.inc'
@BinaryType GUI, compact

options.AlignCode         = 0
options.FastEnter         = 1           ; enter/leave or push ebp/pop ebp approach to the procedures.
options.CheckArguments    = 1
options.ShowSkipped       = 0           ; shows the procedures skiped because of no use.
options.ShowSizes         = 1           ; enable/disable work of DispSize macro.
options.SkipZeroSizes     = 0
options.ShowImported      = 0           ; enable/disable display of imported functions.
options.DebugMode         = 1           ; enable/disable macros of simpledebug library.
  ; Only used in X server based systems.
  options.DebugMode.DisableSHM = 0
  options.DebugMode.NoTimers = 0
  options.DebugMode.XSync   = 0           ; enable/disable syncronized X server communications.
  options.DebugMode.XErrors = 0

;options.Threads                ; READ ONLY option. Automatically set.

;LinuxThreads equ native        ; native or posix
;HeapManager  equ OS            ; OS or ASM


include '%lib%/freshlib.asm'

; use one and only one of the following files.
;
;include 'TestGroundSplitGrid.asm'
;include 'TestGroundNull.asm'                   ; in order to check whether for compilation of dead code.
;include  'TestGround.asm'
;include 'TestGroundComplex.asm'
;include 'TestGroundKeyboard.asm'
;include 'TestGroundFreshEdit.asm'
;include 'TestGroundConfig.asm'
;include 'TestGroundDirFunctions.asm'
;include  'TestGrids.asm'
include 'TestTreeView.asm'
;include 'TestResizeEvents.asm'




if TargetOS eq Linux
;  rb 343       ; this bytes simply make ELF file to be loadable.
              ; there is a bug somewhere in the ELF generator (FASM or possibly ELF macros)
              ; that makes some sizes of the ELF executable not loadable. (the Linux loader crashes with SEGFAULT)
end if

uglobal
;  buffer rb 256
endg

iglobal
  ; The example from RFC-1951
;  TestArray dw 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 2, 0, 4, 0, 4, 0
endg

; Main Program
start:

DebugMsg 'Before initializing.'
        InitializeAll
DebugMsg 'After initializing.'

        create  [pApplication], TApplication

        call    GUI.Init

        stdcall PrepareDemo

DebugMsg 'Just before run.'

        stdcall Run

.terminate:
        push    eax
        FinalizeAll

        DebugMsg 'Just before the end.'
        stdcall TerminateAll     ; from the stack

; end



Added freshlib/test_code0/TestMenu.asm.











































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI, compact

options.DebugMode = 1
  options.DebugMode.NoTimers = 0
  options.DebugMode.XSync = 0
  options.DebugMode.XErrors =0

options.ShowSizes = 1
options.SkipZeroSizes = 1

ThemeGUI equ flat_gui

include "%lib%/freshlib.asm"


iglobal
TemplateMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain, \
                     x = 200,          \
                     y = 200,          \
                     width = 320,    \
                     height = 260,   \
                     OnCreate = FormOnCreate,    \
                     OnClose = MainFormOnClose,  \
                     OnDestroy = FormOnDestroy,  \
                     Caption = 'Popup menu test'

          ObjTemplate tfChild, TEdit, editTest,                 \
                     x = 10, y = 200, width = 300, height = 24, \
                     Text = "This is test TEdit control",       \
                     Visible = TRUE

          ObjTemplate tfParent or tfChild, TActionList, ActionList1,    \
                     ImgIcons = imgMenuList

             ObjTemplate tfChild, TAction, actCheck,                \
                         Caption = "Check it", HintText = "Action that can be checked and unchecked.",         \
                         Accelerator = "Ctrl+Shift+N",                                                         \
                         OnExecute = ActionOnCheck,                                                            \
                         IconIndex = 9

             ObjTemplate tfChild, TAction, actNew,                \
                         Caption = "New", HintText = "Create new file.",         \
                         Accelerator = "Ctrl+N",                                                          \
                         OnExecute = ActionOnExecute,                                                     \
                         IconIndex = 0

             ObjTemplate tfChild, TAction, actOpen,                \
                         Caption = "Open", HintText = "Open file for editing.",         \
                         Accelerator = "Ctrl+O",                                                          \
                         OnExecute = ActionOnExecute,                                                     \
                         IconIndex = 1

             ObjTemplate tfChild, TAction, actClean,                                                            \
                         Caption = "Cleanup list", HintText = "Removes not existing files from the list.",      \
                         OnExecute = ActionOnExecute,                                                           \
                         IconIndex = -1

             ObjTemplate tfChild, TAction, actSave,                \
                         Caption = "Save", HintText = "Save edited file to the disk.",         \
                         Accelerator = "Ctrl+S",                                                          \
                         OnExecute = ActionOnExecute,                                                     \
                         IconIndex = 2

             ObjTemplate tfChild, TAction, actSaveAs,                \
                         Caption = "Save As", HintText = "Save edited file with different name.",         \
                         OnExecute = ActionOnExecute,                                                     \
                         IconIndex = 22

             ObjTemplate tfChild, TAction, actSaveAll,                \
                         Caption = "Save All", HintText = "Save all edited files to the disk.",           \
                         Accelerator = "Ctrl+Shift+S",                                                    \
                         OnExecute = ActionOnExecute,                                                     \
                         IconIndex = 23

             ObjTemplate tfChild, TAction, actClose,                \
                         Caption = "Close", HintText = "Close current edited file.",         \
                         Accelerator = "Ctrl+F4",                                                         \
                         OnExecute = ActionOnExecute,                                                     \
                         IconIndex = 21

             ObjTemplate tfChild, TAction, actCloseAll,                \
                         Caption = "Close All", HintText = "Close all edited files and the project.",         \
                         OnExecute = ActionOnExecute,                                                     \
                         IconIndex = 24

             ObjTemplate tfChild or tfEnd, TAction, actExit,                \
                         Caption = "Exit", HintText = "Exit Fresh IDE.",         \
                         Accelerator = "Alt+X",                                                           \
                         OnExecute = ActionOnExecute,                                                     \
                         IconIndex = -1


          ObjTemplate tfChild, TButton, btnSkinWin,                     \
                     x = 60, y = 10, width = 84, height = 24,           \
                     Caption = "Win skin",                              \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle,      \
                     Visible = TRUE,                                    \
                     OnClick = SetWinSkin

          ObjTemplate tfChild, TButton, btnSkinFlat,                    \
                     x = 146, y = 10, width = 84, height = 24,          \
                     Caption = "Flat skin",                             \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle,      \
                     Visible = TRUE,                                    \
                     OnClick = SetFlatSkin

          ObjTemplate  tfChild, TButton, btnOpenMenu,         \
                     x = 10,         \
                     y = 10,         \
                     width = 32,     \
                     height = 32,    \
                     Icon = imgMenu,         \
                     IconPosition = iposCenter, \
                     Visible = TRUE,            \
                     OnClick = OpenMenuClick,   \
                     OnKeyPressed = ButtonKeyPressed

          ObjTemplate tfChild, TButton, btnChangeAction1,               \
                     x = 146, y = 52, width = 84, height = 24,          \
                     Caption = "Set act. 1",                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle,      \
                     Visible = TRUE,                                    \
                     OnClick = SetAction1

          ObjTemplate tfChild, TButton, btnChangeAction1,               \
                     x = 146, y = 78, width = 84, height = 24,          \
                     Caption = "Set act. 2",                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle,      \
                     Visible = TRUE,                                    \
                     OnClick = SetAction2

          ObjTemplate tfChild, TButton, btnWithAction2,         \
                     x = 10, y = 78, width = 100, height = 24,           \
                     IconPosition = iposLeft, TextAlign = dtfAlignLeft or dtfAlignMiddle, \
                     Action = [actExit],                                \
                     Visible = TRUE

          ObjTemplate tfChild, TButton, btnWithAction1,                 \
                     x = 10, y = 52, width = 100, height = 24,           \
                     IconPosition = iposLeft, TextAlign = dtfAlignLeft or dtfAlignMiddle, \
                     Action = [actCheck],                                \
                     Visible = TRUE

          ObjTemplate tfChild, TCheckbox, cbEnableDisable3,              \
                     x = 10, y = 130, width = 130, height = 24,          \
                     Caption = "Enable action",                          \
                     OnClick = EnableActionClick,                        \
                     Visible = TRUE

          ObjTemplate tfChild, TCheckbox, cbEnableDisable2,     \
                     x = 146, y = 130, width = 100, height = 24,         \
                     Action = [actCheck],                                \
                     Visible = TRUE

          ObjTemplate tfChild, TCheckbox, cbEnableDisable,     \
                     x = 146, y = 104, width = 100, height = 24,         \
                     Action = [actCheck],                                \
                     Visible = TRUE

          ObjTemplate tfChild or tfEnd, TToolbar, tbTest,        \
                     x = 0, y = 236, width = 320, height = 24,  \
                     Visible = TRUE


TemplateMainMenu:
      ObjTemplate  tfEnd, TMenu, mainMenu,              \
        Visible = FALSE

TemplateSubMenu:
     ObjTemplate tfEnd, TMenu, subMenu, \
        Enabled = TRUE,                \
        Caption = "Reopen",             \
        Visible = FALSE



  getfile imgMenu, "_test_images/menu.png"
  getfile imgMenuList, "_test_images/img_list.png"

  getfile cfgFlat, "theme_flat.cfg"
          dd 0

  getfile cfgWin,  "theme_win.cfg"
          dd 0

endg


uglobal
  iconMenu dd ?
endg


rb 423


start:
        InitializeAll


        create  [pApplication], TApplication

        call    GUI.Init

        stdcall CreateFromTemplate, TemplateMainForm, 0
        set     [pApplication], TApplication:MainWindow, frmMain

        set     [frmMain], TWindow:Visible, TRUE                ; must be set visible after creation, because it loads
                                                                ; needed images in OnCreate event handler.

        stdcall CreateFromTemplate, TemplateMainMenu, 0
        stdcall CreateFromTemplate, TemplateSubMenu, 0

        exec    [mainMenu], TMenu:AddItem, mitAction, [actCheck], 0
        exec    [mainMenu], TMenu:AddItem, mitAction, [actNew], 1
        exec    [mainMenu], TMenu:AddItem, mitSubmenu, [subMenu], 2
        exec    [mainMenu], TMenu:AddItem, mitAction, [actOpen], 3
        exec    [mainMenu], TMenu:AddItem, mitSeparator, 0, 4
        exec    [mainMenu], TMenu:AddItem, mitAction, [actSave], 5
        exec    [mainMenu], TMenu:AddItem, mitAction, [actSaveAs], 6
        exec    [mainMenu], TMenu:AddItem, mitAction, [actSaveAll], 7
        exec    [mainMenu], TMenu:AddItem, mitSeparator, 0, 8
        exec    [mainMenu], TMenu:AddItem, mitAction, [actClose], 9
        exec    [mainMenu], TMenu:AddItem, mitAction, [actCloseAll], 10
        exec    [mainMenu], TMenu:AddItem, mitSeparator, 0, 11
        exec    [mainMenu], TMenu:AddItem, mitAction, [actExit], 12

        set     [actCheck], TAction:Checked, 1
        set     [actCheck], TAction:Enabled, 0

;        set     [cbEnableDisable2], TCheckbox:Enabled, 0


        exec    [subMenu], TMenu:AddItem, mitAction, [actClean], 0
        exec    [subMenu], TMenu:AddItem, mitSeparator, 0, 0
        exec    [subMenu], TMenu:AddItem, mitString, "/home/johnfound/Fresh/source/Fresh.fpr", 1
        exec    [subMenu], TMenu:AddItem, mitString, "/home/johnfound/Fresh/source/Fresh.asm", 2
        exec    [subMenu], TMenu:AddItem, mitString, "/home/johnfound/Fresh/freshlib/freshlib.inc", 3


        exec    [tbTest], TToolbar:AddButton, [actNew]
        exec    [tbTest], TToolbar:AddButton, [actOpen]
        exec    [tbTest], TToolbar:AddButton, [actSave]
        exec    [tbTest], TToolbar:AddButton, [actSaveAll]
        exec    [tbTest], TToolbar:AddButton, 0
        exec    [tbTest], TToolbar:AddButton, [actClose]
        exec    [tbTest], TToolbar:AddButton, [actCloseAll]

        stdcall Run

        FinalizeAll
        stdcall TerminateAll, 0



; Sample event handlers. They work with other objects on the form.

proc FormOnCreate as TObject.OnCreate
begin
        DebugMsg "Form OnCreate event handler."
        return
endp



proc FormOnDestroy as TObject.OnDestroy
begin
        DebugMsg "MainForm destroy event handler."
        return
endp



proc MainFormOnClose as TForm.OnClose
begin
        DebugMsg "Main form OnClose event handler"
        clc
        return
endp




proc OpenMenuClick as TButton.OnClick
begin
        exec    [mainMenu], TMenu:Show, [btnOpenMenu], 0, 32
        return
endp


proc ButtonKeyPressed as TWindow.OnKeyPressed
begin
        stdcall CreateKeyName, [.utf8], [.scancode], [.kbdState]
        push    eax

        stdcall StrPtr, eax
        OutputLn  eax

        OutputValue "    UTF-8: $", [.utf8], 16, 8
        OutputValue "Scan code: $", [.scancode], 16, 8
        OutputValue "    State: $", [.kbdState], 16, 8
        DebugMsg "     "

        stdcall StrDel
        return
endp


proc SetWinSkin as TButton.OnClick
begin
        stdcall StringToNamedArray, GUI.meta, cfgWin
        exec    [frmMain], TWindow:ForceRefresh
        return
endp


proc SetFlatSkin as TButton.OnClick
begin
        stdcall StringToNamedArray, GUI.meta, cfgFlat
        exec    [frmMain], TWindow:ForceRefresh
        return
endp



proc ActionOnExecute as TAction.OnExecute
begin
        mov     esi, [.Action]

        stdcall StrDupMem, 'Action "'
        mov     ebx, eax

        get     eax, [.Action], TAction:Caption

        stdcall StrCat, ebx, eax

        stdcall StrCat, ebx, '" executed from control $'

        stdcall NumToStr, [.Ctrl], ntsHex or ntsFixedWidth + 8
        stdcall StrCat, ebx, eax
        stdcall StrDel, eax

        stdcall ShowMessage, [frmMain], smiInformation, "Action execution", ebx, smbOK

        stdcall StrDel, ebx
        return
endp




proc ActionOnCheck as TAction.OnExecute
begin
        get     eax, [.Action], TAction:Checked
        xor     eax, 1
        set     [.Action], TAction:Checked, eax
        return
endp



proc SetAction1 as TButton.OnClick
begin
        set     [btnWithAction1], TButton:Action, [actOpen]
        set     [btnWithAction2], TButton:Action, [actSaveAll]
        return
endp


proc SetAction2 as TButton.OnClick
begin
        set     [btnWithAction1], TButton:Action, [actCheck]
        set     [btnWithAction2], TButton:Action, [actClose]
        return
endp



proc EnableActionClick as TButton.OnClick
begin
        get     eax, [.self], TCheckbox:Checked

        set     [actCheck], TAction:Enabled, eax

        return
endp


Added freshlib/test_code0/TestMenu.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestNewGUI.asm.





























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI, compact

options.DebugMode = 1
  options.DebugMode.NoTimers = 0
  options.DebugMode.XSync = 0
  options.DebugMode.XErrors =0

options.ShowSizes = 1
options.SkipZeroSizes = 0

ThemeGUI equ flat_gui
;ThemeGUI equ win_gui

include "%lib%/freshlib.asm"


iglobal
TemplateMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain,         \
                     x = 100,                                   \
                     y = 50,                                    \
                     width = 600,                               \
                     height = 520,                              \
                     OnCreate = FormOnCreate,                   \
                     OnClose = MainFormOnClose,                 \
                     OnDestroy = FormOnDestroy,                 \
                     Caption = 'The new GUI toolkit test form.'


          ObjTemplate  tfChild, TLabel, NONE,                   \
                     x = 10, y = 10, width = 200, height = 24,  \
                     Caption = "Progress bar test:",            \
                     Visible = TRUE


          ObjTemplate  tfChild, TProgress, Progress1,           \
                     x = 38, y = 32, width = 200, height = 24,  \
                     Max = 100, Pos = 70,                       \
                     Visible = TRUE

          ObjTemplate  tfChild, TButton, btnArrowLeft,          \
                     x = 10,                                    \
                     y = 32,                                    \
                     width = 24,                                \
                     height = 24,                               \
                     Icon = imgArrowLeft,                       \
                     IconPosition = iposCenter,                 \
                     Visible = TRUE,                            \
                     OnClick = ArrowLeftClick

          ObjTemplate  tfChild, TButton, btnArrowRight,         \
                     x = 242,                                   \
                     y = 32,                                    \
                     width = 24,                                \
                     height = 24,                               \
                     Icon = imgArrowRight,                      \
                     IconPosition = iposCenter,                 \
                     Visible = TRUE,                            \
                     OnClick = ArrowRightClick


          ObjTemplate  tfChild, TLabel, NONE,                   \
                     x = 10, y = 75, width = 200, height = 24,  \
                     Caption = "Buttons test:",                 \
                     Visible = TRUE

          ObjTemplate  tfChild, TButton, btnDisabled,           \
                     x = 448,                                   \
                     y = 100,                                   \
                     width = 128,                               \
                     height = 48,                               \
                     TextAlign = dtfAlignJustify or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = "Disabled",                      \
                     Icon = imgTestIcon1,                       \
                     IconPosition = iposLeft,                   \
                     Enabled = FALSE,                           \
                     Visible = TRUE

          ObjTemplate  tfChild, TButton, btnChild1,             \
                     x = 10,                                    \
                     y = 100,                                   \
                     width = 407,                               \
                     height = 242,                              \
                     TextAlign = dtfAlignJustify or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = utf8_long,                       \
                     Icon = imgTestIcon1,                       \
                     IconPosition = iposLeft,                   \
                     Visible = TRUE,                            \
                     OnClick = Button1Click

          ObjTemplate  tfChild, TButton, btnChild2,             \
                     x = 448,                                   \
                     y = 160,                                   \
                     width = 128,                               \
                     height = 48,                               \
                     TextAlign = dtfAlignJustify or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = utf8_string,                     \
                     Icon = imgTestIcon2,                       \
                     IconPosition = iposRight,                  \
                     Enabled = TRUE,                            \
                     Visible = TRUE,                            \
                     OnClick = Button2Click

          ObjTemplate  tfChild, TButton, btnChild3,             \
                     x = 448,                                   \
                     y = 220,                                   \
                     width = 128,                               \
                     height = 122,                              \
                     TextAlign = dtfAlignCenter or dtfAlignBottom or dtfCRLF or dtfWordWrap,\
                     Caption = "Workers of the world, unite!",  \
                     Icon = imgTestIcon3,                       \
                     IconPosition = iposCenter,                 \
                     Enabled = TRUE,                            \
                     Visible = TRUE

          ObjTemplate  tfChild, TButton, btnAlignLeft,          \
                     x = 10,                                    \
                     y = 350,                                   \
                     width = 64,                                \
                     height = 32,                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Left',                          \
                     Visible = TRUE,                            \
                     OnClick = LeftClick

          ObjTemplate  tfChild, TButton, btnAlignRight,         \
                     x = 84,                                    \
                     y = 350,                                   \
                     width = 64,                                \
                     height = 32,                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Right',                         \
                     Visible = TRUE,                            \
                     OnClick = RightClick

          ObjTemplate  tfChild, TButton, btnAlignCenter,        \
                     x = 158,                                   \
                     y = 350,                                   \
                     width = 64,                                \
                     height = 32,                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Center',                        \
                     Visible = TRUE,                            \
                     OnClick = CenterClick

          ObjTemplate  tfChild, TButton, btnAlignJust,          \
                     x = 232,                                   \
                     y = 350,                                   \
                     width = 64,                                \
                     height = 32,                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Justify',                       \
                     Visible = TRUE,                            \
                     OnClick = JustifyClick

          ObjTemplate  tfChild, TButton, btnAlignTop,           \
                     x = 306,                                   \
                     y = 350,                                   \
                     width = 64,                                \
                     height = 32,                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Top',                           \
                     Visible = TRUE,                            \
                     OnClick = TopClick

          ObjTemplate  tfChild, TButton, btnAlignMiddle,        \
                     x = 380,                                   \
                     y = 350,                                   \
                     width = 64,                                \
                     height = 32,                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Middle',                        \
                     Visible = TRUE,                            \
                     OnClick = MiddleClick

          ObjTemplate  tfChild, TButton, btnAlignBottom,        \
                     x = 454,                                   \
                     y = 350,                                   \
                     width = 64,                                \
                     height = 32,                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Bottom',                        \
                     Visible = TRUE,                            \
                     OnClick = BottomClick

          ObjTemplate  tfChild, TLabel, NONE,                   \
                     x = 10, y = 390, width = 200, height = 24, \
                     Caption = "Line editor test:",             \
                     Visible = TRUE

          ObjTemplate tfChild, TEdit, editTest,                 \
                     Text = "This is simple line editor.",      \
                     x = 10, y=415, width=306, height=24,       \
                     MarginLeft= 2,                             \
                     MarginRight= 2,                            \
                     Visible = TRUE

          ObjTemplate  tfChild, TLabel, NONE,                   \
                     x = 10, y = 445, width = 200, height = 24, \
                     Caption = "Message boxes test:",           \
                     Visible = TRUE

          ObjTemplate  tfChild, TButton, btnMsgError,           \
                     x = 10,                                    \
                     y = 470,                                   \
                     width = 72,                                \
                     height = 32,                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Error',                         \
                     Visible = TRUE,                            \
                     OnClick = ErrorClick

          ObjTemplate  tfChild, TButton, btnMsgWarning,         \
                     x = 88,                                    \
                     y = 470,                                   \
                     width = 72,                                \
                     height = 32,                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Warning',                       \
                     Visible = TRUE,                            \
                     OnClick = WarningClick

          ObjTemplate  tfChild, TButton, btnMsgQuestion,        \
                     x = 166,                                   \
                     y = 470,                                   \
                     width = 72,                                \
                     height = 32,                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Question',                      \
                     Visible = TRUE,                            \
                     OnClick = QuestionClick

          ObjTemplate  tfChild or tfEnd, TButton, btnMsgInfo,   \
                     x = 244,                                   \
                     y = 470,                                   \
                     width = 72,                                \
                     height = 32,                               \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Info',                          \
                     Visible = TRUE,                            \
                     OnClick = InfoClick



  getfile imgTestIcon1,  '_test_images/speech.png'
  getfile imgTestIcon2,  '_test_images/globe.png'
  getfile imgTestIcon3,  '_test_images/star.png'

  getfile imgArrowLeft,  '_test_images/left.png'
  getfile imgArrowRight, '_test_images/right.png'

  getfile imgFolder, "_test_images/folder.png"
  getfile imgFile,   "_test_images/document.png"


include "UTF8_examples.asm"


endg


rb 423


start:
        InitializeAll

        create  [pApplication], TApplication

        call    GUI.Init

        stdcall CreateFromTemplate, TemplateMainForm, 0

        set     [pApplication], TApplication:MainWindow, frmMain

        set     [frmMain], TWindow:Visible, TRUE                ; must be set visible after creation, because it loads

                                                                ; needed images in OnCreate event handler.

        stdcall Run


.finish:
        FinalizeAll
        stdcall TerminateAll, 0



; Sample event handlers. They work with other objects on the form.

proc FormOnCreate as TObject.OnCreate
begin
        DebugMsg "Form OnCreate event handler."
        return
endp


proc FormOnDestroy as TObject.OnDestroy
begin
        DebugMsg "MainForm destroy event handler."
        return
endp




proc LeftClick as TButton.OnClick
begin
        get     eax, [btnChild1], TButton:TextAlign
        and     eax, not dtfHAlignMask
        or      eax, dtfAlignLeft

        set     [btnChild1], TButton:TextAlign, eax
        return
endp


proc RightClick as TButton.OnClick
begin
        get     eax, [btnChild1], TButton:TextAlign
        and     eax, not dtfHAlignMask
        or      eax, dtfAlignRight

        set     [btnChild1], TButton:TextAlign, eax
        return
endp


proc CenterClick as TButton.OnClick
begin
        get     eax, [btnChild1], TButton:TextAlign
        and     eax, not dtfHAlignMask
        or      eax, dtfAlignCenter

        set     [btnChild1], TButton:TextAlign, eax
        return
endp

proc JustifyClick as TButton.OnClick
begin
        get     eax, [btnChild1], TButton:TextAlign
        and     eax, not dtfHAlignMask
        or      eax, dtfAlignJustify

        set     [btnChild1], TButton:TextAlign, eax
        return
endp


proc TopClick as TButton.OnClick
begin
        get     eax, [btnChild1], TButton:TextAlign
        and     eax, not dtfVAlignMask
        or      eax, dtfAlignTop

        set     [btnChild1], TButton:TextAlign, eax
        return
endp

proc MiddleClick as TButton.OnClick
begin
        get     eax, [btnChild1], TButton:TextAlign
        and     eax, not dtfVAlignMask
        or      eax, dtfAlignMiddle

        set     [btnChild1], TButton:TextAlign, eax
        return
endp

proc BottomClick as TButton.OnClick
begin
        get     eax, [btnChild1], TButton:TextAlign
        and     eax, not dtfVAlignMask
        or      eax, dtfAlignBottom

        set     [btnChild1], TButton:TextAlign, eax
        return
endp


proc Button1Click as TButton.OnClick
begin
        DebugMsg 'Button1 clicked'
        return
endp



proc Button2Click as TButton.OnClick
begin
        DebugMsg 'Button2 clicked'
        return
endp



proc MainFormOnClose as TForm.OnClose
begin
        DebugMsg "Main form OnClose event handler"
        clc
        return
endp



;proc PaintMainFormBG as TWindow.OnPaint
;begin
;
;; tile test background
;        mov     esi, [.self]
;        mov     edi, [.canvas]
;        mov     ebx, [imgTest]
;        xor     edx, edx
;
;        test    ebx, ebx
;        jz      .finish
;
;.yloop:
;
;        xor     ecx, ecx
;
;.xloop:
;        stdcall BlendImage, edi, ecx, edx, ebx, 0, 0, [ebx+TImage.width], [ebx+TImage.height]
;
;        add     ecx, [ebx+TImage.width]
;        cmp     ecx, [edi+TImage.width]
;        jb      .xloop
;
;        add     edx, [ebx+TImage.height]
;        cmp     edx, [edi+TImage.height]
;        jb      .yloop
;
;.finish:
;        return
;endp



;proc ButtonPaint as TWindow.OnPaint
;begin
;        stdcall DrawSolidRect, [.canvas], 40, 40, 140, 140, 0
;        return
;endp


proc ArrowLeftClick as TButton.OnClick
begin
        get     eax, [Progress1], TProgress:Pos

        dec     eax
        jns     @f

        mov     eax, 100

@@:
        set     [Progress1], TProgress:Pos, eax
        return
endp


proc ArrowRightClick as TButton.OnClick
begin
        get     eax, [Progress1], TProgress:Pos

        inc     eax
        cmp     eax, 100
        jbe     @f

        xor     eax, eax

@@:
        set     [Progress1], TProgress:Pos, eax
        return
endp




proc ErrorClick as TButton.OnClick
begin
        stdcall ShowMessage, [frmMain], smiError, "Dialog box test.", "This is test of common dialog boxes.", smbOK
        return
endp



proc WarningClick as TButton.OnClick
begin
        stdcall ShowMessage, [frmMain], smiWarning, "Dialog box test.", "This is test of common dialog boxes.", smbOK
        return
endp



proc QuestionClick as TButton.OnClick
begin
        stdcall ShowMessage, [frmMain], smiQuestion, "Dialog box test.", "This is test of common dialog boxes.", smbYes or smbNo or smbMaybe
        return
endp



proc InfoClick as TButton.OnClick
begin
        stdcall ShowMessage, [frmMain], smiInformation, "Dialog box test.", "This is test of common dialog boxes.", smbOK or smbCancel
        return
endp



Added freshlib/test_code0/TestNewGUI.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestOldTemplates.asm.































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable GUI application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"
include "%lib%/gui/OldTemplates.inc"

@BinaryType GUI, compact

options.ShowSizes = 0

ThemeGUI equ win_gui

include "%lib%/freshlib.asm"


; include your includes here.
include "TestOldTemplates.frm"

start:
        InitializeAll

        create  [pApplication], TApplication

        call    GUI.Init

        stdcall CreateFromTemplate, frmMain.template, 0

        set     [pApplication], TApplication:MainWindow, frmMain

        set     [frmMain], TForm:Visible, TRUE

        stdcall Run

        FinalizeAll
        stdcall TerminateAll, 0

Added freshlib/test_code0/TestOldTemplates.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestOldTemplates.frm.











































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
;<ff
Window frmMain, 3, 0, 'TForm', 'TForm window', $6080000, $0, 0, 411, 230, 587, 443, OnCreate = FormOnCreate;
Window tvFolders, 0, 0, 'SysTreeView32', 'TreeView', $50800002, $200, 0, 0, 48, 576, 368, 0;
Window NONE, 0, 0, 'BUTTON', 'Read', $50000000, $0, 0, 248, 16, 64, 25, OnClick = SetTreeSample;
Window NONE, 0, 0, 'BUTTON', 'Button', $50000000, $0, 0, 504, 16, 64, 25, OnClick = Button2Click;
Window editDir, 2, 0, 'EDIT', 'Edit', $50000080, $200, 0, 0, 16, 241, 21, OnCreate = EditOnCreate;
;ff>


iglobal

if ThemeGUI eq win_gui
  getfile imgArrowRight, '_test_images/right2.png'
  getfile imgFolder, "_test_images/folder2.png"
  getfile imgFile,   "_test_images/document2.png"
end if


if ThemeGUI eq flat_gui
  getfile imgArrowRight, '_test_images/right.png'
  getfile imgFolder, "_test_images/folder.png"
  getfile imgFile,   "_test_images/document.png"
end if

endg


uglobal
  iconArrowRight dd ?
  iconFolder     dd ?
  iconFile       dd ?
endg


proc FormOnCreate as TObject.OnCreate
begin

        stdcall CreateImagePNG, imgArrowRight, imgArrowRight.size
        mov     [iconArrowRight], eax

        stdcall CreateImagePNG, imgFolder, imgFolder.size
        mov     [iconFolder], eax

        stdcall CreateImagePNG, imgFile, imgFile.size
        mov     [iconFile], eax

        return
endp



; This is the old form file.

proc Button2Click as TButton.OnClick
begin
        pushad

        get     ebx, [.self], TButton:Caption
        stdcall StrToNumEx, ebx

        inc     eax
        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        mov     edi, eax

        set     [.self], TButton:Caption, edi

        stdcall StrDel, ebx
        stdcall StrDel, edi

        popad
        return
endp




proc EditOnCreate as TObject.OnCreate
begin

      if TargetOS eq Win32

        set     [editDir], TEdit:Text, txt "c:\"

      else

        set     [editDir], TEdit:Text, txt "/home"

      end if

        return
endp






proc SetTreeSample as TButton.OnClick
begin
        pushad

        get     edi, [frmMain], TWindow:Cursor

        stdcall GetStockCursor, mcWait
        push    eax

        mov     eax, [frmMain]
        stdcall SetMouseCursor, [eax+TWindow.handle]

        stdcall ProcessSystemEvents

        mov     esi, [tvFolders]
        get     ebx, [editDir], TEdit:Text
        mov     edx, [esi+TTreeView._items]

        stdcall DeleteArrayItems, edx, 0, [edx+TArray.count]

        stdcall ___DoReadDir, ebx, edx, -1
        mov     [esi+TTreeView._items], edx
        jc      .error

.finish:
        stdcall StrDel, ebx

        OutputValue "Files tree items:", [edx+TArray.count], 10, 8

        exec    esi, TTreeView:__RebuildWidths
        exec    esi, TTreeView:__RebuildIndex
        exec    esi, TTreeView:UpdateScrollBar
        exec    esi, TWindow:Refresh

        set     [frmMain], TWindow:Cursor, edi

        popad
        return

.error:
        stdcall GetErrorString, eax
        push    eax

        stdcall ShowMessage, [frmMain], smiError, "File error", eax, smbOK

        stdcall FreeErrorString ; from the stack
        jmp     .finish

endp




proc ___DoReadDir, .hDir, .pArray, .Level
begin
        pushad

        mov     edx, [.pArray]
        mov     ebx, [.Level]
        inc     ebx

        stdcall DirectoryRead, [.hDir]
        jc      .finish

        mov     esi, eax
        xor     ecx, ecx


        stdcall SortDirArray, esi, fdsByType

.loop:
        cmp     ecx, [esi+TArray.count]
        jae     .end_loop

        stdcall StrPtr, [esi+TArray.array + 8*ecx + TDirItem.hFilename]

        cmp     byte [eax], "."
        je      .next

        stdcall AddArrayItems, edx, 1

        push    [esi+TArray.array + 8*ecx + TDirItem.hFilename]         ; name
        pop     [eax+TTreeViewItem.caption]
        mov     [eax+TTreeViewItem.level], ebx
        mov     [eax+TTreeViewItem.state], tvisExpanded

        push    edx

        mov     edx, [iconFolder]
        cmp     [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
        je      @f

        mov     edx, [iconFile]
        cmp     [esi+TArray.array + 8*ecx + TDirItem.Type], ftFile
        je      @f

        xor     edx, edx

@@:
        mov     [eax+TTreeViewItem.imgNormal], edx

        pop     edx

        cmp     [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
        jne     .next

        stdcall StrDup, [.hDir]
        push    eax

        stdcall StrCharCat, eax, "/"
        stdcall StrCat, eax, [esi+TArray.array + 8*ecx + TDirItem.hFilename]

        stdcall ___DoReadDir, eax, edx, ebx

        stdcall StrDel ; from the stack

.next:
        inc     ecx
        jmp     .loop

.end_loop:
        stdcall FreeMem, esi

        clc
        xor     eax, eax

.finish:
        mov     [esp+regEAX*4], eax
        mov     [esp+regEDX*4], edx
        popad
        return
endp

Added freshlib/test_code0/TestPNG.asm.













































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI, compact

options.DebugMode = 1
options.ShowSizes = 1
options.SkipZeroSizes = 1
options.DebugMode.XSync = 0
options.DebugMode.XErrors =0

include "%lib%/freshlib.asm"


iglobal
TemplateMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain, \
                     x = 100,        \
                     y = 50,         \
                     width = 640,    \
                     height = 480,   \
                     Visible = FALSE, \
                     OnDestroy = FormOnDestroy,  \
                     Caption = 'Fresh portable Win32/Linux application test.'

          ObjTemplate  tfChild, TButton, btnChild1,          \
                     x = 48,         \
                     y = 48,         \
                     width = 160,     \
                     height = 48,    \
                     TextAlign = dtfAlignLeft or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Button 1',        \
                     Visible = TRUE, \
                     Icon = pngIcon,      \
                     OnClick = Button1Click

          ObjTemplate  tfChild or tfEnd, TButton, btnChild2,          \
                     x = 48,         \
                     y = 100,         \
                     width = 160,     \
                     height = 48,    \
                     TextAlign = dtfAlignLeft or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Button 2',        \
                     Visible = TRUE;, \
;                     OnClick = Button2Click

endg


rb 1223

uglobal
  ignore dd ?
endg


start:
        InitializeAll

        create  [pApplication], TApplication

        stdcall GUI.Init

;        stdcall TestBackground


        stdcall CreateFromTemplate, TemplateMainForm, 0
        set     [pApplication], TApplication:MainWindow, frmMain
        set     [frmMain], TWindow:Visible, TRUE

        stdcall Run

        FinalizeAll
        stdcall TerminateAll, 0



; Sample event handlers. They work with other objects on the form.

proc FormOnDestroy, .self
begin
        DebugMsg "MainForm destroy event handler."
        return
endp


proc Button3Click as TButton.OnClick
begin
        DebugMsg 'Button3 clicked'
        return
endp


macro pnglist list, [name] {
common
  label list dword
forward
local ..lbl, ..size
        dd  ..lbl, ..size

common
        dd  $0

forward

   ..lbl file name
   ..size = $ - ..lbl
}

iglobal
  pnglist PngFiles, '_test_images/allpng/0_1.png', '_test_images/allpng/0_2.png',       \
                    '_test_images/allpng/0_4.png', '_test_images/allpng/0_8.png',       \
                    '_test_images/allpng/0_16.png', '_test_images/allpng/2_8.png',      \
                    '_test_images/allpng/2_16.png', '_test_images/allpng/png7.png',     \
                    '_test_images/allpng/3_1.png', '_test_images/allpng/3_2.png',       \
                    '_test_images/allpng/3_4.png', '_test_images/allpng/3_8.png',       \
                    '_test_images/allpng/3_1a.png', '_test_images/allpng/3_2a.png',     \
                    '_test_images/allpng/3_4a.png', '_test_images/allpng/3_8a.png',     \
                    '_test_images/allpng/4_8.png', '_test_images/allpng/4_16.png',      \
                    '_test_images/allpng/6_8.png', '_test_images/allpng/6_16.png'

  pngIcon file '_test_images/ball.png'
  pngBackground file '_test_images/allpng/back2.png'
  sizeof.pngBackground = $ - pngBackground

endg


xStart = 200
xMax   = 520
yStart = 10
xStep = 80
yStep = 80


proc Button1Click as TButton.OnClick
.img dd ?
begin
        pushad

        DebugMsg 'Button1 clicked'

        stdcall CreateImagePNG, pngBackground, sizeof.pngBackground
        mov     [.img], eax

        mov     edi, PngFiles
        mov     ecx, xStart
        mov     edx, yStart

.loop:
        cmp     dword [edi], 0
        je      .finish_demo

        stdcall CreateImagePNG, [edi], [edi+4]
        jc      .finish_demo
        mov     esi, eax

        add     edi, 8

        stdcall BlendImage, [.img], ecx, edx, esi, 0, 0, [esi+TImage.width], [esi+TImage.height]

        stdcall DestroyImage, esi

        add     ecx, xStep
        cmp     ecx, xMax
        jb      .loop

        mov     ecx, xStart
        add     edx, yStep
        jmp     .loop

.finish_demo:

        get     ebx, [frmMain], TWindow:Screen
        mov     esi, [.img]

        stdcall BlendImage, ebx, 0, 0, esi, 0, 0, [esi+TImage.width], [esi+TImage.height]

        mov     eax, [frmMain]
        stdcall _RefreshWindowRect, [eax+TWindow.handle], 0, 0, [eax+TWindow.width], [eax+TWindow.height]

        DebugMsg "Draw on window"
.end:
        popad
        return
endp



;proc Button2Click as TButton.OnClick
;.context dd ?
;.bkgnd dd ?
;.work dd ?
;.art  dd ?
;.frames dd ?
;.fps    dd ?
;.font   dd ?
;begin
;        pushad
;
;        DebugMsg 'Button2 clicked'
;
;        stdcall FontCreate, 'DejaVu', 20, 1000, 0
;        mov     [.font], eax
;
;        mov     eax, [frmMain]
;        stdcall __AllocateContext, [eax+TWindow.handle]
;        mov     [.context], eax
;
;        stdcall __SetDrawMode, eax, cmCopy
;
;        stdcall CreateImagePNG, pngBackground, sizeof.pngBackground
;        mov     [.bkgnd], eax
;
;        stdcall CreateImagePNG, pngBackground, sizeof.pngBackground
;        mov     [.work], eax
;
;        stdcall CreateImagePNG, [PngFiles+7*8], [PngFiles+7*8+4]
;        mov     [.art], eax
;
;        stdcall GetTimestamp
;        mov     edi, eax
;        neg     edi
;
;        xor     eax, eax        ; x
;        xor     ebx, ebx        ; y
;
;        mov     ecx, 2          ; dx
;        mov     edx, 1          ; dy
;
;        mov     esi, 100000
;
;        mov     [.frames], 0
;
;.loop:
;        push    eax
;
;        stdcall ProcessSystemEvents
;        jc      .terminate
;
;        pop     eax
;
;        stdcall CopyImageRect, [.work], 0, 0, [.bkgnd], 0, 0, 640, 480
;
;
;        stdcall BlendImage, [.work], eax, ebx, [.art], 0, 0, 200, 200
;
;        neg     eax
;        add     eax, 586
;
;        stdcall BlendImage, [.work], eax, ebx, [.art], 0, 0, 200, 200
;
;        neg     ebx
;        add     ebx, 416
;
;        stdcall BlendImage, [.work], eax, ebx, [.art], 0, 0, 200, 200
;
;        neg     eax
;        add     eax, 586
;
;        stdcall BlendImage, [.work], eax, ebx, [.art], 0, 0, 200, 200
;
;        neg     ebx
;        add     ebx, 416
;
;        add     eax, ecx
;
;        test    ecx, ecx
;        js      .checkxm
;
;        cmp     eax, 586
;        jge     .changex
;        jmp     .xok
;
;.checkxm:
;        cmp     eax, 0
;        jge     .xok
;
;.changex:
;        neg     ecx
;
;.xok:
;        add     ebx, edx
;
;        test    edx, edx
;        js      .checkym
;
;        cmp     ebx, 416
;        jge     .changey
;        jmp     .yok
;
;.checkym:
;        cmp     ebx, 0
;        jge     .yok
;
;.changey:
;        neg     edx
;
;.yok:
;        push    eax ebx ecx edx
;
;        stdcall GetTimestamp
;        lea     ecx, [eax+edi]
;        cmp     ecx, 300
;        jl      .inc_frames
;
;        mov     edi, eax
;        neg     edi
;
;        mov     eax, [.frames]
;        cdq
;        div     ecx
;        mov     [.fps], eax
;
;        test    eax, eax
;        jnz     @f
;        int3
;@@:
;        mov     [.frames], 0
;        jmp     .display_fps
;
;.inc_frames:
;        add     [.frames], 1000
;
;.display_fps:
;        stdcall NumToStr, [.fps], ntsDec or ntsUnsigned
;        mov     ecx, eax
;
;        stdcall StrDupMem, cTxtLabel
;        mov     edx, eax
;
;        stdcall StrCat, edx, ecx
;        stdcall StrDel, ecx
;        stdcall StrCharCat, edx, ' fps'
;
;        stdcall DrawString2, [.work], edx, 20, 370, [.font], $40ff0000
;
;        stdcall DrawImage, [.context], [.work], 0, 0
;
;        stdcall StrDel, edx
;
;        pop     edx ecx ebx eax
;
;; change speed
;
;        cmp     [.frames], 0
;        jne     @f
;
;        test    edi, 1
;        jz      @f
;
;        inc     ecx
;        inc     edx
;
;@@:
;
;        cmp     ecx, 4
;        jle     @f
;
;        mov     ecx, 4
;
;@@:
;        cmp     ecx, -4
;        jge     @f
;
;        mov     ecx, -4
;
;@@:
;
;        cmp     edx, 4
;        jle     @f
;
;        mov     edx, 4
;
;@@:
;        cmp     edx, -4
;        jge     @f
;
;        mov     edx, -4
;
;@@:
;
;
;        dec     esi        ; frame count
;        jnz     .loop
;
;        stdcall DrawImage, [.context], [.bkgnd], 0, 0
;
;        stdcall DestroyImage, [.bkgnd]
;        stdcall DestroyImage, [.work]
;        stdcall DestroyImage, [.art]
;
;        stdcall __ReleaseContext, [.context]
;        stdcall FontDestroy2, [.font]
;
;        popad
;        return
;
;.terminate:
;        pop     eax
;        popad
;        stdcall TerminateAll, 0
;
;endp



cTxtLabel file 'unicode_emo.txt'
          dd 0

Added freshlib/test_code0/TestPNG.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestResizeEvents.asm.



































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;   Description: Very simple test application for FreshLib.
;                The content may change arbitrary.
;
;   Target OS: All/Linux/Win32 - depending on current test needs.
;
;   Dependencies:
;
;   Notes: The main test program calls "PrepareDemo" procedure.
;_________________________________________________________________________________________

__TestGround:

; Global data...
iglobal

__TestData:

frmMainForm:
        ObjTemplate  tfParent or tfEnd, Form, frmMain, \
                     x, 300,        \
                     y, 250,        \
                     width, 360,    \
                     height, 240,   \
                     Visible, TRUE, \
                     Caption, 'FreshLib minimal application test.'

           ObjTemplate tfChild or tfEnd, Button, btnOpenModal,                      \
                       x, 50,                                                       \
                       y, 50,                                                       \
                       width, 120,                                                  \
                       height, 75,                                                  \
                       Visible, TRUE,                                               \
                       TextAlign, dtfAlignCenter or dtfAlignMiddle or dtfWordWrap , \
                       Caption, 'Click to resize the window.',             \
                       borderKind, borderFull,                                              \
                       OnClick, TestResize

__TestDataSize = $ - __TestData
endg




proc PrepareDemo
begin
        stdcall CreateFromTemplate, frmMainForm, 0
        mov     ecx, [pApplication]
        mov     [ecx+TApplication.MainWindow], frmMain

        return
endp



proc TestResize, .self, .button
.bounds TBounds
begin
        push    eax ecx

        mov     [.bounds.x], 100
        mov     [.bounds.y], 100
        mov     [.bounds.width], 640
        mov     [.bounds.height], 480


        mov     eax, [frmMain]
        lea     ecx, [.bounds]
        stdcall _SetWindowBounds, [eax+TWindow.handle], ecx


;        mov     [.bounds.x], 100
;        mov     [.bounds.y], 100
;        mov     [.bounds.width], 320
;        mov     [.bounds.height], 240
;
;
;        mov     eax, [frmMain]
;        lea     ecx, [.bounds]
;        stdcall _SetWindowBounds, [eax+TWindow.handle], ecx

        pop     ecx eax
        return
endp








DispSize 'Test ground dummy code:', ($-__TestGround)+__TestDataSize

Added freshlib/test_code0/TestRuntimeImport.asm.

















































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType console, compact

options.DebugMode = 0

include "%lib%/freshlib.asm"

uglobal
  sqliteOpen dd ?
endg


start:
        InitializeAll

        stdcall LibLoad, "./sqlite3.so"
        jc      .finish_error_load

        mov     ebx, eax

        stdcall LibImport, ebx, "sqlite3_open"
        jc      .finish_error_import

        mov     [sqliteOpen], eax

        stdcall FileWriteString, [STDERR], "Function sqlite3_open address: $"
        stdcall NumToStr, [sqliteOpen], ntsHex or ntsUnsigned or ntsFixedWidth + 8
        push    eax
        stdcall FileWriteString, [STDERR], eax
        stdcall StrDel ; from the stack
        stdcall FileWriteString, [STDERR], <txt 13, 10>

.lib_release:
        stdcall LibRelease, ebx

.finish:
        FinalizeAll
        stdcall TerminateAll, 0


.finish_error_load:
        stdcall GetErrorString, eax
        mov     ebx, eax

        stdcall FileWriteString, [STDERR], "Error loading library: "


        stdcall FileWriteString, [STDERR], ebx
        stdcall FreeErrorString, ebx

        stdcall FileWriteString, [STDERR], <txt 13, 10>
        jmp         .finish

.finish_error_import:

        OutputValue "Error importing object: ", eax, 10, -1
        jmp         .lib_release

Added freshlib/test_code0/TestRuntimeImport.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestSplitGrid.asm.



















































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI, compact

options.DebugMode = 0
  options.DebugMode.NoTimers = 1
  options.DebugMode.XSync = 0
  options.DebugMode.XErrors = 1

options.ShowSizes = 1
options.SkipZeroSizes = 1

ThemeGUI equ flat_gui

include "%lib%/freshlib.asm"

iglobal

TemplateMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain, \
                     x = 100,        \
                     y = 50,         \
                     width = 640,    \
                     height = 480,   \
                     OnCreate = FormOnCreate,    \
                     OnClose = MainFormOnClose,  \
                     OnDestroy = FormOnDestroy,  \
                     SplitGrid = SplitTest,      \
                     Visible = FALSE,            \
                     Caption = 'Split grids test form'

          ObjTemplate tfChild, TLabel, lblEmpty,                        \
                     SplitCell = SplitTest.cellEmpty,                   \
                     Caption = utf8_long,                                \
                     TextAlign = dtfAlignJustify or dtfAlignTop or dtfCRLF or dtfWordWrap,         \
                     Visible = TRUE

          ObjTemplate tfChild, TEdit, editDir,                 \
                     Text = "/home",          \
                     x = 10, y=10, width=370, height=24,       \
                     MarginLeft= 2,                            \
                     MarginRight= 2,                           \
                     OnCreate = EditOnCreate,                  \
                     SplitCell = SplitTest.cellEdit,           \
                     Visible = TRUE

          ObjTemplate tfChild, TButton, btnArrowRight,          \
                     x = 384,        \
                     y = 10,         \
                     width = 24,     \
                     height = 24,    \
                     Icon = imgArrowRight,      \
                     IconPosition = iposCenter,         \
                     SplitCell = SplitTest.cellButton,           \
                     Visible = TRUE,                             \
                     OnClick = ReadFolderClick

          ObjTemplate  tfChild or tfEnd, TTreeView, tvFolders,               \
                     x = 10, y = 40, width = 200, height = 200,              \
                     SplitCell = SplitTest.cellTree,                         \
                     OnFocusItem = TreeFocusItem,                            \
                     Visible = TRUE

include "UTF8_examples.asm"



SplitStart SplitTest

  Split stVert, 6, 24, 16, 48
    Split stHoriz or stOriginBR or stJustGap, 6, 64, 48, 200
      Cell cellEdit
      Cell cellButton

    Split stHoriz or stRelative, 6, 16384, 3000, 29000
      Cell cellTree
      Cell cellEmpty

SplitEnd


if ThemeGUI eq win_gui
  getfile imgArrowRight, '_test_images/right2.png'
  getfile imgFolder, "_test_images/folder2.png"
  getfile imgFile,   "_test_images/document2.png"
end if


if ThemeGUI eq flat_gui
  getfile imgArrowRight, '_test_images/right.png'

  getfile imgFolder, "_test_images/folder.png"
  getfile imgFile,   "_test_images/document.png"
end if


endg


uglobal
  iconFolder dd ?
  iconFile   dd ?
endg


;rb 423


start:
        InitializeAll

        create  [pApplication], TApplication

        stdcall GUI.Init

        stdcall CreateFromTemplate, TemplateMainForm, 0

        set     [pApplication], TApplication:MainWindow, frmMain

        set     [frmMain], TWindow:Visible, TRUE                ; must be set visible after creation, because it loads
                                                                ; needed images in OnCreate event handler.

        stdcall Run

        FinalizeAll
        stdcall TerminateAll, 0



; Sample event handlers. They work with other objects on the form.

proc FormOnCreate as TObject.OnCreate
begin
        DebugMsg "Form OnCreate event handler."

        stdcall CreateImagePNG, imgFolder, imgFolder.size
        mov     [iconFolder], eax

        stdcall CreateImagePNG, imgFile, imgFile.size
        mov     [iconFile], eax

        return
endp


proc EditOnCreate as TObject.OnCreate
begin

      if TargetOS eq Win32

        set     [editDir], TEdit:Text, txt "c:\"

      else

        set     [editDir], TEdit:Text, txt "/home"

      end if

        return
endp


proc FormOnDestroy as TObject.OnDestroy
begin
        DebugMsg "MainForm destroy event handler."
        return
endp


proc MainFormOnClose as TForm.OnClose
begin
        DebugMsg "Main form OnClose event handler"
        clc
        return
endp





proc TreeFocusItem as TTreeView.OnFocusItem
begin
        jmp     .finish
        mov     ebx, [.pItem]

        stdcall FileWriteString, [STDOUT], [ebx+TTreeViewItem.UserData]
        stdcall FileWriteString, [STDOUT], <txt 13, 10>

;        stdcall StrExtractExt, [ebx+TTreeViewItem.UserData]
;        jc      .finish
;
;        stdcall StrCompNoCase, eax, txt ".txt"
;        stdcall StrDel, eax
;        jnc     .finish


        stdcall LoadBinaryFile, [ebx+TTreeViewItem.UserData]
        jc      .finish

        push    eax

        set     [lblEmpty], TLabel:Caption, eax

        stdcall FreeMem ; from the stack

.finish:
        return
endp





proc ReadFolderClick as TButton.OnClick
begin
        pushad

        get     edi, [frmMain], TWindow:Cursor

        stdcall GetStockCursor, mcWait
        push    eax

        mov     eax, [frmMain]
        stdcall SetMouseCursor, [eax+TWindow.handle]

        stdcall ProcessSystemEvents

        mov     esi, [tvFolders]
;        get     ebx, [editDir], TEdit:Text
        mov     edx, [esi+TTreeView._items]

        stdcall DeleteArrayItems, edx, 0, [edx+TArray.count]

        stdcall ___DoReadDir, '/home', edx, -1          ;ebx, edx, -1
        mov     [esi+TTreeView._items], edx
        pushf
        push    eax

        stdcall StrDel, ebx

        OutputValue "Files tree items:", [edx+TArray.count], 10, 8

        exec    [tvFolders], TTreeView:__RebuildWidths
        exec    [tvFolders], TTreeView:__RebuildIndex
        exec    [tvFolders], TTreeView:UpdateScrollBar

        exec    [tvFolders], TWindow:RectChanged2, 0

        set     [frmMain], TWindow:Cursor, edi

        pop     eax
        popf
        jc      .error

        popad
        return

.error:
        stdcall GetErrorString, eax
        push    eax

        stdcall ShowMessage, [frmMain], smiError, "File error", eax, smbOK

        stdcall FreeErrorString ; from the stack
        popad
        return
endp




proc ___DoReadDir, .hDir, .pArray, .Level
begin
        pushad

        mov     edx, [.pArray]
        mov     ebx, [.Level]
        inc     ebx

        stdcall DirectoryRead, [.hDir]
        jc      .finish

        mov     esi, eax
        xor     ecx, ecx

        stdcall SortDirArray, esi, fdsByType

.loop:
        cmp     ecx, [esi+TArray.count]
        jae     .end_loop

        stdcall StrPtr, [esi+TArray.array + 8*ecx + TDirItem.hFilename]

        cmp     byte [eax], "."
        je      .next

;        Output  eax
;        DebugMsg ""

        stdcall StrDup, [.hDir]
        stdcall StrCharCat, eax, "/"
        stdcall StrCat, eax, [esi+TArray.array+8*ecx+TDirItem.hFilename]
        push    eax

        stdcall AddArrayItems, edx, 1

        push    [esi+TArray.array + 8*ecx + TDirItem.hFilename]         ; name
        pop     [eax+TTreeViewItem.caption]
        pop     [eax+TTreeViewItem.UserData]                            ; the full filename
        mov     [eax+TTreeViewItem.level], ebx
        mov     [eax+TTreeViewItem.state], tvisExpanded

        push    edx

        mov     edx, [iconFolder]
        cmp     [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
        je      @f

        mov     edx, [iconFile]
        cmp     [esi+TArray.array + 8*ecx + TDirItem.Type], ftFile
        je      @f

        xor     edx, edx

@@:
        mov     [eax+TTreeViewItem.imgNormal], edx

        pop     edx

        cmp     [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
        jne     .next

        stdcall StrDup, [.hDir]
        push    eax

        stdcall StrCharCat, eax, "/"
        stdcall StrCat, eax, [esi+TArray.array + 8*ecx + TDirItem.hFilename]

        stdcall ___DoReadDir, eax, edx, ebx

        stdcall StrDel ; from the stack

.next:
        inc     ecx
        jmp     .loop

.end_loop:
        stdcall FreeMem, esi

        clc
        xor     eax, eax

.finish:
        mov     [esp+regEAX*4], eax
        mov     [esp+regEDX*4], edx
        popad
        return
endp





Added freshlib/test_code0/TestSplitGrid.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestStripMacro.asm.











>
>
>
>
>
1
2
3
4
5
include "../macros/_datamacros.inc"

mytext StripText "TestStripMacro.sql", SQL


Added freshlib/test_code0/TestStripMacro.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestStripMacro.sql.



















































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
BEGIN TRANSACTION;

/* Data tables */

create table Params (
  id  text primary key,
  val text
);


insert into Params values ('user_perm', '29');	-- permLogin + permPost + permThreadStart + permEditOwn
insert into Params values ('file_cache', '0');
insert into Params values ('log_events', '0');


create table Users (
  id	    integer primary key autoincrement,
  nick	    text unique,
  passHash  text unique,
  salt	    text unique,
  status    integer,	     -- see permXXXXX constants.
  user_desc text,	     -- free text user description.
  avatar    blob,	     -- copy of the user avatar.
  email     text unique,     -- user email.
  Register  integer,	     -- the time when the user has activated the account.
  LastSeen  integer	     -- the time when the user has been last seen by taking some action.
);


create view UsersX as select *, (select count(1) from Posts as P where P.UserID = U.id) as PostCount from Users as U;

create index idxUsers_nick on Users (nick);
create index idxUsers_email on Users (email);


create table WaitingActivation(
  id integer primary key,
  nick text unique,
  passHash text unique,
  salt	text unique,
  email text unique,
  ip_from text unique,
  time_reg   integer,
  time_email integer,
  a_secret text unique
);



create table Threads (
  id	      integer primary key autoincrement,
  Slug	      text unique,
  Caption     text,
  LastChanged integer,
  Pinned      integer default 0
);


create index idxThreads_LastChanged on Threads (LastChanged desc);
create index idxThreads_Slug	    on Threads (Slug);



create table Posts (
  id	      integer primary key autoincrement,
  threadID    integer references Threads(id) on delete cascade,
  userID      integer references Users(id) on delete cascade,

  postTime    integer,	-- based on postTime the posts are sorted in the thread.
  ReadCount   integer,
  Content     text
);


create index idxPosts_UserID   on Posts (userID);
create index idxPosts_ThreadID on Posts (threadID);
-- create index idxPosts_Time	  on Posts (postTime, id);


create table Tags (
  Tag	      text primary key,
  Importance  integer not null default 0,
  Description text
);


/* Relation tables */

create table ThreadTags (
  ThreadID integer references Threads(id) on delete cascade,
  Tag	   text references Tags(Tag) on delete cascade on update cascade
);


create unique index idxThreadTagsUnique on ThreadTags ( ThreadID, Tag );


create table UnreadPosts (
  UserID integer references Users(id) on delete cascade,
  PostID integer references Posts(id) on delete cascade,
  Time	 integer
);


create unique index idxUnreadPosts on UnreadPosts(UserID, PostID);


create table Attachements (
  id	   integer primary key autoincrement,
  postID   integer references Posts(id) on delete cascade,
  filename text,
  notes    text,
  file	   blob
);



create table Sessions (
  userID    integer references Users(id) on delete cascade,
  fromIP    text,
  sid	    text,
  last_seen integer,
  ticket    text,
  unique (userID, fromIP)
);



create table Messages (
  id	 text primary key,
  msg	 text,
  header text,
  link	 text
);



insert into Messages VALUES ('login_bad_password','Login incorrect.
Only perfect spellers may
enter this system.','Incorrect user or password!',NULL);


insert into Messages VALUES ('register_passwords_different','Passwords different.
Only perfect spellers may
register this forum.','Not matching passwords!',NULL);


insert into Messages VALUES ('register_short_pass','Short password
has been chosen. However,
I disagree !','The password is too short!',NULL);


insert into Messages VALUES ('login_missing_data','So many fields,
you have to fill.
Missed some.','Empty field!',NULL);


insert into Messages VALUES ('register_user_exists','With this nickname
you will never succeed!
It is taken.','Not available nickname!',NULL);


insert into Messages VALUES ('register_short_name','Short nick is not an
advantage, but burden.
Get longer.','The nickname too short!',NULL);


insert into Messages VALUES ('register_short_email','Queer email,
never saw alike before.
Don''t like it!','Too short email address!',NULL);


insert into Messages VALUES ('register_technical','Foreboding of evil,
quick shadow in very cold day.
A server is dying.','Server problem!',NULL);


insert into Messages VALUES ('user_created','Just step remains,
the secret, magic mail
you shall receive.','Yes!','<a target="_self" href="/list/">Home</a>');


insert into Messages VALUES ('congratulations','It happened,
the journey ended at the door.
You''re welcome.','Hooray!','<a target="_self" href="/login/">Come in</a>');


insert into Messages VALUES ('bad_secret','Defeats and wins
take turns each other.
Now is the first.','Oh, no!','<a target="_self" href="/list/">Home</a>');


insert into Messages VALUES ('login_bad_permissions','You are a sinner,
because some man of power
have banned you.','Forbidden!',NULL);


insert into Messages VALUES ('error_cant_post','You can''t post here,
still have no privileges.
Or have no longer.','Missing privileges!',NULL);


insert into Messages VALUES ('error_cant_create_threads','New thread,
new hurricane of passions,
but not for you.','Can''t start threads!',NULL);


insert into Messages VALUES ('register_bad_email','This email
does not looks like real.
It shall not pass!','Invalid email address!',NULL);


insert into Messages VALUES ('error_post_not_exists','With searching comes loss
and the presence of absence:
post not exists.','Missing post!',NULL);


insert into Messages VALUES ('error_cant_write','Write has failed.
I can''t tell you where or why.
Lazy programmers.','Unknown error!',NULL);


insert into Messages VALUES ('error_thread_not_exists','With searching comes loss
and the presence of absence:
thread not exists.','Missing thread!',NULL);


insert into Messages VALUES ('error_invalid_caption','The title is
missing, it''s pointless
to post, after all.','Empty title!',NULL);


insert into Messages VALUES ('error_invalid_content','Silence is golden.
But try to be silent without
posting void.','Empty post body!',NULL);


insert into Messages VALUES ('register_bot','Attempt to cheat
was miserable failure.
So, shame on you!','Cheat attempt detected!',NULL);


insert into Messages VALUES ('error_bad_ticket','Simple, deep, and still.
The old masters were patient.
Without desires.','Can''t post right now!',NULL);


insert into Messages VALUES ('password_changed','Your worthy password,
successfully has been changed.
You''r on the safe side.','Pasword changed!','<a target="_self" href="/login/">Login</a>');


insert into Messages VALUES ('change_different','Passwords different.
Only perfect spellers may
change their password.','Not matching passwords!',NULL);


insert into Messages VALUES ('change_password','Your present password,
you must provide as evidence
of your intentions.','Password does not match!',NULL);


insert into Messages VALUES ('email_activation_sent','The secret token
was sent to your new email.
To check the channel.','Check your mailbox!',NULL);


insert into Messages VALUES ('email_changed','The new address to send
a messages will never change
the old relationship.','E-mail has been changed!','<a target="_self" href="/list/">Home</a>');


insert into Messages VALUES ('error_cant_delete','You can''t delete it,
still have no privileges.
Or have no longer.','Missing privileges!',NULL);



create table FileCache (
  filename  text primary key,
  content   blob,
  changed   integer
);


create table Events (
  id   integer primary key autoincrement,
  name text
);



insert into Events values (1,'ScriptStart');
insert into Events values (2,'RequestStart');
insert into Events values (3,'RequestEnd');
insert into Events values (4,'Error');
insert into Events values (5,'ScriptEnd');
insert into Events values (6,'ThreadStart');
insert into Events values (7,'ThreadEnd');
insert into Events values (8,'RequestServeStart');
insert into Events values (9,'RequestServeEnd');



create table Log (
  process_id integer,								     -- the unique process id
  timestamp  integer,
  event      integer references events(id) on delete cascade on update cascade,      -- what event is logged - start process, end process, start request, end request
  value      text,								     -- details in variable form.
  runtime    integer
);



create table ProcessID (
  id integer primary key autoincrement
);


create table Templates (
  id text primary key,
  template text
);


CREATE VIRTUAL TABLE PostFTS using fts5( `Content`, content=Posts, content_rowid=id, tokenize='porter unicode61 remove_diacritics 1');


CREATE TRIGGER PostsAI AFTER INSERT ON Posts BEGIN
  INSERT INTO PostFTS(rowid, Content) VALUES (new.id, new.Content);
END;

CREATE TRIGGER PostsAD AFTER DELETE ON Posts BEGIN
  INSERT INTO PostFTS(PostFTS, rowid, Content) VALUES('delete', old.id, old.Content);
END;

CREATE TRIGGER PostsAU AFTER UPDATE ON Posts BEGIN
  INSERT INTO PostFTS(PostFTS, rowid, Content) VALUES('delete', old.id, old.Content);
  INSERT INTO PostFTS(rowid, Content) VALUES (new.id, new.Content);
END;




COMMIT;

Added freshlib/test_code0/TestTV.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestTVmain.asm.



































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI, compact

options.DebugMode = 0
  options.DebugMode.NoTimers = 0
  options.DebugMode.XSync = 0
  options.DebugMode.XErrors =0

options.ShowSizes = 1
options.SkipZeroSizes = 1

ThemeGUI equ flat_gui
;ThemeGUI equ win_gui

include "%lib%/freshlib.asm"


iglobal

TemplateMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain,         \
                     x = 100,                                   \
                     y = 50,                                    \
                     width = 418,                               \
                     height = 250,                              \
                     OnCreate = FormOnCreate,                   \
                     OnClose = MainFormOnClose,                 \
                     OnDestroy = FormOnDestroy,                 \
                     SplitGrid = SplitTest,                     \
                     Caption = 'The new GUI toolkit test form.'


          ObjTemplate tfChild, TEdit, editDir,                  \
                     Text = "/home",                            \
                     MarginLeft= 2,                             \
                     MarginRight= 2,                            \
                     OnCreate = EditOnCreate,                   \
                     SplitCell = SplitTest.cellEdit,            \
                     Visible = TRUE

          ObjTemplate  tfChild, TButton, btnArrowRight,         \
                     Icon = imgArrowRight,                     \
                     IconPosition = iposCenter,                 \
                     SplitCell = SplitTest.cellButton,          \
                     OnClick = ReadFolderClick,                 \
                     Visible = TRUE

          ObjTemplate  tfChild or tfEnd, TTreeView, tvFolders,  \
                     SplitCell = SplitTest.cellTree,            \
                     Visible = TRUE




SplitStart SplitTest

  Split stVert or stJustGap , 4, 24, 16, 48
    Split stHoriz or stOriginBR or stJustGap, 4, 64, 48, 200
      Cell cellEdit
      Cell cellButton

    Cell cellTree

SplitEnd


if ThemeGUI eq win_gui
  getfile imgArrowRight, '_test_images/right2.png'
  getfile imgFolder, "_test_images/folder2.png"
  getfile imgFile,   "_test_images/document2.png"
end if


if ThemeGUI eq flat_gui
  getfile imgArrowRight, '_test_images/right.png'

  getfile imgFolder, "_test_images/folder.png"
  getfile imgFile,   "_test_images/document.png"
end if


endg


uglobal
  iconFolder dd ?
  iconFile   dd ?
endg


;rb 423


start:
        InitializeAll

        create  [pApplication], TApplication

        stdcall GUI.Init

        stdcall CreateFromTemplate, TemplateMainForm, 0

        set     [pApplication], TApplication:MainWindow, frmMain

        set     [frmMain], TWindow:Visible, TRUE                ; must be set visible after creation, because it loads
                                                                ; needed images in OnCreate event handler.

        stdcall Run

        FinalizeAll
        stdcall TerminateAll, 0



; Sample event handlers. They work with other objects on the form.

proc FormOnCreate as TObject.OnCreate
begin
        DebugMsg "Form OnCreate event handler."

;        stdcall CreateImagePNG, imgArrowRight, imgArrowRight.size
;        mov     [iconArrowRight], eax

        stdcall CreateImagePNG, imgFolder, imgFolder.size
        mov     [iconFolder], eax

        stdcall CreateImagePNG, imgFile, imgFile.size
        mov     [iconFile], eax

        return
endp


proc EditOnCreate as TObject.OnCreate
begin

      if TargetOS eq Win32

        set     [editDir], TEdit:Text, txt "c:\"

      else

        set     [editDir], TEdit:Text, txt "/home"

      end if

        return
endp


proc FormOnDestroy as TObject.OnDestroy
begin
        DebugMsg "MainForm destroy event handler."
        return
endp


proc MainFormOnClose as TForm.OnClose
begin
        DebugMsg "Main form OnClose event handler"
        clc
        return
endp







proc ReadFolderClick as TButton.OnClick
begin
        pushad

        get     edi, [frmMain], TWindow:Cursor

        stdcall GetStockCursor, mcWait
        push    eax

        mov     eax, [frmMain]
        stdcall SetMouseCursor, [eax+TWindow.handle]

        mov     esi, [tvFolders]
        get     ebx, [editDir], TEdit:Text

        stdcall ___DoReadDir, ebx, 0, tvisExpanded
        jc      .error

        set     esi, TTreeView:root, eax

.finish:
        stdcall StrDel, ebx

        set     [frmMain], TWindow:Cursor, edi

        mov     eax, [frmMain]
        stdcall SetMouseCursor, [eax+TWindow.handle], edi

        popad
        return

.error:
        stdcall GetErrorString, eax
        push    eax

        stdcall ShowMessage, [frmMain], smiError, "File error", eax, smbOK

        stdcall FreeErrorString ; from the stack
        jmp     .finish

endp



; Returns the first TItemTree element

proc ___DoReadDir, .hDir, .pParent, .fExpand
.first dd ?
begin
        pushad

        xor     eax, eax
        mov     [.first], eax

        stdcall DirectoryRead, [.hDir]
        jc      .finish

        mov     esi, eax

        stdcall SortArray, esi, DirItemCompare, dsByExt or fdsDirsFirst

        xor     ecx, ecx
        xor     ebx, ebx

.loop:
        cmp     ecx, [esi+TArray.count]
        jae     .end_loop

        lea     edi, [3*ecx]
        stdcall StrPtr, [esi+TArray.array + 8*edi + TDirItem.hFilename]

        cmp     byte [eax], "."
        je      .next

        stdcall GetMem, sizeof.TTVItem
        mov     [eax + TTVItem.prev], ebx
        test    ebx, ebx
        jnz     .not_first

        mov     [.first], eax
        stdcall TreeAppendChild, eax, [.pParent]
        jmp     .cont

.not_first:
        stdcall TreeInsAfter, eax, ebx

.cont:
        mov     ebx, eax

        push    [esi+TArray.array + 8*edi + TDirItem.hFilename] [.fExpand]
        pop     [ebx+TTVItem.state] [ebx+TTVItem.caption]

        mov     edx, [iconFolder]
        cmp     [esi+TArray.array + 8*edi + TDirItem.Type], ftDirectory
        je      @f

        mov     edx, [iconFile]
        cmp     [esi+TArray.array + 8*edi + TDirItem.Type], ftFile
        je      @f

        xor     edx, edx

@@:
        mov     [ebx+TTVItem.imgNormal], edx

        cmp     [esi+TArray.array + 8*edi + TDirItem.Type], ftDirectory
        jne     .next

        stdcall StrDup, [.hDir]
        push    eax

        stdcall StrCharCat, eax, "/"
        stdcall StrCat, eax, [esi+TArray.array + 8*edi + TDirItem.hFilename]

        stdcall ___DoReadDir, eax, ebx, [.fExpand]
        stdcall StrDel ; from the stack

.next:
        inc     ecx
        jmp     .loop

.end_loop:
        stdcall FreeMem, esi

        clc
        mov     eax, [.first]

.finish:
        mov     [esp+regEAX*4], eax
        popad
        return
endp




Added freshlib/test_code0/TestText.asm.

















































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI, compact

options.DebugMode = 0
options.ShowSizes = 1
options.SkipZeroSizes = 1
options.DebugMode.XSync = 0
options.DebugMode.XErrors =0


include "%lib%/freshlib.asm"


iglobal
TemplateMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain, \
                     x = 100,        \
                     y = 50,         \
                     width = 1024,    \
                     height = 600,   \
                     Visible = FALSE, \
                     OnDestroy = FormOnDestroy,  \
                     Caption = 'Fresh portable Win32/Linux application test.'

          ObjTemplate  tfChild, TButton, btnChild1,          \
                     x = 48,         \
                     y = 48,         \
                     width = 80,     \
                     height = 48,    \
                     TextAlign = dtfAlignLeft or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Button BRAVO',        \
                     Visible = TRUE, \
                     OnClick = Button1Click

          ObjTemplate  tfChild or tfEnd, TButton, btnChild2,          \
                     x = 48,         \
                     y = 100,         \
                     width = 80,     \
                     height = 48,    \
                     TextAlign = dtfAlignLeft or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Button 2',        \
                     Visible = TRUE, \
                     OnClick = Button2Click
endg


rb 423




start:
        InitializeAll

        call    GUI.Init
        create  [pApplication], TApplication

        stdcall CreateFromTemplate, TemplateMainForm, 0
        set     [pApplication], TApplication:MainWindow, frmMain

        set     [frmMain], TForm:Visible, TRUE

        stdcall Run

        FinalizeAll
        stdcall TerminateAll, 0



; Sample event handlers. They work with other objects on the form.

proc FormOnDestroy, .self
begin
        DebugMsg "MainForm destroy event handler."
        return
endp



proc Button1Click as TButton.OnClick
begin
        pushad

        DebugMsg 'Button1 clicked'

        popad
        return
endp



proc Button2Click as TButton.OnClick
.font dd ?
.width dd ?
.height dd ?
.y      dd ?
.start  dd ?
begin
        pushad

;        DebugMsg 'Button2 clicked'
;
;        stdcall FontCreate, 'Ubuntu', 16, 900, ffUnderline
;        mov     [.font], eax
;
;        stdcall CreateImage, 1024, 600
;        mov     esi, eax
;
;        mov     edi, [frmMain]
;        stdcall AllocateContext, [edi+TWindow.handle]
;        mov     edi, eax
;
;        stdcall DrawSolidRect, esi, 0, 0, 1024, 600,  $ffd0d0d8
;        stdcall DrawSolidRect, esi, 320, 0, 320, 480, $ff0000ff
;
;        stdcall GetFontMetrics, [.font]
;        mov     [.height], eax
;
;
;        stdcall GetTimestamp
;        mov     [.start], eax
;
;        mov     edx, 7
;        mov     ecx, -100
;
;        mov     ecx, 1000
;        mov     [.y], 5
;
;.loop:
;; 85 characters text
;;        stdcall DrawString2, esi, 'uon ravo s s smpe ex, spaye y reeype rary usng reeype cace.', -1, 150, [.y], [.font], $ff000000
;        stdcall DrawString2, esi, 'Button BRAVO This is simple text, displayed by FreeType library using FreeType cache.', -1, 150, [.y], [.font], $ff000000
;
;        mov     [.width], eax
;
;        mov     edx, ebx
;        add     ebx, [.y]
;        neg     edx
;;        stdcall DrawSolidRect, esi, 150, ebx, eax, 1, $ffff0000
;;        stdcall DrawSolidRect, esi, 150, [.y], eax, 1, $ffff0000
;
;;        stdcall GetTextBounds2, 'Button BRAVO This is simple text, displayed by FreeType library using FreeType cache.', -1, [.font]
;
;        mov     eax, [.height]
;        add     [.y], eax
;
;        dec     ecx
;        jnz     .loop
;
;        stdcall GetTimestamp
;        sub     eax, [.start]
;
;        stdcall NumToStr, eax, ntsUnsigned or ntsDec
;        push    eax
;
;        stdcall StrPtr, eax
;        stdcall DrawString2, esi, eax, -1, 40, 500, [.font], $ff000000
;        stdcall StrDel ; from the stack
;
;        stdcall NumToStr, [.width], ntsDec or ntsSigned
;        push    eax
;
;        stdcall StrPtr, eax
;        stdcall DrawString2, esi, eax, -1, 40, 520, [.font], $ff000000
;        stdcall StrDel ; from the stack
;
;
;        stdcall NumToStr, [.height], ntsDec or ntsUnsigned
;        push    eax
;
;        stdcall StrPtr, eax
;        stdcall DrawString2, esi, eax, -1, 40, 540, [.font], $ff000000
;        stdcall StrDel ; from the stack
;
;
;
;
;        stdcall DrawImage, edi, esi, 0, 0
;
;        stdcall FontDestroy2, [.font]
;
        popad
        return
endp

Added freshlib/test_code0/TestText.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestThemes.asm.











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI, compact

options.DebugMode = 1
  options.DebugMode.NoTimers = 1
  options.DebugMode.XSync = 0
  options.DebugMode.XErrors =0

options.ShowSizes = 1
options.SkipZeroSizes = 0

options.WholeTheme = 1

ThemeGUI equ flat_gui

include "%lib%/freshlib.asm"


iglobal
TemplateMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain, \
                     x = 100,        \
                     y = 50,         \
                     width = 320,    \
                     height = 520,   \
                     OnCreate = FormOnCreate,    \
                     OnClose = MainFormOnClose,  \
                     OnDestroy = FormOnDestroy,  \
                     Caption = 'The new GUI toolkit test form.'

          ObjTemplate  tfChild, TLabel, NONE,                   \
                     x = 10, y = 10, width=400, height = 19,    \
                     Caption = "Load theme from file:",        \
                     Visible = TRUE


          ObjTemplate  tfChild, TButton, btnTheme1,         \
                     x = 10,         \
                     y = 32,         \
                     width = 128,     \
                     height = 24,    \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = "Theme Win",       \
                     Visible = TRUE, \
                     OnClick = LoadTheme1Click

          ObjTemplate  tfChild, TButton, btnTheme2,         \
                     x = 140,         \
                     y = 32,         \
                     width = 128,     \
                     height = 24,    \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = "Theme Flat",       \
                     Visible = TRUE, \
                     OnClick = LoadTheme2Click


          ObjTemplate  tfChild, TLabel, NONE,                   \
                     x = 10, y = 393, width=400, height = 19,    \
                     Caption = "Load/Save custom theme:",        \
                     Visible = TRUE


          ObjTemplate tfChild, TEdit, editTest,                 \
                     Text = "Theme.cfg",                        \
                     x = 10, y=415, width=168, height=24,       \
                     MarginLeft= 2,                            \
                     MarginRight= 2,                           \
                     Visible = TRUE

          ObjTemplate  tfChild, TButton, btnThemeSave,                                      \
                     x = 180, y = 415, width = 64, height = 24,                             \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Save',                                                      \
                     Visible = TRUE,                                                        \
                     OnClick = SaveThemeClick


          ObjTemplate  tfChild, TButton, btnThemeLoad,                                      \
                     x = 246, y = 415, width = 64, height = 24,                             \
                     TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
                     Caption = 'Load',                                                      \
                     Visible = TRUE,                                                        \
                     OnClick = LoadThemeClick

          ObjTemplate tfChild, TProgress, NONE,                         \
                     x = 10, y = 490, width = 300, height = 19,         \
                     Max = 100, Pos = 30,                               \
                     Visible = TRUE


          ObjTemplate tfChild or tfEnd, TTreeView, tvPreview,            \
                     x = 10, y = 64, width = 300, height = 300,          \
                     OnCreate = TreeOnCreate,                            \
                     Visible = TRUE





  getfile imgFolder1, "_test_images/folder2.png"
  getfile imgFile1,   "_test_images/document2.png"

  getfile imgFolder2, "_test_images/folder.png"
  getfile imgFile2,   "_test_images/document.png"

endg




uglobal
  iconFolder dd ?
  iconFile   dd ?
endg


;rb 423


start:
        InitializeAll


        create  [pApplication], TApplication

        call    GUI.Init

        stdcall CreateFromTemplate, TemplateMainForm, 0

        set     [pApplication], TApplication:MainWindow, frmMain

        set     [frmMain], TWindow:Visible, TRUE                ; must be set visible after creation, because it loads
                                                                ; needed images in OnCreate event handler.

        stdcall Run

        FinalizeAll
        stdcall TerminateAll, 0



; Sample event handlers. They work with other objects on the form.

proc FormOnCreate as TObject.OnCreate
begin
        DebugMsg "Form OnCreate event handler."

        if ThemeGUI eq win_gui

          stdcall  CreateIconSet1

        else

          stdcall  CreateIconSet2

        end if

        return
endp


proc FreeIconSet
begin
        xor     ecx, ecx

        cmp     [iconFolder], ecx
        je      @f
        stdcall DestroyImage, [iconFolder]
        mov     [iconFolder], ecx
@@:
        cmp     [iconFile], ecx
        je      @f
        stdcall DestroyImage, [iconFile]
        mov     [iconFile], ecx
@@:

        return
endp


proc CreateIconSet1
begin
        stdcall FreeIconSet

        stdcall CreateImagePNG, imgFolder1, imgFolder1.size
        mov     [iconFolder], eax

        stdcall CreateImagePNG, imgFile1, imgFile1.size
        mov     [iconFile], eax

        return
endp



proc CreateIconSet2
begin
        stdcall FreeIconSet

        stdcall CreateImagePNG, imgFolder2, imgFolder2.size
        mov     [iconFolder], eax

        stdcall CreateImagePNG, imgFile2, imgFile2.size
        mov     [iconFile], eax

        return
endp


proc TreeOnCreate as TObject.OnCreate
begin
        stdcall LoadExampleTreeContent, [.self]

        return
endp




proc FormOnDestroy as TObject.OnDestroy
begin
        DebugMsg "MainForm destroy event handler."
        return
endp



proc MainFormOnClose as TForm.OnClose
begin
        DebugMsg "Main form OnClose event handler"
        clc
        return
endp




proc LoadTheme1Click as TButton.OnClick
begin
        pushad

        stdcall LoadBinaryFile, "./theme_win.cfg"
        jc      .finish

        push    eax

        stdcall StringToNamedArray, GUI.meta, eax

        stdcall FreeMem ; from the stack.

        stdcall  CreateIconSet1
        stdcall LoadExampleTreeContent, [tvPreview]

        exec    [frmMain], TWindow:ForceRefresh

.finish:
        popad
        return
endp


proc LoadTheme2Click as TButton.OnClick
begin
        pushad

        stdcall LoadBinaryFile, "./theme_flat.cfg"
        jc      .finish

        push    eax

        stdcall StringToNamedArray, GUI.meta, eax

        stdcall FreeMem ; from the stack.

        stdcall  CreateIconSet2
        stdcall LoadExampleTreeContent, [tvPreview]

        exec    [frmMain], TWindow:ForceRefresh

.finish:
        popad
        return
endp


proc SaveThemeClick as TButton.OnClick
begin
        pushad

        get     ebx, [editTest], TEdit:Text

        stdcall NamedArrayToString, GUI.meta
        mov     edi, eax

        stdcall StrPtr, eax
        mov     esi, eax

        stdcall StrPtr, ebx

        stdcall SaveBinaryFile, eax, esi, [esi+string.len]

        stdcall StrDel, ebx
        stdcall StrDel, edi

        popad
        return
endp




proc LoadThemeClick as TButton.OnClick
begin
        pushad

        get     ebx, [editTest], TEdit:Text

        stdcall LoadBinaryFile, ebx
        jc      .finish

        push    eax

        stdcall StringToNamedArray, GUI.meta, eax

        stdcall FreeMem ; from the stack.

        exec    [frmMain], TWindow:ForceRefresh

.finish:
        stdcall StrDel, ebx
        popad
        return
endp




proc LoadExampleTreeContent, .pTreeView
begin
        pushad

        mov     esi, [.pTreeView]

        stdcall ___DoReadDir, txt ".", 0, tvisExpanded
        jc      .error

        set     esi, TTreeView:root, eax

        popad
        return

.error:
        stdcall GetErrorString, eax
        push    eax

        stdcall ShowMessage, [frmMain], smiError, "File error", eax, smbOK

        stdcall FreeErrorString ; from the stack
        popad
        return

endp



; Returns the first TItemTree element

proc ___DoReadDir, .hDir, .pParent, .fExpand
.first dd ?
begin
        pushad

        xor     eax, eax
        mov     [.first], eax

        stdcall DirectoryRead, [.hDir]
        jc      .finish

        mov     esi, eax

        stdcall SortArray, esi, DirItemCompare, dsByExt or fdsDirsFirst

        xor     ecx, ecx
        xor     ebx, ebx

.loop:
        cmp     ecx, [esi+TArray.count]
        jae     .end_loop

        lea     edi, [3*ecx]
        stdcall StrPtr, [esi+TArray.array + 8*edi + TDirItem.hFilename]

        cmp     byte [eax], "."
        je      .next

        stdcall GetMem, sizeof.TTVItem
        mov     [eax + TTVItem.prev], ebx
        test    ebx, ebx
        jnz     .not_first

        mov     [.first], eax
        stdcall TreeAppendChild, eax, [.pParent]
        jmp     .cont

.not_first:
        stdcall TreeInsAfter, eax, ebx

.cont:
        mov     ebx, eax

        push    [esi+TArray.array + 8*edi + TDirItem.hFilename] [.fExpand]
        pop     [ebx+TTVItem.state] [ebx+TTVItem.caption]

        mov     edx, [iconFolder]
        cmp     [esi+TArray.array + 8*edi + TDirItem.Type], ftDirectory
        je      @f

        mov     edx, [iconFile]
        cmp     [esi+TArray.array + 8*edi + TDirItem.Type], ftFile
        je      @f

        xor     edx, edx

@@:
        mov     [ebx+TTVItem.imgNormal], edx

        cmp     [esi+TArray.array + 8*edi + TDirItem.Type], ftDirectory
        jne     .next

        stdcall StrDup, [.hDir]
        push    eax

        stdcall StrCharCat, eax, "/"
        stdcall StrCat, eax, [esi+TArray.array + 8*edi + TDirItem.hFilename]

        stdcall ___DoReadDir, eax, ebx, [.fExpand]
        stdcall StrDel ; from the stack

.next:
        inc     ecx
        jmp     .loop

.end_loop:
        stdcall FreeMem, esi

        clc
        mov     eax, [.first]

.finish:
        mov     [esp+regEAX*4], eax
        popad
        return
endp

Added freshlib/test_code0/TestThemes.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/TestTreeView.asm.











































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license."          |
;|_______________________________________________________________________________________|
;
;   Description: TTreeView test application.
;
;   Target OS: All/Linux/Win32 - depending on current test needs.
;
;   Dependencies:
;
;   Notes: The main test program calls "PrepareDemo" procedure.
;_________________________________________________________________________________________

__TestGround:

iglobal

__TestData:
; This is a form template.
; It will be created by the visual editor.
; This template engine can contains any count of properties for every
; component of the template. Also it can contains non visual components
; such as action lists, image lists, etc.

TemplateMainForm:
        ObjTemplate  tfParent or tfEnd, TForm, frmMain, \
                     x = 100,        \
                     y = 50,         \
                     width = 656,    \
                     height = 496,   \
                     Visible = TRUE, \
                     OnDestroy = FormOnDestroy,  \
                     Caption = 'Fresh portable Win32/Linux application test.'

          ObjTemplate  tfChild or tfEnd, TTreeView, TreeView,         \
                     x = 0, y = 0, width = 500, height = 400,        \
                     Visible = TRUE


__TestDataSize = $ - __TestData

endg





; Sample event handlers. They work with other objects on the form.

proc FormOnDestroy, .self
begin
        DebugMsg "MainForm destroy event handler."
        return
endp



proc PrepareDemo
begin
        stdcall CreateFromTemplate, TemplateMainForm, 0
        set     [pApplication], TApplication:MainWindow, frmMain
        return
endp




DispSize 'Test ground dummy code:', ($-__TestGround)+__TestDataSize

Added freshlib/test_code0/ThemesConfigBuild.asm.













































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

@BinaryType GUI, compact

options.DebugMode = 0
  options.DebugMode.NoTimers = 1
  options.DebugMode.XSync = 0
  options.DebugMode.XErrors =0

options.ShowSizes = 1
options.SkipZeroSizes = 0

options.WholeTheme = 1

ThemeGUI equ

include "%lib%/freshlib.asm"


GUI fix ThemeFlat

include "%lib%/gui/themes/flat_gui.asm"

GUI fix ThemeWin

include "%lib%/gui/themes/win_gui.asm"


;rb 423


start:
        InitializeAll

        create  [pApplication], TApplication, 0

        call    ThemeFlat.Init
        call    ThemeWin.Init


; Save flat theme

        stdcall NamedArrayToString, ThemeFlat.meta
        push    eax

        stdcall StrPtr, eax
        mov     esi, eax

        stdcall SaveBinaryFile, "theme_flat.cfg", esi, [esi+string.len]

        stdcall StrDel ; from the stack


; Save win theme

        stdcall NamedArrayToString, ThemeWin.meta
        push    eax

        stdcall StrPtr, eax
        mov     esi, eax

        stdcall SaveBinaryFile, "theme_win.cfg", esi, [esi+string.len]

        stdcall StrDel ; from the stack


        destroy [pApplication]

        FinalizeAll
        stdcall TerminateAll, 0



; Sample event handlers. They work with other objects on the form.

proc FormOnCreate as TObject.OnCreate
begin
        DebugMsg "Form OnCreate event handler."

        if ThemeGUI eq win_gui

          stdcall  CreateIconSet1

        else

          stdcall  CreateIconSet2

        end if

        return
endp


proc FreeIconSet
begin
        xor     ecx, ecx

        cmp     [iconFolder], ecx
        je      @f
        stdcall DestroyImage, [iconFolder]
        mov     [iconFolder], ecx
@@:
        cmp     [iconFile], ecx
        je      @f
        stdcall DestroyImage, [iconFile]
        mov     [iconFile], ecx
@@:

        return
endp


proc CreateIconSet1
begin
        stdcall FreeIconSet

        stdcall CreateImagePNG, imgFolder1, imgFolder1.size
        mov     [iconFolder], eax

        stdcall CreateImagePNG, imgFile1, imgFile1.size
        mov     [iconFile], eax

        return
endp



proc CreateIconSet2
begin
        stdcall FreeIconSet

        stdcall CreateImagePNG, imgFolder2, imgFolder2.size
        mov     [iconFolder], eax

        stdcall CreateImagePNG, imgFile2, imgFile2.size
        mov     [iconFile], eax

        return
endp


proc TreeOnCreate as TObject.OnCreate
begin
        stdcall LoadExampleTreeContent, [.self]

        return
endp




proc FormOnDestroy as TObject.OnDestroy
begin
        DebugMsg "MainForm destroy event handler."
        return
endp



proc MainFormOnClose as TForm.OnClose
begin
        DebugMsg "Main form OnClose event handler"
        clc
        return
endp




proc LoadTheme1Click as TButton.OnClick
begin
        pushad

        stdcall LoadBinaryFile, "./theme_win.cfg"
        jc      .finish

        push    eax

        stdcall StringToNamedArray, GUI.meta, eax

        stdcall FreeMem ; from the stack.

        stdcall  CreateIconSet1
        stdcall LoadExampleTreeContent, [tvPreview]

        exec    [frmMain], TWindow:RefreshAll

.finish:
        popad
        return
endp


proc LoadTheme2Click as TButton.OnClick
begin
        pushad

        stdcall LoadBinaryFile, "./theme_flat.cfg"
        jc      .finish

        push    eax

        stdcall StringToNamedArray, GUI.meta, eax

        stdcall FreeMem ; from the stack.

        stdcall  CreateIconSet2
        stdcall LoadExampleTreeContent, [tvPreview]

        exec    [frmMain], TWindow:RefreshAll

.finish:
        popad
        return
endp


proc SaveThemeClick as TButton.OnClick
begin
        pushad

        get     ebx, [editTest], TEdit:Text

        stdcall NamedArrayToString, GUI.meta
        mov     edi, eax

        stdcall StrPtr, eax
        mov     esi, eax

        stdcall StrPtr, ebx

        stdcall SaveBinaryFile, eax, esi, [esi+string.len]

        stdcall StrDel, ebx
        stdcall StrDel, edi

        popad
        return
endp




proc LoadThemeClick as TButton.OnClick
begin
        pushad

        get     ebx, [editTest], TEdit:Text

        stdcall LoadBinaryFile, ebx
        jc      .finish

        push    eax

        stdcall StringToNamedArray, GUI.meta, eax

        stdcall FreeMem ; from the stack.

        exec    [frmMain], TWindow:RefreshAll

.finish:
        stdcall StrDel, ebx
        popad
        return
endp




proc LoadExampleTreeContent, .pTreeView
begin
        pushad

        mov     esi, [.pTreeView]
        mov     edx, [esi+TTreeView._items]

        stdcall DeleteArrayItems, edx, 0, [edx+TArray.count]

        stdcall ___DoReadDir, txt ".", edx, -1
        mov     [esi+TTreeView._items], edx
        jc      .error

.finish:

        OutputValue "Files tree items:", [edx+TArray.count], 10, 8

        exec    [.pTreeView], TTreeView:__RebuildIndex
        exec    [.pTreeView], TWindow:Refresh

        set     [frmMain], TWindow:Cursor, edi

        popad
        return

.error:
        stdcall GetErrorString, eax
        push    eax

        stdcall ShowMessage, [frmMain], smiError, "File error", eax, smbOK

        stdcall FreeErrorString ; from the stack
        jmp     .finish

endp




proc ___DoReadDir, .hDir, .pArray, .Level
begin
        pushad

        mov     edx, [.pArray]
        mov     ebx, [.Level]
        inc     ebx

        stdcall DirectoryRead, [.hDir]
        jc      .finish

        mov     esi, eax
        xor     ecx, ecx


        stdcall SortDirArray, esi, fdsByType

.loop:
        cmp     ecx, [esi+TArray.count]
        jae     .end_loop

        stdcall StrPtr, [esi+TArray.array + 8*ecx + TDirItem.hFilename]

        cmp     byte [eax], "."
        je      .next

;        Output  eax
;        DebugMsg ""

        stdcall AddArrayItems, edx, 1

        push    [esi+TArray.array + 8*ecx + TDirItem.hFilename]         ; name
        pop     [eax+TTreeViewItem.caption]
        mov     [eax+TTreeViewItem.level], ebx
        mov     [eax+TTreeViewItem.state], tvisExpanded

        push    edx

        mov     edx, [iconFolder]
        cmp     [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
        je      @f

        mov     edx, [iconFile]
        cmp     [esi+TArray.array + 8*ecx + TDirItem.Type], ftFile
        je      @f

        xor     edx, edx

@@:
        mov     [eax+TTreeViewItem.imgNormal], edx

        pop     edx

        cmp     [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
        jne     .next

        stdcall StrDup, [.hDir]
        push    eax

        stdcall StrCharCat, eax, "/"
        stdcall StrCat, eax, [esi+TArray.array + 8*ecx + TDirItem.hFilename]

        stdcall ___DoReadDir, eax, edx, ebx

        stdcall StrDel ; from the stack

.next:
        inc     ecx
        jmp     .loop

.end_loop:
        stdcall FreeMem, esi

        clc
        xor     eax, eax

.finish:
        mov     [esp+regEAX*4], eax
        mov     [esp+regEDX*4], edx
        popad
        return
endp


Added freshlib/test_code0/ThemesConfigBuild.fpr.

cannot compute difference between binary files

Added freshlib/test_code0/UTF8_examples.asm.











>
>
>
>
>
1
2
3
4
5
  utf8_string db $49, $C3, $B1, $74, $C3, $AB, $72, $6E, $C3, $A2, $74, $69, $C3, $B4, $6E, $C3, $A0, $6C, $69, $7A, $C3, $A6, $74, $69, $C3, $B8, $6E, $00 ; the word "Internationalization" written with different languages chars

; greek, cyrillic and latin in one text.
  utf8_long   file 'UnicodeSample.txt'
              dd 0

Added freshlib/test_code0/UnicodeSample.txt.

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
Russian: Я могу еÑÑ‚ÑŒ Ñтекло, оно мне не вредит.
Yoruba: Mo lè je̩ dígí, kò ní pa mí lára.
Chinese: 我能åžä¸‹çŽ»ç’ƒè€Œä¸ä¼¤èº«ä½“。
Greek: ΜποÏÏŽ να φάω σπασμένα γυαλιά χωÏίς να πάθω τίποτα.
Québécois: J'peux manger d'la vitre, ça m'fa pas mal.
Ukrainian: Я можу Ñ—Ñти Ñкло, Ñ– воно мені не зашкодить.

Това е един много дълъг параграф, в който Ñе говори за това, че мога да конÑумирам неорганични Ñиликатни аморфни материали без вреда за здравето или материалното ми положение.

Added freshlib/test_code0/UnicodeSampleEng.txt.



>
1
The main goal of Fresh is to make programming in assembly as fast and efficient as in other visual languages, without sacrificing the small application size and the raw power of assembly language. Because Fresh is the logical continuation of the FASM project in the area of visual programming, it is perfectly compatible with FASM and you can use all your knowledge about FASM to program in Fresh.

Added freshlib/test_code0/_test_images/allpng/0_1.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/0_16.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/0_2.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/0_4.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/0_8.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/2_16.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/2_8.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/3_1.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/3_1a.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/3_2.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/3_2a.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/3_4.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/3_4a.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/3_8.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/3_8a.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/4_16.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/4_8.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/6_16.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/6_8.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/back2.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/png5.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/png6.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/allpng/png7.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/background.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/ball.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/document.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/document2.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/folder.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/folder2.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/globe.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/img_list.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/left.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/menu.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/right.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/right2.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/speech.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/star.png.

cannot compute difference between binary files

Added freshlib/test_code0/_test_images/svg/Red_sphere.svg.







































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.0"
   width="128"
   height="128"
   id="svg2"
   sodipodi:docname="Red_sphere.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibDev/freshlib/test_code0/_test_images/ball.png"
   inkscape:export-xdpi="18"
   inkscape:export-ydpi="18"
   inkscape:version="0.92.0 r">
  <metadata
     id="metadata23">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview21"
     showgrid="false"
     inkscape:current-layer="svg2" />
  <defs
     id="defs5">
    <linearGradient
       id="linearGradient2816">
      <stop
         style="stop-color:#a20000;stop-opacity:1"
         offset="0"
         id="stop2818" />
      <stop
         style="stop-color:white;stop-opacity:1"
         offset="1"
         id="stop2820" />
    </linearGradient>
    <linearGradient
       id="linearGradient2794">
      <stop
         style="stop-color:#545454;stop-opacity:1"
         offset="0"
         id="stop2796" />
      <stop
         style="stop-color:#545454;stop-opacity:1"
         offset="0.9464286"
         id="stop2804" />
      <stop
         style="stop-color:#c5c5c5;stop-opacity:0"
         offset="1"
         id="stop2798" />
    </linearGradient>
    <linearGradient
       id="linearGradient2760">
      <stop
         style="stop-color:red;stop-opacity:1"
         offset="0"
         id="stop2762" />
      <stop
         style="stop-color:#a20000;stop-opacity:1"
         offset="0.61160713"
         id="stop2768" />
      <stop
         style="stop-color:#f66;stop-opacity:1"
         offset="1"
         id="stop2764" />
    </linearGradient>
    <linearGradient
       x1="6.9292336"
       y1="121.07077"
       x2="6.9292336"
       y2="8.9609833"
       id="linearGradient2766"
       xlink:href="#linearGradient2760"
       gradientUnits="userSpaceOnUse" />
    <radialGradient
       cx="62.984127"
       cy="65.015877"
       r="54.179893"
       fx="62.984127"
       fy="65.015877"
       id="radialGradient2812"
       xlink:href="#linearGradient2794"
       gradientUnits="userSpaceOnUse" />
    <linearGradient
       x1="31.5"
       y1="63"
       x2="31.5"
       y2="12"
       id="linearGradient2822"
       xlink:href="#linearGradient2816"
       gradientUnits="userSpaceOnUse" />
  </defs>
  <path
     d="M 117.16402 65.015877 A 54.179893 54.179893 0 1 1  8.8042336,65.015877 A 54.179893 54.179893 0 1 1  117.16402 65.015877 z"
     transform="translate(5.724864,4.031744)"
     style="opacity:1;fill:url(#radialGradient2812);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
     id="path2790" />
  <path
     d="M 117.16402 65.015877 A 54.179893 54.179893 0 1 1  8.8042336,65.015877 A 54.179893 54.179893 0 1 1  117.16402 65.015877 z"
     transform="translate(1.69312,0)"
     style="opacity:1;fill:url(#linearGradient2766);fill-opacity:1;fill-rule:nonzero;stroke:#740000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
     id="path1873" />
  <path
     d="M 95.5 37.5 A 32 25.5 0 1 1  31.5,37.5 A 32 25.5 0 1 1  95.5 37.5 z"
     transform="translate(1,2)"
     style="opacity:1;fill:url(#linearGradient2822);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
     id="path2814" />
</svg>

Added freshlib/test_code0/_test_images/svg/background.svg.

































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="528"
   height="352"
   viewBox="0 0 139.7 93.133336"
   version="1.1"
   id="svg8"
   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
   sodipodi:docname="background.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/NoCanvasGUI/freshlib/test_code0/_test_images/background2.png"
   inkscape:export-xdpi="96"
   inkscape:export-ydpi="96">
  <defs
     id="defs2" />
  <sodipodi:namedview
     id="base"
     pagecolor="#000000"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageopacity="1"
     inkscape:pageshadow="2"
     inkscape:zoom="0.35"
     inkscape:cx="400"
     inkscape:cy="560"
     inkscape:document-units="mm"
     inkscape:current-layer="layer1"
     showgrid="false"
     units="px"
     fit-margin-top="0"
     fit-margin-left="0"
     fit-margin-right="0"
     fit-margin-bottom="0" />
  <metadata
     id="metadata5">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g
     inkscape:label="Layer 1"
     inkscape:groupmode="layer"
     id="layer1"
     transform="translate(0,-203.86665)">
    <g
       id="g4710"
       inkscape:tile-cx="5.8208332"
       inkscape:tile-cy="84.13749"
       inkscape:tile-w="11.641666"
       inkscape:tile-h="11.641666"
       inkscape:tile-x0="0"
       inkscape:tile-y0="78.316657"
       transform="translate(0,-81.491655)"
       style="fill:#b55832;fill-opacity:1">
      <rect
         ry="1.0583333"
         rx="1.0583333"
         y="285.88748"
         x="0.52916664"
         height="10.583333"
         width="10.583333"
         id="rect3699"
         style="opacity:1;vector-effect:none;fill:#b55832;fill-opacity:1;stroke:none;stroke-width:0.26458332" />
    </g>
    <g
       transform="translate(0,-69.849989)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4714"
       style="fill:#db993a;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#db993a;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect4965"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(0,-58.20832)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4716"
       style="fill:#d4dd5e;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#d4dd5e;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect4969"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(0,-46.56666)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4718"
       style="fill:#b15c38;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#b15c38;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect4973"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(0,-34.92499)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4720"
       style="fill:#cbba6c;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#cbba6c;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect4977"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(0,-23.28332)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4722"
       style="fill:#db5831;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#db5831;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect4981"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(0,-11.64166)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4724"
       style="fill:#de5426;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#de5426;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect4985"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(0,1e-5)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4726"
       style="fill:#c48529;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#c48529;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect4989"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(11.641666,-81.491655)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4728"
       style="fill:#dc532f;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#dc532f;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect4993"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="matrix(1,0,0,2.1000001,11.641666,-384.32632)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4730"
       style="fill:#a9e6e7;fill-opacity:1;stroke-width:0.69006556">
      <rect
         style="opacity:1;vector-effect:none;fill:#a9e6e7;fill-opacity:1;stroke:none;stroke-width:0.18257982"
         id="rect4997"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="0.50396818" />
    </g>
    <g
       transform="translate(11.641666,-46.56666)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4734"
       style="fill:#bac3a2;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#bac3a2;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5005"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(11.641666,-34.92499)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4736"
       style="fill:#b95f36;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#b95f36;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5009"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(11.641666,-23.28332)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4738"
       style="fill:#d99838;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#d99838;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5013"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(11.641666,-11.64166)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4740"
       style="fill:#64321c;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#64321c;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5017"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(11.641666,1e-5)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4742"
       style="fill:#8f5b47;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#8f5b47;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5021"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(23.283333,-81.491655)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4744"
       style="fill:#f2eaad;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#f2eaad;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5025"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(23.283333,-69.849989)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4746"
       style="fill:#858054;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#858054;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5029"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(23.283333,-58.20832)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4748"
       style="fill:#62311b;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#62311b;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5033"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(23.283333,-46.56666)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4750"
       style="fill:#f2eaad;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#f2eaad;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5037"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(23.283333,-34.92499)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4752"
       style="fill:#b44730;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#b44730;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5041"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(23.283333,-23.28332)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4754"
       style="fill:#d9ad2f;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#d9ad2f;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5045"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="matrix(2.1000001,0,0,1,22.70125,-11.64166)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4756"
       style="stroke-width:0.69006556;fill:#a9e6e7;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#a9e6e7;fill-opacity:1;stroke:none;stroke-width:0.18257983"
         id="rect5049"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="0.50396824"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(23.283333,1e-5)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4758"
       style="fill:#e0b137;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#e0b137;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5053"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(34.924999,-81.491655)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4760"
       style="fill:#b8b34f;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#b8b34f;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5057"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(34.924999,-69.849989)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4762"
       style="fill:#e5d274;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#e5d274;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5061"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(34.924999,-58.20832)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4764"
       style="fill:#dc5123;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#dc5123;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5065"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(34.925,-23.283331)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4766"
       style="fill:#e7d578;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#e7d578;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5069"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="matrix(1,0,0,2.1000001,34.924999,-361.04292)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4770"
       style="fill:#683725;fill-opacity:1;stroke-width:0.69006556">
      <rect
         style="opacity:1;vector-effect:none;fill:#683725;fill-opacity:1;stroke:none;stroke-width:0.18257983"
         id="rect5077"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="0.50396824" />
    </g>
    <g
       transform="translate(34.924999,1e-5)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4774"
       style="fill:#926636;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#926636;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5085"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(46.566666,-81.491655)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4776"
       style="fill:#ae3e29;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#ae3e29;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5089"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(46.566666,-69.849989)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4778"
       style="fill:#d9ac2f;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#d9ac2f;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5093"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(46.566666,-58.20832)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4780"
       style="fill:#c17e26;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#c17e26;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5097"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(46.566666,-46.56666)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4782"
       style="fill:#9c5d31;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#9c5d31;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5101"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(46.566666,-34.92499)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4784"
       style="fill:#66563c;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#66563c;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5105"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(46.566666,-23.28332)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4786"
       style="fill:#797548;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#797548;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5109"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(46.566666,-11.64166)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4788"
       style="fill:#b7b34f;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#b7b34f;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5113"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(46.566666,1e-5)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4790"
       style="fill:#974b33;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#974b33;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5117"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(58.208332,-81.491655)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4792"
       style="fill:#b95d34;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#b95d34;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5121"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(58.208332,-69.849989)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4794"
       style="fill:#da9738;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#da9738;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5125"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(58.208332,-58.20832)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4796"
       style="fill:#868473;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#868473;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5129"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(58.208332,-46.56666)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4798"
       style="fill:#7d6d50;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#7d6d50;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5133"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(58.208332,-34.92499)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4800"
       style="fill:#c7b566;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#c7b566;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5137"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(58.208332,-23.28332)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4802"
       style="fill:#da512d;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#da512d;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5141"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(58.208332,-11.64166)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4804"
       style="fill:#9f9050;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#9f9050;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5145"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(58.208332,1e-5)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4806"
       style="fill:#af6d25;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#af6d25;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5149"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(69.849998,-81.491655)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4808"
       style="fill:#bcc1a3;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#bcc1a3;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5153"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(69.849998,-69.849989)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4810"
       style="fill:#db552f;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#db552f;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5157"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(69.849998,-58.20832)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4812"
       style="fill:#b29f5c;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#b29f5c;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5161"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(69.849998,-46.56666)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4814"
       style="fill:#b6752d;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#b6752d;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5165"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(69.849998,-34.92499)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4816"
       style="fill:#b55b34;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#b55b34;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5169"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(69.849998,-23.28332)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4818"
       style="fill:#d88e30;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#d88e30;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5173"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(69.849998,-11.64166)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4820"
       style="fill:#7d7d6d;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#7d7d6d;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5177"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(69.849998,1e-5)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4822"
       style="fill:#726243;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#726243;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5181"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="matrix(1,0,0,2.1000001,81.491665,-395.9679)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4826"
       style="stroke-width:0.69006556;fill:#edd18f;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#edd18f;fill-opacity:1;stroke:none;stroke-width:0.18257983"
         id="rect5189"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="0.50396824" />
    </g>
    <g
       transform="translate(81.491665,-58.20832)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4828"
       style="fill:#b7b34f;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#b7b34f;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5193"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="matrix(2.1000001,0,0,1,80.909582,-46.56666)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4830"
       style="fill:#974b33;fill-opacity:1;stroke-width:0.69006556">
      <rect
         style="opacity:1;vector-effect:none;fill:#974b33;fill-opacity:1;stroke:none;stroke-width:0.18257983"
         id="rect5197"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="0.50396824"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(81.491665,-34.92499)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4832"
       style="fill:#af402b;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#af402b;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5201"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(81.491665,-23.28332)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4834"
       style="fill:#d9ac2f;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#d9ac2f;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5205"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(81.491665,-11.64166)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4836"
       style="fill:#c38128;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#c38128;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5209"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(81.491665,1e-5)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4838"
       style="fill:#9a592e;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#9a592e;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5213"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(93.133331,-81.491655)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4840"
       style="fill:#73422e;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#73422e;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5217"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(93.133331,-69.849989)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4842"
       style="fill:#e4d171;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#e4d171;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5221"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(93.133331,-58.20832)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4844"
       style="fill:#cdd951;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#cdd951;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5225"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(93.133331,-34.92499)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4848"
       style="fill:#653423;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#653423;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5233"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(93.133331,-23.28332)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4850"
       style="fill:#e2d06b;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#e2d06b;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5237"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(93.133331,-11.64166)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4852"
       style="fill:#dc481e;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#dc481e;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5241"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(93.133331,1e-5)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4854"
       style="fill:#a98b43;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#a98b43;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5245"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(104.775,-81.491655)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4856"
       style="fill:#b44731;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#b44731;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5249"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(104.775,-69.849989)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4858"
       style="fill:#d8a92d;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#d8a92d;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5253"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(104.775,-58.20832)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4860"
       style="fill:#a0ba9b;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#a0ba9b;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5257"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(104.775,-46.56666)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4862"
       style="fill:#ebdac3;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#ebdac3;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5261"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(104.775,-34.92499)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4864"
       style="fill:#e9d8c1;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#e9d8c1;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5265"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(104.775,-23.28332)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4866"
       style="fill:#ecdbc2;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#ecdbc2;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5269"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(104.775,-11.64166)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4868"
       style="fill:#592915;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#592915;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5273"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(104.775,1e-5)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4870"
       style="fill:#f0e8aa;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#f0e8aa;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5277"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(116.41666,-81.491655)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4872"
       style="fill:#be663a;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#be663a;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5281"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(116.41666,-69.849989)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4874"
       style="fill:#d78a2e;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#d78a2e;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5285"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(116.41666,-58.20832)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4876"
       style="fill:#efe7a8;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#efe7a8;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5289"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(116.41666,-46.56666)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4878"
       style="fill:#88523d;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#88523d;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5293"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(116.41666,-34.92499)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4880"
       style="fill:#c3b062;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#c3b062;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5297"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(116.41666,-23.28332)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4882"
       style="fill:#db512d;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#db512d;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5301"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(116.41666,-11.64166)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4884"
       style="fill:#a6bea5;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#a6bea5;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5305"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(116.41666,1e-5)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4886"
       style="fill:#adb694;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#adb694;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5309"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(128.05833,-81.491655)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4888"
       style="fill:#c7b567;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#c7b567;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5313"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="matrix(1,0,0,2.1000001,128.05833,-384.32623)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4892"
       style="fill:#dc5b34;fill-opacity:1;stroke-width:0.69006556">
      <rect
         style="opacity:1;vector-effect:none;fill:#dc5b34;fill-opacity:1;stroke:none;stroke-width:0.18257983"
         id="rect5321"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="0.50396824" />
    </g>
    <g
       transform="translate(128.05833,-46.56666)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4894"
       style="fill:#c38228;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#c38228;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5325"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(128.05833,-34.92499)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4896"
       style="fill:#b35631;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#b35631;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5329"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(128.05833,-23.28332)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4898"
       style="fill:#d68a2d;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#d68a2d;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5333"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(128.05833,-11.64166)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4900"
       style="fill:#ccd94d;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#ccd94d;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5337"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
    <g
       transform="translate(128.05833,1e-5)"
       inkscape:tile-y0="78.316657"
       inkscape:tile-x0="0"
       id="use4902"
       style="fill:#a85134;fill-opacity:1">
      <rect
         style="opacity:1;vector-effect:none;fill:#a85134;fill-opacity:1;stroke:none;stroke-width:0.26458332"
         id="rect5341"
         width="10.583333"
         height="10.583333"
         x="0.52916664"
         y="285.88748"
         rx="1.0583333"
         ry="1.0583333" />
    </g>
  </g>
</svg>

Added freshlib/test_code0/_test_images/svg/document.svg.



















































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="46.259px"
   height="46.259px"
   viewBox="0 0 46.259 46.259"
   style="enable-background:new 0 0 46.259 46.259;"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="document.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/test_code0/_test_images/document.png"
   inkscape:export-xdpi="31"
   inkscape:export-ydpi="31"><metadata
     id="metadata45"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
     id="defs43" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview41"
     showgrid="false"
     inkscape:zoom="12.12737"
     inkscape:cx="10.059889"
     inkscape:cy="23.129499"
     inkscape:current-layer="Capa_1" /><g
     id="g3"
     transform="matrix(0.9,0,0,0.9,2.3129,2.31295)"
     style="fill:#9b59b6;fill-opacity:1"><g
       id="g5"
       style="fill:#9b59b6;fill-opacity:1"><path
         d="m 35.043,13.514 c -3.405,0 -6.164,-2.749 -6.164,-6.153 l 0,-6.564 C 28.879,0.357 28.523,0 28.082,0 L 8.278,0 C 5.738,0 3.671,2.06 3.671,4.6 l 0,37.059 c 0,2.54 2.067,4.6 4.607,4.6 l 29.7,0 c 2.541,0 4.609,-2.06 4.609,-4.6 l 0,-27.348 c 0,-0.44 -0.355,-0.797 -0.797,-0.797 l -6.747,0 z"
         id="path7"
         inkscape:connector-curvature="0"
         style="fill:#9b59b6;fill-opacity:1" /><path
         d="m 35.043,10.395 5.519,0 c 0.321,0 0.612,-0.194 0.735,-0.493 C 41.42,9.604 41.351,9.261 41.122,9.034 39.106,7.03 35.36,3.31 33.352,1.327 33.123,1.101 32.782,1.035 32.485,1.159 32.19,1.282 31.997,1.572 31.997,1.893 l 0,5.468 c 0.001,1.665 1.38,3.034 3.046,3.034 z"
         id="path9"
         inkscape:connector-curvature="0"
         style="fill:#9b59b6;fill-opacity:1" /></g></g><g
     id="g11" /><g
     id="g13" /><g
     id="g15" /><g
     id="g17" /><g
     id="g19" /><g
     id="g21" /><g
     id="g23" /><g
     id="g25" /><g
     id="g27" /><g
     id="g29" /><g
     id="g31" /><g
     id="g33" /><g
     id="g35" /><g
     id="g37" /><g
     id="g39" /></svg>

Added freshlib/test_code0/_test_images/svg/folder.svg.













































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="841.5px"
   height="841.5px"
   viewBox="0 0 841.5 841.5"
   style="enable-background:new 0 0 841.5 841.5;"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="folder.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/test_code0/_test_images/folder.png"
   inkscape:export-xdpi="1.7112299"
   inkscape:export-ydpi="1.7112299"><metadata
     id="metadata45"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
     id="defs43" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview41"
     showgrid="false"
     inkscape:zoom="0.66666667"
     inkscape:cx="183"
     inkscape:cy="420.75"
     inkscape:current-layer="Capa_1" /><g
     id="g3"
     style="fill:#f39c12;fill-opacity:1;fill-rule:nonzero"><g
       id="g5"
       style="fill:#f39c12;fill-opacity:1;fill-rule:nonzero"><path
         d="M460.8,143.4c-12.9-24.8-38.6-40.4-66.5-40.4H50c-27.6,0-50,22.4-50,50v26.8h479.7L460.8,143.4z"
         id="path7"
         style="fill:#f39c12;fill-opacity:1;fill-rule:nonzero" /><path
         d="M791.6,224.8H0v463.7c0,27.601,22.4,50,50,50h741.5c27.6,0,50-22.399,50-50V274.8C841.6,247.2,819.2,224.8,791.6,224.8z"
         id="path9"
         style="fill:#f39c12;fill-opacity:1;fill-rule:nonzero" /></g></g><g
     id="g11" /><g
     id="g13" /><g
     id="g15" /><g
     id="g17" /><g
     id="g19" /><g
     id="g21" /><g
     id="g23" /><g
     id="g25" /><g
     id="g27" /><g
     id="g29" /><g
     id="g31" /><g
     id="g33" /><g
     id="g35" /><g
     id="g37" /><g
     id="g39" /></svg>

Added freshlib/test_code0/_test_images/svg/left.svg.























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 width="493.578px" height="493.578px" viewBox="0 0 493.578 493.578" style="enable-background:new 0 0 493.578 493.578;"
	 xml:space="preserve">
<g>
	<path d="M487.267,225.981c0-17.365-13.999-31.518-31.518-31.518H194.501L305.35,83.615c12.24-12.24,12.24-32.207,0-44.676
		L275.592,9.18c-12.24-12.24-32.207-12.24-44.676,0L15.568,224.527c-6.12,6.12-9.256,14.153-9.256,22.262
		c0,8.032,3.136,16.142,9.256,22.262l215.348,215.348c12.24,12.239,32.207,12.239,44.676,0l29.758-29.759
		c12.24-12.24,12.24-32.207,0-44.676L194.501,299.498h261.094c17.366,0,31.519-14.153,31.519-31.519L487.267,225.981z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Added freshlib/test_code0/_test_images/svg/menu.svg.









































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="92.833px"
   height="92.833px"
   viewBox="0 0 92.833 92.833"
   style="enable-background:new 0 0 92.833 92.833;"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="menu.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/test_code0/_test_images/menu.png"
   inkscape:export-xdpi="15.511725"
   inkscape:export-ydpi="15.511725"><metadata
     id="metadata47"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
     id="defs45" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview43"
     showgrid="false"
     inkscape:zoom="8.7314773"
     inkscape:cx="28.263787"
     inkscape:cy="45.62978"
     inkscape:current-layer="Capa_1" /><g
     id="g3"><g
       id="g5"><path
         d="M89.834,1.75H3c-1.654,0-3,1.346-3,3v13.334c0,1.654,1.346,3,3,3h86.833c1.653,0,3-1.346,3-3V4.75    C92.834,3.096,91.488,1.75,89.834,1.75z"
         id="path7" /><path
         d="M89.834,36.75H3c-1.654,0-3,1.346-3,3v13.334c0,1.654,1.346,3,3,3h86.833c1.653,0,3-1.346,3-3V39.75    C92.834,38.096,91.488,36.75,89.834,36.75z"
         id="path9" /><path
         d="M89.834,71.75H3c-1.654,0-3,1.346-3,3v13.334c0,1.654,1.346,3,3,3h86.833c1.653,0,3-1.346,3-3V74.75    C92.834,73.095,91.488,71.75,89.834,71.75z"
         id="path11" /></g></g><g
     id="g13" /><g
     id="g15" /><g
     id="g17" /><g
     id="g19" /><g
     id="g21" /><g
     id="g23" /><g
     id="g25" /><g
     id="g27" /><g
     id="g29" /><g
     id="g31" /><g
     id="g33" /><g
     id="g35" /><g
     id="g37" /><g
     id="g39" /><g
     id="g41" /></svg>

Added freshlib/test_code0/_test_images/svg/right.svg.





































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   width="493.578px"
   height="493.578px"
   viewBox="0 0 493.578 493.578"
   style="enable-background:new 0 0 493.578 493.578;"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="right.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/test_code0/_test_images/right2.png"
   inkscape:export-xdpi="2.9200001"
   inkscape:export-ydpi="2.9200001"><metadata
     id="metadata41"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
     id="defs39" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview37"
     showgrid="false"
     inkscape:zoom="1.6422313"
     inkscape:cx="246.789"
     inkscape:cy="238.42327"
     inkscape:current-layer="Capa_1" /><g
     id="g3"
     transform="matrix(-1,0,0,1,493.579,0)"
     style="fill:#404040;fill-opacity:1"><path
       d="m 487.267,225.981 c 0,-17.365 -13.999,-31.518 -31.518,-31.518 l -261.248,0 L 305.35,83.615 c 12.24,-12.24 12.24,-32.207 0,-44.676 L 275.592,9.18 c -12.24,-12.24 -32.207,-12.24 -44.676,0 L 15.568,224.527 c -6.12,6.12 -9.256,14.153 -9.256,22.262 0,8.032 3.136,16.142 9.256,22.262 l 215.348,215.348 c 12.24,12.239 32.207,12.239 44.676,0 L 305.35,454.64 c 12.24,-12.24 12.24,-32.207 0,-44.676 l -110.849,-110.466 261.094,0 c 17.366,0 31.519,-14.153 31.519,-31.519 l 0.153,-41.998 z"
       id="path5"
       inkscape:connector-curvature="0"
       style="fill:#404040;fill-opacity:1" /></g><g
     id="g7"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g9"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g11"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g13"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g15"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g17"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g19"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g21"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g23"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g25"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g27"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g29"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g31"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g33"
     transform="matrix(-1,0,0,1,493.579,0)" /><g
     id="g35"
     transform="matrix(-1,0,0,1,493.579,0)" /></svg>

Added freshlib/test_code0/_test_images/svg/star.svg.







































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="Capa_1"
   x="0px"
   y="0px"
   viewBox="0 0 88 88"
   style="enable-background:new 0 0 88 88;"
   xml:space="preserve"
   inkscape:version="0.91 r13725"
   sodipodi:docname="star-shape1.svg"
   inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/test_code0/_test_images/star.png"
   inkscape:export-xdpi="122.72727"
   inkscape:export-ydpi="122.72727"><metadata
     id="metadata43"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
     id="defs41" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview39"
     showgrid="false"
     inkscape:zoom="6.3068182"
     inkscape:cx="43.603604"
     inkscape:cy="44"
     inkscape:current-layer="Capa_1" /><g
     id="g3"
     style="fill:#ffffff;fill-opacity:0.25098041"
     inkscape:export-xdpi="122.73"
     inkscape:export-ydpi="122.73"><g
       id="g5"
       style="fill:#ffffff;fill-opacity:0.25098041"><polygon
         style="fill:#ffffff;fill-opacity:0.25098041"
         points="44,0 55.939,33.612 88,33.612 61.842,53.351 71.193,88 44,67.226 16.809,88 26.158,53.351     0,33.612 32.061,33.612   "
         id="polygon7" /></g></g><g
     id="g9" /><g
     id="g11" /><g
     id="g13" /><g
     id="g15" /><g
     id="g17" /><g
     id="g19" /><g
     id="g21" /><g
     id="g23" /><g
     id="g25" /><g
     id="g27" /><g
     id="g29" /><g
     id="g31" /><g
     id="g33" /><g
     id="g35" /><g
     id="g37" /></svg>

Added freshlib/test_code0/test.forth.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
: TestWord
  1 2 3 4 5 6 7 8 9 10 * * * * * * * * *
  "
  Test multiline text
  Line1
  Line2
  Another line!
  This is forthScript.
  " .
;

Added freshlib/test_code0/test_config.udb.

cannot compute difference between binary files

Added freshlib/test_code0/test_utf8.asm.











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111
00000000011111111112222222222333333333344444444445555555555666666666677777777778888888888999999999900000000001111111111222222222233333333334
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
; _______________________________________________________________________________________
;|                                                                                       |
;| ..::FreshLib::..  Free, open source. Licensed under "BSD 2-clause" license.           |
;|_______________________________________________________________________________________|
;  Notes:
;    This is a test file. It is based on strlib.asm but has been modified and
;    should not be used as a library.
;#F:w
;    Това е теÑтов файл. Базиран е на strlib.asm но е модифициран и не бива да Ñе използва като библиотека. Ð’ този теÑтов файл Ñе използват форматиращи команди, които Ñа ÑъвмеÑтими Ñ FASM и могат да Ñе компилират без проблеми.
;    Αυτό είναι ένα δοκιμαστικό αÏχείο. Βασίζεται σε strlib.asm αλλά έχει
;#F:b
;    Ï„Ïοποποιηθεί και δεν Ï€Ïέπει να χÏησιμοποιείται ως βιβλιοθήκη.
;    ეს áƒáƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒªáƒ“რფáƒáƒ˜áƒšáƒ˜. ის ეფუძნებრstrlib.asm მáƒáƒ’რáƒáƒ› შეიცვáƒáƒšáƒ დრáƒáƒ  უნდáƒ
;    იქნáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული ბიბლიáƒáƒ—ეკáƒáƒ¨áƒ˜. 📌
;_________________________________________________________________________________________

            mov  eax, '1234'
            mov  ecx, 1234

__StringLibrary:

STR_MINSTRLEN = 15      ; must be N*8-1


struc string {
  .capacity dd ?
  .len      dd ?
  label .data byte
}

virtual at -(sizeof.string)
  string string
  sizeof.string = $-string
end virtual


; NumToStr flags
ntsSigned       = $00000
ntsUnsigned     = $10000
ntsFixedWidth   = $20000


ntsBin  = $0200
ntsQuad = $0400
ntsOct  = $0800
ntsDec  = $0a00
ntsHex  = $1000


; Global variable, storing parameters of dynamic strings list.
uglobal
  if used InitStrings
  ptrStrTable       dd  ?      ; StrLib strings arrray. Contains pointers to the memory allocated for strings.

  flagStringFastAdd dd  ?      ; Flag: when TRUE, enables "Fast addition mode" where new strings are allocated
                               ; without searching the ptrStrTable array for empty slots.
                               ; This can increase allocation speed, but at the expense of more memory allocated
                               ; in the array and not using possibly free handles. This mode should to be used
                               ; carefully and set to FALSE after the end of mass allocations.
  end if
endg



; < OS independent library functions >

;************************************************************************************
; Allocates memory for string table and allocates memory for strings.
; Start it before any work with strings. (Or better use InitializeAll macro)
; Returns 0 if failed to allocate needed memory.
;************************************************************************************
if used ptrStrTable
initialize InitStrings
begin
        StrLib = 1

        stdcall CreateArray, 4
        jc      .finish

        mov     [ptrStrTable], eax
        or      [eax+TArray.lparam], -1     ; lParam is the last allocated handle number

.finish:
        return
endp
end if

;**************************************************************************************
; Frees all memory used for strings library
; Call it before exit of the program or use FinalizeAll macro.
;**************************************************************************************
if used InitStrings
finalize FreeStrings
begin
        mov     esi, [ptrStrTable]
        mov     ecx, [esi+TArray.count]
        xor     ebx,ebx

.freeloop:
        dec     ecx
        js      .endloop

        cmp     [esi+TArray.array+4*ecx], ebx
        je      .freeloop

        stdcall FreeMem, [esi+TArray.array+4*ecx]
        jmp     .freeloop

.endloop:
        stdcall FreeMem, esi
        mov     [ptrStrTable], ebx

        return
endp
end if



;**************************************************************************************
;  Returns:
;    CF=0 no error; eax = pointer in memory of the hString
;    CF=1 on error - hString is handle, but is not in the table.*
;**************************************************************************************
proc StrPtr, .hString
begin
        mov     eax, [.hString]

        xor     eax, $c0000000
        test    eax, $c0000000
        jnz     .pointer

        push    ebx

        mov     ebx, [ptrStrTable]
        cmp     eax, [ebx+TArray.count]
        jae     .notfound

        mov     eax, [ebx+TArray.array+4*eax]
        test    eax, eax
        jz      .notfound

        add     eax, sizeof.string
        pop     ebx
        clc
        return

.pointer:
        xor     eax, $c0000000
        clc
        return

.notfound:
        stc
        pop     ebx
        return
endp

;**************************************************************************************
;  Creates new empty string and returns handle
;  Return: handle of the new created string.
;**************************************************************************************
proc StrNew
begin
        push    ecx edx esi

; Search for first empty place.
        mov     edx, [ptrStrTable]
        mov     ecx, [edx+TArray.count]

        cmp     [flagStringFastAdd], 0
        jne     .notfound

        mov     esi,[edx+TArray.lparam]
        xor     eax,eax

.search:
        dec     ecx
        js      .notfound

        inc     esi
        cmp     esi, [edx+TArray.count]
        jne     @f
        xor     esi,esi
@@:
        cmp     [edx+TArray.array+4*esi],eax
        je      .found
        jmp     .search

.notfound:
        mov     esi, [edx+TArray.count]
        stdcall AddArrayItem, edx
        mov     [ptrStrTable], edx

.found:
        mov     [edx+TArray.lparam], esi
        stdcall GetMem, STR_MINSTRLEN + sizeof.string + 1
        mov     [edx+TArray.array+4*esi], eax
        mov     [eax+sizeof.string+string.capacity], STR_MINSTRLEN

        mov     eax, esi
        or      eax, $c0000000

        pop     esi edx ecx
        return
endp


;**************************************************************************
; Deletes the string if it is possible.
;**************************************************************************
proc StrDel, .hString
begin
        push    eax ecx esi

        mov     esi, [ptrStrTable]
        mov     ecx, [.hString]
        jecxz   .finish

        xor     ecx, $c0000000
        test    ecx, $c0000000
        jnz     .pointer

        cmp     ecx, [esi+TArray.count]
        jae     .finish

.free:
        stdcall FreeMem, [esi+TArray.array+4*ecx]
        mov     [esi+TArray.array+4*ecx], 0

.finish:
        pop     esi ecx eax
        return

.pointer:
        xor     ecx, $c0000000

; search the pointer in the table.
        lea     eax, [ecx-sizeof.string]
        mov     ecx, [esi+TArray.count]

.search:
        dec     ecx
        js      .finish
        cmp     [esi+TArray.array+4*ecx], eax
        jne     .search
        jmp     .free
endp


;**************************************************************************
; Duplicates given string, and returns a handle to new one
;**************************************************************************
proc StrDup, .hSource
begin
        stdcall StrNew
        stdcall StrCopy, eax, [.hSource]
        return
endp


;**************************************************************************
; Arguments:
;  hString - handle or pointer to the string (static or dynamic)
; Returns:
;   CF=0; eax = length of the string in bytes.
;   CF=1; eax = 0 in case, the handle of the string can't be found in the
;               string table or the pointer is NULL.
;
; If pointer is passed the the procedure, it should be dword aligned and
; all bytes of the string including zero terminator to be accessed on
; qword boundary. Although, the zero terminator can be single byte zero.
;
; The performance of the procedure is high for pointers and
; instant for handles (the StrLib created string doesn't need any
; search, because the length is precomputed)
;**************************************************************************

proc StrLen, .hString    ; proc StrLen [hString]
begin
        push    esi

        mov     esi, [ptrStrTable]
        mov     eax, [.hString]

        xor     eax, $c0000000
        test    eax, $c0000000
        jnz     .pointer

        cmp     eax, [esi+TArray.count]
        jae     .error

        mov     eax, [esi+TArray.array+4*eax]
        test    eax, eax
        jz      .error

        mov     eax, [eax+sizeof.string+string.len]
        clc
        pop     esi
        return

.error:
        xor     eax, eax
        stc
        pop     esi
        return

.pointer:
        push    ecx edx edi

        xor     eax, $c0000000

; align on dword
.byte1:
        test    eax, 3
        jz      .scan

        cmp     byte [eax], 0
        je      .found

        inc     eax
        jmp     .byte1

.scan:
        mov     ecx, [eax]
        mov     edx, [eax+4]

        lea     eax, [eax+8]

        lea     esi, [ecx-$01010101]
        lea     edi, [edx-$01010101]

        not     ecx
        not     edx

        and     esi, ecx
        and     edi, edx

        and     esi, $80808080
        and     edi, $80808080

        or      esi, edi
        jz      .scan

        sub     eax, 9

; byte 0 was found: so search by bytes.
.byteloop:
        lea     eax, [eax+1]
        cmp     byte [eax], 0
        jne     .byteloop

.found:
        sub     eax, [.hString]
        clc
        pop     edi edx ecx esi
        return
endp





; This procedure calculates the length of zero terminated string and "fixes" [string.len] field.
; StrFixLen should be call when the content of the string is created by call to external to StrLib
; procedures - for example Win32 API functions.
;
proc StrFixLen, .hstring
begin
        push    eax ecx
        stdcall StrPtr, [.hstring]
        mov     ecx, eax
        stdcall StrLen, eax
        mov     [ecx+string.len], eax
        pop     ecx eax
        return
endp




;***************************************************************************
; If the hString is larger than length - do nothing
; If the hString is smaller than length -> set the length of string to length
; returns pointer to the new (old) string
;
; Arguments:
;   hString - string handle. /not pointer!/
;   length - new string length.
; Returns:
;   eax: pointer to the string.
;   CF: error flag. If 1 the pointer to the string is returned, but
;       the capacity is not changed.
;***************************************************************************
proc StrSetCapacity, .hString, .capacity
begin
        push    ebx ecx esi

        mov     eax, [.hString]

        xor     eax, $c0000000
        test    eax, $c0000000
        jnz     .pointer

        mov     esi, eax

        mov     ebx, [ptrStrTable]
        cmp     esi, [ebx+TArray.count]
        jae     .pointer

        mov     eax, [ebx+TArray.array+4*esi]   ; pointer to the string.
        mov     ecx, [.capacity]

        cmp     [eax+sizeof.string+string.capacity], ecx
        jae     .sizeok

        add     ecx, sizeof.string+8
        and     cl,  $f8                ; align the size to 8 bytes

        stdcall ResizeMem, eax, ecx
        jc      .error

        lea     ecx, [ecx-(sizeof.string+1)]
        mov     [ebx+TArray.array+4*esi], eax
        mov     [eax+sizeof.string+string.capacity], ecx

.sizeok:
        add     eax, sizeof.string
        pop     esi ecx ebx
        return

.error:
        add     eax, sizeof.string
        stc
        pop     esi ecx ebx
        return

.pointer:
        xor     eax, $c0000000
        stc
        pop     esi ecx ebx
        return
endp


;***************************************************************************************
;  Copies source to destination string.
;  Arguments:
;     dest - destination string (handle only)
;     source -  source string (handle or pointer)
;  Returns: nothing
;***************************************************************************************
proc StrCopy, .dest, .source
begin
        push    esi edi eax ecx

        stdcall StrLen, [.source]
        mov     ecx, eax
        stdcall StrSetCapacity, [.dest], ecx
        mov     edi, eax
        stdcall StrPtr, [.source]
        mov     esi, eax

        mov     [edi+string.len], ecx

        inc     ecx
        mov     eax, ecx
        shr     ecx, 2
        rep movsd
        mov     ecx, eax
        and     ecx, 3
        rep movsb

        pop     ecx eax edi esi
        return
endp



;***************************************************************************************
; Compares two strings - case sensitive.
; Returns CARRY = 1 if the strings are equal.
; Returns CARRY = 0 if the strings are different.
;
; As long as this function uses StrLen, it will be very fast on handles and relatively
; slow on pointers.
;***************************************************************************************
proc StrCompCase, .str1, .str2
begin
        push    eax ecx esi edi

        mov     eax, [.str1]
        mov     ecx, [.str2]

        cmp     eax, ecx
        je      .equal

        test    eax, eax
        jz      .noteq

        test    ecx, ecx
        jz      .noteq

        stdcall StrLen, eax
        push    eax
        stdcall StrLen, ecx

        pop     ecx
        cmp     eax, ecx
        jne     .noteq

        stdcall StrPtr, [.str1]
        mov     esi,eax
        stdcall StrPtr, [.str2]
        mov     edi,eax

        mov     eax, ecx
        and     cl, $fc
        repe cmpsd
        jne     .noteq
        mov     ecx, eax
        and     ecx, 3
        repe cmpsb
        jne     .noteq

.equal:
        stc
        pop     edi esi ecx eax
        return

.noteq:
        clc
        pop     edi esi ecx eax
        return
endp


;***************************************************************************************
; Compares two strings - case NOT sensitive.
; Returns CARRY = 1 if the strings are equal.
; Returns CARRY = 0 if the strings are different.
;
; relatively slow, especially on equal strings, passed as pointers - this is the worst
; case. The nontrivial best case is "strings with different lengths passed as handles."
;***************************************************************************************
proc StrCompNoCase, .str1, .str2
begin
        push    eax ebx ecx edx esi edi

        mov     eax, [.str1]
        mov     ecx, [.str2]

        cmp     eax, ecx
        je      .equal

        test    eax, eax
        jz      .noteq

        test    ecx, ecx
        jz      .noteq

        stdcall StrLen, eax
        push    eax
        stdcall StrLen, ecx

        pop     ecx
        cmp     eax, ecx
        jne     .noteq

        stdcall StrPtr, [.str1]
        mov     esi,eax
        stdcall StrPtr, [.str2]
        mov     edi,eax


        mov     ebx, ecx
        shr     ecx, 2
        and     ebx, 3

.dword:
        dec     ecx
        js      .byte

        mov     eax, [esi]
        mov     edx, [edi]

        and     eax, $40404040
        and     edx, $40404040
        shr     eax, 1
        shr     edx, 1
        or      eax, [esi]
        or      edx, [edi]

        lea     esi, [esi+4]
        lea     edi, [edi+4]

        cmp     eax, edx
        jne     .noteq
        jmp     .dword

.byte:
        dec     ebx
        js      .equal

        mov     al, [esi]
        mov     ah, [edi]

        and     eax, $ffff
        mov     edx, eax
        and     eax, $4040
        shr     eax, 1
        or      eax, edx

        inc     esi
        inc     edi

        cmp     al, ah
        je      .byte

.noteq:
        clc
        pop     edi esi edx ecx ebx eax
        return

.equal:
        stc
        pop     edi esi edx ecx ebx eax
        return

endp



;**********************************************************
;  Creates string and assigns it to variable. If variable
;  already contains string handle, the old string will be
;  used.
;  Arguments:
;    [ptrHString] - variable containing string handle.
;    ptrSource - pointer to the source for string.
;**********************************************************
proc SetString, .ptrHString, .ptrSource
begin
        push    eax esi
        mov     esi, [.ptrHString]

        mov     eax, [esi]
        test    eax, eax
        jnz     @f
        stdcall StrNew
@@:
        mov     [esi], eax
        stdcall StrCopy, eax, [.ptrSource]
        pop     esi eax
        return
endp


;**********************************************************************************
; StrCat appends one string to another
; Arguments:
;   dest - destination string (handle only)
;   source - source string
;**********************************************************************************
proc StrCat, .dest, .source
begin
        push    eax ebx ecx esi edi

        stdcall StrLen, [.dest]
        mov     ebx,eax                 ; store dest length in ebx

        stdcall StrLen, [.source]
        mov     esi, eax
        lea     ecx, [eax+ebx]

        stdcall StrSetCapacity, [.dest], ecx

        mov     [eax+string.len], ecx
        lea     edi, [eax+ebx]

        stdcall StrPtr, [.source]
        lea     ecx, [esi+1]
        mov     esi, eax

        mov     ebx, ecx
        shr     ecx, 2
        rep movsd
        mov     ecx, ebx
        and     ecx, 3
        rep movsb

        pop     edi esi ecx ebx eax
        return
endp


;**********************************************************************************
; StrCharPos returns a pointer to the first occurence of a given char
;   in specified string
; Arguments:
;   Char - char to look for
;   hString -  string to search
; Returns: a pointer to the char in source, or NULL if char doesn't occur
;   in given string
;**********************************************************************************
proc StrCharPos, .hString, .char
begin
        push    esi

        stdcall StrPtr, [.hString]
        mov     esi,eax

        mov     eax, [.char]
        xchg    al,ah

.search:
        mov     al,[esi]
        inc     esi
        or      al,al
        je      .not_found
        cmp     al,ah
        jne     .search

        mov     eax, esi
        dec     eax
        pop     esi
        return

.not_found:
        xor     eax,eax
        pop     esi
        return
endp


;**********************************************************************************
; StrPos returns a pointer to the first occurence of a pattern string
;   in another string
; Arguments:
;   hPattern - 'pattern' string
;   hString -  string to search
; Returns: a pointer to the pattern string in source , or NULL if pattern string
; doesn't occur in the string to search
;**********************************************************************************
proc StrPos, .hString, .hPattern
begin
        push    ebx ecx edx esi edi     ; esp = esp -20
        mov     esi,[.hPattern]         ; mov esi,[hPattern]
        mov     edi,[.hString]          ; mov edi,[hString]
        stdcall StrLen, edi
        mov     ebx,eax                 ; now ebx holds lenght of the string to search
        stdcall StrLen, esi
        mov     edx,eax                 ; now edx holds length of the pattern string

        cmp     edx, ebx
        ja      .not_found              ; if the pattern is longer than the string

        stdcall StrPtr, esi
        mov     esi,eax                 ; put pointer to the pattern str in esi
        stdcall StrPtr,edi
        mov     edi,eax                 ; put pointer to the search str in edi
        lodsb                           ; load first character of the pattern
        mov     ecx,ebx                 ;
        mov     ebx,edx                 ; put str_len(pattern)-1 in ebx
        dec     ebx                     ;
        sub     ecx, ebx                ; there is no need to search to the end, but only to len(string)-len(pattern)-1

.search:
        repne   scasb
        jne     .not_found
        cmp     ecx,ebx
        jb      .not_found
        push    edi esi ecx
        or      ebx,ebx                 ; ebx==0 means that we were searching for one
        jz      .got_it                 ; character. We found it, so we stop.
        mov     ecx,ebx
        repe    cmpsb
        jne     .not_match

.got_it:
        pop     ecx esi edi
        dec     edi
        mov     eax,edi

.ret:
        pop     edi esi edx ecx ebx
        return

.not_match:
        pop     ecx esi edi
        jmp     .search

.not_found:
        xor     eax,eax
        jmp     .ret
endp





proc StrCopyPart, .dest, .source, .pos, .len
begin
        push    eax ecx esi edi

        stdcall StrPtr, [.source]
        mov     esi, eax
        stdcall StrLen, [.source]
        mov     ecx, eax

        mov     eax, [.pos]
        cmp     eax, ecx
        jae     .cleardest      ;

        sub     ecx, [.pos]
        mov     eax, [.len]

; ecx = min(ecx, eax)
        sub     eax, ecx
        sbb     edi, edi
        and     edi, eax
        add     ecx, edi

        add     esi, [.pos]

        stdcall StrSetCapacity, [.dest], ecx
        jc      .finish

        mov     edi, eax
        mov     [edi+string.len], ecx

        push    ecx
        shr     ecx, 2
        rep movsd
        pop     ecx
        and     ecx, 3
        rep movsb

        lea     ecx, [edi+3]
        and     cl, $fc
        sub     ecx, edi
        xor     eax, eax
        rep stosb

.finish:
        pop     edi esi ecx eax
        return

.cleardest:
        stdcall StrSetCapacity, [.dest], STR_MINSTRLEN
        mov     [eax+string.len], 0
        mov     dword [eax], 0
        jmp     .finish
endp




;**********************************************************************************
; StrExtract copies the part of [string] from [index] with lenght in [len]
; Returns handle to new created string.
;**********************************************************************************
proc StrExtract, .string, .pos, .len
begin
        stdcall StrNew
        stdcall StrCopyPart, eax, [.string], [.pos], [.len]
        return
endp




;__________________________________________________________________________________
; Splits the string on two strings, at position [.pos]
; Arguments:
;   .pString - pointer to string to be splitted.
;   .pos     - position where to split the string.
; Returns:
;   eax - handle to the new created string with second part of the string.
;         the original string does not reallocate memory and it's capacity
;         and the pointer will remains the same.
;__________________________________________________________________________________

proc StrSplit, .hString, .pos
begin
        push    ecx edi

        stdcall StrExtract, [.hString], [.pos], -1
        push    eax

        stdcall StrLen, eax
        mov     ecx, eax
        stdcall StrPtr, [.hString]

        sub     [eax+string.len], ecx   ; new length of the source string.
        add     eax, [eax+string.len]
        mov     edi, eax

        lea     ecx, [eax+3]
        and     cl, $fc
        sub     ecx, eax
        xor     eax, eax
        rep stosb

        pop     eax
        pop     edi ecx
        return
endp





;__________________________________________________________________________________
; StrInsert inserts one string into another at specified pos
; Arguments:
;   dest - destination where the source will be inserted.
;   source -  string to insert
;   pos    - where to insert.
; Returns:
;   nothing.
;__________________________________________________________________________________
proc StrInsert, .dest, .source, .pos
begin
        push    eax
        stdcall StrSplit, [.dest], [.pos]
        push    eax eax
        stdcall StrCat, [.dest], [.source]
        stdcall StrCat, [.dest] ; source from the stack.
        stdcall StrDel; from the stack.
        pop     eax
        return
endp


; TODO:
; String case functions are giving weird results in linux, so
; here are two functons I wrote some time ago.
; I have tested the following functions in win32 and worked well
; Perhaps it is time to fully support UTF encoded strings.
; These functions here are faster (20-25%), but the results are
; exactly the same as the strlib ones.
;                                    pelaillo

; -----------------------------------------------
; str_ucase:
;         Author: pelaillo
;           Date: Jan. 16, 2002
;    Converts also accented characters: ÑÚ <--> ñú
; -----------------------------------------------

proc StrUCase2, .hString
begin
        push    eax edx edi

        stdcall StrPtr, [.hString]
        mov     edi, eax
.str_ucase:
                mov     eax, [edi]
                mov     edx, eax
                and     edx, 40404040h
                ror     edx, 1
                xor     edx, -1
                and     eax, edx
                mov     [edi], eax
                add     edi, 4
                lea     edx, [eax-01010101h]
                xor     eax, edx
                and     eax, 80808080h
                jz      .str_ucase
                and     eax, edx
                jz      .str_ucase

        pop     edi edx eax
        return
endp

; -----------------------------------------------
; str_lcase:
;         Author: pelaillo
;           Date: Jan. 16, 2002
;    Converts also accented characters: ÑÚ <--> ñú
; -----------------------------------------------

proc StrLCase2, .hString
begin
        push    eax edx edi

        stdcall StrPtr, [.hString]
        mov     edi, eax
.str_lcase:
        mov     eax, [edi]
        mov     edx, eax
        and     edx, 40404040h
        ror     edx, 1
        or      eax, edx
        mov     [edi], eax
        add     edi, 4
        lea     edx, [eax-01010101h]
        xor     eax, edx
        and     eax, 80808080h
        jz      .str_lcase
        and     eax, edx
        jz      .str_lcase

        pop     edi edx eax
        return
endp


;**********************************************************************************
; Converts strings to Lower Case
;**********************************************************************************
proc StrLCase, .hString
begin
        push    eax ebx ecx edx edi

        stdcall StrPtr, [.hString]
        mov     edi, eax

        stdcall StrLen, [.hString]
        mov     ecx, eax
        mov     ebx, edi

        and     ebx, 3
        sub     ecx, ebx
        jbe     .byte2          ; the string is small enough, so process it by bytes.

.byte1:
        test    edi, 3
        jz      .ddword

        mov     al, [edi]
        and     al, $40
        shr     al, 1
        or      byte [edi], al

        inc     edi
        jmp     .byte1

.ddword:
        mov     ebx, ecx
        and     ebx, 3
        shr     ecx, 2
        jecxz   .byte

.qword:
        mov     eax, [edi]
        mov     edx, [edi+4]

        and     eax, $40404040
        and     edx, $40404040

        shr     eax, 1
        shr     edx, 1

        or      [edi], eax
        or      [edi+4], edx

        add     edi, 8
        dec     ecx
        jnz     .qword

.byte:
        dec     ebx
        js      .finish

        mov     al, [edi]
        and     al, $40
        shr     al, 1
        or      byte [edi], al

        inc     edi
        jmp     .byte

.byte2:
        mov     ebx, ecx
        jmp     .byte

.finish:
        pop     edi edx ecx ebx eax
        return
endp


;**********************************************************************************
; Converts strings to Upper Case
; First parameter = String to Convert to upper case
;**********************************************************************************
proc StrUCase, .hString
begin
        push    eax ebx ecx edx edi

        stdcall StrPtr, [.hString]
        mov     edi, eax

        stdcall StrLen, [.hString]
        mov     ecx, eax
        mov     ebx, edi

        and     ebx, 3
        sub     ecx, ebx
        jbe     .byte2          ; the string is small enough, so process it by bytes.

.byte1:
        test    edi, 3
        jz      .ddword

        mov     al, [edi]
        and     al, $40
        shr     al, 1
        not     al
        and     byte [edi], al

        inc     edi
        jmp     .byte1

.ddword:
        mov     ebx, ecx
        and     ebx, 3
        shr     ecx, 2
        jecxz   .byte

.qword:
        mov     eax, [edi]
        mov     edx, [edi+4]

        and     eax, $40404040
        and     edx, $40404040

        shr     eax, 1
        shr     edx, 1

        not     eax
        not     edx

        and     [edi], eax
        and     [edi+4], edx

        add     edi, 8
        dec     ecx
        jnz     .qword

.byte:
        dec     ebx
        js      .finish

        mov     al, [edi]
        and     al, $40
        shr     al, 1
        not     al
        and     byte [edi], al

        inc     edi
        jmp     .byte

.byte2:
        mov     ebx, ecx
        jmp     .byte

.finish:
        pop     edi edx ecx ebx eax
        return
endp




;**********************************************************************************
; _NumToStr converts the number in eax to the string in any radix approx. [2..26]
; Arguments:
;   [edi] - pointer to the string buffer
;   ecx - radix
;   eax - number to convert.
; There is no parameter check, so be careful.
; returns: edi points to the end of a converted number
;**********************************************************************************
proc _NumToStr
begin
    test  eax,eax
    jns   _NumToStrU
    neg   eax
    mov   byte [edi],"-"
    inc   edi
endp

proc _NumToStrU
begin
    cmp   eax,ecx
    jb    .lessA
    xor   edx,edx
    div   ecx
    push  edx
    call  _NumToStrU
    pop   eax
.lessA:
    cmp   al, 10
    sbb   al, 69h
    das
    stosb
    return
endp



;*****************************************************
; NumToStrF:
;   Converts signed integer value to string.
; NumToStrUF:
;   Converts unsigned integer value to string.
;
; edi - pointer to string buffer
; eax - Number to convert
; ecx - radix from 2 to $ff
; esi - length of the number in chars
;
; returns: edi - pointer to the end of converted num
;
; Note: Don't use 1 as radix.
;*****************************************************
proc _NumToStrF
begin
        test    eax,eax
        jns     _NumToStrUF
        neg     eax
        mov     byte [edi],'-'
        push    esi
        dec     esi
        add     edi, esi
        push    edi
        jmp     _NumToStrUF.loopc
endp

proc _NumToStrUF
begin
        push    esi
        add     edi, esi
        push    edi
        dec     edi
.loopc:
        xor     edx,edx
        div     ecx
        xchg    al,dl
        cmp     al,$0a
        sbb     al,$69
        das
        mov     [edi],al
        dec     edi
        xchg    al,dl
        dec     esi
        jnz     .loopc
        pop     edi
        pop     esi
        return
endp


;***********************************************************
; NumToStr - converts number to any radix.
; num - number to convert
; str - handle of the string. If NULL - creates new string.
; index - Offset in string where to put converted number.
; flags:
;   byte 0 - number of digits if ntsFixedWidth is set.
;   byte 1 - contains radix for the convertion.
;   byte 2,3 - flags.
; Returns:
;   eax - handle of the string.
;***********************************************************
proc NumToStr, .num, .flags
begin
        push    ebx ecx edx esi edi

        stdcall StrNew
        push    eax

        stdcall StrSetCapacity, eax, 40
        mov     edi, eax
        push    eax             ; pointer for the length.

; determine which conversion func to use
        movzx   eax, byte [.flags+2]    ; signed/fixed
        and     eax, (ntsUnsigned or ntsFixedWidth) shr 16
        mov     ebx, [.NumToStrFunc+4*eax]

        movzx   ecx, byte [.flags+1]       ; load radix into ecx
        movzx   esi, byte [.flags]
        mov     eax, [.num]
        call    ebx                     ; call low-level convertion routine
        mov     dword [edi], 0

        pop     eax
        sub     edi, eax
        mov     [eax+string.len], edi

        pop     eax
        pop     edi esi edx ecx ebx
        return

.NumToStrFunc dd _NumToStr, _NumToStrU, _NumToStrF, _NumToStrUF

endp




;-------------------------------------------------------
; function StrToNum
;   Converts specified string into a number
;
; Arguments:
;   hString - handle/pointer of the string containing
;     number to convert. It doesn't have to be ended by
;     NULL, any other character will stop conversion.
;     Number to convert must be decimal.
;
; Return:
;   eax - converted number
;
; Note: in case of failture (first char of given pointer
;   isn't a number) function returns -1.
;-------------------------------------------------------
proc StrToNum, .hString
begin
        push    ebx edx esi
        xor     ebx,ebx         ; ebx will store our number

        stdcall StrPtr, [.hString]
        mov     esi,eax
        xor     eax,eax
        mov     al,[esi]
        cmp     al,'0'
        jb      .error
        cmp     al,'9'
        jbe     .digit
        jmp     .error
     .digit:
        sub     al,'0'
        add     ebx,eax
        inc     esi
        mov     al,[esi]
        cmp     al,'0'
        jb      .finish
        cmp     al,'9'
        ja      .finish
        mov     edx,ebx         ; multiply ebx by 10
        shl     ebx,3
        add     ebx,edx
        add     ebx,edx
        jmp     .digit
     .finish:
        mov     eax,ebx
        pop     esi edx ebx
        return

     .error:
        xor     eax,eax
        dec     eax
        pop     esi edx ebx
        return
endp

;-------------------------------------------------------
; function StrCharCat
;   Appends up to 4 chard at the end of the string.
;
; Arguments:
;   hString - string to append
;   char - char(s) to add
; Returns:
;   nothing
;-------------------------------------------------------
proc StrCharCat, .hString, .char
begin
        push    eax ecx

        stdcall StrLen, [.hString]
        mov     ecx, eax
        add     eax, 8

        stdcall StrSetCapacity, [.hString], eax

        pushd   [.char]
        popd    [eax+ecx]
        mov     dword [eax+ecx+4], 0
        dec     ecx
.goend:
        inc     ecx
        cmp     byte [eax+ecx], 0
        jne     .goend

        mov     [eax+string.len], ecx

        pop     ecx eax
        return
endp


;------------------------------------------------------------
; function StrInsertChar
;   Inserts up to 4 chars into the given position of the string
;
; Arguments:
;   hString - string to append
;   char    - char to add
;   pos     - position where to add the char
;-------------------------------------------------------------
proc StrCharInsert, .hString, .char, .pos
.str rd 2
begin
        push    eax
        push    [.char]
        pop     [.str]
        mov     [.str+4], 0

        lea     eax, [.str]
        stdcall StrInsert, [.hString], eax, [.pos]
        pop     eax
        return
endp






;_______________________________________________________________________
;
; proc StrHash
;   Computes 32 bit hash value from the string.
;   This procedure implements the hash algoritm: FNV-1b
;
; Arguments:
;   ptrString - pointer to PASCAL string with dword length at [ptr-4]
;
; Return:
;   eax - 32bit hash value.
;
; Changes:
;   eax
;_______________________________________________________________________
proc StrHash, .hString
begin
        push    edx ecx esi

        stdcall StrPtr, [.hString]
        mov     esi, eax
        stdcall StrLen, [.hString]
        mov     ecx, eax
        mov     eax, $811C9DC5                  ; 2166136261              ; FNV offset basis

        jecxz   .exit

.hashloop:
        movzx   edx, byte [esi]
        xor     eax, edx
        inc     esi
        imul    eax, $01000193                  ;   16777619              ; FNV prime
        dec     ecx
        jnz     .hashloop

.exit:
        pop     esi ecx edx
        return
endp



proc StrURLEncode, .hstr
.res dd ?
begin
        push    ebx ecx edx esi edi
        stdcall StrPtr, [.hstr]
        mov     esi, eax

        stdcall StrLen, esi
        mov     ecx, eax
        lea     edx, [2*eax+eax]        ; the encoded string can be max 3x long as original string.

        stdcall StrNew
        mov     [.res], eax
        jecxz   .finish

        stdcall StrSetCapacity, eax, edx
        mov     edi, eax
        xor     edx, edx
        xor     ebx, ebx

        push    eax
.encode:
        lodsb
        cmp     al, $80
        jae     .store          ; it is a hack, but I hope save enough.

        mov     dl, al
        mov     bl, al
        shr     edx, 5
        and     ebx, $1f
        bt      dword [.URLCharTable+4*edx], ebx
        jnc     .store

        mov     ah, al
        mov     al, '%'
        stosb
        mov     al, ah
        shr     al, 4
        cmp     al, $0a
        sbb     al, $69
        das
        stosb
        mov     al, ah
        and     al, $0f
        cmp     al, $0a
        sbb     al, $69
        das

.store:
        stosb
        loop    .encode

        xor     al, al
        mov     [edi], al

        pop     eax
        sub     edi, eax
        mov     [eax+string.len], edi

.finish:
        mov     eax, [.res]
        pop     edi esi edx ecx ebx
        return

; Contains 1 where the character must be % encoded and 0 where it is save to pass it directly
.URLCharTable db 11111111b       ;
             db 11111111b       ;
             db 11111111b       ;
             db 11111111b       ; 0..31 -control chars | encoded
             db 11111111b       ; $27 - $20: '&%$#"!   | encoded
             db 11111111b       ; $2f - $28: /.-,+*)(  | encoded
             db 00000000b       ; $37 - $30: 76543210  | not encoded
             db 11111100b       ; $3f - $38: ?>=<;:98  | partially
             db 00000001b       ; $47 - $40: GFEDCBA@  | partially
             db 00000000b       ; $4f - $48: ONMLKJIH  | not encoded
             db 00000000b       ; $57 - $50: WVUTSRQP  | not encoded
             db 11111000b       ; $5f - $58: _^]\[ZYX  | partially
             db 00000001b       ; $67 - $60: gfedcba`  | partially
             db 00000000b       ; $6f - $68: onmlkjih  | not encoded
             db 00000000b       ; $77 - $70: wvutsrqp  | not encoded
             db 11111000b       ; $7f - $78:  ~}|{zyx  | partially

endp




; UTF-8 support functions.
; Some of the above functions also need some revision in order to support
; utf-8 strings properly.



proc StrLenUtf8, .hString, .len
.maxptr dd ?
begin
        push    esi ecx edx

        stdcall StrPtr, [.hString]
        mov     esi, eax
        mov     eax, [.len]
        cmp     eax, -1
        je      @f
        add     eax, esi
@@:
        mov     [.maxptr], eax
        xor     ecx, ecx

.loop:
        cmp     esi, [.maxptr]
        jae     .endofstring

        stdcall DecodeUtf8, [esi]
        jc      .error

        test    eax, eax
        jz      .endofstring

        add     esi, edx
        inc     ecx
        jmp     .loop

.endofstring:
        mov     eax, ecx
        pop     edx ecx esi
        clc
        return

.error:
        pop     edx ecx esi
        return
endp



proc StrOffsUtf8, .hString, .pos
begin
        push    edx esi

        stdcall StrPtr, [.hString]
        mov     esi, eax

.loop:
        dec     [.pos]
        js      .finish

        stdcall DecodeUtf8, [esi]
        jc      .error

        test    eax, eax
        jz      .finish

        add     esi, edx
        jmp     .loop

.finish:
        clc
        mov     eax, esi
        pop     esi edx
        return

.error:
        xor     eax, eax
        pop     esi edx
        return
endp



; decodes 4 bytes in [.chars] to UNICODE dword value.
; returns:
;   CF=0 - no error
;     eax - unicode value.
;     edx - byte count of the char. [1..4]
;   CF=1 - invalid utf-8 char;
;     eax = edx = 0  the character can not be decoded.
;     edx <> 0 -> eax = the overlong encoded character. edx = byte count of the char.
;
;  Note: When CF=1 and [.chars] are overlong encoded char.
;        eax contains the proper value and edx contains the proper length.
;        But it is still invalid character, according to the standards.
proc DecodeUtf8, .chars
begin
        push    ebx ecx

        xor     ecx, ecx

.loop1:
        shl     byte [.chars], 1
        jnc     .countok
        inc     ecx
        jmp     .loop1

.countok:
        jecxz   .ascii

        cmp     ecx, 1
        je      .error          ; internal byte
        cmp     ecx, 4
        ja      .error          ; more than 4 bytes

        mov     edx, 1
        xor     ebx, ebx
        movzx   eax, byte [.chars]
        shr     eax, cl
        shr     eax, 1

.loop2:
        mov     bl, byte [.chars+edx]
        and     bl, $c0
        cmp     bl, $80
        jne     .error
        mov     bl, byte [.chars+edx]
        and     bl, $3f
        shl     eax, 6
        or      eax, ebx
        inc     edx
        cmp     edx, ecx
        jne     .loop2

        and     eax, $1fffff
        cmp     eax, $10ffff
        ja      .error

        cmp     eax, [._minimal+4*edx-8]
        jb      .overlong   ; overlong coding.

        clc
        pop     ecx ebx
        return

.ascii:
        movzx   eax, byte [.chars]
        shr     eax, 1
        mov     edx, 1
        pop     ecx ebx
        clc
        return

.error:
        xor     eax, eax
        xor     edx, edx
.overlong:
        stc
        pop     ecx ebx
        return

._minimal dd $80, $800, $10000

endp



proc ScanForwardUtf8
begin
        push    eax

        mov     al, [esi]
        test    al, al
        jns     .finish

        and     al, 11000000b
        cmp     al, 11000000b
        je      .finish

; inc forward
.loopf:
        inc     esi
        mov     al, [esi]
        and     al, 11000000b
        cmp     al, 10000000b
        je      .loopf

.finish:
        pop     eax
        return
endp



proc ScanBackUtf8
begin
        push    eax

        mov     al, [esi]
        test    al, al
        jns     .finish

        and     al, 11000000b
        cmp     al, 11000000b
        je      .finish

; inc back
.loopf:
        dec     esi
        mov     al, [esi]
        and     al, 11000000b
        cmp     al, 10000000b
        je      .loopf

.finish:
        pop     eax
        return
endp


include '%TargetOS%/utf8.asm'



DispSize "String library", $ - __StringLibrary

Added freshlib/test_code0/theme_flat.cfg.

























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
clTextCaret = $FFE74C3C
caretTimes = 250, 250
clBorderNeutral = $FF1ABC9C
clBorderLight = $FF31E2BF
clBorderDark = $FF138670
clBorderNeutralGray = $FF606060
clBorderLightGray = $FF808080
clBorderDarkGray = $FF404040
clBorderFocused = $FFE74C3C
boxBorderWidth = 2
clBtnBk = $FF1ABC9C, $FF48C9B0, $FF16A085, $807B7B7B
clBtnTxt = $FFFFFFFF, $FFFFFFFF, $FFBDC3C7, $80FFFFFF
btnBorder = 0, 0, 0, 1073741824
btnPressedOfsX = 0
btnPressedOfsY = 0
btnMarginX = 8
btnMarginY = 8
clToolBtnBk = $FFECF0F1, $FFC9DCE7, $FFC9DCE7, $FFECF0F1
clToolBtnTxt = $FF000000, $FF000000, $FF000000, $80000000
tbBorder = 0, 0, 0, 1073741824
tbBorderWidth = 1
tbPressedOfsX = 0
tbPressedOfsY = 2
tbSeparatorType = $40000003
tbSeparatorWidth = 10
clEditBk = $FFECF0F1
clEditBkFocused = $FFFFFFFF
clEditTxt = $FF000000
clEditSel = $602980B9
clEditSelTxt = $FFFFFFFF
editBorder = 3
editBorderFocused = 3
clDialogBk = $FFECF0F1
clDialogTxt = $FF000000
clSplitter = $FF34495E
clProgressBk = $FFECF0F1
clProgressBar = $FF1ABC9C
progressBorder = 3
clScrollBk = $3FBDC3C7, $A0BDC3C7
clScrollSlider = $7F7F8C8D, $FF1ABC9C
clScrollSliderOvf = $3FF39C12, $FFF39C12
borderScroll = 0
scrollWidth = 12
minSliderHeight = 24
clLabelBk = $FFECF0F1
clLabelTxt = $FF000000
clTreeViewBack = $FFFFFFFF
clTreeViewText = $FF000000
clTreeSelected = $FF2980B9
clTreeSelectedTxt = $FFFFFFFF
clTreeFocused = $FFD35400
clTreeFocusedTxt = $FFFFFFFF
clTreeViewLines = $FFBDC3C7
tvBorder = 3
tvIcons = 279:iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAMAAABFNRROAAAAUVBMVEVHcEwVoIUXoIYWoIUWoIUWoIYWoIUAv4AWn4UWoIUWoIUWoIYWoIYVn4YVn4YWnoQWoIUVoIQWoIUWoYUXn4QVooQXoIWL0ML///8WoIXF6OG0ZSUgAAAAF3RSTlMAp5OX+TvjBJXl5KakPag6/j74pTg8qalz8pYAAABeSURBVAjXVY5ZEoAgDEMDson7CvX+B7WV0cH8JG86bQMAw9iaqA6IfENFwTO9wAgs4iknMYuzog4t53TlKzFHGKJcRLT+Zg6q2uuxz/VNhO+fli4vav90s50zbps43TydC9ljC1FvAAAAAElFTkSuQmCC, 269:iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAMAAABFNRROAAAATlBMVEVHcEw0Sl4zSV40SV80SV40SV40SV9AQEAzSl40SV40SV40SV81SV41S1w0SV4yR1wzSF4zSV01Sl8zSF4ySWA0SV40SV40SV6apK////9UeNVfAAAAF3RSTlMApuSn4+U7BJX5k5elOqg9PKQ+qTj++F14vKgAAABXSURBVAjXVY5ZDoAgEEMLsruv1ftfVJCg+L76MpmmADAO2stmQsK2zDgbrUhUYOGHwVqZgCbPDCnhyStDHr+bQlP9zdj2uhPulZC2FA322WaE8qrrY7oBCC8LRlmSYHsAAAAASUVORK5CYII=
clMenuBack = $FFECF0F1
clMenuText = $FF000000
clMenuTextGray = $90000000
clMenuSelection = $FF2980B9
clMenuSelIcon = $FFC9DCE7
borderMenu = 3
menuIconMargin = 4
menuSeparatorHeight = 12
menuMinTextDist = 32
menuSubIcon = 206:iVBORw0KGgoAAAANSUhEUgAAAAYAAAALCAYAAABcUvyWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABLSURBVBiVjc+xDYBADATBeSQCIgqgYzJaoARSInqgH5MQvQ6JzezVyT7YMAgUdoxJFA5MSRQuzEkUbiztHXrOz8SvG/Gr2GNF65cP8X4dCPkfyx8AAAAASUVORK5CYII=
menuSubIconSel = 207:iVBORw0KGgoAAAANSUhEUgAAAAYAAAALCAYAAABcUvyWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABMSURBVBiVjc+xDYAwEEPRCxIFFQOwcTpWyAi0VOzAPi8FXTgk3H5Z3w7smGKMJw1zBuDAkgG4sGYAbmwFXuKI87Pxy5GuSn9UlNHeAYWml41HdWNxAAAAAElFTkSuQmCC
menuSubIconGray = 280:iVBORw0KGgoAAAANSUhEUgAAAAYAAAALCAYAAABcUvyWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACVSURBVBiVY5i6dOnEhoYGJgY0wMTAwJgnpqq6YObMmaxoEgwM/xkYY//w8K7tW7WKE0UCCnzZf//ZMXPVKn4GBgYGxqlLl/1HM/4q0x8WdwxLGRgYtP+x/JmPTeIq0x+WRHSJQyysLNaZ8WFPkSU2/2Rl8UgPC/sIdxUjw//FLF8+BxeFhX2HK5u2ZFnX////GdEtAgDKqy21io/rDwAAAABJRU5ErkJggg==
iconMenuChecked = 172:iVBORw0KGgoAAAANSUhEUgAAAAcAAAAQCAYAAADagWXwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAApSURBVBiVY2CgP2B87mPTgEuShYGBoR6XJBM+YwdCkoWBgaERnwJ6AwCTrAMDeKqy3AAAAABJRU5ErkJggg==
iconMenuCheckedGray = 172:iVBORw0KGgoAAAANSUhEUgAAAAcAAAAQCAYAAADagWXwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAApSURBVBiVY2CgP2DMy8trwCXJwsDAUI9LkgmfsQMhycLAwNCITwG9AQBg/wLetiFJMAAAAABJRU5ErkJggg==
clCheckboxBack = $FFE0E0E0, $FFFFFFFF, $FFC0C0C0, $80C0C0C0
clCheckboxTxt = $FF000000
clCheckboxTxtGray = $FF606060
cbIconSize = 13
cbMargin = 2
borderCheckbox = 3
iconChecked = 166:iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAjSURBVCiRY2AYfoARXeC5j81/dDHJLUdQ1DGRY9Mg1zQcAQAaUwQKOrN/dgAAAABJRU5ErkJggg==
iconCheckedGray = 166:iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAjSURBVCiRY2AYfoARXSA/P/8/utjEiRNR1DGRY9Mg1zQcAQAXqwQKOqarXQAAAABJRU5ErkJggg==
maxTabWidth = 180
tabMarginX = 4
tabMarginY = 4
clTabBk = $FFECF0F1, $FFC9DCE7, $FFC9DCE7
clTabTxt = $FF000000
clGridCellBk = $FFFFFFFF, $FFECF0F1, $FFC9DCE7, $FFD35400
clGridCellTxt = $FF000000, $FF000000, $FF000000, $FFFFFFFF
clGridLines = $0, $FFC0C0C0, $0, $FF1ABC9C
lvIconMargin = 2
iconDialogs = 1075:iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAABfVBMVEUAAAD/MzPVVSvbSUnkUTbmTUDpTjfrRz3rTjvjTDnkSUDnUEDqTjnkSjzlTjvnTTvoSzvoTT3mTT3mTDznTTvoTDvoTTznTDznTT3oTT3mSzzmTTvnTDvoSz3oTTzoTDzmSzvnTTvnTD3oTTzoTDvnTDznTDzoSzvoTT3mTDzmTDznTTvnTDznTTzoTD3nTDznTTznTD3nSzznTDznTDvoTDzmTDznTDznTDznTD3nTTznTDznTD3nTDznTDznTDznTDznTDznTDznTDznTTznTDznTDznTDznTDznTz/oUkPoV0fpV0jpWUrqYVPqYlTqZFbraFvraVvral3sb2LscmXsc2btd2vteGvtem7vioDwj4XxlozxmI/xmpHzoprzpJzzpp70q6P0q6T0sKn1sqv2u7X2vrj4zMj4zsn50Mz50s7619P62db62tb63Nn73tv739z85uP85+X86ef86uj97u398O798vH+9PT+9fT+9/b++Pf//v7///9nQat2AAAASHRSTlMABQYHExQXGRobHCAkJicrTk9QUVZXWV5gZGZnbG1ub3B0dnh5gI2Oj5CRkra3ucfIysvNzs/Q1Nnb3N3s7vHy8/T1+fr7/P5navj5AAACHUlEQVRIx62V6V/TQBCGX5CWoqiAUM9axau0UIuKIhpK2tqOoq0X3jd4n5VWRWX+dj7QZGc3aZIf+n6b3WeOzUx2AVOJZC4/Z1Uq1lw+m+xHiGLpM6RpOh0LwLfnSuRRKTvQBe9JF8lXpRPb/PidM9RVF3Z7+T0LFKDiiMnvu0KBqh7U+QMUqkNaPdVwh+qw4gfnw3mihV0O33s+Ck90rrfjcDwaTzTe6a8t1h58fCyRF+9vyaISAICcWLr/h9efKnOZ+ecdsZ0BgJiYn4d/mXn9iWOuMDP/uK327RiAI1p8ZnZzLDMz6zlSANQ8X/u9SXRyrHQsbiqHApBQ1tXvLDxcnt8ppBZHUpyp0XI9nr12+S/XBTKmfSPhwf48TSCvtaa+avJfb2jAJC7pzTRz6PGJLsIy2q/nMOITXUaFAjw8PJVRNpforXJ4Tl4HsyR6JSqSc+WUZBxa9Ev1XDt0vnt8vxyTeuOM+D45JrTREPy3tr/HKPqF9dLlPy+KuXqkiFocmFbmJ8XLnr9RRAFAWplLa4pXHq26IlLGL3pvTfGOR6uh9u0+AMiKU9z9Jeehvsrcvim2TwIABuQ1s9T+sKisRrMp4lNx85rBMYqoo85VORONP9uz1csYGIly3Q/JB2JvLYyv7f+3JwsYLgbx80PwaEch4PsM/o+HHUAiY3tx+1QC3RU7bBR2OtWHEMXHMlOzVqVszU5lRuOe7Q3ZakQDPbBoTgAAAABJRU5ErkJggg==, 810:iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAABYlBMVEUAAAAA//9Vqv8zmcwrqtUzmeYrldUzmd04l9c3mN02mNkzmdwzmds1mNw0mN01mNszmdo1l9o1l9w1mNwzmNs0l9wzmdo1l9s0mNo0mNs0mds0mdo0mNs0mNs1mNs1mNs1mds0mNs0mdo0mNs0mNs0l9s0mNs1mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs1mNs2mds3mtw4mtw5mtw6m9w+nd0/nt1Cn91Cn95DoN5God5Iot9Jot9MpN9QpuBSp+BVqeFZq+Fhr+Nir+NjsONmseRosuRxt+ZzuOZ0uOZ1ued4uud8vOh/vuiAv+mBv+mCwOmFwemGwuqTyOyYy+2bzO2cze2fzu6gz+6hz+6i0O6o0/Ct1fCu1vGw1/G12fK73fO83fO/3vTB3/TD4fTO5vbW6vjX6/jb7fnd7vni8Prj8frm8vvs9fzu9/zx+Pzy+f30+f37/f79/v/+//////9FPg/YAAAALnRSTlMAAQMFBgoMHiAlL0FGSEpNWmBldHd7fYeZoaKnsrm9x8zP0dfZ5evu8fr7/P3+LMHCbgAAAUlJREFUSMe11FVTXFEQhdGNQyBAYAjuLrm4uwwW3CW4uwzf/+cpRQEFdD+wX+9eVaf7nLqSflU0BKY0lKdLUmpgz58USXkOEORKKvSAwk/A1PZypwesAddddtAZAVixgyEAdu2g9QZg1jHD+C3sNHq21D7S71ur+x68oG14etoKWmY3ji4jcGQF3auXACzZjzQGgGNLfwHOHUOvA2w6wClA2A56IsBDix3MARw4Lm4fYMEOmu+Bpz47CAOcOd7SJsCaA1wAjNpBP8BdUzAzaQQLAMfB4EWHEWwD/Bu4GrceaQ/g6XHRPMMEwMO8Y0uThydbvd//E/gYFHhAgaTfHpAlKb7E3i+Ok6SYtMzQ/2SVvWlkh16SmRqtd0l4Vf+hr1P70s+JlQfUhSQPqEqWC5QmygXy4+QB9aEoc1+VQVD9U45k1BQlffb9GZxKanlvO0DPAAAAAElFTkSuQmCC, 1301:iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAB7FBMVEUAAAAA/wAA/4BVqlVAv4AzzGYr1YAk220gv4A5xnEzzGYu0XQr1Wo3yG0zzHcrxnEoyWszzHMsyG8rynUzzHAxznYv0HErzG8xznMwz3ArzXEvyXIuy28tzHMszXAxznMtzHEszW8rznIwynAvy3IuzHAtzXMsznEwym8vy3EuzG8uzXItznAsynIwy3AvzHIuzXAuznIty3EwzHAvzXIuzXEty3EtzHAuy3Iuy3AtzXAvzXIvy3AuzHEtzXItzXEvy3AtzXEvzHEuzHEtzXAuzHIuzHEuzXIvzHEuzXEuzHIuy3IvzHAuy3IvzHEuzXAuy3EvzHEuy3EtzHAuzHEtzHIvy3IuzHAuzHEtzXAuzHEuzHEtzXIty3EvzHAuzHEuzXEty3EvzHIuzHIuzXEuzHEuzXEtzHEvzHIuzHEuzXAuzHEuzXEuzHItzHEvzHAuzXEuzHEuzXEuzHEuzHEvzXEuy3EuzHEuzHEtzXIuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEvzHEuzHAuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHAtzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHEuzHHh23O3AAAAo3RSTlMAAQIDBAUGBwgJCgsMDg8SExQXGBkaGx4fICQmJygpKi0uLzAxMjM0NTY3ODk6QEFCQ0RLTE1PUFNZW1xdX2BhYmZoamtub3BzdXl7fYCDhIWIio2QkpSWl5ianJ2en6Cio6Smp6usrq+wsbW2uLm6u73AwsTFxsjJyszOz9HS1NbX2tvc3d7f4OHi4+Tl5ufo6evt7/Dy8/T19vf4+fr7/P3+J/aI2QAAAjVJREFUGBm9wftfS2EAB+Dvumyim9RKbqGEKIqI5LaE3ErKZSWxUIRMJrknKUQ0lVpr33/UOZ3zvufsnK1P/dLzYCXtzMNyJFz0YDlSfD0OLOKcE1FS/aGNMGRUX7jiKYDJ2edrYOJ8wtuQXI0zVD3KgpQ69XQVDO1kEYTkx9S9SYHUzTZIJ8gPkC5T8kCqJU9Clz9JNkLI+kfpGaQKcnI9NF0kKyF4aPgFqYhkNxbsp6IEgo+GWUh7qSiDqpeKaxA+0/Ab0gEqeqHYxgUtbqhyb9HkFaTjVG0HcJ2a2ZcdrQ8/MkotpBtUNQGOb4yrPxnSJ6rGHChiXINuSMXUbEUd4+nLhqGLmjp4GYfXBUN5hBovAowpfAYmGaPU9eErYwkdgklagMII/jCGSBVMcgKUJhBmDE0wKf1BQxjTtBtyQUq6FKbJFMZpVwUp288oPzFAm7FECBuGGa0fnbRphpA1RAsf6mlzEIKPVuexjzaboCuO0KoUziAtwi7o6mk14QQ6aPEXwj1a3QVQQosZF3Q9tCqHop8WAzX5yUBmWfMcLd47oKhmDMEIYzgCVcILLtHrRCwoCHFJ5vdA18AlaYCQ1MMowasVuw+3zzGa3wkp/R1NAtlQ7fhOs8G1MMkbpjSaCU1hiIYveYiyLkDhFAQvpbe5sFjdSZ0bQiWFB2mwcdSMUxVJhLCLmuBpxJTZOk+FG0IlVfN3chDPlrZp8iiEFpJT3s1YTHpNUyGEmyP3j6Vjpf0HT8HklxcxkYwAAAAASUVORK5CYII=, 1091:iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAABxVBMVEUAAAD//wD//wD/vwD/zAD/vwDmzBrqvxXtyBLwww/yyQ3yvw30yAv1wgr1xBTtwRLwwQ/www/xxg7xwQ7zxwzzwgzzxBLvxRDxxg7ywg3vwxDvxBDwxA/yxRDywhDywxDxww7yxBDwxA/xww7xww7xxBDyxQ/wxA/xxBDxxRDxww/xxA7xxQ7xwxDwxA/wxQ/xxA/xxA/yww/xxBDxxA/xxA/yxA/wxA/xxA7xxBDxxA/xxA/yxA/xww/xxA/xxA/xxA/xxA/yww/wxA/xxA/xxA/xxA/xxA/xxA/xxA/xxA/xxA/xxA/wxA/xxA/xxA/xxA/xxA/xxA/xxA/xxA/xxA/xxBDxxBHxxRXyxxnyyB7yyCDyySLyyifzyyrzyyvzzC7zzDDzzTLzzTPzzjfzzjjzzjn0zzr00ED00EL00UP000r100v100z11VP11VT111v111z22GD22WX22mf222z222333G/33HL33XP33XX33nf44YX55pv5553555/77bb777788cf8887889D99dX99df99tj99tz99+D9+OL9+OP++ej++ur+/PH+/PT+/fb//ff//fj//vn//vr//vz////4//v2AAAAVXRSTlMAAQIEBQgKDA4RExQXGRodISIkJSkqKzA2O0BBRU9QUV1faGprcXZ4gYOEj5CRm52oqau0tre+wcPEzM/Q1tfZ4OHj5Ofp6uzt7/Dy9Pb4+fr7/P3+E1pkvgAAAdhJREFUGBmtwYlbTFEcBuCvO9qQ3RgSFS2WiqIsqUGIGSHzSZYo2ddkl7Lv2f3+XueeuTNz75nt3ufxvvhfSkoQyPJoNIwArN1ktwX/6qjUwbfSvVT2l8GvJmpN8GneEWqx+fCnhY4W+LJ4gI7jS+FHO9Pa4UMkwYyVKG4HOTY9o7wYIXeiqDUkn4k2SXItigjtIflItAmSvXNQ2Hoqk6LdobIOBZX3UZkQ7SaVgxUoZCNtd0W7TtsGFLAgTtst0S7TdnQh8mujdkO0UWptyGvZCWpXRTtP7eQK5LOdSWOinWHSNuSxio4R0U7TsRo5WbvoOCe2v0zptpBLLVOGxfadabXIoTTKlCGxzTJtXxmyNTLjtyifmdGILJX9zPgmygdmHJ4L02a6fBXlLV02wbBogC6fRHlNl2NL4LWVbu9FeUW3LfCIJOj2RpSXdEtE4NZFj3szym16dMGlhj7UIC3UQ8PQ+KVTNPSEkFJPw7WPIu+u0FAPR3kfvc7OivJlmF4HKpDUTMNz0e7T0AytKk7DtGhTNMSrYGulaUq0hzS1QgkP0jT+R5QfF2gaDAPoYLbHv0R+PmC2DqCauYw+fXKRuVSjk4F0op+BHEJDjAHEGgCrMgALgf0D+/WonFYwCuwAAAAASUVORK5CYII=
iconDirectory = 115:iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAACVBMVEVHcEz/ojP///8aaB/0AAAAAXRSTlMAQObYZgAAABhJREFUCNdjYIAD0VAYobUKzAoNIZqAAwCd3AtUoiCniwAAAABJRU5ErkJggg==, 158:iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAG1BMVEVHcEz/ojP/////9+3/tmD/uWb/qEH/umj/uGNoGOEVAAAAAXRSTlMAQObYZgAAADFJREFUCNdjYMAAjIKCgqgMJiUlJbgIEAiAGSkwhnMglCFhDmEAlaOJINTAdYHNwQAAxsIHF+bypqkAAAAASUVORK5CYII=
iconFile = 130:iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEVHcEw6fLw6e7v///9NrS3vAAAAAnRSTlMAiJXwxioAAAAjSURBVAjXY2AAAaZVF0DEExDxEkS8cgAS/w8AiVUNRBMgAADeqxlpte03XQAAAABJRU5ErkJggg==, 176:iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAHlBMVEVHcEw6fLw6e7v////u9PllmMptnc1omstrnMxHhMD2vtcUAAAAAnRSTlMAiJXwxioAAAA/SURBVAjXY2CAAyYlJUMYw0gAxlCEMZQEIAxjYwMIQ0lJAczQDIIyVD2gDKWSJDBD2djYCFUEoQauC2oOFAAA4coLMJ+cy/EAAAAASUVORK5CYII=
DefaultFont = 'Liberation Sans' : 12 : 4 : $0
DoubleClickTime = 600
DoubleClickDistance = 8

Added freshlib/test_code0/theme_win.cfg.



























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
clTextCaret = $FFFF0000
caretTimes = 250, 250
clBorderNeutral = $FFA0A0A0
clBorderLight = $FFFFFFFF
clBorderDark = $FF404040
clBorderNeutralGray = $FF909090
clBorderLightGray = $FFE0E0E0
clBorderDarkGray = $FF808080
clBorderFocused = $FFFF8000
boxBorderWidth = 1
clBtnBk = $FFD4D0C8, $FFE0E0E0, $FFA0A0A0, $80D4D0C8
clBtnTxt = $FF000000, $FF000000, $FF000000, $FF606060
btnBorder = 1, 1, 2, 1073741825
btnPressedOfsX = 1
btnPressedOfsY = 1
btnMarginX = 8
btnMarginY = 8
clToolBtnBk = $FFD4D0C8, $FFE0E0E0, $FFA0A0A0, $80D4D0C8
clToolBtnTxt = $FF000000, $FF000000, $FF000000, $FF606060
tbBorder = 0, 1, 2, 1073741824
tbBorderWidth = 1
tbPressedOfsX = 1
tbPressedOfsY = 1
tbSeparatorType = $2
tbSeparatorWidth = 10
clEditBk = $FFFFFFFF
clEditBkFocused = $FFFFFFFF
clEditTxt = $FF000000
clEditSel = $600A246C
clEditSelTxt = $FFFFFFFF
editBorder = 2
editBorderFocused = 2
clDialogBk = $FFD4D0C8
clDialogTxt = $FF000000
clSplitter = $FF606060
clProgressBk = $FFD4D0C8
clProgressBar = $FF0A246C
progressBorder = 2
clScrollBk = $80D4D0C8, $D0D4D0C8
clScrollSlider = $C0808080, $FF808080
clScrollSliderOvf = $C0FF8080, $FFFF8080
borderScroll = 1
scrollWidth = 12
minSliderHeight = 24
clLabelBk = $FFFFFF
clLabelTxt = $FF000000
clTreeViewBack = $FFFFFFFF
clTreeViewText = $FF000000
clTreeSelected = $FF0A246C
clTreeSelectedTxt = $FFFFFFFF
clTreeFocused = $FF0A246C
clTreeFocusedTxt = $FFFFFF00
tvBorder = 2
tvIcons = 117:iVBORw0KGgoAAAANSUhEUgAAAAsAAAALAQMAAACTYuVlAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAAB1JREFUCNdjYGBgqD/A4ODA4AJG8TAGUAQozsAAAGXeBi6dny4xAAAAAElFTkSuQmCC, 114:iVBORw0KGgoAAAANSUhEUgAAAAsAAAALAQMAAACTYuVlAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABpJREFUCNdjYGBgqD/A4OAARfEOCDZQnIEBAGTOBh7FK7i2AAAAAElFTkSuQmCC
clMenuBack = $FFD4D0C8
clMenuText = $FF000000
clMenuTextGray = $80000000
clMenuSelection = $FF000080
clMenuSelIcon = $FFADAABB
borderMenu = 1
menuIconMargin = 4
menuSeparatorHeight = 10
menuMinTextDist = 32
menuSubIcon = 206:iVBORw0KGgoAAAANSUhEUgAAAAYAAAALCAYAAABcUvyWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABLSURBVBiVjc+xDYBADATBeSQCIgqgYzJaoARSInqgH5MQvQ6JzezVyT7YMAgUdoxJFA5MSRQuzEkUbiztHXrOz8SvG/Gr2GNF65cP8X4dCPkfyx8AAAAASUVORK5CYII-
menuSubIconSel = 207:iVBORw0KGgoAAAANSUhEUgAAAAYAAAALCAYAAABcUvyWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABMSURBVBiVjc+xDYAwEEPRCxIFFQOwcTpWyAi0VOzAPi8FXTgk3H5Z3w7smGKMJw1zBuDAkgG4sGYAbmwFXuKI87Pxy5GuSn9UlNHeAYWml41HdWNxAAAAAElFTkSuQmCC
menuSubIconGray = 280:iVBORw0KGgoAAAANSUhEUgAAAAYAAAALCAYAAABcUvyWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACVSURBVBiVY5i6dOnEhoYGJgY0wMTAwJgnpqq6YObMmaxoEgwM/xkYY//w8K7tW7WKE0UCCnzZf//ZMXPVKn4GBgYGxqlLl/1HM/4q0x8WdwxLGRgYtP+x/JmPTeIq0x+WRHSJQyysLNaZ8WFPkSU2/2Rl8UgPC/sIdxUjw//FLF8+BxeFhX2HK5u2ZFnX////GdEtAgDKqy21io/rDwAAAABJRU5ErkJggg--
iconMenuChecked = 246:iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQCAYAAAArij59AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABzSURBVCiRzc6xDUEBFIXhjxhAp6UUjSEkbwSjmIDEBFaxgNIYKEWhlKO5LxJ5r+aU9z85/+X3GfSjLDDug1NyJ5cuOCInErJBDmRHSpd9wSMZIuc6bElDXuRGJu3kjFyr9KzC6tu7JI/PUvfnc7Iu71/lDbA1NqOlVrCQAAAAAElFTkSuQmCC
iconMenuCheckedGray = 299:iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQCAYAAAArij59AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACoSURBVCiRxY4hjgJBFAXrd2YMiiOsJTgEAvF7xqJJUGQvsQoPIcFhOAEWT7KTTPoCHAEJa1es7LcKNYOmbL3kFbwfeyXquh4Dw95BVVUfkq7AX+iRhaQTMJR0CO5+jDFun3eSNsBM0iWltC/MbApMYowKIaSc8xfwKMvyE8hB0gK4A+uc8xnAzFZN0/wAhJTSzczmwC8wAHZt2353yt195O5LoBP+bv4BnNI5/xB5g9MAAAAASUVORK5CYII-
clCheckboxBack = $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFC0C0C0
clCheckboxTxt = $FF000000
clCheckboxTxtGray = $FF808080
cbIconSize = 13
cbMargin = 2
borderCheckbox = 2
iconChecked = 282:iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACXSURBVCiRzc89DgFhEIDhVy/Z0gEUolFIuIBCotNKFC6goHQdV9BxD41Cp1gVBRF5NRPZbMh+jcR08/NMZuDPwgm4A1upoAveQMF5CqiD+wAHMCs2M3AFdkpoHeAO9ssbF9E8g+2ozaImuPx0RhPMY+AIDsFr5Buw9u3+HngpbBc8gY2qx0fgI8ATHFSANxyDW3CaCH4YL0VGUkYKfrkaAAAAAElFTkSuQmCC
iconCheckedGray = 404:iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAERSURBVCiRvdAhS0NhFIfx57zvhYUJBs0uGMTqB9h2LwMR7KJLbmAQP4FN8EOYBItNEAQx7N67G9UmliHKxbYomOS955iUaZgW/bcD51ce+K/Jb57iON5S1b5zbjfP81H0E0iSZEVVj0WkBqwCIzcNtNvtGVU9BWpm9uS9PwGIADqdzmwIYc97f5Gm6d2EOwKWzOzNe785GAxeABxAVVV94DCEkDebzWWAVqu1DXQBRGQ/y7KbLyGSJFlU1WtgzsyenXM7ZnYG1M3ssiiKdcA+kAPIsuzRzNaAVxFZMLMroA6MoyjqTYJPBFAUxa2IbAABwMxURLppmo6/B/KTR1mWD41G415E5oGD4XB4Pq3u3+8d34hqDI8BY9gAAAAASUVORK5CYII-
DefaultFont = 'Liberation Sans' : 13 : 2 : $0

Added freshlib/test_code0/unicode_emo.txt.



>
1
😀😱:

Added freshlib/test_code0/unicode_test.txt.















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
00000000011111111112222222222333333333344444444445555555555666666666677777777778
12345678901234567890123456789012345678901234567890123456789012345678901234567890
;This is example text, aimed simply to show the features of the FreshEdit control.

;1. Word-wrap feature. It works only for the lines formated with word-wrap format. You can set/remove word-wrap format by Ctrl+W key.

;2. FreshEdit can save the format into the source file. The formating is transparent for FASM compiler, so you can compile the files without removing formating.

;3. FreshEdit uses UTF-8 encoding - see following samples:

;Russian: Я могу еÑÑ‚ÑŒ Ñтекло, оно мне не вредит.
;Yoruba: Mo lè je̩ dígí, kò ní pa mí lára.
;Greek: ΜποÏÏŽ να φάω σπασμένα γυαλιά χωÏίς να πάθω τίποτα.
;Québécois: J'peux manger d'la vitre, ça m'fa pas mal.
;Ukrainian: Я можу Ñ—Ñти Ñкло, Ñ– воно мені не зашкодить.
;English: I can eat glass and it doesn't hurt me.

;5. The bookmarks are saved with the text as well. Use Ctrl+B to set/remove a bookmark.

;6. Also FreshEdit, has code folding feature.
proc SomeTestProcedure
begin
        nop
        mov     eax, 1234
        return
endp

;7. also, there are line numbers and breakpoint icons on the left margin of the editor. You can set/remove breakpoint with F2 key.

        nop
        nop
        int3

; 8. Color themes: Click on "T" button to switch the color theme for the editor.

; 9. Zebra background - if you like such eye-candy things. Click on "Z" button in order to switch it on/off.

proc AnotherTestProcedure
begin
        xor     eax, eax

locals  ; We have of course several folding levels.
  .x  dd  ?
  .y  dd  ?
  .rect TBounds
endl

        mov     ecx, 'ABCD'
        return
endp

; 10. Click "#" to turn on/off the line numbers.
; 11. Ctrl-T will switch ON/OFF the whole left margin field.
; 12. Alt+Ins will switch the type of selection - line, char and block are supported for now.

Added freshlib/testx/xprotocol.asm.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: FreshLib portable console application.
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

LIB_MODE equ GUI

@BinaryType GUI, compact

options.DebugMode = 1
options.DebugMode.DisableSHM = 0

options.ShowSizes = 1


include "%lib%/freshlib.asm"


iglobal
  tplMainForm:
        ObjTemplate tfParent or tfEnd, TForm, frmMain,          \
                    width = 800,                                \
                    height = 600,                               \
                    border = borderFull,                        \
                    Caption = 'Test form.',                     \
                    OnClose = MainFormBeforeCLose,              \
                    OnDestroy = MainFormClosed,                 \
                    Visible = FALSE
        ObjTemplate tfChild, TEdit, edtOne,                     \
                    x=100, y = 200,                             \
                    width = 200, height = 32,                   \
                    Text = 'Example text',                      \
                    Visible = TRUE
        ObjTemplate tfChild or tfEnd, TButton, btnOne,          \
                    x = 100, y = 100,                           \
                    width = 96,                                 \
                    height = 32,                                \
                    TextAlign = dtfAlignCenter or dtfAlignMiddle, \
                    Caption = 'Button',                         \
                    OnClick = btnOneClick,                      \
                    Visible = TRUE
endg




start:
        InitializeAll

        call    InitGUIApplication
        call    GUI.Init

; create window:

        stdcall CreateFromTemplate, tplMainForm, 0
        set     ebx, TForm:Visible, TRUE

        call    Run

        DebugMsg "Out of Run procedure."

        call    TerminateGUI
        FinalizeAll
        stdcall TerminateAll, 0


proc MainFormClosed as TObject.OnDestroy
begin
        DebugMsg "Application terminate!"
        call    CloseGUIApplication
        return
endp


proc MainFormBeforeCLose as TForm.OnClose
begin
        stdcall ShowMessage, [.self], smiQuestion, 'Close?', 'Do you really want to close this window?', smbYes or smbNo
        cmp     eax, mrNo
        je      .dont

        clc
        return

.dont:
        stc
        return
endp



proc btnOneClick as TButton.OnClick
begin
        get     ecx, [edtOne], TEdit:Text
        set     [frmMain], TForm:Caption, ecx
        stdcall StrDel, ecx
        return
endp


proc OutputVal, .ttl, .number, .format
begin
        push    eax

        stdcall FileWriteString, [STDOUT], [.ttl]
        stdcall NumToStr, [.number], [.format]
        push    eax
        stdcall FileWriteString, [STDOUT], eax
        stdcall FileWriteString, [STDOUT], <txt 13, 10>
        stdcall StrDel ; from the stack

        pop     eax
        return
endp


proc OutputList, .ttl, .list, .index
begin
        push    eax edx

        stdcall FileWriteString, [STDOUT], [.ttl]

        mov     eax, [.index]
        mov     edx, [.list]
        cmp     eax, [edx]
        cmova   eax, [edx]

        stdcall FileWriteString, [STDOUT], [edx+4*eax+4]
        stdcall FileWriteString, [STDOUT], <txt 13, 10>
        pop     edx eax
        return
endp



proc OutputFormat
begin
        movzx   eax, [edi+xformat.depth]
        stdcall OutputVal, "Depth: ", eax, ntsDec or ntsUnsigned

        movzx   eax, [edi+xformat.bpp]
        stdcall OutputVal, "Bits per pixel: ", eax, ntsDec or ntsUnsigned

        movzx   eax, [edi+xformat.pad]
        stdcall OutputVal, "Scanline pad: ", eax, ntsDec or ntsUnsigned

        stdcall FileWriteString, [STDOUT], <txt 13, 10>

        add     edi, sizeof.xformat
        return
endp




proc OutputVisual
begin
        push    ecx edx

        stdcall OutputVal, "Visual ID: ", [edi+xvisualtype.id], ntsHex or ntsUnsigned or ntsFixedWidth + 8

        movzx   eax, [edi+xvisualtype.class]
        stdcall OutputList, "Visual class: ", listVisClass, eax

        movzx   eax, [edi+xvisualtype.bits_per_rgb]
        stdcall OutputVal, "Bits per RGB value: ", eax, ntsDec or ntsUnsigned

        movzx   eax, [edi+xvisualtype.map_entries]
        stdcall OutputVal, "Colormap entries: ", eax, ntsDec or ntsUnsigned

        stdcall OutputVal, "  Red mask: ", [edi+xvisualtype.red_mask], ntsHex or ntsUnsigned or ntsFixedWidth + 8
        stdcall OutputVal, "Green mask: ", [edi+xvisualtype.green_mask], ntsHex or ntsUnsigned or ntsFixedWidth + 8
        stdcall OutputVal, " Blue mask: ", [edi+xvisualtype.blue_mask], ntsHex or ntsUnsigned or ntsFixedWidth + 8

        stdcall FileWriteString, [STDOUT], <txt 13, 10>

        add     edi, sizeof.xvisualtype
        pop     edx ecx
        return
endp



proc OutputDepth
begin
        push    ecx edx

        movzx   eax, [edi+xdepth.depth]
        stdcall OutputVal, "Depth: ", eax, ntsDec or ntsUnsigned

        movzx   edx, [edi+xdepth.num_visual]
        stdcall OutputVal, "Visual types: ", edx, ntsDec or ntsUnsigned

        stdcall FileWriteString, [STDOUT], <txt 13, 10>

        movzx   edx, [edi+xdepth.num_visual]
        add     edi, sizeof.xdepth

        xor     ecx, ecx
        test    edx, edx
        jz      .finish

.vis_loop:
        call    OutputVisual
        inc     ecx
        cmp     ecx, edx
        jne     .vis_loop

.finish:
        pop     edx ecx
        return
endp


proc OutputScreen
begin
        push    ecx edx

        stdcall OutputVal, "Root window: ", [edi+xscreen.root_window], ntsHex or ntsUnsigned or ntsFixedWidth + 8
        stdcall OutputVal, "Default colormap: ", [edi+xscreen.colormap], ntsHex or ntsUnsigned or ntsFixedWidth + 8
        stdcall OutputVal, "White pixel: ", [edi+xscreen.white_pixel], ntsHex or ntsUnsigned or ntsFixedWidth + 8
        stdcall OutputVal, "Black pixel: ", [edi+xscreen.black_pixel], ntsHex or ntsUnsigned or ntsFixedWidth + 8
        stdcall OutputVal, "Current input mask: ", [edi+xscreen.event_mask], ntsHex or ntsUnsigned or ntsFixedWidth + 8

        movzx   eax, [edi+xscreen.width_px]
        stdcall OutputVal, "Width [px]: ", eax, ntsDec or ntsUnsigned
        movzx   eax, [edi+xscreen.height_px]
        stdcall OutputVal, "Height [px]: ", eax, ntsDec or ntsUnsigned

        movzx   eax, [edi+xscreen.width_mm]
        stdcall OutputVal, "Width [mm]: ", eax, ntsDec or ntsUnsigned
        movzx   eax, [edi+xscreen.height_mm]
        stdcall OutputVal, "Height [mm]: ", eax, ntsDec or ntsUnsigned

        stdcall OutputVal, "Root visual: ", [edi+xscreen.root_visual], ntsHex or ntsUnsigned or ntsFixedWidth + 8

        movzx   eax, [edi+xscreen.back_store]
        stdcall OutputVal, "Backing stores: ", eax, ntsDec or ntsUnsigned
        movzx   eax, [edi+xscreen.save_under]
        stdcall OutputVal, "Save unders: ", eax, ntsDec or ntsUnsigned

        movzx   eax, [edi+xscreen.root_depth]
        stdcall OutputVal, "Root depth: ", eax, ntsDec or ntsUnsigned

        movzx   edx, [edi+xscreen.num_depths]
        stdcall OutputVal, "Allowed depths: ", edx, ntsDec or ntsUnsigned

        stdcall FileWriteString, [STDOUT], <txt 13, 10>

        movzx   edx, [edi+xscreen.num_depths]
        add     edi, sizeof.xscreen
        xor     ecx, ecx
        test    edx, edx
        jz      .finish

.depth_loop:
        call    OutputDepth
        inc     ecx
        cmp     ecx, edx
        jne     .depth_loop

.finish:
        pop     edx ecx
        return
endp

Added freshlib/testx/xprotocol.fpr.

cannot compute difference between binary files