pull/102/merge
Jim Hanley 2025-04-05 17:37:45 +11:00 committed by GitHub
commit 5f9d3c4ca3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 184 additions and 13 deletions

19
.github/workflows/ccpp.yml vendored 100644
View File

@ -0,0 +1,19 @@
name: C/C++ CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Checkout submodules
uses: textbook/git-checkout-submodule-action@2.0.0
- name: make
run: cd src && make
# - name: make check
# run: make check
# - name: make distcheck
# run: make distcheck

3
.gitmodules vendored 100644
View File

@ -0,0 +1,3 @@
[submodule "src/libqrencode"]
path = src/libqrencode
url = https://github.com/fukuchi/libqrencode.git

View File

@ -4,7 +4,7 @@
#
CLEANUP :=
CFLAGS :=
CFLAGS := -DHAVE_CONFIG_H
ASFLAGS :=
LDFLAGS :=
HOST_CFLAGS :=
@ -103,6 +103,7 @@ SRCDIRS += hci/mucurses hci/mucurses/widgets
SRCDIRS += hci/keymap
SRCDIRS += usr
SRCDIRS += config
SRCDIRS += libqrencode
# These directories contain code that is not eligible for UEFI Secure
# Boot signing.
@ -120,6 +121,7 @@ SRCDIRS_INSEC += drivers/net/ath/ath9k
NON_AUTO_SRCS :=
NON_AUTO_SRCS += core/version.c
NON_AUTO_SRCS += drivers/net/prism2.c
NON_AUTO_SRCS += libqrencode/qrenc.c
# INCDIRS lists the include path
#
@ -131,11 +133,11 @@ INCDIRS += include .
# Default build target: build the most common targets and print out a
# helpfully suggestive message
#
ALL := bin/blib.a bin/ipxe.dsk bin/ipxe.lkrn bin/ipxe.iso \
bin/ipxe.usb bin/ipxe.pxe bin/undionly.kpxe bin/rtl8139.rom \
bin/8086100e.mrom bin/80861209.rom bin/10500940.rom \
bin/10222000.rom bin/10ec8139.rom bin/1af41000.rom \
bin/8086100f.mrom bin/808610d3.mrom bin/15ad07b0.rom
ALL := bin/blib.a bin/ipxe.dsk bin/ipxe.lkrn bin/ipxe.iso \
bin/ipxe.usb bin/ipxe.pxe bin/undionly.kpxe bin/rtl8139.rom \
bin/8086100e.mrom bin/80861209.rom bin/10500940.rom \
bin/10222000.rom bin/10ec8139.rom bin/1af41000.rom \
bin/8086100f.mrom bin/808610d3.mrom bin/15ad07b0.rom
all : $(ALL)
@$(ECHO) '==========================================================='

View File

@ -21,6 +21,8 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
int uriqrencode(const char * URI, char *outbuff, size_t outbuff_sz);
/**
* Find error description
*
@ -76,7 +78,13 @@ static struct errortab * find_closest_error ( int errno ) {
*
*/
char * strerror ( int errno ) {
static char errbuf[64];
#define SQUARE 46
static char errbuf[(((SQUARE/2)+1)*SQUARE)];
// static char errbuf[64];
char errURL[32];
int offset = 0;
struct errortab *errortab;
/* Allow for strerror(rc) as well as strerror(errno) */
@ -86,17 +94,23 @@ char * strerror ( int errno ) {
/* Find the error description, if one exists */
errortab = find_closest_error ( errno );
snprintf ( errURL, sizeof ( errURL ),
PRODUCT_ERROR_URI,
errno );
/* Construct the error message */
if ( errortab ) {
snprintf ( errbuf, sizeof ( errbuf ),
"%s (" PRODUCT_ERROR_URI ")",
errortab->text, errno );
offset = snprintf ( &errbuf[offset], sizeof ( errbuf ) - offset,
"%s (%s)",
errortab->text, errURL );
} else {
snprintf ( errbuf, sizeof ( errbuf ),
"Error %#08x (" PRODUCT_ERROR_URI ")",
errno, errno );
offset = snprintf ( &errbuf[offset], sizeof ( errbuf ) - offset,
"Error %#08x (%s)",
errno, errURL );
}
uriqrencode(errURL, &errbuf[offset], sizeof(errbuf) - offset );
return errbuf;
}

View File

@ -0,0 +1,132 @@
/* Based on code example from libqrencode and modified to use IBM CP 437 chars */
#include "libqrencode/qrencode.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define margin 4
static const char glyphs[] =
" " /* White Space */
"\xDC" /* Low Block */
"\xDF" /* High Block */
"\xDB"; /* Full Block */
static int writeANSI_margin(char* outbuff, size_t outbuff_sz, int width, int p_margin, const char *white, const char *reset )
{
int y;
int len = 0;
for (y = 0; y < margin; y+=2 ) {
len += snprintf( &outbuff[len], outbuff_sz - len, "%s", white); /* Initialize the color - default white */
len += snprintf( &outbuff[len], outbuff_sz - len, "%*c", width + (p_margin*2), ' ');
len += snprintf( &outbuff[len], outbuff_sz - len, "%s\n", reset); // reset to default colors for newline
}
return len;
}
static int writeANSI(const QRcode *qrcode, char *outbuff, size_t outbuff_sz)
{
unsigned char *rowH;
unsigned char *rowL;
unsigned char *p;
int x, y;
int len = 0;
const unsigned char *E = (const unsigned char *)"";
// const char white[] = "\033[47m";
const char white[] = "";
const int white_s = sizeof( white ) -1;
// const char black[] = "\033[40m";
// const char reset[] = "\033[0m";
const char reset[] = "";
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
const size_t minLen = (( (white_s) * 2 ) + ( (qrcode->width * 2) * qrcode->width )); // Unlikely
// const size_t maxLen = (( (white_s) * 2 ) + ( (qrcode->width * 2) * qrcode->width * (white_s + 1 ))); // Unlikely
// const size_t typLen = (minLen + maxLen)/2; // More typical?
#pragma GCC diagnostic pop
if ( outbuff_sz < minLen ) {
snprintf(outbuff, outbuff_sz, "Insufficient buffer to render URL QR-Code.\n\tNeed at least %d bytes, only have %d\n", minLen, outbuff_sz);
// return( -1 ); // Error
}
/* top margin */
len += writeANSI_margin(&outbuff[len], outbuff_sz-len, qrcode->width, margin, white, reset);
/* data */
p = qrcode->data;
for(y = 0; y < qrcode->width; y+=2) {
rowH = (p+((y+0)*qrcode->width));
rowL = (p+((y+1)*qrcode->width));
len += snprintf( &outbuff[len], outbuff_sz - len, "%s", white); /* Initialize the color - default white */
for(x = 0; x < margin; x++ ){
len += snprintf( &outbuff[len], outbuff_sz - len, "%s", " ");
}
for(x = 0; x < qrcode->width; x++) {
len += snprintf( &outbuff[len], outbuff_sz - len, "%c", glyphs[
( ((*( rowH+x )&0x1)<<1) |
((*((y+1)<qrcode->width?rowL+x:E)&0x1)<<0) )
]);
}
for(x = 0; x < margin; x++ ){
len += snprintf( &outbuff[len], outbuff_sz - len, "%s", " ");
}
len += snprintf( &outbuff[len], outbuff_sz - len, "%s\n", reset);
}
/* bottom margin */
len += writeANSI_margin(&outbuff[len], outbuff_sz-len, qrcode->width, margin, white, reset);
return len;
}
int uriqrencode(const char * URI, char *outbuff, size_t outbuff_sz)
{
QRcode *qrcode = QRcode_encodeString(URI, 0, QR_ECLEVEL_L,
QR_MODE_8, 1);
outbuff_sz = writeANSI( qrcode, outbuff, outbuff_sz );
QRcode_free(qrcode);
return outbuff_sz;
}
//#define TEST_QRCODE
#ifdef TEST_QRCODE
int main(int argc, char *argv[])
{
#define SQUARE 46
char buffer[((SQUARE*2)*SQUARE)];
char* arg;
int len;
if (argc < 2) {
fprintf(stderr, "Usage: %s string\n", argv[0]);
arg = "https://youtu.be/Xe1o5JDwp2k";
} else {
arg = argv[1];
}
len = uriqrencode( arg, buffer, sizeof( buffer ) );
if (len < 0) {
fputs( "Error\n", stdout );
}
fputs( buffer, stdout );
return 0;
}
#endif /* TEST_QRCODE */

1
src/libqrencode 160000

@ -0,0 +1 @@
Subproject commit 13b159f9d9509b0c9f5ca0df7a144638337ddb15