94 lines
2.6 KiB
C
94 lines
2.6 KiB
C
|
/* Implement powerset-related runtime actions for CHILL.
|
||
|
Copyright (C) 1992, 93, 1994 Free Software Foundation, Inc.
|
||
|
Author: Bill Cox
|
||
|
|
||
|
This file is part of GNU CC.
|
||
|
|
||
|
GNU CC 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 2, or (at your option)
|
||
|
any later version.
|
||
|
|
||
|
GNU CC 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 GNU CC; see the file COPYING. If not, write to
|
||
|
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||
|
|
||
|
#define __CHILL_LIB__
|
||
|
|
||
|
#include "powerset.h"
|
||
|
|
||
|
extern void cause_exception (char *exname, char *file, int lineno);
|
||
|
|
||
|
/*
|
||
|
* function __concatps
|
||
|
*
|
||
|
* parameters:
|
||
|
* OUT - pointer to output PS
|
||
|
* LEFT - pointer to left PS
|
||
|
* LEFTLEN - length of left PS in bits
|
||
|
* RIGHT - pointer to right PS
|
||
|
* RIGHTLEN - length of right PS in bits
|
||
|
*
|
||
|
* returns:
|
||
|
* void
|
||
|
*
|
||
|
* exceptions:
|
||
|
* none
|
||
|
*
|
||
|
* abstract:
|
||
|
* concatenates two powersets into the output powerset.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
extern void
|
||
|
__pscpy (SET_WORD *dps,
|
||
|
unsigned long dbl,
|
||
|
unsigned long doffset,
|
||
|
SET_WORD *sps,
|
||
|
unsigned long sbl,
|
||
|
unsigned long start,
|
||
|
unsigned long length);
|
||
|
|
||
|
void
|
||
|
__concatps (out, left, leftlen, right, rightlen)
|
||
|
SET_WORD *out;
|
||
|
SET_WORD *left;
|
||
|
unsigned long leftlen;
|
||
|
SET_WORD *right;
|
||
|
unsigned long rightlen;
|
||
|
{
|
||
|
/* allocated sizes for each set involved */
|
||
|
unsigned long outall, leftall, rightall;
|
||
|
|
||
|
if (!out)
|
||
|
{
|
||
|
/* FIXME: cause an exception */
|
||
|
}
|
||
|
else if (leftlen == 0 || !left)
|
||
|
{
|
||
|
if (rightlen == 0 || !right)
|
||
|
return; /* no work to do */
|
||
|
__pscpy (out, rightlen, (unsigned long)0,
|
||
|
right, rightlen, (unsigned long)0, rightlen);
|
||
|
}
|
||
|
else if (rightlen == 0 || !right)
|
||
|
{
|
||
|
if (leftlen == 0 || !left)
|
||
|
return; /* no work to do */
|
||
|
__pscpy (out, leftlen, (unsigned long)0,
|
||
|
left, leftlen, (unsigned long)0, leftlen);
|
||
|
}
|
||
|
/* copy the left powerset into bits 0..leftlen - 1 */
|
||
|
__pscpy (out, leftlen + rightlen, (unsigned long)0,
|
||
|
left, leftlen, (unsigned long)0, leftlen);
|
||
|
|
||
|
/* copy the right powerset into bits leftlen..leftlen+rightlen-1 */
|
||
|
__pscpy (out, leftlen + rightlen, leftlen,
|
||
|
right, rightlen, (unsigned long)0, rightlen);
|
||
|
}
|