This is MiscString.DExtensions.m in view mode; [Download] [Up]
#import "MiscString.DExtensions.h" @implementation MiscString(DExtensions) #define MISC_OCTAL_REGEX "\\\\[0-9][0-9][0-9]*" // you could need it to read an .addresses file. - collapseOctalQuotedDigits { int spot,i,val; for(i=0;(spot=[self spotOfRegex:MISC_OCTAL_REGEX occurrenceNum:i]) >=0;) { sscanf(buffer+spot+1,"%o",&val); if(!val) i++; [self replaceRegex:MISC_OCTAL_REGEX withChar:(char)val occurrenceNum:i]; } return self; } - collapseBackslashQuotedChars { [self replaceEveryOccurrenceOf:"\\n" withChar:'\n']; [self replaceEveryOccurrenceOf:"\\t" withChar:'\t']; [self replaceEveryOccurrenceOf:"\\r" withChar:'\r']; [self replaceEveryOccurrenceOf:"\\\"" withChar:'\"']; return self; } - collapseHTMLQuotedChars { [self replaceEveryOccurrenceOf:"ä" withChar:'Ù']; [self replaceEveryOccurrenceOf:"ö" withChar:'ö']; [self replaceEveryOccurrenceOf:"ü" withChar:'ö']; [self replaceEveryOccurrenceOf:"Ä" withChar:'…']; [self replaceEveryOccurrenceOf:"Ö" withChar:'–']; [self replaceEveryOccurrenceOf:"Ü" withChar:'š']; [self replaceEveryOccurrenceOf:"ß" withChar:'û']; [self replaceEveryOccurrenceOf:"<" withChar:'<']; [self replaceEveryOccurrenceOf:">" withChar:'>']; [self replaceEveryOccurrenceOf:""" withChar:'\"']; [self replaceEveryOccurrenceOf:"&" withChar:'&']; return self; } - expandBackslashQuotedChars {// [self replaceEveryOccurrenceOfChar:'\\' with:"\\\\"]; [self replaceEveryOccurrenceOfChar:'\n' with:"\\n"]; [self replaceEveryOccurrenceOfChar:'\t' with:"\\t"]; [self replaceEveryOccurrenceOfChar:'\r' with:"\\r"]; [self replaceEveryOccurrenceOfChar:'\"' with:"\\\""]; return self; } - expandUnprintableCharsToOctalQuotedDigits { #if 0 // not implemented while¼ if(!NXPrint(c)) theStr=[initFromFormat:"\\%o",c],[self replaceCharWithString:theStr #endif return self; } - trimLeadChars:(const char*)chars { const char *p=buffer; while(strchr(chars,*p)) p++; if(p != buffer) [self removeFrom:0 length:p-buffer]; [self recalcLength]; return self; } - trimTrailChars:(const char*)chars respectQuotationBy:(unsigned int) qc { char *p=buffer+strlen(buffer); while(strchr(chars,*p) && (*(MAX(p-1,buffer)) != qc) ) *p--=0; [self recalcLength]; return self; } - trimTrailChars:(const char*)chars { return [self trimTrailChars:chars respectQuotationBy:0]; } - trimChars:(const char*)chars { [self trimTrailChars:chars respectQuotationBy:0]; [self trimLeadChars:chars]; return self; } -(BOOL) unbalancedQuotation:(char)theChar { int cnt=[self numOfChar:theChar]; if(cnt) return cnt&1; else return NO; } - tokenize:(const char *)breakChars into:theList fieldsQuotatedBy:(char) theChar { List *tokenList=[self tokenize:breakChars into:theList]; if(!theList) theList=tokenList; if(theChar) { int cnt=0; MiscString *theStr; while(theStr=[theList objectAt:cnt++]) { if([theStr unbalancedQuotation:theChar]) { MiscString *currStr; while(currStr=[theList objectAt:cnt++]) { [theStr cat:breakChars],[theStr concatenate:currStr]; [theList removeObject:currStr],cnt--; if([currStr unbalancedQuotation:theChar]) { break; } } } } } return theList; } -(BOOL) streq:(char*)thestr { return !strcmp(buffer,thestr); } -(BOOL) casestreq:(char*)thestr { return !strcasecmp(buffer,thestr); } - streamPuts:(NXStream *) stream { NXPrintf(stream, "%s\n", buffer); return self; } - extractBracketsContentWithPrefix:(const char *) thePrefix positionInsideLeft:(int*) insidePos positionRight:(int*) rightPos leftBracket:(unsigned int) lc rightBracket:(unsigned int) rc deleteContent:(BOOL) doDel { MiscString *ret; int left,right,lcnt; for(lcnt=0,left= *insidePos;(buffer[left] != lc || lcnt> 0) && left;left--) { if(buffer[left] == lc) lcnt--; if(buffer[left] == rc) lcnt++; if(lcnt<=0 && buffer[left] == lc) break; } for(lcnt=0, right=*insidePos;(buffer[right] != rc || lcnt> 0) && buffer[right];right++) { if(buffer[right] == rc) lcnt--; if(buffer[right] == lc) lcnt++; if(lcnt<=0 && buffer[right] == rc){right++; break;} } if(buffer[left] !=lc || buffer[right] !=rc) { return nil; } else ret=[self midFrom:left+1 to:right-1]; (*rightPos)=right; if(doDel) { if(thePrefix && strlen(thePrefix)) { if(!strncmp(thePrefix,buffer+left-strlen(thePrefix), strlen(thePrefix))) left-=strlen(thePrefix); } [self removeFrom:left to:right]; (*insidePos)=left; } return ret; } -(int) spotOfChar:(int)c startingAt:(int)currPos { const char *ptr; if(length< currPos) return -1; if(ptr=strchr(buffer+currPos,c)) return ptr-buffer; else return -1; } -(BOOL) isWhite { int i; for(i=0;buffer[i];i++) { if(!NXIsSpace(buffer[i])) return NO; } return YES; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.