]> err.no Git - sope/blob - sope-core/NGExtensions/NGStringScanEnumerator.m
minor cleanups
[sope] / sope-core / NGExtensions / NGStringScanEnumerator.m
1 /*
2   Copyright (C) 2000-2003 SKYRIX Software AG
3
4   This file is part of OGo
5
6   OGo is free software; you can redistribute it and/or modify it under
7   the terms of the GNU Lesser General Public License as published by the
8   Free Software Foundation; either version 2, or (at your option) any
9   later version.
10
11   OGo is distributed in the hope that it will be useful, but WITHOUT ANY
12   WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14   License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with OGo; see the file COPYING.  If not, write to the
18   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19   02111-1307, USA.
20 */
21 // $Id$
22
23 #include "NGStringScanEnumerator.h"
24 #include "common.h"
25 #include <ctype.h>
26
27 @implementation NGStringScanEnumerator
28
29 - (id)initWithData:(NSData *)_data maxLength:(unsigned int)_length {
30   if (_data == nil) {
31     [self release];
32     return nil;
33   }
34   
35   if ((self = [super init])) {
36     self->data      = [_data retain];
37     self->curPos    = 0;
38     self->maxLength = _length;
39   }
40   return self;
41 }
42
43 + (id)enumeratorWithData:(NSData *)_data maxLength:(unsigned int)_length {
44   return [[[self alloc] initWithData:_data maxLength:_length] autorelease];
45 }
46
47 - (void)dealloc {
48   [self->data release];
49   [super dealloc];
50 }
51
52 - (NSString *)nextObject {
53   register int i;
54   const unsigned char *bytes;
55   unsigned int length;
56   register int startPos = -1;
57   
58   bytes  = [self->data bytes];
59   length = [self->data length];
60
61   if (length == 0) {
62     [self->data release]; self->data = nil;
63     return nil;
64   }
65   
66   for (i = self->curPos; i < length; i++) {
67
68     if (isprint(bytes[i])) {
69       if (startPos == -1)
70         startPos = i;
71     }
72     else {
73       if (startPos != -1) {
74         if ((i - startPos) >= self->maxLength) {
75           self->curPos = i;
76           
77           return [NSString stringWithCString:(bytes + startPos)
78                            length:(i - startPos)];
79         }
80         startPos = -1;
81       }
82     }
83   }
84   /* end reached (can release data) */
85   [self->data release]; self->data = nil;
86   return nil;
87 }
88
89 @end /* NGStringScanEnumerator */
90
91 @implementation NSData(NGStringScanEnumerator)
92
93 - (NSEnumerator *)stringScanEnumeratorWithMaxStringLength:(unsigned int)_max {
94   return [NGStringScanEnumerator enumeratorWithData:self maxLength:_max];
95 }
96
97 - (NSEnumerator *)stringScanEnumerator {
98   return [self stringScanEnumeratorWithMaxStringLength:256];
99 }
100
101 @end /* NSData(Strings) */