blob: 25858dad8dc58765b39e14918e51fc9edbc0a49b [file] [log] [blame]
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <ctype.h>
#include "../hunspell/csutil.hxx"
#include "manparser.hxx"
#ifndef W32
using namespace std;
#endif
ManParser::ManParser() {
}
ManParser::ManParser(const char * wordchars)
{
init(wordchars);
}
ManParser::ManParser(unsigned short * wordchars, int len)
{
init(wordchars, len);
}
ManParser::~ManParser()
{
}
char * ManParser::next_token()
{
for (;;) {
switch (state)
{
case 1: // command arguments
if (line[actual][head] == ' ') state = 2;
break;
case 0: // dot in begin of line
if (line[actual][0] == '.') {
state = 1;
break;
} else {
state = 2;
}
// no break
case 2: // non word chars
if (is_wordchar(line[actual] + head)) {
state = 3;
token = head;
} else if ((line[actual][head] == '\\') &&
(line[actual][head + 1] == 'f') &&
(line[actual][head + 2] != '\0')) {
head += 2;
}
break;
case 3: // wordchar
if (! is_wordchar(line[actual] + head)) {
state = 2;
char * t = alloc_token(token, &head);
if (t) return t;
}
break;
}
if (next_char(line[actual], &head)) {
state = 0;
return NULL;
}
}
}