[Scummvm-cvs-logs] CVS: scummvm/tools .cvsignore,NONE,1.1 convbdf.c,NONE,1.1 md5table.c,NONE,1.1 scumm-md5.txt,NONE,1.1 simon-md5.txt,NONE,1.1

Max Horn fingolfin at users.sourceforge.net
Thu Dec 23 17:44:10 CET 2004


Update of /cvsroot/scummvm/scummvm/tools
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1251

Added Files:
	.cvsignore convbdf.c md5table.c scumm-md5.txt simon-md5.txt 
Log Message:
Moving convbdf and md5table into scummvm/tools/

--- NEW FILE: .cvsignore ---
.deps
convbdf
md5table
--- NEW FILE: convbdf.c ---
/*
 * Convert BDF files to C++ source.
 *
 * Copyright (c) 2002 by Greg Haerr <greg at censoft.com>
 *
 * Originally writen for the Microwindows Project <http://microwindows.org>
 *
 * Greg then modified it for Rockbox <http://rockbox.haxx.se/>
 *
 * Max Horn took that version and changed it to work for ScummVM.
 * Changes include: warning fixes, removed .FNT output, output C++ source,
 * tweak code generator so that the generated code fits into ScummVM code base.
 *
 * What fun it is converting font data...
 *
 * 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 2
 * 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, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header: /cvsroot/scummvm/scummvm/tools/convbdf.c,v 1.1 2004/12/24 01:43:33 fingolfin Exp $
 *
 */
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/* BEGIN font.h*/
/* bitmap_t helper macros*/
#define BITMAP_WORDS(x)			(((x)+15)/16)	/* image size in words*/
#define BITMAP_BYTES(x)			(BITMAP_WORDS(x)*sizeof(bitmap_t))
#define BITMAP_BITSPERIMAGE		(sizeof(bitmap_t) * 8)
#define BITMAP_BITVALUE(n)		((bitmap_t) (((bitmap_t) 1) << (n)))
#define BITMAP_FIRSTBIT			(BITMAP_BITVALUE(BITMAP_BITSPERIMAGE - 1))
#define BITMAP_TESTBIT(m)	((m) & BITMAP_FIRSTBIT)
#define BITMAP_SHIFTBIT(m)	((bitmap_t) ((m) << 1))

typedef unsigned short bitmap_t; /* bitmap image unit size*/

/* builtin C-based proportional/fixed font structure */
/* based on The Microwindows Project http://microwindows.org */
struct font {
	char *	name;		/* font name*/
	int		maxwidth;	/* max width in pixels*/
	int		height;		/* height in pixels*/
	int		ascent;		/* ascent (baseline) height*/
	int		firstchar;	/* first character in bitmap*/
	int		size;		/* font size in glyphs*/
	bitmap_t*	bits;		/* 16-bit right-padded bitmap data*/
	unsigned long* offset;	/* offsets into bitmap data*/
	unsigned char* width;	/* character widths or NULL if fixed*/
	int		defaultchar;	/* default char (not glyph index)*/
	long	bits_size;	/* # words of bitmap_t bits*/
	
	/* unused by runtime system, read in by convbdf*/
	char *	facename;	/* facename of font*/
	char *	copyright;	/* copyright info for loadable fonts*/
	int		pixel_size;
	int		descent;
	int		fbbw, fbbh, fbbx, fbby;
};
/* END font.h*/

#define isprefix(buf,str)	(!strncmp(buf, str, strlen(str)))
#define strequal(s1,s2)		(!strcmp(s1, s2))

#define EXTRA	300		/* # bytes extra allocation for buggy .bdf files*/

int gen_map = 1;
int start_char = 0;
int limit_char = 65535;
int oflag = 0;
char outfile[256];

void usage(void);
void getopts(int *pac, char ***pav);
int convbdf(char *path);

void free_font(struct font* pf);
struct font* bdf_read_font(char *path);
int bdf_read_header(FILE *fp, struct font* pf);
int bdf_read_bitmaps(FILE *fp, struct font* pf);
char * bdf_getline(FILE *fp, char *buf, int len);
bitmap_t bdf_hexval(unsigned char *buf, int ndx1, int ndx2);

int gen_c_source(struct font* pf, char *path);

void error(const char *s, ...) {
	char buf[1024];
	va_list va;

	va_start(va, s);
	vsprintf(buf, s, va);
	va_end(va);

	fprintf(stderr, "ERROR: %s!\n", buf);

	exit(1);
}

void warning(const char *s, ...) {
	char buf[1024];
	va_list va;

	va_start(va, s);
	vsprintf(buf, s, va);
	va_end(va);

	fprintf(stderr, "WARNING: %s!\n", buf);
}

void
usage(void)
{
	char help[] = {
	"Usage: convbdf [options] [input-files]\n"
	"		convbdf [options] [-o output-file] [single-input-file]\n"
	"Options:\n"
	"	 -s N	Start output at character encodings >= N\n"
	"	 -l N	Limit output to character encodings <= N\n"
	"	 -n		Don't generate bitmaps as comments in .c file\n"
	};

	fprintf(stderr, help);
}

/* parse command line options*/
void getopts(int *pac, char ***pav)
{
	const char *p;
	char **av;
	int ac;
	
	ac = *pac;
	av = *pav;
	while (ac > 0 && av[0][0] == '-') {
		p = &av[0][1]; 
		while( *p)
			switch(*p++) {
			case ' ':			/* multiple -args on av[]*/
				while( *p && *p == ' ')
					p++;
				if( *p++ != '-')	/* next option must have dash*/
					p = "";
				break;			/* proceed to next option*/
			case 'n':			/* don't gen bitmap comments*/
				gen_map = 0;
				break;
			case 'o':			/* set output file*/
				oflag = 1;
				if (*p) {
					strcpy(outfile, p);
					while (*p && *p != ' ')
						p++;
				}
				else {
					av++; ac--;
					if (ac > 0)
						strcpy(outfile, av[0]);
				}
				break;
			case 'l':			/* set encoding limit*/
				if (*p) {
					limit_char = atoi(p);
					while (*p && *p != ' ')
						p++;
				}
				else {
					av++; ac--;
					if (ac > 0)
						limit_char = atoi(av[0]);
				}
				break;
			case 's':			/* set encoding start*/
				if (*p) {
					start_char = atoi(p);
					while (*p && *p != ' ')
						p++;
				}
				else {
					av++; ac--;
					if (ac > 0)
						start_char = atoi(av[0]);
				}
				break;
			default:
				fprintf(stderr, "Unknown option ignored: %c\r\n", *(p-1));
			}
		++av; --ac;
	}
	*pac = ac;
	*pav = av;
}

/* remove directory prefix and file suffix from full path*/
char *basename(char *path)
{
	char *p, *b;
	static char base[256];

	/* remove prepended path and extension*/
	b = path;
	for (p=path; *p; ++p) {
		if (*p == '/')
			b = p + 1;
	}
	strcpy(base, b);
	for (p=base; *p; ++p) {
		if (*p == '.') {
			*p = 0;
			break;
		}
	}
	return base;
}

int convbdf(char *path)
{
	struct font* pf;
	int ret = 0;

	pf = bdf_read_font(path);
	if (!pf)
		exit(1);
	
	if (!oflag) {
		strcpy(outfile, basename(path));
		strcat(outfile, ".cpp");
	}
	ret |= gen_c_source(pf, outfile);

	free_font(pf);
	return ret;
}

int main(int ac, char *av[])
{
	int ret = 0;

	++av; --ac;		/* skip av[0]*/
	getopts(&ac, &av);	/* read command line options*/

	if (ac < 1) {
		usage();
		exit(1);
	}
	if (oflag && ac > 1) {
		usage();
		exit(1);
	}
	
	while (ac > 0) {
		ret |= convbdf(av[0]);
		++av; --ac;
	}
	
	exit(ret);
}

/* free font structure*/
void free_font(struct font* pf)
{
	if (!pf)
		return;
	free(pf->name);
	free(pf->facename);
	free(pf->bits);
	free(pf->offset);
	free(pf->width);
	free(pf);
}

/* build incore structure from .bdf file*/
struct font* bdf_read_font(char *path)
{
	FILE *fp;
	struct font* pf;

	fp = fopen(path, "rb");
	if (!fp) {
		fprintf(stderr, "Error opening file: %s\n", path);
		return NULL;
	}
	
	pf = (struct font*)calloc(1, sizeof(struct font));
	if (!pf)
		goto errout;
	
	pf->name = strdup(basename(path));

	if (!bdf_read_header(fp, pf)) {
		fprintf(stderr, "Error reading font header\n");
		goto errout;
	}

	if (!bdf_read_bitmaps(fp, pf)) {
		fprintf(stderr, "Error reading font bitmaps\n");
		goto errout;
	}

	fclose(fp);
	return pf;

 errout:
	fclose(fp);
	free_font(pf);
	return NULL;
}

/* read bdf font header information, return 0 on error*/
int bdf_read_header(FILE *fp, struct font* pf)
{
	int encoding;
	int nchars, maxwidth;
	int firstchar = 65535;
	int lastchar = -1;
	char buf[256];
	char facename[256];
	char copyright[256];

	/* set certain values to errors for later error checking*/
	pf->defaultchar = -1;
	pf->ascent = -1;
	pf->descent = -1;

	for (;;) {
		if (!bdf_getline(fp, buf, sizeof(buf))) {
			fprintf(stderr, "Error: EOF on file\n");
			return 0;
		}
		if (isprefix(buf, "FONT ")) {		/* not required*/
			if (sscanf(buf, "FONT %[^\n]", facename) != 1) {
				fprintf(stderr, "Error: bad 'FONT'\n");
				return 0;
			}
			pf->facename = strdup(facename);
			continue;
		}
		if (isprefix(buf, "COPYRIGHT ")) {	/* not required*/
			if (sscanf(buf, "COPYRIGHT \"%[^\"]", copyright) != 1) {
				fprintf(stderr, "Error: bad 'COPYRIGHT'\n");
				return 0;
			}
			pf->copyright = strdup(copyright);
			continue;
		}
		if (isprefix(buf, "DEFAULT_CHAR ")) {	/* not required*/
			if (sscanf(buf, "DEFAULT_CHAR %d", &pf->defaultchar) != 1) {
				fprintf(stderr, "Error: bad 'DEFAULT_CHAR'\n");
				return 0;
			}
		}
		if (isprefix(buf, "FONT_DESCENT ")) {
			if (sscanf(buf, "FONT_DESCENT %d", &pf->descent) != 1) {
				fprintf(stderr, "Error: bad 'FONT_DESCENT'\n");
				return 0;
			}
			continue;
		}
		if (isprefix(buf, "FONT_ASCENT ")) {
			if (sscanf(buf, "FONT_ASCENT %d", &pf->ascent) != 1) {
				fprintf(stderr, "Error: bad 'FONT_ASCENT'\n");
				return 0;
			}
			continue;
		}
		if (isprefix(buf, "FONTBOUNDINGBOX ")) {
			if (sscanf(buf, "FONTBOUNDINGBOX %d %d %d %d",
					   &pf->fbbw, &pf->fbbh, &pf->fbbx, &pf->fbby) != 4) {
				fprintf(stderr, "Error: bad 'FONTBOUNDINGBOX'\n");
				return 0;
			}
			continue;
		}
		if (isprefix(buf, "CHARS ")) {
			if (sscanf(buf, "CHARS %d", &nchars) != 1) {
				fprintf(stderr, "Error: bad 'CHARS'\n");
				return 0;
			}
			continue;
		}

		/*
		 * Reading ENCODING is necessary to get firstchar/lastchar
		 * which is needed to pre-calculate our offset and widths
		 * array sizes.
		 */
		if (isprefix(buf, "ENCODING ")) {
			if (sscanf(buf, "ENCODING %d", &encoding) != 1) {
				fprintf(stderr, "Error: bad 'ENCODING'\n");
				return 0;
			}
			if (encoding >= 0 && 
				encoding <= limit_char && 
				encoding >= start_char) {

				if (firstchar > encoding)
					firstchar = encoding;
				if (lastchar < encoding)
					lastchar = encoding;
			}
			continue;
		}
		if (strequal(buf, "ENDFONT"))
			break;
	}

	/* calc font height*/
	if (pf->ascent < 0 || pf->descent < 0 || firstchar < 0) {
		fprintf(stderr, "Error: Invalid BDF file, requires FONT_ASCENT/FONT_DESCENT/ENCODING\n");
		return 0;
	}
	pf->height = pf->ascent + pf->descent;

	/* calc default char*/
	if (pf->defaultchar < 0 || 
		pf->defaultchar < firstchar || 
		pf->defaultchar > limit_char )
		pf->defaultchar = firstchar;

	/* calc font size (offset/width entries)*/
	pf->firstchar = firstchar;
	pf->size = lastchar - firstchar + 1;
	
	/* use the font boundingbox to get initial maxwidth*/
	/*maxwidth = pf->fbbw - pf->fbbx;*/
	maxwidth = pf->fbbw;

	/* initially use font maxwidth * height for bits allocation*/
	pf->bits_size = nchars * BITMAP_WORDS(maxwidth) * pf->height;

	/* allocate bits, offset, and width arrays*/
	pf->bits = (bitmap_t *)malloc(pf->bits_size * sizeof(bitmap_t) + EXTRA);
	pf->offset = (unsigned long *)malloc(pf->size * sizeof(unsigned long));
	pf->width = (unsigned char *)malloc(pf->size * sizeof(unsigned char));
	
	if (!pf->bits || !pf->offset || !pf->width) {
		fprintf(stderr, "Error: no memory for font load\n");
		return 0;
	}

	return 1;
}

/* read bdf font bitmaps, return 0 on error*/
int bdf_read_bitmaps(FILE *fp, struct font* pf)
{
	long ofs = 0;
	int maxwidth = 0;
	int i, k, encoding, width;
	int bbw, bbh, bbx, bby;
	int proportional = 0;
	int encodetable = 0;
	long l;
	char buf[256];

	/* reset file pointer*/
	fseek(fp, 0L, SEEK_SET);

	/* initially mark offsets as not used*/
	for (i=0; i<pf->size; ++i)
		pf->offset[i] = -1;

	for (;;) {
		if (!bdf_getline(fp, buf, sizeof(buf))) {
			fprintf(stderr, "Error: EOF on file\n");
			return 0;
		}
		if (isprefix(buf, "STARTCHAR")) {
			encoding = width = bbw = bbh = bbx = bby = -1;
			continue;
		}
		if (isprefix(buf, "ENCODING ")) {
			if (sscanf(buf, "ENCODING %d", &encoding) != 1) {
				fprintf(stderr, "Error: bad 'ENCODING'\n");
				return 0;
			}
			if (encoding < start_char || encoding > limit_char)
				encoding = -1;
			continue;
		}
		if (isprefix(buf, "DWIDTH ")) {
			if (sscanf(buf, "DWIDTH %d", &width) != 1) {
				fprintf(stderr, "Error: bad 'DWIDTH'\n");
				return 0;
			}
			/* use font boundingbox width if DWIDTH <= 0*/
			if (width <= 0)
				width = pf->fbbw - pf->fbbx;
			continue;
		}
		if (isprefix(buf, "BBX ")) {
			if (sscanf(buf, "BBX %d %d %d %d", &bbw, &bbh, &bbx, &bby) != 4) {
				fprintf(stderr, "Error: bad 'BBX'\n");
				return 0;
			}
			continue;
		}
		if (strequal(buf, "BITMAP")) {
			bitmap_t *ch_bitmap = pf->bits + ofs;
			int ch_words;

			if (encoding < 0)
				continue;

			/* set bits offset in encode map*/
			if (pf->offset[encoding-pf->firstchar] != (unsigned long)-1) {
				fprintf(stderr, "Error: duplicate encoding for character %d (0x%02x), ignoring duplicate\n",
						encoding, encoding);
				continue;
			}
			pf->offset[encoding-pf->firstchar] = ofs;

			/* calc char width*/
			if (bbx < 0) {
				width -= bbx;
				/*if (width > maxwidth)
					width = maxwidth;*/
				bbx = 0;
			}
			if (width > maxwidth)
				maxwidth = width;
			pf->width[encoding-pf->firstchar] = width;

			/* clear bitmap*/
			memset(ch_bitmap, 0, BITMAP_BYTES(width) * pf->height);

			ch_words = BITMAP_WORDS(width);
#define BM(row,col) (*(ch_bitmap + ((row)*ch_words) + (col)))
#define BITMAP_NIBBLES	(BITMAP_BITSPERIMAGE/4)

			/* read bitmaps*/
			for (i=0; ; ++i) {
				int hexnibbles;

				if (!bdf_getline(fp, buf, sizeof(buf))) {
					fprintf(stderr, "Error: EOF reading BITMAP data\n");
					return 0;
				}
				if (isprefix(buf, "ENDCHAR"))
					break;

				hexnibbles = strlen(buf);
				for (k=0; k<ch_words; ++k) {
					int ndx = k * BITMAP_NIBBLES;
					int padnibbles = hexnibbles - ndx;
					bitmap_t value;
					
					if (padnibbles <= 0)
						break;
					if (padnibbles >= BITMAP_NIBBLES)
						padnibbles = 0;

					value = bdf_hexval((unsigned char *)buf,
									   ndx, ndx+BITMAP_NIBBLES-1-padnibbles);
					value <<= padnibbles * BITMAP_NIBBLES;

					BM(pf->height - pf->descent - bby - bbh + i, k) |=
						value >> bbx;
					/* handle overflow into next image word*/
					if (bbx) {
						BM(pf->height - pf->descent - bby - bbh + i, k+1) =
							value << (BITMAP_BITSPERIMAGE - bbx);
					}
				}
			}

			ofs += BITMAP_WORDS(width) * pf->height;

			continue;
		}
		if (strequal(buf, "ENDFONT"))
			break;
	}

	/* set max width*/
	pf->maxwidth = maxwidth;

	/* change unused offset/width values to default char values*/
	for (i=0; i<pf->size; ++i) {
		int defchar = pf->defaultchar - pf->firstchar;

		if (pf->offset[i] == (unsigned long)-1) {
			pf->offset[i] = pf->offset[defchar];
			pf->width[i] = pf->width[defchar];
		}
	}

	/* determine whether font doesn't require encode table*/
	l = 0;
	for (i=0; i<pf->size; ++i) {
		if (pf->offset[i] != l) {
			encodetable = 1;
			break;
		}
		l += BITMAP_WORDS(pf->width[i]) * pf->height;
	}
	if (!encodetable) {
		free(pf->offset);
		pf->offset = NULL;
	}

	/* determine whether font is fixed-width*/
	for (i=0; i<pf->size; ++i) {
		if (pf->width[i] != maxwidth) {
			proportional = 1;
			break;
		}
	}
	if (!proportional) {
		free(pf->width);
		pf->width = NULL;
	}

	/* reallocate bits array to actual bits used*/
	if (ofs < pf->bits_size) {
		pf->bits = realloc(pf->bits, ofs * sizeof(bitmap_t));
		pf->bits_size = ofs;
	}
	else {
		if (ofs > pf->bits_size) {
			fprintf(stderr, "Warning: DWIDTH spec > max FONTBOUNDINGBOX\n");
			if (ofs > pf->bits_size+EXTRA) {
				fprintf(stderr, "Error: Not enough bits initially allocated\n");
				return 0;
			}
			pf->bits_size = ofs;
		}
	}

	return 1;
}

/* read the next non-comment line, returns buf or NULL if EOF*/
char *bdf_getline(FILE *fp, char *buf, int len)
{
	int c;
	char *b;

	for (;;) {
		b = buf;
		while ((c = getc(fp)) != EOF) {
			if (c == '\r')
				continue;
			if (c == '\n')
				break;
			if (b - buf >= (len - 1))
				break;
			*b++ = c;
		}
		*b = '\0';
		if (c == EOF && b == buf)
			return NULL;
		if (b != buf && !isprefix(buf, "COMMENT"))
			break;
	}
	return buf;
}

/* return hex value of portion of buffer*/
bitmap_t bdf_hexval(unsigned char *buf, int ndx1, int ndx2)
{
	bitmap_t val = 0;
	int i, c;

	for (i=ndx1; i<=ndx2; ++i) {
		c = buf[i];
		if (c >= '0' && c <= '9')
			c -= '0';
		else 
			if (c >= 'A' && c <= 'F')
				c = c - 'A' + 10;
			else 
				if (c >= 'a' && c <= 'f')
					c = c - 'a' + 10;
				else 
					c = 0;
		val = (val << 4) | c;
	}
	return val;
}

/* generate C source from in-core font*/
int gen_c_source(struct font* pf, char *path)
{
	FILE *ofp;
	int i;
	int did_defaultchar = 0;
	int did_syncmsg = 0;
	time_t t = time(0);
	bitmap_t *ofs = pf->bits;
	char buf[256];
	char obuf[256];
	char hdr1[] = {
		"/* Generated by convbdf on %s. */\n"
		"#include \"common/stdafx.h\"\n"
		"#include \"graphics/font.h\"\n"
		"\n"
		"/* Font information:\n"
		"   name: %s\n"
		"   facename: %s\n"
		"   w x h: %dx%d\n"
		"   size: %d\n"
		"   ascent: %d\n"
		"   descent: %d\n"
		"   first char: %d (0x%02x)\n"
		"   last char: %d (0x%02x)\n"
		"   default char: %d (0x%02x)\n"
		"   proportional: %s\n"
		"   %s\n"
		"*/\n"
		"\n"
		"namespace Graphics {\n"
		"\n"
		"/* Font character bitmap data. */\n"
		"static const bitmap_t _font_bits[] = {\n"
	};

	ofp = fopen(path, "w");
	if (!ofp) {
		fprintf(stderr, "Can't create %s\n", path);
		return 1;
	}

	strcpy(buf, ctime(&t));
	buf[strlen(buf)-1] = 0;

	fprintf(ofp, hdr1, buf, 
			pf->name,
			pf->facename? pf->facename: "",
			pf->maxwidth, pf->height,
			pf->size,
			pf->ascent, pf->descent,
			pf->firstchar, pf->firstchar,
			pf->firstchar+pf->size-1, pf->firstchar+pf->size-1,
			pf->defaultchar, pf->defaultchar,
			pf->width? "yes": "no",
			pf->copyright? pf->copyright: "");

	/* generate bitmaps*/
	for (i=0; i<pf->size; ++i) {
		int x;
		int bitcount = 0;
		int width = pf->width ? pf->width[i] : pf->maxwidth;
		int height = pf->height;
		bitmap_t *bits = pf->bits + (pf->offset? pf->offset[i]: (height * i));
		bitmap_t bitvalue = 0;

		/*
		 * Generate bitmap bits only if not this index isn't
		 * the default character in encode map, or the default
		 * character hasn't been generated yet.
		 */
		if (pf->offset && 
			(pf->offset[i] == pf->offset[pf->defaultchar-pf->firstchar])) {
			if (did_defaultchar)
				continue;
			did_defaultchar = 1;
		}

		fprintf(ofp, "\n/* Character %d (0x%02x):\n   width %d",
				i+pf->firstchar, i+pf->firstchar, width);

		if (gen_map) {
			fprintf(ofp, "\n   +");
			for (x=0; x<width; ++x) fprintf(ofp, "-");
			fprintf(ofp, "+\n");

			x = 0;
			while (height > 0) {
				if (x == 0) fprintf(ofp, "   |");

				if (bitcount <= 0) {
					bitcount = BITMAP_BITSPERIMAGE;
					bitvalue = *bits++;
				}

				fprintf(ofp, BITMAP_TESTBIT(bitvalue)? "*": " ");

				bitvalue = BITMAP_SHIFTBIT(bitvalue);
				--bitcount;
				if (++x == width) {
					fprintf(ofp, "|\n");
					--height;
					x = 0;
					bitcount = 0;
				}
			}
			fprintf(ofp, "   +");
			for (x=0; x<width; ++x)
				fprintf(ofp, "-");
			fprintf(ofp, "+\n*/\n");
		} else
			fprintf(ofp, "\n*/\n");

		bits = pf->bits + (pf->offset? pf->offset[i]: (pf->height * i));
		for (x=BITMAP_WORDS(width)*pf->height; x>0; --x) {
			fprintf(ofp, "0x%04x,\n", *bits);
			if (!did_syncmsg && *bits++ != *ofs++) {
				fprintf(stderr, "Warning: found encoding values in non-sorted order (not an error).\n");
				did_syncmsg = 1;
			}
		}	
	}
	fprintf(ofp, "};\n\n");

	if (pf->offset) {
		/* output offset table*/
		fprintf(ofp, "/* Character->glyph mapping. */\n"
				"static const unsigned long _sysfont_offset[] = {\n");

		for (i=0; i<pf->size; ++i)
			fprintf(ofp, "	%ld,\t/* (0x%02x) */\n", 
					pf->offset[i], i+pf->firstchar);
		fprintf(ofp, "};\n\n");
	}

	/* output width table for proportional fonts*/
	if (pf->width) {
		fprintf(ofp, "/* Character width data. */\n"
				"static const unsigned char _sysfont_width[] = {\n");

		for (i=0; i<pf->size; ++i)
			fprintf(ofp, "	%d,\t/* (0x%02x) */\n", 
					pf->width[i], i+pf->firstchar);
		fprintf(ofp, "};\n\n");
	}

	/* output struct font struct*/
	if (pf->offset)
		sprintf(obuf, "_sysfont_offset,");
	else
		sprintf(obuf, "0,  /* no encode table*/");

	if (pf->width)
		sprintf(buf, "_sysfont_width,");
	else
		sprintf(buf, "0,  /* fixed width*/");

	fprintf(ofp,
			"/* Exported structure definition. */\n"
			"static const FontDesc desc = {\n"
			"\t" "\"%s\",\n"
			"\t" "%d,\n"
			"\t" "%d,\n"
			"\t" "%d,\n"
			"\t" "%d,\n"
			"\t" "%d,\n"
			"\t" "_font_bits,\n"
			"\t" "%s\n"
			"\t" "%s\n"
			"\t" "%d,\n"
			"\t" "sizeof(_font_bits)/sizeof(bitmap_t)\n"
			"};\n",
			pf->name,
			pf->maxwidth, pf->height,
			pf->ascent,
			pf->firstchar,
			pf->size,
			obuf,
			buf,
			pf->defaultchar);

	fprintf(ofp, "\n" "extern const NewFont g_sysfont(desc);\n");
	fprintf(ofp, "\n} // End of namespace Graphics\n");
 
	return 0;
}

--- NEW FILE: md5table.c ---
/* md5table - Convert a MD5 table to either PHP or C++ code
 * Copyright (C) 2002, 2003  The ScummVM Team
 *
 * 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 2
 * 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, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header: /cvsroot/scummvm/scummvm/tools/md5table.c,v 1.1 2004/12/24 01:43:33 fingolfin Exp $
 *
 */

#include <assert.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void error(const char *s, ...) {
	char buf[1024];
	va_list va;

	va_start(va, s);
	vsprintf(buf, s, va);
	va_end(va);

	fprintf(stderr, "ERROR: %s!\n", buf);

	exit(1);
}

void warning(const char *s, ...) {
	char buf[1024];
	va_list va;

	va_start(va, s);
	vsprintf(buf, s, va);
	va_end(va);

	fprintf(stderr, "WARNING: %s!\n", buf);
}

typedef struct {
	const char *key;
	const char *value;
} StringMap;

typedef struct {
	const char *desc;
	const char *platform;
	const char *language;
	const char *md5;
	const char *target;
	const char *infoSource;
} Entry;

/* Map MD5 table platform names to ScummVM constant names.
 * Note: Currently not many constants are defined within ScummVM. However, more
 * will probably be added eventually (see also commented out constants in
 * common/util.h).
 */
static const StringMap platformMap[] = {
	{ "3DO",		"kPlatformUnknown" },
	{ "Amiga",		"kPlatformAmiga" },
	{ "Atari",		"kPlatformAtariST" },
	{ "DOS",		"kPlatformPC" },
	{ "FM-TOWNS",	"kPlatformFMTowns" },
	{ "Mac",		"kPlatformMacintosh" },
	{ "SEGA",		"kPlatformUnknown" },
	{ "Windows",	"kPlatformWindows" },

	{ "All?",		"kPlatformUnknown" },
	{ "All",		"kPlatformUnknown" },

	{ 0,			"kPlatformUnknown" }
};

static const StringMap langMap[] = {
	{ "en",		"EN_USA" },
	{ "de",		"DE_DEU" },
	{ "fr",		"FR_FRA" },
	{ "it",		"IT_ITA" },
	{ "pt",		"PT_BRA" },
	{ "es",		"ES_ESP" },
	{ "jp",		"JA_JPN" },
	{ "zh",		"ZH_TWN" },
	{ "ko",		"KO_KOR" },
	{ "se",		"SE_SWE" },
	{ "en",		"EN_GRB" },
	{ "hb",		"HB_ISR" },
	{ "ru",		"RU_RUS" },
	{ "cz",		"CZ_CZE" },
	{ "nl",		"NL_NLD" },

	{ "All",	"UNK_LANG" },
	{ "All?",	"UNK_LANG" },

	{ 0,		"UNK_LANG" }
};

static const char *php_header =
	"<!--\n"
	"  This file was generated by the md5table tool on %s"
	"  DO NOT EDIT MANUALLY!\n"
	" -->\n"
	"\n";

static const char *c_header =
	"/*\n"
	"  This file was generated by the md5table tool on %s"
	"  DO NOT EDIT MANUALLY!\n"
	" */\n"
	"\n"
	"struct MD5Table {\n"
	"	const char *md5;\n"
	"	const char *target;\n"
	"	Common::Language language;\n"
	"	Common::Platform platform;\n"
	"};\n"
	"\n"
	"static const MD5Table md5table[] = {\n";

static const char *c_footer =
	"	{ 0, 0, Common::UNK_LANG, Common::kPlatformUnknown }\n"
	"};\n";

static void parseEntry(Entry *entry, char *line) {
	assert(entry);
	assert(line);
	
	/* Split at the tabs */
	entry->desc = strtok(line, "\t\n\r");
	entry->platform = strtok(NULL, "\t\n\r");
	entry->language = strtok(NULL, "\t\n\r");
	entry->md5 = strtok(NULL, "\t\n\r");
	entry->target = strtok(NULL, "\t\n\r");
	entry->infoSource = strtok(NULL, "\t\n\r");
}

static int isEmptyLine(const char *line) {
	const char *whitespace = " \t\n\r";
	while (*line) {
		if (!strchr(whitespace, *line))
			return 0;
		line++;
	}
	return 1;
}

static const char *mapStr(const char *str, const StringMap *map) {
	assert(str);
	assert(map);
	while (map->key) {
		if (0 == strcmp(map->key, str))
			return map->value;
		map++;
	}
	warning("mapStr: unknown string '%s', defaulting to '%s'", str, map->value);
	return map->value;
}

void showhelp(const char *exename)
{
	printf("\nUsage: %s <params>\n", exename);
	printf("\nParams:\n");
	printf(" --c++   output C++ code for inclusion in ScummVM (default)\n");
	printf(" --php   output PHP code for the web site\n");
	exit(2);
}

/* needed to call from qsort */
int strcmp_wrapper(const void *s1, const void *s2)
{
	return strcmp((const char *)s1, (const char *)s2);
}

int main(int argc, char *argv[])
{
	FILE *inFile = stdin;
	FILE *outFile = stdout;
	char buffer[1024];
	char section[1024];
	char *line;
	int err;
	int i;
	time_t theTime;
	const char *generationDate;

	const int entrySize = 256;
	int numEntries = 0, maxEntries = 1;
	char *entriesBuffer = malloc(maxEntries * entrySize);

	int phpOutput = 0;

	if (argc != 2)
		showhelp(argv[0]);
	if (strcmp(argv[1], "--c++") == 0) {
		phpOutput = 0;
	} else if (strcmp(argv[1], "--php") == 0) {
		phpOutput = 1;
	} else {
		showhelp(argv[0]);
	}
	
	time(&theTime);
	generationDate = strdup(asctime(gmtime(&theTime)));

	if (phpOutput)
		fprintf(outFile, php_header, generationDate);

	while ((line = fgets(buffer, sizeof(buffer), inFile))) {
		/* Parse line */
		if (line[0] == '#' || isEmptyLine(line))
			continue;	/* Skip comments & empty lines */
		if (line[0] == '\t') {
			Entry entry;
			assert(section[0]);
			parseEntry(&entry, line+1);
			if (phpOutput) {
				fprintf(outFile, "\t\t<?php addEntry(");
				fprintf(outFile, "\"%s\", ", entry.desc);
				fprintf(outFile, "\"%s\", ", entry.platform);
				fprintf(outFile, "\"%s\", ", entry.language);
				fprintf(outFile, "\"%s\", ", entry.md5);
				fprintf(outFile, "\"%s\"", entry.target);
				if (entry.infoSource)
					fprintf(outFile, ", \"%s\"", entry.infoSource);
				fprintf(outFile, "); ?>\n");
			} else if (entry.md5) {
				if (numEntries >= maxEntries) {
					maxEntries *= 2;
					entriesBuffer = realloc(entriesBuffer, maxEntries * entrySize);
				}
				snprintf(entriesBuffer + numEntries * entrySize, entrySize, "\t{ \"%s\", \"%s\", Common::%s, Common::%s },\n",
					entry.md5, entry.target, mapStr(entry.language, langMap), mapStr(entry.platform, platformMap));
				numEntries++;
			}
		} else {
			for (i = 0; buffer[i] && buffer[i] != '\n'; ++i)
				section[i] = buffer[i];
			section[i] = 0;
			if (phpOutput) {
				fprintf(outFile, "\t<tr><td colspan='7'><strong>%s</strong></td></tr>\n", section);
			}
		}
	}

	err = ferror(inFile);
	if (err)
		error("Failed reading from input file, error %d", err);

	if (!phpOutput) {
		/* Printf header */
		fprintf(outFile, c_header, generationDate);
		/* Now sort the MD5 table (this allows for binary searches) */
		qsort(entriesBuffer, numEntries, entrySize, strcmp_wrapper);
		/* Output the table */
		for (i = 0; i < numEntries; ++i)
			fprintf(outFile, entriesBuffer + i * entrySize);
		/* Finally, print the footer */
		fprintf(outFile, c_footer);
	}
	
	free(entriesBuffer);

	return 0;
}

--- NEW FILE: scumm-md5.txt ---
Maniac Mansion
	V1	DOS	en	7f45ddd6dbfbf8f80c0c0efea4c295bc	maniac
	V2	DOS	en	624cdb93654667c869d204a64af7e57f	maniac	Kirben, Andrea Petrucci
	V2 (alt?)	DOS	en	b250d0f9cc83f80ced56fe11a4fb057c	maniac	Andrea Petrucci
	V2	DOS	de	183d7464902d40d00800e8ee1f04117c	maniac
	V2	DOS	es	0d1b69471605201ef2fa9cec1f5f02d2	maniac	abnog, Andrea Petrucci
	V2 (DOTT)	DOS	it	87f6e8037b7cc996e13474b491a7a98e	maniac	Andrea Petrucci
	V2	DOS	fr	114acdc2659a273c220f86ee9edb24c1	maniac	Nicolas Sauzède
	V2 (DOTT)	DOS	fr	99a3699f80b8f776efae592b44b9b991	maniac	Nicolas Sauzède, Andrea Petrucci
	V2 (demo)	DOS	en	40564ec47da48a67787d1f9bd043902a	maniac
	V2	Amiga	en	e781230da44a44e2f0770edb2b3b3633	maniac	dhewg, Andrea Petrucci
	V2	Amiga	de	9bc548e179cdb0767009401c094d0895	maniac	Norbert Lange
	V2	Amiga	fr	ce7733f185b838e248927c7ba1a04204	maniac	Tobias Fleischer
	V2	Atari	en	a570381b028972d891052ee1e51dc011	maniac	Andreas Bylund
	V2	Atari	fr	dd30a53035393baa5a5e222e716559af	maniac	Andreas Bylund

Zak McKracken and the Alien Mindbenders
	V1	DOS	en	7020931d5a2be0a49d68e7a1882363e4	zak
	V1 (alt?)	DOS	en	b23f7cd7c304d7dff08e92a96120d5b4	zak	Andrea Petrucci
	V2 Demo	Atari	en	8299d9b8a1b0e7b881bae7a9971dc5e2	zak
	V2	DOS	en	675d71151e9b5a968c8ce46d9fbf4cbf	zak	Kirben
	V2 (alt?)	DOS	en	debe337f73d660e951ece7c1f1c81add	zak	Andrea Petrucci
	V2 (w/o copy protection)	DOS	de	cdd760228cf1010c2903f37e788ea31c	zak	Max Horn
	V2 (from 5\"25 floppies)	DOS	de	d06fbe28818fef7bfc45c2cdf0c0849d	zak	Nicolas Sauzède, Andrea Petrucci
	V2	DOS	fr	52a4bae0746a11d7b1e8554e91a6645c	zak	Andrea Petrucci
	V2	DOS	it	75ba23fff4fd63fa446c02864f2a5a4b	zak	Antti Leimi, Andrea Petrucci
	V2 (alt?)	DOS	it	1900e501a52fbf55bde6e4196f6d2aa6	zak	Andrea Petrucci
	V2	Amiga	en	e94c7cc3686fce406d3c91b5eae5a72d	zak	dhweg
	V2	Amiga	de	6027e9ca9c35746d95dee2068cec17e5	zak	Norbert Lange
	V2	Amiga	fr	91469353f7be1b122fa88d23480a1320	zak	Tobias Fleischer
	V2	Amiga	it	27b3a4224ad63d5b04627595c1c1a025	zak	Andrea Petrucci
	V2	Atari	fr	613f64f78ea26c7353b2a5940eb61d6a	zak	Andreas Bylund
	FM-TOWNS	FM-TOWNS	en	2d4536a56e01da4b02eb021e7770afa2	zakTowns
	FM-TOWNS	FM-TOWNS	jp	ce3edc99cd4f478c5b37104d70c68ca5	zakTowns	khalek
	FM-TOWNS (alt?)	FM-TOWNS	jp	1ca86e2cf9aaa2068738a1e5ba477e60	zakTowns	Andrea Petrucci

Indiana Jones and the Last Crusade
	EGA (1.0 7/09/89)	DOS	en	5fbe557049892eb4b709d90916ec97ca	indy3EGA
	EGA (1.3 8/14/89)	DOS	en	6b3ec67da214f558dc5ceaa2acd47453	indy3EGA	tsuteiuQ, Andrea Petrucci
	EGA	DOS	de	6f6ef668c608c7f534fea6e6d3878dde	indy3EGA	dhewg
	EGA	DOS	fr	66236cd1aec24e1d4aff4c4cc93b7e18	indy3EGA	Andrea Petrucci
	EGA	DOS	it	d62d248c3df6ec177405e2cb23d923b2	indy3EGA	Andrea Petrucci
	EGA	DOS	es	ce7fd0c382389a6791fc3e199c117ef4	indy3EGA	abnog
	EGA (alt?)	DOS	es	86be8ada36371d4fdc35659d0e912a26	indy3EGA	Andrea Petrucci

	EGA	Mac	en	1dd7aa088e09f96d06818aa9a9deabe0	indy3EGA
	EGA	Amiga	en	9c0fee288ad564a7d25ec3e841810d79	indy3EGA	dhewg
	EGA	Amiga	de	330f631502e381a4e199a3f7cb483c20	indy3EGA	dhewg
	EGA	Amiga	fr	e689bdf67f98b1d760ce4487ec0e8d06	indy3EGA	Gerald Vincent
	EGA	Amiga	it	df03ee021aa9b81d90cab9c26da07614	indy3EGA	Andrea Petrucci
	EGA	Atari	en	157367c3c21e0d03a0cba44361b4cf65	indy3EGA	Andreas Bylund
	EGA	Atari	fr	0f9c7a76657f0840b8f7ccb5bffeb9f4	indy3EGA	Andreas Bylund
	EGA Demo	DOS	en	b597e0403cc0002f69170e6caba7edd9	indy3EGA

	VGA	DOS	All	1875b90fade138c9253a8e967007031a	indy3
	VGA	DOS	de	399b217b0c8d65d0398076da486363a9	indy3
	VGA	DOS	it	17b5d5e6af4ae89d62631641d66d5a05	indy3	Andrea Petrucci
	
	FM-TOWNS	FM-TOWNS	en	04687cdf7f975a89d2474929f7b80946	indy3towns
	FM-TOWNS	FM-TOWNS	jp	3a0c35f3c147b98a2bdf8d400cfc4ab5	indy3towns	Paul Priest, Andrea Petrucci

Loom
	Demo	DOS	en	5a35e36fd777e9c37a49c5b2faca52f9	loom
	Floppy	Mac	en	6f0be328c64d689bb606d22a389e1b0f	loom
	Floppy v1.0	DOS	en	28ef68ee3ed76d7e2ee8ee13c15fbd5b	loom
	Floppy v1.0 alternative	DOS	en	73e5ab7dbb9a8061cc6d25df02dbd1e7	loom	Andrea Petrucci
	Floppy (v1.1 16 Mar 90)	DOS	en	37f56ceb13e401a7ac7d9e6b37fecaf7	loom	Kirben, Andrea Petrucci
	Floppy (v1.1 29 Mar 90)	DOS	en	22f4ea88a09da12df9308ba30bcb7d0f	loom	James Grosbeck
	Floppy	DOS	de	fa127d7c4bb47d05bb1c33ddcaa9f767	loom
	Floppy	DOS	fr	b886b0a5d909c7158a914e1d7c1c6c65	loom	Andrea Petrucci
	Floppy	DOS	it	c3df37df9d3b481b45f75283a9907c47	loom	Andrea Petrucci
	Floppy	DOS	es	2a208ffbcd0e83e86f4356e6f64aa6e1	loom	abnog, Andrea Petrucci
	Floppy	DOS	hb	187d315f6b5168f68680dfe8c3d76a3e	loom
	Floppy	Amiga	en	4dc780f1bc587a193ce8a97652791438	loom	Antti Leimi, Andrea Petrucci
	Floppy	Amiga	de	2fe369ad70f52a8cf7ad6077ee64f81a	loom	Norbert Lange
	Floppy (same as IT?!?)	Amiga	fr	39cb9dec16fa16f38d79acd80effb059	loom	Gerald Vincent
	Floppy (same as FR?!?)	Amiga	it	39cb9dec16fa16f38d79acd80effb059	loom	Andrea Petrucci
	Floppy	Atari	de	c24c490373aeb48fbd54caa8e7ae376d	loom	Andreas Bylund
	Talkie/CD	DOS	en	5d88b9d6a88e6f8e90cded9d01b7f082	loomcd
	FM-TOWNS	FM-TOWNS	en	c5d10e190d4b4d59114b824f2fdbd00e	loomTowns	dhewg, Andrea Petrucci
	FM-TOWNS	FM-TOWNS	jp	31b8fda4c8c7413fa6b39997e776eba4	loomTowns	khalek, Andrea Petrucci

The Secret of Monkey Island
	EGA (4 disk)	DOS	en	1d05cd189e4908f79b57e78a4402f292	monkeyega	Andrea Petrucci
	EGA (8 disk)	DOS	en	49210e124e4c2b30f1290a9ef6306301	monkeyega
	EGA (8 disk)	DOS	de	fc6b6148e80d67939d9a18697c0f626a	monkeyega	ghoostkilla
	EGA (8 disk)	DOS	fr	1dd3c11ea4439adfe681e4e405b624e1	monkeyega	Andrea Petrucci
	EGA (4 disk)	DOS	it	477dbafbd66a53c98416dc01aef019ad	monkeyega	Andrea Petrucci
	EGA (8 disk)	DOS	es	910e31cffb28226bd68c569668a0d6b4	monkeyega	Andrea Petrucci
	EGA	Atari	fr	9e5e0fb43bd22f4628719b7501adb717	monkeyega	Andreas Bylund
	EGA Demo	DOS	en	71523b539491527d9860f4407faf0411	monkeyega
	EGA Demo	DOS	de	771bc18ec6f93837b839c992b211904b	monkeyega	khalek

	VGA (4 disk)	DOS	en	15e03ffbfeddb9c2aebc13dcb2a4a8f4	monkeyvga
	VGA (8 disk)	DOS	en	c7890e038806df2bb5c0c8c6f1986ea2	monkeyvga	Andrea Petrucci
	VGA (4 disk)	DOS	de	d0b531227a27c6662018d2bd05aac52a	monkeyvga
	VGA (4 disk)	DOS	es	45152f7cf2ba8f43cf8a8ea2e740ae09	monkeyvga
	VGA (4 disk)	DOS	it	66fd5ff9a810dfeb6d6bdada18221140	monkeyvga	Andrea Petrucci
	VGA	Amiga	en	6c2bff0e327f2962e809c2e1a82d7309	monkeyvga	dhweg
	VGA	Amiga	de	319a4dde52c7960b5aae8a1ec348d918	monkeyvga	ghoostkilla
	VGA (alt?)	Amiga	de	0a212fa35fa8421f31c1f3961272caf0	monkeyvga	Andreas Bylund
	VGA	Amiga	es	870d1e3c86bc50846d808d14a36b4e08	monkeyvga	Andreas Bylund
	VGA	Amiga	fr	3433be9866ca4261b2d5d25374e3f243	monkeyvga	Gerald Vincent
	VGA	Amiga	it	fb66aa42de21675116346213f176a366	monkeyvga	Andrea Petrucci
	VGA Demo	Amiga	en	54a936ad06161ff7bfefcb96200f7bff	monkeyvga	khalek

	CD	DOS	en	2d1e891fe52df707c30185e52c50cd92	monkey
	CD	DOS	de	305d3dd57c96c65b017bc70c8c7cfb5e	monkey
	CD	DOS	es	f049e38c1f8302b5db6170f1872af89a	monkey	Andrej Sinicyn, Andrea Petrucci
	CD	DOS	it	da6269b18fcb08189c0aa9c95533cce2	monkey	Andrej Sinicyn, Andrea Petrucci
	CD	DOS	fr	aa8a0cb65f3afbbe2c14c3f9f92775a3	monkey	Andrej Sinicyn, Andrea Petrucci

	-	DOS	fr	aa8a0cb65f3afbbe2c14c3f9f92775a3	monkey1	Nicolas Sauzède
	-	Mac	en	2ccd8891ce4d3f1a334d21bff6a88ca2	monkey1	Lars Næsbye Christensen
	-	SEGA	en	c13225cb1bbd3bc9fe578301696d8021	game

	FM-TOWNS	FM-TOWNS	en	8eb84cee9b429314c7f0bdcf560723eb	monkey	Paul Priest, Andrea Petrucci
	FM-TOWNS	FM-TOWNS	jp	e17db1ddf91b39ca6bbc8ad3ed19e883	monkey	Paul Priest, Andrea Petrucci

Misc demos
	Passport to Adventure	DOS	en	e6cd81b25ab1453a8a6d3482118c391e	pass

	indy/loom non-interactive	FM-TOWNS	en	2d388339d6050d8ccaa757b64633954e	zakTowns	khalek
	zak/loom non-interactive	FM-TOWNS	en	77f5c9cc0986eb729c1a6b4c8823bbae	zakTowns	khalek
	indy/zak non-interactive	FM-TOWNS	en	3938ee1aa4433fca9d9308c9891172b1	zakTowns	khalek

Monkey Island 2: LeChuck's revenge
	-	Amiga	en	132bff65e6367c09cc69318ce1b59333	monkey2
	-	Amiga	de	da669b20271b85182e9c17a2a37ea02e	monkey2	Andreas Bylund, Norbert Lange
	-	Amiga	es	6ea966b4d660c870b9ee790d1fbfc535	monkey2	Andreas Bylund
	-	Amiga	fr	c30ef068add4277104243c31ce46c12b	monkey2	Andreas Bylund
	-	Amiga	it	11ddf1fde76e3156eb3a38da213f484e	monkey2	Andrea Petrucci
	-	Mac	en	4cb9c3618f71668f8e4346c8f323fa82	monkey2
	- (alt?)	Mac	en	e246e02db9630533a40d99c9f54a8e01	monkey2	Lars Næsbye Christensen
	-	DOS	en	3686cf8f89e102ececf4366e1d2c8126	monkey2
	-	DOS	de	6886e5d08cee329b1f2e743ae2e3ceed	monkey2
	-	DOS	fr	8e4ee4db46954bfe2912e259a16fad82	monkey2	Nicolas Sauzède, Andrea Petrucci
	CD	DOS	it	69ea626f1f87eecb78ea0d6c6b983a1d	monkey2	Andrea Petrucci
	Floppy	DOS	it	bd126753de619a495f9f22adc951c8d5	monkey2	Andrea Petrucci
	-	DOS	es	7974365d3dc0f43a2748c975f91ff042	monkey2	Andrea Petrucci
	FM-TOWNS	FM-TOWNS	en	da09e666fc8f5b78d7b0ac65d1a3b56e	monkey2	dhewg, Andrea Petrucci
	FM-TOWNS	FM-TOWNS	jp	430bc518017b6fac046f58bab6baad5d	monkey2	Antti Leimi, Andrea Petrucci
	Demo (non-interactive)	DOS	en	387a544b8b10b26912d8413bab63a853	mi2demo	khalek

Indiana Jones and the Fate of Atlantis
	Talkie	DOS	en	182344899c2e2998fca0bebcd82aa81a	atlantis
	Talkie	Mac	en	1a6e5ae2777a6a33f06ffc0226210934	atlantis	Scott Summers

	Non-Talkie	DOS	en	c63ee46143ba65f9ce14cf539ca51bd7	atlantis	Andrea Petrucci
	Non-Talkie	DOS	de	1fbebd7b2b692df5297870447a80cfed	atlantis
	Non-Talkie	DOS	fr	edfdb24a499d92c59f824c52987c0eec	atlantis	Nicolas Sauzède, Andrea Petrucci
	Non-Talkie	DOS	es	9bd2a8f72613e715c199246dd511e10f	atlantis	abnog, Andrea Petrucci
	Non-Talkie	DOS	it	8f3758ff98c9c5d78e5d635222cad026	atlantis	Andrea Petrucci

	Non-Talkie	Amiga	en	3a03dab514e4038df192d8a8de469788	atlantis	dhewg
	Non-Talkie	Amiga	de	4f267a901719623de7dde83e47d5b474	atlantis	ghoostkilla
	Non-Talkie	Amiga	de	e534d29afb3c6e0ee9dc3d53c5956714	atlantis	Tobias Fleischer
	Non-Talkie	Amiga	it	5798972220cd458be2626d54c80f71d7	atlantis	Andrea Petrucci

	Non-Talkie	Mac	en	d6dd0646404768a63e963891a96daadd	atlantis	Fingolfin
	Non-Talkie	Mac	en	06b187468113f9ae5a400b148a847fac	atlantis	Lars N¾sbye Christensen

	FM-TOWNS	FM-TOWNS	en	c7be10f775404fd9785a8b92a06d240c	indy4	dhewg, Andrea Petrucci
	FM-TOWNS	FM-TOWNS	jp	4d34042713958b971cb139fba4658586	indy4	Andrea Petrucci
	FM-TOWNS Demo	FM-TOWNS	jp	28d24a33448fab6795850bc9f159a4a2	indydemo	khalek
	Demo	DOS	en	035deab53b47bc43abc763560d0f8d4b	playfate
	Demo (non-interactive)	DOS	en	99b6f822b0b2612415407865438697d6	fate

Day Of The Tentacle
	Floppy Version A ?	All?	en	acad97ab1c6fc2a5b2d98abf6db4a190	tentacle
	Floppy Version B ?	DOS	en	2723fea3dae0cb47768c424b145ae0e7	tentacle	Andrej Sinicyn, Andrea Petrucci
	Floppy	DOS	de	57b0d89af79befe1cabce3bece869e7f	tentacle	Andrej Sinicyn, Andrea Petrucci
	Floppy	DOS	fr	92b078d9d6d9d751da9c26b8b3075779	tentacle	Nicolas Sauzède, Andrea Petrucci
	Floppy	DOS	it	50fcdc982a25063b78ad46bf389b8e8d	tentacle	Andrea Petrucci
	Floppy	DOS	es	ae94f110a14ce71fc515d5b648827a8f	tentacle	abnog, Andrea Petrucci
	Talkie	All?	en	4167a92a1d46baa4f4127d918d561f88	tentacle
	Talkie	All?	de	6e959d65358eedf9b68b81e304b97fa4	tentacle
	Talkie ?	All?	fr	8aa05d3cdb0e795436043f0546af2da2	tentacle	Andrea Petrucci
	Talkie	All?	it	4fbbe9f64b8bc547503a379a301183ce	tentacle	Andrea Petrucci
	Talkie	All?	es	883af4b0af4f77a92f1dcf1d0a283140	tentacle	Andrea Petrucci
	Demo	DOS	en	c83079157ec765a28de445aec9768d60	dottdemo

Sam & Max
	Non-Talkie	DOS	en	a3036878840720fbefa41e6965fa4a0a	samnmax	Andrea Petrucci
	Non-Talkie (alt?)	DOS	en	3b301b7892f883ce42ab4be6a274fea6	samnmax	Andrea Petrucci
	Non-Talkie	DOS	de	f27b1ba0eadaf2a6617b2b58192d1dbf	samnmax	dhewg, Andrea Petrucci
	Non-Talkie	DOS	fr	ef347474f3c7be3b29584eaa133cca05	samnmax	Nicolas Sauzède, Andrea Petrucci
	Non-Talkie	DOS	it	b289a2a8cbedbf45786e0b4ad2f510f1	samnmax	Andrea Petrucci
	Non-Talkie	DOS	es	fc53ce0e5f6562b1c1e1b4b8203acafb	samnmax	Andrea Petrucci
	Talkie	All?	en	d917f311a448e3cc7239c31bddb00dd2	samnmax
	Talkie	All?	de	0fb73eddfcf584c02ba097984df131ba	samnmax
	Talkie	All?	fr	7edd665bbede7ea8b7233f8e650be6f8	samnmax	Andrea Petrucci
	Talkie	All?	it	0f6f2e716ba896a44e5059bba1de7ca9	samnmax	Andrea Petrucci
	Talkie	All?	es	4ba7fb331296c283e73d8f5b2096e551	samnmax	Andrea Petrucci
	Demo	DOS	en	d9d0dd93d16ab4dec55cabc2b86bbd17	samdemo
	Demo	Mac	en	0425954a9db5c340861672892c3e678d	samdemo

	interactive Demo	DOS	en	c3196c5349e53e387aaff1533d95e53a	snmdemo
	Interactive WIP Demo	DOS	en	0e4c5d54a0ad4b26132e78b5ea76642a	snmidemo

Full Throttle
	Version A	All?	en	09820417db26687bb7fe0c83cc4c553b	ft
	Version B	All?	en	60ba818dc3bede86d40357e3913f8505	ft	sev

	-	All?	de	8bdb0bf87b5e303dd35693afb9351215	ft	dhewg
	-	All?	es	e72bb4c2b613db2cf50f89ff6350e70a	ft
	-	All?	ru	55e4cc866ff9046824e1c638ba2b8c7f	ft	sev
	-	All?	it	55518cd73cf9c6d23ea29c51ee06bdfe	ft	delfino
	-	All?	fr	4bedb49943df95a9c900a5a82ccbe9de	ft	cyx

	Demo	DOS	en	32a433dea56b86a55b59e4ff7d755711	ftpcdemo
	Demo	Mac	en	9d7b67be003fea60be4dcbd193611936	ftdemo

The Dig
	-	All	All	d8323015ecb8b10bf53474f6e6b0ae33	dig
	-	All	ru	d62047a6729349ab36f7ee065bf26509	dig	sev
	Demo	All	en	362c1d281fb9899254cda66ad246c66a	digdemo

Curse of Monkey Island
	-	All	All	fe60d6b5ff51b0553ac59963123b5777	comi
	Demo	All	All	8fec68383202d38c0d25e9e3b757c5df	comidemo

Backyard Baseball 2001
	Demo	Windows	en	a194f15f51ee62badab74b9e7da97693	bb2demo	khalek, sev

Backyard Football 2002
	Demo	Windows	en	5bd335265a61caa3d78956ad9f88ba23	FOOTDEMO	sev

Big Thinkers: Kindergarten
	-	Windows	en	92fc0073a4cf259ff36070ecb8628ba8	thinkerk	Kirben
	Demo	All	en	695fe0b3963333b7e15b37514db3c745	kinddemo	khalek, sev

Big Thinkers First Grade
	Demo	Windows	en	0f5935bd5e88ba6f09e558d64459746d	1grademo	khalek

Blue's ABC Time
	Demo	Windows	en	7ddeaf52c8b9a50551ce0aa2ac811d07	BluesABCTimeDemo	khalek, sev
	Demo	Windows	en	810a9da887aefa597b0cf3c77d262897	BluesABCTimeDemo	sev

Fatty Bears Birthday Surprise
	Demo	DOS	en	47e75b1bdcb44c78cb94883d1731ccf8	fbdemo	khalek
	Demo	Windows	en	22c9eb04455440131ffc157aeb8d40a8	fbdemo	khalek
	Demo	Mac	en	6df20c50c1ab19799de9be7ae7716881	TODO	khalek
	-	DOS	en	3824e60cdf639d22f6df92a03dc4b131	fbear	khalek
	-	Windows	en	179879b6e35c1ead0d93aab26db0951b	fbear	khalek
	-	Mac	en	3df6ead57930488bc61e6e41901d0e97	Fatty Bear	khalek

Fatty Bears Fun Pack
	-	DOS	hb	f06e66fd45b2f8b0f4a2833ff4476050	fbpack

Freddi Fish 1: The Case of the Missing Kelp Seeds
	-	All	en	df047cc4792150f601290357566d36a6	freddi	khalek
	-	Windows	ru	d4cccb5af88f3e77f370896e9ba8c5f9	freddi	sev
	Demo	Windows	en	084ed0fa98a6d1e9368d67fe9cfbd417	freddemo	khalek
	Demo	Windows	en	0855496dde35356b1a9691e22ba84cdc	freddemo	khalek
	Demo	Windows	en	566165a7338fa11029e7c14d94fa70d0	freddemo	khalek
	Demo	Mac	en	c8aac5e3e701874e2fa4117896f9e1b1	Freddi Demo	khalek, sev

Freddi Fish 2: The Case of the Haunted Schoolhouse
	-	Windows	en	51305e929e330e24a75a0351c8f9975e	freddi2	Kirben
	-	Windows	All	5057fb0e99e5aa29df1836329232f101	freddi2	sev
	-	Windows	nl	ac62d50e39492ee3738b4e83a5ac780f	freddi2	joostp
	Demo	All	en	fc8d197a22146e74766e9cb0cfcaf1da	ff2-demo	khalek, sev
	Demo	Windows	en	d37c55388294b66e53e7ced3af88fa68	ffhsdemo	khalek

Freddi Fish 3: The Case of the Stolen Conch Shell
	-	Windows	All	8368f552b1e3eba559f8d559bcc4cadb	freddi3	Kirben, sev
	Demo	All	en	cb1559e8405d17a5a278a6b5ad9338d1	f3-mdemo	khalek, sev

Freddie Fish 4: The Case of the Hogfish Rustlers of Briny Gulch
	-	Windows	All	4f580a021eee026f3b4589e17d130d78	freddi4	Kirben, sev
	Demo	Windows	en	7c2e76087027eeee9c8f8985f93a1cc5	f4-demo	khalek
	Demo	Windows	en	c25755b08a8d0d47695e05f1e2111bfc	f4-demo	sev
	Demo	Windows	en	ebd324dcf06a4c49e1ba5c231eee1060	f4-demo	sev
	Demo	Windows	nl	16effd200aa6b8abe9c569c3e578814d	ff4demo	joostp

Freddi Fish 5: The Case of the Creature of Coral Cave
	-	Windows	en	590e6546aacd0d374b7f3a4f53013ab1	freddicove	cyx
	-	Windows	ru	21abe302e1b1e2b66d6f5c12e241ebfd	freddicove	sev
	Demo	Windows	nl	6b257bb2827dd894b8109a50a1a18b5a	FF5Demo	Kirben

Freddi Fish and Luther's Water Worries
	-	Windows	ru	2012f854d83d9cc6f73b2b544cd8bbf8	water	sev
	-	Windows	en	4ba37f835be11a59d969f90f272f575b	water	Kirben

Freddi Fish and Luther's Maze Madness
	-	Windows	en	4f04b321a95d4315ce6d65f8e1dd0368	maze	Kirben

Humongous Interactive Catalog
	-	Windows	en	11e6e244078ff09b0f3832e35420e0a7	catalog	khalek, sev
	-	Windows	en	037385a953789190298494d92b89b3d0	catalog2	khalek, sev

Let's Explore the Farm with Buzzy
	-	Windows	en	a85856675429fe88051744f755b72f93	farm	Kirben
	-	Mac	en	fbbbb38a81fc9d6a61d509278390a290	The Farm	khalek
	Demo	Windows	en	8d479e36f35e80257dfc102cf4b8a912	farmdemo	khalek, sev
	Demo	Windows	en	bf8b52fdd9a69c67f34e8e9fec72661c	farmdemo	khalek, sev

Let's Explore the Airport with Buzzy
	-	Windows	en	07433205acdca3bc553d0e731588b35f	airport	Kirben
	Demo	Windows	en	86c9902b7bec1a17926d4dae85beaa45	airdemo	khalek
	Demo	Windows	en	e144f5f49d9241d2a9dee2576b3d09cb	airdemo	khalek
	Demo	Windows	en	8ffd618a776a4c0d8922bb28b09f8ce8	airdemo	khalek
	Demo	Mac	en	7ea2da67ebabea4ac20cee9f4f9d2934	Airport Demo	khalek

Let's Explore the Jungle with Buzzy
	-	Windows	en	8801fb4a1200b347f7a38523339526dd	jungle	Kirben

Pajama Sam 1: No Need to Hide When It's Dark Outside
	-	All	en	672dec94b82f7f0877ebb5b5cf7f4bc1	pajama	khalek
	-	Windows	nl	4fa6870d9bc8c313b65d54b1da5a1891	pajama	joostp
	Demo	All	en	f237bf8a5ef9af78b2a6a4f3901da341	pjs-demo	khalek, sev
	Demo	Windows	en	d7ab7cd6105546016e6a0d46fb36b964	pjsamdemo	khalek

Pajama Sam 2: Thunder and Lightning Aren't so Frightening
	-	Windows	en	d4e79c3d8645b8266cd78c325bc35154	pajama2	Kirben
	Demo	All	en	36a6750e03fb505fc19fc2bf3e4dbe91	pj2demo	sev

Pajama Sam 3: You Are What You Eat From Your Head to Your Feet
	-	Windows	en	f7711f9264d4d43c2a1518ec7c10a607	pajama3	Kirben
	Demo	Windows	en	a654fb60c3b67d6317a7894ffd9f25c5	pj3-demo	sev
	Demo	Windows	en	a9f2f04b1ecaab9495b59befffe9bf88	pj3-demo	sev
	Demo	Windows	en	cf90b4db5486ef798db78fe6fbf897e5	pj3-demo	khalek
	Demo	Windows	en	d7ab7cd6105546016e6a0d46fb36b964	PjSamDemo	khalek, sev
	Demo	All	nl	f08145577e4f13584cc90b3d6e9caa55	pj3demo	joostp

Pajama Sam's Lost & Found
	-	Windows	en	ed361270102e355afe5236954216aba2	lost	Kirben
	Demo	Windows	en	a2bb6aa0537402c1b3c2ea899ccef64b	smaller	Kirben

Pajama Sam's Sock Works
	-	Windows	en	5e8fb66971a60e523e5afbc4c129c0e8	socks	Kirben

Putt-Putt Enters the Race
	-	Windows	en	981e1e1891f2be7e25a01f50ae55a5af	puttrace
	Demo	All	en	0ac41e2e3d2174e5a042a6b565328dba	racedemo	sev
	Demo	All	nl	aaa587701cde7e74692c68c1024b85eb	racedemo	joostp

Putt-Putt Goes To The Moon
	Demo	DOS	en	aa6a91b7f6f119d1b7b1f2a4c9e24d59	moondemo
	Demo	Windows	en	9c143c5905055d5df7a0f014ab379aee	moondemo	khalek
	Demo	Mac	en	4af4a6b248103c1fe9edef619677f540	moondemo	khalek
	-	DOS	en	780e4a0ae2ff17dc296f4a79543b44f8	puttmoon	khalek
	-	Windows	en	9c92eeaf517a31b7221ec2546ab669fd	puttmoon	khalek
	-	Mac	en	9dc02577bf50d4cfaf3de3fbac06fbe2	Putt-Putt Moon	khalek

Putt-Putt Joins the Circus
	-	All	en	ab0693e9324cfcf498fdcbb12acf8bb4	puttcircus	sev
	Demo	All	en	a7cacad9c40c4dc9e1812abf6c8af9d5	circdemo	Kirben, sev

Putt-Putt Joins The Parade
	Demo	DOS	en	31aa57f460a3d12429f0552a46a90b39	puttdemo
	Demo	Windows	en	37ff1b308999c4cca7319edfcc1280a0	puttdemo	khalek
	Demo	Mac	en	f40a7f495f59188ca57a9d1d50301bb6	puttdemo	khalek
	-	DOS	en	9708cf716ed8bcc9ff3fcfc69413b746	puttputt	khalek
	-	Windows	en	6a30a07f353a75cdc602db27d73e1b42	puttputt	khalek
	-	Mac	en	684732efb5799c0f78804c99d8de9aba	Putt-Putt Parade	khalek
	-	3DO	en	7e151c17adf624f1966c8fc5827c95e9	puttputt	khalek

Putt-Putt Saves the Zoo
	-	Windows	en	1005456bfe351c1b679e1ff2dc2849e9	puttzoo	khalek
	-	Windows	en	92e7727e67f5cd979d8a1070e4eb8cb3	puttzoo	cyx
	-	Windows	nl	c3b22fa4654bb580b20325ebf4174841	puttzoo	joostp
	-	Mac	en	58fdf4c7ad13540a734e18f8584cad89	Putt-Putt Saves the Zoo	khalek
	Demo	Windows	en	1005456bfe351c1b679e1ff2dc2849e9	puttzoo	khalek
	Demo	Windows	en	f3d55aea441e260e9e9c7d2a187097e0	zoodemo	khalek
	Demo	Windows	en	de4efb910210736813c9a1185384bace	zoodemo	khalek
	Demo	Mac	en	3486ede0f904789267d4bcc5537a46d4	Puttzoo Demo	khalek

Putt-Putt Travels Through Time
	-	All?	en	2108d83dcf09f8adb4bc524669c8cf51	PuttTime
	Demo	All	en	4e5867848ee61bc30d157e2c94eee9b4	timedemo	khalek, sev
	Demo	Windows	en	0ab19be9e2a3f6938226638b2a3744fe	putttime-demo	khalek

Putt-Putt and Pep's Balloon-O-Rama
	-	Windows	en	08cc5c3eedaf72ebe12734eee94f7fa2	balloon	Kirben

Putt-Putt and Pep's Dog on a Stick
	-	Windows	en	d4b8ee426b1afd3e53bc0cf020418cf6	dog	sev
	-	Windows	en	eae95b2b3546d8ba86ae1d397c383253	dog	Kirben

Putt-Putts Fun Pack
	-	DOS	en	46b53fd430adcfbed791b48a0d4b079f	funpack	khalek

Spy Fox 1: Dry Cereal
	-	Windows	en	3de99ef0523f8ca7958faa3afccd035a	spyfox	Kirben
	-	Windows	en	6bf70eee5de3d24d2403e0dd3d267e8a	spyfox	khalek
	-	Windows	nl	9bda5fee51d2fda5253d02c642016bf4	spyfox	joostp
	Demo	All	en	53e94115b55dd51d4b8ff0871aa1df1e	foxdemo	khalek, sev
	Demo	All	en	fbdd947d21e8f5bac6d6f7a316af1c5a	spydemo	sev
	Demo	Windows	en	9d4ab3e0e1d1ebc6ba8a6a4c470ed184	spydemo	khalek

Spy Fox 2: Some Assembly Required
	-	Windows	en	f79e60c17cca601e411f1f75e8ee9b5a	spyfox2	Kirben
	Demo	Windows	en	7222f260253f325c21fcfa68b5bfab67	sf2-demo	Kirben
	Demo	All	nl	1c792d28376d45e145cb916bca0400a2	sf2demo	joostp

Spy Fox 3: Operation Ozone
	-	Windows	en	600abd3e9f47e63e670188b7e4e86ac7	spyozon	Kirben
	Demo	Windows	en	ebd0b2c8a387f18887282afe6cad894a	sf3-demo	Kirben

Spy Fox in Cheese Chase Game
	-	Windows	en	589601b676c98b1c0c987bc031ab68b3	chase	Kirben

Spy Fox in Hold the Mustard
	-	Windows	en	225e18566e810c634bf7de63e7568e3e	mustard	Kirben

--- NEW FILE: simon-md5.txt ---
Simon the Sorcerer 1
	-	DOS	en	465eed710cc242b2de7dc77edd467c4c	simon1dos
	-	DOS	en	48ce4ffda968cc7a38870c354571f92c	simon1dos	Kirben
	-	DOS	fr	bed9134804d96f72afa152b8ec5628c3	simon1dos
	-	DOS	it	c8f5b860a20dcc63915d94cf2bdcfa49	simon1dos
	-	DOS	ru	3b22f3cc4ce9faa3f7830ab18235b04d	simon1dos	Kirben
	-	Windows	en	d22302abf44219f95d50f2faa807dd1a	simon1talkie	Kirben
	-	DOS	de	ecc01a02c9b97b49d0b4191a346b0940	simon1talkie	SimSaw
	-	DOS	en	d545db8a0efae95a90b23da81aadb201	simon1talkie	Kirben
	-	DOS	fr	08bd7abefe9c44e43df396748640e531	simon1talkie	jellby
	-	DOS	hb	9d58f84988634d217c944cd4153a2a3b	simon1talkie	jellby
	-	DOS	it	057eac98fc4d14dc7fd04341781b26b3	simon1talkie	jellby
	-	DOS	es	e3712b3ed4429e736123a40276f533d7	simon1talkie	jellby
	-	Amiga	en	ec5358680c117f29b128cbbb322111a4	simon1cd32	Kirben
	AGA	Amiga	en	39e8f13ec29de1fcef98c81ca0a2ae57	simon1amiga
	ECS	Amiga	en	fa5651a5e5da0f3c89473dd62af095d8	simon1amiga
	Demo	DOS	en	486f026593f894f5b6b346ef3984a7a0	simon1demo	Kirben

Simon the Sorcerer 2
	-	DOS	en	27c8e7feada80c75b70b9c2f6088d519	simon2dos
	-	Windows	de	9e858b3bb189c134c3a5f34c3385a8d3	simon2talkie	DhWz
	-	Windows	en	bd85a8b5135592ada9cbeae49160f1d3	simon2talkie	Kirben
	-	DOS	de	3bdf85dc57c1abff8f05416b4571198f	simon2talkie	SimSaw
	-	DOS	en	078b04da0974a40645b92baffdf2781e	simon2talkie	Kirben
	-	DOS	fr	c8ddd48919aa75423dd2d3e5864909df	simon2talkie	SimSaw
	-	DOS	hb	a3cbdd3450f9fccb0a9d8d6dc28f66fe	simon2talkie
	-	DOS	es	79a9d9357c15153c8c502dba73c3eac6	simon2talkie	Samuel Suárez
	Demo	DOS	en	1e11ddbad80c408031ae44a0cbce46bb	simon2talkie	Kirben
	Demo	DOS	de	028c6240c9c8e190d86188238505c5e5	simon2talkie	Kirben





More information about the Scummvm-git-logs mailing list