00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_IO_PNM_LOAD_HEADER_HH
00027 # define MLN_IO_PNM_LOAD_HEADER_HH
00028
00032
00033 # include <cstdlib>
00034 # include <iostream>
00035 # include <fstream>
00036 # include <string>
00037
00038
00039 namespace mln
00040 {
00041
00042 namespace io
00043 {
00044
00045 namespace pnm
00046 {
00047
00048 # ifndef MLN_INCLUDE_ONLY
00049
00050 inline
00051 bool read_header(std::ifstream& istr,
00052 char& type,
00053 int& nrows, int& ncols,
00054 unsigned int& maxval,
00055 bool test = false)
00056 {
00057
00058 if (istr.get() != 'P' )
00059 goto err;
00060 type = static_cast<char>(istr.get());
00061
00062 if (type < '1' || type > '6')
00063 goto err;
00064 if (istr.get() != '\n')
00065 goto err;
00066
00067
00068 while (istr.peek() == '#')
00069 {
00070 std::string line;
00071 std::getline(istr, line);
00072 }
00073
00074
00075 istr >> ncols >> nrows;
00076 if (nrows <= 0 || ncols <= 0)
00077 goto err;
00078
00079
00080 if (istr.get() != '\n')
00081 goto err;
00082 if (type != '1' && type != '4')
00083 {
00084 istr >> maxval;
00085 if (istr.get() != '\n')
00086 goto err;
00087 }
00088 return true;
00089
00090 err:
00091 if (! test)
00092 {
00093 std::cerr << "error: badly formed header!";
00094 std::abort();
00095 }
00096 return false;
00097 }
00098
00099 inline
00100 void read_header(char ascii, char raw,
00101 std::ifstream& istr,
00102 char& type,
00103 int& nrows, int& ncols,
00104 unsigned int& maxval)
00105 {
00106 read_header(istr, type, nrows, ncols, maxval);
00107 if (! (type == ascii || type == raw))
00108 {
00109 std::cerr << "error: bad pnm type; "
00110 << "expected P" << ascii
00111 << " or P" << raw
00112 << ", get P" << type << "!";
00113 std::abort();
00114 }
00115 }
00116
00117 inline
00118 void read_header(char ascii, char raw,
00119 std::ifstream& istr,
00120 char& type,
00121 int& nrows, int& ncols)
00122 {
00123 unsigned int maxval;
00124 read_header(ascii, raw, istr, type,
00125 nrows, ncols, maxval);
00126 }
00127
00128 # endif // ! MLN_INCLUDE_ONLY
00129
00130 }
00131
00132 }
00133
00134 }
00135
00136
00137 #endif // ! MLN_IO_PNM_LOAD_HEADER_HH