home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume34 / getwxmap / part01 / getwxmap.c < prev    next >
C/C++ Source or Header  |  1993-01-18  |  8KB  |  303 lines

  1. /*
  2.  @(#) getwxmap 2.21, January 15, 1993
  3.  
  4.  Copyright (C) 1993, Dale A. Harris (rodmur@ecst.csuchico.edu)
  5.  
  6.  This program may be freely re-distributed at no charge provided that
  7.  this notice is left intact.  Modified copies must preserve this notice.
  8.  It is requested that any useful changes you make be sent to the author.
  9.  
  10.  WXMAP:
  11.  Is a C program that was converted from a shell script I wrote to retrieve the
  12.  most recent of any  the various weather maps at vmd.cso.uiuc.edu and display
  13.  them using  some utility similar to xv (xv is a multi-purpose GIF, JPEG,
  14.  etc.,  displayer for X-windows, written by John Bradley
  15.  (bradley@cis.upenn.edu))
  16.  
  17.  Much thanks to Charlie Kline (cvk@uiuc.edu), and all the others I may
  18.   not know about, for their work on publicly available satellite weather
  19.   images
  20.  
  21.  Thanks a bunch to all with bug reports and fixes.
  22.  
  23.  Special Thanks to Emma Pease <emma@Russell.Stanford.EDU> for the man page!
  24.  
  25.  USAGE: getwxmap [ -D -R -d  -b -s -r -v -u# ]
  26.    -D if you don't want the files displayed
  27.    -R  if you don't want the files removed after displaying
  28.    -b  Display in background on root window
  29.    -d for debugging
  30.    -s    Retrieves the current Surface Anaylsis Map (this usually gets
  31.            made a little before 15 minutes after the hour, so WXMAP
  32.            doesn't grab it until 15 minutes or later after the hour)
  33.    -r    Retrieves the most recent Infra Red Light Map
  34.    -v    Retrieves the most recent Visible Light Map
  35.    -u#  Retrieves the most recent Upper Air maps at a # * 100hPa itervals
  36.    (# = 2,3,5,7,8 for 200hPa, 300hPa, 500hPa, 700hPa, 800hPa respectively)
  37. */
  38.  
  39. #include <stdio.h>
  40. #include <time.h>
  41. #include <stdlib.h>
  42. #ifdef SYSV
  43. #include <malloc.h>
  44. #endif
  45. #include <string.h>
  46. #include <unistd.h>
  47.  
  48. #define SMAX 7
  49. #define SITE "vmd.cso.uiuc.edu"
  50. #define DIR "wx"
  51. #define DISP "xv"
  52. #ifndef DOMAIN
  53. #define DOMAIN "SomewhereStupid"
  54. #endif
  55. #define UMAPNO 5        /* number of umaps */
  56. #define UMAP1 2
  57. #define UMAP2 3
  58. #define UMAP3 5
  59. #define UMAP4 7
  60. #define UMAP5 8
  61. #define UMAPHOURMADE 3
  62. #define UMAPMINMADE  5        /* minutes past the hour that the U*.GIF's made */
  63. #define SMAPMINMADE 15        /* Minutes past the hour that SA*.GIF made */
  64.  
  65.  
  66. /*
  67.    don't use the -quit option here with xv, it won't work properly if you
  68.     want to display more than one picture
  69. */
  70. #define BKGRDOPTS "-root -maxpect"
  71.  
  72. main (int argc, char **argv)
  73. {
  74.  
  75.   time_t seconds_off;
  76.   struct tm *tp, *otp, *tptmp, *thetime ();
  77.   char *mnthday, *gmt, *wgifs, *dispstr, *command, *filename, *uhour, *temp;
  78.   int background = 0, surface = 0, visible = 0, infrared = 0, nodis = 0,
  79.     norm = 0, debug = 0, upair = 0, i, j;
  80.   short int hpa[UMAPNO] =
  81.   {UMAP1, UMAP2, UMAP3, UMAP4, UMAP5};    /* the pressures for the umaps */
  82.   FILE *tosite;
  83.   void usage ();
  84.  
  85.  
  86.   mnthday = (char *) calloc (5, sizeof (char));
  87.   gmt = (char *) calloc (7, sizeof (char));
  88.   wgifs = (char *) calloc (100, sizeof (char));
  89.   dispstr = (char *) calloc (150, sizeof (char));
  90.   uhour = (char *) calloc (3, sizeof (char));
  91.   command = (char *) calloc (30, sizeof (char));
  92.   filename = (char *) calloc (30, sizeof (char));
  93.  
  94.   if (argc == 1)
  95.     {
  96.       fprintf (stderr, "%s: Pick an option\n", argv[0]);
  97.       usage ();
  98.       exit (1);
  99.     }
  100.   for (i = 1; i < argc; ++i)
  101.     for (j = (argv[i][0] == '-') ? 1 : 0; j < strlen (argv[i]); ++j)
  102.       switch (argv[i][j])
  103.     {
  104.     case 's':
  105.       ++surface;
  106.       break;
  107.     case 'b':
  108.       ++background;
  109.       break;
  110.     case 'r':
  111.       ++infrared;
  112.       break;
  113.     case 'v':
  114.       ++visible;
  115.       break;
  116.     case 'u':
  117.       switch (argv[i][++j] & 15)
  118.         {
  119.         case 2:
  120.           upair |= 1;
  121.           break;
  122.         case 3:
  123.           upair |= 2;
  124.           break;
  125.         case 5:
  126.           upair |= 4;
  127.           break;
  128.         case 7:
  129.           upair |= 8;
  130.           break;
  131.         case 8:
  132.           upair |= 16;
  133.           break;
  134.         default:
  135.           fprintf (stderr, "%s: Unavailable map: %i\n", argv[0], argv[i][j] & 15);
  136.           exit (1);
  137.         }
  138.       break;
  139.     case 'D':
  140.       ++nodis;
  141.       break;
  142.     case 'R':
  143.       ++norm;
  144.       break;
  145.     case 'd':
  146.       ++debug;
  147.       break;
  148.     default:
  149.       fprintf (stderr, "%s: Bad Option: %c\n", argv[0], argv[i][j]);
  150.       usage ();
  151.       exit (1);
  152.     }
  153.  
  154.   /* getting the time */
  155.   otp = tp = thetime ((time_t) 0, tp, argv[0]);
  156.   strftime (gmt, SMAX, "%m%d%H", tp);
  157.  
  158.   if (surface)
  159.     if (tp->tm_min >= SMAPMINMADE)
  160.       sprintf (wgifs, " SA%s.GIF ", gmt);
  161.     else
  162.       {
  163.     fprintf (stderr, "%s: SA%s.GIF not made until %d past the hour, getting last hours map.\n", argv[0], gmt, SMAPMINMADE);
  164.     /* Take off an hour's worth of seconds if before the quarter hour */
  165.     tp = thetime ((time_t) 3600, tp, argv[0]);
  166.     strftime (gmt, SMAX, "%m%d%H", tp);
  167.     sprintf (wgifs, " SA%s.GIF ", gmt);
  168.     tptmp = tp;
  169.     tp = otp;
  170.     free (tptmp);
  171.       }
  172.   if (infrared)
  173.     strcat (wgifs, " CIR.GIF ");
  174.   if (visible)
  175.     strcat (wgifs, " CVIS.GIF ");
  176.   if (upair)
  177.     /*
  178. The GMT hours of 3 to 15 was my best guess when the upperair maps
  179. get made, but on occasion it appears to be differant, so all I can
  180. say is best of luck!
  181. */
  182.     {
  183.       if (tp->tm_hour < 3)
  184.     {
  185.       /* if at 0 to 2 GMT take off the (hour + 1) times an hours worth of seconds */
  186.       seconds_off = (tp->tm_hour + 1) * 3600;
  187.       tp = thetime (seconds_off, tp, argv[0]);
  188.       strftime (mnthday, SMAX, "%m%d", tp);
  189.       tptmp = tp;
  190.       tp = otp;
  191.       free (tptmp);
  192.     }
  193.       else
  194.     strftime (mnthday, SMAX, "%m%d", tp);
  195.  
  196.       for (i = 0; i <= (UMAPNO - 1); ++i)
  197.     {
  198.       if (upair & 1)
  199.         {
  200.  
  201.           /* attach proper hour onto the end of u*.gifs */
  202.           strcpy (uhour, ((tp->tm_hour >= UMAPHOURMADE)
  203.              && (tp->tm_hour < (UMAPHOURMADE + 12))) ? "00" : "12");
  204.  
  205.           /* if it is the hours that the u*.gifs are made and if not 5 past the
  206.       hour, then don't get them */
  207.  
  208.           if (((tp->tm_hour == UMAPHOURMADE)
  209.            || (tp->tm_hour == (UMAPHOURMADE + 12)))
  210.           && (tp->tm_min < UMAPMINMADE))
  211.         fprintf (stderr, "%s: wait until %d after the hour for U%d%s%s.GIF\n", argv[0], UMAPMINMADE, hpa[i], mnthday, uhour);
  212.           else
  213.         {
  214.           temp = (char *) strdup (wgifs);
  215.           sprintf (wgifs, " %s U%d%s%s.GIF ", temp, hpa[i], mnthday, uhour);
  216.           free (temp);
  217.         }
  218.         }
  219.       upair >>= 1;
  220.     }
  221.     }
  222.  
  223.   /* Using ftp to grab the files */
  224.  
  225.   if (strlen (wgifs) != 0)
  226.     {
  227.       if (debug)
  228.     sprintf (command, "ftp -i -n -v %s", SITE);
  229.       else
  230.     sprintf (command, "ftp -i -n %s", SITE);
  231.  
  232.       if ((tosite = (FILE *) popen (command, "w")) == (FILE *) NULL)
  233.     {
  234.       fprintf (stderr, "%s: Can't popen!?!", argv[0]);
  235.       exit (1);
  236.     }
  237.       fprintf (tosite, "user anonymous %s@%s\n", getlogin (), DOMAIN);
  238.       fputs ("bin\n", tosite);
  239.       fprintf (tosite, "cd %s\n", DIR);
  240.       fprintf (tosite, "mget %s\n", wgifs);
  241.       fputs ("quit\n", tosite);
  242.       pclose (tosite);
  243.  
  244.       if (!nodis)
  245.     {
  246.       if (background)
  247.         sprintf (dispstr, "%s %s %s", DISP, BKGRDOPTS, wgifs);
  248.       else
  249.         sprintf (dispstr, "%s %s", DISP, wgifs);
  250.       system (dispstr);
  251.     }
  252.  
  253.       if (!norm)
  254.     {
  255.       filename = strtok (wgifs, " ");
  256.       while (filename != (char *) NULL)
  257.         {
  258.           /* no use checking what unlink returns because I don't care */
  259.           unlink (filename);
  260.           filename = strtok ((char *) NULL, " ");
  261.         }
  262.     }
  263.     }
  264.   exit (0);
  265. }
  266.  
  267. struct tm *
  268. thetime (time_t s_off, struct tm *tp, char *name)
  269. {
  270.   time_t datime;
  271.  
  272.   if ((datime = time ((time_t *) NULL)) == (time_t) - 1)
  273.     {
  274.       fprintf (stderr, "%s: time unavailable?!?\n", name);
  275.       exit (1);
  276.     }
  277.   datime -= s_off;
  278.   if ((tp = gmtime (&datime)) == (struct tm *) NULL)
  279.     {
  280.       fprintf (stderr, "%s: Coordinated Universal Time unavailable??\n", name);
  281.       exit (1);
  282.     }
  283.   return (tp);
  284. }
  285.  
  286. void
  287. usage ()
  288. {
  289.   fputs ("Usage: getwxmap [ -R -D -d -s -r -v -u# ]\n", stderr);
  290.   fputs ("getwxmap [ -RDdsrvu# ]\n", stderr);
  291.   fputs ("getwxmap [ RDdsrvu# ]\n", stderr);
  292.   fputs ("-D if you don't want the files displayed\n", stderr);
  293.   fputs ("-R if you don't want the files removed after displaying\n", stderr);
  294.   fputs ("-b for background, root window\n", stderr);
  295.   fputs ("-d for debugging\n", stderr);
  296.   fputs ("-s For the Surface Anaylsis map\n", stderr);
  297.   fputs ("-r for the Infra Red Light Map\n", stderr);
  298.   fputs ("-v for Visible Light Map\n", stderr);
  299.   fputs ("-u# for the Upper Air maps at a # * 100 hPa itervals\n", stderr);
  300.   fputs ("(# = 2,3,5,7,8 for 200hPa, 300hPa, 500hPa, 700hPa, 800hPa respectively)\n", stderr);
  301.   return;
  302. }
  303.