|
|
1.1 ! root 1: #include <X/mit-copyright.h> ! 2: ! 3: /* Copyright Massachusetts Institute of Technology 1985 */ ! 4: /* $Header: XReadBitmapF.c,v 10.8 86/02/01 15:39:24 tony Rel $ */ ! 5: #include "XlibInternal.h" ! 6: #include <stdio.h> ! 7: #include <errno.h> ! 8: #include <strings.h> ! 9: ! 10: #define boolean int ! 11: ! 12: extern int errno; ! 13: ! 14: Status XReadBitmapFile(filename, width, height, data, x_hot, y_hot) ! 15: char *filename; ! 16: register int *width, *height; /* RETURN; must be non-NULL */ ! 17: register short **data; /* RETURN */ ! 18: int *x_hot, *y_hot; /* RETURN; may be NULL */ ! 19: { ! 20: char variable[81]; ! 21: int status, value, i, data_length; ! 22: FILE *file = fopen (filename, "r"); ! 23: ! 24: if (file == NULL) ! 25: return (0); ! 26: ! 27: *width = *height = -1; ! 28: if (x_hot) *x_hot = -1; ! 29: if (y_hot) *y_hot = -1; ! 30: while ((status = fscanf (file, "#define %80s %2d\n", variable, &value))==2) ! 31: { ! 32: if (StringEndsWith (variable, "width")) ! 33: *width = value; ! 34: else if (StringEndsWith (variable, "height")) ! 35: *height = value; ! 36: else if (StringEndsWith (variable, "x_hot")) ! 37: if (x_hot) *x_hot = value; ! 38: else if (StringEndsWith (variable, "y_hot")) ! 39: if (y_hot) *y_hot = value; ! 40: } ! 41: ! 42: if (*width <= 0) { ! 43: fclose (file); ! 44: errno = EINVAL; ! 45: return (-1); ! 46: } ! 47: ! 48: if (*height <= 0) { ! 49: fclose (file); ! 50: errno = EINVAL; ! 51: return (-2); ! 52: } ! 53: ! 54: data_length = BitmapSize (*width, *height); ! 55: *data = (short *) malloc (data_length); ! 56: data_length /= sizeof(short); ! 57: if (*data == NULL) { ! 58: fclose (file); ! 59: return (-3); ! 60: } ! 61: ! 62: status = fscanf (file, "static short %80s = { 0x%4hx", variable, ! 63: *data); /* fills in 0th element of *data array */ ! 64: if ((status != 2) || !StringEndsWith (variable, "bits[]")) { ! 65: free (*data); ! 66: fclose (file); ! 67: errno = EINVAL; ! 68: return (-4); ! 69: } ! 70: ! 71: for (i=1;i<data_length;i++) { ! 72: /* fill in i'th element of data array */ ! 73: status = fscanf (file, ", 0x%4hx", *data + i); ! 74: if (status != 1) { ! 75: free (*data); ! 76: fclose (file); ! 77: errno = EINVAL; ! 78: return (-5); ! 79: } ! 80: } ! 81: ! 82: fclose (file); ! 83: return (1); ! 84: } ! 85: ! 86: /* StringEndsWith returns TRUE if "s" ends with "suffix", else returns FALSE */ ! 87: static boolean StringEndsWith (s, suffix) ! 88: char *s, *suffix; ! 89: { ! 90: int s_len = strlen (s); ! 91: int suffix_len = strlen (suffix); ! 92: return (strcmp (s + s_len - suffix_len, suffix) == 0); ! 93: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.