/*
* Copyright (c) 2002, The Tendra Project
* All rights reserved.
*
* 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 unmodified, 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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.
*
*
* Crown Copyright (c) 1997
*
* This TenDRA(r) Computer Program is subject to Copyright
* owned by the United Kingdom Secretary of State for Defence
* acting through the Defence Evaluation and Research Agency
* (DERA). It is made available to Recipients with a
* royalty-free licence for its use, reproduction, transfer
* to other parties and amendment for any purpose not excluding
* product development provided that any such use et cetera
* shall be deemed to be acceptance of the following conditions:-
*
* (1) Its Recipients shall ensure that this Notice is
* reproduced upon any copies or amended versions of it;
*
* (2) Any amended version of it shall be clearly marked to
* show both the nature of and the organisation responsible
* for the relevant amendment or amendments;
*
* (3) Its onward transfer from a recipient to another
* party shall be deemed to be that party's acceptance of
* these conditions;
*
* (4) DERA gives no warranty or assurance as to its
* quality or suitability for any purpose and DERA accepts
* no liability whatsoever in relation to any use to which
* it may be put.
*
* $TenDRA: tendra/src/tools/pl/readstreams.c,v 1.6 2005/09/18 20:28:57 stefanf Exp $
*/
#include "config.h"
#include "readstreams.h"
#include "enc_nos.h"
#include "errors.h"
#include "decodings.h"
#include "defs.h"
#include "fmm.h"
#include "msgcat.h"
Instream * curin;
unsigned int
get_bit(void)
{
unsigned int x;
Chunk * ch = curin->ch;
if (ch == (Chunk*)0) return 2; /* end of stream */
while (ch->usage==0 && ch->offst==0) {
Assert(curin->bit_pos==0 && curin->byte_pos==0);
ch = curin->ch = ch->next;
if (ch == (Chunk*)0) return 2; /* end of stream */
}
x = UI(ch->data[curin->byte_pos])>>(7-curin->bit_pos);
if (++curin->bit_pos >=8) {
curin->bit_pos =0;
curin->byte_pos++;
}
if (curin->byte_pos == ch->usage && curin->bit_pos==ch->offst) {
curin->ch = ch->next;
curin->byte_pos = 0;
curin->bit_pos = 0;
}
return (x & 1);
}
unsigned int
get_basic_int(int bts, Bool e)
{
int i;
unsigned int ans = get_bit();
for (i=1; ibit_pos!=0) IGNORE get_bit();
for (; i != 0; i--) IGNORE get_basic_int(8,0);
indent(n);
IGNORE printf("BYTESTREAM\n");
return i;
}
unsigned int
d_tdfident(int n)
{
return d_tdfstring(n);
}
static unsigned int
d_X(unsigned int rsort, int n)
{
switch (rsort) {
case e_access: IGNORE d_access(n); break;
case e_alignment_sort: IGNORE d_alignment(n); break;
case e_al_tag: IGNORE d_al_tag(n); break;
case e_bitfield_variety: IGNORE d_bitfield_variety(n); break;
case e_bool: IGNORE d_bool(n); break;
case e_error_treatment: IGNORE d_error_treatment(n); break;
case e_exp: IGNORE d_exp(n); break;
case e_floating_variety: IGNORE d_floating_variety(n); break;
case e_label: IGNORE d_label(n); break;
case e_nat: IGNORE d_nat(n); break;
case e_ntest: IGNORE d_ntest(n); break;
case e_rounding_mode: IGNORE d_rounding_mode(n); break;
case e_shape: IGNORE d_shape(n); break;
case e_signed_nat: IGNORE d_signed_nat(n); break;
case e_tag: IGNORE d_tag(n); break;
case e_token: IGNORE d_token(n); break;
case e_transfer_mode: IGNORE d_transfer_mode(n); break;
case e_variety: IGNORE d_variety(n); break;
default: MSG_not_first_class_sort();
}
return rsort;
}
static unsigned int
d_token_definition(int n)
{
unsigned int srt;
unsigned int nl;
IGNORE get_basic_int(1,0);
srt = d_sortname(n);
IGNORE get_basic_int(1,0);
nl = get_tdfint();
for (; nl != 0; nl--) IGNORE d_tokformals(n);
IGNORE d_X(srt,n+1);
return srt;
}
unsigned int
d_bitstream(char * s, int n)
{
unsigned int i = get_tdfint();
int l = (int) strlen(s);
indent(n);
IGNORE printf("BITSTREAM/%s\n", s);
if (strcmp(s+l-5,"_cond")==0) {
int j = 0;
for (; i != 0; i--) {
if (((j++)&31)==0) {
IGNORE printf("\n");
indent(n);
}
IGNORE printf("%u",get_bit());
}
IGNORE printf("\n");
} else if (strcmp(s+l-12,"_apply_token")==0) {
int j = 0;
for (; i != 0; i--) {
if (((j++)&31)==0) {
IGNORE printf("\n");
indent(n);
}
IGNORE printf("%u",get_bit());
}
IGNORE printf("\n");
} else if (strcmp(s,"make_tokdef")==0){
IGNORE d_token_definition(n+1);
} else if (strcmp(s,"use_tokdef")==0) {
IGNORE d_token_definition(n+1);
} else {
IGNORE fprintf(stderr, "Don't understand bitstream.\n");
exit(EXIT_FAILURE);
}
return i;
}
void
read_cur(unsigned int (*f)(int))
{
curin = xalloc(sizeof(*curin));
curin->ch = current_TDF->first;
curin->byte_pos = 0;
curin->bit_pos = 0;
IGNORE f(0);
}
void
print_res(void)
{
unsigned int i;
TDF * hold = current_TDF;
SELECT_UNIT(tokdec_unit);
for (i=0; i< current_TDF->no; i++) {
if (i==0) {read_cur(d_tokdec);}
else IGNORE d_tokdec(0);
}
SELECT_UNIT(tokdef_unit);
for (i=0; i< current_TDF->no; i++) {
if (i==0) {read_cur(d_tokdef);}
else IGNORE d_tokdef(0);
}
SELECT_UNIT(tagdec_unit);
for (i=0; i< current_TDF->no; i++) {
if (i==0) {read_cur(d_tagdec);}
else IGNORE d_tagdec(0);
}
SELECT_UNIT(tagdef_unit);
for (i=0; i< current_TDF->no; i++) {
if (i==0) {read_cur(d_tagdef);}
else IGNORE d_tagdef(0);
}
current_TDF = hold;
}