Added HangmanGame class, but does not work yet

Dependencies:   SDFileSystem app epson mbed msp430 pl tests

pnm-utils.c

Committer:
group-FlexBook
Date:
2017-12-04
Revision:
0:fa7450a43b99

File content as of revision 0:fa7450a43b99:

/*
  Plastic Logic EPD project on MSP430

  Copyright (C) 2013, 2014 Plastic Logic Limited

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
/*
 * pnm-utils.c -- Utilities for dealing with PNM format graphics files
 *
 * Authors:
 *   Nick Terry <nick.terry@plasticlogic.com>
 *   Guillaume Tucker <guillaume.tucker@plasticlogic.com>
 *
 * Utilities for dealing with PNM format graphics files
 * We are only interested in PGM and PBM
 *
 * Details of the format can be found at:
 * http://en.wikipedia.org/wiki/Netpbm_format
 * However, this seems to indicate that the header format is more free format
 * http://paulbourke.net/dataformats/ppm/
 * Lines terminated with cr and/or lf or just white space
 * Header example 1
 * P6 1024 788 255
 * Header example 2
 * P6
 * 1024 788
 * # A comment
 * 255
 * Header example 3
 * P3
 * 1024 # the image width
 * 788 # the image height
 * # A comment
 * 1023
 *
 *
 * P4
 * # Comment string
 * 24 7
 *
 * P5
 * # Comment string
 * 24 7
 * 15
 *
 */

#include <stdlib.h>
#include "assert.h"
#include "ChaN/ff.h"
#include "pnm-utils.h"

int pnm_read_int32(FIL *pnm_file, int32_t *value)
{
	UINT count;
	char ch;
	int digits = 0;
	int in_comment = 0;
	int found = 0;
	int32_t val = 0;

	assert(pnm_file != NULL);
	assert(value != NULL);

	while (!found &&
			(f_read(pnm_file,&ch,1,&count) == FR_OK) && count == 1)
	{
		switch (ch)
		{
			case '#':
				in_comment = 1;
				break;
			case ' ':
			case '\t':
			case '\r':
			case '\n':
				if (!in_comment)
				{
					if (digits) {
						found = 1;
					}
				}
				if (ch == '\r' || ch == '\n')
					in_comment = 0;
				break;
			case '0': case '1': case '2': case '3': case '4':
			case '5': case '6': case '7': case '8': case '9':
				if (!in_comment) {
					val = val * 10 + (ch - '0');
					digits++;

					if (f_eof(pnm_file)) {
						found = 1;
					}
				}
				break;
			default:
				break;
		}
	}

	if (!found)
		return -1;

	*value = val;

	return 0;
}

int pnm_read_header(FIL *pnm_file, struct pnm_header *hdr)
{
	char buffer[2];
	UINT count;

	assert(pnm_file);
	assert(hdr);

	hdr->type = PNM_UNKNOWN;

	if (f_read(pnm_file,buffer,2,&count) != FR_OK)
		goto read_error;

	if (buffer[0] != 'P')
		goto format_error;

	if (buffer[1] == '4')
		hdr->type = PNM_BITMAP;
	else if (buffer[1] == '5')
		hdr->type = PNM_GREYSCALE;
	else
		goto format_error;

	hdr->max_gray = 1;
	hdr->width = pnm_read_int(pnm_file);
	hdr->height = pnm_read_int(pnm_file);

	if (hdr->type == PNM_GREYSCALE) {
		hdr->max_gray = pnm_read_int(pnm_file);
	}
	// check to see if any of the data items were not read correctly
	if (hdr->width <= 0 || hdr->height <= 0 || hdr->max_gray <= 0)
		goto format_error;

	// read pointer is now positioned at start of image data
	return 0;

format_error:
read_error:
	return -1;
}