home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / rexx / library2 / gbmrexx / gbm / gbmhdr.c < prev    next >
C/C++ Source or Header  |  1993-09-27  |  4KB  |  204 lines

  1. /*
  2.  
  3. GBMHDR.C  Display General Bitmaps header
  4.  
  5. */
  6.  
  7. /*...sincludes:0:*/
  8. #include <stdio.h>
  9. #include <ctype.h>
  10. #include <string.h>
  11. #include <stddef.h>
  12. #include <stdlib.h>
  13. #include <stdarg.h>
  14. #include <memory.h>
  15. #include <malloc.h>
  16. #ifdef AIX
  17. #include <unistd.h>
  18. #else
  19. #include <io.h>
  20. #endif
  21. #include <fcntl.h>
  22. #include <sys/types.h>
  23. #include <sys/stat.h>
  24. #ifndef O_BINARY
  25. #define    O_BINARY    0
  26. #endif
  27. #include "standard.h"
  28. #include "gbm.h"
  29.  
  30. /*...vgbm\46\h:0:*/
  31. /*...e*/
  32.  
  33. static char progname [] = "gbmhdr";
  34. static char sccs_id [] = "@(#)Display General Bitmap Header  27/9/93";
  35.  
  36. /*...susage:0:*/
  37. static void usage(void)
  38.     {
  39.     int    ft, n_ft;
  40.  
  41.     fprintf(stderr, "usage: %s [-g] [-s] {fn.ext{,opt}}\n", progname);
  42.     fprintf(stderr, "       -g            don't guess bitmap format, try each type\n");
  43.     fprintf(stderr, "       -s            be silent about errors\n");
  44.     fprintf(stderr, "       fn.ext{,opt}  input filenames (with any format specific options)\n");
  45.     gbm_init();
  46.     gbm_query_n_filetypes(&n_ft);
  47.     for ( ft = 0; ft < n_ft; ft++ )
  48.         {
  49.         GBMFT gbmft;
  50.  
  51.         gbm_query_filetype(ft, &gbmft);
  52.         fprintf(stderr, "                     %s when ext in [%s]\n",
  53.             gbmft.short_name, gbmft.extensions);
  54.         }
  55.     gbm_deinit();
  56.  
  57.     fprintf(stderr, "       opt           bitmap format specific option to pass to bitmap reader\n");
  58.  
  59.     exit(1);
  60.     }
  61. /*...e*/
  62. /*...smain:0:*/
  63. static BOOLEAN guess = TRUE;
  64. static BOOLEAN silent = FALSE;
  65.  
  66. /*...sshow_error:0:*/
  67. static void show_error(char *fn, char *reason)
  68.     {
  69.     if ( !silent )
  70.         fprintf(stderr, "%s: %s - %s\n", progname, fn, reason);
  71.     }
  72. /*...e*/
  73. /*...sshow:0:*/
  74. /*...sshow_guess:0:*/
  75. static void show_guess(char *fn, char *opt, int fd)
  76.     {
  77.     int ft, rc;
  78.     GBMFT gbmft;
  79.     GBM gbm;
  80.  
  81.     if ( gbm_guess_filetype(fn, &ft) != GBM_ERR_OK )
  82.         {
  83.         close(fd);
  84.         show_error(fn, "can't guess bitmap file format from extension");
  85.         return;
  86.         }
  87.  
  88.     gbm_query_filetype(ft, &gbmft);
  89.  
  90.     if ( (rc = gbm_read_header(fn, fd, ft, &gbm, opt)) != GBM_ERR_OK )
  91.         {
  92.         char s [100+1];
  93.         close(fd);
  94.         sprintf(s, "can't read file header: %s", gbm_err(rc));
  95.         show_error(fn, s);
  96.         return;
  97.         }
  98.  
  99.     printf("%4dx%-4d %2dbpp %5ldKb %-10s %s\n",
  100.         gbm.w, gbm.h, gbm.bpp,
  101.         (lseek(fd, 0L, SEEK_END) + 1023) / 1024,
  102.         gbmft.short_name,
  103.         fn);
  104.     }
  105. /*...e*/
  106. /*...sshow_noguess:0:*/
  107. static void show_noguess(char *fn, char *opt, int fd)
  108.     {
  109.     int ft, n_ft;
  110.     GBMFT gbmft;
  111.  
  112.     printf("%5ldKb %s\n",
  113.         (lseek(fd, 0L, SEEK_END) + 1023) / 1024,
  114.         fn);
  115.  
  116.     if ( gbm_guess_filetype(fn, &ft) == GBM_ERR_OK )
  117.         {
  118.         gbm_query_filetype(ft, &gbmft);
  119.         printf("  file extension suggests bitmap format may be %-10s\n",
  120.             gbmft.short_name);
  121.         }
  122.  
  123.     gbm_query_n_filetypes(&n_ft);
  124.  
  125.     for ( ft = 0; ft < n_ft; ft++ )
  126.         {
  127.         GBM gbm;
  128.  
  129.         lseek(fd, 0, SEEK_SET);
  130.         if ( gbm_read_header(fn, fd, ft, &gbm, opt) == GBM_ERR_OK )
  131.             {
  132.             gbm_query_filetype(ft, &gbmft);
  133.             printf("  reading header suggests bitmap format may be %-10s - %4dx%-4d %2dbpp\n",
  134.                 gbmft.short_name, gbm.w, gbm.h, gbm.bpp);
  135.             }
  136.         }
  137.     }
  138. /*...e*/
  139.  
  140. static void show(char *fn, char *opt)
  141.     {
  142.     int    fd;
  143.     struct stat buf;
  144.  
  145.     if ( stat(fn, &buf) != -1 && (buf.st_mode & S_IFDIR) == S_IFDIR )
  146.         /* Is a directory */
  147.         {
  148.         show_error(fn, "is a directory");
  149.         return;
  150.         }
  151.  
  152.     if ( (fd = open(fn, O_RDONLY | O_BINARY)) == -1 )
  153.         {
  154.         show_error(fn, "can't open");
  155.         return;
  156.         }
  157.  
  158.     if ( guess )
  159.         show_guess(fn, opt, fd);
  160.     else
  161.         show_noguess(fn, opt, fd);
  162.  
  163.     close(fd);
  164.     }
  165. /*...e*/
  166.  
  167. int main(int argc, char *argv [])
  168.     {
  169.     int i;
  170.  
  171. /*...sprocess command line options:8:*/
  172. if ( argc == 1 )
  173.     usage();
  174.  
  175. for ( i = 1; i < argc; i++ )
  176.     {
  177.     if ( argv [i][0] != '-' )
  178.         break;
  179.     switch ( argv [i][1] )
  180.         {
  181.         case 'g':    guess = FALSE;    break;
  182.         case 's':    silent = TRUE;    break;
  183.         default:    usage();    break;
  184.         }
  185.     }
  186. /*...e*/
  187.  
  188.     for ( ; i < argc; i++ )
  189. /*...shandle a filename argument:16:*/
  190. {
  191. char fn [500+1], *opt;
  192. strncpy(fn, argv [i], 500);
  193. if ( (opt = strchr(fn, ',')) != NULL )
  194.     *opt++ = '\0';
  195. else
  196.     opt = "";
  197. show(fn, opt);
  198. }
  199. /*...e*/
  200.         
  201.     return ( 0 );
  202.     }
  203. /*...e*/
  204.