/*
* dump.c - Jspell's dump mode
*
* Copyright 1992, 1993, Geoff Kuenning, Granada Hills, CA
* All rights reserved.
*
* Copyright 1994 by Ulisses Pinto & Jose' Joa~o Almeida, Universidade do Minho
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All modifications to the source code must be clearly marked as
* such. Binary redistributions based on modified source code
* must be clearly marked as modified versions in the documentation
* and/or other materials provided with the distribution.
* 4. All advertising materials mentioning features or use of this software
* must display the following acknowledgment:
* This product includes software developed by Geoff Kuenning and
* other unpaid contributors.
* 5. The name of Geoff Kuenning may not be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY GEOFF KUENNING AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL GEOFF KUENNING OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
* $Log$
* Revision 1.3 2006/05/18 14:44:56 ambs
* AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGH@!
*
* Revision 1.2 2001/06/12 07:58:05 albie
* - changed from mktemp to mkstemp
* - removed aclocal file
* - added a config.h.in file to make the config.h file being generated by
* autoconf
* - removed all lint stuff
* - corrected perl makefile
*
* Revision 1.1.1.1 2001/03/05 08:54:31 jj
*
*
* Analizador ortografico jspell
*
* Revision 1.00 1994/07/09
*/
#include "jsconfig.h"
#include "jspell.h"
#include "proto.h"
void dumpmode(void);
static void tbldump(struct flagent * flagp, int numflags);
static void entdump(struct flagent * flagp);
static void setdump(char * setp, int mask);
static void subsetdump(char * setp, int mask, int dumpval);
void dumpmode()
{
if (hashheader.flagmarker == '\\'
|| hashheader.flagmarker == '#'
|| hashheader.flagmarker == '>'
|| hashheader.flagmarker == ':'
|| hashheader.flagmarker == '-'
|| hashheader.flagmarker == ','
|| hashheader.flagmarker == '[') /* ] */
printf("flagmarker \\%c\n", hashheader.flagmarker);
else if (hashheader.flagmarker < ' ' || hashheader.flagmarker >= 0177)
printf("flagmarker \\%3.3o\n",
(unsigned int) hashheader.flagmarker & 0xFF);
else
printf("flagmarker %c\n", hashheader.flagmarker);
if (numpflags) {
printf("prefixes\n");
tbldump(pflaglist, numpflags);
}
if (numsflags) {
printf("suffixes\n");
tbldump(sflaglist, numsflags);
}
}
/*---------------------------------------------------------------------------*/
static void tbldump(flagp, numflags) /* Dump a flag table */
register struct flagent *flagp; /* First flag entry to dump */
register int numflags; /* Number of flags to dump */
{
while (--numflags >= 0)
entdump(flagp++);
}
/*---------------------------------------------------------------------------*/
static void entdump(flagp) /* Dump one flag entry */
register struct flagent *flagp; /* Flag entry to dump */
{
register int cond; /* Condition number */
printf(" flag %s%c: ",
(flagp->flagflags & FF_CROSSPRODUCT) ? "*" : " ",
BITTOCHAR (flagp->flagbit));
for (cond = 0; cond < flagp->numconds; cond++) {
setdump(flagp->conds, 1 << cond);
if (cond < flagp->numconds - 1)
putc(' ', stdout);
}
if (cond == 0) /* No conditions at all? */
putc('.', stdout);
printf("\t> ");
putc('\t', stdout);
if (flagp->stripl)
printf("-%s,", ichartosstr(flagp->strip, 1));
printf("%s", flagp->affl ? ichartosstr(flagp->affix, 1) : "-");
if (flagp->jclass)
printf("\t; %s\n", ichartosstr(flagp->jclass, 1));
}
/*---------------------------------------------------------------------------*/
static void setdump(setp, mask) /* Dump a set specification */
register char *setp; /* Set to be dumped */
register int mask; /* Mask for bit to be dumped */
{
register int cnum; /* Next character's number */
register int firstnz; /* Number of first NZ character */
register int numnz; /* Number of NZ characters */
firstnz = numnz = 0;
for (cnum = SET_SIZE; --cnum >= 0; ) {
if (setp[cnum] & mask) {
numnz++;
firstnz = cnum;
}
}
if (numnz == 1)
putc(firstnz, stdout);
else if (numnz == SET_SIZE)
putc('.', stdout);
else if (numnz > SET_SIZE / 2) {
printf("[^");
subsetdump(setp, mask, 0);
putc(']', stdout);
}
else {
putc('[', stdout);
subsetdump(setp, mask, mask);
putc(']', stdout);
}
}
/*---------------------------------------------------------------------------*/
static void subsetdump (setp, mask, dumpval) /* Dump part of a set spec */
register char *setp; /* Set to be dumped */
register int mask; /* Mask for bit to be dumped */
register int dumpval; /* Value to be printed */
{
register int cnum; /* Next character's number */
register int rangestart; /* Value starting a range */
for (cnum = 0; cnum < SET_SIZE; setp++, cnum++) {
if (((*setp ^ dumpval) & mask) == 0) {
for (rangestart = cnum; cnum < SET_SIZE; setp++, cnum++) {
if ((*setp ^ dumpval) & mask)
break;
}
if (cnum == rangestart + 1)
putc(rangestart, stdout);
else if (cnum <= rangestart + 3) {
while (rangestart < cnum) {
putc(rangestart, stdout);
rangestart++;
}
}
else
printf("%c-%c", rangestart, cnum - 1);
}
}
}