earlybrowserreborn - Blame information for rev 4

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 roytam 1 /*
2  * Copyright 1990-93 Pei-Yuan Wei.      All rights reserved.
3  *
4  * Permission to use, copy, and/or distribute for any purpose and
5  * without fee is hereby granted, provided that both the above copyright
6  * notice and this permission notice appear in all copies and derived works.
7  * Fees for distribution or use of this software or derived works may only
8  * be charged with express written permission of the copyright holder.
9  * This software is provided ``as is'' without express or implied warranty.
10  */
11 /*
12  * viola.c
13  *
14  * Scott: reorganized the former viola main.c to smaller modules and
15  *        put them here.
16  */
17 /* Some extraneous includes, no doubt */
18 #include <stdio.h>
19 #include <unistd.h>
20 #include <fcntl.h>
21 #include "utils.h"
22 #include <math.h>
23 #include "mystrings.h"
24 #include "hash.h"
25 #include "ident.h"
26 #include "obj.h"
27 #include "glib.h"
28 #include "packet.h"
29 #include "membership.h"
30 #include "class.h"
31 #include "classlist.h"
32 #include "loader.h"
33 #include "ast.h"
34 #include "cgen.h"
35 #include "attr.h"
36 #include "cexec.h"
37 #include "slotaccess.h"
38 #include "misc.h"
39 #include "file.h"
40 #include "event_x.h"
41  
42 #define DFLT_USR_WWW_HOME "WWW" /* patched */
43  
44 char *viola_version = "Viola=3.0 Alpha";
45 /*= <geom>              .\n\n\*/
46 char *viola_usage = {"Usage:\n\
47 -geometry <geom>        geometry\n\
48 -display <display>      display\n\n\
49 -cli                    command line interface.\n\
50 -c                      .\n\n\
51 -laf <mode>             (unsup  ported) look and feel mode (0 for expensive drawing).\n\n\
52 -obj <object name>      startup object (send \"render\" to it).\n\
53 -o <object name>        .\n\
54 -path <file path>       object file lookup path.\n\
55 -p <file path>          .\n\n\
56 -release                print release info.\n\
57 -r                      .\n\n\
58 -snipet <statement>     script snipet to interpret.\n\
59 -s <statement>          .\n\n\
60 -verbose                verbose mode.\n\
61 -v                      .\n\n\
62 -V                      version.\n\n\
63 (for debugging)\n\
64 -pa                     print AST.\n\
65 -pc                     print PCode.\n\
66 -pe                     print PCode execution trace.\n\
67 -wt                     window tracking.\n\
68 -at                     user action tracking.\n\
69 -z                      sync events.\n\
70 \n\
71 "};
72  
73 /*
74 (not yet...)\n\
75 For more help on these arguments, do\n\
76         viola -o www -arg0 show -arg1 'xcf.berkeley.edu/ht/violaOptionsHelp'\n\
77 viola -o foo,erwhrwehwe,erewr,wrerwe,wre
78  
79 viola -o hmml -0Sshow -1I234 -2CHello
80  
81 -0 <mesg>               arg[0] to -o object.\n
82 -1 <mesg>               arg[1] \n
83 -2 <mesg>               arg[2] \n
84 -3 <mesg>               arg[3] \n
85 -4 <mesg>               arg[4] \n
86 -5 <mesg>               arg[5] \n
87 -6 <mesg>               arg[6] \n
88 -7 <mesg>               arg[7] \n
89 -8 <mesg>               arg[8] \n\n
90 -arg0 <message>         arg[0] to send to object specified by -o.\n\
91 -arg1 <message>         arg[1] to send to object specified by -o.\n\
92 -arg2 <message>         arg[2] to send to object specified by -o.\n\
93 ...\n\
94 -argN <message>         arg[N] to send to object specified by -o.\n\
95 -argType <type>         arg[n] type modifiers:\n\
96  
97 */
98  
99 #ifndef DEFAULT_VIOLA_PATH
100 #define DEFAULT_VIOLA_PATH "/usr/lib/apps"
101 #endif
102  
103 /* intefers with normal events, used only for http progress reports */
104 int perishableActiveHelp = 0;
105  
106 Window topWindow;   /* Sub-Window that Viola is supposed to run in. */
107 int runInSubWindow = 0;   /* Set to 1 when Viola is run in library mode. */
108  
109 void parseCommandLine();
110  
111 /* Scott */
112 /*
113  * Intended to be called by programs that use Viola as a library.
114  *
115  * The calling program must supply a script file name, an open Display,
116  * the proper Screen pointer, and a window in which Viola is to run.
117  *
118  * The calling program must thereafter call violaProcessEvent() whenever
119  * there is an event in Viola's window and must periodically call
120  * violaIdleEvent() when there are no events to process and nothing
121  * better to do otherwise.
122  */
123 char *initViola(argc, argv, vObjFile, display, screen, parentWindow)
124         int argc;
125         char *argv[];
126         char *vObjFile;
127         Display *display;
128         Screen *screen;
129         Window parentWindow;
130 {
131         extern char **environ;
132         Packet *result;
133         HashEntry *entry;
134         int i = 0;
135         int startWithCommandLineInterpreter = 0;
136         char *defaultViolaPath = DEFAULT_VIOLA_PATH;
137         char *violaPath;
138         char *scriptSnipet = NULL;
139         char *startObj[32];
140         int startObjCount = 0;
141         char topVObjName[256];
142         VObj *obj;
143         void scanTopObjName();
144         extern char *sgmlPath;
145  
146         /* Scott */
147         if (parentWindow) {
148                 runInSubWindow = 1;
149                 topWindow = parentWindow;
150         }
151  
152         if (vObjFile)
153                 startObj[startObjCount++] = vObjFile;
154  
155         if (violaPath = getEnvironVars(environ, "VIOLA_PATH", buff))
156         violaPath = saveString(violaPath);
157  
158         if (sgmlPath = getEnvironVars(environ, "VIOLA_SGML", buff))
159         sgmlPath = saveString(sgmlPath);
160  
161         parseCommandLine(argc, argv,
162                          startObj,
163                          &startObjCount,
164                          &violaPath,
165                          &startWithCommandLineInterpreter,
166                          &scriptSnipet);
167  
168         /* initUserWWW(DFLT_USR_WWW_HOME); */ /*PATCHED*/
169  
170         if (!init_sys()) exit(2);
171         if (!init_ident()) exit(4);
172         if (!init_class()) exit(5);
173         if (!init_obj()) exit(6);
174         if (!init_scanutils()) exit(7);
175         if (!init_ast()) exit(8);
176         if (!init_packet()) exit(9);
177         if (!init_glib(display, screen)) exit(10);
178         if (!init_tfed()) exit(1);
179         if (!init_event()) exit(11);
180         if (!init_cexec()) exit(12);
181         if (!init_html()) exit(13);
182         if (!SGMLInit()) exit(14);
183  
184         if (violaPath) {
185                 if (init_loader(violaPath)) {
186                         if (verbose)
187                         fprintf(stderr, "Using VIOLA_PATH=``%s''\n",
188                                 violaPath);
189                 }
190         } else if (init_loader(defaultViolaPath)) {
191         if (verbose)
192                 fprintf(stderr, "Using default violaPath=``%s''\n",
193                         defaultViolaPath);
194         } else {
195                 fprintf(stderr,
196                         "Can't find application files. Check VIOLA_PATH.\n");
197                 exit(20);
198         }
199  
200 /*      if (!setHTMLStyle()) exit(14);*/
201  
202         load_object("res.font.v", NULL);
203         entry = objID2Obj->get(objID2Obj, storeIdent("res.font"));
204         if (!entry) {
205                 fprintf(stderr,
206                         "can't find: font resource file (\"res.font.v\").\n");
207         exit(21);
208         }
209         if (verbose)
210                 fprintf(stderr,
211                         "loaded: font resource file (\"res.font.v\").\n");
212  
213         VFontResourceObj = (VObj*)entry->val;
214  
215         if (!init_fonts()) {
216                 fprintf(stderr, "aborting due to font related problem.\n");
217                 exit(23);
218         }
219  
220         if (verbose) fprintf(stderr, "initialized font resources.\n");
221  
222         /* always instantiate object "res" */
223  
224         load_object("res.v", NULL);
225         entry = objID2Obj->get(objID2Obj, storeIdent("res"));
226         if (!entry) {
227                 fprintf(stderr,
228                         "can't find: resource file (\"res.v\").\n");
229                 exit(24);
230         }
231         if (!(entry->val)) {
232                 fprintf(stderr,
233                         "can't find: resource file (\"res.v\").\n");
234                 exit(25);
235         }
236         obj = (VObj*)entry->val;
237         if (obj) {
238                 VPrevObj = VTargetObj = VResourceObj = VCurrentObj
239                 = obj;
240                 /*                      sendMessage1(obj, "init");*/
241         } else {
242                 fprintf(stderr, "Failed to instantiate res! Bye.\n");
243                 exit(99);
244         }
245  
246         for (i = 0; i < startObjCount; i++) {
247                 char objFileName[100];
248  
249                 sprintf(objFileName, "%s.v", startObj[i]);
250                 load_object(objFileName, NULL);
251                 entry = objID2Obj->get(objID2Obj, storeIdent(startObj[i]));
252                 if (!entry) {
253                         fprintf(stderr,
254                                 "can't find: start up file (\"%s\").\n",
255                                 objFileName);
256                         exit(22);
257                 }
258                 obj = (VObj*)entry->val;
259                 if (obj) {
260                         VPrevObj = VTargetObj = VCurrentObj = obj;
261                         /*sendMessage1(obj, "init");*/
262                         sendMessage1(obj, "render");
263                 } else {
264                         fprintf(stderr, "No start up object! Bye.\n");
265                         exit(27);
266                 }
267         }
268  
269         result = borrowPacket();
270  
271         if (startWithCommandLineInterpreter)
272         meth_generic_cli(VCurrentObj, result, 0, 0);
273  
274         sendMessage1N1int(VCurrentObj, "visible", 1);
275 /*      sendMessage1(VCurrentObj, "render");*/
276  
277         if (scriptSnipet) {
278                 execScript(VCurrentObj, result, scriptSnipet);
279         }
280  
281         if (verbose) fprintf(stderr, "entering event loop.\n");
282  
283         /* Scott: don't enter viola's eventLoop if motif's running */
284         if (!runInSubWindow) eventLoop();
285  
286         returnPacket();
287  
288         if (user_action_tracking)
289         if (user_action_tracking != stderr)
290                 close(user_action_tracking);
291  
292         if (!runInSubWindow) exit(0);
293  
294         /* Scott */
295         if (vObjFile) {
296                 char *name;
297  
298                 scanTopObjName(vObjFile, topVObjName);
299                 name = malloc(strlen(topVObjName)+1);
300                 strcpy(name, topVObjName);
301                 return(name);
302         } else {
303                 return(NULL);
304         }
305         XtToolkitInitialize();  /* just to make sure Xt is linked??*/
306 }
307  
308 void freeViolaResources()
309 {
310         tfed_FreeTmpFileToFree(0);
311         free_fonts();
312         freeAllObjects();
313         freeGLibResources();
314 }
315  
316 /* Scott: moved this code from the former main.c into this file
317  */
318 void parseCommandLine(argc, argv,
319                           startObj,
320                           startObjCount,
321                           violaPath,
322                           startWithCommandLineInterpreter,
323                           scriptSnipet)
324         int argc;
325         char *argv[];
326         char *startObj[];
327         int *startObjCount;
328         char **violaPath;
329         int *startWithCommandLineInterpreter;
330         char **scriptSnipet;
331 {
332         int i=0;
333  
334         if (argc)
335         while (argv[++i]) {
336                 /*fprintf(stderr, "arg[%d]=%s\n", i, argv[i]);*/
337  
338                 if (noCaseStrCmp(argv[i], "-ar")) {
339  
340                         passthru_argument = argv[++i];
341  
342                 } else if (noCaseStrCmp(argv[i], "-cli") ||
343                         noCaseStrCmp(argv[i], "-c")) {
344  
345                         if (!runInSubWindow)
346                                 *startWithCommandLineInterpreter = 1;
347  
348                 } else if (noCaseStrCmp(argv[i], "-cmd_history")) {
349  
350                         cmd_history = 1;
351  
352                 } else if (noCaseStrCmp(argv[i], "-mono")) {
353                         extern int noShading;
354                         noShading = 1;
355  
356                 } else if (noCaseStrCmp(argv[i], "-geometry") ||
357                            noCaseStrCmp(argv[i], "=")) {
358  
359                 /* Scott */
360                 if (!runInSubWindow)
361                         XParseGeometry(argv[++i],
362                                    &startUpGeom_x, &startUpGeom_y,
363                                    &startUpGeom_width, &startUpGeom_height);
364  
365                 } else if (noCaseStrCmp(argv[i], "-display")) {
366  
367                         startUpDisplay = argv[++i];
368  
369                 } else if (noCaseStrCmp(argv[i], "-nocliprompt")) {
370                         extern int flag_cliprompt;
371  
372                         if (!runInSubWindow)    /* Scott */
373                                 flag_cliprompt = 0;
374  
375                 } else if (noCaseStrCmp(argv[i], "-obj") ||
376                            noCaseStrCmp(argv[i], "-o")) {
377  
378                         startObj[*startObjCount] = argv[++i];
379                         *startObjCount += 1;
380  
381                 } else if (noCaseStrCmp(argv[i], "-pa")) {
382  
383                         flag_printAST = 1;
384  
385                 } else if (noCaseStrCmp(argv[i], "-pc")) {
386  
387                         flag_printPCode = 1;
388  
389                 } else if (noCaseStrCmp(argv[i], "-pe")) {
390  
391                         flag_printExec = 1;
392  
393                 } else if (noCaseStrCmp(argv[i], "-z") ||
394                            noCaseStrCmp(argv[i], "-xsync")) {
395  
396                         sync_event = 1;
397  
398                 } else if (noCaseStrCmp(argv[i], "-LAF") ||
399                            noCaseStrCmp(argv[i], "-laf") ||
400                            noCaseStrCmp(argv[i], "-l")) {
401  
402                 if (!argv[++i]) {
403                         /* assume simple mode (1) */
404                         lookAndFeel = 1;
405                 } else {
406                         lookAndFeel = atoi(argv[i]);
407                 }
408  
409                 } else if (noCaseStrCmp(argv[i], "-noarg")) {
410  
411                 } else if (noCaseStrCmp(argv[i], "-path") ||
412                            noCaseStrCmp(argv[i], "-p")) {
413  
414                         /* Scott */
415                         *violaPath = argv[++i];
416  
417                 } else if (noCaseStrCmp(argv[i], "-release") ||
418                            noCaseStrCmp(argv[i], "-r")) {
419  
420                 fprintf(stderr, "%s\n", viola_version);
421  
422                 } else if (noCaseStrCmp(argv[i], "-snipet") ||
423                            noCaseStrCmp(argv[i], "-s")) {
424  
425                         /* Scott */
426                         *scriptSnipet = argv[++i];
427  
428                 } else if (noCaseStrCmp(argv[i], "-verbose") ||
429                            noCaseStrCmp(argv[i], "-v")) {
430  
431                         verbose = 1;
432  
433                 } else if (noCaseStrCmp(argv[i], "-tagd")) {
434  
435                         extern int printTagDelims;
436  
437                         printTagDelims = 1;
438  
439                 } else if (noCaseStrCmp(argv[i], "-wt")) {
440  
441                         flag_window_tracking = 1;
442  
443                 } else if (noCaseStrCmp(argv[i], "-at")) {
444  
445                         if (argv[i+1][0] != '-') {
446                                 user_action_tracking = fopen(argv[++i], "w");
447                                 if (!user_action_tracking) {
448                                 fprintf(stderr,
449         "Failed to open file \"%s\" for user action tracking. Using stderr.\n",
450                                         argv[i]);
451                                 user_action_tracking = stderr;
452                                 }
453                         } else {
454                                 user_action_tracking = stderr;
455                         }
456  
457                 } else if (noCaseStrCmp(argv[i], "-lcs")) {
458  
459                     loadClassScriptsP = 1;
460  
461                 } else if (noCaseStrCmp(argv[i], "-debug")) {
462  
463                     /* Flag allows spider to print out diagnostic stuff. */;
464  
465                 } else {
466                         passthru_argument = argv[i];
467                 }
468 /*
469  * Scott
470  *
471  * When viola sees arguments that are for Spider, it barfs.  Until Spider
472  * removes it's arguments, we'll just comment out this code that complains
473  * about unknown flags.
474  *
475                 else {
476                         fputs(viola_usage, stderr);
477                         exit(0);
478                 }
479  */
480                 if (i >= argc) break;
481         }
482  
483         /* for convenience, automatically start up www if no
484          * application is specified
485          */
486         if (*startObjCount == 0) {
487                 startObj[0] = "www";
488                 *startObjCount = 1;
489         }
490 }
491  
492  
493 /* Bede McCall <bede@mitre.org> MITRE Corp
494  */
495 #include <errno.h>
496 #include <pwd.h>
4 roytam 497 /*
1 roytam 498 extern int errno;
499 extern char *sys_errlist[];
500 extern int sys_nerr;
4 roytam 501 */
1 roytam 502 initUserWWW ( www )
503          char *www;
504 {
505         int Errno;
506         char *cp;
507         static char path[128];
508         struct passwd *pw;
509  
510         Errno = 0;
511         bzero(path, 128);
512  
513 #ifdef i386
514         pw = getpwuid(getuid());
515 #else
516         {
517           char *cuserid();
518           struct passwd *getpwnam();
519  
520           cp = cuserid((char *)NULL);
521           if (!cp) return;
522           pw = getpwnam(cp);
523         }
524 #endif
525         (void) strcat(path, pw->pw_dir);
526         (void) strcat(path, "/");
527         (void) strcat(path, www);
528  
529         if ( mkdir(path, 0x755) ) {
530           Errno = errno;
531           if ( verbose ) {
532             if ( Errno < sys_nerr )
533               (void) printf("mkdir(%s), error %d: %s\n",
534                             path, Errno, sys_errlist[Errno]);
535             else
536               (void) printf("mkdir(%s), error %d\n", path, Errno);
537           }
538         } else if ( verbose ) {
539           (void) printf("created %s\n", path);
540         }
541         (void) fflush(stdout);
542 }
543  
544  
545 /*
546  * To get a Viola object name from a file path name.
547  */
548 void scanTopObjName(fileName, returnName)
549         char *fileName, *returnName;
550 {
551         char *cp;
552         int len;
553  
554         if (!fileName) {
555         *returnName = '\0';
556         return;
557         }
558         len = strlen(fileName);
559  
560         if (!len) {
561         *returnName = '\0';
562         return;
563         }
564  
565         cp = fileName + len - 1;
566  
567         while(cp != fileName && *cp != '/')
568         cp--;
569         if (*cp == '/') cp++;
570  
571         while(*cp && *cp != '.')
572         *returnName++ = *cp++;
573         *returnName = '\0';
574 }
575