@@ -101,7 +101,9 @@ sub memset(byref a, v, n)
101101end
102102
103103sub 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.
151153REM - Please consult the QR Code specification for information on
152154REM data capacities per version, ECC level, and text encoding mode.
153155REM
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)
179186end
180187
181188REM
@@ -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)
212219end
213220
214221REM
@@ -241,7 +248,7 @@ REM result in them being clobbered, but the QR Code output will still be correct
241248REM But the qrcode array must not overlap tempBuffer or any segments data buffer.
242249REM
243250func 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)
245252end
246253
247254REM
@@ -259,7 +266,7 @@ REM To save memory, the segments data buffers can alias/overlap tempBuffer, and
259266REM result in them being clobbered, but the QR Code output will still be correct.
260267REM But the qrcode array must not overlap tempBuffer or any segments data buffer.
261268REM
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 0 xEC) xor 0 x11
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
357365end
@@ -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]
474483sub 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