Date: Mon, 14 Sep 2009 02:55:06 GMT From: Yoshihiro Ota <ota@j.email.ne.jp> To: freebsd-gnats-submit@FreeBSD.org Subject: misc/138797: [patch] \newif command support to latex2rtf Message-ID: <200909140255.n8E2t65H068778@www.freebsd.org> Resent-Message-ID: <200909140300.n8E30F0m043405@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 138797 >Category: misc >Synopsis: [patch] \newif command support to latex2rtf >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Mon Sep 14 03:00:15 UTC 2009 >Closed-Date: >Last-Modified: >Originator: Yoshihiro Ota >Release: 7.1-RELEASE >Organization: >Environment: FreeBSD xxx 7.1-RELEASE-p6 FreeBSD 7.1-RELEASE-p6 #465 r188634M: Wed Jun 17 12:19:08 EDT 2009 xxx:/usr/obj/usr/src/sys/GENERIC i386 >Description: \newif LaTeX command is supported with this patch. The patch is also sent to the authors but yet not been replied. By the way, I didn't test the patch using the port, print/latex2rtf. It needs to be renamed to put it under "files", at least. >How-To-Repeat: >Fix: Patch attached with submission follows: diff --git a/commands.c b/commands.c index 4e442a9..60b1bfe 100644 --- a/commands.c +++ b/commands.c @@ -646,6 +646,8 @@ static CommandArray PreambleCommands[] = { {"latextortftrue",CmdIgnore,1}, {"latextortffalse",CmdIgnore,0}, {"newif",CmdNewif,0}, + {"else",CmdElse,0}, + {"fi",CmdFi,0}, {"title", CmdTitle, TITLE_TITLE}, {"author", CmdTitle, TITLE_AUTHOR}, {"and", CmdAnd, 0}, diff --git a/convert.c b/convert.c index bf6721a..c46c4c4 100644 --- a/convert.c +++ b/convert.c @@ -828,5 +828,8 @@ returns: success or not if (TryVariableIgnore(cCommand)) return; + if (TryConditionSet(cCommand)) + return; + diagnostics(WARNING, "Unknown command '\\%s'", cCommand); } diff --git a/funct1.c b/funct1.c index 4c7af8a..69c17c2 100644 --- a/funct1.c +++ b/funct1.c @@ -1440,18 +1440,136 @@ void CmdIgnoreLet(int code) free(s); } +typedef struct iftag { + char *if_name; /* LaTeX newif name without \newif\if */ + int is_true; /* if this name is set to true */ + int did_push_env; /* keep track which of 'if' or 'else' is true */ +} IfName; + +/* ifCommands maintains all the \newif CONDitions */ +static int iIfNameCount = 0; /* number of if condition names */ +static IfName ifCommands[100] = { + {NULL, 0} +}; + +/* ifEnvs/iIfDepth is used to handle nested conditions. */ +static IfName ifEnvs[100]; +static int iIfDepth = 0; /* number of nested if conditions */ + void CmdNewif( /* @unused@ */ int code) /****************************************************************************** - purpose : ignore \newif\ifsomething + purpose : initiate handing of \newif\ifsomething + : \newif\ifSOMETHING + : => create a new ENTRY with SOMETHING with false + : \SOMETHINGfalse + : => set SOMETHING to false + : \SOMETHINGtrue + : => set SOMETHING to true + : \ifSOMETHING + : => if SOMETHING is true, process it. + : \else + : => if SOMETHING is NOT true, process it. + : \fi ******************************************************************************/ { char *s; s = getSimpleCommand(); diagnostics(4,"discarding %s",s); + if(strncmp(s, "\\if", 3) == 0) + { + int i; + for(i = 0; i < iIfNameCount; i++) + { + if(strcmp(ifCommands[i].if_name, &s[3]) == 0) + break; + } + if(i < iIfNameCount) + diagnostics(WARNING, "Duplicated \\newif command '%s'", s); + else + { + ifCommands[iIfNameCount].if_name = strdup(&s[3]); + ifCommands[iIfNameCount].is_true = FALSE; + ifCommands[iIfNameCount].did_push_env = FALSE; + iIfNameCount++; + } + } + else + diagnostics(WARNING, "Mystery \\newif command '%s'", s); if (s) free(s); } +void CmdElse( /* @unused@ */ int code) +{ + iIfDepth--; + if(ifEnvs[iIfDepth].did_push_env) /* if-closure is true, so else is false */ + { + fprintRTF("\" }"); + ifEnvs[iIfDepth].did_push_env = FALSE; + } + else /* if-closure is false, so else is true */ + { + ifEnvs[iIfDepth].did_push_env = TRUE; + fprintRTF("{\\v \""); + } + iIfDepth++; +} + +void CmdFi( /* @unused@ */ int code) +{ + iIfDepth--; + if(ifEnvs[iIfDepth].did_push_env) + { + fprintRTF("\" }"); + } +} + +bool TryConditionSet(char *command) +{ + int i; + if(strncmp(command, "if", 2) == 0) + { + for(i = 0; i < iIfNameCount; i++) + { + if(strcmp(&command[2], ifCommands[i].if_name) == 0) + { + ifEnvs[iIfDepth] = ifCommands[i]; + if(ifCommands[i].is_true) + { + /* no-op */; + } + else + { + ifEnvs[iIfDepth].did_push_env = TRUE; + fprintRTF("{\\v \""); + } + iIfDepth++; + return TRUE; + } + } + } + for(i = 0; i < iIfNameCount; i++) + { + char *s = ifCommands[i].if_name; + char *t = strdup_together(s, "true"); + char *f = strdup_together(s, "false"); + if(strcmp(command, t) == 0) + { + ifCommands[i].is_true = TRUE; + free(t); free(f); + return TRUE; + } + else if(strcmp(command, f) == 0) + { + ifCommands[iIfNameCount].is_true = FALSE; + free(t); free(f); + return TRUE; + } + free(t); free(f); + } + return FALSE; +} + void CmdQuad(int kk) /****************************************************************************** diff --git a/funct1.h b/funct1.h index 2e87415..f7ee63f 100644 --- a/funct1.h +++ b/funct1.h @@ -176,4 +176,8 @@ void CmdRule(int code); void CmdTolerateEnviron(int code); void CmdIflatextortf(int code); void CmdNewif(int code); +void CmdElse(int code); +void CmdFi(int code); void CmdAppendix(int code); + +bool TryConditionSet(char *command); >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200909140255.n8E2t65H068778>