104{
105 char* singular =
NULL;
107#ifndef TSINGULAR
108 char* emacs_dir =
NULL;
109 char* emacs_load =
NULL;
111#endif
112 int no_emacs_call = 0;
113
114
115
120
121 int optc, option_index;
122
125 != EOF)
126 {
127 switch(optc)
128 {
129 case 'h':
131
133 exit(0);
134 break;
135 case '?':
136 case ':':
137 case '\0':
139 exit(1);
140
142 {
143 switch(option_index)
144 {
145#ifdef TSINGULAR
146 case FE_OPT_XTERM:
148 break;
149#else
150 case FE_OPT_EMACS:
152 break;
153
154 case FE_OPT_EMACS_DIR:
156 break;
157
158 case FE_OPT_EMACS_LOAD:
160 break;
161#endif
162 case FE_OPT_SINGULAR:
164 break;
165
166 case FE_OPT_NO_CALL:
167 no_emacs_call = 1;
168 break;
169
170 case FE_OPT_DUMP_VERSIONTUPLE:
172 exit(0);
173 break;
174
175 default:
177 }
178
181 {
183 }
185 }
186 }
188 }
189
191 char* syscall;
192 for (
i=1;
i<argc;
i++)
193 {
195 }
196
197#ifdef TSINGULAR
200 {
201 #ifdef __CYGWIN__
202 error(
"Error: Can't find rxvt program. \n Expected it at %s\n Specify alternative with --rxvt=PROGRAM option,\n or set RXVT environment variable to the name of the program to use as rxvt.\n",
203 #else
204 error(
"Error: Can't find xterm program. \n Expected it at %s\n Specify alternative with --xterm=PROGRAM option,\n or set XTERM environment variable to the name of the program to use as xterm.\n",
205 #endif
208 exit(1);
209 }
210
212 if (singular ==
NULL)
213 {
214 error(
"Error: Can't find singular executable.\n Expected it at %s\n Specify with --singular option,\n or set TSINGULAR_SINGULAR environment variable.\n",
217 exit(1);
218 }
219
220#ifdef __CYGWIN__
221#define EXTRA_XTERM_ARGS "+vb -sl 2000 -fb Courier-bold-12 -tn xterm -cr Red3"
222#else
223#define EXTRA_XTERM_ARGS ""
224#endif
225
226 size_t len=strlen(emacs) + strlen(singular) +
length + 300;
227 syscall = (
char*)
omAlloc(len);
228 snprintf(syscall,len, "%s %s -e %s ", emacs, EXTRA_XTERM_ARGS, singular);
229
230 for (
i=1;
i<argc;
i++)
231 {
233 {
234 strcat(syscall, " ");
235 strcat(syscall, argv[
i]);
236 }
237 }
238#else
239
243 {
244 error(
"Error: Can't find emacs or xemacs executable. \n Expected it at %s or %s\n Specify alternative with --emacs option,\n or set ESINGULAR_EMACS environment variable.\n",
247 exit(1);
248 }
249
251 if (singular ==
NULL)
252 {
253 error(
"Error: Can't find singular executable.\n Expected it at %s\n Specify with --singular option,\n or set ESINGULAR_SINGULAR environment variable.\n",
256 exit(1);
257 }
258
260 if (emacs_dir ==
NULL)
261 {
262 error(
"Error: Can't find emacs directory for Singular lisp files. \n Expected it at %s\n Specify with --emacs-dir option,\n or set ESINGULAR_EMACS_DIR environment variable.\n",
265 exit(1);
266 }
267
268 if (emacs_load ==
NULL)
269 {
270
271 emacs_load =
getenv(
"ESINGULAR_EMACS_LOAD");
272 if (access(emacs_load, R_OK))
273 {
274
275 emacs_load =
getenv(
"HOME");
276#ifdef __CYGWIN__
277 if ((emacs_load==
NULL)||(!access(emacs_load,X_OK)))
278 emacs_load =
getenv(
"SINGHOME");
279#endif
280 snprintf(cwd,
MAXPATHLEN,
"%s/.emacs-singular", emacs_load);
281 if (! access(cwd, R_OK))
282 {
284 }
285 else
286 {
287
289 if (emacs_load ==
NULL)
290 {
291 error(
"Error: Can't find emacs load file for Singular mode. \n Expected it at %s\n Specify with --emacs-load option,\n or set ESINGULAR_EMACS_LOAD environment variable,\n or put file '.emacs-singular' in your home directory.\n",
294 exit(1);
295 }
296 }
297 }
298 }
299
300 size_t len=strlen(emacs) + strlen(singular) + strlen(emacs_dir) + strlen(emacs_load) +
length +300;
301 syscall = (
char*)
omAlloc(len);
302 const char* prefix = "--";
303 if (strstr(emacs, "xemacs") || strstr(emacs, "Xemacs") || strstr(emacs, "XEMACS"))
304 prefix = "-";
306
307 if (cwd[strlen(cwd)-1] != '/') strcat(cwd, "/");
308
309
310
311 snprintf(syscall,len, "%s %sno-init-file %seval '(progn (setq singular-emacs-home-directory \"%s\") (load-file \"%s\") (singular-other \"%s\" \"%s\" (list ",
312 emacs, prefix, prefix, emacs_dir, emacs_load,
313 singular, cwd);
314
315
316 for (
i=1;
i<argc;
i++)
317 {
319 {
320 strcat(syscall, "\"");
321 strcat(syscall, argv[
i]);
322 strcat(syscall, "\" ");
323 }
324 }
325 strcat(syscall, ") \"singular\"))'");
326#endif
327
328 if (no_emacs_call)
329 {
330 printf("%s\n", syscall);
331 }
332 else
333 {
334 if (system(syscall) != 0)
335 {
336 error(
"Error: Execution of\n%s\n", syscall);
338 exit(1);
339 }
340 }
341}
char * feResourceDefault(const char id)
#define LONG_OPTION_RETURN
const char SHORT_OPTS_STRING[]
void feOptDumpVersionTuple(void)
void feOptHelp(const char *name)
EXTERN_VAR struct fe_option feOptSpec[]
static char * feResource(feResourceConfig config, int warn)
void feInitResources(const char *argv0)
int fe_getopt_long(int argc, char *const *argv, const char *options, const struct fe_option *long_options, int *opt_index)
static BOOLEAN length(leftv result, leftv arg)
int name
New type name for int.