diff options
Diffstat (limited to 'Build/source/texk/devnag/src/devnag.c')
-rw-r--r-- | Build/source/texk/devnag/src/devnag.c | 2560 |
1 files changed, 0 insertions, 2560 deletions
diff --git a/Build/source/texk/devnag/src/devnag.c b/Build/source/texk/devnag/src/devnag.c deleted file mode 100644 index af163c83ff3..00000000000 --- a/Build/source/texk/devnag/src/devnag.c +++ /dev/null @@ -1,2560 +0,0 @@ -/* $Id: devnag.c,v 1.15 2008-03-09 15:57:59 icebearsoft Exp $ - Version 2.15 - - * - Preprocessor for Devanagari for TeX package - Copyright (C) 1991-1998 University of Groningen, The Netherlands - * - Author : Frans J. Velthuis <velthuis@rc.rug.nl> - Date : 09 May 1991 - * - The maintainer of this program is now Zdenek Wagner <zdenek.wagner@gmail.com>. - * - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, or (at your option) - any later version. - * - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - * - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* - Modified by Marc Csernel, March 1998, to support LaTeX commands - with arguments and environments between the dn delimiters. - */ - -/* - Version 2.0 of devnag is the first major revision of the program - since its original release. It is based on version 1.6 (there are - no releases 1.7, 1.8 or 1.9), and, in addition to Marc Csernel's - LaTeX extensions, it incorporates the following modifications made - by John Smith in 1998-9: - - 1. A major change has been made to the way in which the - preprocessor handles "@" commands. Previously it was only - possible to use these at the start of the .dn file; now they may - be placed anywhere in the text, provided that they do not occur - within passages of Devanagari (where "@" has its own meaning). - New "negative" commands have been added to reverse the effect of - most existing commands: thus it is now possible to enable or - disable specific features for specific passages of text. @hindi - may be disabled with @sanskrit; @dollars with @nodollars or - @dolmode0; @hyphen with @nohyphen; @tabs (a new LaTeX feature - added by Marc Csernel) with @notabs. Since "@" is a perfectly - legal character in TeX, lines beginning with "@" that do not - match any valid "@" command are flagged with a warning, but - processing of the file continues. (In the somewhat unlikely - event that you actually need to have a line of TeX text - consisting exactly of, say, "@hindi", the preprocessor may be - fooled by typing "{}@hindi", "{@hindi}", or anything similar.) - - 2. The old line-splitting code and the @obeylines preprocessor - command to disable it have been withdrawn, so that the program - now outputs one line to the .tex file for every line of the - .dn file. In devnag 2.0, attempted use of @obeylines produces - a specific warning; this is likely to be withdrawn in a future - release, after which attempts to use it will cause "@obeylines" - to be typeset as a part of the text of the document (see 1. - above). - - 3. To complete the line-by-line correspondence between the input - and output files, comments are no longer stripped out, and - preprocessor commands (such as "@hyphen") are passed through - into the output file in the form of comments ("%@hyphen"). - - 4. There is now an option to show the version of the program. If - devnag is invoked as "devnag -v" it will print a banner giving - the version number and other information, and then exit. - - 5. If the input file has a name such as "x.y.dn", the output file - will now be "x.y.tex", not, as previously, "x.tex". In addition, - it is now mandatory for the files to have the suffixes ".dn" and - ".tex", though as before these are supplied by the program if - omitted by the user. This change has been made for safety - reasons: formerly, typing "devnag myfile.tex" would delete - the contents of myfile.tex. - - 6. The sequence ~nj~na now produces the correct form. - - 7. The sequences r.l and r.L now produce the correct forms. - - 8. The sequences ttrya, ttrva, khrya and khrva now produce the - correct forms. - - 9. The correct "caret" form of -r is now produced under kh, ch, - etc., even when a subscript vowel or viraama follows. This has - necessitated a new macro (\qc), which must be defined in - dnmacs.tex (for Plain TeX) or dev.sty (for LaTeX). The - definition is: - - \def\qc#1#2{\setbox0=\hbox{#1}#1\subscr{\char126\kern1.5ex\lower1.25ex - \hbox{\char#2}\kern-1.5ex}} - - Suitable versions of the files are distributed with the current - release of the devnag package. - - 10. A fragment of code which permitted hyphenation in the middle of - a consonant sequence containing a viraama has been removed. - All hyphenation before consonants stopped with viraama has - also been eliminated. - - 11. A change has been introduced in the output that devnag produces - from input such as {\dn .sa.t"siraa.h}, i.e. in cases where an - i-matra vowel is associated with a consonant sequence containing - a viraama. The previous behaviour was to treat the consonant - sequence as if it were a normal conjunct by placing the vowel - symbol before the sequence as a whole. The majority opinion - seems to be that this is undesirable, and that the vowel symbol - should follow the consonant to which the viraama is attached. - A change has therefore been made to implement this. However, the - previous behaviour can be reinstated by means of a new - preprocessor command, @vconjuncts. - - 12. Tab characters in the input file, which previously were treated - as fatal errors, are now silently converted to spaces. - - 13. (Internal coding changes) The order of the C code has been - normalised from the original Pascal-like bottom-up sequence - to a more conventional top-down version. Numerous comments have - been added to assist potential future developers in understanding - the way the program works. A number of bug-fixes and other - improvements have been applied. The insecure gets() calls used - in prompting for user input have been replaced by fgets(). - Variables used only within a single function have been declared - local to that function. Some variables have been renamed in - the interests of clarity and consistency, and some redundant - ones have been eliminated. The functions ch_find() and st_find(), - which simply duplicated the standard library functions strchr() - and strstr(), have also been eliminated. - */ - -/* - Version 2.01 is a bugfix release, containing two changes in - coding. (1) Previous versions of devnag have output "[" and "]" - for Devanagari half-"sa and half-gha. Under some circumstances - this can interact badly with LaTeX, and the form of output has - been changed to avoid the problem. (2) \cline has been added to - the list of LaTeX commands which devnag knows how to handle. - -- John Smith - */ - -/* - Version 2.02 redefines all ^^* characters to be output as - \3XXw because it is more robust. It puts a definition - of \DevnagVersion at the beginning of the output file so - that the new preprocessed files can be automatically recognized - (Z. Wagner, zdenek.wagner@gmail.com, http://icebearsoft.euweb.cz). - This version also defines a new preprodessor directive - @modernhindi, which functions in the same way as @hindi but - uses far fewer Sanskrit-style ligatures, preferring conjuncts - built from half-consonant forms wherever possible. (Thanks to - Raymond Doctor for helpful advice on which ligatures to permit - and which to suppress.) The definition of @sanskrit has been - changed so that it now restores all the ligatures disabled by - @modernhindi, not just those disabled by @hindi. The sequences - kk.sa, .tk.sa, dmya and hmya have been modified to produce - k+k.sa, .t+k.sa, d+mya, h+mya (rather than, as previously, - kk+.sa, .tk+.sa dm+ya, hm+ya). The code which handles all such - substitutions has been radically improved. The special warning - message prompted by the long-defunct preprocessor directive - @obeylines has been removed. - -- John Smith - */ - -/* - Version 2.1 makes the following changes: - * - * Material within {\dn ... } (or $ ... $) may be enclosed within - angle brackets < ... >; it is then not processed, but is passed - through verbatim to the output file, e.g. - {\dn eka do <\hrule width 10 em> tiina caara} - * Changes to the fonts have made an "open ya" glyph available. This - is now used wherever the preprocessor would previously have - produced consonant + viraama + ya. - * The fonts now contain defined glyphs for .n.na; the preprocessor - uses these. - * In previous releases the "half j~na" glyph was not used in @hindi - and @modernhindi modes (the program output "half ja + half ~na"). - This has been corrected. - * The output now avoids using the following control symbols: \", \#, - \$, \%, \&, \'. - -- John Smith - */ - -/* - Version 2.11 is a bugfix release to deal with two problems: - * - * Newline characters were not being properly handled in material - enclosed within angle brackets < ... >; - * The input sequence ~a was producing the wrong output for the - initial form of the vowel. - -- John Smith - */ - -/* - Version 2.12 contains two modification by Kevin Carmody, one to add - the ligature disabling character "+", and one bug fix to avoid the use - of non-standard syntax in invocations of fixconj(). - */ - -/* - Bug fix suggested by John Smith: put_syll() just after case '<' in order - to emit pending syllable. The verbatim material should appear between - words but you can even write {\dn pa<\kern -2pt >de} if you know what - you are doing. However, such use is strongly discouraged. - */ - -/* - Version 2.13: ~m is now a synonym for /, i.e. candrabindu -*/ - -/* - Version 2.14 contains the following modifications: - - Accented characters with codes >= 128 are allowed in \dn texts - within {\rm ...} and <...> - UTF-8 is not yet supported. - - The filename extensions are not fixed but have reasoanble defaults - defined by constants DEFAULT_SRC_EXT (= ".dn") and - DEFAULT_DEST_EXT (= ".tex"). It is explicitly forbidden for the source - file to have the extension defined by DEFAULT_DEST_EXT. The file names - are examined as follows: - - 1. If the source filename does not have the default extension, it is - appended. If such a file does not exist, the preprocessor tries - again with the original file name. - - 2. If the destination filename was given, its extension is checked. - It is explicitly forbidden for the destination file to have the - extension defined by DEFAULT_SRC_EXT. If the filename is equal - to the name of the source file, DEFAULT_DEST_EXT is appended, - otherwise the file name is used as is. - - 3. If the destination filename was not given, it is based upon the - source filename. If the source filename contains the - DEFAULT_SRC_EXT extension, it is stripped of. Afterwards the - DEFAULT_DEST_EXT extension is appended. - - The algorithm was designed to prevent typing errors but it is far - from foolproof. The filesystem properties are not examined and all - filename tests are case insensitive. The file names are not expanded. - For instance, if the working directory is "/some/path", then "x.y", - "./x.y", "../path/x.y" as well as "/some/path/x.y" refer to the same - file but they will be treated as different by the preprocessor. - Moreover, the algorithm does not try to follow symlinks neither does it - examine inodes in order to discover hard links. - - Notes for compilation: - Some C libraries do not contain strcasecmp but contain either stricmp - or strcmpi (or both) with the same syntax. If it is the case of your - compiler, use -DHAS_STRCMPI or -DHAS_STRICMP. GCC/EMX for OS/2 - requires -DHAS_STRICMP, gcc 3.3.3 in Linux as well as gcc 2.95.2 - from mingw (Windows) know strcasecmp. - - The preprocessor can read files with any line endings on all platforms - (i.e. DOS CRLF, UNIX LF as well as Macintosh CR). More precisely: each - CR followed by LF is ignored and each CR followed by anything else is - treated as end of line. The line endings of the output file always - conform to conventions used on the operating system where the - preprocessor runs. -*/ - -/* - Modifications in version 2.15: - - \def\DevnagVersion is inserted at the beginning of the second line - if the first line starts with %& - - Error and warning messages written to stderr instead of stdout - (requested by Karl Berry) -*/ - -const char *version = "2.15"; - -#include <stdio.h> -#include <ctype.h> -#include <string.h> -#include <stdlib.h> /* Marc Csernel */ - -/* General constants */ -#define TRUE 1 -#define FALSE 0 -#define VIRAAM 94 -#define SMALLBUF 30 -#define MEDBUF 512 -#define MAXBUF 2048 -#define N_NOLIGS (sizeof nolig / sizeof nolig[0]) -#define N_MNOLIGS (sizeof modnolig / sizeof modnolig[0]) -#define ill_char 29 -#define dummy 30 -#define end_of_file 30 -#define end_of_line 31 - -/* - * Constants used in char_def structs - */ -/* ch_typ constants */ -#define illegal 0 -#define cmr 1 -#define control 2 -#define dn 3 -#define numeral 4 -/* ch_subtyp constants */ -#define lo_vowel 0 -#define hi_vowel 1 -#define consonant 2 -#define special 3 - -/* Constants representing symbols: defined as indexes into out_string[] */ -#define LBRACE 273 -#define RBRACE 264 -#define RE 263 /* \thinspace on switching from cmr to dn */ -#define RDT 266 /* raised r-dot (repha + anusvara) */ -#define RN 265 /* numeral, using cmr or dn as appropriate */ -#define RS 256 /* \thinspace on switching from dn to cmr */ - -/* Default extensions */ -#define DEFAULT_SRC_EXT ".dn" -#define DEFAULT_DEST_EXT ".tex" - -/* -Some C libraries do not have strcasecmp but have either strcmpi or stricmp -with the same syntax. Select the one you have. -*/ -#ifdef HAS_STRCMPI -#define strcasecmp(s1,s2) strcmpi(s1,s2) -#elif HAS_STRICMP -#define strcasecmp(s1,s2) stricmp(s1,s2) -#endif - -/* Global variable declarations */ -FILE *f_in, *f_out; -char *p_in; -int charbuf, wasCR = FALSE, charpresent = FALSE; -int number; -char symbol; -char infil[MEDBUF], outfil[MEDBUF]; -char inbuf[MAXBUF], outbuf[MAXBUF]; -char word[MEDBUF]; -short syll[SMALLBUF]; -int n_halves, buf_idx; -short half_codes[SMALLBUF]; -short joincode; -unsigned char hindi_mode, mhindi_mode, dollar_mode, d_found; -unsigned char tabs_mode; /* Marc Csernel */ -unsigned char no_dn, wait_syll, do_hyphen, do_vconjuncts; -unsigned char cons_seen, vow_seen, front_r, cmr_mode, num_mode; -unsigned char lig_block; /* Kevin Carmody */ -short chr_idx, cons_code; -const char *banner = -"Preprocessor for Devanagari for TeX package\n\ -Copyright (C) 1991-1998 University of Groningen, The Netherlands\n\ -Author : Frans J. Velthuis <velthuis@rc.rug.nl>\n\ -Maintainer : Zdenek Wagner <zdenek.wagner@gmail.com>"; - -/* Function declarations */ -int main(int argc, char **argv); -void dnproc(void); -void put_ch(short code); -void sendchar(char c); -void put_sym(short code); -void put_word(void); -void put_syll(void); -void tst_half(void); -void put_macro(short macro); -void err_ill(const char *str); -char inp_ch(void); -void expand(void); -char find_dn(void); -int sindex(int i, short t); -void fixconj(short *wrong, short *right); -char *fgetline(char *buf, int n, FILE *f); - -/* --------- Addition by Marc Csernel 1998 --------- */ - -int citation; -int optchapter; -int linenumber; -int test_command(void); -char test_sub_com(void); -char comm_double_args(void); -char comm_special(void); -char comm_opt(void); -char comm_chapter(void); -char comm_cite(void); -char *getsubarg(void); -char comm_begin(void); -char ignore(void); - -/* ------------------ End Addition ----------------- */ - -/* - * *** Struct declarations: major data types *** - */ - -/* - A struct of type char_def contains the following information about - any given character: - - ch_typ: dn -- a character of the Devanagari syllabary - cmr -- a Roman character available within {\dn } - numeral -- self-evident: either Devanagari or ASCII as - specified - control -- special TeX character ("\", "{", "}", etc.) - illegal -- none of the above - ch_subtyp: consonant - lo_vowel (subscript) - hi_vowel ("regular" and superscript) - special -- none of the above - ch_code: For ch_typ dn only, gives the octal value of the - character's position in the dvng fonts. For vowels, - refers to the initial form (ch_subcode refers to - non-initial form); composite forms such as initial "o" - (= initial "a" + non-initial "o") have special values - greater than 257 decimal. - ch_subcode: Used for ch_typ dn only. For vowels, gives the octal - value of the non-initial form ("a" has the special value - 257 decimal). For consonants, gives the index into - cons_table[] where the "half-form" of the consonant is - defined. -*/ -struct char_def { - short ch_typ, ch_subtyp, ch_code, ch_subcode; -}; - -/* - A struct of type cons_joins contains the following information about - any given consonant or consonant-group Ca: - - n_ligs: The number of "simple" (two-member) ligatures listed in - lig_table[] for Ca. - lig_code: The index into lig_table[] of the first such ligature. - r_type: Has the value 0 if Ca takes the normal form of following "r" - (decimal 125) or if "Cra" is a predefined ligature; 1 if Ca - requires the "caret" form of following "r" (decimal 126); - 2 if "Cra" is handled as "\qb{Ca}". - j_code: Gives the octal value of the "half-form" of Ca if one exists, - otherwise 0. - */ -struct cons_joins { - short n_ligs, lig_code; - short r_type, j_code; -}; - -/* - A struct of type ligs contains the following information about any - given ligature: - - sym_code: The index into char_table[] of the final member of the - ligature. May be expressed as as a character constant - (e.g. 't') or as a number (e.g. 6, referring to ".s"). - sym_new: Gives either (a) the octal value of the ligature, or (b) a - negative number to be handled by expand(), which will reverse - the sign and subtract 1 (-5 becomes 4), and use the result as - an index into r_ligs[]. (This is done for "ktra", "gra", - ".dra", "dra", "dhra" and ".s.tra".) - join_idx: Gives the index into cons_table[] of the ligature, or 0. - in_use: Boolean TRUE or FALSE according to whether the ligature is - currently enabled (they are all initially enabled in - lig_table[], but may be disabled by e.g. @hindi). - */ -struct ligs { - char sym_code; - short sym_new, join_idx; - unsigned char in_use; -}; - -/* - * *** Data structures used by devnag *** - */ - -/* Ligatures to be disabled by @hindi */ -short nolig[] = { - 2,3,6,7,16,25,27,34,35,39,40,46,47,49,56,58,59,62,65, - 78,81,82,84,85,86,87,88,89,90,91,92,93,94,95,98,99, - 100,101,105 -}; - -/* Ligatures to be disabled by @modernhindi */ -short modnolig[] = { - 0,1,2,3,4,6,7,9,10,11,12,14,16,17,18,19,20,21,22,23, - 24,25,26,27,28,29,30,31,32,33,34,35,36,39,40,41,42,43, - 44,45,46,47,48,49,50,52,53,54,56,58,59,62,64,65,69,70, - 71,72,73,74,75,76,77,78,80,81,82,84,85,86,87,88,89,90,91, - 92,93,94,95,98,99,100,101,102,103,104,105,118,119 -}; - -/* - * ligidxs[] maps the ligature-numbers that the user may specify - * with @lig and @nolig to the appropriate entries in lig_table[] - */ -short ligidxs[] = { - 0,1,2,3,4,6,7,9,11,12,13,14,118,16,17,18,19,20,21,22, - 23,24,25,26,27,28,29,30,31,32,33,34,35,36,38,39,40,41, - 42,43,44,45,46,47,48,49,50,52,53,119,54,55,56,58,59,60, - 61,62,63,64,65,66,68,69,70,71,72,73,74,75,76,77,78,80, - 81,82,84,85,86,87,88,89,90,91,92,93,94,95,96,98,99,100, - 101,102,104,117,105,106,107,108,109,110,111,112,113 -}; - -/* - * In the following character sets, final space is a dummy value - */ -/* Characters that may be preceded by "." */ -char chset1[] = { - 'k','t','d','o','n','s','r','g', - 'h','a','.','K','T','D','l','L','R','m',' ' -}; -/* Characters with a special meaning if preceded by "a" */ -char chset2[] = {'a','i','u',' '}; -/* Characters that may be preceded by '"' */ -char chset3[] = {'n','s',' '}; -/* Characters that may be followed by "h" */ -char chset4[] = {'k','g','c','j','t','d','p','b','R',' '}; -/* Replacements for chset2 characters when preceded by "a" */ -char chset5[] = {'A','E','O'}; -/* Characters that may be preceded by "~" */ -char chset6[] = {'n','o','a','r','m',' '}; - -/* - * Private character set used internally by devnag -- basically - * ASCII, but with special characters allotted slots below 32: - * conversion from input representation done by dnproc(). - */ -struct char_def char_table[] = { - {illegal,special,0,0}, /* 1 not used */ - {dn,consonant,'\126',34}, /* 2 .t */ - {dn,consonant,'\130',36}, /* 3 .d */ - {dn,special,'\72',0}, /* 4 .o */ - {dn,consonant,'\132',1}, /* 5 .n */ - {dn,consonant,'\161',2}, /* 6 .s */ - {dn,lo_vowel,'\33',2}, /* 7 .r */ - {dn,consonant,'\13',3}, /* 8 .g */ - {dn,special,'\54',0}, /* 9 .h */ - {dn,special,'\137',0}, /* 10 .a */ - {dn,special,'\24',0}, /* 11 .. */ - {dn,consonant,'\14',4}, /* 12 .K */ - {dn,consonant,'\127',35}, /* 13 .T */ - {dn,consonant,'\131',57}, /* 14 .D */ - {dn,lo_vowel,'\30','\37'}, /* 15 .l */ - {dn,lo_vowel,'\31','\174'}, /* 16 .L */ - {dn,lo_vowel,'\21','\16'}, /* 17 .R */ - {dn,consonant,'\122',32}, /* 18 "n */ - {dn,consonant,'\146',5}, /* 19 "s */ - {dn,consonant,'\170',0}, /* 20 Rh */ - {dn,consonant,'\32',11}, /* 21 ~n */ - {dn,hi_vowel,267,262}, /* 22 ~o */ - {dn,hi_vowel,275,4}, /* 23 ~a */ - {dn,consonant,'\35',31}, /* 24 ~r */ - {illegal,special,0,0}, /* 25 not used */ - {illegal,special,0,0}, /* 26 not used */ - {illegal,special,0,0}, /* 27 not used */ - {illegal,special,0,0}, /* 28 not used */ - {illegal,special,0,0}, /* 29 not used */ - {control,special,0,0}, /* 30 dummy */ - {control,special,0,0}, /* 31 end_of_line */ - {control,special,0,0}, /* 32 space */ - {cmr,special,0,0}, /* ! */ - {illegal,special,0,0}, /* " */ - {dn,special,'\25',0}, /* # */ - {illegal,special,0,0}, /* $ */ - {control,special,0,0}, /* % */ - {dn,special,0,0}, /* & */ - {cmr,special,0,0}, /* ' to * */ - {cmr,special,0,0}, /* ' to * */ - {cmr,special,0,0}, /* ' to * */ - {cmr,special,0,0}, /* ' to * */ - {dn,special,0,0}, /* + */ - /* Kevin Carmody: - * "+" changed - * from cmr - * to dn */ - {cmr,special,0,0}, /* , to - */ - {cmr,special,0,0}, /* , to - */ - {illegal,special,0,0}, /* . */ - {dn,special,'\40',0}, /* / */ - {numeral,special,0,0}, /* 0 to 9 */ - {numeral,special,0,0}, /* 0 to 9 */ - {numeral,special,0,0}, /* 0 to 9 */ - {numeral,special,0,0}, /* 0 to 9 */ - {numeral,special,0,0}, /* 0 to 9 */ - {numeral,special,0,0}, /* 0 to 9 */ - {numeral,special,0,0}, /* 0 to 9 */ - {numeral,special,0,0}, /* 0 to 9 */ - {numeral,special,0,0}, /* 0 to 9 */ - {numeral,special,0,0}, /* 0 to 9 */ - {cmr,special,0,0}, /* : and ; */ - {cmr,special,0,0}, /* : and ; */ - {control,special,0,0}, /* < */ - {cmr,special,0,0}, /* = */ - {control,special,0,0}, /* > */ - {cmr,special,0,0}, /* ? */ - {dn,special,'\177',0}, /* @ */ - {dn,hi_vowel,258,'\101'}, /* A */ - {dn,consonant,'\102',6}, /* B */ - {dn,consonant,'\103',33}, /* C */ - {dn,consonant,'\104',7}, /* D */ - {dn,hi_vowel,259,'\173'}, /* E */ - {illegal,special,0,0}, /* F */ - {dn,consonant,'\107',8}, /* G */ - {dn,special,'\54',0}, /* H */ - {dn,hi_vowel,'\111','\106'}, /* I */ - {dn,consonant,'\112',9}, /* J */ - {dn,consonant,'\113',10}, /* K */ - {dn,consonant,'\17',30}, /* L */ - {dn,special,'\134',0}, /* M */ - {illegal,special,0,0}, /* N */ - {dn,hi_vowel,260,'\117'}, /* O */ - {dn,consonant,'\120',12}, /* P */ - {illegal,special,0,0}, /* Q */ - {dn,consonant,'\167',0}, /* R */ - {illegal,special,0,0}, /* S */ - {dn,consonant,'\124',13}, /* T */ - {dn,lo_vowel,'\125',1}, /* U */ - {illegal,special,0,0}, /* V to Z */ - {illegal,special,0,0}, /* V to Z */ - {illegal,special,0,0}, /* V to Z */ - {illegal,special,0,0}, /* V to Z */ - {illegal,special,0,0}, /* V to Z */ - {cmr,special,0,0}, /* [ */ - {control,special,0,0}, /* \ */ - {cmr,special,0,0}, /* ] */ - {illegal,special,0,0}, /* ^ */ - {dn,special,0,0}, /* _ */ - /* Marc Csernel: - * "_" changed - * from illegal - * to dn */ - {cmr,special,0,0}, /* ` */ - {dn,hi_vowel,'\141',257}, /* a */ - {dn,consonant,'\142',14}, /* b */ - {dn,consonant,'\143',15}, /* c */ - {dn,consonant,'\144',37}, /* d */ - {dn,hi_vowel,'\145',3}, /* e */ - {dn,consonant,'\47',16}, /* f */ - {dn,consonant,'\147',17}, /* g */ - {dn,consonant,'\150',38}, /* h */ - {dn,hi_vowel,'\151','\105'}, /* i */ - {dn,consonant,'\152',18}, /* j */ - {dn,consonant,'\153',19}, /* k */ - {dn,consonant,'\154',20}, /* l */ - {dn,consonant,'\155',21}, /* m */ - {dn,consonant,'\156',22}, /* n */ - {dn,hi_vowel,261,'\157'}, /* o */ - {dn,consonant,'\160',23}, /* p */ - {dn,consonant,'\52',24}, /* q */ - {dn,consonant,'\162',0}, /* r */ - {dn,consonant,'\163',25}, /* s */ - {dn,consonant,'\164',26}, /* t */ - {dn,lo_vowel,'\165',0}, /* u */ - {dn,consonant,'\166',27}, /* v */ - {illegal,special,0,0}, /* not used */ - {illegal,special,0,0}, /* not used */ - {dn,consonant,'\171',28}, /* y */ - {dn,consonant,'\51',29}, /* z */ - {control,special,0,0}, /* left brace */ - {dn,special,'\56',0}, /* | */ - {control,special,0,0}, /* right brace */ - {illegal,special,0,0}, /* ~ */ - {illegal,special,0,0} /* del */ -}; - -/* - * Unordered table of consonants and consonant-groups giving - * information on the available ligatures, the form taken by a - * following "r", and the location in the dvng fonts of the - * "half-form" (if any) - */ -struct cons_joins cons_table[] = { - {0,0,1,0}, /* 0 */ - {1,120,0,'\27'}, /* 1 .n */ - {2,100,0,'\11'}, /* 2 .s */ - {0,0,0,'\34'}, /* 3 .g */ - {0,0,1,'\7'}, /* 4 .k */ - {6,94,0,'\133'}, /* 5 "s */ - {1,88,0,'\74'}, /* 6 B */ - {2,78,0,'\100'}, /* 7 D */ - {1,16,0,'\135'}, /* 8 G */ - {0,0,1,'\44'}, /* 9 J */ - {0,0,1,'\110'}, /* 10 K */ - {2,39,1,'\26'}, /* 11 ~n */ - {1,115,0,'\45'}, /* 12 P */ - {0,0,0,'\114'}, /* 13 T */ - {3,85,0,'\116'}, /* 14 b */ - {2,34,0,'\121'}, /* 15 c */ - {1,116,0,'\10'}, /* 16 f */ - {1,15,0,'\140'}, /* 17 g */ - {2,37,0,'\76'}, /* 18 j */ - {9,0,0,'\77'}, /* 19 k */ - {1,91,0,'\123'}, /* 20 l */ - {2,89,0,'\115'}, /* 21 m */ - {1,80,0,'\6'}, /* 22 n */ - {4,81,0,'\75'}, /* 23 p */ - {0,0,1,'\12'}, /* 24 q */ - {2,105,0,'\55'}, /* 25 s */ - {3,55,0,'\50'}, /* 26 t */ - {2,92,0,'\46'}, /* 27 v */ - {0,0,1,'\5'}, /* 28 y */ - {1,114,0,'\36'}, /* 29 z */ - {0,0,1,'\20'}, /* 30 L */ - {0,0,1,'\35'}, /* 31 ~r */ - {8,17,1,0}, /* 32 "n */ - {1,36,1,0}, /* 33 C */ - {4,41,1,0}, /* 34 .t */ - {1,45,1,0}, /* 35 .th */ - {6,46,1,0}, /* 36 .d */ - {11,58,2,0}, /* 37 d */ - {7,107,1,0}, /* 38 h */ - {3,9,1,0}, /* 39 k t */ - {1,14,1,0}, /* 40 k v */ - {3,25,1,0}, /* 41 "n k */ - {1,28,1,0}, /* 42 "n kh */ - {1,29,1,0}, /* 43 "n g */ - {2,30,1,0}, /* 44 "n gh */ - {1,32,1,0}, /* 45 "n k t */ - {1,33,1,0}, /* 46 "n k .s */ - {1,52,1,0}, /* 47 .d g */ - {1,53,1,0}, /* 48 .d gh */ - {2,71,2,0}, /* 49 d d */ - {2,73,2,0}, /* 50 d dh */ - {1,75,1,0}, /* 51 d bh */ - {1,77,2,0}, /* 52 d v */ - {3,102,1,0}, /* 53 .s .t */ - {0,0,1,'\43'}, /* 54 k .s */ - {0,0,1,0202}, /* 55 t t */ - {1,117,1,0}, /* 56 .s .t r */ - {1,54,1,0}, /* 57 .dh */ - {1,12,1,0}, /* 58 k n */ - {1,13,1,0}, /* 59 k r */ - {0,0,1,0351}, /* 60 g r */ - {0,0,1,0350}, /* 61 gh n */ - {0,0,1,0352}, /* 62 j ~n */ - {0,0,1,0353}, /* 63 ~n c */ - {0,0,1,0354}, /* 64 t r */ - {1,69,1,0}, /* 65 d g */ - {1,70,1,0}, /* 66 d gh */ - {0,0,1,0361}, /* 67 dh n */ - {0,0,1,0362}, /* 68 dh r */ - {0,0,1,0363}, /* 69 p t */ - {0,0,1,0364}, /* 70 "s c */ - {0,0,1,0365}, /* 71 "s r */ - {0,0,1,0366}, /* 72 "s v */ - {1,118,1,0}, /* 73 k t r */ - {1,119,1,0}, /* 74 .d r */ - {1,76,1,0}, /* 75 d r */ - {0,0,2,0} /* 76 d b */ -}; - -/* - * Ordered table of available ligatures giving each ligature's - * position in the dvng fonts (or a negative number for use by - * expand()) and index into cons_table[] - * - * Note that lig_table[96] is an entry for a ligature that was - * removed from the fonts as of release 2.1. It is therefore - * marked as (permanently) FALSE; it has not been removed from - * the table since to do so would change the index values of all - * succeeding entries, and these occur frequently in the code. - */ -struct ligs lig_table[] = { - {'k',0303,0,TRUE}, /* 0 k k */ - {'t',0304,39,TRUE}, /* 1 k t */ - {'n',0307,58,TRUE}, /* 2 k n */ - {'m',0311,0,TRUE}, /* 3 k m */ - {'y',0310,0,TRUE}, /* 4 k y */ - {'r',0207,59,TRUE}, /* 5 k r */ - {'l',0312,0,TRUE}, /* 6 k l */ - {'v',0313,40,TRUE}, /* 7 k v */ - {6,042,54,TRUE}, /* 8 k .s */ - {'y',0305,0,TRUE}, /* 9 k t y */ - {'r',-5,73,TRUE}, /* 10 k t r */ - {'v',0306,0,TRUE}, /* 11 k t v */ - {'y',0346,0,TRUE}, /* 12 k n y */ - {'y',0347,0,TRUE}, /* 13 k r y */ - {'y',0314,0,TRUE}, /* 14 k v y */ - {'r',-2,60,TRUE}, /* 15 g r */ - {'n',0315,61,TRUE}, /* 16 gh n */ - {'k',0254,41,TRUE}, /* 17 "n k */ - {'K',0262,42,TRUE}, /* 18 "n kh */ - {'g',0275,43,TRUE}, /* 19 "n g */ - {'G',0277,44,TRUE}, /* 20 "n gh */ - {18,0274,0,TRUE}, /* 21 "n "n */ - {'n',0265,0,TRUE}, /* 22 "n n */ - {'m',0301,0,TRUE}, /* 23 "n m */ - {'y',0302,0,TRUE}, /* 24 "n y */ - {'t',0255,45,TRUE}, /* 25 "n k t */ - {'y',0257,0,TRUE}, /* 26 "n k y */ - {6,0260,46,TRUE}, /* 27 "n k .s */ - {'y',0272,0,TRUE}, /* 28 "n kh y */ - {'y',0276,0,TRUE}, /* 29 "n g y */ - {'y',0271,0,TRUE}, /* 30 "n gh y */ - {'r',0300,0,TRUE}, /* 31 "n gh r */ - {'y',0256,0,TRUE}, /* 32 "n k t y */ - {'v',0261,0,TRUE}, /* 33 "n k .s v */ - {'c',0316,0,TRUE}, /* 34 c c */ - {21,0317,0,TRUE}, /* 35 c ~n */ - {'y',0320,0,TRUE}, /* 36 ch y */ - {21,0342,62,TRUE}, /* 37 j ~n */ - {'r',0205,0,TRUE}, /* 38 j r */ - {'c',0321,63,TRUE}, /* 39 ~n c */ - {'j',0322,0,TRUE}, /* 40 ~n j */ - {'k',0326,0,TRUE}, /* 41 .t k */ - {2,0323,0,TRUE}, /* 42 .t .t */ - {13,0341,0,TRUE}, /* 43 .t .th */ - {'y',0324,0,TRUE}, /* 44 .t y */ - {'y',0325,0,TRUE}, /* 45 .th y */ - {'g',0263,47,TRUE}, /* 46 .d g */ - {'G',0264,48,TRUE}, /* 47 .d gh */ - {3,0345,0,TRUE}, /* 48 .d .d */ - {'m',0273,0,TRUE}, /* 49 .d m */ - {'y',0267,0,TRUE}, /* 50 .d y */ - {'r',-6,74,TRUE}, /* 51 .d r */ - {'y',0270,0,TRUE}, /* 52 .d g y */ - {'r',0266,0,TRUE}, /* 53 .d gh r */ - {'y',0344,0,TRUE}, /* 54 .dh y */ - {'t',0201,55,TRUE}, /* 55 t t */ - {'n',0327,0,TRUE}, /* 56 t n */ - {'r',057,64,TRUE}, /* 57 t r */ - {'g',0213,65,TRUE}, /* 58 d g */ - {'G',0212,66,TRUE}, /* 59 d gh */ - {'d',0214,49,TRUE}, /* 60 d d */ - {'D',0210,50,TRUE}, /* 61 d dh */ - {'n',0221,0,TRUE}, /* 62 d n */ - {'b',0223,76,TRUE}, /* 63 d b */ - {'B',0211,51,TRUE}, /* 64 d bh */ - {'m',0224,0,TRUE}, /* 65 d m */ - {'y',0215,0,TRUE}, /* 66 d y */ - {'r',-3,75,TRUE}, /* 67 d r */ - {'v',0222,52,TRUE}, /* 68 d v */ - {'r',0355,0,TRUE}, /* 69 d g r */ - {'r',0356,0,TRUE}, /* 70 d gh r */ - {'y',0220,0,TRUE}, /* 71 d d y */ - {'v',0370,76,TRUE}, /* 72 d d v */ - {'y',0217,0,TRUE}, /* 73 d dh y */ - {'v',0371,0,TRUE}, /* 74 d dh v */ - {'y',0216,0,TRUE}, /* 75 d bh y */ - {'y',0357,0,TRUE}, /* 76 d r y */ - {'y',0225,0,TRUE}, /* 77 d v y */ - {'n',0360,67,TRUE}, /* 78 dh n */ - {'r',-4,68,TRUE}, /* 79 dh r */ - {'n',0340,0,TRUE}, /* 80 n n */ - {'t',0330,69,TRUE}, /* 81 p t */ - {'n',0331,0,TRUE}, /* 82 p n */ - {'r',0376,0,TRUE}, /* 83 p r */ - {'l',0332,0,TRUE}, /* 84 p l */ - {'n',0247,0,TRUE}, /* 85 b n */ - {'b',0251,0,TRUE}, /* 86 b b */ - {'v',0333,0,TRUE}, /* 87 b v */ - {'n',0336,0,TRUE}, /* 88 bh n */ - {'n',0337,0,TRUE}, /* 89 m n */ - {'l',0335,0,TRUE}, /* 90 m l */ - {'l',0245,0,TRUE}, /* 91 l l */ - {'n',0246,0,TRUE}, /* 92 v n */ - {'v',0250,0,TRUE}, /* 93 v v */ - {'c',0226,70,TRUE}, /* 94 "s c */ - {'n',0227,0,TRUE}, /* 95 "s n */ - {'b',0233,0,FALSE}, /* 96 "s b */ - {'r',0231,71,TRUE}, /* 97 "s r */ - {'l',0232,0,TRUE}, /* 98 "s l */ - {'v',0230,72,TRUE}, /* 99 "s v */ - {2,0243,53,TRUE}, /* 100 .s .t */ - {13,0244,0,TRUE}, /* 101 .s .th */ - {'y',0367,0,TRUE}, /* 102 .s .t y */ - {'r',-1,56,TRUE}, /* 103 .s .t r */ - {'v',0253,0,TRUE}, /* 104 .s .t v */ - {'n',0334,0,TRUE}, /* 105 s n */ - {'r',0372,0,TRUE}, /* 106 s r */ - {5,0242,0,TRUE}, /* 107 h .n */ - {'n',0241,0,TRUE}, /* 108 h n */ - {'m',0234,0,TRUE}, /* 109 h m */ - {'y',0235,0,TRUE}, /* 110 h y */ - {'r',0240,0,TRUE}, /* 111 h r */ - {'l',0236,0,TRUE}, /* 112 h l */ - {'v',0237,0,TRUE}, /* 113 h v */ - {'r',0206,0,TRUE}, /* 114 z r */ - {'r',0203,0,TRUE}, /* 115 ph r */ - {'r',0204,0,TRUE}, /* 116 f r */ - {'y',0252,0,TRUE}, /* 117 .s .t r y */ - {'y',0374,0,TRUE}, /* 118 k t r y */ - {'y',0373,0,TRUE}, /* 119 .d r y */ - {5,0233,0,TRUE} /* 120 .n .n */ -}; - -/* - * Table of the actual codes output by devnag - */ -const char *out_string[] = { - "\\7{","\\8{","\\9{","\\?","\\<","\\305w","\\306w", /* 0-6 */ - "\\307w","\\308w","\\309w","\\30Aw","\\30Bw","\\30Cw", /* 7-12 */ - "\\0","\\qx{","\\30Fw","\\310w","\\311w","\\312w", /* 13-18 */ - "\\313w","\\314w","\\315w","\\316w","\\317w","\\318w", /* 19-24 */ - "\\319w","\\31Aw","\\31Bw","\\31Cw","\\31Dw", /* 25-29 */ - "\\31Ew","\\qy{","\\1","!","\\322w","\\323w","\\324w", /* 30-36 */ - "\\325w","\\326w","\\327w","(",")","\\32Aw","+",",", /* 37-44 */ - "-",".","/","0","1","2","3","4","5","6","7","8","9", /* 45-57 */ - ":",";","<","=",">","?","@", /* 58-64 */ - "A","B","C","D","E","F","G","H","I","J","K","L","M", /* 65-77 */ - "N","O","P","Q","R","S","T","U","V","W","X","Y","Z", /* 78-90 */ - "\\35Bw","\\2","\\35Dw","\\qq{","\\35Fw","`", /* 91-96 */ - "a","b","c","d","e","f","g","h","i","j","k","l","m", /* 97-109 */ - "n","o","p","q","r","s","t","u","v","w","x","y","z", /* 110-122 */ - "\\4","\\qz{","\\5","\\6{","\\37Fw", /* 123-127 */ - "\\380w","\\381w","\\382w","\\383w","\\384w","\\385w", /* 128-133 */ - "\\386w","\\387w","\\388w","\\389w","\\38Aw","\\38Bw", /* 134-139 */ - "\\38Cw","\\38Dw","\\38Ew","\\38Fw","\\390w","\\391w", /* 140-145 */ - "\\392w","\\393w","\\394w","\\395w","\\396w","\\397w", /* 146-151 */ - "\\398w","\\399w","\\39Aw","\\39Bw","\\39Cw","\\39Dw", /* 152-157 */ - "\\39Ew","\\39Fw","\\3A0w","\\3A1w","\\3A2w","\\3A3w", /* 158-163 */ - "\\3A4w","\\3A5w","\\3A6w","\\3A7w","\\3A8w","\\3A9w", /* 164-169 */ - "\\3AAw","\\3ABw","\\3ACw","\\3ADw","\\3AEw","\\3AFw", /* 170-175 */ - "\\3B0w","\\3B1w","\\3B2w","\\3B3w","\\3B4w","\\3B5w", /* 176-181 */ - "\\3B6w","\\3B7w","\\3B8w","\\3B9w","\\3BAw","\\3BBw", /* 182-187 */ - "\\3BCw","\\3BDw","\\3BEw","\\3BFw","\\3C0w","\\3C1w", /* 188-193 */ - "\\3C2w","\\3C3w","\\3C4w","\\3C5w","\\3C6w","\\3C7w", /* 194-199 */ - "\\3C8w","\\3C9w","\\3CAw","\\3CBw","\\3CCw","\\3CDw", /* 200-205 */ - "\\3CEw","\\3CFw","\\3D0w","\\3D1w","\\3D2w","\\3D3w", /* 206-211 */ - "\\3D4w","\\3D5w","\\3D6w","\\3D7w","\\3D8w","\\3D9w", /* 212-217 */ - "\\3DAw","\\3DBw","\\3DCw","\\3DDw","\\3DEw","\\3DFw", /* 218-223 */ - "\\3E0w","\\3E1w","\\3E2w","\\3E3w","\\3E4w","\\3E5w", /* 224-229 */ - "\\3E6w","\\3E7w","\\3E8w","\\3E9w","\\3EAw","\\3EBw", /* 230-235 */ - "\\3ECw","\\3EDw","\\3EEw","\\3EFw","\\3F0w","\\3F1w", /* 236-241 */ - "\\3F2w","\\3F3w","\\3F4w","\\3F5w","\\3F6w","\\3F7w", /* 242-247 */ - "\\3F8w","\\3F9w","\\3FAw","\\3FBw","\\3FCw","\\3FDw", /* 248-253 */ - "\\3FEw","\\3FFw", /* 254-255 */ - "{\\rs ","","aA","e\\?","aO","ao","A\\<","\\re}","}", /* 256-264 */ - "\\rn{","{\\rdt}","aA\\<","{\\qva}","{\\qvb}","{\\qvc}", /* 265-270 */ - "\\qa{","\\qb{","{","\\qc{","a\\<" /* 271-275 */ -}; - -/* - * Table specifying the form of following "r" for various consonants - * and consonant-groups (used by expand()) - */ -short r_ligs[6][2] = { - {0243,1}, /* .s .t */ - {0147,0}, /* g */ - {0144,2}, /* d */ - {0104,0}, /* dh */ - {0304,1}, /* k t */ - {0130,1} /* .d */ -}; - -/* --------- Addition by Marc Csernel 1998 --------- */ - -/* The array contains a list of LaTeX commands preceded by a code: - - 1 a mandatory argument follows. e.g. \end{enumerate} - 2 the text inclosed by a preceding brace must not be translated - till next closing brace. - 3 two mandatory arguments follow. e.g. \multicolumn{nb}{desc}{text} - 4 For begin: a mandatory argument followed by zero, or one optional, - depending on the first one e.g. \begin{itemize} or - \begin{tabular}{....} - 5 a mandatory argument and optional ones which must not be translated. - \raisebox{raise}[ht][prof]{text to be translated} - 6 one or more optional argument(s) which must not be translated and - a mandatory one which must be translated e.g. - \framebox[6cm][s]{text to be translated} - 7 The command cite: an optional argument which must be translated - and a mandatory one which mustn't. - 8 Commands like chapter, section... with optional argument which - must be translated and a mandatory one which must also be - translated. - -*/ - -typedef struct { - int Typ_Com; - const char *Name_com; -} typcom; - -typcom TabCom[] = { - {4,"begin"}, - {1,"end"}, - {1,"label"}, - {1,"pageref"}, - {1,"ref"}, - {1,"index"}, - {1,"hspace"}, - {1,"hspace*"}, - {1,"vspace"}, - {1,"vspace*"}, - {1,"addvspace"}, - {1,"enlargethispage"}, - {1,"enlargethispage*"}, - {1,"include"}, - {1,"input"}, - {1,"parbox"}, - {1,"stepcounter"}, - {1,"refstepcounter"}, - {1,"bibitem"}, - {1,"cline"}, - {2,"rm"}, - {2,"kern"}, - {2,"hskip"}, - {2,"vskip"}, - {2,"vadjust"}, - {3,"addtolength"}, - {3,"setlength"}, - {3,"setcounter"}, - {3,"addtocounter"}, - {3,"multicolumn"}, - {3,"rule"}, - {3,"addcontentsline"}, - {5,"raisebox"}, - {6,"framebox"}, - {6,"makebox"}, - {7,"cite"}, - {8,"chapter"}, - {8,"section"}, - {8,"subsection"}, - {8,"subsubsection"}, - {8,"paragraph"}, - {8,"subparagraph"}, - {8,"part"}, - {0,""} -}; - -/* - For the command begin, depending on the first argument we will - have zero (default), 1, 2.. other arguments following. Within - the following array the first element of an item describes the - number of arguments, the second one the name of the first - argument related with i.e - - \begin {tabular} - - will have 1 argument. - */ -typcom TabSubCom[]= { - {1,"tabular"}, - {1,"supertabular"}, - {1,"longtable"}, - {1,"thebibliography"}, - {0,""} -}; - -char command[100]; /* the text of a current command to test */ -int nbchcomm; /* the number of character of the curent command */ -char subcom [1000]; /* for debugging etc. */ - -/* - This fuction tests if the LaTeX command is one of the TabCom[] - array. In this case the code (Typ_Com) is returned. - */ -int test_command(void) { - int i = 0; - while (TabCom[i].Name_com[0] != 0) { - if (!strcmp(command,TabCom[i++].Name_com)) return TabCom[i-1].Typ_Com; - } - return 0; -} - -/* - This routine writes down all characters it finds; it looks - for a '{' followed by some text and a '}'; no nesting of braces - is considered. - */ -char test_sub_com(void) { - int nbsub = 0; - while (symbol != '}') { - sendchar(symbol); - subcom[nbsub++] = symbol; - subcom[nbsub] = 0; - symbol = inp_ch(); - } - sendchar(symbol); - subcom[nbsub++] = symbol; - subcom[nbsub] = 0; - symbol = inp_ch(); - return symbol; -} - -/* - This routine writes down all characters it finds; it looks - twice for a '{' followed by some text and a '}'; for the - second time nesting of braces is considered. - */ -char comm_double_args(void) { - int nbsub = 0; - while (symbol != '}') { - sendchar(symbol); - subcom[nbsub++] = symbol; - subcom[nbsub] = 0; - symbol = inp_ch(); - } - /* looking for the end of the second argument */ - sendchar(symbol); - symbol = inp_ch(); - while (symbol != '{') { - sendchar(symbol); - symbol = inp_ch(); - } - sendchar(symbol); - symbol = inp_ch(); - symbol = ignore(); - sendchar(symbol); - symbol = inp_ch(); - return symbol; -} - -/* - For LaTeX commands such as \raisebox{5pt}[10pt][25pt]{.sa.t&vidha.m} - where the second argument must be translated - */ -char comm_special(void) { - int nbsub = 0; - while (symbol != '}') { - sendchar(symbol); - subcom[nbsub++] = symbol; - subcom[nbsub] = 0; - symbol = inp_ch(); - } - while (symbol != '{') { - sendchar(symbol); - subcom[nbsub++] = symbol; - subcom[nbsub] = 0; - symbol = inp_ch(); - } - return symbol; -} - -/* - For LaTeX commands such as \framebox[10pt][25pt]{.sa.t&vidha.m} - where optional arguments are not translated and the mandatory - one must be translated - */ -char comm_opt(void) { - int nbsub = 0; - while (symbol != '{') { - sendchar(symbol); - subcom[nbsub++] = symbol; - subcom[nbsub] = 0; - symbol = inp_ch(); - } - return symbol; -} - -char comm_chapter(void) { - if (symbol == '[') { - optchapter = 1; - sendchar(symbol); - symbol=inp_ch(); - } - if (symbol == '*') { - sendchar(symbol); - symbol=inp_ch(); - } - return symbol; -} - -char comm_cite(void) { - if (symbol == '[') { - citation = 1; - sendchar(symbol); - symbol = inp_ch(); - } - else test_sub_com(); - return symbol; -} - -char *getsubarg(void) { - char com[20], *result; - int i = 0, j = 0; - while (subcom[i] != '{') i++; - i++; - while (subcom[i] == ' ') i++; - while (isalpha((unsigned char)subcom[i])) com[j++]= subcom[i++]; - com[j] = 0; - i = 0; - result = (char*) malloc (strlen(com)+1); - strcpy (result,com); - return result; -} - -/* - The LaTeX command BEGIN treatment - */ -char comm_begin(void) { - int i = 0, nbargs = 0; - char *com; - int nbsub = 0; - while (symbol != '}') { - sendchar(symbol); - subcom[nbsub++] = symbol; - subcom[nbsub] = 0; - symbol = inp_ch(); - } - sendchar(symbol); - symbol = inp_ch(); - com = getsubarg(); - while (TabSubCom[i].Name_com[0] != 0) { - if (!strcmp(com,TabSubCom[i++].Name_com)) - nbargs = TabSubCom[i-1].Typ_Com; - } - if (!nbargs) { /* argument not found within the table */ - free(com); - return symbol; - } - while (nbargs--) { - while (symbol != '{') { - sendchar(symbol); - subcom[nbsub++] = symbol; - subcom[nbsub] = 0; - symbol = inp_ch(); - } - sendchar(symbol); - symbol = inp_ch(); - symbol = ignore (); - } - sendchar(symbol); - symbol = inp_ch(); - free(com); - return symbol; -} - -/* - This routine assumes that a '{' has already been read; it - looks for the corresponding closing brace '}'; nesting of - braces is considered. - */ -char ignore(void) { - int nbsub = 0; - int nbbraces = 1; - while (nbbraces ) { - subcom[nbsub++] = symbol; - subcom[nbsub] = 0; - switch (symbol) { - case '{': - nbbraces++; - sendchar(symbol); - break; - case '}': - nbbraces--; - if (!nbbraces) return symbol; - sendchar(symbol); - break; - case ' ': - case '\n': - sendchar(symbol); - put_word(); - break; - default : - sendchar(symbol); - break; - } - symbol = inp_ch(); - } - return symbol ; -} - -/* ------------------ End Addition ----------------- */ - -/* - * *** Devnag function definitions *** - */ - -int main(int argc, char **argv) { - char *s_ptr; - int i; - unsigned char dn_yes, start_file; - - /* if invoked with "-v", print banner and exit */ - - if ((argc == 2) && (strcmp(argv[1], "-v") == 0)) { - printf("devnag v%s\n", version); - puts(banner); - exit(0); - } - - /* get file specifications */ - - if (argc == 3) { - strcpy(infil, argv[1]); - strcpy(outfil, argv[2]); - } - else { - if (argc == 2) { - strcpy(infil, argv[1]); - *outfil = '\0'; - } - else { - do { - printf("input file: "); - fgets(infil, MEDBUF, stdin); - infil[strlen(infil)-1] = '\0'; - } while (strlen(infil) == 0); - printf("output file: "); - fgets(outfil, MEDBUF, stdin); - outfil[strlen(outfil)-1] = '\0'; - } - } - /* Check the source file extension */ - if (strcasecmp(infil+strlen(infil)-strlen(DEFAULT_DEST_EXT), DEFAULT_DEST_EXT) == 0) { - fprintf(stderr, "source file extension %s is forbidden\n", DEFAULT_DEST_EXT); - exit(1); - } - s_ptr = infil+strlen(infil)-strlen(DEFAULT_SRC_EXT); - if (strcasecmp(s_ptr, DEFAULT_SRC_EXT) != 0) s_ptr = NULL; - if (!s_ptr) strcat(infil, DEFAULT_SRC_EXT); - - /* Try to open the source file */ - f_in = fopen(infil, "rb"); - if (!f_in && !s_ptr) { - /* strip extension which has not been supplied and try again */ - infil[strlen(infil)-strlen(DEFAULT_SRC_EXT)] = '\0'; - f_in = fopen(infil, "rb"); - } - if (!f_in) { - if (s_ptr) fprintf(stderr, "cannot open file %s\n", infil); - else fprintf(stderr, "cannot open either %s or %s%s\n", infil, infil, DEFAULT_SRC_EXT); - exit(1); - } - - /* Destination file name */ - if (strlen(outfil) == 0) { - strcpy(outfil, infil); - if (strcasecmp(outfil+strlen(outfil)-strlen(DEFAULT_SRC_EXT), DEFAULT_SRC_EXT) == 0) { - outfil[strlen(outfil)-strlen(DEFAULT_SRC_EXT)] = '\0'; - } - strcat(outfil, DEFAULT_DEST_EXT); - } else { - if (strcasecmp(outfil+strlen(outfil)-strlen(DEFAULT_SRC_EXT), DEFAULT_SRC_EXT) == 0) { - fclose(f_in); - fprintf(stderr, "destination file extension %s is forbidden\n", DEFAULT_SRC_EXT); - exit(1); - } - if (strcasecmp(infil, outfil) == 0) strcat(outfil, DEFAULT_DEST_EXT); - } - if ((f_out = fopen(outfil, "wb")) == NULL) { - fclose(f_in); - fprintf(stderr, "cannot open %s for output\n", outfil); - exit(1); - } - - /* initialization */ - - cons_seen = FALSE; - vow_seen = FALSE; - front_r = FALSE; - wait_syll = FALSE; - cmr_mode = FALSE; - num_mode = FALSE; - hindi_mode = FALSE; - mhindi_mode = FALSE; - dollar_mode = 0; - do_hyphen = FALSE; - do_vconjuncts = FALSE; - tabs_mode = FALSE; /* Marc Csernel */ - lig_block = FALSE; /* Kevin Carmody */ - start_file = TRUE; - - chr_idx = 0; - n_halves = 0; /* Kevin Carmody */ - *word = '\0'; - *inbuf = '\0'; - *outbuf = '\0'; - linenumber = 1; - - - /* main loop */ - - do { - p_in = fgetline(inbuf, MAXBUF, f_in); - if (start_file) { - if (inbuf[0] != '%' || inbuf[1] != '&') { - fprintf(f_out, "\\def\\DevnagVersion{%s}", version); - start_file = FALSE; - } - } - - /* read preprocessor commands */ - - if (*inbuf == '@') { - while (TRUE) { - if (strstr(inbuf, "dollars\n") == inbuf+1) { - dollar_mode = 1; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "nodollars\n") == inbuf+1) { - dollar_mode = 0; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "dolmode0\n") == inbuf+1) { - dollar_mode = 0; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "dolmode1\n") == inbuf+1) { - dollar_mode = 1; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "dolmode2\n") == inbuf+1) { - dollar_mode = 2; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "dolmode3\n") == inbuf+1) { - dollar_mode = 3; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "hindi\n") == inbuf+1) { - hindi_mode = TRUE; - if (mhindi_mode) { - for (i = 0; i < N_MNOLIGS; i++) - lig_table[modnolig[i]].in_use = TRUE; - mhindi_mode = FALSE; - } - for (i = 0; i < N_NOLIGS; i++) - lig_table[nolig[i]].in_use = FALSE; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "modernhindi\n") == inbuf+1) { - hindi_mode = TRUE; - mhindi_mode = TRUE; - for (i = 0; i < N_MNOLIGS; i++) - lig_table[modnolig[i]].in_use = FALSE; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "sanskrit\n") == inbuf+1) { - hindi_mode = FALSE; - mhindi_mode = FALSE; - for (i = 0; i < N_MNOLIGS; i++) - lig_table[modnolig[i]].in_use = TRUE; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "lig") == inbuf+1) { - s_ptr = inbuf; - while (TRUE) { - if ((s_ptr = strchr(s_ptr, ' ')) == NULL) break; - s_ptr++; - if (sscanf(s_ptr, "%d", &number) != 0) - lig_table[ligidxs[number-1]].in_use = TRUE; - } - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "nolig") == inbuf+1) { - s_ptr = inbuf; - while (TRUE) { - if ((s_ptr = strchr(s_ptr, ' ')) == NULL) break; - s_ptr++; - if (sscanf(s_ptr, "%d", &number) != 0) - lig_table[ligidxs[number-1]].in_use = FALSE; - } - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "hyphen\n") == inbuf+1) { - do_hyphen = TRUE; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "nohyphen\n") == inbuf+1) { - do_hyphen = FALSE; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "vconjuncts\n") == inbuf+1) { - do_vconjuncts = TRUE; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - if (strstr(inbuf, "novconjuncts\n") == inbuf+1) { - do_vconjuncts = FALSE; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - -/* --------- Addition by Marc Csernel 1998 --------- */ - - if (strstr(inbuf, "tabs\n") == inbuf+1) { - tabs_mode = TRUE; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - -/* ------------------ End Addition ----------------- */ - - if (strstr(inbuf, "notabs\n") == inbuf+1) { - tabs_mode = FALSE; - fprintf(f_out, "%%%s", inbuf); - linenumber++; - break; - } - - fprintf(stderr, "Warning: possible illegal preprocessor command at line "); - fprintf(stderr, "%d:\n%s", linenumber, inbuf); - fprintf(f_out, "%s", inbuf); - linenumber++; - break; - } - *inbuf = '\0'; - } - else { - if (!find_dn()) fputs(inbuf, f_out); - - /* process DN text */ - - else do { - buf_idx = 0; - symbol = inp_ch(); - dnproc(); - dn_yes = find_dn(); - if (!dn_yes) { - strcat(outbuf, inbuf); - fputs(outbuf, f_out); - } - } - while (dn_yes); - *inbuf = '\0'; - linenumber++; - *outbuf = '\0';; - } - } - while (p_in != NULL); - fclose(f_in); - fclose(f_out); - exit(0); -} - - -/* - * Read and parse DN input, and convert it into the character set - * defined in char_table[] - */ -void dnproc(void) { - short i; - unsigned char saved, dnready; - short brace_lev; - int test_val; /* Marc Csernel */ - char savchr = 0; - char wrong[10]; - brace_lev = 1; - saved = FALSE; - dnready = FALSE; - do { - switch(symbol) { - case '.': - savchr = inp_ch(); - i = 0; - do { i++; } while ((i != 19) && (chset1[i-1] != savchr)); - if (i == 19) { - wrong[0] = '.'; - wrong[1] = savchr; - wrong[2] = '\0'; - err_ill(wrong); - } - else { - if (i < 4) { - savchr = inp_ch(); - if (savchr == 'h') i += 11; - else saved = TRUE; - if (i == 1) err_ill(".k"); - } - } - if (i == 18) put_ch('M'); - else put_ch(i); - break; - -/* --------- Addition by Marc Csernel 1998 --------- */ - - /* cite and chapter command */ - case ']': - if (citation) { - citation = 0; - if (num_mode) put_ch(dummy); - put_syll(); - test_sub_com(); - } - if (optchapter) { - optchapter = 0; - if (num_mode) put_ch(dummy); - put_syll(); - sendchar(symbol); - break; - } - -/* ------------------ End Addition ----------------- */ - - case 'i': - savchr = inp_ch(); - if (savchr == 'i') put_ch('I'); - else { - put_ch(symbol); - saved = TRUE; - } - break; - case 'u': - savchr = inp_ch(); - if (savchr == 'u') put_ch('U'); - else { - put_ch(symbol); - saved = TRUE; - } - break; - case 'a': - savchr = inp_ch(); - i = 0; - do { i++; } while ((i != 4) && (chset2[i-1] != savchr)); - if (i == 4) { - put_ch(symbol); - saved = TRUE; - } - else put_ch(chset5[i-1]); - break; - case '\"': - savchr = inp_ch(); - i = 0; - do { i++; } while ((i != 3) && (chset3[i-1] != savchr)); - if (i == 3) { - wrong[0] = '\"'; - wrong[1] = savchr; - wrong[2] = '\0'; - err_ill(wrong); - } - else put_ch((short)(i+17)); - break; - case '~': - savchr = inp_ch(); - i = 0; - do { i++; } while ((i != 5) && (chset6[i-1] != savchr)); - if (i == 6) { - wrong[0] = '~'; - wrong[1] = savchr; - wrong[2] = '\0'; - err_ill(wrong); - } - else if (i == 5) put_ch(47); - else put_ch((short)(i+20)); - break; - case end_of_line: - put_ch(end_of_line); - break; - case '$': - if (!dollar_mode) put_ch(symbol); - else { - if (no_dn) put_ch(dummy); - else put_ch('}'); - dnready = TRUE; - put_word(); - memmove(inbuf, inbuf+buf_idx, strlen(inbuf+buf_idx)+1); - } - break; - case '}': - brace_lev -= 1; - if ((brace_lev == 0) && (!d_found)) { - if (no_dn) put_ch(dummy); - else put_ch(symbol); - dnready = TRUE; - put_word(); - memmove(inbuf, inbuf+buf_idx, strlen(inbuf+buf_idx)+1); - } - else put_ch(symbol); - break; - case '{': - put_ch(symbol); - brace_lev += 1; - break; - case '%': - put_ch(symbol); - do { - symbol = inp_ch(); - if (symbol != end_of_line) sendchar(symbol); - } - while (symbol != end_of_line); - sendchar('\n'); - break; - case '<': - put_syll(); - do { - symbol = inp_ch(); - if (symbol == end_of_line) symbol = '\n'; - if (symbol != '>') sendchar(symbol); - } - while (symbol != '>'); - break; - case '\\': - put_ch(symbol); - symbol = inp_ch(); - if (symbol == end_of_line) { - put_word(); - strcat(outbuf, "\n"); - fputs(outbuf, f_out); - *outbuf = '\0'; - } - else { - -/* --------- Addition by Marc Csernel 1998 --------- */ - - /* Modified MC May 98 to take \\[5pt] into account */ - if (symbol == '\\') { - sendchar(symbol); - symbol = inp_ch(); - if (symbol == '[') { - while (symbol != ']') { - sendchar(symbol); - symbol = inp_ch(); - } - sendchar(symbol); - symbol = inp_ch(); - } - savchr = symbol; - saved = TRUE; - break; - } - -/* ------------------ End Addition ----------------- */ - - if (!isalpha((unsigned char)symbol)) sendchar(symbol); - else { - nbchcomm = 0; /* Marc Csernel */ - do { - command[nbchcomm++] = symbol; /* Marc Csernel */ - sendchar(symbol); - symbol = inp_ch(); - } - while (isalpha((unsigned char)symbol)); - -/* --------- Addition by Marc Csernel 1998 --------- */ - - command[nbchcomm++] = 0; - test_val = test_command(); - switch (test_val) { - case 1: - savchr = test_sub_com(); - break; - case 2: - savchr = ignore(); - break; - case 3: - savchr = comm_double_args(); - break; - case 4: - savchr = comm_begin(); - break; - case 5: - savchr = comm_special(); - break; - case 6: - savchr = comm_opt(); - break; - case 7: - savchr = comm_cite(); - break; - case 8: - savchr = comm_chapter(); - break; - default: - savchr = symbol; - } - -/* ------------------ End Addition ----------------- */ - - saved = TRUE; - } - } - break; - case ill_char: - err_ill('\0'); - break; - case end_of_file: - fputs("Error: missing }", stderr); - exit(1); - default: - if (symbol < 0) err_ill('\0'); /* accented character inside dn mode */ - i = 0; - do { i++; } while ((i != 10) && (chset4[i-1] != symbol)); - if (i == 10) put_ch(symbol); - else { - savchr = inp_ch(); - if (savchr == 'h') { - if (i == 9) put_ch(20); - else put_ch((short)(symbol-32)); - } - else { - put_ch(symbol); - saved = TRUE; - } - } - } - if (saved) { - symbol = savchr; - saved = FALSE; - } - else { - if (!dnready) symbol = inp_ch(); } - } - while (!dnready); -} - -/* - * Read and parse input in the character set defined by char_table[], - * and convert it into TeX text and macros for the dvng fonts. - */ -void put_ch(short code) { - short cons_idx = 0; - char cstr[2]; - struct char_def *c_ptr; - struct cons_joins *q_ptr; - short i, j; - /* --------- Addition by Kevin Carmody 2005 --------- */ - /* - * Conjunct fixes used by fixconj() - */ - short wrong_1[] = {63, 63, 113}; - short right_1[] = {63, 34, 0}; /* kk.sa */ - short wrong_2[] = {94, 214, 264, 113}; - short right_2[] = {94, 86, 264, 34, 0}; /* .tk.sa */ - short wrong_3[] = {22, 62, 26}; - short right_3[] = {22, 226, 0}; /* ~nj~na */ - short wrong_4[] = {274, 88, 264, 273, 57, 52, 264, 121}; - short right_4[] = {126, 88, 264, 43, 0}; /* .drya */ - short wrong_5[] = {94, 140, 264, 118}; - short right_5[] = {94, 100, 264, 146, 0}; /* ddva */ - short wrong_6[] = {94, 136, 264, 118}; - short right_6[] = {94, 100, 264, 64, 118, 0}; /* ddhva */ - short wrong_7[] = {271, 100, 264, 273, 57, 52, 264, 121}; - short right_7[] = {272, 100, 264, 43, 0}; /* drya */ - short wrong_8[] = {9, 274, 86, 264, 273, 57, 52, 264, 121}; - short right_8[] = {9, 126, 86, 264, 43, 0}; /* .s.trya */ - /* ------------------ End Addition ----------------- */ - - c_ptr = &char_table[code-1]; - switch(c_ptr->ch_typ) { - case dn: - if (cmr_mode) { - cmr_mode = FALSE; - put_sym(RE); - } - else { - if (num_mode) { - num_mode = FALSE; - put_sym(RBRACE); - } - } - switch(c_ptr->ch_subtyp) { - case hi_vowel: - if (wait_syll) { - put_syll(); - if (do_hyphen) strcat(word, "\\-"); - } - if (lig_block) err_ill("+"); /* Kevin Carmody */ - if (cons_seen) { - if (syll[chr_idx-1] < 0) expand(); - if (code == 'i') { - for (i = chr_idx; i>= (cons_idx+1); i--) - syll[i] = syll[i-1]; - syll[cons_idx] = c_ptr->ch_subcode; - } - else { - syll[chr_idx] = c_ptr->ch_subcode; - if ((code != 'A') && (code != 'a')) vow_seen = TRUE; - } - } - else syll[chr_idx] = c_ptr->ch_code; - chr_idx += 1; - wait_syll = TRUE; - cons_seen = FALSE; - break; - case lo_vowel: - if (wait_syll) { - put_syll(); - if (do_hyphen) strcat(word, "\\-"); - } - if (lig_block) err_ill("+"); /* Kevin Carmody */ - if (cons_seen) { - if (syll[chr_idx-1] < 0) expand(); - if ((syll[chr_idx-1] == 'r') && (code == 'u')) - syll[--chr_idx] = 'z'; - else { - if ((syll[chr_idx-1] == 'r') && (code == 'U')) - syll[--chr_idx] = '!'; - else { - if ((syll[chr_idx-1] == 'h') && (code == 7)) - syll[--chr_idx] = 0343; - else { - if ((syll[chr_idx-1] == 'r') && ((code == 7) - || (code == 15) || (code == 16) || (code == 17))) { - syll[--chr_idx] = c_ptr->ch_code; - front_r = TRUE; - } - else { - put_macro(c_ptr->ch_subcode); - chr_idx -= 1; - } - } - } - } - } - else syll[chr_idx] = c_ptr->ch_code; - chr_idx += 1; - wait_syll = TRUE; - cons_seen = FALSE; - break; - case consonant: - if (wait_syll) { - put_syll(); - if (do_hyphen) strcat(word, "\\-"); - } - if (!cons_seen) { - - /* Is this the first consonant? */ - - cons_seen = TRUE; - cons_idx = chr_idx; - cons_code = c_ptr->ch_subcode; - syll[chr_idx] = c_ptr->ch_code; - chr_idx += 1; - tst_half(); - } - else { - q_ptr = &cons_table[cons_code]; - if (syll[cons_idx] == 'r') { - - /* Was there an initial "r"? */ - - front_r = TRUE; - syll[chr_idx-1] = c_ptr->ch_code; - cons_code = c_ptr->ch_subcode; - tst_half(); - } - else { - i = q_ptr->lig_code; - for (j = i+(q_ptr->n_ligs); i != j; i++) - if (lig_table[i].sym_code == code) break; - if ((i != j) && (lig_table[i].in_use) - && (!lig_block)) { /* lig_block added Kevin Carmody */ - - /* Is there a ligature? */ - - syll[chr_idx-1] = lig_table[i].sym_new; - cons_code = lig_table[i].join_idx; - joincode = cons_table[cons_code].j_code; - if (joincode != 0) { - half_codes[0] = joincode; - n_halves = 1; - } - else { - - /* ... or a half-form? */ - - joincode = cons_table[c_ptr->ch_subcode].j_code; - if ((joincode != 0) && (n_halves != 0)) { - half_codes[n_halves] = joincode; - n_halves += 1; - } - else n_halves = 0; - } - } - else { - if ((code == 'r') && (!lig_block)) { - /* lig_block added Kevin Carmody */ - if (q_ptr->r_type != 0) { - - /* "Special" non-initial "r"? */ - - syll[chr_idx] = syll[chr_idx-1]; - syll[chr_idx-1] = (q_ptr->r_type == 1) ? '\176' : 272; - syll[chr_idx+1] = RBRACE; - chr_idx += 2; - } - else { - - /* "Normal" non-initial "r"? */ - - syll[chr_idx] = '\175'; - chr_idx += 1; - n_halves = 0; - } - cons_code = 0; - } - else { - if ((q_ptr->j_code != 0) && (!lig_block)) { - /* lig_block added by Kevin Carmody */ - - /* Can we build a conjunct using a ligature? */ - - syll[chr_idx-1] = q_ptr->j_code; - syll[chr_idx] = c_ptr->ch_code; - cons_code = c_ptr->ch_subcode; - chr_idx += 1; - tst_half(); - } - else { - if (n_halves != 0) { - - /* ... or a half-form? */ - - if (syll[chr_idx-1] != RBRACE) { - /* - * There might already have been a - * subscript "-r" in the conjunct! - * (E.g. khrya, ttrya) - * -- John Smith - */ - for (i = 0; i < n_halves; i++) - syll[chr_idx-1+i] = half_codes[i]; - chr_idx += n_halves; - syll[chr_idx-1] = c_ptr->ch_code; - cons_code = c_ptr->ch_subcode; - tst_half(); - } - else { - for (i = 0; i < n_halves; i++) - syll[chr_idx-2+i] = half_codes[i]; - chr_idx += n_halves; - syll[chr_idx-1] = c_ptr->ch_code; - syll[chr_idx-2] = RBRACE; - cons_code = c_ptr->ch_subcode; - tst_half(); - } - } - else { - - /* Fall back on viraama */ - - if (syll[chr_idx-1] < 0) expand(); - put_macro(VIRAAM); - cons_code = c_ptr->ch_subcode; - syll[chr_idx] = c_ptr->ch_code; - chr_idx += 1; - tst_half(); - } - } - } - /* - * This hack is to secure the correct representation - * for various conjuncts that may assume undesirable - * forms. - */ -/* --------- Modification by Kevin Carmody 2005 --------- */ - fixconj(wrong_1, right_1); - fixconj(wrong_2, right_2); - fixconj(wrong_3, right_3); - fixconj(wrong_4, right_4); - fixconj(wrong_5, right_5); - fixconj(wrong_6, right_6); - fixconj(wrong_7, right_7); - fixconj(wrong_8, right_8); -/* ------------------ End Modification ----------------- */ - /* - * Now replace the sequence consonant + viraama + ya - * by consonant + open ya (glyph became available only - * Devnag 2.1). - */ - for (i = 0; i < chr_idx-3; i++) { - if ((syll[i] == 94) && (syll[i+2] == 264) - && (syll[i+3] == 121)) { - syll[i] = syll[i+1]; - syll[i+1] = 43; - chr_idx = i + 2; - } - } - } - } - } - lig_block = FALSE; /* Kevin Carmody */ - break; - case special: - if (lig_block) err_ill("+"); /* Kevin Carmody */ - if (cons_seen) { if (syll[chr_idx-1] < 0) expand(); } - if ((code == 'M') && (front_r)) { - front_r = FALSE; - if (vow_seen) syll[chr_idx] = 270; - else syll[chr_idx] = RDT; - chr_idx += 1; - put_syll(); - } - else { - if ((code == 'M') && (syll[chr_idx-1] == 'I')) { - syll[chr_idx-1] = 18; - put_syll(); - } - else { - if ((code == 'M') && (vow_seen)) { - syll[chr_idx] = 268; - chr_idx += 1; - put_syll(); - } - -/* --------- Addition by Marc Csernel 1998 --------- */ - - else { - if (code == '_') { - if(!cons_seen) err_ill("_"); - else { - put_macro(VIRAAM); - put_syll(); - } - } - else { - if (code == '&') { - if(!tabs_mode) { - if (!cons_seen) { - fprintf(stderr, "Error: tabs_mode not selected\n"); - err_ill("&"); - } - else { - put_macro(VIRAAM); - put_syll(); - } - } - else { - if(!cons_seen) sendchar((char)code); - else { - put_macro(VIRAAM); - put_syll(); - } - } - } - -/* ------------------ End Addition ----------------- */ - - else { - -/* --------- Addition by Kevin Carmody 2005 --------- */ - - if (code == '+') { /* half letter or viraama */ - if (!cons_seen) err_ill("+"); - lig_block = TRUE; - } -/* ------------------ End Addition ------------------ */ - - else { - if ((!hindi_mode) && (cons_seen)) put_macro(VIRAAM); - put_syll(); - put_sym(c_ptr->ch_code); - } - } - } - } - } - } - } - break; - case illegal: - cstr[0] = code; - cstr[1] = '\0'; - err_ill(cstr); - break; - case control: - if (cmr_mode) { - cmr_mode = FALSE; - put_sym(RE); - } - else { - if (lig_block) err_ill("+"); /* Kevin Carmody */ - if (num_mode) { - num_mode = FALSE; - put_sym(RBRACE); - } - else { - if (cons_seen) { - if (syll[chr_idx-1] < 0) expand(); - } - if ((!hindi_mode) && (cons_seen)) put_macro(VIRAAM); - put_syll(); - } - } - if (code == end_of_line) { - put_word(); - strcat(outbuf, "\n"); - fputs(outbuf, f_out); - *outbuf = '\0'; - } - else if (code != dummy) sendchar((char)code); - break; - case cmr: - if (cmr_mode) sendchar((char)code); - else { - cmr_mode = TRUE; - if (num_mode) { - num_mode = FALSE; - put_sym(RBRACE); - } - else { - if (lig_block) err_ill("+"); /* Kevin Carmody */ - if (cons_seen) { if (syll[chr_idx-1] < 0) expand(); } - if ((!hindi_mode) && (cons_seen)) put_macro(VIRAAM); - put_syll(); - } - put_sym(RS); - sendchar((char)code); - } - break; - case numeral: - if (num_mode) sendchar((char)code); - else { - num_mode = TRUE; - if (cmr_mode) { - cmr_mode = FALSE; - put_sym(RE); - } - else { - if (lig_block) err_ill("+"); /* Kevin Carmody */ - if (cons_seen) { if (syll[chr_idx-1] < 0) expand(); } - if ((!hindi_mode) && (cons_seen)) put_macro(VIRAAM); - put_syll(); - } - put_sym(RN); - sendchar((char)code); - } - } -} - -/* - * Append a character to word[]; if character is whitespace, - * call put_word(). - */ -void sendchar(char c) { - int i = strlen(word); - word[i] = c == end_of_line ? '\n' : c; - word[i+1] = '\0'; - if (isspace((unsigned char)c)) put_word(); -} - -/* - * Use the current chacter value as an index into out_string[], and - * append the code found there to the end of word[]. - */ -void put_sym(short code) { - strcat(word, out_string[code]); -} - -/* - * Append word[] to outbuf[]. - */ -void put_word(void) { - /* - * The hack is to avoid hyphenation before any consonant stopped - * with viraama. -- John Smith - */ - char *w_ptr; - if (do_hyphen) { /* hack */ - do { - w_ptr = strstr(word, "\\-\\qq{"); - if (w_ptr != NULL) memmove(w_ptr, w_ptr+2, strlen(w_ptr+2)+1); - } - while (w_ptr != NULL); - } - strcat(outbuf, word); - *word = '\0'; -} - -/* - * Append syll[] to word[], using the codes defined in out_string[] - */ -void put_syll(void) { - /* - * put_syll() now checks to see whether "old-style" treatment of - * consonant sequences containing viraama has been requested with - * the @vconjuncts preprocessor command. If not, it re-orders the - * characters in any such sequence containing "i" so that the - * i-matra vowel is placed after the viraama rather than before - * the entire sequence. -- John Smith - */ - short i; - int ipos, vpos, bpos; - if (do_vconjuncts == FALSE) { - ipos = sindex(0, '\105'); /* 'i' */ - if (ipos != -1) { - vpos = sindex(ipos, '\136'); /* viraama */ - if (vpos == -1) { - vpos = sindex(ipos, 271); - if (vpos == -1) vpos = sindex(ipos, 274); - if (vpos != -1) { - vpos = sindex(vpos, 273); /* alternative viraama */ - if ((syll[vpos+1] != '9') || (syll[vpos+2] != '4')) vpos = -1; - } - } - if (vpos != -1) { - bpos = sindex(vpos, 264); /* right brace after viraama */ - if (bpos != -1) { - for (i = ipos+1; i <= bpos; i++) - syll[i-1] = syll[i]; - syll[bpos] = '\105'; - } - } - } - } - for (i = 0; i < chr_idx; i++) - strcat(word, out_string[syll[i]]); - if (front_r) { - if (vow_seen) strcat(word, out_string[269]); - else strcat(word, out_string[13]); - front_r = FALSE; - } - chr_idx = 0; - cons_seen = FALSE; - vow_seen = FALSE; - wait_syll = FALSE; - lig_block = FALSE; /* Kevin Carmody */ -} - -/* - * Check whether a "half-form" exists for current consonant, and - * store the result. - */ -void tst_half(void) { - joincode = cons_table[cons_code].j_code; - if (joincode != 0) { - half_codes[0] = joincode; - n_halves = 1; - } - else n_halves = 0; -} - -/* - * Manipulate contents of syll[] to incorporate a macro call, - * using values that are indices into out_string[] (so that - * put_syll() will produce the correct output). - */ -void put_macro(short macro) { - char tmp[5]; - int lt, i; - if (syll[chr_idx-1] == '\175') { - syll[chr_idx+1] = '\175'; - syll[chr_idx] = RBRACE; - syll[chr_idx-1] = syll[chr_idx-2]; - syll[chr_idx-2] = macro; - chr_idx += 2; - } - else { - if (syll[chr_idx-1] == RBRACE) { - /* - * This is a bit of a hack on Velthuis's part! What it - * really means is: if syll[] currently consists of "dr" - * OR a consonant(-group) with the subscript "caret" form - * of "-r" already attached, AND if a subscript vowel - * (or viraama) is to be added to it. In pre-2.0 releases - * of devnag this always produced "\qa{consonant}{vowel}", - * i.e. it used the simple, non-"caret" form of "-r", - * whatever the consonant to which it was to be attached. - * I have fixed this bug (feature?), but at the cost of - * invoking a new macro, \qc, which will have to be - * defined in dnmacs.tex etc. for the new code to work. - * -- John Smith - */ - if (syll[chr_idx-3] == 126) syll[chr_idx-3] = 274; - else syll[chr_idx-3] = 271; - syll[chr_idx] = LBRACE; - sprintf(tmp, "%d", macro); - lt = strlen(tmp); - chr_idx += 1; - for (i = 0; i < lt; i++) - syll[chr_idx+i] = tmp[i]; - chr_idx += lt; - syll[chr_idx] = RBRACE; - chr_idx += 1; - } - else { - syll[chr_idx] = syll[chr_idx-1]; - syll[chr_idx-1] = macro; - syll[chr_idx+1] = RBRACE; - chr_idx += 2; - } - } -} - -/* - * Exit with error message in the case of illegal input. - */ -void err_ill(const char *str) { - fprintf(stderr, "Error: illegal character(s) \"%s\" detected at line %d:\n", - str, linenumber); - fprintf(stderr, inbuf); - exit(1); -} - -/* - * Read and return the next character from inbuf[], taking appropriate - * action in the case of EOL, EOF or an illegal character. - */ -char inp_ch(void) { - char ch, ch_out; - ch = inbuf[buf_idx++]; - if (ch == '\n') { - if (p_in == 0) ch_out = end_of_file; - else { - p_in = fgetline(inbuf, MAXBUF, f_in); - linenumber++; - buf_idx = 0; - ch_out = end_of_line; - } - } - else { - if (ch == '\t') ch_out = ' '; /* Change TABs to spaces */ - else { - if ((unsigned)ch < 32) ch_out = ill_char; /* Allow accented characters */ - else ch_out = ch; - } - } - return(ch_out); -} - -/* - * Invoked if syll[chr_idx-1] is negative (instead of containing - * an octal character value). Fixes appropriate representation - * for "r". - */ -void expand(void) { - short indx; - indx = -1-syll[chr_idx-1]; - if (r_ligs[indx][1] != 0) { - syll[chr_idx] = r_ligs[indx][0]; - syll[chr_idx-1] = (r_ligs[indx][1] == 1) ? '\176' : 272; - syll[chr_idx+1] = RBRACE; - chr_idx += 2; - } - else { - syll[chr_idx-1] = r_ligs[indx][0]; - syll[chr_idx] = '\175'; - chr_idx += 1; - } - cons_code = 0; -} - -/* - * Search inbuf[] for "{\dn" followed by non-letter or, in dollar - * mode only, for "$". Return TRUE or FALSE as appropriate. If - * TRUE, send inbuf[] text prior to mode-switch to outbuf[], followed - * by mode-switch indicator, and make inbuf[] start at beginning of - * Devanagari text. - */ -char find_dn(void) { - char *d_ptr; - char *dn_ptr; - char *svbuf; - int again; - d_found = FALSE; - svbuf = inbuf; - do { - again = FALSE; - dn_ptr = strstr(svbuf, "{\\dn"); - if (dn_ptr != NULL) { - again = isalpha((unsigned char)dn_ptr[4]); - svbuf = dn_ptr+4; - } - } - while (again); - if (dollar_mode) { - d_ptr = strchr(inbuf, '$'); - if ((d_ptr != NULL) && ((dn_ptr == NULL) || (d_ptr < dn_ptr))) { - d_found = TRUE; - dn_ptr = d_ptr; - } - } - if (dn_ptr == NULL) return(FALSE); - strncat(outbuf, inbuf, dn_ptr-inbuf); - no_dn = FALSE; - if (!d_found) { - if (dn_ptr[4] == '#') { /* equivalent to @dolmode3 */ - no_dn = TRUE; - dn_ptr += 1; - } - else strcat(outbuf, "{\\dn"); - dn_ptr += 4; - } - else { - switch(dollar_mode) { - case 1: - strcat(outbuf, "{\\dn "); - break; - case 2: - strcat(outbuf, "\\pdn "); - case 3: - no_dn = TRUE; - } - dn_ptr += 1; - } - memmove(inbuf, dn_ptr, strlen(dn_ptr)+1); - return(TRUE); -} - -/* - * Return index of character value in syll[] starting at syll[i], - * -1 if none - */ -int sindex(int i, short t) { - int j; - for (j = i; j < chr_idx; j++) { - if (syll[j] == t) return j; - } - return -1; -} - -/* - * Replace infelicitous conjuncts - */ -void fixconj(short *wrong, short *right) { - int i; - for (i = 0; i < chr_idx; i++) { - if (syll[i] != wrong[i]) return; - } - for (i = 0; right[i] != 0; i++) { - syll[i] = right[i]; - } - chr_idx = i; -} - -/* - * Read a line with either line ending (UNIX = LF, DOS = CR LF, Mac = CR) - * return the pointer to the buffer of NULL at end of file or I/O Error - * (replacement of fgets, requires global variables) - */ -char *fgetline(char *buf, int n, FILE *f) { - int k; - buf[0] = '\0'; - for (k = 0; k < n-1 && (k == 0 || buf[k-1] != '\n'); ) { - if (charpresent) charpresent = FALSE; - else charbuf = fgetc(f); - if (wasCR) { - wasCR = FALSE; - buf[k++] = '\n'; - if (charbuf != '\n') charpresent = TRUE; - } else { - if (charbuf == EOF) { - if (k) { - charpresent = TRUE; break; - } - else return NULL; - } - if (charbuf == '\r') wasCR = TRUE; - else buf[k++] = charbuf; - } - } - buf[k] = '\0'; - return buf; -} |