home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume5 / pbm3 / part4 / libpbm2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-02-03  |  2.4 KB  |  143 lines

  1. /* libpbm2.c - pbm utility library part 2
  2. **
  3. ** Copyright (C) 1988 by Jef Poskanzer.
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include <stdio.h>
  14. #include "pbm.h"
  15. #include "libpbm.h"
  16.  
  17.  
  18. static char
  19. pbm_getc( file )
  20. FILE *file;
  21.     {
  22.     int ich;
  23.     char ch;
  24.  
  25.     ich = getc( file );
  26.     if ( ich == NULL )
  27.     {
  28.     fprintf( stderr, "Premature EOF.\n" );
  29.     exit( 1 );
  30.     }
  31.     ch = (char) ich;
  32.     
  33.     if ( ch == '#' )
  34.     {
  35.     do
  36.         {
  37.         ich = getc( file );
  38.         if ( ich == NULL )
  39.         {
  40.         fprintf( stderr, "Premature EOF.\n" );
  41.         exit( 1 );
  42.         }
  43.         ch = (char) ich;
  44.         }
  45.     while ( ch != '\n' );
  46.     }
  47.  
  48.     return ch;
  49.     }
  50.  
  51. static int
  52. pbm_getint( file )
  53. FILE *file;
  54.     {
  55.     char ch;
  56.     int i;
  57.  
  58.     do
  59.     {
  60.     ch = pbm_getc( file );
  61.     }
  62.     while ( ch == ' ' || ch == '\t' || ch == '\n' );
  63.  
  64.     if ( ch < '0' || ch > '9' )
  65.     {
  66.     fprintf( stderr, "Junk in file where an integer should be!\n" );
  67.     exit( 1 );
  68.     }
  69.  
  70.     i = 0;
  71.     do
  72.     {
  73.     i = i * 10 + ch - '0';
  74.     ch = pbm_getc( file );
  75.         }
  76.     while ( ch >= '0' && ch <= '9' );
  77.  
  78.     return i;
  79.     }
  80.  
  81. static bit
  82. pbm_getbit( file )
  83. FILE *file;
  84.     {
  85.     char ch;
  86.  
  87.     do
  88.     {
  89.     ch = pbm_getc( file );
  90.     }
  91.     while ( ch == ' ' || ch == '\t' || ch == '\n' );
  92.  
  93.     if ( ch != '0' && ch != '1' )
  94.     {
  95.     fprintf( stderr, "Junk in file where bits should be!\n" );
  96.     exit( 1 );
  97.     }
  98.  
  99.     return ( ch == '1' ) ? 1 : 0;
  100.     }
  101.  
  102.  
  103. bit **
  104. pbm_readpbm( file, colsP, rowsP )
  105. FILE *file;
  106. int *colsP, *rowsP;
  107.     {
  108.     int ich1, ich2;
  109.     bit **bits;
  110.     int row, col;
  111.  
  112.     /* Check for magic number. */
  113.     ich1 = getc( file );
  114.     if ( ich1 == NULL )
  115.     {
  116.     fprintf( stderr, "Premature EOF.\n" );
  117.     exit( 1 );
  118.     }
  119.     ich2 = getc( file );
  120.     if ( ich2 == NULL )
  121.     {
  122.     fprintf( stderr, "Premature EOF.\n" );
  123.     exit( 1 );
  124.     }
  125.     if ( ich1 != PBM_MAGIC1 || ich2 != PBM_MAGIC2 )
  126.     {
  127.     fprintf( stderr, "Bad magic number - not a pbm file.\n" );
  128.     exit( 1 );
  129.     }
  130.  
  131.     /* Read size. */
  132.     *colsP = pbm_getint( file );
  133.     *rowsP = pbm_getint( file );
  134.  
  135.     bits = pbm_allocarray( *colsP, *rowsP );
  136.  
  137.     for ( row = 0; row < *rowsP; row++ )
  138.         for ( col = 0; col < *colsP; col++ )
  139.         bits[row][col] = pbm_getbit( file );
  140.  
  141.     return bits;
  142.     }
  143.