QR-Code Encode
« | 05 Jan 2025 | »Na und wer hat nicht schon mal im Bett eine QR-Code Bibliothek überarbeitet?
Oder: Was man über Weihnachten sonst noch alles machen kann.
Mit dem Projekt quirc kann ich schon seit einiger Zeit QR-Codes aus Bildern
lesen und ihren Inhalt extrahieren. Doch eigene QR-Codes erzeugen konnte ich
mit diese Bibliothek nicht.
Neben anderen (teils sehr aufgeblähten) Projekten fiel mir eines ins Auge:
nämlich github.com/ricmoo/QRCode
Es glänzt durch seine Einfachheit und dem Fehlen von malloc oder anderen
Heapallokationen im Quellcode.
Damit ist es ideal für Mikrokontroller Projekt geeignet und auch ein würdiger
Kandidat für das GATE Projekt.
Codebase
Leider fielen mir neben der kompakten Codebase auch ein paar Unschönheiten auf. Der Build liefert zahlreiche Warnungen bezüglich nicht zusammenpassenden Datentypen auf.
Es wird wild zwischen 8, 16 und 32 bit Typen hin und her gecastet, während
sich auch Wechsel zwischen signed und unsigned häufen.
Aus diesem Grund habe ich einen Fork angelegt und mir vorgenommen, dieses alte Projekt etwas aufzupolieren.
Codeupdate
Tatsächlich lassen sich viele Warnungen durch die Umstellung auf einheitliche
Datentypen bzw. typedefs fixen.
An den Stellen, wo wirklich Casts notwendig sind, werden diese explizit
durchgeführt, womit der Typenwechsel auch sichtbar wird.
Da der Code bereits im C99 Stil geschrieben ist, ich jedoch noch ältere Compiler unterstützen möchte, habe ich auch hier einiges verschieben müssen.
Die Deklaration von Variablen kommt C90-like an den Anfang jeder Funktion. Und der einmalige Einsatz von lokalen variablen Arraylängen wurde durch eine feste Arraylänge mit einem Maximumwert ersetzt.
Um vom optionalen stdint.h loszukommen, wurden typedefs nach dem
Schema qrcode_intX_t eingeführt.
Und am Ende wird CMake benutzt um festzustellen, ob Header und Features
vorhanden sind und um die typedefs auf Standards oder Fallback Werte
zu setzen.
Fazit
Am Ende habe ich nun eine überarbeitete Version von QRCode, die auch mit
meinen Windows CE
Builds oder unter Watcom
und MS-DOS kompilierbar ist.
Obwohl fast jede Zeile überarbeitet wurde, ist die Funktionalität gleich geblieben.
Und weil die Resultate nicht nur für das GATE Projekt relevant sind, habe ich ein eigenes Repo auf Codeberg dafür angelegt: