// C++ Rahmenprogramm. Es liest ein PGM von stdin und schreibt nach stdout
// Die Funktion raining() ist das Herzstück :-)
// Das Progrmm benötigt libnetpbm  ("apt-get install libnetpbm10-dev")
//
// Compilieren:
//   c++ -Wall -O3 -libnetpbm -o stub stub.cc
//

extern "C"
{
#include <pgm.h>
}

#include <cstdio>
#include <vector>

using namespace std;

typedef vector< vector<unsigned int> > Array;

// to be defined
void raining(int w, int h, const Array& in, Array& out);

Array in, out;
int Width = 0;
int Height = 0;
gray maxval = 0;


// liest ein PGM von stdin und initialisiert 'in' und 'out'
void read_pgm()
{
	gray** data = pgm_readpgm(stdin, &Width, &Height, &maxval);
	fprintf(stderr, "(%dx%d) max=%d\n", Width, Height, maxval);
	in.resize(Height);
	out.resize(Height);
	
	for(int y=0;y<Height;++y)
	{
		in[y].resize(Width);
		out[y].resize(Width);

		for(int x=0; x<Width; ++x)
		{
			in[y][x] = data[y][x];
		}
	}
	
	pgm_freearray(data, Height);
}

// schreibt 'out' als PGM nach stdout
void write_pgm()
{
	pgm_writepgminit(stdout, Width, Height, maxval, 0);
	for(int y=0; y<Height; ++y)
	{
		pgm_writepgmrow(stdout, &out[y][0], Width, maxval, 0);
	}
}

int main()
{
	read_pgm();
	raining(Width, Height, in, out);
	write_pgm();
}

////////////////////////////////////////////////////////////////////////////

// Beispielfunktion
void raining(int w, int h, const Array& in, Array& out)
{
	for(int y=0; y<h; ++y)
	for(int x=0; x<w; ++x)
	{
		out[y][x] = in[y][x] * 5;
	}
}


syntax highlighted by Code2HTML, v. 0.9.1