This is ToyWinEPSRead.m in view mode; [Download] [Up]
#import "ToyWinEPS.h"
#import <appkit/TextField.h>
#import <appkit/NXImage.h>
#import <appkit/NXEPSImageRep.h>
#import <appkit/NXBitmapImageRep.h>
#import <stdio.h>
#import <libc.h>
#import <string.h>
#import "ToyView.h"
#import "common.h"
#import "strfunc.h"
@implementation ToyWinEPS (Readin)
/*
* EPS Image File Reading...
*/
static char *titlep = NULL, *creatorp = NULL;
static BOOL inheader;
/* Overload */
- makeComment:(commonInfo *)cinf
{
sprintf(cinf->memo, "%d x %d EPS", cinf->width, cinf->height);
if (titlep || creatorp) { /* only one has value */
strcat(cinf->memo, " : ");
if (titlep) {
comm_cat(cinf->memo, titlep);
free((void *)titlep);
titlep = NULL;
}
if (creatorp) {
comm_cat(cinf->memo, "by ");
comm_cat(cinf->memo, creatorp);
free((void *)creatorp);
creatorp = NULL;
}
}
return self;
}
/* Some EPS images, especially made by tools of X-Window, have illegal
"%%Page:" comments. Some EPS images used by Macintosh have unnecessary
information at the beginning of and at the tail of the file.
*/
#define EPSLineLength 512 /* MAX should be 256+x */
static int getEPSline(FILE *fp, char *buf, int ch)
{
int c, i;
static char isSpace[32] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 0, 0, /* TAB, NL, VTAB, NEWPAGE, CR */
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, /* ESC */
};
if (ch != '%') /* First char of current line */
inheader = NO;
for (i = 0, c = ch; ; ) {
if (c == EOF || i >= EPSLineLength - 1)
break;
if (c == 0x0a || c == 0x0d) {
if (c == 0x0d) { /* Macintosh */
if ((c = fgetc(fp)) == 0x0a) /* MS-DOS */
c = fgetc(fp);
}else /* c == 0x0a : UNIX */
c = fgetc(fp);
buf[i++] = '\n';
break;
}
if ((c < ' ' && !isSpace[c]) || (c & 0x7f) == 0x7f) {
/* Binary byte included */
while (c != 0x0a && c != 0x0d && c != EOF)
c = fgetc(fp);
if (c != EOF) c = fgetc(fp);
i = 0;
}else {
buf[i++] = c;
c = fgetc(fp);
}
}
buf[i] = 0;
if (buf[0] == '%' && buf[1] == '%') {
if (strncmp(buf, "%%Page", 6) == 0)
return getEPSline(fp, buf, c);
if (inheader) {
if (!titlep && strncmp(buf, "%%Title: ", 9) == 0)
titlep = str_dup(&buf[9]);
else if (!creatorp
&& strncmp(buf, "%%Creator: ", 11) == 0)
creatorp = str_dup(&buf[11]);
}
}
return c;
}
- (NXStream *)openStreamFromFile:(const char *)fileName err:(int *)err
{
FILE *fp;
NXStream *stream;
int c;
char buf[EPSLineLength];
*err = 0;
if ((fp = fopen(fileName, "r")) == NULL) {
*err = Err_OPEN;
return NULL;
}
stream = NXOpenMemory(NULL, 0, NX_READWRITE);
if (stream == NULL) {
*err = Err_MEMORY;
return NULL;
}
while ((c = fgetc(fp)) != '%' && c != EOF) ;
titlep = creatorp = NULL;
inheader = YES;
if (c != EOF) {
c = getEPSline(fp, buf, c);
if (strncmp(buf, "%!PS-Adobe", 10) == 0)
NXPrintf(stream, "%s", buf);
else
NXPrintf(stream, "%s\n", "%!PS-Adobe-2.0 EPSF-2.0");
while (c != EOF) {
c = getEPSline(fp, buf, c);
NXPrintf(stream, "%s", buf);
}
}
fclose(fp);
NXFlush(stream);
NXSeek(stream, 0L, NX_FROMSTART);
return stream;
}
/* Overload */
- (commonInfo *)drawToyWin:(const char *)fileName type:(int)type
map:(unsigned char **)map err:(int *)err
{
NXStream *stream;
if ((stream = [self openStreamFromFile:fileName err:err]) == NULL)
return NULL;
*err = [self drawFromFile: fileName or: stream];
NXCloseMemory(stream, NX_FREEBUFFER);
return NULL;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.