This is MatrixSet.m in view mode; [Download] [Up]
#import "MatrixSet.h" #import "ColumnMatrix.h" #import "instr.h" #import "regexpr.h" #import "Article.h" @implementation MatrixSet - init { [super init]; currentSelection=nil; numSelCells=0; return self; } - theMatrix { return myMatrix; } - (List *)matrixList { return myMList; } - (int)numSelCells { return numSelCells; } - redisplayMatrix { [myMatrix display]; return self; } - currentSelection { return currentSelection; } - sync { [self syncAndReturnList:NO]; return self; } - syncAndReturnList:(BOOL)flag { List *selectionList=[myMatrix getCurrSelections]; int oldNumSelCells=numSelCells; numSelCells=[selectionList count]; if(numSelCells==1) currentSelection=[selectionList objectAt:0]; else currentSelection=nil; if((oldNumSelCells==1)&&(numSelCells!=1)) [unselTarget perform:unselAction]; if(flag==FALSE){ [selectionList free]; return self; } return selectionList; } - (const char *)stringValueForCellAt:(int)index { return [[myMList objectAt:index] stringValue]; } - (int)grep:(const char *)pattern regexpr:(BOOL)regexpr cases:(BOOL)cases { int i,j; List *selList; unsigned char fm[256], tr[256]; struct re_pattern_buffer rpat; selList=[[List alloc] init]; j=[myMList count]; if(j==0) return 0; if(regexpr){ char *str; memset(&rpat, 0, sizeof(rpat)); for(i=256; i--;) tr[i] = i; if(!cases) for(i='A'; i<='Z'; i++) tr[i] = i-'A'+'a'; rpat.translate = tr; rpat.fastmap = fm; str = re_compile_pattern((char *)pattern,strlen(pattern), &rpat); if (str!=NULL) return (strcmp(str, "Out of memory")?SEARCH_INVALID_REGEXPR:SEARCH_INTERNAL_ERROR); } for(i=0;i<j;i++){ const char *cellString=[self stringValueForCellAt:i]; BOOL found=FALSE; if(regexpr){ int l=strlen(cellString); int p=re_search_pattern(&rpat,(char *)cellString,l,0,l,0); if(p==-2) return SEARCH_INTERNAL_ERROR; found= (p==-1)? FALSE : TRUE; } else found=(instr(cellString,pattern,cases)!=NULL); if(found) [selList addObject:[myMList objectAt:i]]; } j=[selList count]; if(j>0){ [myMList makeObjectsPerform:@selector(unsetTag)]; [selList makeObjectsPerform:@selector(setTag)]; for(i=0;i<j;i++) if([[selList objectAt:i] isTaged]){ [[myMatrix reloadMatrix] display]; [self sync]; break; } if(i==j) j=0; //articles may be killed } [selList free]; return j; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.