Implemented texi-to-man translation rule about {...} recursion
This commit is contained in:
parent
be0b15a8e7
commit
3f4936519d
@ -38,6 +38,10 @@ struct Mx1 {
|
||||
|
||||
};
|
||||
|
||||
int Mx1_substitute(struct Mx1 *m, char line_in[256], char line_out[256],
|
||||
int raw, int upto, int flag);
|
||||
|
||||
|
||||
|
||||
int Mx1_init(struct Mx1 *m, char *prog, int flag)
|
||||
{
|
||||
@ -78,81 +82,116 @@ int Mx1__get_word(char *line, char word[256], char **remainder, int flag)
|
||||
}
|
||||
|
||||
|
||||
int Mx1_substitute(struct Mx1 *m, char line_in[256], char line_out[256],
|
||||
int raw, int flag)
|
||||
/* @param flag bit0= recursion
|
||||
*/
|
||||
int Mx1_rewrap(struct Mx1 *m, char **read_pt, char **write_pt,
|
||||
char *write_base, char *envelope,
|
||||
char *front, char *back,
|
||||
int flag)
|
||||
{
|
||||
char *rpt, *wpt, *ept;
|
||||
int l;
|
||||
char *rpt, *wpt, *ept, content[256], msg[256];
|
||||
int l, ret;
|
||||
|
||||
rpt= *read_pt;
|
||||
wpt= *write_pt;
|
||||
|
||||
ept= strchr(rpt, '}');
|
||||
if(ept == NULL) {
|
||||
sprintf(msg, "No closing bracket found for '%s'", envelope);
|
||||
Mx1_report_error(m, msg, 0);
|
||||
return(-1);
|
||||
}
|
||||
/* Mapped {...} content is subject to the rules except {...} mapping. */
|
||||
l= ept - rpt;
|
||||
ret= Mx1_substitute(m, rpt, content, 0, l, 1);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
l= strlen(content);
|
||||
if((wpt - write_base) + l + strlen(front) + strlen(back) > 255) {
|
||||
Mx1_report_error(m, "Line length overflow while text substitution", 0);
|
||||
return(-1);
|
||||
}
|
||||
strcpy(wpt, front);
|
||||
wpt+= strlen(front);
|
||||
strncpy(wpt, content, l);
|
||||
wpt+= l;
|
||||
strcpy(wpt, back);
|
||||
wpt+= strlen(back);
|
||||
|
||||
(*read_pt)+= ept - rpt;
|
||||
(*write_pt)= wpt;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= recursion
|
||||
*/
|
||||
int Mx1_substitute(struct Mx1 *m, char line_in[256], char line_out[256],
|
||||
int raw, int upto, int flag)
|
||||
{
|
||||
char *rpt, *wpt;
|
||||
int ret;
|
||||
|
||||
wpt= line_out;
|
||||
for(rpt= line_in; *rpt != 0; rpt++) {
|
||||
for(rpt= line_in; rpt - line_in < upto && *rpt != 0; rpt++) {
|
||||
if(rpt - line_in < raw) {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
}
|
||||
if(*rpt == '@') {
|
||||
if(strncmp(rpt, "@strong{", 8) == 0) {
|
||||
/* @strong{-...} gets mapped to \fB\-...\fR . */;
|
||||
if(strncmp(rpt, "@strong{", 8) == 0 && !(flag & 1)) {
|
||||
/* @strong{...} gets mapped to \fB...\fR . */
|
||||
ept= strchr(rpt, '}');
|
||||
if(ept == NULL) {
|
||||
Mx1_report_error(m, "No closing bracket found for '@strong{'", 0);
|
||||
return(-1);
|
||||
}
|
||||
l= ept - rpt - 8;
|
||||
if((wpt - line_out) + l + 6 + (rpt[8] == '-') > 255)
|
||||
goto overflow;
|
||||
strcpy(wpt, "\\fB");
|
||||
wpt+= 3;
|
||||
if(rpt[8] == '-')
|
||||
*(wpt++)= '\\';
|
||||
strncpy(wpt, rpt + 8, l);
|
||||
wpt+= l;
|
||||
strcpy(wpt, "\\fR");
|
||||
wpt+= 3;
|
||||
rpt+= ept - rpt;
|
||||
} else if(strncmp(rpt, "@command{}", 9) == 0) {
|
||||
rpt+= 8;
|
||||
ret= Mx1_rewrap(m, &rpt, &wpt, line_out,
|
||||
"@strong{" , "\\fB", "\\fR", 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
} else if(strncmp(rpt, "@command{", 9) == 0 && !(flag & 1)) {
|
||||
/* @command{...} gets mapped to \fB...\fR . */
|
||||
ept= strchr(rpt, '}');
|
||||
if(ept == NULL) {
|
||||
Mx1_report_error(m, "No closing bracket found for '@command{'", 0);
|
||||
return(-1);
|
||||
}
|
||||
l= ept - rpt - 9;
|
||||
if((wpt - line_out) + l + 6 + (rpt[9] == '-') > 255)
|
||||
goto overflow;
|
||||
strcpy(wpt, "\\fB");
|
||||
wpt+= 3;
|
||||
strncpy(wpt, rpt + 9, l);
|
||||
wpt+= l;
|
||||
strcpy(wpt, "\\fR");
|
||||
wpt+= 3;
|
||||
rpt+= ept - rpt;
|
||||
rpt+= 9;
|
||||
ret= Mx1_rewrap(m, &rpt, &wpt, line_out,
|
||||
"@command{", "\\fB", "\\fR", 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
} else if(strncmp(rpt, "@email{", 7) == 0 && !(flag & 1)) {
|
||||
/* @email{...} gets mapped to <...> . */
|
||||
rpt+= 7;
|
||||
ret= Mx1_rewrap(m, &rpt, &wpt, line_out, "@email{", "<", ">", 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
} else if(strncmp(rpt, "@minus{}", 8) == 0) {
|
||||
/* @minus{} will become "-". */
|
||||
if((wpt - line_out) + 1 > 255)
|
||||
goto overflow;
|
||||
*(wpt++)= '-';
|
||||
rpt+= 7;
|
||||
|
||||
} else if(strncmp(rpt, "@@", 2) == 0 ||
|
||||
strncmp(rpt, "@{", 2) == 0 ||
|
||||
strncmp(rpt, "@}", 2) == 0) {
|
||||
/* @@ , @{, @} will get stripped of their first @. */
|
||||
*(wpt++)= *(rpt + 1);
|
||||
rpt++;
|
||||
|
||||
}
|
||||
|
||||
} else if(*rpt == '\\') {
|
||||
/* "\" becomes "\\" */
|
||||
if((wpt - line_out) + 2 > 255)
|
||||
goto overflow;
|
||||
*(wpt++)= '\\';
|
||||
*(wpt++)= '\\';
|
||||
|
||||
} else if((wpt - line_out) + 1 > 255) {
|
||||
overflow:;
|
||||
Mx1_report_error(m, "Line length overflow while text substitution", 0);
|
||||
return(-1);
|
||||
} else
|
||||
*(wpt++)= *rpt;
|
||||
|
||||
}
|
||||
*wpt= 0;
|
||||
return(1);
|
||||
@ -250,7 +289,7 @@ int Mx1_convert(struct Mx1 *m, char line_in[256], char line_out[256], int flag)
|
||||
/* Substitute option text */
|
||||
raw= strlen(buf);
|
||||
strcat(buf, word);
|
||||
ret= Mx1_substitute(m, buf, line_out, raw, 0);
|
||||
ret= Mx1_substitute(m, buf, line_out, raw, strlen(buf), 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
strcpy(buf, line_out);
|
||||
@ -260,28 +299,30 @@ int Mx1_convert(struct Mx1 *m, char line_in[256], char line_out[256], int flag)
|
||||
strcat(buf, remainder);
|
||||
|
||||
/* Substitute arguments text */
|
||||
ret= Mx1_substitute(m, buf, line_out, raw, 0);
|
||||
ret= Mx1_substitute(m, buf, line_out, raw, strlen(buf), 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* @strong{-...} gets mapped to \fB\-...\fR . */
|
||||
/* @strong{... } gets mapped to \fB...\fR . */
|
||||
/* @command{... } gets mapped to \fB...\fR . */
|
||||
/* @minus{} will become "-". */
|
||||
/* Mapped {...} content is subject to the rules except {...} mapping. */
|
||||
/* @@ , @{, @} will get stripped of their first @. */
|
||||
/* "\" becomes "\\" */
|
||||
|
||||
if(line_in[0] != '@' ||
|
||||
strncmp(line_in, "@strong{", 8) == 0 ||
|
||||
strncmp(line_in, "@command{", 9) == 0 ||
|
||||
strncmp(line_in, "@minus{}", 8) == 0 ||
|
||||
strncmp(line_in, "@email{", 7) == 0 ||
|
||||
strncmp(line_in, "@@", 2) == 0 ||
|
||||
strncmp(line_in, "@{", 2) == 0 ||
|
||||
strncmp(line_in, "@}", 2) == 0 ) {
|
||||
keep= 1;
|
||||
ret= Mx1_substitute(m, line_in, line_out, 0, 0);
|
||||
ret= Mx1_substitute(m, line_in, line_out, 0, strlen(line_in), 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
}
|
||||
@ -330,7 +371,7 @@ int main(int argc, char **argv)
|
||||
|
||||
if(argc < 2) {
|
||||
usage:;
|
||||
fprintf(stderr, "usage: %s -auto|-filter|[-xorrisofs]\n", argv[0]);
|
||||
fprintf(stderr, "usage: %s -auto|-filter [-xorrisofs]\n", argv[0]);
|
||||
fprintf(stderr, " -auto xorriso/xorriso.texi -> xorriso/xorriso.1\n");
|
||||
fprintf(stderr, " -filter stdin -> stdout\n");
|
||||
fprintf(stderr, " -xorrisofs process xorriso/xorrisofs.texi\n");
|
||||
|
Loading…
Reference in New Issue
Block a user