AsmBB

Check-in [16aa42d556]
Login

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

Overview
Comment:The initial, partially working commit.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 16aa42d5565a429f1144a6d744be451b6375ccb6
User & Date: johnfound 2016-03-06 16:06:30
Context
2016-03-07
14:15:52
Started work on FastCGI implementation. The work is in very early stage and serves mainly as an experimental setup for understanding how FastCGI works. check-in: eaadfa8d98 user: johnfound tags: trunk
2016-03-06
16:06:30
The initial, partially working commit. check-in: 16aa42d556 user: johnfound tags: trunk
2015-03-25
13:42:28
initial empty check-in check-in: 406747e249 user: johnfound tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Added source/commands.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


sqlSelectThreads text "select *, (select count() from posts where threadid = Threads.id) as PostCount from Threads limit 20 offset ?"


proc ListThreads

.stmt  dd ?
.stmt2 dd ?

.start dd ?

.threadID      dd ?
.threadCaption dd ?
.threadStart   dd ?

begin
        stdcall GetQueryItem, [hQuery], txt "start=", 0
        test    eax, eax
        jz      .default

        push    eax
        stdcall StrToNum, eax
        stdcall StrDel ; from the stack

.default:
        mov     [.start], eax

        stdcall StrNew
        mov     edi, eax

        stdcall StrCat, edi, '<div class="threadlist">'

        lea     eax, [.stmt]
        cinvoke sqlitePrepare_v2, [hMainDatabase], sqlSelectThreads, -1, eax, 0

        cinvoke sqliteBindInt, [.stmt], 1, [.start]

.loop:
        cinvoke sqliteStep, [.stmt]
        cmp     eax, SQLITE_ROW
        jne     .finish

        cinvoke sqliteColumnInt, [.stmt], 0
        mov     [.threadID], eax

        cinvoke sqliteColumnText, [.stmt], 1
        stdcall StrDupMem, eax
        mov     [.threadCaption], eax

        cinvoke sqliteColumnInt, [.stmt], 2
        mov     [.threadStart], eax

        stdcall StrCat, edi, '<div class="thread_summary">'

; thread posts count

        stdcall StrCat, edi, '<div class="post_count">'

        cinvoke sqliteColumnInt, [.stmt], 3

        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        stdcall StrCat, edi, eax
        stdcall StrDel, eax

        stdcall StrCat, edi, '</div>'

; link to the thread

        stdcall StrCat, edi, '<a class="thread_link" href="index.cgi?cmd=1&amp;threadid='

        stdcall NumToStr, [.threadID], ntsDec or ntsUnsigned
        stdcall StrCat, edi, eax
        stdcall StrDel, eax

        stdcall StrCharCat, edi, '">'
        stdcall StrCat, edi, [.threadCaption]
        stdcall StrCat, edi, txt '</a>'

        stdcall StrCat, edi, "</div>"   ; thread_summary.

        jmp     .loop


.finish:
        stdcall StrCat, edi, "</div>"   ; threadlist

        cinvoke sqliteFinalize, [.stmt]

; now output the whole file!

        stdcall FileWriteString, [STDOUT], <"Status: 200 OK", 13, 10>
        stdcall FileWriteString, [STDOUT], <"Content-type: text/html", 13, 10, 13, 10>


        stdcall FileWrite, [STDOUT], htmlHeader, htmlHeader.length
        stdcall FileWriteString, [STDOUT], edi

        stdcall WriteTimestamp

        stdcall FileWrite, [STDOUT], htmlFooter, htmlFooter.length

        stdcall StrDel, edi
        stdcall StrDel, [.threadCaption]

        return
endp



htmlHeader  text '<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>Thread list</title><link rel="stylesheet" href="/all.css"></head><body><h1>This is simply experiment. Better go to <a href="http://asm32.info">my home page</a></h1>'
htmlFooter  text '</body></html>'






sqlSelectPosts text "select * from Posts where threadID = ? limit 20 offset ?"



proc ShowThread
.start dd ?
.stmt  dd ?
.threadID dd ?

begin
        stdcall GetQueryItem, [hQuery], txt "threadid=", 0
        test    eax, eax
        jz      .err400

        push    eax
        stdcall StrToNum, eax
        stdcall StrDel ; from the stack

        mov     [.threadID], eax

        OutputValue "Thread ID:", eax, 10, -1


        stdcall GetQueryItem, [hQuery], txt "start=", 0
        test    eax, eax
        jz      .start_ok

        push    eax
        stdcall StrToNum, eax
        stdcall StrDel ; from the stack

.start_ok:
        mov     [.start], eax

        stdcall StrNew
        mov     edi, eax

        stdcall StrCat, edi, '<div class="thread">'

        lea     eax, [.stmt]
        cinvoke sqlitePrepare_v2, [hMainDatabase], sqlSelectPosts, -1, eax, 0

        cinvoke sqliteBindInt, [.stmt], 1, [.threadID]
        cinvoke sqliteBindInt, [.stmt], 2, [.start]

.loop:
        cinvoke sqliteStep, [.stmt]

        OutputValue "sql step result:", eax, 10, -1

        cmp     eax, SQLITE_ROW
        jne     .finish

        stdcall StrCat, edi, '<div class="post">'

        cinvoke sqliteColumnInt, [.stmt], 2             ; userID

        stdcall RenderUserInfo, edi, eax

        cinvoke sqliteColumnInt, [.stmt], 3             ; post time

        stdcall RenderPostTime, edi, eax

        cinvoke sqliteColumnText, [.stmt], 4            ; Content

        stdcall RenderPostContent, edi, eax

        stdcall StrCat, edi, "</div>"            ; div.post

        jmp     .loop


.finish:
        stdcall StrCat, edi, "</div>"   ; dic.thread

        cinvoke sqliteFinalize, [.stmt]

; now output the whole html!

        stdcall FileWriteString, [STDOUT], <"Status: 200 OK", 13, 10>
        stdcall FileWriteString, [STDOUT], <"Content-type: text/html", 13, 10, 13, 10>


        stdcall FileWrite, [STDOUT], htmlHeader, htmlHeader.length
        stdcall FileWriteString, [STDOUT], edi

        stdcall WriteTimestamp

        stdcall FileWrite, [STDOUT], htmlFooter, htmlFooter.length

        return


.err400:
        stdcall ReturnError, "400 Bad Request"
        return
endp









proc SavePost
begin

        stdcall FileWriteString, [STDOUT], <"Status: 200 OK", 13, 10>
        stdcall FileWriteString, [STDOUT], <"Content-type: text/plain", 13, 10, 13, 10>

        stdcall FileWriteString, [STDOUT], "Not implemented!"

        return
endp







proc WriteTimestamp
begin

        stdcall FileWriteString, [STDOUT], '<p class="timestamp">Script runtime: '

        stdcall GetTimestamp
        sub     eax, [StartTime]
        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        push    eax
        stdcall FileWriteString, [STDOUT], eax
        stdcall StrDel ; from the stack

        stdcall FileWriteString, [STDOUT], txt 'ms</p>'

        return
endp

Added source/create.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
BEGIN TRANSACTION;

/* Data tables */

create table if not exists Users (
  id	    integer primary key autoincrement,
  nick	    text,
  passHash  text,
  status    integer,  -- active, banned, etc.
  user_desc text,     -- free text user description.
  email     text      -- user email
);


INSERT INTO Users VALUES (1,'johnfound','',NULL,NULL,'johnfound@asm32.info');


create table if not exists Threads (
  id	    integer primary key autoincrement,
  Caption   text,
  StartPost integer references Posts(id)
);


INSERT INTO Threads VALUES (1,'Welcome',1);


create table if not exists Posts (
  id	      integer primary key autoincrement,
  threadID    integer references Threads(id),
  userID      integer references Users(id),

  postTime    integer,	-- based on postTime the posts are sorted in the thread.
  Content     text
);


INSERT INTO Posts VALUES (1,1,1,1457118799,'Welcome in AsmBB. This is forum engine implemented using assembly language.');


create table if not exists Tags (
  id	      integer primary key autoincrement,
  Tag	      text,
  Description text
);

INSERT INTO Tags VALUES (1,'asm,assembly language,асемблер','The most advanced programming language.');
INSERT INTO Tags VALUES (2,'chat,free talk,heap',"Talks for everything");
INSERT INTO Tags VALUES (3,'C,C++,C#',"Talks about C/C++/C# languages");


/* Relation tables */

create table if not exists ThreadTags (
  ThreadID integer references Threads(id),
  TagID    integer references Tags(id)
);


INSERT INTO ThreadTags VALUES (1,2);
INSERT INTO ThreadTags VALUES (1,1);


create table if not exists UnreadPosts (
  UserID integer references Users(id),
  PostID integer references Posts(id),
  Time	 integer
);



create table if not exists Attachements (
  postID   integer references Posts(id),
  filename text,
  notes    text,
  file	   blob
);

COMMIT;

Added source/get.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

uglobal
  hDocRoot  dd ?
  hQuery    dd ?

  Command   dd ?
endg



proc InitScriptVariables
begin

; first read document root.
        stdcall GetEnvVariable, 'SCRIPT_FILENAME'
        jnc     .root_ok

        stdcall StrDupMem, txt "./"

.root_ok:
        mov     [hDocRoot], eax
        stdcall StrSplitFilename, eax
        stdcall StrDel, eax

; then read query string

        stdcall GetEnvVariable, 'QUERY_STRING'
        jnc     .query_ok

        stdcall StrNew

.query_ok:
        mov     [hQuery], eax

; parse query arguments

        stdcall GetQueryItem, [hQuery], txt 'cmd=', txt '0'
        push    eax

        stdcall StrToNum, eax
        mov     [Command], eax

        stdcall StrDel ; from the stack


        clc
        return
endp




proc GetQueryItem, .hQuery, .itemname, .default
begin
        push    ecx esi

        stdcall StrLen, [.itemname]
        mov     ecx, eax

        stdcall StrPos, [.hQuery], [.itemname]
        jnz     .item_found

        mov     eax, [.default]
        test    eax, eax
        jz      .finish

        stdcall StrDupMem, eax
        jmp     .item_ok

.item_found:
        lea     esi, [eax+ecx]
        stdcall StrCharPos, esi, '&'
        jnz     .copy_item

        stdcall StrLen, esi
        lea     eax, [esi+eax]

.copy_item:
        sub     eax, esi
        stdcall StrExtract, esi, 0, eax

.item_ok:
        stdcall StrURLDecode, eax

.finish:
        pop     esi ecx
        return
endp

Added source/index.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
; _______________________________________________________________________________________
;|                                                                                       |
;| ..:: Fresh IDE ::..  template project.                                                |
;|_______________________________________________________________________________________|
;
;  Description: AsmBoard is assembly written message board engine working over FastCGI
;
;  Target OS: Any, supported by FreshLib
;
;  Dependencies: FreshLib
;
;  Notes:
;_________________________________________________________________________________________

include "%lib%/freshlib.inc"

LINUX_INTERPRETER equ './ld-musl-i386.so'   ;'./ld-linux.so.2'

@BinaryType console, compact

options.ShowSkipped = 0
options.ShowSizes = 1

options.DebugMode = 1
options.AlignCode = 0
options.ShowImported = 1

HeapManager  equ ASM


include "%lib%/freshlib.asm"

uses sqlite3:"sqlite3.inc"

include "sqlite3.asm"   ; sqlite utility functions.
include "get.asm"
include "commands.asm"
include "render.asm"


iglobal
  sqlCreateDB file 'create.sql'
              dd   0

  cDatabaseFilename text "board.sqlite"
endg

uglobal
  hMainDatabase dd ?

  StartTime     dd ?
endg


cmdListThreads = 0
cmdShowThread  = 1
cmdSavePost    = 2

cmdMax         = 2


start:
        stdcall GetTimestamp
        mov     [StartTime], eax

        InitializeAll

        stdcall InitScriptVariables

        mov     ebx, [Command]
        cmp     ebx, cmdMax
        ja      .err400

; command in range, so open the database.

        stdcall StrDup, [hDocRoot]
        push    eax
        stdcall StrCat, eax, cDatabaseFilename
        stdcall StrPtr, eax

        stdcall OpenOrCreate, eax, hMainDatabase, sqlCreateDB
        stdcall StrDel ; from the stack
        jc      .err400

; execute the command

        stdcall [procCommands+4*ebx]

; close the database

        cinvoke sqliteClose, [hMainDatabase]

.finish:
        FinalizeAll
        stdcall TerminateAll, 0


.err400:
        stdcall ReturnError, "400 Bad Request"
        jmp     .finish




procCommands dd ListThreads, ShowThread, SavePost



errorHeader  text '<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>HTTP response</title><link rel="stylesheet" href="/error.css"></head><body>'
errorFooter  text '</body></html>'




proc ReturnError, .code
begin
        stdcall FileWriteString, [STDOUT], "Status: "
        stdcall FileWriteString, [STDOUT], [.code]
        stdcall FileWrite,       [STDOUT], <txt 13, 10>, 2
        stdcall FileWriteString, [STDOUT], <"Content-type: text/html", 13, 10, 13, 10>
        stdcall FileWrite,       [STDOUT], errorHeader, errorHeader.length
        stdcall FileWriteString, [STDOUT], txt "<h1>"


        stdcall FileWriteString, [STDOUT], [.code]

        stdcall FileWriteString, [STDOUT], "</h1><p>Time:"

        stdcall GetTimestamp
        sub     eax, [StartTime]

        stdcall NumToStr, eax, ntsDec or ntsUnsigned
        stdcall FileWriteString, [STDOUT], eax
        stdcall FileWriteString, [STDOUT], " ms</p>"

        stdcall FileWrite,       [STDOUT], errorFooter, errorFooter.length
        return
endp

Added source/index.fpr.

cannot compute difference between binary files

Added source/render.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



proc RenderPostContent, .html, .PostText
begin
        pushad


        stdcall StrCat, [.html], '<p class="posttext">'


        stdcall StrCat, [.html], [.PostText]


        stdcall StrCat, [.html], txt '</p>'  ; div.posttext


        popad
        return
endp




proc RenderPostTime, .html, .time
.dtime dq ?
.DateTime TDateTime
begin

        stdcall StrCat, [.html], '<div class="posttime">'

        mov     eax, [.time]
        cdq

        mov     dword [.dtime], eax
        mov     dword [.dtime+4], edx

        lea     eax, [.dtime]
        lea     edx, [.DateTime]
        stdcall TimeToDateTime, eax, edx
        stdcall DateTimeToStr, edx, 0

        stdcall StrCat, [.html], eax
        stdcall StrDel, eax


        stdcall StrCat, [.html], '</div>'  ; div.posttime

        return
endp


sqlUserInfo text 'select U.nick, (select count() from Posts P where P.userID=U.id) as postcount from Users as U where U.id=?'


proc RenderUserInfo, .html, .Uid
.stmt dd ?
begin
        pushad

        stdcall StrCat, [.html], '<div class="userinfo">'

        lea     eax, [.stmt]
        cinvoke sqlitePrepare_v2, [hMainDatabase], sqlUserInfo, sqlUserInfo.length, eax, 0
        cinvoke sqliteBindInt, [.stmt], 1, [.Uid]
        cinvoke sqliteStep, [.stmt]
        cmp     eax, SQLITE_ROW
        jne     .invalid_user

        stdcall StrCat, [.html], '<div class="username">'

        cinvoke sqliteColumnText, [.stmt], 0
        stdcall StrCat, [.html], eax

        stdcall StrCat, [.html], '</div>'  ; div.username

        stdcall StrCat, [.html], '<div class="userpcnt">'

        cinvoke sqliteColumnInt, [.stmt], 1
        stdcall NumToStr, eax, ntsDec or ntsUnsigned

        stdcall StrCat, [.html], eax
        stdcall StrDel, eax

        stdcall StrCat, [.html], '</div>'  ; div.userpcnt

        cinvoke sqliteFinalize, [.stmt]

.finish:
        stdcall StrCat, [.html], '</div>'  ; div.userinfo

        popad
        return

.invalid_user:
        stdcall StrCat, [.html], '<div class="usernull">NULL user</div>'
        jmp     .finish
endp

Added source/sqlite3.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
iglobal
  sqlCheckEmpty db 'select count(*) from sqlite_master',0
endg



;-------------------------------------------------------------------
; 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    edi esi ebx

        mov     esi, [.ptrDatabase]
        cinvoke sqliteOpen, [.ptrFileName], esi
        test    eax, eax
        jz      .openok

.error:
        stc
        pop     esi
        return

.openok:
        xor     ebx, ebx
        lea     eax, [.hSQL]
        lea     ecx, [.ptrNext]
        cinvoke sqlitePrepare, [esi], sqlCheckEmpty, -1, eax, ecx
        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], -1, NULL, NULL, NULL
        test    eax, eax
        jz      .finish

        inc     ebx

.finish:
        mov     eax, ebx
        clc
        pop     ebx esi edi
        return
endp

Added source/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',  \
    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',  \
    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',  \
    sqliteWalHook, <.ptrDB, .procCommitHook, .lparam>,  'sqlite3_wal_hook',  \
    sqliteWin32_MbcsToUtf8, <NONE>,  'sqlite3_win32_mbcs_to_utf8'

Added www/all.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
body * {
  border: 1px solid red;
  box-sizing: border-box;
  padding: 16px;
  background-color: white;
}


div.threadlist {

}

div.thread_summary {
}

div.post_count {
  float: left;
}


a.thread_link {
  display: block;
}


div.userinfo {
  float: left;
  margin-right: 16px;
  width: 200px;
}


div.post {
}

p {
  border: 0px;
}

Added www/ld-musl-i386.so.

cannot compute difference between binary files

Added www/libsqlite3.so.

cannot compute difference between binary files