This is GnuplotInspector.m in view mode; [Download] [Up]
/*
* Copyright (C) 1993 Robert Davis
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of Version 2, or any later version, of
* the GNU General Public License as published by the Free Software
* Foundation.
*/
static char RCSId[]="$Id: GnuplotInspector.m,v 1.5 1993/05/30 20:09:53 davis Exp $";
#import <appkit/Application.h>
#import <appkit/Text.h>
#import <appkit/TextField.h>
#import <ctype.h> /* isspace() */
#import <libc.h> /* MAXPATHLEN */
#import <objc/NXBundle.h>
#import <objc/objc.h>
#import "GnuplotInspector.h"
#define TYPE_UNKNOWN 1 /* plot types */
#define TYPE_TWOD 2
#define TYPE_CONTOURS 4
#define TYPE_POLAR 8
#define TYPE_PARAMETRIC 16
@interface GnuplotInspector (Private)
- _getCommandsFromBuffer:(const char *)buf end:(const char *const)end;
@end
static const char *skipSpace (const char *cur, const char *const end)
{
while (cur && (cur != end) && *cur && isspace (*cur))
cur++;
return cur;
}
static const char *skipToSpace (const char *cur, const char *const end)
{
while (cur && (cur != end) && *cur && !isspace (*cur))
cur++;
return cur;
}
static int almost (const char *cur, const char *target, const char *const end)
{
if (cur && target) {
int i;
const char *c;
BOOL past = NO;
i = 0;
for (c = cur; (c != end) && *c && !isspace (*c); c++)
i++;
for (; i ; i--) {
if (*cur == *target) {
cur++;
target++;
} else {
if (*target == '$') {
past = YES;
i++;
target++;
} else
return NO;
}
}
return (past || (*target == '$') || (*target == '\0'));
}
return NO;
}
static const char *getQuotedString (char *quoted, const char *from,
const char *const end)
{
if (from && (from != end)) {
while ((from != end) && isspace(*from) && (*from != '\n'))
from++;
if ((from != end) && ((*from == '\'') || (*from == '"'))) {
char *cur;
char c = *(from++);
cur = quoted;
while ((from != end) && *from && (*from != c) && (*from != '\n'))
*(cur++) = *(from++);
*cur = '\0';
}
}
return from;
}
@implementation GnuplotInspector
static id gnuplotInspector = nil;
+ new
{
if (gnuplotInspector == nil) {
char path[MAXPATHLEN+1];
NXBundle *bundle = [NXBundle bundleForClass:self];
self = gnuplotInspector = [super new];
if ([bundle getPath:path
forResource:"GnuplotInspector"
ofType:"nib"]) {
[NXApp loadNibFile:path owner:gnuplotInspector];
} else {
fprintf (stderr, "Couldn't load GnuplotInspector.nib\n");
gnuplotInspector = nil;
}
}
return gnuplotInspector;
}
- ok:sender
{
[super ok:sender];
return self;
}
- revert:sender
{
NXStream *s;
char *text;
char path[MAXPATHLEN];
int len, maxlen;
/* Open a memory stream and get a pointer to the buffer */
[self selectionPathsInto:path separator:':'];
if (s = NXMapFile (path, NX_READONLY)) {
NXGetMemoryBuffer(s, &text, &len, &maxlen);
[self _getCommandsFromBuffer:text end:text+len];
NXCloseMemory (s,NX_FREEBUFFER);
if (type & TYPE_UNKNOWN)
strcpy (typestring, "Unknown");
else {
if (type & TYPE_TWOD) {
strcpy (typestring, "Two-dimensional");
if (type & TYPE_POLAR)
strcat (typestring, " Polar");
} else {
strcpy (typestring, "Three-dimensional");
if (type & TYPE_CONTOURS)
strcat (typestring, " with Contours");
}
if (type & TYPE_PARAMETRIC)
strcat (typestring, " Parametric");
}
[typeField setStringValue:typestring];
[titleText setText:title];
[expressionsText setText:expressions];
}
[super revert:sender];
return self;
}
@end
@implementation GnuplotInspector(Private)
- _getCommandsFromBuffer:(const char *)buf end:(const char *const) end
{
const char *cur;
char *tc = title;
char *ec = expressions;
type = TYPE_UNKNOWN;
*title = '\0';
*expressions = '\0';
cur = skipSpace (buf, end);
while (cur && (cur != end) && *cur) {
if (almost (cur, "se$t", end)) { /* set... */
cur = skipSpace(skipToSpace (cur, end), end);
if (almost (cur, "tit$le", end)) { /* ...title */
cur = skipToSpace (cur, end);
cur = getQuotedString (tc, cur, end);
} else if (almost (cur, "noco$ntour", end))
type &= ~TYPE_CONTOURS;
else if (almost (cur, "co$ntour", end))
type |= TYPE_CONTOURS;
else if (almost (cur, "nopo$lar", end))
type &= ~TYPE_POLAR;
else if (almost (cur, "pol$ar", end))
type |= TYPE_POLAR;
else if (almost (cur, "nopar$ametric", end))
type &= ~TYPE_PARAMETRIC;
else if (almost (cur, "par$ametric", end))
type |= TYPE_PARAMETRIC;
} else if (almost(cur,"p$lot",end) || almost(cur,"sp$lot",end)) {
type &= ~TYPE_UNKNOWN;
if (*cur == 'p')
type |= TYPE_TWOD;
else
type &= ~TYPE_TWOD;
cur = skipSpace(skipToSpace (cur, end), end);
while (cur != end) {
if ((*cur == '\'') || (*cur == '"')) {
char c = *(ec++) = *(cur++);
while ((cur != end) && (*cur != c) && (*cur != '\n'))
*(ec++) = *(cur++);
if (*cur == c)
*(ec++) = *(cur++);
} else if (*cur == '(') {
int count = 1;
while (count) {
*(ec++) = *(cur++);
if (cur != end) {
if (*cur == '(')
count++;
else if (*cur == ')')
count--;
} else
break;
}
if (cur != end)
*(ec++) = *(cur++);
else
break;
} else if (*cur == '\n') {
if (*(cur-1) == '\\') {
ec--;
cur = skipSpace(cur, end);
} else
break;
} else if (*cur == ',') {
*(ec++) = '\n';
cur = skipSpace(cur+1, end);
} else if (*cur == '#')
break;
else
*(ec++) = *(cur++);
}
*ec = '\0';
break; /* Ignore eveything after the first plot command */
}
while ((cur != end) && (*cur != '\n')) /* Go to next line */
cur++;
cur = skipSpace (cur, end);
}
return self;
}
// Shuts up the compiler about unused RCSId
- (const char *) rcsid
{
return RCSId;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.