home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume23 / jgraph / patch06b < prev    next >
Text File  |  1991-10-22  |  29KB  |  847 lines

  1. Newsgroups: comp.sources.misc
  2. From: jsp@Princeton.EDU (James Plank)
  3. Subject:  v23i100:  jgraph - A filter for plotting postscript graphs, Patch06b/2
  4. Message-ID: <1991Oct22.031830.1456@sparky.imd.sterling.com>
  5. X-Md4-Signature: 0109f7867f2f4c812022aa85a8fcfcff
  6. Date: Tue, 22 Oct 1991 03:18:30 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: jsp@Princeton.EDU (James Plank)
  10. Posting-number: Volume 23, Issue 100
  11. Archive-name: jgraph/patch06b
  12. Environment: UNIX, VMS, postscript
  13. Patch-To: jgraph: Volume 16, Issue 20
  14.  
  15. #!/bin/sh
  16. # do not concatenate these parts, unpack them in order with /bin/sh
  17. # file patch.6 continued
  18. #
  19. if test ! -r _shar_seq_.tmp; then
  20.     echo 'Please unpack part 1 first!'
  21.     exit 1
  22. fi
  23. (read Scheck
  24.  if test "$Scheck" != 2; then
  25.     echo Please unpack part "$Scheck" next!
  26.     exit 1
  27.  else
  28.     exit 0
  29.  fi
  30. ) < _shar_seq_.tmp || exit 1
  31. if test ! -f _shar_wnt_.tmp; then
  32.     echo 'x - still skipping patch.6'
  33. else
  34. echo 'x - continuing file patch.6'
  35. sed 's/^X//' << 'SHAR_EOF' >> 'patch.6' &&
  36. !   x = 0.0;
  37. !   max_y = 0.0;
  38. !   min_y = 0.0;
  39. !   for (g = first(gs->g); g != nil(gs->g); g = next(g)) {
  40. !     tmp_x = ABS(g->x_translate) * 2.0 + g->x_axis->psize;
  41. !     x = MAX(x, tmp_x);
  42. !     max_y = MAX(max_y, g->y_translate + g->y_axis->psize);
  43. !     if (g->y_translate > 0.0)
  44. !       min_y = MIN(min_y, g->y_translate + g->minval);
  45. !     else
  46. !       min_y = MIN(min_y, g->minval);
  47. X    }
  48. -   if (gs->height <= 0.00) gs->height = max_y - min_y; else gs->height *= FCPI;
  49. -   if (gs->width <= 0.00) gs->width = x; else gs->width *= FCPI;
  50. -   gs->bb[0] = 0.0;
  51. -   gs->bb[1] = min_y;
  52. -   gs->bb[2] = gs->width;
  53. -   gs->bb[3] = gs->height + min_y;
  54. X  }
  55. --- 474,510 ----
  56. X  process_graphs(gs)
  57. X  Graphs gs;
  58. X  {
  59. +   Graphs the_g;
  60. X    Graph g;
  61. X    float tmp_x, x, max_y, min_y;
  62. +   int do_bb, i;
  63. X  
  64. !   for (the_g = first(gs); the_g != nil(gs); the_g = next(the_g)) {
  65. !     for (g = first(the_g->g); g != nil(the_g->g); g = next(g)) process_graph(g);
  66. !     x = 0.0;
  67. !     max_y = 0.0;
  68. !     min_y = 0.0;
  69. !     for (g = first(the_g->g); g != nil(the_g->g); g = next(g)) {
  70. !       tmp_x = ABS(g->x_translate) * 2.0 + g->x_axis->psize;
  71. !       x = MAX(x, tmp_x);
  72. !       max_y = MAX(max_y, g->y_translate + g->y_axis->psize);
  73. !       if (g->y_translate > 0.0)
  74. !         min_y = MIN(min_y, g->y_translate + g->minval);
  75. !       else
  76. !         min_y = MIN(min_y, g->minval);
  77. !     }
  78. !     if (the_g->height <= 0.00) 
  79. !       the_g->height = max_y - min_y; 
  80. !     else 
  81. !       the_g->height *= FCPI;
  82. !     if (the_g->width <= 0.00) the_g->width = x; else the_g->width *= FCPI;
  83. !     do_bb = 1;
  84. !     for (i = 0; i < 4; i++) do_bb = (do_bb && the_g->bb[i] == FSIG);
  85. !     if (do_bb) {
  86. !       the_g->bb[0] = 0.0;
  87. !       the_g->bb[1] = min_y;
  88. !       the_g->bb[2] = the_g->width;
  89. !       the_g->bb[3] = the_g->height + min_y;
  90. !     } 
  91. X    }
  92. X  }
  93. *** /dev/null    Tue Oct  8 02:00:06 1991
  94. --- redexp.vms    Tue Oct  8 16:55:17 1991
  95. ***************
  96. *** 0 ****
  97. --- 1,526 ----
  98. + /*    --redexp.vms--
  99. +    This 'C' module may be included prior to the ``main'' programs on VMS in
  100. +    order to allow 'C' arguments to contain redirection symbols (<,>,>>) and
  101. +    VMS wild cards (*,%, ...], [-).  By including this module, two programs
  102. +    redirect() and expand() are run prior to turning control over to
  103. +    your main() entry point.
  104. +     redirect-- Gregg Townsend circa 1983,
  105. +     expand-- John Campbell circa 1987
  106. +    This code is public domain, others may use it freely. Credit, however, to
  107. +    Gregg Townsend (who wrote ``redirect()'') and John Campbell (who followed
  108. +    with ``expand()'') would be appreciated.  If someone writes the next
  109. +    logical successor ``pipe()'', please email a copy to
  110. +    ...!arizona!naucse!jdc (John Campbell) (Gregg works on unix :-).
  111. +    HISTORY
  112. + */
  113. + #include <rms.h>      /* No easy way to tell if this has already been included. */
  114. + #ifndef ERANGE
  115. + #include <stdlib.h>   /* Include only if missing. */
  116. + #endif
  117. + #ifndef __FILE
  118. + #include <stdio.h>    /* Include only if missing. */
  119. + #endif
  120. + #include <ctype.h>  /* Added for conversion to lower case  */
  121. + #ifndef __STRING_LOADED
  122. + #include <string.h>
  123. + #endif /* !__STRING_LOADED */
  124. + /* Expansion of wild cards is done using RMS. */
  125. +         struct NAMBLK { struct NAM nam;         /* VMS nam block structure */
  126. +                  char es[NAM$C_MAXRSS],         /* Extended string         */
  127. +                       rs[NAM$C_MAXRSS];         /* Resultant string        */
  128. +                };
  129. + #define ErrorExit 1
  130. + /* Allow the user to override _N_FARGS or _E_FLAG if they wish. */
  131. + #ifndef _N_FARGS
  132. + #define _N_FARGS 0 /* no automatic redirection please */
  133. + #endif
  134. + #ifndef _E_FLAG
  135. + #define _E_FLAG 4  /* only include dev and dir if different from default */
  136. + #endif
  137. + /*
  138. +    Since the following will possibly be included in a single module, try
  139. +    hard to avoid name conflicts. (Just being static doesn't cut it if
  140. +    compiled in the same module.)
  141. + */
  142. + #define redirect     _r_edirect
  143. + #define filearg      _f_ilearg
  144. + #define expand       _e_xpand
  145. + #define wild_found   _w_ild_found
  146. + #define wild_expand  _w_ild_expand
  147. + /* forward protypes */
  148. + static void redirect(int *argc, char *argv[], int nfargs);
  149. + char **expand (int *argc, const char *argv[], const int flag);
  150. + main(int argc, char *argv[], char *envp[])
  151. + {
  152. +    redirect (&argc, argv, _N_FARGS);
  153. +    argv = expand (&argc, argv, _E_FLAG);
  154. +    /* Make the user's main entry point this routine's entry point. */
  155. + #define main _user_main
  156. +    _user_main (argc, argv, envp);
  157. + }
  158. + /* ------------------------ REDIRECT code ------------------------ */
  159. + /*
  160. +  * redirect(&argc,argv,nfargs) - redirect standard I/O
  161. +  *    int *argc         number of command arguments (from call to main)
  162. +  *    char *argv[]      command argument list (from call to main)
  163. +  *    int nfargs        number of filename arguments to process
  164. +  *
  165. +  * argc and argv will be adjusted by redirect.
  166. +  *
  167. +  * redirect processes a program's command argument list and handles redirection
  168. +  * of stdin, and stdout.  Any arguments which redirect I/O are removed from the
  169. +  * argument list, and argc is adjusted accordingly.  redirect would typically be
  170. +  * called as the first statement in the main program.
  171. +  *
  172. +  * Files are redirected based on syntax or position of command arguments.
  173. +  * Arguments of the following forms always redirect a file:
  174. +  *
  175. +  *    <file     redirects standard input to read the given file
  176. +  *    >file     redirects standard output to write to the given file
  177. +  *    >>file    redirects standard output to append to the given file
  178. +  *
  179. +  * It is often useful to allow alternate input and output files as the
  180. +  * first two command arguments without requiring the <file and >file
  181. +  * syntax.  If the nfargs argument to redirect is 2 or more then the
  182. +  * first two command arguments, if supplied, will be interpreted in this
  183. +  * manner:  the first argument replaces stdin and the second stdout.
  184. +  * A filename of "-" may be specified to occupy a position without
  185. +  * performing any redirection.
  186. +  *
  187. +  * If nfargs is 1, only the first argument will be considered and will
  188. +  * replace standard input if given.  Any arguments processed by setting
  189. +  * nfargs > 0 will be removed from the argument list, and again argc will
  190. +  * be adjusted.  Positional redirection follows syntax-specified
  191. +  * redirection and therefore overrides it.
  192. +  *
  193. +  */
  194. + /* forward prototype for local routine */
  195. + static void filearg(int *argc, char *argv[], int n, int i, FILE *fp, char mode[]);
  196. + static void redirect(int *argc, char *argv[], int nfargs)
  197. + {
  198. +    int i;
  199. +    i = 1;
  200. +    while (i < *argc)  {         /* for every command argument... */
  201. +       switch (argv[i][0])  {            /* check first character */
  202. +          case '<':                      /* <file redirects stdin */
  203. +             filearg(argc,argv,i,1,stdin,"r");
  204. +             break;
  205. +          case '>':                      /* >file or >>file redirects stdout */
  206. +             if (argv[i][1] == '>')
  207. +                filearg(argc,argv,i,2,stdout,"a");
  208. +             else
  209. +                filearg(argc,argv,i,1,stdout,"w");
  210. +             break;
  211. +          default:                       /* not recognized, go on to next arg */
  212. +             i++;
  213. +       }
  214. +    }
  215. +    if (nfargs >= 1 && *argc > 1)        /* if positional redirection & 1 arg */
  216. +       filearg(argc,argv,1,0,stdin,"r"); /* then redirect stdin */
  217. +    if (nfargs >= 2 && *argc > 1)        /* likewise for 2nd arg if wanted */
  218. +       filearg(argc,argv,1,0,stdout,"w");/* redirect stdout */
  219. + }
  220. + /* local routine for redirect() */
  221. + /* filearg(&argc,argv,n,i,fp,mode) - redirect and remove file argument
  222. +  *    int *argc         number of command arguments (from call to main)
  223. +  *    char *argv[]      command argument list (from call to main)
  224. +  *    int n             argv entry to use as file name and then delete
  225. +  *    int i             first character of file name to use (skip '<' etc.)
  226. +  *    FILE *fp          file pointer for file to reopen (typically stdin etc.)
  227. +  *    char mode[]       file access mode (see freopen spec)
  228. +  */
  229. + static void filearg(int *argc, char *argv[], int n, int i, FILE *fp, char mode[])
  230. + {
  231. +    if (strcmp(argv[n]+i,"-"))           /* alter file if arg not "-" */
  232. +       fp = freopen(argv[n]+i,mode,fp,"mbf=8","mbc=16");
  233. +    if (fp == NULL)  {                   /* abort on error */
  234. +       fprintf(stderr,"%%can't open %s",argv[n]+i);
  235. +       exit(ErrorExit);
  236. +    }
  237. +    for ( ;  n < *argc;  n++)            /* move down following arguments */
  238. +       argv[n] = argv[n+1];
  239. +    *argc = *argc - 1;                   /* decrement argument count */
  240. + }
  241. + /* ------------------------ EXPAND code ------------------------ */
  242. + /*-
  243. +    ``expand()'' is a routine to expand wild-cards to file specifications.
  244. +    This routine is often used in conjunction with ``redirect()'' to provide
  245. +    both wild card expansion and standard file redirection prior to doing
  246. +    any real work in a 'C' program.
  247. +    Normal usage is to include the following line prior to using argc or
  248. +    argv in main():
  249. +      argv = expand (&argc, argv, 0);
  250. +    ``argc'' will be adjusted by ``expand()'', the return value from expand
  251. +    will replace ``argv''.
  252. +    ``expand()'' processes a program's command argument list and expands any
  253. +    wild cards into zero or more argv entries. Only arguments that posses VMS
  254. +    wild-cards are expanded. Wild cards searched for are ``*'', ``%'',
  255. +    ``...]'', and ``[-''. If the wild-card is found inside a single or double
  256. +    quote ("*" or '%') then they are not counted as wild-cards. Be aware that
  257. +    the expansion of a VMS wild card will match all VMS files, including
  258. +    directory files (".DIR;1").
  259. +    NOTE: The use of quotes in VMS requires thinking about how the CLI expands
  260. +    things before handing the argument line over to your program.  Do not
  261. +    expect "*" to avoid expansion, use """*""" instead.  Likewise, expression
  262. +    substitution precludes the use of (') to quote wild cards:
  263. +            $ A := HELLO
  264. +            $ ECHO 'a'   ! 'C' program that calls ``expand()''
  265. +            hello
  266. +    The easiest way to escape a wild-card may be "'*'".  The point is that
  267. +    ``expand()'' will only recognize quotes passed into main().
  268. +    Note: I have added '\' as an escape character -hdd.
  269. +    ``expand()'' references the VMS runtime routines, you will need to
  270. +    link with the 'C' RTL whenever expand is used.
  271. +    Parameters:
  272. +          argc:  Pointer to the number of command arguments (from main),
  273. +                 the contents of this parameter are modified.
  274. +          argv:  Pointer to the initial command argument list (from main),
  275. +                 the contents are copied into a new array which is returned
  276. +                 from this routine.
  277. +          flag:  Flag indicating how to expand wild-cards:
  278. +                    0 - Complete file name expansion
  279. +                    1 - only file name (no directory or version).
  280. +                    2 - directory info and file name (no version).
  281. +                    3 - file name and version info (no directory).
  282. +            4 - omit fields that are the same as RMS default.
  283. +  -*/
  284. + /* Local prototypes. */
  285. + int wild_found (char *string);
  286. + char **wild_expand (const char *string, char **argv, int *argc,
  287. +                     int extra, int flag);
  288. + /*
  289. +    General note: removing the prototyping and const keywords should
  290. +    allow this code to compile with VMS 'C' compilers prior to version
  291. +    2.3-024.
  292. + */
  293. + char **expand (int *argc, const char *argv[], const int flag)
  294. + {
  295. +    int i, nargc;
  296. +    char **nargv;
  297. +    char *s1;
  298. +    /* Get an initial amount of memory for the master nargv array. */
  299. +    if ((nargv = (char **)malloc ((*argc+1) * sizeof (char *))) == NULL) {
  300. +       fprintf (stderr, "Not enough memory to expand argument list\n");
  301. +       exit (ErrorExit);
  302. +    }
  303. +    /* Copy the command name (0th argument), but only the name of the exe */
  304. +    nargv[0] = strchr(argv[0],']');
  305. +    if (nargv[0] != NULL) {
  306. +        nargv[0]++;
  307. +        if ((s1=strrchr(nargv[0],'.')) != NULL) *s1 = '\0';
  308. +    } else {
  309. +        nargv[0] = argv[0];    /* if nothing suitable take original */
  310. +    }      
  311. +    /* Copy all other arguments, expanding those that have wild characters. */
  312. +    for (nargc = i = 1; i < *argc; i++) {
  313. +       if (wild_found(argv[i]))
  314. +          nargv = wild_expand(argv[i], nargv, &nargc, *argc-i, flag);
  315. +       else
  316. +          nargv[nargc++] = argv[i];
  317. +    }
  318. +    *argc = nargc;
  319. +    nargv[nargc] = NULL;  /* realloc always 0 fills, but... */
  320. +    return nargv;
  321. + }
  322. + static int wild_found (char *string)
  323. + /*
  324. +    Routine to search the given string for a VMS wild-card pattern.
  325. +    Returns 1 if "*", "%", "[-", or "...]" is found.  (This may not
  326. +    be all VMS wild-cards but it is enough for now--anyone that wants
  327. +    to recognize others can change this code.)
  328. +    Parameter:
  329. +       string: '\0' terminated character array.
  330. + */
  331. + {
  332. +    int state = 0;
  333. +    /* State of 0 is "rest" state.  State 1 on our way to [-, states 2-4
  334. +       on our way to ...], negative states indicate the two quotes (' -10,
  335. +       " -1).
  336. +    */
  337. +    for ( ;*string; string++) {
  338. +       switch (*string) {
  339. +       case '*':
  340. +       case '%':
  341. +          if (state >= 0)
  342. +             return 1;                    /* Unquoted % or * found. */
  343. +       break;
  344. +       case '[':
  345. +          if (state >= 0)
  346. +             state = 1;
  347. +       break;
  348. +       case ']':
  349. +          if (state == 4)
  350. +             return 1;                    /* Unquoted ...] found. */
  351. +          else if (state >= 0)
  352. +             state = 0;
  353. +       break;
  354. +       case '-':
  355. +          if (state == 1)
  356. +             return 1;                    /* Unquoted [- found. */
  357. +          else if (state >= 0)
  358. +             state = 0;
  359. +       break;
  360. +       case '.':
  361. +          if (state == 1 || state == 0)
  362. +             state = 2;                   /* First '.' */
  363. +          else if (state > 1 && state < 5)
  364. +             state++;                     /* ... == states 2, 3, 4 */
  365. +          else if (state >= 0)
  366. +             state = 0;
  367. +       break;
  368. +       case '\'':
  369. +          if (state <= -10)
  370. +             state += 10;           /* One ', possibly one " also */
  371. +          else if (state < 0)
  372. +             state -= 10;           /* 0 ', possibly one " */
  373. +          else
  374. +             state = -10;           /* No ' or " prior to this ' */
  375. +       break;
  376. +       case '"':
  377. +          if (state == -11)
  378. +             state = -10;           /* Both " and ' prior to this. */
  379. +          else if (state == -10)
  380. +             state = -11;           /* A ' prior to this. */
  381. +          else if (state == -1)
  382. +             state = 0;             /* A " prior to this. */
  383. +          else
  384. +             state = -1;            /* No ' or " prior to this " */
  385. +       break;
  386. +       case '\\':
  387. +          string = strcpy(string, string+1);
  388. +      state = 0;
  389. +       break;
  390. +       }
  391. +    }
  392. +    return 0;
  393. + }
  394. + static char **wild_expand(const char *wild, char **argv,
  395. +               int *argc, int extra, int flag)
  396. + /*
  397. +    Routine to expand wild into new arguments appended to the end
  398. +    of argv[*argc].  This routine must realloc in order to make room
  399. +    for the individual arguments and malloc for enough space for each
  400. +    of the arguments.  The return value is a new **argv.
  401. +    Parameters:
  402. +          wild:  '\0' terminated string that needs to be expanded.
  403. +          argv:  initial starting address of the argv array.
  404. +          argc:  pointer to an integer that tells the current end of the
  405. +                 argument list.
  406. +         extra:  The number of extra pointers that the returned argv
  407. +                 must have available for future assignments.
  408. +          flag:  Flag indicating how to expand wild-card:
  409. +                   0 - Complete file name expansion
  410. +                   1 - only file name (no directory or version).
  411. +                   2 - directory info and file name (no version)
  412. +                   3 - file name and version info (no directory).
  413. +           4 - omit fields that are the same as RMS default.
  414. + */
  415. + {
  416. +    int more_to_go = 1, err, length, status, len_wild, i, ddev_l, ddir_l;
  417. +    char *namptr;
  418. +    struct FAB fab_blk;
  419. +    struct NAMBLK nam_blk;
  420. +    char path[256];
  421. +    char *ddevice = &path[0];    /* default device and directory */
  422. +    char *ddirectory, *ppath;
  423. +    char *env = getenv("PATH");
  424. +    ppath = &path[0];
  425. +    while (*env) {
  426. +        char *p = env++;
  427. +        if ((*ppath++ = _toupper(*p)) == ':') {
  428. +        ddev_l = ppath - &path[0];
  429. +        *ppath++ = 0;
  430. +        ddirectory = ppath;
  431. +        }
  432. +    }
  433. +    *ppath++ = 0;
  434. +    ddir_l = ppath - ddirectory - 1;
  435. +    len_wild = strlen(wild);
  436. +    /* Initialize all the fab and nam fields needed for parse and search */
  437. +    fab_blk = cc$rms_fab;                   /* Initialize FAB structure */
  438. +    nam_blk.nam    = cc$rms_nam;            /* Initialize NAM structure */
  439. +    fab_blk.fab$l_dna = ".*";               /* Default file specif.     */
  440. +    fab_blk.fab$b_dns = 2;                  /* Length of default spec.  */
  441. +    fab_blk.fab$l_nam = &nam_blk.nam;       /* Set address of NAM in FAB*/
  442. +    nam_blk.nam.nam$b_ess = NAM$C_MAXRSS;   /* Set extended  string size*/
  443. +    nam_blk.nam.nam$l_esa = nam_blk.es;     /* and address              */
  444. +    nam_blk.nam.nam$b_rss = NAM$C_MAXRSS;   /* Set resultant string size*/
  445. +    nam_blk.nam.nam$l_rsa = nam_blk.rs;     /* and address              */
  446. +    nam_blk.nam.nam$l_rlf = NULL;           /* No related file address  */
  447. +    fab_blk.fab$l_fna = wild;           /* Address of file name string  */
  448. +    fab_blk.fab$b_fns = len_wild;       /* Length of file name string   */
  449. +    /* Prepare to enter the search loop, parse fab. */
  450. +    err = SYS$PARSE (&fab_blk);
  451. +    /* Catch the directory not found error and return no files found. */
  452. +    if (err != RMS$_NORMAL)
  453. +       exit(err);
  454. +    while (more_to_go) {
  455. +       err = SYS$SEARCH (&fab_blk);
  456. +       if (err == RMS$_NMF || err == RMS$_FNF)
  457. +          more_to_go = 0;               /* Done, no more files found */
  458. +       else if (err != RMS$_NORMAL)
  459. +          exit (err);
  460. +       else {
  461. +       /* Count that we now have this many arguments. */
  462. +          (*argc)++;
  463. +       /* Make sure there is room for a new pointer. */
  464. +          if ((argv = realloc (argv, (*argc + extra)*sizeof(char *))) == NULL) {
  465. +             fprintf (stderr, "Not enough memory to expand argument list\n");
  466. +             exit(ErrorExit);
  467. +          }
  468. +       /* Move the right name into the list. */
  469. +          switch (flag) {
  470. +          case 0:             /* Complete file name */
  471. +             length = nam_blk.nam.nam$b_rsl;
  472. +             namptr = nam_blk.rs;
  473. +             break;
  474. +          case 1:            /* File name only (no directory or version). */
  475. +             length = nam_blk.nam.nam$b_name + nam_blk.nam.nam$b_type;
  476. +             namptr = nam_blk.nam.nam$l_name;
  477. +             break;
  478. +          case 2:            /* directory and file name (no version) */
  479. +             length = nam_blk.nam.nam$b_rsl - nam_blk.nam.nam$b_ver;
  480. +             namptr = nam_blk.rs;
  481. +             break;
  482. +          case 3:            /* File name and version (no directory). */
  483. +             length = nam_blk.nam.nam$b_name +
  484. +                      nam_blk.nam.nam$b_type +
  485. +                      nam_blk.nam.nam$b_ver;
  486. +             namptr = nam_blk.nam.nam$l_name;
  487. +             break;
  488. +      case 4:         /* Remove redundant fields, no version */
  489. +             length = nam_blk.nam.nam$b_rsl - nam_blk.nam.nam$b_ver;
  490. +             namptr = nam_blk.rs;
  491. +         if ((nam_blk.nam.nam$b_dev==ddev_l) &&
  492. +             !strncmp(namptr, ddevice, nam_blk.nam.nam$b_dev)) {
  493. +             length -= nam_blk.nam.nam$b_dev;
  494. +             namptr += nam_blk.nam.nam$b_dev;
  495. +             if ((nam_blk.nam.nam$b_dir==ddir_l) &&
  496. +                 !strncmp(namptr, ddirectory, nam_blk.nam.nam$b_dir)) {
  497. +                 length -= nam_blk.nam.nam$b_dir;
  498. +                 namptr += nam_blk.nam.nam$b_dir;
  499. +             }
  500. +         }
  501. +             break;
  502. +          default:
  503. +             fprintf (stderr, "illegal flag used in VMS expand call\n");
  504. +             exit (ErrorExit);
  505. +      } /* end of switch */
  506. +      /* Copy the requested string into the argument array. */
  507. +          if ((argv[*argc-1] = malloc (length+1)) == NULL) {
  508. +             fprintf (stderr, "Not enough memory to expand argument list\n");
  509. +             exit (ErrorExit);
  510. +      }
  511. +          /* Copy the string, translate to lower case */
  512. +          /* strncpy (argv[*argc-1], namptr, length); */
  513. +          for (i=0; i<length; i++) {
  514. +          argv[*argc-1][i] = _tolower(*namptr);
  515. +          namptr++;
  516. +      }
  517. +          /* End of modification */
  518. +          argv[*argc-1][length] = '\0';
  519. +       }
  520. +    } /* end while (more_to_go) */
  521. +    return (argv);
  522. + }
  523. + /* Remove all the defines that might affect the user's code. */
  524. + #undef redirect
  525. + #undef filearg
  526. + #undef expand
  527. + #undef wild_found
  528. + #undef wild_expand
  529. + #if 0
  530. + /* ------------------------ ECHO sample code ------------------------ */
  531. + #include <stdio.h>
  532. + /* here come the 3 lines that make this Unix program into a VMS one: */
  533. + #ifdef VMS
  534. + #include <redexp.vms>
  535. + #endif
  536. + /*
  537. +    This main program allows you to run experiments with redexp.vms.
  538. +    Try $ echo *.*, $ echo -f1 [-...]*.*, $ echo -f[0-3] *.*.
  539. +    Questions about using "%", "\", etc. may be answered by testing
  540. +    with this version of echo.
  541. +    To use this, cut from the "#if 0" above up to the last #endif,
  542. +    and put the text in echo.c. Assuming you have defined VAXC$INCLUDE
  543. +    to also look in the directory where you put redexp.VMS, you should
  544. +    be able to compile and link echo. Define a symbol echo as
  545. +        echo :== $sys$disk:[]echo
  546. +    and you are ready to run.
  547. + */
  548. + main(argc, argv)
  549. + int argc;
  550. + char *argv[];
  551. + {
  552. +     int i = 0;
  553. +     while (i < argc) {
  554. +     printf("argv[%d]: %s\n", i, argv[i]);
  555. +     i++;    
  556. +     }
  557. + }
  558. + /* ------------------------ ECHO sample code end --------------------- */
  559. + #endif  /* if 0 */
  560. *** ../work/show.c    Tue Oct  8 17:36:30 1991
  561. --- show.c    Tue Oct  8 16:55:18 1991
  562. ***************
  563. *** 1,7 ****
  564. X  /* 
  565. X   * $Source: /n/fs/vd/jsp/src/jgraph/RCS/show.c,v $
  566. !  * $Revision: 5.0 $
  567. !  * $Date: 91/05/02 14:45:21 $
  568. X   * $Author: jsp $
  569. X   */ 
  570. X  
  571. --- 1,7 ----
  572. X  /* 
  573. X   * $Source: /n/fs/vd/jsp/src/jgraph/RCS/show.c,v $
  574. !  * $Revision: 6.0 $
  575. !  * $Date: 91/10/08 16:53:59 $
  576. X   * $Author: jsp $
  577. X   */ 
  578. X  
  579. ***************
  580. *** 9,15 ****
  581. X  #include <math.h>
  582. X  #include "jgraph.h"
  583. X  
  584. ! static int spaces(nsp)
  585. X  int nsp;
  586. X  {
  587. X    while(nsp-- > 0) putchar(' ');
  588. --- 9,15 ----
  589. X  #include <math.h>
  590. X  #include "jgraph.h"
  591. X  
  592. ! static spaces(nsp)
  593. X  int nsp;
  594. X  {
  595. X    while(nsp-- > 0) putchar(' ');
  596. ***************
  597. *** 68,73 ****
  598. --- 68,74 ----
  599. X  {
  600. X    Point p;
  601. X    int i;
  602. +   Flist fl;
  603. X  
  604. X    if (c->l->label != CNULL) {
  605. X      spaces(nsp); printf("label\n");
  606. ***************
  607. *** 99,107 ****
  608. X    spaces(nsp); printf("linetype ");
  609. X    if (c->linetype == '0')  printf("none ");
  610. X    else if (c->linetype == 's') printf("solid ");
  611. !   else if (c->linetype == '.') printf("dotted");
  612. X    else if (c->linetype == '-') printf("dashed ");
  613. X    printf("linethickness %f\n", c->linethick);
  614. X  }
  615. X  
  616. X  show_axis(a, nsp, g)
  617. --- 100,137 ----
  618. X    spaces(nsp); printf("linetype ");
  619. X    if (c->linetype == '0')  printf("none ");
  620. X    else if (c->linetype == 's') printf("solid ");
  621. !   else if (c->linetype == '.') printf("dotted ");
  622. X    else if (c->linetype == '-') printf("dashed ");
  623. +   else if (c->linetype == 'l') printf("longdash ");
  624. +   else if (c->linetype == 'd') printf("dotdash ");
  625. +   else if (c->linetype == 'D') printf("dotdotdash ");
  626. +   else if (c->linetype == '2') printf("dotdotdashdash ");
  627. +   else if (c->linetype == 'g') {
  628. +     printf("general\n");
  629. +     spaces(nsp+2);
  630. +     printf("glines "); 
  631. +     i = 0;
  632. +     for (fl = first(c->gen_linetype); fl != nil(c->gen_linetype); 
  633. +                                       fl = next(fl)) {
  634. +       if (i == 6) {
  635. +         printf("\n");
  636. +         spaces(nsp + 9);
  637. +         i = 0;
  638. +       }
  639. +       printf("%f ", fl->f);
  640. +       i++;
  641. +     }
  642. +     printf("\n");
  643. +     spaces(nsp);
  644. +   }
  645. X    printf("linethickness %f\n", c->linethick);
  646. +   spaces(nsp); 
  647. +   printf("gray %f ", c->gray);
  648. +   if(!c->clip) printf("no"); printf("clip ");
  649. +   if(!c->rarrows) printf("no"); printf("rarrows ");
  650. +   if(!c->larrows) printf("no"); printf("larrows ");
  651. +   printf("asize %f %f\n", ptodist(c->asize[0], g->x_axis), 
  652. +                           ptodist(c->asize[1], g->y_axis));
  653. X  }
  654. X  
  655. X  show_axis(a, nsp, g)
  656. ***************
  657. *** 135,141 ****
  658. --- 165,175 ----
  659. X    spaces(nsp); 
  660. X    printf("%sdraw_hash_marks\n", (a->draw_hash_marks) ? "" : "no_");
  661. X    spaces(nsp); 
  662. +   printf("%sgrid_lines\n", (a->grid_lines) ? "" : "no_");
  663. +   spaces(nsp); 
  664. X    printf("%sdraw_axis_label\n", (a->draw_axis_label) ? "" : "no_");
  665. +   spaces(nsp); 
  666. +   printf("gray %f\n", a->gray);
  667. X    spaces(nsp);
  668. X  
  669. X    printf("(* The real settings for generating auto_hash_labels:\n");
  670. ***************
  671. *** 202,207 ****
  672. --- 236,243 ----
  673. X                         ptoin(g->x_translate), ptoin(g->y_translate));
  674. X    spaces(nsp); printf("xaxis\n"); show_axis(g->x_axis, nsp+2, g);
  675. X    spaces(nsp); printf("yaxis\n"); show_axis(g->y_axis, nsp+2, g);
  676. +   spaces(nsp); if(!g->clip) printf("no"); printf("clip ");
  677. +                if(!g->border) printf("no"); printf("border\n");
  678. X    for (c = first(g->curves); c != nil(g->curves); c = next(c)) {
  679. X      spaces(nsp);
  680. X      printf("curve %d\n", c->num);
  681. ***************
  682. *** 224,235 ****
  683. X  show_graphs(gs)
  684. X  Graphs gs;
  685. X  {
  686. X    Graph g;
  687. X  
  688. !   printf("X %f Y %f\n", ptoin(gs->width), ptoin(gs->height));
  689. !   for (g = first(gs->g); g != nil(gs->g); g = next(g)) {
  690. !     printf("graph %d\n", g->num);
  691. !     show_graph(g, 2);
  692. X    }
  693. X  }
  694. X  
  695. --- 260,282 ----
  696. X  show_graphs(gs)
  697. X  Graphs gs;
  698. X  {
  699. +   Graphs the_g;
  700. X    Graph g;
  701. +   char started;
  702. +   int i;
  703. X  
  704. !   started = 0;
  705. !   for (the_g = first(gs); the_g != nil(gs); the_g = next(the_g)) {
  706. !     if (started) printf("\nnewpage\n");
  707. !     started = 1;
  708. !     printf("X %f Y %f\n", ptoin(the_g->width), ptoin(the_g->height));
  709. !     printf("bbox"); 
  710. !     for (i = 0; i < 4; i++) printf(" %f", the_g->bb[i]);
  711. !     printf("\n");
  712. !     for (g = first(the_g->g); g != nil(the_g->g); g = next(g)) {
  713. !       printf("graph %d\n", g->num);
  714. !       show_graph(g, 2);
  715. !     }
  716. X    }
  717. X  }
  718. X  
  719. *** ../work/token.c    Tue Oct  8 17:36:41 1991
  720. --- token.c    Tue Oct  8 16:55:18 1991
  721. ***************
  722. *** 1,7 ****
  723. X  /* 
  724. X   * $Source: /n/fs/vd/jsp/src/jgraph/RCS/token.c,v $
  725. !  * $Revision: 5.0 $
  726. !  * $Date: 91/05/02 14:45:23 $
  727. X   * $Author: jsp $
  728. X   */
  729. X  
  730. --- 1,7 ----
  731. X  /* 
  732. X   * $Source: /n/fs/vd/jsp/src/jgraph/RCS/token.c,v $
  733. !  * $Revision: 6.0 $
  734. !  * $Date: 91/10/08 16:54:00 $
  735. X   * $Author: jsp $
  736. X   */
  737. X  
  738. ***************
  739. *** 82,88 ****
  740. X    return oldchar;
  741. X  }
  742. X  
  743. ! int ungettokenchar()
  744. X  {
  745. X    oldcharvalid = 1;
  746. X    if (oldchar == '\n') line--;
  747. --- 82,88 ----
  748. X    return oldchar;
  749. X  }
  750. X  
  751. ! ungettokenchar()
  752. X  {
  753. X    oldcharvalid = 1;
  754. X    if (oldchar == '\n') line--;
  755. ***************
  756. *** 209,215 ****
  757. X            push_iostack(0);
  758. X          }
  759. X        } else if (strcmp(INPUT, "shell") == 0) {
  760. -         char *s, fn[30];
  761. X  #ifdef VMS 
  762. X          fprintf(stderr, "No shell option on VMS, sorry.\n");
  763. X          exit(1);
  764. --- 209,214 ----
  765. SHAR_EOF
  766. echo 'File patch.6 is complete' &&
  767. chmod 0664 patch.6 ||
  768. echo 'restore of patch.6 failed'
  769. Wc_c="`wc -c < 'patch.6'`"
  770. test 78625 -eq "$Wc_c" ||
  771.     echo 'patch.6: original size 78625, current size' "$Wc_c"
  772. rm -f _shar_wnt_.tmp
  773. fi
  774. rm -f _shar_seq_.tmp
  775. echo You have unpacked the last part
  776. exit 0
  777. exit 0 # Just in case...
  778. -- 
  779. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  780. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  781. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  782. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  783.