ruediger / qrencode-el

QRCode encoder for Emacs in pure elisp
GNU General Public License v3.0
30 stars 4 forks source link

Support other encodings than byte. #11

Open ruediger opened 3 years ago

ruediger commented 3 years ago

Currently we only support byte as encoding. Not sure how useful other encoding schemes are.

ericsfraga commented 3 years ago

This might be related. Apologies if not.

I tried scanning some Spanish text, e.g. ¡Felix cumpleaños!, and I got an error:

Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p nil) logxor(0 nil 21522) qrencode--bch-encode(0) (let ((size (length qr)) (info (qrencode--bch-encode (logior (ash (qrencode--errcorr errcorr) 3) datamask))) (r1 0) (c1 8) (r2 8) (c2 (1- size))) (let ((--dotimes-limit-- 8) (i 0)) (while (< i --dotimes-limit--) (let ((data (logand (ash info ...) 1))) (qrencode--aaset qr c1 r1 data) (setq r1 (1+ r1)) (if (= r1 6) (progn (setq r1 (1+ r1)))) (qrencode--aaset qr c2 r2 data) (setq c2 (1- c2))) (setq i (1+ i)))) (setq c1 (1- c1) r1 (1- r1) r2 (- size 7) c2 8) (qrencode--aaset qr c2 (1- r2) 1) (let ((i 8)) (while (<= i 14) (let ((data (logand (ash info ...) 1))) (qrencode--aaset qr c1 r1 data) (setq c1 (1- c1)) (if (= c1 6) (progn (setq c1 (1- c1)))) (qrencode--aaset qr c2 r2 data) (setq r2 (1+ r2))) (setq i (+ i 1))) nil)) qrencode--encode-info([[1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1] [1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 1] [1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 1] [1 0 1 1 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1] [1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 1 0 0 1 0 1 1 1 0 1] [1 0 0 0 0 0 1 0 0 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0 1] [1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1] [0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0] [1 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 1] [1 1 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 1 1 1] [1 1 0 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1] [1 0 1 0 1 0 1 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 0 1 1] [0 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 1 0 1 0 0 0 1 1 0] [1 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 0 1 1 0 0 1 1 1] [0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0] [1 0 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 0 0 1] [0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 1 1 1 1] [1 1 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 1 0 1 1 1 0 0] [1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1] [1 0 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 1 1 1 1 1 0 0 1] [1 0 1 1 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0] [1 0 1 1 1 0 1 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 1] [1 0 0 0 0 0 1 0 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0] [1 1 1 1 1 1 1 0 0 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 1]] M 0) (let (version data qr function-pattern datamask) (setq mode (or mode 'byte)) (let ((val (qrencode--find-version (length s) mode errcorr))) (progn (ignore (consp val)) (let ((x388 (car-safe val)) (x389 (cdr-safe val))) (let ((ver x388) (ec x389)) (setq version ver errcorr ec))))) (setq data (qrencode--encode-byte s)) (let ((size-table (aref qrencode--SIZE-TABLE (1- version))) (qrlen (car size-table)) (errcorrlen (car (cdr (assq errcorr (cdr size-table))))) (datalen (- qrlen errcorrlen)) (padding [236 17])) (setq data (vconcat data [64] (let ((i 0) (--cl-var-- (- datalen ... 1)) (--cl-var-- [])) (while (< i --cl-var--) (setq --cl-var-- (vconcat --cl-var-- ...)) (setq i (+ i 1))) --cl-var--))) (let ((datablocks (qrencode--blocks data version errcorr)) (blockerrcorrlen (/ errcorrlen (length datablocks))) (field (qrencode--init-field 285 2)) (lgen (car (cdr (qrencode--gen field blockerrcorrlen)))) (errblocks (let ((--cl-vec-- datablocks) (--cl-idx-- -1) (b nil) (--cl-var-- ...)) (while (and ... ...) (setq b ...) (setq --cl-var-- ...)) --cl-var--))) (setq data (vconcat (let ((i 0) (--cl-var-- datalen) (--cl-var-- ...)) (while (< i --cl-var--) (setq --cl-var-- ...) (setq i ...)) --cl-var--) (let ((i 0) (--cl-var-- errcorrlen) (--cl-var-- ...)) (while (< i --cl-var--) (setq --cl-var-- ...) (setq i ...)) --cl-var--))))) (let ((val (qrencode--template version))) (progn (ignore (consp val)) (let ((x390 (car-safe val)) (x391 (cdr-safe val))) (let ((qrcode x390) (fp x391)) (progn (qrencode--draw-data qrcode fp version data) (setq qr qrcode function-pattern fp)))))) (let ((val (qrencode--find-best-mask qr function-pattern))) (progn (ignore (consp val)) (let ((x392 (car-safe val)) (x393 (cdr-safe val))) (let ((qrcodemasked x392) (mask x393)) (setq qr qrcodemasked datamask mask))))) (qrencode--encode-info qr errcorr datamask) (qrencode--encode-version qr version) (if return-raw qr (qrencode-format qr))) qrencode(#("¡Felix cumpleaños!" 0 18 (fontified t)) nil nil return-raw) (set (make-local-variable 'qrencode--raw-qr) (qrencode s nil nil 'return-raw)) (let ((inhibit-read-only t)) (erase-buffer) (qrencode-mode) (set (make-local-variable 'qrencode--raw-qr) (qrencode s nil nil 'return-raw)) (insert (propertize (qrencode-format qrencode--raw-qr) 'face 'qrencode-face)) (insert "\nEncoded Text:\n" s)) (save-current-buffer (set-buffer buf) (let ((inhibit-read-only t)) (erase-buffer) (qrencode-mode) (set (make-local-variable 'qrencode--raw-qr) (qrencode s nil nil 'return-raw)) (insert (propertize (qrencode-format qrencode--raw-qr) 'face 'qrencode-face)) (insert "\nEncoded Text:\n" s)) (pop-to-buffer buf)) (let ((buf (get-buffer-create qrencode-buffer-name))) (save-current-buffer (set-buffer buf) (let ((inhibit-read-only t)) (erase-buffer) (qrencode-mode) (set (make-local-variable 'qrencode--raw-qr) (qrencode s nil nil 'return-raw)) (insert (propertize (qrencode-format qrencode--raw-qr) 'face 'qrencode-face)) (insert "\nEncoded Text:\n" s)) (pop-to-buffer buf))) (save-excursion (let ((buf (get-buffer-create qrencode-buffer-name))) (save-current-buffer (set-buffer buf) (let ((inhibit-read-only t)) (erase-buffer) (qrencode-mode) (set (make-local-variable 'qrencode--raw-qr) (qrencode s nil nil 'return-raw)) (insert (propertize (qrencode-format qrencode--raw-qr) 'face 'qrencode-face)) (insert "\nEncoded Text:\n" s)) (pop-to-buffer buf)))) qrencode--encode-to-buffer(#("¡Felix cumpleaños!" 0 18 (fontified t))) qrencode-region(144 162) funcall-interactively(qrencode-region 144 162) command-execute(qrencode-region record) execute-extended-command(nil "qrencode-region" nil) funcall-interactively(execute-extended-command nil "qrencode-region" nil) command-execute(execute-extended-command)

ruediger commented 3 years ago

Byte encoding just means it will encode byte by byte, which should simply encode UTF-8 bytes. I can reproduce the issue though. Not sure yet what is causing it. I filed #12. Thanks for reporting!