This is Card.m in view mode; [Download] [Up]
#import "Card.h" #import <appkit/nextstd.h> #define MAXDATA 1024 #define FACE_PTR(F) ((CardFace *)dataPtr+F) #define FACE_DATA(F) FACE_PTR(F)->data static int activeFace; /* which field to Find / Search on */ static int sortFlag; /* flag for sorting */ #define VALID_FACE(f) (f >= 0 && f < numElements) #define NOUGHT '\0' extern int re_exec(char *s); @implementation Card + initialize { [self setVersion:CARD_VERSION]; return self; } + new { return[self newCount:2]; } + newCount:(unsigned)numSlots { return[self newCount:numSlots elementSize:sizeof(CardFace) description:cardDescription]; } /* Set Global Parameters */ + (int)activeFace { return activeFace; } + setActiveFace:(int)face { activeFace = face; return self; } + (int)sortFlag { return sortFlag; } + setSortFlag:(int)flag { sortFlag = flag; return self; } /* Get data in and Out */ - printStream:(NXStream *)stream { char *tmp; int i; for (i = 0; i < numElements; i++) NXPrintf(stream, "\"%s\"%c", FACE_PTR(i)->data, (i < (numElements-1)) ? ',' : '\n'); return self; } static CardFace *getString(NXStream *stream) { static char temp[MAXDATA]; int i=0; char c; CardFace *face; while ((c=NXGetc(stream)) != '"') temp[i++] = c; NX_MALLOC(face,CardFace,1); NX_MALLOC(face->data,char,i+1); strncpy(face->data,temp,i); (face->data)[i]=NOUGHT; face->length = i; return face; } - scanStream:(NXStream *)stream { int count=0; char c; while ((c=NXGetc(stream)) != '\n') switch (c) { case '"': [self addElement:getString(stream)]; break; case ',': default: break; } return self; } - setFace:(int)face string:(STR) string { if (VALID_FACE(face)) { FACE_DATA(face) = string; FACE_PTR(face)->length = strlen(string); return self; } return nil; } - setFace:(int)face stream:(NXStream *) stream { char *buf; int len, maxlen; if (VALID_FACE(face)) { NXGetMemoryBuffer(stream, &buf, &len, &maxlen); NX_MALLOC(FACE_DATA(face), char, len + 1); strncpy(FACE_DATA(face), buf, len); FACE_DATA(face)[len] = NOUGHT; FACE_PTR(face)->length = len; return self; } return nil; } - (NXStream *) faceStream:(int)face; { if (VALID_FACE(face)) return NXOpenMemory(FACE_DATA(face), FACE_PTR(face)->length - 1, NX_READONLY); return NULL; } - (STR) faceString:(int)face; { if (VALID_FACE(face)) return FACE_DATA(face); return NULL; } - setFace:(int)face tag:(int)tag { FACE_PTR(face)->tag = tag; return self; } - (int)faceTag:(int)face { return FACE_PTR(face)->tag; } - setFace:(int)face object:anObject; { FACE_PTR(face)->object = anObject; return self; } - faceObject:(int)face; { return FACE_PTR(face)->object; } /* Find and Sort Methods */ - findSTR:(STR) aString { if (re_exec(FACE_DATA(activeFace))) return self; return nil; } static STR invert(STR s, int len) { STR temp; STR tptr; tptr = NX_MALLOC(temp, char, len + 1)+len; *tptr = NOUGHT; while (tptr > temp) *(--tptr) = *(s++); /* up to Null */ return temp; } - (int)compare:aCard /* (-, 0, +if self <, =, >aCard) */ { STR them, me; them = [aCard faceString:activeFace]; switch (sortFlag) { case CARDSORT_Tag: return FACE_PTR(activeFace)->tag - [aCard faceTag:activeFace]; case CARDSORT_InvFace: me = invert(FACE_DATA(activeFace), FACE_PTR(activeFace)->length); them = invert(them, strlen(them)); return strcmp(me, them); case CARDSORT_Face: default: return strcmp(FACE_DATA(activeFace), them); } } /* Target action methods */ - flip { CardFace face; face = *(CardFace *)[self elementAt:0]; [[self removeAt:0] addElement:(void *)&face]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.