home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / gbmsrc.zip / gbmhdr.c < prev    next >
C/C++ Source or Header  |  1998-12-31  |  4KB  |  206 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. #if defined(AIX) || defined(LINUX)
  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 "gbm.h"
  28.  
  29. /*...vgbm\46\h:0:*/
  30. /*...e*/
  31.  
  32. static char progname[] = "gbmhdr";
  33.  
  34. /*...susage:0:*/
  35. static void usage(void)
  36.     {
  37.     int ft, n_ft;
  38.  
  39.     fprintf(stderr, "usage: %s [-g] [-s] [--] {fn.ext{,opt}}\n", progname);
  40.     fprintf(stderr, "       -g            don't guess bitmap format, try each type\n");
  41.     fprintf(stderr, "       -s            be silent about errors\n");
  42.     fprintf(stderr, "       fn.ext{,opt}  input filenames (with any format specific options)\n");
  43.     gbm_init();
  44.     gbm_query_n_filetypes(&n_ft);
  45.     for ( ft = 0; ft < n_ft; ft++ )
  46.         {
  47.         GBMFT gbmft;
  48.  
  49.         gbm_query_filetype(ft, &gbmft);
  50.         fprintf(stderr, "                     %s when ext in [%s]\n",
  51.             gbmft.short_name, gbmft.extensions);
  52.         }
  53.     gbm_deinit();
  54.  
  55.     fprintf(stderr, "       opt           bitmap format specific option to pass to bitmap reader\n");
  56.  
  57.     exit(1);
  58.     }
  59. /*...e*/
  60. /*...smain:0:*/
  61. static BOOLEAN guess = TRUE;
  62. static BOOLEAN silent = FALSE;
  63.  
  64. /*...sshow_error:0:*/
  65. static void show_error(const char *fn, const char *reason)
  66.     {
  67.     if ( !silent )
  68.         fprintf(stderr, "%s: %s - %s\n", progname, fn, reason);
  69.     }
  70. /*...e*/
  71. /*...sshow:0:*/
  72. /*...sshow_guess:0:*/
  73. static void show_guess(const char *fn, const char *opt, int fd)
  74.     {
  75.     int ft, rc;
  76.     long filelen, datalen;
  77.     GBMFT gbmft;
  78.     GBM gbm;
  79.  
  80.     if ( gbm_guess_filetype(fn, &ft) != GBM_ERR_OK )
  81.         {
  82.         gbm_io_close(fd);
  83.         show_error(fn, "can't guess bitmap file format from extension");
  84.         return;
  85.         }
  86.  
  87.     gbm_query_filetype(ft, &gbmft);
  88.  
  89.     if ( (rc = gbm_read_header(fn, fd, ft, &gbm, opt)) != GBM_ERR_OK )
  90.         {
  91.         char s[100+1];
  92.         gbm_io_close(fd);
  93.         sprintf(s, "can't read file header: %s", gbm_err(rc));
  94.         show_error(fn, s);
  95.         return;
  96.         }
  97.  
  98.     filelen = gbm_io_lseek(fd, 0L, SEEK_END);
  99.     datalen = (gbm.w*gbm.h*gbm.bpp)/8;
  100.     printf("%4dx%-4d %2dbpp %5ldKb %3d%% %-10s %s\n",
  101.         gbm.w, gbm.h, gbm.bpp,
  102.         (filelen+1023)/1024,
  103.         (filelen*100)/datalen,
  104.         gbmft.short_name,
  105.         fn);
  106.     }
  107. /*...e*/
  108. /*...sshow_noguess:0:*/
  109. static void show_noguess(const char *fn, const char *opt, int fd)
  110.     {
  111.     int ft, n_ft;
  112.     GBMFT gbmft;
  113.  
  114.     printf("%5ldKb %s\n",
  115.         (gbm_io_lseek(fd, 0L, SEEK_END) + 1023) / 1024,
  116.         fn);
  117.  
  118.     if ( gbm_guess_filetype(fn, &ft) == GBM_ERR_OK )
  119.         {
  120.         gbm_query_filetype(ft, &gbmft);
  121.         printf("  file extension suggests bitmap format may be %-10s\n",
  122.             gbmft.short_name);
  123.         }
  124.  
  125.     gbm_query_n_filetypes(&n_ft);
  126.  
  127.     for ( ft = 0; ft < n_ft; ft++ )
  128.         {
  129.         GBM gbm;
  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(const char *fn, const 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 = gbm_io_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.     gbm_io_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.     else if ( argv[i][1] == '-' )
  180.         { ++i; break; }
  181.     switch ( argv[i][1] )
  182.         {
  183.         case 'g':    guess = FALSE;    break;
  184.         case 's':    silent = TRUE;    break;
  185.         default:    usage();    break;
  186.         }
  187.     }
  188. /*...e*/
  189.  
  190.     for ( ; i < argc; i++ )
  191. /*...shandle a filename argument:16:*/
  192. {
  193. char fn[500+1], *opt;
  194. strncpy(fn, argv[i], 500);
  195. if ( (opt = strchr(fn, ',')) != NULL )
  196.     *opt++ = '\0';
  197. else
  198.     opt = "";
  199. show(fn, opt);
  200. }
  201. /*...e*/
  202.         
  203.     return 0;
  204.     }
  205. /*...e*/
  206.