This is HAddColFunction.m in view mode; [Download] [Up]
/* HaddColFuncton.m by Paul Kunz November 1992 * Hippo function to add column to n-tuple * * Copyright (C) 1992 The Board of Trustees of * The Leland Stanford Junior University. All Rights Reserved. */ #import "Draw.subproj/draw.h" #import "HAddColFunction.h" const char HAddColFunction_h_rcsid[] = HADDCOLFUNCTION_H_ID; const char HAddColFunction_m_rcsid[] = "$Id: HAddColFunction.m,v 2.8.2.1 1994/01/05 02:21:58 rensing Exp $"; #import "HDrawApp.h" #import "HTuple.h" #import "InspectFunc.h" #include <ctype.h> /* * function to produce a valid (C) variable name from an arbitrary string */ static void makeVarName(char *); @implementation HAddColFunction - init { [super init]; colIndex = -1; /* indicates not yet loaded */ return self; } - initSource:(LANGUAGE)aLanguage for:(HTuple *)hTuple withName:(const char *)aName { ntuple nt; char string[33]; int i, count; [self init]; language = aLanguage; name = NXCopyStringBufferFromZone( aName, [self zone] ); codeStream = NXOpenMemory(NULL, 0, NX_READWRITE); initHTuple = hTuple; nt = [hTuple ntuple]; switch (language) { case ANSI_C: NXPrintf(codeStream, "#include <math.h>\n" ); NXPrintf(codeStream, "\n"); if (nt) { NXPrintf(codeStream, "struct ntRow {\n"); count = h_getNtDim(nt); for (i = 0; i < count; i++) { strncpy(string,h_getNtLabel(nt, i),32); makeVarName(string); NXPrintf(codeStream, " float %s;\n", string); } NXPrintf(codeStream, "};\n\n"); } NXPrintf(codeStream, "float %s( int row, const struct ntRow *tuple )\n", name); NXPrintf(codeStream, "{\n\n"); NXPrintf(codeStream, " float returnValue;\n"); NXPrintf(codeStream, "\n"); NXPrintf(codeStream, " return returnValue;\n"); NXPrintf(codeStream, "}\n"); break; case FORTRAN: NXPrintf(codeStream, " Real*4 Function %s( rowValue )\n", name ); NXPrintf(codeStream, "\n" ); NXPrintf(codeStream, " Real*4 rowValue(*)\n" ); NXPrintf(codeStream, "\n" ); if ( nt) { count = h_getNtDim(nt); for ( i = 0; i < count; i++ ) { strncpy(string,h_getNtLabel(nt, i),32); makeVarName(string); NXPrintf(codeStream, " Real*4 %s\n", string); NXPrintf(codeStream, " Equivalence(%s, rowValue(%d))\n", string, i ); } NXPrintf(codeStream, "\n"); } NXPrintf(codeStream, " Real*4 returnValue\n"); NXPrintf(codeStream, "\n"); NXPrintf(codeStream, " %s = returnValue\n", name ); NXPrintf(codeStream, " return\n"); NXPrintf(codeStream, " end\n"); break; default: break; } NXFlush(codeStream); return self; } /* Column related stuff from Qureshi * should be separted out in other class *Begin - initColumnText:(int) aLanguage { char string[33]; int i, count; language = aLanguage; codeStream = NXOpenMemory(NULL, 0, NX_READWRITE); switch (language) { case ANSI_C: NXPrintf(codeStream, "#include <math.h>\n" ); NXPrintf(codeStream, "\n"); if (inputTuple) { count = h_getNtDim(inputTuple); for (i = 0; i < count; i++) { strncpy(string,h_getNtLabel(inputTuple, i),32); NXPrintf(codeStream, "#define \t%s \t %d\n", string,i+1); } NXPrintf(codeStream, "\n\n"); } NXPrintf(codeStream, "float %s( float *column, int size, int columnNumber )\n", name); NXPrintf(codeStream, "{\n"); NXPrintf(codeStream, " float returnValue;\n\n"); NXPrintf(codeStream, "\n"); NXPrintf(codeStream, " return returnValue;\n"); NXPrintf(codeStream, "}\n"); break; case FORTRAN: NXPrintf(codeStream, " Real*4 Function %s( rowValue )\n", name ); NXPrintf(codeStream, "\n" ); NXPrintf(codeStream, " Real*4 rowValue(*)\n" ); NXPrintf(codeStream, "\n" ); if ( inputTuple) { count = h_getNtDim(inputTuple); for ( i = 0; i < count; i++ ) { strncpy(string,h_getNtLabel(inputTuple, i),32); makeVarName(string); NXPrintf(codeStream, " Real*4 %s\n", string); NXPrintf(codeStream, " Equivalence(%s, rowValue(%d))\n", string, i ); } NXPrintf(codeStream, "\n"); } NXPrintf(codeStream, " Real*4 returnValue\n"); NXPrintf(codeStream, "\n"); NXPrintf(codeStream, " %s = returnValue\n", name ); NXPrintf(codeStream, " return\n"); NXPrintf(codeStream, " end\n"); break; } return self; } End */ - (HTuple *) hTuple { return initHTuple; } - (int) colIndex { return colIndex; } - replace:(HTuple *)oldTuple with:(HTuple *)newTuple { initHTuple = newTuple; return self; } typedef float (*colFunc)(int,const float *); - (int) executeWith:(ntuple) nt { int i, count; float *ntRow = NULL; float *col; int rowSize; if (!function) { return (-1); } if ( colIndex < 0 ) { if ((colIndex = h_addColumn( nt )) < 0) return (-1); } if ( name ) h_setNtLabel( nt, colIndex, name ); col = h_getNtColumn( nt, colIndex ); count = h_getNtNdata(nt); for ( i = 0; i < count; i++ ) { ntRow = h_getNtData(nt, i, ntRow, &rowSize); *col++ = (*(colFunc)function)(i,ntRow); } free(ntRow); return 0; } - (int) runWith:(HTuple *)hTuple { HDrawApp *hippoDraw; InspectFunc *inspector; int irc; hippoDraw = NXGetNamedObject("HDrawInstance", NXApp); irc = [self saveToTmpFile]; if ( irc != 0 ) return irc; inspector = [hippoDraw inspectFunc]; irc = [inspector performFunction:self with:[hTuple ntuple]]; return irc; } /* Something left over from Qureshi's column functions * can't possible be working since compiler is undefined * Begin: - executeColumn { int i, count; float *ntCol = NULL; float *array; int colSize; colfunction = [compiler findSymbol:name]; if (!colfunction) { return self; } count = h_getNtDim(inputTuple); colSize = h_getNtNdata(inputTuple); array = (float*)malloc((count+2)*(sizeof(float))); for (i=0; i < count; i++) { ntCol = (float*)h_getNtColumn(inputTuple,i); array[i] = (*colfunction)(ntCol,colSize,i+1); } h_arrayFill(inputTuple, array ); return self; } end */ static void makeVarName(char *var) { if (*var == '\0') return; /* first character MUST be an letter */ if (! isalpha(*var)) *var++ = 'a'; while (*var != '\0') { if (! isalnum(*var)) { /* try to make the variable name somewhat unique */ switch (*var) { case '!': *var = '1'; break; case '@': *var = '2'; break; case '#': *var = '3'; break; case '$': *var = '4'; break; case '%': *var = '5'; break; case '^': *var = 'U'; break; case '&': *var = '7'; break; case '*': *var = 'S'; break; case '(': *var = '_'; break; case ')': *var = '_'; break; case '-': *var = 'M'; break; case '+': *var = 'P'; break; case '=': *var = 'E'; break; default : *var = '_'; break; } } var++; } } - write:(NXTypedStream *)ts { [super write:ts]; NXWriteObjectReference( ts, initHTuple ); return self; } - read:(NXTypedStream *)ts { [super read:ts]; initHTuple = NXReadObject(ts); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.