Rev 8177 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
10 | reyssat | 1 | /* Copyright (C) 2002-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis |
2 | * |
||
3 | * This program is free software; you can redistribute it and/or modify |
||
4 | * it under the terms of the GNU General Public License as published by |
||
5 | * the Free Software Foundation; either version 2 of the License, or |
||
6 | * (at your option) any later version. |
||
7 | * |
||
8 | * This program is distributed in the hope that it will be useful, |
||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
11 | * GNU General Public License for more details. |
||
12 | * |
||
13 | * You should have received a copy of the GNU General Public License |
||
14 | * along with this program; if not, write to the Free Software |
||
15 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
||
16 | */ |
||
17 | |||
18 | /* tex 2 gif translator */ |
||
19 | |||
20 | #include "texgif.h" |
||
8103 | bpr | 21 | |
10 | reyssat | 22 | char *progname; |
23 | char *tmpdir="/tmp"; |
||
24 | char *fontdir="/tmp"; |
||
25 | char *headerfile=""; |
||
26 | char *texstyle=""; |
||
27 | char *outfile="/tmp/texgif.gif"; |
||
28 | char cwd[1024]; |
||
29 | double blacker=0.4; |
||
30 | int basedensity=100, density; |
||
31 | int compressratio=1; |
||
32 | int wrapexec=0; |
||
33 | int currentcolor; |
||
34 | |||
35 | FONT wfont[FONT_NUMBER_LIMIT]; |
||
36 | int fontcnt; |
||
37 | |||
38 | enum {tt_plain, tt_latex}; |
||
39 | int textype=tt_plain; |
||
40 | char *texname="tex"; |
||
41 | |||
42 | void checktextype(char *p) |
||
43 | { |
||
44 | if(strstr(p,"\\begin{")!=NULL || |
||
45 | strstr(p,"\\end{")!=NULL || |
||
46 | strstr(p,"\\underset")!=NULL || |
||
242 | bpr | 47 | strstr(p,"\\overset")!=NULL || |
3527 | bpr | 48 | strstr(p,"\\displaystyle")!=NULL || |
3523 | bpr | 49 | strstr(p,"\\mathcal")!=NULL) { |
10 | reyssat | 50 | textype=tt_latex; texname="latex"; |
51 | } |
||
52 | } |
||
53 | |||
54 | /* pass thru tex */ |
||
55 | void tex(void) |
||
56 | { |
||
57 | char *src; |
||
58 | char *hd; |
||
59 | char fbuf[1024], nbuf[2048]; |
||
60 | char *parmbuf[8]; |
||
61 | FILE *f; |
||
62 | long int l; |
||
63 | src=getenv("texgif_src"); |
||
8195 | bpr | 64 | if(src==NULL || *src==0) texgif_error("No source."); |
10 | reyssat | 65 | checktextype(src); |
66 | snprintf(fbuf,sizeof(fbuf),"%s/texgif.tex",tmpdir); |
||
67 | if(*headerfile) { |
||
3414 | bpr | 68 | if (strstr(headerfile,".latex")!=NULL) {textype=tt_latex; texname="latex";} |
69 | if(strstr(headerfile,".tex")==NULL && strstr(headerfile,".latex")==NULL) |
||
10 | reyssat | 70 | snprintf(nbuf,sizeof(nbuf),"%s.%s",headerfile,texname); |
71 | else |
||
72 | snprintf(nbuf,sizeof(nbuf),"%s",headerfile); |
||
73 | f=fopen(nbuf,"r"); |
||
74 | if(f!=NULL) { |
||
75 | fseek(f,0,SEEK_END); l=ftell(f); fseek(f,0,SEEK_SET); |
||
76 | if(l>0 && l<FILE_LENGTH_LIMIT) { |
||
3835 | kbelabas | 77 | hd=xmalloc(l+16); (void)fread(hd,1,l,f); |
10 | reyssat | 78 | } |
79 | else {l=0; hd="";} |
||
80 | fclose(f); f=fopen(fbuf,"w"); |
||
81 | fwrite(hd,1,l,f); free(hd); |
||
82 | } |
||
83 | else f=fopen(fbuf,"w"); |
||
84 | } |
||
85 | else f=fopen(fbuf,"w"); |
||
86 | if(textype==tt_plain) { |
||
87 | fprintf(f,"%s %s %s\n\\end\n",texstyle, src, texstyle); fclose(f); |
||
88 | } |
||
89 | else { |
||
90 | fprintf(f,"{\\newpage\\clearpage\n\ |
||
91 | %s %s %s\n\ |
||
92 | \\clearpage}\n\ |
||
93 | \\end{document}\n",texstyle, src, texstyle); fclose(f); |
||
94 | } |
||
8195 | bpr | 95 | if (chdir(tmpdir)) texgif_error("chdir failure"); |
10 | reyssat | 96 | parmbuf[0]=texname; parmbuf[1]="texgif"; parmbuf[2]=NULL; |
97 | wrapexec=1; |
||
98 | execredirected(texname,NULL,NULL,NULL,parmbuf); |
||
8195 | bpr | 99 | if (cwd[0] && chdir(cwd)) texgif_error("chdir failure"); |
10 | reyssat | 100 | } |
101 | |||
102 | void parms(void) |
||
103 | { |
||
104 | char *p; |
||
105 | int t; |
||
106 | p=getenv("tmp_dir"); if(p!=NULL && *p!=0) tmpdir=p; |
||
107 | p=getenv("texgif_tmpdir"); if(p!=NULL && *p!=0) tmpdir=p; |
||
108 | p=getenv("texgif_fontdir"); if(p!=NULL && *p!=0) fontdir=p; |
||
109 | p=getenv("texgif_outfile"); if(p!=NULL && *p!=0) outfile=p; |
||
110 | p=getenv("texgif_texheader"); if(p!=NULL && *p!=0) headerfile=p; |
||
111 | p=getenv("texgif_style"); if(p!=NULL && *p!=0) texstyle=p; |
||
112 | p=getenv("texgif_density"); if(p!=NULL && *p!=0) { |
||
113 | t=atoi(p); if(t>10 && t<1000) basedensity=t; |
||
114 | } |
||
115 | p=getenv("texgif_compressratio"); if(p!=NULL && *p!=0) { |
||
116 | t=atoi(p); if(t>1 && t<=5) compressratio=t; |
||
117 | } |
||
118 | if(getcwd(cwd,sizeof(cwd))==NULL) cwd[0]=0; |
||
119 | } |
||
120 | |||
121 | int main(int argc, char *argv[]) |
||
122 | { |
||
123 | progname=argv[0]; |
||
124 | parms(); |
||
125 | fontcnt=0; |
||
126 | tex(); |
||
127 | setreuid(geteuid(),geteuid());setregid(getegid(),getegid()); |
||
128 | dvi(); |
||
129 | return 0; |
||
130 | } |
||
131 |