2 * wiggle - apply rejected patches
4 * Copyright (C) 2003 Neil Brown <neilb@cse.unsw.edu.au>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 * Email: <neilb@suse.de>
26 * Split a stream into words or lines
29 * string of [A-Za-z0-9_]
31 * or single char (i.e. punctuation and newlines).
33 * A line is any string that ends with \n
35 * As a special case to allow proper aligning of multiple chunks
36 * in a patch, a word starting \0 will include 20 chars with a newline
37 * second from the end.
39 * We make two passes through the stream.
40 * Firstly we count the number of item so an array can be allocated,
41 * then we store start and length of each item in the array
50 #include "ccan/hash/hash.h"
52 static int split_internal(char *start
, char *end
, int type
,
62 if (type
== (ByWord
| IgnoreBlanks
))
64 (*cp
== ' ' || *cp
== '\t')) {
70 if (*cp
== '\0' && cp
+19 < end
&& cp
[18] == '\n') {
74 switch (type
& ByMask
) {
76 while (cp
< end
&& *cp
!= '\n')
82 if (isalnum(*cp
) || *cp
== '_') {
88 } else if (*cp
== ' ' || *cp
== '\t') {
99 if (type
== (ByWord
| IgnoreBlanks
) &&
100 *start
&& *start
!= '\n')
102 (*cp2
== ' ' || *cp2
== '\t' || *cp2
== '\n')) {
109 list
->len
= cp
-start
;
110 list
->plen
= cp2
-start
;
111 list
->prefix
= prefix
;
113 list
->hash
= hash(start
, list
->len
, 0);
115 list
->hash
= atoi(start
+1);
124 struct file
split_stream(struct stream s
, int type
)
134 cnt
= split_internal(c
, end
, type
, NULL
);
135 f
.list
= xmalloc(cnt
*sizeof(struct elmnt
));
137 f
.elcnt
= split_internal(c
, end
, type
, f
.list
);