separate "nonidentical conversion" and "ilseq" under csmapper.
"nonidentical" means "the input character index is valid, but not corresponding to the output codeset." "ilseq" means "the input character index is invalid for the input codeset."
This commit is contained in:
parent
8e90cd9ce4
commit
c1e771ab90
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: citrus_mapper.h,v 1.2 2003/07/10 08:50:44 tshiozak Exp $ */
|
||||
/* $NetBSD: citrus_mapper.h,v 1.3 2003/07/12 15:39:19 tshiozak Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c)2003 Citrus Project,
|
||||
|
@ -52,12 +52,12 @@ __END_DECLS
|
|||
#include "citrus_mapper_local.h"
|
||||
|
||||
/* return values of _citrus_mapper_convert */
|
||||
#define _CITRUS_MAPPER_CONVERT_SUCCESS (0)
|
||||
#define _CITRUS_MAPPER_CONVERT_INVAL (1)
|
||||
#define _CITRUS_MAPPER_CONVERT_SRC_MORE (2)
|
||||
#define _CITRUS_MAPPER_CONVERT_DST_MORE (3)
|
||||
#define _CITRUS_MAPPER_CONVERT_ILSEQ (4)
|
||||
#define _CITRUS_MAPPER_CONVERT_FATAL (5)
|
||||
#define _CITRUS_MAPPER_CONVERT_SUCCESS (0)
|
||||
#define _CITRUS_MAPPER_CONVERT_NONIDENTICAL (1)
|
||||
#define _CITRUS_MAPPER_CONVERT_SRC_MORE (2)
|
||||
#define _CITRUS_MAPPER_CONVERT_DST_MORE (3)
|
||||
#define _CITRUS_MAPPER_CONVERT_ILSEQ (4)
|
||||
#define _CITRUS_MAPPER_CONVERT_FATAL (5)
|
||||
|
||||
/*
|
||||
* _citrus_mapper_convert:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: citrus_namespace.h,v 1.2 2003/06/26 12:09:56 tshiozak Exp $ */
|
||||
/* $NetBSD: citrus_namespace.h,v 1.3 2003/07/12 15:39:20 tshiozak Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c)2003 Citrus Project,
|
||||
|
@ -141,7 +141,7 @@
|
|||
#define _mapper_open_direct _citrus_mapper_open_direct
|
||||
#define _mapper_close _citrus_mapper_close
|
||||
#define _MAPPER_CONVERT_SUCCESS _CITRUS_MAPPER_CONVERT_SUCCESS
|
||||
#define _MAPPER_CONVERT_INVAL _CITRUS_MAPPER_CONVERT_INVAL
|
||||
#define _MAPPER_CONVERT_NONIDENTICAL _CITRUS_MAPPER_CONVERT_NONIDENTICAL
|
||||
#define _MAPPER_CONVERT_SRC_MORE _CITRUS_MAPPER_CONVERT_SRC_MORE
|
||||
#define _MAPPER_CONVERT_DST_MORE _CITRUS_MAPPER_CONVERT_DST_MORE
|
||||
#define _MAPPER_CONVERT_ILSEQ _CITRUS_MAPPER_CONVERT_ILSEQ
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: citrus_iconv_std.c,v 1.4 2003/07/01 09:42:16 tshiozak Exp $ */
|
||||
/* $NetBSD: citrus_iconv_std.c,v 1.5 2003/07/12 15:39:20 tshiozak Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c)2003 Citrus Project,
|
||||
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: citrus_iconv_std.c,v 1.4 2003/07/01 09:42:16 tshiozak Exp $");
|
||||
__RCSID("$NetBSD: citrus_iconv_std.c,v 1.5 2003/07/12 15:39:20 tshiozak Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <assert.h>
|
||||
|
@ -302,19 +302,19 @@ do_conv(struct _citrus_iconv_std_shared *is,
|
|||
ret = _csmapper_convert(sd->sd_mapper,
|
||||
&tmpidx, *idx, NULL);
|
||||
switch (ret) {
|
||||
case _CITRUS_MAPPER_CONVERT_SUCCESS:
|
||||
case _MAPPER_CONVERT_SUCCESS:
|
||||
*csid = sd->sd_csid;
|
||||
*idx = tmpidx;
|
||||
return 0;
|
||||
case _CITRUS_MAPPER_CONVERT_INVAL:
|
||||
case _MAPPER_CONVERT_NONIDENTICAL:
|
||||
break;
|
||||
case _CITRUS_MAPPER_CONVERT_SRC_MORE:
|
||||
case _MAPPER_CONVERT_SRC_MORE:
|
||||
/*FALLTHROUGH*/
|
||||
case _CITRUS_MAPPER_CONVERT_DST_MORE:
|
||||
case _MAPPER_CONVERT_DST_MORE:
|
||||
/*FALLTHROUGH*/
|
||||
case _CITRUS_MAPPER_CONVERT_FATAL:
|
||||
case _MAPPER_CONVERT_FATAL:
|
||||
return EINVAL;
|
||||
case _CITRUS_MAPPER_CONVERT_ILSEQ:
|
||||
case _MAPPER_CONVERT_ILSEQ:
|
||||
return EILSEQ;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: citrus_mapper_646.c,v 1.2 2003/06/27 17:53:31 tshiozak Exp $ */
|
||||
/* $NetBSD: citrus_mapper_646.c,v 1.3 2003/07/12 15:39:20 tshiozak Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c)2003 Citrus Project,
|
||||
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: citrus_mapper_646.c,v 1.2 2003/06/27 17:53:31 tshiozak Exp $");
|
||||
__RCSID("$NetBSD: citrus_mapper_646.c,v 1.3 2003/07/12 15:39:20 tshiozak Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <assert.h>
|
||||
|
@ -57,6 +57,7 @@ _CITRUS_MAPPER_DEF_OPS(mapper_646);
|
|||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
#define ILSEQ 0xFFFFFFFE
|
||||
#define INVALID 0xFFFFFFFF
|
||||
#define SPECIALS(x) \
|
||||
x(0x23) \
|
||||
|
@ -222,13 +223,13 @@ _citrus_mapper_646_mapper_convert(struct _citrus_mapper * __restrict cm,
|
|||
if (m6->m6_forward) {
|
||||
/* forward */
|
||||
if (src>=0x80)
|
||||
return _MAPPER_CONVERT_INVAL;
|
||||
#define FORWARD(x) \
|
||||
if (src==(x)) { \
|
||||
if (m6->m6_map[INDEX_##x]==INVALID) \
|
||||
return _MAPPER_CONVERT_INVAL; \
|
||||
*dst = m6->m6_map[INDEX_##x]; \
|
||||
return 0; \
|
||||
return _MAPPER_CONVERT_ILSEQ;
|
||||
#define FORWARD(x) \
|
||||
if (src==(x)) { \
|
||||
if (m6->m6_map[INDEX_##x]==INVALID) \
|
||||
return _MAPPER_CONVERT_NONIDENTICAL; \
|
||||
*dst = m6->m6_map[INDEX_##x]; \
|
||||
return 0; \
|
||||
} else
|
||||
SPECIALS(FORWARD);
|
||||
*dst = src;
|
||||
|
@ -239,11 +240,11 @@ if (m6->m6_map[INDEX_##x]!=INVALID && src==m6->m6_map[INDEX_##x]) { \
|
|||
*dst = (x); \
|
||||
return 0; \
|
||||
} else if (src==(x)) \
|
||||
return _MAPPER_CONVERT_INVAL; \
|
||||
return _MAPPER_CONVERT_ILSEQ; \
|
||||
else
|
||||
SPECIALS(BACKWARD);
|
||||
if (src>=0x80)
|
||||
return _MAPPER_CONVERT_INVAL;
|
||||
return _MAPPER_CONVERT_ILSEQ;
|
||||
*dst = src;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: citrus_mapper_serial.c,v 1.1 2003/06/25 09:51:46 tshiozak Exp $ */
|
||||
/* $NetBSD: citrus_mapper_serial.c,v 1.2 2003/07/12 15:39:20 tshiozak Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c)2003 Citrus Project,
|
||||
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: citrus_mapper_serial.c,v 1.1 2003/06/25 09:51:46 tshiozak Exp $");
|
||||
__RCSID("$NetBSD: citrus_mapper_serial.c,v 1.2 2003/07/12 15:39:20 tshiozak Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <assert.h>
|
||||
|
@ -249,9 +249,10 @@ _citrus_mapper_parallel_mapper_convert(struct _citrus_mapper * __restrict cm,
|
|||
if (ret == _MAPPER_CONVERT_SUCCESS) {
|
||||
*dst = tmp;
|
||||
return _MAPPER_CONVERT_SUCCESS;
|
||||
}
|
||||
} else if (ret == _MAPPER_CONVERT_ILSEQ)
|
||||
return _MAPPER_CONVERT_ILSEQ;
|
||||
}
|
||||
return _MAPPER_CONVERT_INVAL;
|
||||
return _MAPPER_CONVERT_NONIDENTICAL;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: citrus_mapper_std.c,v 1.2 2003/06/27 17:53:31 tshiozak Exp $ */
|
||||
/* $NetBSD: citrus_mapper_std.c,v 1.3 2003/07/12 15:39:20 tshiozak Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c)2003 Citrus Project,
|
||||
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: citrus_mapper_std.c,v 1.2 2003/06/27 17:53:31 tshiozak Exp $");
|
||||
__RCSID("$NetBSD: citrus_mapper_std.c,v 1.3 2003/07/12 15:39:20 tshiozak Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <assert.h>
|
||||
|
@ -97,8 +97,15 @@ rowcol_convert(struct _citrus_mapper_std * __restrict ms,
|
|||
}
|
||||
if (row < rc->rc_src_row_begin || row > rc->rc_src_row_end ||
|
||||
col < rc->rc_src_col_begin || col > rc->rc_src_col_end) {
|
||||
*dst = rc->rc_dst_invalid;
|
||||
return _MAPPER_CONVERT_INVAL;
|
||||
switch (rc->rc_oob_mode) {
|
||||
case _CITRUS_MAPPER_STD_OOB_NONIDENTICAL:
|
||||
*dst = rc->rc_dst_invalid;
|
||||
return _MAPPER_CONVERT_NONIDENTICAL;
|
||||
case _CITRUS_MAPPER_STD_OOB_ILSEQ:
|
||||
return _MAPPER_CONVERT_ILSEQ;
|
||||
default:
|
||||
return _MAPPER_CONVERT_FATAL;
|
||||
}
|
||||
}
|
||||
|
||||
idx =
|
||||
|
@ -119,8 +126,10 @@ rowcol_convert(struct _citrus_mapper_std * __restrict ms,
|
|||
|
||||
if (conv == rc->rc_dst_invalid) {
|
||||
*dst = rc->rc_dst_invalid;
|
||||
return _MAPPER_CONVERT_INVAL;
|
||||
return _MAPPER_CONVERT_NONIDENTICAL;
|
||||
}
|
||||
if (conv == rc->rc_dst_ilseq)
|
||||
return _MAPPER_CONVERT_ILSEQ;
|
||||
|
||||
*dst = conv;
|
||||
|
||||
|
@ -134,6 +143,7 @@ rowcol_init(struct _citrus_mapper_std *ms)
|
|||
int ret;
|
||||
struct _citrus_mapper_std_rowcol *rc = &ms->ms_rowcol;
|
||||
const struct _citrus_mapper_std_rowcol_info_x *rcx;
|
||||
const struct _citrus_mapper_std_rowcol_ext_ilseq_info_x *eix;
|
||||
struct _region r;
|
||||
u_int64_t table_size;
|
||||
|
||||
|
@ -153,7 +163,7 @@ rowcol_init(struct _citrus_mapper_std *ms)
|
|||
ret = _db_lookup_by_s(ms->ms_db, _CITRUS_MAPPER_STD_SYM_INFO, &r, NULL);
|
||||
if (ret) {
|
||||
if (ret==ENOENT)
|
||||
ret =EFTYPE;
|
||||
ret = EFTYPE;
|
||||
return ret;
|
||||
}
|
||||
if (_region_size(&r) < sizeof(*rcx))
|
||||
|
@ -173,6 +183,21 @@ do { \
|
|||
CONV_ROWCOL(rc, rcx, src_col_end);
|
||||
CONV_ROWCOL(rc, rcx, dst_unit_bits);
|
||||
|
||||
/* ilseq extension */
|
||||
rc->rc_oob_mode = _CITRUS_MAPPER_STD_OOB_NONIDENTICAL;
|
||||
rc->rc_dst_ilseq = rc->rc_dst_invalid;
|
||||
ret = _db_lookup_by_s(ms->ms_db,
|
||||
_CITRUS_MAPPER_STD_SYM_ROWCOL_EXT_ILSEQ,
|
||||
&r, NULL);
|
||||
if (ret && ret != ENOENT)
|
||||
return ret;
|
||||
if (_region_size(&r) < sizeof(*eix))
|
||||
return EFTYPE;
|
||||
if (ret == 0) {
|
||||
eix = _region_head(&r);
|
||||
rc->rc_oob_mode = be32toh(eix->eix_oob_mode);
|
||||
rc->rc_dst_ilseq = be32toh(eix->eix_dst_ilseq);
|
||||
}
|
||||
rc->rc_src_col_width = rc->rc_src_col_end - rc->rc_src_col_begin +1;
|
||||
|
||||
/* validation checks */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: citrus_mapper_std_file.h,v 1.1 2003/06/25 09:51:47 tshiozak Exp $ */
|
||||
/* $NetBSD: citrus_mapper_std_file.h,v 1.2 2003/07/12 15:39:20 tshiozak Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c)2003 Citrus Project,
|
||||
|
@ -46,6 +46,16 @@ struct _citrus_mapper_std_rowcol_info_x {
|
|||
u_int32_t rcx_dst_unit_bits;
|
||||
u_int32_t rcx_pad;
|
||||
} __packed;
|
||||
#define _CITRUS_MAPPER_STD_ROWCOL_INFO_SIZE 32
|
||||
#define _CITRUS_MAPPER_STD_ROWCOL_INFO_SIZE 32
|
||||
|
||||
/* rowcol oob extension info */
|
||||
#define _CITRUS_MAPPER_STD_SYM_ROWCOL_EXT_ILSEQ "rowcol_ext_ilseq"
|
||||
struct _citrus_mapper_std_rowcol_ext_ilseq_info_x {
|
||||
#define _CITRUS_MAPPER_STD_OOB_NONIDENTICAL 0
|
||||
#define _CITRUS_MAPPER_STD_OOB_ILSEQ 1
|
||||
u_int32_t eix_oob_mode;
|
||||
u_int32_t eix_dst_ilseq;
|
||||
} __packed;
|
||||
#define _CITRUS_MAPPER_STD_ROWCOL_EXT_ILSEQ_SIZE 8
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: citrus_mapper_std_local.h,v 1.1 2003/06/25 09:51:47 tshiozak Exp $ */
|
||||
/* $NetBSD: citrus_mapper_std_local.h,v 1.2 2003/07/12 15:39:21 tshiozak Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c)2003 Citrus Project,
|
||||
|
@ -41,6 +41,8 @@ struct _citrus_mapper_std_rowcol {
|
|||
_citrus_index_t rc_src_col_end;
|
||||
_citrus_index_t rc_src_col_width;
|
||||
_citrus_index_t rc_dst_unit_bits;
|
||||
int rc_oob_mode;
|
||||
_citrus_index_t rc_dst_ilseq;
|
||||
};
|
||||
|
||||
struct _citrus_mapper_std;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: citrus_mapper_zone.c,v 1.3 2003/07/01 08:33:06 tshiozak Exp $ */
|
||||
/* $NetBSD: citrus_mapper_zone.c,v 1.4 2003/07/12 15:39:21 tshiozak Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c)2003 Citrus Project,
|
||||
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: citrus_mapper_zone.c,v 1.3 2003/07/01 08:33:06 tshiozak Exp $");
|
||||
__RCSID("$NetBSD: citrus_mapper_zone.c,v 1.4 2003/07/12 15:39:21 tshiozak Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <assert.h>
|
||||
|
@ -368,7 +368,7 @@ _citrus_mapper_zone_mapper_convert(struct _citrus_mapper * __restrict cm,
|
|||
col = src;
|
||||
row = 0;
|
||||
if (col < mz->mz_col.z_begin || col > mz->mz_col.z_end)
|
||||
return _CITRUS_MAPPER_CONVERT_INVAL;
|
||||
return _CITRUS_MAPPER_CONVERT_NONIDENTICAL;
|
||||
if (mz->mz_col_offset>0)
|
||||
col += (u_int32_t)mz->mz_col_offset;
|
||||
else
|
||||
|
@ -379,7 +379,7 @@ _citrus_mapper_zone_mapper_convert(struct _citrus_mapper * __restrict cm,
|
|||
row = src >> mz->mz_col_bits;
|
||||
if (row < mz->mz_row.z_begin || row > mz->mz_row.z_end ||
|
||||
col < mz->mz_col.z_begin || col > mz->mz_col.z_end)
|
||||
return _CITRUS_MAPPER_CONVERT_INVAL;
|
||||
return _CITRUS_MAPPER_CONVERT_NONIDENTICAL;
|
||||
if (mz->mz_col_offset>0)
|
||||
col += (u_int32_t)mz->mz_col_offset;
|
||||
else
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: lex.l,v 1.1 2003/06/26 06:30:14 tshiozak Exp $ */
|
||||
/* $NetBSD: lex.l,v 1.2 2003/07/12 15:39:21 tshiozak Exp $ */
|
||||
|
||||
%{
|
||||
/*-
|
||||
|
@ -33,7 +33,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: lex.l,v 1.1 2003/06/26 06:30:14 tshiozak Exp $");
|
||||
__RCSID("$NetBSD: lex.l,v 1.2 2003/07/12 15:39:21 tshiozak Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <assert.h>
|
||||
|
@ -77,10 +77,13 @@ int line_number = 1;
|
|||
"NAME" { return (R_NAME); }
|
||||
"SRC_ZONE" { return (R_SRC_ZONE); }
|
||||
"DST_INVALID" { return (R_DST_INVALID); }
|
||||
"DST_ILSEQ" { return (R_DST_ILSEQ); }
|
||||
"DST_UNIT_BITS" { return (R_DST_UNIT_BITS); }
|
||||
"BEGIN_MAP" { return (R_BEGIN_MAP); }
|
||||
"END_MAP" { return (R_END_MAP); }
|
||||
"INVALID" { return (R_INVALID); }
|
||||
"ILSEQ" { return (R_ILSEQ); }
|
||||
"OOB_MODE" { return (R_OOB_MODE); }
|
||||
"ROWCOL" { return (R_ROWCOL); }
|
||||
|
||||
\"([^\"\n]*(\\\")?)*\"|\'([^\'\n]*(\\\')?)*\' {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: yacc.y,v 1.1 2003/06/26 06:30:15 tshiozak Exp $ */
|
||||
/* $NetBSD: yacc.y,v 1.2 2003/07/12 15:39:21 tshiozak Exp $ */
|
||||
|
||||
%{
|
||||
/*-
|
||||
|
@ -33,7 +33,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: yacc.y,v 1.1 2003/06/26 06:30:15 tshiozak Exp $");
|
||||
__RCSID("$NetBSD: yacc.y,v 1.2 2003/07/12 15:39:21 tshiozak Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <assert.h>
|
||||
|
@ -69,7 +69,7 @@ static char *map_name;
|
|||
static int map_type;
|
||||
static zone_t src_zone;
|
||||
static u_int32_t colmask, rowmask;
|
||||
static u_int32_t dst_invalid, dst_unit_bits;
|
||||
static u_int32_t dst_invalid, dst_ilseq, oob_mode, dst_unit_bits;
|
||||
static void (*putfunc)(void *, size_t, u_int32_t) = 0;
|
||||
|
||||
static u_int32_t src_next;
|
||||
|
@ -80,7 +80,9 @@ static u_int32_t done_flag = 0;
|
|||
#define DF_NAME 0x00000002
|
||||
#define DF_SRC_ZONE 0x00000004
|
||||
#define DF_DST_INVALID 0x00000008
|
||||
#define DF_DST_UNIT_BITS 0x00000010
|
||||
#define DF_DST_ILSEQ 0x00000010
|
||||
#define DF_DST_UNIT_BITS 0x00000020
|
||||
#define DF_OOB_MODE 0x00000040
|
||||
|
||||
static void dump_file(void);
|
||||
static void setup_map(void);
|
||||
|
@ -88,7 +90,9 @@ static void set_type(int);
|
|||
static void set_name(char *);
|
||||
static void set_src_zone(const zone_t *);
|
||||
static void set_dst_invalid(u_int32_t);
|
||||
static void set_dst_ilseq(u_int32_t);
|
||||
static void set_dst_unit_bits(u_int32_t);
|
||||
static void set_oob_mode(u_int32_t);
|
||||
static void calc_next(void);
|
||||
static int check_src(u_int32_t, u_int32_t);
|
||||
static void store(const linear_zone_t *, u_int32_t, int);
|
||||
|
@ -104,15 +108,17 @@ static void put32(void *, size_t, u_int32_t);
|
|||
linear_zone_t lz_value;
|
||||
}
|
||||
|
||||
%token R_TYPE R_NAME R_SRC_ZONE R_DST_INVALID R_DST_UNIT_BITS
|
||||
%token R_TYPE R_NAME R_SRC_ZONE R_DST_UNIT_BITS
|
||||
%token R_DST_INVALID R_DST_ILSEQ
|
||||
%token R_BEGIN_MAP R_END_MAP R_INVALID R_ROWCOL
|
||||
%token R_ILSEQ R_OOB_MODE
|
||||
%token R_LN
|
||||
%token <i_value> L_IMM
|
||||
%token <s_value> L_STRING
|
||||
|
||||
%type <z_value> zone
|
||||
%type <lz_value> src
|
||||
%type <i_value> dst types
|
||||
%type <i_value> dst types oob_mode_sel
|
||||
|
||||
%%
|
||||
|
||||
|
@ -125,7 +131,9 @@ property : /* empty */
|
|||
| property type
|
||||
| property src_zone
|
||||
| property dst_invalid
|
||||
| property dst_ilseq
|
||||
| property dst_unit_bits
|
||||
| property oob_mode
|
||||
|
||||
name : R_NAME L_STRING { set_name($2); $2 = NULL; }
|
||||
type : R_TYPE types { set_type($2); }
|
||||
|
@ -143,8 +151,12 @@ zone : L_IMM '-' L_IMM {
|
|||
}
|
||||
|
||||
dst_invalid : R_DST_INVALID L_IMM { set_dst_invalid($2); }
|
||||
dst_ilseq : R_DST_ILSEQ L_IMM { set_dst_ilseq($2); }
|
||||
dst_unit_bits : R_DST_UNIT_BITS L_IMM { set_dst_unit_bits($2); }
|
||||
oob_mode : R_OOB_MODE oob_mode_sel { set_oob_mode($2); }
|
||||
|
||||
oob_mode_sel : R_INVALID { $$ = _CITRUS_MAPPER_STD_OOB_NONIDENTICAL; }
|
||||
| R_ILSEQ { $$ = _CITRUS_MAPPER_STD_OOB_ILSEQ; }
|
||||
|
||||
mapping : begin_map map_elems R_END_MAP
|
||||
begin_map : R_BEGIN_MAP lns { setup_map(); }
|
||||
|
@ -164,6 +176,10 @@ dst : L_IMM
|
|||
{
|
||||
$$ = dst_invalid;
|
||||
}
|
||||
| R_ILSEQ
|
||||
{
|
||||
$$ = dst_ilseq;
|
||||
}
|
||||
|
||||
src : /* empty */
|
||||
{
|
||||
|
@ -245,6 +261,7 @@ static void
|
|||
alloc_table(void)
|
||||
{
|
||||
size_t i;
|
||||
u_int32_t val;
|
||||
|
||||
table_size =
|
||||
(src_zone.row_end-src_zone.row_begin+1)*
|
||||
|
@ -255,8 +272,18 @@ alloc_table(void)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
switch (oob_mode) {
|
||||
case _CITRUS_MAPPER_STD_OOB_NONIDENTICAL:
|
||||
val = dst_invalid;
|
||||
break;
|
||||
case _CITRUS_MAPPER_STD_OOB_ILSEQ:
|
||||
val = dst_ilseq;
|
||||
break;
|
||||
default:
|
||||
_DIAGASSERT(0);
|
||||
}
|
||||
for (i=0; i<table_size; i++)
|
||||
(*putfunc)(table, i, dst_invalid);
|
||||
(*putfunc)(table, i, val);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -274,6 +301,10 @@ setup_map(void)
|
|||
|
||||
if ((done_flag & DF_DST_INVALID) == 0)
|
||||
dst_invalid = 0xFFFFFFFF;
|
||||
if ((done_flag & DF_DST_ILSEQ) == 0)
|
||||
dst_ilseq = 0xFFFFFFFE;
|
||||
if ((done_flag & DF_OOB_MODE) == 0)
|
||||
oob_mode = _CITRUS_MAPPER_STD_OOB_NONIDENTICAL;
|
||||
|
||||
alloc_table();
|
||||
}
|
||||
|
@ -301,6 +332,23 @@ create_rowcol_info(struct _region *r)
|
|||
_region_init(r, ptr, _CITRUS_MAPPER_STD_ROWCOL_INFO_SIZE);
|
||||
}
|
||||
|
||||
static void
|
||||
create_rowcol_ext_ilseq_info(struct _region *r)
|
||||
{
|
||||
void *ptr;
|
||||
size_t ofs;
|
||||
|
||||
ofs = 0;
|
||||
ptr = malloc(_CITRUS_MAPPER_STD_ROWCOL_EXT_ILSEQ_SIZE);
|
||||
if (ptr==NULL)
|
||||
err(EXIT_FAILURE, "malloc");
|
||||
|
||||
put32(ptr, ofs, oob_mode); ofs++;
|
||||
put32(ptr, ofs, dst_ilseq); ofs++;
|
||||
|
||||
_region_init(r, ptr, _CITRUS_MAPPER_STD_ROWCOL_EXT_ILSEQ_SIZE);
|
||||
}
|
||||
|
||||
#define CHKERR(ret, func, a) \
|
||||
do { \
|
||||
ret = func a; \
|
||||
|
@ -333,6 +381,11 @@ dump_file(void)
|
|||
CHKERR(ret, _db_factory_add_by_s,
|
||||
(df, _CITRUS_MAPPER_STD_SYM_INFO, &data, 1));
|
||||
|
||||
/* ilseq extension */
|
||||
create_rowcol_ext_ilseq_info(&data);
|
||||
CHKERR(ret, _db_factory_add_by_s,
|
||||
(df, _CITRUS_MAPPER_STD_SYM_ROWCOL_EXT_ILSEQ, &data, 1));
|
||||
|
||||
/* store table */
|
||||
_region_init(&data, table, table_size*dst_unit_bits/8);
|
||||
CHKERR(ret, _db_factory_add_by_s,
|
||||
|
@ -440,6 +493,32 @@ set_dst_invalid(u_int32_t val)
|
|||
done_flag |= DF_DST_INVALID;
|
||||
}
|
||||
static void
|
||||
set_dst_ilseq(u_int32_t val)
|
||||
{
|
||||
|
||||
if (done_flag & DF_DST_ILSEQ) {
|
||||
warning("DST_ILSEQ is duplicated. ignored this one");
|
||||
return;
|
||||
}
|
||||
|
||||
dst_ilseq = val;
|
||||
|
||||
done_flag |= DF_DST_ILSEQ;
|
||||
}
|
||||
static void
|
||||
set_oob_mode(u_int32_t val)
|
||||
{
|
||||
|
||||
if (done_flag & DF_OOB_MODE) {
|
||||
warning("OOB_MODE is duplicated. ignored this one");
|
||||
return;
|
||||
}
|
||||
|
||||
oob_mode = val;
|
||||
|
||||
done_flag |= DF_OOB_MODE;
|
||||
}
|
||||
static void
|
||||
set_dst_unit_bits(u_int32_t val)
|
||||
{
|
||||
|
||||
|
|
Loading…
Reference in New Issue