|
OpenCOBOL 1.1pre-rel
|
#include "config.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include "cobc.h"#include "tree.h"
Go to the source code of this file.
Functions | |
| int | cb_get_level (cb_tree x) |
| cb_tree | cb_build_field_tree (cb_tree level, cb_tree name, struct cb_field *last_field, enum cb_storage storage, struct cb_file *fn) |
| struct cb_field * | cb_resolve_redefines (struct cb_field *field, cb_tree redefines) |
| static int | validate_field_1 (struct cb_field *f) |
| static void | setup_parameters (struct cb_field *f) |
| static int | compute_size (struct cb_field *f) |
| static int | validate_field_value (struct cb_field *f) |
| void | cb_validate_field (struct cb_field *f) |
| void | cb_validate_88_item (struct cb_field *f) |
| struct cb_field * | cb_validate_78_item (struct cb_field *f) |
| void | cb_clear_real_field (void) |
Variables | |
| size_t | cb_needs_01 = 0 |
| static struct cb_field * | last_real_field = NULL |
| static const int | pic_digits [] = { 2, 4, 7, 9, 12, 14, 16, 18 } |
| cb_tree cb_build_field_tree | ( | cb_tree | level, |
| cb_tree | name, | ||
| struct cb_field * | last_field, | ||
| enum cb_storage | storage, | ||
| struct cb_file * | fn | ||
| ) |
Definition at line 78 of file field.c.
{
struct cb_reference *r;
struct cb_field *f;
struct cb_field *p;
struct cb_field *field_fill;
cb_tree dummy_fill;
cb_tree l;
cb_tree x;
int lv;
if (level == cb_error_node || name == cb_error_node) {
return cb_error_node;
}
/* check the level number */
lv = cb_get_level (level);
if (!lv) {
return cb_error_node;
}
/* build the field */
r = CB_REFERENCE (name);
f = CB_FIELD (cb_build_field (name));
f->storage = storage;
last_real_field = last_field;
if (lv == 78) {
f->level = 01;
f->flag_item_78 = 1;
return CB_TREE (f);
} else {
f->level = lv;
}
if (f->level == 01 && storage == CB_STORAGE_FILE) {
if (fn->external) {
f->flag_external = 1;
has_external = 1;
} else if (fn->global) {
f->flag_is_global = 1;
}
}
if (last_field) {
if (last_field->level == 77 && f->level != 01 &&
f->level != 77 && f->level != 66 && f->level != 88) {
cb_error_x (name, _("Level number must begin with 01 or 77"));
return cb_error_node;
}
}
/* checks for redefinition */
if (cb_warn_redefinition) {
if (r->word->count > 1) {
if (f->level == 01 || f->level == 77) {
redefinition_warning (name, NULL);
} else {
for (l = r->word->items; l; l = CB_CHAIN (l)) {
x = CB_VALUE (l);
if (!CB_FIELD_P (x)
|| CB_FIELD (x)->level == 01
|| CB_FIELD (x)->level == 77
|| (f->level == last_field->level
&& CB_FIELD (x)->parent == last_field->parent)) {
redefinition_warning (name, x);
break;
}
}
}
}
}
if (last_field && last_field->level == 88) {
last_field = last_field->parent;
}
/* link the field into the tree */
if (f->level == 01 || f->level == 77) {
/* top level */
cb_needs_01 = 0;
if (last_field) {
/*
cb_field_add (cb_field_founder (last_field), f);
*/
cb_field_founder (last_field)->sister = f;
}
} else if (!last_field || cb_needs_01) {
/* invalid top level */
cb_error_x (name, _("Level number must begin with 01 or 77"));
return cb_error_node;
} else if (f->level == 66) {
/* level 66 */
f->parent = cb_field_founder (last_field);
for (p = f->parent->children; p && p->sister; p = p->sister) ;
if (p) {
p->sister = f;
}
} else if (f->level == 88) {
/* level 88 */
f->parent = last_field;
} else if (f->level > last_field->level) {
/* lower level */
last_field->children = f;
f->parent = last_field;
} else if (f->level == last_field->level) {
/* same level */
same_level:
last_field->sister = f;
f->parent = last_field->parent;
} else {
/* upper level */
for (p = last_field->parent; p; p = p->parent) {
if (p->level == f->level) {
last_field = p;
goto same_level;
}
if (cb_relax_level_hierarchy && p->level < f->level) {
break;
}
}
if (cb_relax_level_hierarchy) {
dummy_fill = cb_build_filler ();
field_fill = CB_FIELD (cb_build_field (dummy_fill));
cb_warning_x (name, _("No previous data item of level %02d"), f->level);
field_fill->level = f->level;
field_fill->storage = storage;
field_fill->children = p->children;
field_fill->parent = p;
for (p = p->children; p != NULL; p = p->sister) {
p->parent = field_fill;
}
field_fill->parent->children = field_fill;
field_fill->sister = f;
f->parent = field_fill->parent;
last_field = field_fill;
} else {
cb_error_x (name, _("No previous data item of level %02d"), f->level);
return cb_error_node;
}
}
/* inherit parent's properties */
if (f->parent) {
f->usage = f->parent->usage;
f->indexes = f->parent->indexes;
f->flag_sign_leading = f->parent->flag_sign_leading;
f->flag_sign_separate = f->parent->flag_sign_separate;
f->flag_is_global = f->parent->flag_is_global;
}
return CB_TREE (f);
}

| void cb_clear_real_field | ( | void | ) |
Definition at line 1050 of file field.c.
{
last_real_field = NULL;
}

| int cb_get_level | ( | cb_tree | x | ) |
Definition at line 41 of file field.c.
{
const char *p;
const char *name;
int level = 0;
name = CB_NAME (x);
/* get level */
for (p = name; *p; p++) {
if (!isdigit (*p)) {
goto level_error;
}
level = level * 10 + (*p - '0');
}
/* check level */
switch (level) {
case 66:
case 77:
case 78:
case 88:
break;
default:
if (level < 1 || level > 49) {
goto level_error;
}
break;
}
return level;
level_error:
cb_error_x (x, _("Invalid level number '%s'"), name);
return 0;
}


Definition at line 231 of file field.c.
{
struct cb_field *f;
struct cb_reference *r;
const char *name;
cb_tree x;
r = CB_REFERENCE (redefines);
name = CB_NAME (redefines);
x = CB_TREE (field);
/* check qualification */
if (r->chain) {
cb_error_x (x, _("'%s' cannot be qualified here"), name);
return NULL;
}
/* check subscripts */
if (r->subs) {
cb_error_x (x, _("'%s' cannot be subscripted here"), name);
return NULL;
}
/* resolve the name in the current group (if any) */
if (field->parent && field->parent->children) {
for (f = field->parent->children; f; f = f->sister) {
if (strcasecmp (f->name, name) == 0) {
break;
}
}
if (f == NULL) {
cb_error_x (x, _("'%s' undefined in '%s'"), name, field->parent->name);
return NULL;
}
} else {
if (cb_ref (redefines) == cb_error_node) {
return NULL;
}
f = cb_field (redefines);
}
/* check level number */
if (f->level != field->level) {
cb_error_x (x, _("Level number of REDEFINES entries must be identical"));
return NULL;
}
if (f->level == 66 || f->level == 88) {
cb_error_x (x, _("Level number of REDEFINES entry cannot be 66 or 88"));
return NULL;
}
if (!cb_indirect_redefines && f->redefines) {
cb_error_x (x, _("'%s' not the original definition"), f->name);
return NULL;
}
/* return the original definition */
while (f->redefines) {
f = f->redefines;
}
return f;
}

Definition at line 1033 of file field.c.
{
cb_tree x;
x = CB_TREE (f);
if (!f->values) {
level_require_error (x, "VALUE");
}
if (f->pic || f->flag_occurs) {
level_except_error (x, "VALUE");
}
cb_add_78 (f);
return last_real_field;
}

| void cb_validate_88_item | ( | struct cb_field * | f | ) |
Definition at line 1018 of file field.c.
{
cb_tree x;
x = CB_TREE (f);
if (!f->values) {
level_require_error (x, "VALUE");
}
if (f->pic || f->flag_occurs) {
level_except_error (x, "VALUE");
}
}

| void cb_validate_field | ( | struct cb_field * | f | ) |
Definition at line 973 of file field.c.
{
struct cb_field *c;
if (validate_field_1 (f) != 0) {
f->flag_invalid = 1;
return;
}
/* RXW - Remove */
if (f->flag_item_78) {
f->flag_is_verified = 1;
return;
}
/* setup parameters */
if (f->storage == CB_STORAGE_LOCAL ||
f->storage == CB_STORAGE_LINKAGE ||
f->flag_item_based) {
f->flag_local = 1;
}
if (f->storage == CB_STORAGE_LINKAGE || f->flag_item_based) {
f->flag_base = 1;
}
setup_parameters (f);
/* compute size */
compute_size (f);
if (!f->redefines) {
f->memory_size = f->size * f->occurs_max;
} else if (f->redefines->memory_size < f->size * f->occurs_max) {
f->redefines->memory_size = f->size * f->occurs_max;
}
validate_field_value (f);
if (f->flag_is_global) {
f->count++;
for (c = f->children; c; c = c->sister) {
c->flag_is_global = 1;
c->count++;
}
}
f->flag_is_verified = 1;
}


| static int compute_size | ( | struct cb_field * | f | ) | [static] |
Definition at line 773 of file field.c.
{
struct cb_field *c;
int size;
int align_size;
int pad;
if (f->level == 66) {
/* rename */
if (f->rename_thru) {
f->size = f->rename_thru->offset + f->rename_thru->size -
f->redefines->offset;
} else {
f->size = f->redefines->size;
}
return f->size;
}
if (f->children) {
/* groups */
size = 0;
for (c = f->children; c; c = c->sister) {
if (c->redefines) {
c->offset = c->redefines->offset;
compute_size (c);
/* increase the size if redefinition is larger */
if (c->level != 66 &&
c->size * c->occurs_max >
c->redefines->size * c->redefines->occurs_max) {
if (cb_larger_redefines_ok) {
cb_warning_x (CB_TREE (c),
_("Size of '%s' larger than size of '%s'"),
c->name, c->redefines->name);
size +=
(c->size * c->occurs_max) -
(c->redefines->size *
c->redefines->occurs_max);
} else {
cb_error_x (CB_TREE (c),
_("Size of '%s' larger than size of '%s'"),
c->name, c->redefines->name);
}
}
} else {
c->offset = f->offset + size;
size += compute_size (c) * c->occurs_max;
/* word alignment */
if (c->flag_synchronized
&& cb_verify (cb_synchronized_clause, "SYNC")) {
align_size = 1;
switch (c->usage) {
case CB_USAGE_BINARY:
case CB_USAGE_COMP_5:
case CB_USAGE_COMP_X:
case CB_USAGE_FLOAT:
case CB_USAGE_DOUBLE:
if (c->size == 2 || c->size == 4
|| c->size == 8) {
align_size = c->size;
}
break;
case CB_USAGE_INDEX:
case CB_USAGE_LENGTH:
align_size = sizeof (int);
break;
case CB_USAGE_OBJECT:
case CB_USAGE_POINTER:
case CB_USAGE_PROGRAM_POINTER:
case CB_USAGE_PROGRAM:
align_size = sizeof (void *);
break;
default:
break;
}
if (c->offset % align_size != 0) {
pad = align_size - (c->offset % align_size);
c->offset += pad;
size += pad;
}
}
}
}
f->size = size;
} else {
/* elementary item */
switch (f->usage) {
case CB_USAGE_COMP_X:
if (f->pic->category == CB_CATEGORY_ALPHANUMERIC) {
break;
}
size = f->pic->size;
f->size = ((size <= 2) ? 1 : (size <= 4) ? 2 :
(size <= 7) ? 3 : (size <= 9) ? 4 :
(size <= 12) ? 5 : (size <= 14) ? 6 :
(size <= 16) ? 7 : (size <= 18) ? 8 : 16);
break;
case CB_USAGE_BINARY:
case CB_USAGE_COMP_5:
size = f->pic->size;
if (size > 18) {
f->flag_binary_swap = 0;
cb_error_x (CB_TREE (f),
_("'%s' binary field cannot be larger than 18 digits"),
f->name);
}
switch (cb_binary_size) {
case CB_BINARY_SIZE_2_4_8:
if (f->flag_real_binary && size <= 2) {
f->size = 1;
} else {
f->size = ((size <= 4) ? 2 :
(size <= 9) ? 4 : (size <= 18) ? 8 : 16);
}
break;
case CB_BINARY_SIZE_1_2_4_8:
f->size = ((size <= 2) ? 1 :
(size <= 4) ? 2 :
(size <= 9) ? 4 : (size <= 18) ? 8 : 16);
break;
case CB_BINARY_SIZE_1__8:
if (f->pic->have_sign) {
f->size = ((size <= 2) ? 1 : (size <= 4) ? 2 :
(size <= 6) ? 3 : (size <= 9) ? 4 :
(size <= 11) ? 5 : (size <= 14) ? 6 :
(size <= 16) ? 7 : (size <= 18) ? 8 : 16);
} else {
f->size = ((size <= 2) ? 1 : (size <= 4) ? 2 :
(size <= 7) ? 3 : (size <= 9) ? 4 :
(size <= 12) ? 5 : (size <= 14) ? 6 :
(size <= 16) ? 7 : (size <= 18) ? 8 : 16);
}
break;
}
break;
case CB_USAGE_DISPLAY:
f->size = f->pic->size;
if (f->pic->category == CB_CATEGORY_NUMERIC
&& f->pic->have_sign && f->flag_sign_separate) {
f->size++;
}
break;
case CB_USAGE_PACKED:
f->size = f->pic->size / 2 + 1;
break;
case CB_USAGE_INDEX:
case CB_USAGE_LENGTH:
f->size = sizeof (int);
break;
case CB_USAGE_FLOAT:
f->size = sizeof (float);
break;
case CB_USAGE_DOUBLE:
f->size = sizeof (double);
break;
case CB_USAGE_OBJECT:
case CB_USAGE_POINTER:
case CB_USAGE_PROGRAM_POINTER:
case CB_USAGE_PROGRAM:
f->size = sizeof (void *);
break;
default:
ABORT ();
}
}
/* the size of redefining field should not be larger than
the size of redefined field unless the redefined field
is level 01 and non-external */
if (f->redefines && f->redefines->flag_external
&& (f->size * f->occurs_max > f->redefines->size * f->redefines->occurs_max)) {
if (cb_larger_redefines_ok) {
cb_warning_x (CB_TREE (f), _("Size of '%s' larger than size of '%s'"),
f->name, f->redefines->name);
} else {
cb_error_x (CB_TREE (f), _("Size of '%s' larger than size of '%s'"),
f->name, f->redefines->name);
}
}
return f->size;
}


| static void setup_parameters | ( | struct cb_field * | f | ) | [static] |
Definition at line 704 of file field.c.
{
int flag_local;
char pic[8];
/* determine the class */
if (f->children) {
/* group field */
flag_local = f->flag_local;
for (f = f->children; f; f = f->sister) {
f->flag_local = flag_local;
setup_parameters (f);
}
} else {
/* regular field */
switch (f->usage) {
case CB_USAGE_BINARY:
#ifndef WORDS_BIGENDIAN
if (cb_binary_byteorder == CB_BYTEORDER_BIG_ENDIAN) {
f->flag_binary_swap = 1;
}
#endif
break;
case CB_USAGE_INDEX:
f->pic = CB_PICTURE (cb_build_picture ("S9(9)"));
break;
case CB_USAGE_LENGTH:
f->pic = CB_PICTURE (cb_build_picture ("9(9)"));
break;
case CB_USAGE_POINTER:
case CB_USAGE_PROGRAM_POINTER:
f->pic = CB_PICTURE (cb_build_picture ("9(10)"));
break;
case CB_USAGE_FLOAT:
f->pic = CB_PICTURE (cb_build_picture ("S9(7)V9(7)"));
break;
case CB_USAGE_DOUBLE:
f->pic = CB_PICTURE (cb_build_picture ("S9(9)V9(9)"));
break;
case CB_USAGE_COMP_5:
case CB_USAGE_COMP_X:
if (f->pic->category == CB_CATEGORY_ALPHANUMERIC) {
if (f->pic->size > 8) {
sprintf (pic, "9(36)");
} else {
sprintf (pic, "9(%d)", pic_digits[f->pic->size - 1]);
}
f->pic = CB_PICTURE (cb_build_picture (pic));
}
#ifndef WORDS_BIGENDIAN
if (f->usage == CB_USAGE_COMP_X) {
if (cb_binary_byteorder == CB_BYTEORDER_BIG_ENDIAN) {
f->flag_binary_swap = 1;
}
}
#endif
break;
default:
break;
}
}
}


| static int validate_field_1 | ( | struct cb_field * | f | ) | [static] |
Definition at line 295 of file field.c.
{
cb_tree x;
cb_tree l;
char *name;
struct cb_field *p;
char *pp;
unsigned char *pstr;
int vorint;
int need_picture;
char pic[16];
x = CB_TREE (f);
name = cb_name (x);
if (f->flag_any_length) {
if (f->storage != CB_STORAGE_LINKAGE) {
cb_error_x (x, _("'%s' ANY LENGTH only allowed in LINKAGE"), name);
return -1;
}
if (f->level != 01) {
cb_error_x (x, _("'%s' ANY LENGTH must be 01 level"), name);
return -1;
}
if (f->flag_item_based || f->flag_external) {
cb_error_x (x, _("'%s' ANY LENGTH can not be BASED/EXTERNAL"), name);
return -1;
}
if (f->flag_occurs || f->occurs_depending ||
f->children || f->values || f->flag_blank_zero) {
cb_error_x (x, _("'%s' ANY LENGTH has invalid definition"), name);
return -1;
}
if (!f->pic) {
cb_error_x (x, _("'%s' ANY LENGTH must have a PICTURE"), name);
return -1;
}
if (f->pic->size != 1 || f->usage != CB_USAGE_DISPLAY) {
cb_error_x (x, _("'%s' ANY LENGTH has invalid definition"), name);
return -1;
}
f->count++;
return 0;
}
if (f->level == 77) {
if (f->storage != CB_STORAGE_WORKING &&
f->storage != CB_STORAGE_LOCAL &&
f->storage != CB_STORAGE_LINKAGE) {
cb_error_x (x, _("'%s' 77 level not allowed here"), name);
}
}
if (f->flag_external) {
if (f->level != 01 && f->level != 77) {
cb_error_x (x, _("'%s' EXTERNAL must be specified at 01/77 level"), name);
}
if (f->storage != CB_STORAGE_WORKING &&
f->storage != CB_STORAGE_FILE) {
cb_error_x (x, _("'%s' EXTERNAL can only be specified in WORKING-STORAGE section"),
name);
}
if (f->flag_item_based) {
cb_error_x (x, _("'%s' EXTERNAL and BASED are mutually exclusive"), name);
}
if (f->redefines) {
cb_error_x (x, _("'%s' EXTERNAL not allowed with REDEFINES"), name);
}
}
if (f->flag_item_based) {
if (f->storage != CB_STORAGE_WORKING &&
f->storage != CB_STORAGE_LOCAL &&
f->storage != CB_STORAGE_LINKAGE) {
cb_error_x (x, _("'%s' BASED not allowed here"), name);
}
if (f->redefines) {
cb_error_x (x, _("'%s' BASED not allowed with REDEFINES"), name);
}
if (f->level != 01 && f->level != 77) {
cb_error_x (x, _("'%s' BASED only allowed at the 01 and 77 levels"), name);
}
}
if (f->level == 66) {
if (!f->redefines) {
level_require_error (x, "RENAMES");
return -1;
}
if (f->flag_occurs) {
level_except_error (x, "RENAMES");
}
return 0;
}
/* validate OCCURS */
if (f->flag_occurs) {
if ((!cb_verify (cb_top_level_occurs_clause, "01/77 OCCURS")
&& (f->level == 01 || f->level == 77))
|| (f->level == 66 || f->level == 88)) {
level_redundant_error (x, "OCCURS");
}
for (l = f->index_list; l; l = CB_CHAIN (l)) {
cb_field (CB_VALUE (l))->flag_is_global = f->flag_is_global;
}
}
/* validate OCCURS DEPENDING */
if (f->occurs_depending) {
/* the data item that contains a OCCURS DEPENDING clause shall not
be subordinate to a data item that has the OCCURS clause */
for (p = f->parent; p; p = p->parent) {
if (p->flag_occurs) {
cb_error_x (CB_TREE (p),
_("'%s' cannot have the OCCURS clause due to '%s'"),
check_filler_name ((char *)p->name),
check_filler_name (name));
break;
}
}
/* the data item that contains a OCCURS DEPENDING clause must be
the last data item in the group */
for (p = f; p->parent; p = p->parent) {
for (; p->sister; p = p->sister) {
if (p->sister == cb_field (f->occurs_depending)) {
cb_error_x (x,
_("'%s' ODO field item invalid here"),
p->sister->name);
}
if (!p->sister->redefines) {
if (!cb_complex_odo) {
cb_error_x (x,
_("'%s' cannot have OCCURS DEPENDING"),
check_filler_name (name));
break;
}
}
}
}
/* If the field is GLOBAL, then the ODO must also be GLOBAL */
if (f->flag_is_global) {
if (!cb_field (f->occurs_depending)->flag_is_global) {
cb_error_x (x, _("'%s' ODO item must have GLOBAL attribute"),
cb_field (f->occurs_depending)->name);
}
if (f->storage != cb_field (f->occurs_depending)->storage) {
cb_error_x (x, _("GLOBAL '%s' ODO item is not in the same section as OCCURS"),
cb_field (f->occurs_depending)->name);
}
}
}
/* validate REDEFINES */
if (f->redefines) {
/* check OCCURS */
if (f->redefines->flag_occurs) {
cb_warning_x (x, _("The original definition '%s' should not have OCCURS"),
f->redefines->name);
}
/* check definition */
for (p = f->redefines->sister; p && p != f; p = p->sister) {
if (!p->redefines) {
cb_error_x (x, _("REDEFINES must follow the original definition"));
break;
}
}
/* check variable occurrence */
if (f->occurs_depending || cb_field_variable_size (f)) {
cb_error_x (x, _("'%s' cannot be variable length"), f->name);
}
if (cb_field_variable_size (f->redefines)) {
cb_error_x (x,
_("The original definition '%s' cannot be variable length"),
f->redefines->name);
}
}
if (f->children) {
/* group item */
if (f->pic) {
group_error (x, "PICTURE");
}
if (f->flag_justified) {
group_error (x, "JUSTIFIED RIGHT");
}
if (f->flag_blank_zero) {
group_error (x, "BLANK WHEN ZERO");
}
for (f = f->children; f; f = f->sister) {
if (validate_field_1 (f) != 0) {
return -1;
}
}
} else {
/* elementary item */
/* validate PICTURE */
need_picture = 1;
if (f->usage == CB_USAGE_INDEX
|| f->usage == CB_USAGE_LENGTH
|| f->usage == CB_USAGE_OBJECT
|| f->usage == CB_USAGE_POINTER
|| f->usage == CB_USAGE_PROGRAM_POINTER
|| f->usage == CB_USAGE_FLOAT
|| f->usage == CB_USAGE_DOUBLE
|| f->usage == CB_USAGE_SIGNED_CHAR
|| f->usage == CB_USAGE_SIGNED_SHORT
|| f->usage == CB_USAGE_SIGNED_INT
|| f->usage == CB_USAGE_SIGNED_LONG
|| f->usage == CB_USAGE_UNSIGNED_CHAR
|| f->usage == CB_USAGE_UNSIGNED_SHORT
|| f->usage == CB_USAGE_UNSIGNED_INT
|| f->usage == CB_USAGE_UNSIGNED_LONG
|| f->usage == CB_USAGE_PROGRAM) {
need_picture = 0;
}
if (f->pic == NULL && need_picture != 0) {
if (f->storage == CB_STORAGE_SCREEN) {
/* RXW
if (f->values &&
CB_LITERAL(CB_VALUE(f->values))->size) {
*/
if (f->values) {
sprintf (pic, "X(%d)", (int)CB_LITERAL(CB_VALUE(f->values))->size);
} else {
sprintf (pic, "X(1)");
}
f->pic = CB_PICTURE (cb_build_picture (pic));
} else if (f->flag_item_78 && f->values &&
CB_VALUE(f->values) != cb_error_node) {
f->count++;
if (CB_NUMERIC_LITERAL_P(CB_VALUE(f->values))) {
memset (pic, 0, sizeof (pic));
pp = pic;
if (CB_LITERAL(CB_VALUE(f->values))->sign) {
*pp++ = 'S';
}
vorint = CB_LITERAL(CB_VALUE(f->values))->size -
CB_LITERAL(CB_VALUE(f->values))->scale;
if (vorint) {
pp += sprintf (pp, "9(%d)", vorint);
}
if (CB_LITERAL(CB_VALUE(f->values))->scale) {
sprintf (pp, "V9(%d)",
CB_LITERAL(CB_VALUE(f->values))->scale);
}
if (CB_LITERAL(CB_VALUE(f->values))->size < 10) {
f->usage = CB_USAGE_COMP_5;
} else {
f->usage = CB_USAGE_DISPLAY;
}
f->pic = CB_PICTURE (cb_build_picture (pic));
f->pic->category = CB_CATEGORY_NUMERIC;
} else {
sprintf (pic, "X(%d)", (int)CB_LITERAL(CB_VALUE(f->values))->size);
f->pic = CB_PICTURE (cb_build_picture (pic));
f->pic->category = CB_CATEGORY_ALPHANUMERIC;
f->usage = CB_USAGE_DISPLAY;
}
} else {
if (f->flag_item_78) {
cb_error_x (x, _("Value required for constant item '%s'"), name);
} else {
cb_error_x (x, _("PICTURE clause required for '%s'"), name);
}
return -1;
}
}
if (f->pic != NULL && need_picture == 0) {
cb_error_x (x, _("'%s' cannot have PICTURE clause"), name);
}
/* validate USAGE */
switch (f->usage) {
case CB_USAGE_SIGNED_CHAR:
f->usage = CB_USAGE_COMP_5;
f->pic = CB_PICTURE (cb_build_picture ("S99"));
f->flag_real_binary = 1;
break;
case CB_USAGE_SIGNED_SHORT:
f->usage = CB_USAGE_COMP_5;
f->pic = CB_PICTURE (cb_build_picture ("S9(4)"));
f->flag_real_binary = 1;
break;
case CB_USAGE_SIGNED_INT:
f->usage = CB_USAGE_COMP_5;
f->pic = CB_PICTURE (cb_build_picture ("S9(9)"));
f->flag_real_binary = 1;
break;
case CB_USAGE_SIGNED_LONG:
f->usage = CB_USAGE_COMP_5;
f->pic = CB_PICTURE (cb_build_picture ("S9(18)"));
f->flag_real_binary = 1;
break;
case CB_USAGE_UNSIGNED_CHAR:
f->usage = CB_USAGE_COMP_5;
f->pic = CB_PICTURE (cb_build_picture ("99"));
f->flag_real_binary = 1;
break;
case CB_USAGE_UNSIGNED_SHORT:
f->usage = CB_USAGE_COMP_5;
f->pic = CB_PICTURE (cb_build_picture ("9(4)"));
f->flag_real_binary = 1;
break;
case CB_USAGE_UNSIGNED_INT:
f->usage = CB_USAGE_COMP_5;
f->pic = CB_PICTURE (cb_build_picture ("9(9)"));
f->flag_real_binary = 1;
break;
case CB_USAGE_UNSIGNED_LONG:
f->usage = CB_USAGE_COMP_5;
f->pic = CB_PICTURE (cb_build_picture ("9(18)"));
f->flag_real_binary = 1;
break;
case CB_USAGE_BINARY:
case CB_USAGE_PACKED:
if (f->pic->category != CB_CATEGORY_NUMERIC) {
cb_error_x (x, _("'%s' PICTURE clause not compatible with USAGE"), name);
}
break;
case CB_USAGE_COMP_5:
case CB_USAGE_COMP_X:
if (f->pic) {
if (f->pic->category != CB_CATEGORY_NUMERIC &&
f->pic->category != CB_CATEGORY_ALPHANUMERIC) {
cb_error_x (x, _("'%s' PICTURE clause not compatible with USAGE"), name);
}
}
break;
default:
break;
}
/* validate SIGN */
/* validate JUSTIFIED RIGHT */
if (f->flag_justified) {
switch (f->pic->category) {
case CB_CATEGORY_ALPHABETIC:
case CB_CATEGORY_ALPHANUMERIC:
break;
default:
cb_error_x (x, _("'%s' cannot have JUSTIFIED RIGHT"), name);
break;
}
}
/* validate SYNCHRONIZED */
/* validate BLANK ZERO */
if (f->flag_blank_zero) {
switch (f->pic->category) {
case CB_CATEGORY_NUMERIC:
/* reconstruct the picture string */
if (f->pic->scale > 0) {
f->pic->str = cobc_malloc (20);
pstr = (unsigned char *)(f->pic->str);
*pstr++ = '9';
vorint = f->pic->digits - f->pic->scale;
memcpy (pstr, (unsigned char *)&vorint, sizeof(int));
pstr += sizeof(int);
*pstr++ = 'V';
vorint = 1;
memcpy (pstr, (unsigned char *)&vorint, sizeof(int));
pstr += sizeof(int);
*pstr++ = '9';
vorint = f->pic->scale;
memcpy (pstr, (unsigned char *)&vorint, sizeof(int));
f->pic->size++;
} else {
f->pic->str = cobc_malloc (8);
pstr = (unsigned char *)(f->pic->str);
*pstr++ = '9';
vorint = f->pic->digits;
memcpy (pstr, (unsigned char *)&vorint, sizeof(int));
}
f->pic->category = CB_CATEGORY_NUMERIC_EDITED;
break;
case CB_CATEGORY_NUMERIC_EDITED:
break;
default:
cb_error_x (x, _("'%s' cannot have BLANK WHEN ZERO"), name);
break;
}
}
/* validate VALUE */
if (f->values) {
if (CB_PAIR_P (CB_VALUE (f->values)) || CB_CHAIN (f->values)) {
cb_error_x (x, _("Only level 88 item may have multiple values"));
}
/* ISO+IEC+1989-2002: 13.16.42.2-10 */
for (p = f; p; p = p->parent) {
if (p->redefines) {
cb_error_x (x, _("Entries under REDEFINES cannot have VALUE clause"));
}
if (p->flag_external) {
cb_warning_x (x, _("VALUE clause ignored for EXTERNAL items"));
}
}
}
}
return 0;
}


| static int validate_field_value | ( | struct cb_field * | f | ) | [static] |
Definition at line 957 of file field.c.
{
if (f->values) {
validate_move (CB_VALUE (f->values), CB_TREE (f), 1);
}
if (f->children) {
for (f = f->children; f; f = f->sister) {
validate_field_value (f);
}
}
return 0;
}


| size_t cb_needs_01 = 0 |
struct cb_field* last_real_field = NULL [static] |
const int pic_digits[] = { 2, 4, 7, 9, 12, 14, 16, 18 } [static] |
1.7.4