diff src/parsexbm.c @ 4:aa38447a4b21

First entry of Paradise Server 2.9 patch 10 Beta
author darius
date Sat, 06 Dec 1997 04:37:03 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/parsexbm.c	Sat Dec 06 04:37:03 1997 +0000
@@ -0,0 +1,159 @@
+/*--------------------------------------------------------------------------
+NETREK II -- Paradise
+
+Permission to use, copy, modify, and distribute this software and its
+documentation, or any derivative works thereof, for any NON-COMMERCIAL
+purpose and without fee is hereby granted, provided that this copyright
+notice appear in all copies.  No representations are made about the
+suitability of this software for any purpose.  This software is provided
+"as is" without express or implied warranty.
+
+    Xtrek Copyright 1986                            Chris Guthrie
+    Netrek (Xtrek II) Copyright 1989                Kevin P. Smith
+                                                    Scott Silvey
+    Paradise II (Netrek II) Copyright 1993          Larry Denys
+                                                    Kurt Olsen
+                                                    Brandon Gillespie
+--------------------------------------------------------------------------*/
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define pm_error(str) {\
+fprintf(stderr, "Error in ParseXbmFile(): %s\n", str);\
+if(*dataP) { free(*dataP); *dataP = 0; }\
+return -1; }
+
+/*
+ * most of the following function came from xbmtopbm.c in the PBMPLUS library
+ */
+
+#define MAX_LINE 500
+
+int
+ParseXbmFile(stream, widthP, heightP, dataP)
+  FILE *stream;
+  int *widthP;
+  int *heightP;
+  char **dataP;
+{
+  char line[MAX_LINE], name_and_type[MAX_LINE];
+  char *ptr;
+  char *t;
+  int raster_length, v;
+  register int bytes, bytes_per_line;
+  register int c1, c2, value1, value2;
+  int hex_table[256];
+
+  *widthP = *heightP = -1;
+  *dataP = 0;
+
+  for (;;)
+  {
+    if (fgets(line, MAX_LINE, stream) == NULL)
+      pm_error("EOF / read error");
+    if (strlen(line) == MAX_LINE - 1)
+      pm_error("line too long");
+
+    if (sscanf(line, "#define %s %d", name_and_type, &v) == 2)
+    {
+      if ((t = strrchr(name_and_type, '_')) == NULL)
+	t = name_and_type;
+      else
+	++t;
+      if (!strcmp("width", t))
+	*widthP = v;
+      else if (!strcmp("height", t))
+	*heightP = v;
+      continue;
+    }
+
+    if (sscanf(line, "static char %s = {", name_and_type) == 1 ||
+	sscanf(line, "static unsigned char %s = {", name_and_type) == 1)
+      break;
+  }
+
+  if (*widthP == -1)
+    pm_error("invalid width");
+  if (*heightP == -1)
+    pm_error("invalid height");
+
+  bytes_per_line = (*widthP + 7) / 8;
+
+  raster_length = bytes_per_line * *heightP;
+  *dataP = (char *) malloc(raster_length);
+  if (*dataP == (char *) 0)
+    pm_error("out of memory");
+
+  /* Initialize hex_table. */
+  for (c1 = 0; c1 < 256; ++c1)
+    hex_table[c1] = 256;
+
+  hex_table['0'] = 0;
+  hex_table['1'] = 1;
+  hex_table['2'] = 2;
+  hex_table['3'] = 3;
+  hex_table['4'] = 4;
+  hex_table['5'] = 5;
+  hex_table['6'] = 6;
+  hex_table['7'] = 7;
+  hex_table['8'] = 8;
+  hex_table['9'] = 9;
+  hex_table['A'] = 10;
+  hex_table['B'] = 11;
+  hex_table['C'] = 12;
+  hex_table['D'] = 13;
+  hex_table['E'] = 14;
+  hex_table['F'] = 15;
+  hex_table['a'] = 10;
+  hex_table['b'] = 11;
+  hex_table['c'] = 12;
+  hex_table['d'] = 13;
+  hex_table['e'] = 14;
+  hex_table['f'] = 15;
+
+  for (bytes = 0, ptr = *dataP; bytes < raster_length; ++bytes)
+  {
+    /*
+     * Skip until digit is found.
+     */
+    for (;;)
+    {
+      c1 = getc(stream);
+      if (c1 == EOF)
+	pm_error("EOF / read error");
+      value1 = hex_table[c1];
+      if (value1 != 256)
+	break;
+    }
+    /*
+     * Loop on digits.
+     */
+    for (;;)
+    {
+      c2 = getc(stream);
+      if (c2 == EOF)
+	pm_error("EOF / read error");
+      value2 = hex_table[c2];
+      if (value2 != 256)
+      {
+	value1 = (value1 << 4) | value2;
+	if (value1 >= 256)
+	  pm_error("syntax error");
+      }
+      else if (c2 == 'x' || c2 == 'X')
+      {
+	if (value1 == 0)
+	  continue;
+	else
+	  pm_error("syntax error");
+      }
+      else
+	break;
+    }
+    *ptr++ = (char) (value1 ^ 0xFF);
+  }
+  return (raster_length);
+}