FreeCalypso > hg > fc-am-toolkit
diff bootmatch/comp_ranges.c @ 9:bfcc8180cf3c
bootmatch compiler written
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 10 Jun 2023 02:55:29 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bootmatch/comp_ranges.c Sat Jun 10 02:55:29 2023 +0000 @@ -0,0 +1,92 @@ +/* + * Bootmatch compiler: here we read and parse the *.ranges file. + */ + +#include <sys/types.h> +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include "comp_defs.h" + +extern struct range range_list[MAX_RANGES]; +extern unsigned range_count; + +static void +process_line(line, filename, lineno) + char *line, *filename; +{ + char *cp; + struct range *rp; + u_long hex_start, hex_end; + + for (cp = line; isspace(*cp); cp++) + ; + if (*cp == '\0' || *cp == '#') + return; + if (!isxdigit(*cp)) { +inv_syntax: fprintf(stderr, "%s line %d: invalid syntax\n", + filename, lineno); + exit(1); + } + hex_start = strtoul(cp, &cp, 16); + if (!isspace(*cp)) + goto inv_syntax; + while (isspace(*cp)) + cp++; + if (!isxdigit(*cp)) + goto inv_syntax; + hex_end = strtoul(cp, &cp, 16); + if (*cp && !isspace(*cp)) + goto inv_syntax; + while (isspace(*cp)) + cp++; + if (*cp && *cp != '#') + goto inv_syntax; + if (hex_start >= BOOT_BLOCK_SIZE) { + fprintf(stderr, "%s line %d: start offset is out of range\n", + filename, lineno); + exit(1); + } + if (hex_end >= BOOT_BLOCK_SIZE) { + fprintf(stderr, "%s line %d: end offset is out of range\n", + filename, lineno); + exit(1); + } + if (hex_start >= hex_end) { + fprintf(stderr, + "%s line %d: end offset must be greater than start offset\n", + filename, lineno); + exit(1); + } + if (range_count >= MAX_RANGES) { + fprintf(stderr, "%s line %d: too many ranges defined\n", + filename, lineno); + exit(1); + } + rp = range_list + range_count; + rp->offset = hex_start; + rp->nbytes = hex_end - hex_start; + range_count++; +} + +void +read_ranges_file(filename) + char *filename; +{ + FILE *inf; + char linebuf[256]; + int lineno; + + inf = fopen(filename, "r"); + if (!inf) { + perror(filename); + exit(1); + } + for (lineno = 1; fgets(linebuf, sizeof linebuf, inf); lineno++) + process_line(linebuf, filename, lineno); + fclose(inf); + if (!range_count) { + fprintf(stderr, "error: no ranges defined in %s\n", filename); + exit(1); + } +}