# # QR Code generator test worker (Python 2, 3) # # This program reads data and encoding parameters from standard input and writes # QR Code bitmaps to standard output. The I/O format is one integer per line. # Run with no command line arguments. The program is intended for automated # batch testing of end-to-end functionality of this QR Code generator library. # # Copyright (c) Project Nayuki. (MIT License) # https://www.nayuki.io/page/qr-code-generator-library # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of # the Software, and to permit persons to whom the Software is furnished to do so, # subject to the following conditions: # - The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # - The Software is provided "as is", without warranty of any kind, express or # implied, including but not limited to the warranties of merchantability, # fitness for a particular purpose and noninfringement. In no event shall the # authors or copyright holders be liable for any claim, damages or other # liability, whether in an action of contract, tort or otherwise, arising from, # out of or in connection with the Software or the use or other dealings in the # Software. # from __future__ import print_function import sys import qrcodegen py3 = sys.version_info.major >= 3 def read_int(): return int((input if py3 else raw_input)()) def main(): while True: # Read data or exit length = read_int() if length == -1: break data = [read_int() for _ in range(length)] # Read encoding parameters errcorlvl = read_int() minversion = read_int() maxversion = read_int() mask = read_int() boostecl = read_int() # Make segments for encoding if all((b < 128) for b in data): # Is ASCII segs = qrcodegen.QrSegment.make_segments("".join(chr(b) for b in data)) elif py3: segs = [qrcodegen.QrSegment.make_bytes(bytes(data))] else: segs = [qrcodegen.QrSegment.make_bytes("".join(chr(b) for b in data))] try: # Try to make QR Code symbol qr = qrcodegen.QrCode.encode_segments(segs, ECC_LEVELS[errcorlvl], minversion, maxversion, mask, boostecl != 0) # Print grid of modules print(qr.get_version()) for y in range(qr.get_size()): for x in range(qr.get_size()): print(1 if qr.get_module(x, y) else 0) except ValueError as e: if e.args[0] != "Data too long": raise print(-1) sys.stdout.flush() ECC_LEVELS = ( qrcodegen.QrCode.Ecc.LOW, qrcodegen.QrCode.Ecc.MEDIUM, qrcodegen.QrCode.Ecc.QUARTILE, qrcodegen.QrCode.Ecc.HIGH, ) if __name__ == "__main__": main()