home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / software / unix / saoimage / sao1_07.tar / irafcrd.c < prev    next >
C/C++ Source or Header  |  1990-04-20  |  7KB  |  223 lines

  1. #ifndef lint
  2. static char SccsId[] = "%W%  %G%";
  3. #endif
  4.  
  5. /* Module:    irafcrd.c (IRAF Coordinates)
  6.  * Purpose:    Parse wcs filename string for IRAF subsection coordinates
  7.  * Subroutine:    guess_true_file_coords()    returns: int
  8.  * Copyright:    1989 Smithsonian Astrophysical Observatory
  9.  *        You may do anything you like with this file except remove
  10.  *        this copyright.  The Smithsonian Astrophysical Observatory
  11.  *        makes no representations about the suitability of this
  12.  *        software for any purpose.  It is provided "as is" without
  13.  *        express or implied warranty.
  14.  * Modified:    {0} Michael VanHilst                7 Nov 1989
  15.  *        {1} MVH bug fix in guess_true_file_coords    7 Dec 1989
  16.  *              {2} MVH BSDonly strings.h compatability           19 Feb 1990
  17.  *        {n} <who> -- <does what> -- <when>
  18.  */
  19.  
  20. #ifdef IMTOOL
  21.  
  22. #include <stdio.h>        /* stderr, FILE, NULL, etc. */
  23.  
  24. #ifndef VMS
  25. #ifdef SYSV
  26. #include <string.h>        /* strlen, strcat, strcpy, strrchr */
  27. #else
  28. #include <strings.h>        /* strlen, strcat, strcpy, rindex */
  29. #define strchr index
  30. #define strrchr rindex
  31. #endif
  32. #else
  33. #include <string.h>        /* strlen, strcat, strcpy, strrchr */
  34. #endif
  35.  
  36. #include <ctype.h>              /* isspace */
  37. #include <X11/Xlib.h>        /* get X types and constants */
  38. #include <X11/Xutil.h>        /* X window manager stuff */
  39. #include "hfiles/struct.h"    /* declare structure types */
  40. #include "hfiles/extern.h"    /* extern main SAOimage parameter structures */
  41.  
  42. /*
  43.  * Subroutine:    guess_true_file_coords
  44.  * Purpose:    Parse wcs filename string for the user's "rect" subsection.
  45.  *        If found and parsed, compute new transform for file coord.
  46.  * Returns:    1 if subsection found and parsed successfully, else 0
  47.  */
  48. int guess_true_file_coords ( title )
  49.      char *title;
  50. {
  51.   int xoff, yoff, block;
  52.   float fblock;
  53.   Transform imgtoaux;
  54.   static int parse_iraf_subsection();
  55.   void set_trans_speed(), combine_transform(), clear_coord_area();
  56.  
  57.   if( parse_iraf_subsection(title, &xoff, &yoff, &block) == 0 ) {
  58.     if( coord.imtool_aux )
  59.       clear_coord_area();
  60.     return( 0 );
  61.   }
  62.   /* if this does nothing, don't bother */
  63.   if( (xoff == 0) && (yoff == 0) && (block == 1) )
  64.     return( 0 );
  65.   /* install its coordinate transform matrix */
  66.   fblock = (float)block;
  67.   imgtoaux.inx_outx = coord.imgtofile.inx_outx * fblock;
  68.   imgtoaux.iny_outx = coord.imgtofile.iny_outx * fblock;
  69.   imgtoaux.inx_outy = coord.imgtofile.inx_outy * fblock;
  70.   imgtoaux.iny_outy = coord.imgtofile.iny_outy * fblock;
  71.   imgtoaux.iadd_outx = (xoff - 1) +
  72.     ((fblock * coord.imgtofile.iadd_outx) - ((fblock - 1) * 0.5));
  73.   imgtoaux.iadd_outy = (yoff - 1) +
  74.     ((fblock * coord.imgtofile.iadd_outy) - ((fblock - 1) * 0.5));
  75.   /* fill in the missing add_out params */
  76.   if( imgtoaux.iny_outx == 0.0 ) {
  77.     imgtoaux.add_outx = imgtoaux.iadd_outx - (0.5 * imgtoaux.inx_outx);
  78.     imgtoaux.add_outy = imgtoaux.iadd_outy - (0.5 * imgtoaux.iny_outy);
  79.   } else {
  80.     imgtoaux.add_outx = imgtoaux.iadd_outx - (0.5 * imgtoaux.iny_outx);
  81.     imgtoaux.add_outy = imgtoaux.iadd_outy - (0.5 * imgtoaux.inx_outy);
  82.   }
  83.   /* compute speedy integer computation parameters */
  84.   set_trans_speed(&imgtoaux);
  85.   /* compute transform from file to aux (by going file to img to aux) */
  86.   combine_transform(&coord.filetoaux, &coord.filetoimg, &imgtoaux);
  87.   return( 1 );
  88. }
  89.  
  90. /*
  91.  * Subroutine:    parse_iraf_subsection
  92.  * Purpose:    Parse for subsection and blocking from the image name
  93.  * Returns:    1 if subsection or blocking was used, else 0
  94.  */
  95. static int parse_iraf_subsection ( s, xoff, yoff, block )
  96.      char *s;            /* i: file name */
  97.      int *xoff;            /* o: x offset */
  98.      int *yoff;            /* o: y offset */
  99.      int *block;        /* o: block */
  100. {
  101.   char *t, *u;            /* temp char pointers */
  102.   static char *fn_substr();    /* look for a substr */
  103.   static void get_subsection_offsets();
  104.  
  105.   /* seed the default values */
  106.   *xoff = 1;
  107.   *yoff = 1;
  108.   *block=1;
  109.   /* look for a left bracket */
  110.   t = fn_substr(s, "[");
  111.   /* no bracket => no offsets or block */
  112.   if( t ==0 )
  113.     return( 0 );
  114.   /* check for qp file identifier */
  115.   u = fn_substr(s, ".qp");
  116.   if( (u !=0) && (u < t) ) {
  117.     /* look for the rect substring */
  118.     u = fn_substr(t, "rect=(" );
  119.     /* if we find rect, grab the initial x offset */
  120.     if( u !=0 )
  121.       get_subsection_offsets (u, xoff, yoff, 1);
  122.     /* look for the block substring */
  123.     u = fn_substr(t, "block=" );
  124.     /* if we find the block, grab the block factor */
  125.     if( u !=0 ) {
  126.       /* might have to skip '(' */
  127.       while( *u == '(' )
  128.     *u++;
  129.       *block = atoi(u);
  130.     }
  131.   } else {
  132.     /* iraf sends subsection coords for qp with "rect=", else file coords */
  133.     return( 0 );
  134.   }
  135.   return( 1 );
  136. }
  137.  
  138. /*
  139.  * Subroutine:    get_subsection_offsets
  140.  * Purpose:    parse subsection syntax for x and y offsets of subsection
  141.  */
  142. static void get_subsection_offsets ( s, xoff, yoff, is_qp )
  143.      char *s;
  144.      int *xoff, *yoff;
  145.      int is_qp;        /* i: file is qp (uses () around subsection) */
  146. {
  147.   int x1, x2;
  148.   int y1, y2;
  149.   char *sy, *s2, *st;
  150.   static char *fn_substr();
  151.  
  152.   /* if not qp, grab the initial x offset right after the '[' */
  153.   sy = fn_substr(s, ",");
  154.   if( is_qp )
  155.     st = strchr(s, ')');
  156.   else
  157.     st = strchr(s, ']');
  158.   if( (x1 = atoi(s)) > 1 ) {
  159.     s2 = fn_substr(s, ":");
  160.     /* make sure ':' was found and isn't that for y coords */
  161.     if( (s2 != NULL) && ((sy == NULL) || (s2 < sy)) ) {
  162.       x2 = atoi(s2);
  163.       if( (x2 <= 0) || (x2 > x1) )
  164.     *xoff = x1;
  165.       else
  166.     /* giving lower x2 reverses column order, offset is from x2 */
  167.     *xoff = x2;
  168.     } else
  169.       *xoff = x1;
  170.   }
  171.   /* if there was a comma and a y subsection given */
  172.   if( (sy != NULL) && (sy < st) && ((y1 = atoi(sy)) > 1) ) {
  173.     s2 = fn_substr(sy, ":");
  174.     /* make sure ':' was found and is for the subsection */
  175.     if( (s2 != NULL) && (s2 < st) ) {
  176.       y2 = atoi(s2);
  177.       if( (y2 <= 0) || (y2 > y1) )
  178.     *yoff = y1;
  179.       else
  180.     *yoff = y2;
  181.     } else
  182.       *yoff = y1;
  183.   }
  184.   if( *xoff <= 0 )
  185.     *xoff = 1;
  186.   if( *yoff <= 0 )
  187.     *yoff = 1;
  188. }
  189.  
  190. /*
  191.  * Subroutine:    fn_substr
  192.  * Purpose:    Find the next instance of a string in another string 
  193.  * Note:    This routine is a bit different in that it ignores spaces
  194.  *        in checking and returns a pointer after the substring
  195.  */
  196. static char *fn_substr ( s, p )
  197.      char *s;    /* i: string to be searched */
  198.      char *p;    /* i: pattern sought in s */
  199. {
  200.   char *sl;    /* pointer to the local part of s */
  201.   char *tp;    /* local pointer in p */
  202.   char *sp;    /* local pointer in s */
  203.  
  204.   /* if the pattern we are searching is null, no sense going on */
  205.   if( *p == '\0' )
  206.     return( NULL );
  207.   sl = s;
  208.   /* look through the mother string */
  209.   while( (sl = strchr(sl,*p)) != 0 )
  210.     {
  211.       for( sp=sl,tp=p; (*tp)&&((*sp == *tp)||(isspace(*sp))); sp++ )
  212.     /* if we found a space, we can't bump the t pointer */
  213.     if( !isspace(*sp) )
  214.        tp++;
  215.       if( *tp == '\0' )
  216.     return(sp);  /* found one */
  217.       sl++;  /* advance a character */
  218.     }
  219.   return( NULL );
  220. }
  221.  
  222. #endif
  223.