magix wrote:
Dear Guru,
P/S: this is not school homeworks or anything. I'm a working adult, just my
personal interest in programming.
Regards.
Yeah anyways, best to avoid strtok(), as it is a handicapped interface,
atleast in my opinion. For these types of routines, I typically just
use self-written stuff utilizing standard unix iovec structures
(although these are not necessarily required).
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#ifdef HAVE_UIO /* avoid comp.lang.c warnings */
#include <sys/uio.h>
#else
struct iovec {
void *iov_base;
size_t iov_len;
};
#endif
typedef struct iovec iov;
size_t iovtok(iov *v, size_t vc, const char *q, size_t sz, const char
*t, size_t tsz)
{
const char *p, *r;
size_t vct, tszt;
for (vct = 0, p = q, r = q + sz; vct < vc && q < r; q++) {
for (tszt = tsz; tszt; tszt--)
if (*q == t[tszt - 1]) break;
if (tszt == 0) {
continue;
} else if (q != p) {
v[vct].iov_base = (void *)p;
v[vct].iov_len = q - p;
vct++;
}
p = q + 1;
}
if (vct < vc && q != p) {
v[vct].iov_base = (void *)p;
v[vct].iov_len = q - p;
vct++;
}
return vct;
}
int main(int argc, char **argv)
{
char buf[1024];
size_t tl, c, vc, vct;
iov *v;
if (argc <= 2) return -1;
if ((vc = strtol(argv[1], 0, 10)) <= 0) return -1;
if ((v = malloc(sizeof(*v) * vc)) == NULL) return -1;
for (tl = strlen(argv[2]); fgets(buf, sizeof(buf), stdin); ) {
vct = iovtok(v, vc, buf, strlen(buf) - 1, argv[2], tl);
fprintf(stderr, "vct == %ld\n", (long)vct);
for (c = 0; c < vct; c++) {
fprintf(stderr,
"v[%ld].iov_len == %ld\n",
(long)c,
(long)v[c].iov_len);
fprintf(stderr,
"v[%ld].iov_base == \"%.*s\"\n",
(long)c,
(int)v[c].iov_len,
(char *)v[c].iov_base);
}
}
free(v);
return 0;
}
--
$ gcc -Wall -W -ansi -pedantic -g3 -o memsplt memsplt.c
$ ./memsplt.exe 10 "1" << EOF
NE341LCBAA35
NE311LCBAA35
NE141LCBAA35
NE31341LCBAA35
EOF
vct == 2
v[0].iov_len == 4
v[0].iov_base == "NE34"
v[1].iov_len == 7
v[1].iov_base == "LCBAA35"
vct == 2
v[0].iov_len == 3
v[0].iov_base == "NE3"
v[1].iov_len == 7
v[1].iov_base == "LCBAA35"
vct == 3
v[0].iov_len == 2
v[0].iov_base == "NE"
v[1].iov_len == 1
v[1].iov_base == "4"
v[2].iov_len == 7
v[2].iov_base == "LCBAA35"
vct == 3
v[0].iov_len == 3
v[0].iov_base == "NE3"
v[1].iov_len == 2
v[1].iov_base == "34"
v[2].iov_len == 7
v[2].iov_base == "LCBAA35"
I'm sure you can figure out the appropriate code logic to determine 5
vs 7, etc.