Subversion Repositories wimsdev

Rev

Rev 5537 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5522 bpr 1
/*    Copyright (C) 2012 WIMSDEV
2
 *    This file is part of the WIMS package.
3
 *
4
 *  This program is free software; you can redistribute it and/or modify
5
 *  it under the terms of the GNU General Public License as published by
6
 *  the Free Software Foundation; either version 2 of the License, or
7
 *  (at your option) any later version.
8
 *
9
 *  This program is distributed in the hope that it will be useful,
10
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 *  GNU General Public License for more details.
13
 *
14
 *  You should have received a copy of the GNU General Public License
15
 *  along with this program; if not, write to the Free Software
16
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
 */
18
 
19
int mathml(char *p, int option ){
20
          if (strlen(p)==0) return 1 ;
21
    if( mathalign_base <= 1){
22
      internal_error(" why is wims trying mathml()?\n");
23
      return 0; // got to insmath with gifs
24
    }
25
    if(strlen(p) > MAX_LINELEN ){ // too big ? probably too big for gifs as well ; but error signalling is better in gif-methods
26
      mathalign_base = 1;// 0 or 1 position of tex_gifs
27
      return 0; // got to insmath with gifs
28
    }
29
    //singlespace(p); // needed for check unbalanced \left\right in wims_mathml.cc --> insmath.c
30
    singlespace(p);
31
    int my_pipe[2];
32
    pid_t pid;
33
    if(pipe(my_pipe)){// pipe could not be opened...
34
      internal_error("mathml(): pipe() failure.\n");
35
      mathalign_base = 1;
36
      return 0; // got to insmath with gifs
37
    }
38
    else
39
    {
40
      pid = fork();
41
      if (pid == (pid_t) 0){
42
          // this buffer should probably be set to 0.5 * MAX_LINELEN : mathml is very big !
43
          // if output mathml string larger ;ERROR will be signaled by wims_matml.
44
          char mml_buffer[MAX_LINELEN+1];
45
          sprintf(mml_buffer, "%d", MAX_LINELEN);// int --> char
46
          // setting --tex-size argument to wims_mathml.cc
47
          char mathml_tex_size[64];//this should be a string like "250%" 
48
          int texsize_list[]={5,10,20,50,75,100,120,130,150,180,220,300};
49
          // analogue to  mathfonts.c but now we talk %  and we could make any amount of changes
50
          // not limited by font-size !! 
51
          int idx = 6;
52
          int use_js_zoom = 0; // default js-zoom in mathml if disabled
53
          // enable via adm/light
54
          // next code is stolen from wims.c 
55
          if(getvar("useropts") != NULL || getvar("wims_useropts") != NULL){
56
            char *u;
57
            u = getvar("useropts"); // set via adm/light or via cookie?
58
            if(u == NULL || *u == 0){ u=getvar("wims_useropts");} // wims_user? look into def file
59
            if(u != NULL && *u != 0){
60
                if(myisdigit(u[0])){ //2 digit code : 12,22,32,...,92  [tex_size mathalignbase] 
61
                  idx = u[0] - '0';
62
                  if(idx < 0 || idx > 11){ idx = 6; } // the default value 120%
63
                }
64
                if(myisdigit(u[2]) && u[2]!=0){ // suppose we add 0 or 1 to useropts for using js-zoom on mathml?
65
                // 3 digitcode:  621 == fontsize idx=6 & use mathml & use zoom
66
                  use_js_zoom = u[2] - '0';
67
                  if(use_js_zoom > 1 || use_js_zoom < 0){
68
                      use_js_zoom = 0; //disable js-zooming of mathml
69
                  }
70
                }
71
            }
72
          }
73
          else
74
          { // we take the default setting from adm/management config
75
            idx = atoi(getvar("wims_texbasesize")) ;
76
            if(idx < 0 || idx > 11){ idx = 6; } // the default value 120%
77
          }
78
          // now write the "char" 200% into variable "mathml_tex_size"
79
          snprintf(mathml_tex_size,sizeof(mathml_tex_size),"%d%%",texsize_list[idx]);
80
          // int --> char : added % sign (needed for mathml) [%% = escaped %]
81
          if(mathml_tex_size == NULL || strlen(mathml_tex_size) == 0 ){ // this should not happen
82
            sprintf(mathml_tex_size,"%s","120%");
83
            // if it goes wrong we set 120% 
84
            // default in itex2MML was 110% : but we thought it was too small... ?
85
          }
86
          char zoom[2];
87
          snprintf(zoom, 2 ,"%d",use_js_zoom);// int --> char : "0" or "1"
88
          char *argv[]={"wims_mathml","--use-zoom",zoom,"--tex-size",mathml_tex_size,"--max-mml-size",mml_buffer,"--tex-string",p,NULL};
89
          /* This is the child process. Close other end first. */
90
          close(my_pipe[0]);
91
          dup2(my_pipe[1], 1);  // send stdout to the pipe
92
          dup2(my_pipe[1], 2);  // send stderr to the pipe
93
          close(my_pipe[1]);
94
          execv("../bin/wims_mathml",argv);
95
          internal_error("could not execute wims_mathml\n");
96
          mathalign_base = 1;
97
          return 0; // got to insmath with gifs
98
      }
99
      else
100
      {
101
          if (pid < (pid_t) 0){
102
            close(my_pipe[0]);  // close the read end of the pipe in the parent
103
            close(my_pipe[1]);  // close the write end of the pipe in the parent
104
            internal_error("mathml(): fork() failure.\n");
105
            mathalign_base = 1;
106
            return 0; // got to insmath with gifs
107
          }
108
          else
109
          {
110
            FILE *stream;
111
            close(my_pipe[1]);  // close the write end of the pipe in the parent
112
            stream = fdopen (my_pipe[0], "r");
113
            char buffer[MAX_LINELEN+1];
114
            // make buffer filled with 'zero/null'
115
            memset(buffer,'\0',MAX_LINELEN);//bzero(buffer,maxsize);
116
            /* read output from program line by line*/
117
            if (option == 1) {
118
                *p=0;
119
                while ( fgets(buffer, MAX_LINELEN, stream) != NULL ){
120
                  if(strcmp(buffer,"ERROR") != 0){
121
                   mystrncpy(p, buffer, MAX_LINELEN-1);
122
                  }
123
                }
124
            }
125
            else
126
            {
127
                    while ( fgets(buffer, MAX_LINELEN, stream) != NULL ){
128
                  if(strcmp(buffer,"ERROR") != 0){
129
                          output("%s", buffer);
130
                  }
131
                    }
132
            }
133
            fclose (stream);
134
            close(my_pipe[0]);
135
            int status;
136
            waitpid(pid, &status, 0);
137
          }
138
       }
139
    }
140
    return 1;
141
}