diff options
| author | kaa <kaa@disroot.org> | 2023-11-09 22:57:12 -0800 | 
|---|---|---|
| committer | kaa <kaa@disroot.org> | 2023-11-09 22:57:12 -0800 | 
| commit | 3ff2e62722ff5a51a32961d97dc028c56e00481f (patch) | |
| tree | 4a5ccc63c4780be400ef024c7e973365bf51352e /hyp.c | |
| parent | 8987d13d3c1a62d2d1db6ecabb29bc76f3529a44 (diff) | |
A good copy of libhyphen is included in-tree. Makefile has been modified so as to allow easy compilation. The build path is now a compiled-in constant, allowing for the hyphenation patterns in-tree to be referenced from any directory. Hyphenation language may be specified at runtime using -l.
Diffstat (limited to 'hyp.c')
| -rw-r--r-- | hyp.c | 81 | 
1 files changed, 57 insertions, 24 deletions
| @@ -4,7 +4,9 @@  #include <hyphen.h>  #include "config.h" -extern char *dictfile; +/* Set in config.h */ +extern const char *en; +extern const char *es;  /* Read a tag into a character array and return its length. */  int @@ -183,7 +185,8 @@ hyptag(FILE *in, FILE *out, int skiplen, char *tag, HyphenDict *dict)  			fputc(ch, out);  			/* A simple way of working around  			HTML character codes. Each is 5 ( epsiv ) -			 or 6 ( hellip ) characters long, plus '&' and ';'. */ +			 or 6 ( hellip ) characters long, +			plus '&' and ';'. */  			i = -3;  		}		  		/* Check for closing tag. */ @@ -208,44 +211,73 @@ hyptag(FILE *in, FILE *out, int skiplen, char *tag, HyphenDict *dict)  	}  } +void +usage() +{ +	fprintf(stderr, "%s\n", "hyp [-l language] [input] [output]"); +} + +void +fail(char *error) +{ +	fprintf(stderr, "%s\n", error); +	usage(); +} +  /* Hyphenate HTML input via `­'.  hyp [in] [out] */  int  main(int argc, char **argv)  { -	FILE *in; -	if (argc < 2) -		in = stdin; -	else { -		in = fopen(argv[1], "r"); -		if (in == NULL) { -			printf("%s %s\n", argv[1], "inaccessible."); -			return 1; +	FILE *in = stdin; +	FILE *out = stdout; +	char *dictpath = calloc(pathbuf, sizeof(char)); +	for (argv++; *argv != NULL; argv++) { +		if (strcmp(*argv, "-l") == 0) { +			argv++; +			if (*argv == NULL) { +				fail("Incomplete language argument."); +				return -1; +			} +			if (strcmp(*argv, "en") == 0) { +				sprintf(dictpath, "%s/%s", +					buildpath, en); +			} else if (strcmp(*argv, "es") == 0) { +				sprintf(dictpath, "%s/%s", +					buildpath, es); +			} else { +				fail("Unknown language."); +				return -1; +			} +		} else if (in == stdin) { +			in = fopen(*argv, "r"); +		} else if (out == stdout) { +			out = fopen(*argv, "w"); +		} else { +			fail("Too many arguments."); +			return -1;  		}  	} +	if (in == NULL || out == NULL) { +		fail("Inaccessible file."); +		return -1; +	} -	FILE *out; -	if (argc < 3) -		out = stdout; -	else { -		out = fopen(argv[2], "w"); -		if (out == NULL) { -			printf("%s %s\n", argv[2], "inaccessible."); -			return 2; -		} +	/* Default language. */ +	if (*dictpath == '\0') { +		sprintf(dictpath, "%s/%s", buildpath, en);  	}  	if (findbody(in, out) == 0) { -		puts("There is no body."); +		fputs("There is no body.", stderr);  		return 3;  	} -	HyphenDict *dict = hnj_hyphen_load(dictfile); +	HyphenDict *dict = hnj_hyphen_load(dictpath);  	if (dict == NULL) { -		puts("Dict not readable."); +		fputs("Dict not readable.", stderr);  		return 4;  	} -	dict->utf8 = 1;  	int tagamt = 0;  	while (taglist[tagamt][0] != '\0') @@ -257,8 +289,9 @@ main(int argc, char **argv)  	while ((ch = fgetc(in)) != EOF) {  		fputc(ch, out);  		if (ch == '<' && (len = readtag(tag, in, out)) > 0 -			&& checktag(tag, tagamt, in, out) != -1) +			&& checktag(tag, tagamt, in, out) != -1) {  			hyptag(in, out, skiplen, tag, dict); +		}  	}  	return 0;  } | 
