Skip to content

Commit d71e6f3

Browse files
committed
UNITS: qrcode now works up to version 10
1 parent cfe9c2f commit d71e6f3

File tree

1 file changed

+30
-21
lines changed

1 file changed

+30
-21
lines changed

units/qrcode.bas

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@ sub memset(byref a, v, n)
101101
end
102102

103103
sub printArray(byref a)
104-
for i = 0 to 80
104+
local i
105+
local n = min(180, len(a) - 1)
106+
for i = 0 to n
105107
print a[i]; " ";
106108
next i
107109
print
@@ -151,11 +153,15 @@ REM These numbers represent the hard upper limit of the QR Code standard.
151153
REM - Please consult the QR Code specification for information on
152154
REM data capacities per version, ECC level, and text encoding mode.
153155
REM
154-
func qrcodegen_encodeText(text, byref tempBuffer, byref qrcode, ecl, minVersion, maxVersion, mask, boostEcl)
156+
func qrcodegen_encodeText(text, byref qrcode, ecl, minVersion, maxVersion, mask, boostEcl)
155157
local textLen = len(text)
156-
if (textLen == 0) then return qrcodegen_encodeSegmentsAdvanced(0, 0, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode)
158+
if (textLen == 0) then return qrcodegen_encodeSegmentsAdvanced(0, 0, ecl, minVersion, maxVersion, mask, boostEcl, qrcode)
159+
157160
local bufLen = qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion)
158161
local seg = {}
162+
local i
163+
local tempBuffer
164+
159165
if (qrcodegen_isNumeric(text))
160166
if (qrcodegen_calcSegmentBufferSize(qrcodegen_Mode_NUMERIC, textLen) > bufLen) then throw "fail"
161167
seg = qrcodegen_makeNumeric(text, tempBuffer)
@@ -164,6 +170,7 @@ func qrcodegen_encodeText(text, byref tempBuffer, byref qrcode, ecl, minVersion,
164170
seg = qrcodegen_makeAlphanumeric(text, tempBuffer)
165171
else
166172
if (textLen > bufLen) then throw "fail"
173+
dim tempBuffer(textLen)
167174
for i = 0 to textLen - 1
168175
tempBuffer[i] = asc(mid(text, i + 1, 1))
169176
next i
@@ -175,7 +182,7 @@ func qrcodegen_encodeText(text, byref tempBuffer, byref qrcode, ecl, minVersion,
175182
endif
176183
dim segs(1)
177184
segs[0] = seg
178-
return qrcodegen_encodeSegmentsAdvanced(segs, 1, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode)
185+
return qrcodegen_encodeSegmentsAdvanced(segs, 1, ecl, minVersion, maxVersion, mask, boostEcl, qrcode)
179186
end
180187

181188
REM
@@ -208,7 +215,7 @@ func qrcodegen_encodeBinary(byref dataAndTemp, dataLen, byref qrcode, byref ecl,
208215
seg.numChars = dataLen
209216
seg._data = dataAndTemp
210217
segs[0] = seg
211-
return qrcodegen_encodeSegmentsAdvanced(seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, dataAndTemp, qrcode)
218+
return qrcodegen_encodeSegmentsAdvanced(seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, qrcode)
212219
end
213220

214221
REM
@@ -241,7 +248,7 @@ REM result in them being clobbered, but the QR Code output will still be correct
241248
REM But the qrcode array must not overlap tempBuffer or any segments data buffer.
242249
REM
243250
func qrcodegen_encodeSegments(byref segs, lenSegs, ecl, byref tempBuffer, byref qrcode)
244-
return qrcodegen_encodeSegmentsAdvanced(segs, lenSegs, ecl, qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX, qrcodegen_Mask_AUTO, true, tempBuffer, qrcode)
251+
return qrcodegen_encodeSegmentsAdvanced(segs, lenSegs, ecl, qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX, qrcodegen_Mask_AUTO, true, qrcode)
245252
end
246253

247254
REM
@@ -259,7 +266,7 @@ REM To save memory, the segments data buffers can alias/overlap tempBuffer, and
259266
REM result in them being clobbered, but the QR Code output will still be correct.
260267
REM But the qrcode array must not overlap tempBuffer or any segments data buffer.
261268
REM
262-
func qrcodegen_encodeSegmentsAdvanced(byref segs, lenSegs, ecl, minVersion, maxVersion, mask, boostEcl, byref tempBuffer, byref qrcode)
269+
func qrcodegen_encodeSegmentsAdvanced(byref segs, lenSegs, ecl, minVersion, maxVersion, mask, boostEcl, byref qrcode)
263270
assert(isarray(segs) && lenSegs > 0, PROGLINE)
264271
assert(qrcodegen_VERSION_MIN <= minVersion && minVersion <= maxVersion && maxVersion <= qrcodegen_VERSION_MAX, PROGLINE)
265272
assert(0 <= ecl && ecl <= 3 && -1 <= mask && mask <= 7, PROGLINE)
@@ -324,34 +331,35 @@ func qrcodegen_encodeSegmentsAdvanced(byref segs, lenSegs, ecl, minVersion, maxV
324331
padByte = (padByte xor 0xEC) xor 0x11
325332
wend
326333

327-
328334
' Draw function and data codeword modules
329-
addEccAndInterleave(qrcode, version, ecl, tempBuffer)
335+
local _data
336+
dim _data(qrcodegen_BUFFER_LEN_FOR_VERSION(version))
337+
addEccAndInterleave(qrcode, version, ecl, _data)
330338

331339
initializeFunctionModules(version, qrcode)
332-
drawCodewords(tempBuffer, getNumRawDataModules(version) / 8, qrcode)
340+
drawCodewords(_data, getNumRawDataModules(version) / 8, qrcode)
333341
drawWhiteFunctionModules(qrcode, version)
334-
initializeFunctionModules(version, tempBuffer)
342+
initializeFunctionModules(version, _data)
335343

336344
' Handle masking
337345
if (mask == qrcodegen_Mask_AUTO) then
338346
' Automatically choose best mask
339347
local minPenalty = maxint
340348
for i = 0 to 7
341349
local msk = i
342-
applyMask(tempBuffer, qrcode, msk)
350+
applyMask(_data, qrcode, msk)
343351
drawFormatBits(ecl, msk, qrcode)
344352
local penalty = getPenaltyScore(qrcode)
345353
if (penalty < minPenalty) then
346354
mask = msk
347355
minPenalty = penalty
348356
endif
349-
applyMask(tempBuffer, qrcode, msk) ' Undoes the mask due to XOR
357+
applyMask(_data, qrcode, msk) ' Undoes the mask due to XOR
350358
next i
351359
endif
352360

353361
assert(0 <= mask && mask <= 7, PROGLINE)
354-
applyMask(tempBuffer, qrcode, mask)
362+
applyMask(_data, qrcode, mask)
355363
drawFormatBits(ecl, mask, qrcode)
356364
return true
357365
end
@@ -380,12 +388,11 @@ sub addEccAndInterleave(byref segData, version, ecl, byref result)
380388
dim rsdiv(qrcodegen_REED_SOLOMON_DEGREE_MAX)
381389
reedSolomonComputeDivisor(blockEccLen, rsdiv)
382390

383-
local i, j, k, datIndex, jdataLen, ecc
384-
datIndex = 0
391+
local i, j, k, datLen, ecc
392+
local datIndex = 0
393+
385394
for i = 0 to numBlocks - 1
386395
datLen = shortBlockDataLen + iff(i < numShortBlocks, 0, 1)
387-
dim ecc(len(segData)) ' Temporary storage
388-
reedSolomonComputeRemainder(segData, datIndex, datLen, rsdiv, blockEccLen, ecc)
389396

390397
' Copy data
391398
k = i
@@ -398,6 +405,8 @@ sub addEccAndInterleave(byref segData, version, ecl, byref result)
398405
next j
399406

400407
' Copy ECC
408+
dim ecc(blockEccLen)
409+
reedSolomonComputeRemainder(segData, datIndex, datLen, rsdiv, blockEccLen, ecc)
401410
k = dataLen + i
402411
for j = 0 to blockEccLen -1
403412
result[k] = ecc[j]
@@ -474,9 +483,9 @@ REM
474483
sub reedSolomonComputeRemainder(byref dataSeg, datIndex, dataLen, byref generator, degree, byref result)
475484
assert(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX, PROGLINE)
476485
memset(result, 0, degree)
477-
local i, j
486+
local i, j, factor
478487
for i = 0 to dataLen - 1 ' Polynomial division
479-
factor = dataSeg[datIndex + i] xor result[datIndex]
488+
factor = dataSeg[datIndex + i] xor result[0]
480489
memmove(result, 0, 1, degree - 1)
481490
result[degree - 1] = 0
482491
for j = 0 to degree - 1
@@ -702,7 +711,7 @@ sub drawCodewords(byref _data, dataLen, byref qrcode)
702711
' Do the funny zigzag scan
703712
for xright = qrsize - 1 to 1 step -2 ' Index of right column in each column pair
704713
if (xright == 6) then xright = 5
705-
for vert = 0 to qrsize -1 ' Vertical counter
714+
for vert = 0 to qrsize - 1 ' Vertical counter
706715
for j = 0 to 1
707716
x = xright - j ' Actual x coordinate
708717
upward = ((xright + 1) & 2) == 0

0 commit comments

Comments
 (0)