1
0

First commit containing CP/M 3 help files

This commit is contained in:
acn
2020-03-18 11:54:31 +01:00
parent 21718e3c0b
commit 20d9a123cb
36 changed files with 2178 additions and 32 deletions

97
src/makehelp.c Normal file
View File

@@ -0,0 +1,97 @@
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <ctype.h>
struct helptoc {
char topic[12];
uint16_t recoff;
uint8_t bytoff;
uint8_t level;
} __attribute__((packed));
// input file must have already been converted LF => CR,LF.
// Typically, a concatination of all help files.
int main(int argc, char **argv) {
struct stat stb;
char *buf = NULL;
size_t buflen = 0;
struct helptoc toc;
if (argc != 2) {
fprintf(stderr, "Usage: %s <help-file>\n", argv[0]);
exit(1);
}
int x;
int fd = open(argv[1], O_RDONLY);
if (fd < 0) {
perror(argv[1]);
exit(1);
}
fstat(fd, &stb);
buflen = stb.st_size;
buflen = (buflen + 127) & ~127;
buf = malloc(buflen + 1);
if (buf == NULL) {
perror("malloc");
exit(1);
}
int rc = read(fd, buf, stb.st_size);
if (rc < 0) {
perror(argv[1]);
exit(1);
}
close(fd);
memset(buf + stb.st_size, 0, (buflen + 1) - stb.st_size);
// Line endings MUST be CR-LF... always...
// CR-LF are considered the START of the text...
char *s = buf;
x = 0;
while ((s = strstr(s, "///")) != NULL) {
++x;
while (*s && *s != '\r') ++s;
}
// compute size of TOC... base of all offsets...
int ntoc = ((x + 7) & ~7);
if (ntoc == x) {
ntoc += 8;
}
int toclen = ntoc * sizeof(struct helptoc);
// Now go through text again, building TOC (on stdout)...
int t = 0;
s = buf;
while ((s = strstr(s, "///")) != NULL) {
s += 3;
toc.level = *s++ - '0';
x = 0;
while (x < sizeof(toc.topic) && *s && *s != '\r') {
toc.topic[x++] = toupper(*s++);
}
while (x < sizeof(toc.topic)) {
toc.topic[x++] = ' ';
}
while (*s && *s != '\r') ++s;
int off = ((s - buf) + toclen);
toc.recoff = off >> 7;
toc.bytoff = off & 0x7f;
write(1, &toc, sizeof(toc));
++t;
}
memset(toc.topic, ' ', sizeof(toc.topic));
toc.topic[0] = '$';
toc.level = 0;
toc.recoff = 0;
toc.bytoff = 0;
while (t < ntoc) {
write(1, &toc, sizeof(toc));
++t;
}
// now dump the help text...
write(1, buf, buflen);
return 0;
}