/*
* Copyright (c) 2002 Tama Communications Corporation
*
* This file is part of GNU GLOBAL.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifdef HAVE_CONFIG_H
#include
#endif
#include
#include "split.h"
/*
* Substring manager like perl's split.
*
* Initial status.
* +------------------------------------------------------
* line |main 100 ./main.c main(argc, argv)\n
*
* The result of split(line, 4, &list):
*
* +------------------------------------------------------
* list line |main\0 100\0 ./main.c\0 main(argc, argv)\n
* +---------+ ^ ^ ^ ^ ^ ^ ^
* |npart=4 | | | | | | | |
* +---------+ | | | | | | |
* | start *----+ | | | | | |
* | end *--------+ | | | | |
* | save ' '| | | | | |
* +---------+ | | | | |
* | start *-----------------+ | | | |
* | end *--------------------+ | | |
* | save ' '| | | |
* +---------+ | | |
* | start *------------------------+ | |
* | end *--------------------------------+ |
* | save ' '| |
* +---------+ |
* | start *----------------------------------------+
* | end *--+
* | save | |
* +---------+ =
*
* The result of split(line, 2, &list):
*
* +------------------------------------------------------
* list line |main\0 100 ./main.c main(argc, argv)\n
* +---------+ ^ ^ ^
* |npart=2 | | | |
* +---------+ | | |
* | start *----+ | |
* | end *--------+ |
* | save ' '| |
* +---------+ |
* | start *-----------------+
* | end *--+
* | save | |
* +---------+ =
*
* The result of recover().
* +------------------------------------------------------
* line |main 100 ./main.c main(argc, argv)\n
*
* Recover() recover initial status of line with saved char in savec.
*/
#define isblank(c) ((c) == ' ' || (c) == '\t')
/*
* split: split a string into pieces
*
* i) line string
* i) npart parts number
* io) list split table
* r) part count
*/
int
split(char *line, int npart, SPLIT *list)
{
char *s = line;
struct part *part = &list->part[0];
int count;
if (npart > NPART)
npart = NPART;
npart--;
for (count = 0; *s && count < npart; count++) {
while (*s && isblank(*s))
s++;
if (*s == '\0')
break;
part->start = s;
while (*s && !isblank(*s))
s++;
part->end = s;
part->savec = *s;
part++;
}
if (*s) {
while (*s && isblank(*s))
s++;
part->start = s;
part->end = (char *)0;
part->savec = 0;
count++;
part++;
}
while (part-- > &list->part[0]) {
if (part->savec != '\0')
*part->end = '\0';
}
return list->npart = count;
}
/*
* recover: recover initial status of line.
*
* io) list split table
*/
void
recover(SPLIT *list)
{
int i, c;
for (i = 0; i < list->npart; i++) {
if ((c = list->part[i].savec) != '\0')
*(list->part[i].end) = c;
}
}
/*
* split_dump: dump split structure.
*/
void
split_dump(SPLIT *list)
{
int i;
struct part *part;
fprintf(stderr, "npart: %d\n", list->npart);
for (i = 0; i < list->npart; i++) {
part = &list->part[i];
fprintf(stderr, "string[%d]: |%s|\n", i, part->start);
fprintf(stderr, "savec[%d] : |%c|\n", i, part->savec);
}
}