Compare commits

..

2 commits

Author SHA1 Message Date
Eric
f0577d8ea0 decrease encode time
The functions encode and decode are now capable of processing larger
buffers with less conditional logic. Input and output functions need to
follow suit to make better use of this next. Encode without line
wrapping already makes use of these improvements, because input and
output are now entirely handled by <stdio.h> functions.
2025-05-28 23:24:05 +02:00
Eric
3194981825 repair Makefile to include -g in CFLAGS again 2025-05-28 20:33:16 +02:00
5 changed files with 59 additions and 72 deletions

View file

@ -1,5 +1,5 @@
CC = gcc CC = gcc
CFLAGS = -Og -Wall -Wextra -Werror CFLAGS = -Og -g -Wall -Wextra -Werror
objects = main.o input.o output.o encode.o objects = main.o input.o output.o encode.o

101
encode.c
View file

@ -7,80 +7,83 @@ unsigned char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
"0123456789" \ "0123456789" \
"+/"; "+/";
unsigned char b64u[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ unsigned char b64url[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
"abcdefghijklmnopqrstuvwxyz" \ "abcdefghijklmnopqrstuvwxyz" \
"0123456789" \ "0123456789" \
"-_"; "-_";
int int
encode(unsigned char *op, int olen, unsigned char *sp, int url) encode(unsigned char *op, int olen, unsigned char *sp, int url)
{ {
int n; int tmp;
unsigned char *sb, *enc; unsigned char *table;
unsigned char *sbeg;
unsigned char *tend;
sb = sp; table = (!url) ? b64 : b64url;
enc = (!url) ? b64 : b64u;
switch (olen) { sbeg = sp;
case 3: tend = op + olen - (olen % 3);
*sp++ = enc[(*op & ~3) >> 2]; while (op < tend) {
n = (*op++ & 3) << 4; *sp++ = table[(*op & ~3) >> 2];
*sp++ = enc[n + ((*op & ~15) >> 4)]; tmp = (*op++ & 3) << 4;
n = (*op++ & 15) << 2; *sp++ = table[tmp + ((*op & ~15) >> 4)];
*sp++ = enc[n + ((*op & 192) >> 6)]; tmp = (*op++ & 15) << 2;
*sp = enc[*op & ~192]; *sp++ = table[tmp + ((*op & 192) >> 6)];
break; *sp++ = table[*op++ & ~192];
}
switch (olen % 3) {
case 2: case 2:
*sp++ = enc[(*op & ~3) >> 2]; *sp++ = table[(*op & ~3) >> 2];
n = (*op++ & 3) << 4; tmp = (*op++ & 3) << 4;
*sp++ = enc[n + ((*op & ~15) >> 4)]; *sp++ = table[tmp + ((*op & ~15) >> 4)];
*sp++ = enc[(*op & 15) << 2]; *sp++ = table[(*op & 15) << 2];
*sp = PADDING; *sp++ = PADDING;
break; break;
case 1: case 1:
*sp++ = enc[(*op & ~3) >> 2]; *sp++ = table[(*op & ~3) >> 2];
*sp++ = enc[(*op & 3) << 4]; *sp++ = table[(*op & 3) << 4];
*sp++ = PADDING;
*sp++ = PADDING; *sp++ = PADDING;
*sp = PADDING;
break; break;
} }
return sp-sb+1; return sp-sbeg;
} }
int int
decode(unsigned char *sp, int slen, unsigned char *op, int url) decode(unsigned char *sp, int slen, unsigned char *op, int url)
{ {
int n, b, atob(int c, int url); int tmp, b, atob(int c, int url);
unsigned char *ob; unsigned char *obeg;
unsigned char *qend;
ob = op; obeg = op;
switch (slen) { qend = sp + slen - (slen % 4);
case 4: while (sp < qend) {
n = atob(*sp++, url) << 2; tmp = atob(*sp++, url) << 2;
b = atob(*sp++, url); b = atob(*sp++, url);
*op++ = n + ((b & ~15) >> 4); *op++ = tmp + ((b & ~15) >> 4);
tmp = (b & 15) << 4;
n = (b & 15) << 4; b = atob(*sp++, url);
b = atob(*sp++, url); *op++ = tmp + ((b & ~3) >> 2);
*op++ = n + ((b & ~3) >> 2); *op++ = ((b & 3) << 6) + atob(*sp++, url);
}
*op = ((b & 3) << 6) + atob(*sp, url); switch (slen % 4) {
break;
case 3: case 3:
n = atob(*sp++, url) << 2; tmp = atob(*sp++, url) << 2;
b = atob(*sp++, url); b = atob(*sp++, url);
*op++ = n + ((b & ~15) >> 4); *op++ = tmp + ((b & ~15) >> 4);
tmp = (b & 15) << 4;
n = (b & 15) << 4; *op++ = tmp + ((atob(*sp++, url) & ~3) >> 2);
*op = n + ((atob(*sp, url) & ~3) >> 2);
break; break;
case 2: case 2:
n = atob(*sp++, url) << 2; tmp = atob(*sp++, url) << 2;
*op = n + ((atob(*sp, url) & ~15) >> 4); *op++ = tmp + ((atob(*sp++, url) & ~15) >> 4);
break; break;
} }
return op-ob+1; return op-obeg;
} }
int atob(int c, int url) int atob(int c, int url)

13
input.c
View file

@ -1,21 +1,8 @@
#include "input.h" #include "input.h"
#define PADDING '=' #define PADDING '='
#define OCTETBUF 3
#define SXTETBUF 4 #define SXTETBUF 4
int
getocts(FILE *fp, unsigned char *o)
{
int c, n;
n = 0;
while (n < OCTETBUF && (c = fgetc(fp)) != EOF)
o[n++] = c;
return n;
}
int int
getsxts(FILE *fp, unsigned char *s) getsxts(FILE *fp, unsigned char *s)
{ {

View file

@ -3,9 +3,6 @@
#include <stdio.h> #include <stdio.h>
int
getocts(FILE *fp, unsigned char *o);
int int
getsxts(FILE *fp, unsigned char *s); getsxts(FILE *fp, unsigned char *s);

12
main.c
View file

@ -4,8 +4,8 @@
#include "output.h" #include "output.h"
#include "encode.h" #include "encode.h"
#define OCTETBUF 4 #define OCTETBUF 300
#define SXTETBUF 5 #define SXTETBUF 400
unsigned char obuf[OCTETBUF]; unsigned char obuf[OCTETBUF];
unsigned char sbuf[SXTETBUF]; unsigned char sbuf[SXTETBUF];
@ -59,16 +59,16 @@ main(int argc, char *argv[])
} }
} else if (wrp) { } else if (wrp) {
last = 0; last = 0;
while ((n = getocts((in) ? in : stdin, obuf))) { while ((n = fread(obuf, sizeof(*obuf), OCTETBUF, (in) ? in : stdin))) {
n = encode(obuf, n, sbuf, url); n = encode(obuf, n, sbuf, url);
last = printw((out) ? out : stdout, sbuf, n); last = printw((out) ? out : stdout, sbuf, n);
} }
if (last != '\n') if (last != '\n')
fprintf((out) ? out : stdout, "\n"); fprintf((out) ? out : stdout, "\n");
} else { } else {
while ((n = getocts((in) ? in : stdin, obuf))) { while ((n = fread(obuf, sizeof(*obuf), OCTETBUF, (in) ? in : stdin))) {
encode(obuf, n, sbuf, url); n = encode(obuf, n, sbuf, url);
fprintf((out) ? out : stdout, "%s", sbuf); fwrite(sbuf, sizeof(*sbuf), n, (out) ? out : stdout);
} }
} }
if (in) if (in)