Skip to content

Commit

Permalink
add seperate signed BLd type #36
Browse files Browse the repository at this point in the history
We just changed BL to signed. revert that and add a seperate BLd to represent the two such dxf ranges.
BL as signed is a problem for vcount/rcount overflow detection with negative values.
Closes GH #36
  • Loading branch information
rurban committed Aug 11, 2018
1 parent 8caf6d5 commit 77d5d20
Show file tree
Hide file tree
Showing 15 changed files with 91 additions and 79 deletions.
12 changes: 6 additions & 6 deletions examples/unknown.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,11 +258,11 @@ bits_BL(Bit_Chain *restrict dat, struct _unknown_field *restrict g)
}

static void
bits_BLs(Bit_Chain *restrict dat, struct _unknown_field *restrict g)
bits_BLd(Bit_Chain *restrict dat, struct _unknown_field *restrict g)
{
int32_t l = (int32_t)strtol(g->value, NULL, 10);
bit_write_BLs(dat, l);
g->type = BITS_BLs;
bit_write_BLd(dat, l);
g->type = BITS_BLd;
}

static void
Expand Down Expand Up @@ -485,11 +485,11 @@ bits_format (struct _unknown_field *g, const int version)
else if (code <= 419)
bits_string(&dat, g);
else if (code <= 429)
bits_BLs(&dat, g); //int32_t. ignore if after color
bits_BLd(&dat, g); //int32_t. ignore if after color
else if (code <= 439)
bits_string(&dat, g); // ignore if after color
else if (code <= 449)
bits_BLs(&dat, g);//int32_t. ignore if after color
bits_BLd(&dat, g);//int32_t. ignore if after color
else if (code <= 459)
bits_BL(&dat, g);//long
else if (code <= 469)
Expand Down Expand Up @@ -905,7 +905,7 @@ main (int argc, char *argv[])
goto FOUND;
}
}
if ((g[j].type == BITS_BL || g[j].type == BITS_BLs) &&
if ((g[j].type == BITS_BL || g[j].type == BITS_BLd) &&
strlen(g[j].value) <= 5)
{
Bit_Chain dat = {NULL,16,0,0,NULL,0,0};
Expand Down
24 changes: 16 additions & 8 deletions include/dwg.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,24 +87,32 @@ extern "C" {
#ifdef HAVE_STDINT_H
# define BITCODE_BS uint16_t
# define BITCODE_RS uint16_t
# define BITCODE_BL int32_t
# define BITCODE_RL int32_t
# define BITCODE_BL uint32_t
# define BITCODE_RL uint32_t
# define BITCODE_BLd int32_t
# define BITCODE_RLd int32_t
#else
# define BITCODE_BS unsigned short int
# define BITCODE_RS unsigned short int
# define BITCODE_BL int
# define BITCODE_RL int
# define BITCODE_BL unsigned int
# define BITCODE_RL unsigned int
# define BITCODE_BLd int
# define BITCODE_RLd int
#endif
#ifdef HAVE_INTTYPES_H
# define FORMAT_BS "%" PRIu16
# define FORMAT_RS "%" PRIu16
# define FORMAT_BL "%" PRId32
# define FORMAT_RL "%" PRId32
# define FORMAT_BL "%" PRIu32
# define FORMAT_RL "%" PRIu32
# define FORMAT_BLd "%" PRId32
# define FORMAT_RLd "%" PRId32
#else
# define FORMAT_BS "%hu"
# define FORMAT_RS "%hu"
# define FORMAT_BL "%d"
# define FORMAT_RL "%d"
# define FORMAT_BL "%u"
# define FORMAT_RL "%u"
# define FORMAT_BLd "%d"
# define FORMAT_RLd "%d"
#endif
#define BITCODE_RD BITCODE_DOUBLE
#define FORMAT_RD "%f"
Expand Down
4 changes: 2 additions & 2 deletions src/bits.c
Original file line number Diff line number Diff line change
Expand Up @@ -538,9 +538,9 @@ bit_write_BL(Bit_Chain * dat, BITCODE_BL value)
/** Write signed bitlong (compacted data).
*/
void
bit_write_BLs(Bit_Chain * dat, int32_t value)
bit_write_BLd(Bit_Chain * dat, BITCODE_BLd value)
{
const uint32_t l = value;
const BITCODE_BL l = value;
if (l > 255)
{
bit_write_BB(dat, 0);
Expand Down
6 changes: 3 additions & 3 deletions src/bits.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,9 @@ bit_read_BL(Bit_Chain *dat);
void
bit_write_BL(Bit_Chain *dat, BITCODE_BL value);

void
bit_write_BLd(Bit_Chain * dat, BITCODE_BLd value);

BITCODE_BS
bit_read_BOT(Bit_Chain *dat);

Expand Down Expand Up @@ -308,7 +311,4 @@ bit_nan(void);
int
bit_isnan(BITCODE_BD number);

void
bit_write_BLs(Bit_Chain * dat, int32_t value);

#endif
4 changes: 2 additions & 2 deletions src/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ const char *dwg_bits_name[] =
"4BITS",
"BS",
"BL",
"BLs",
"BLd",
"RLL",
"RD",
"BD",
Expand Down Expand Up @@ -140,7 +140,7 @@ const unsigned char dwg_bits_size[] =
4, //"4BITS",
2, //"BS", 10,18
2, //"BL", 10,34
2, //"BLs", 10,34
2, //"BLd", 10,34
64, //"RLL",
64, //"RD",
2, //"BD", 66
Expand Down
2 changes: 1 addition & 1 deletion src/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ typedef enum DWG_BITS
BITS_4BITS, /** 4 bits, r2000+ for VIEWMODE */
BITS_BS, /** bitshort */
BITS_BL, /** bitlong uint32_t */
BITS_BLs, /** signed bitlong int32_t */
BITS_BLd, /** signed bitlong int32_t */
BITS_RLL, /** raw 8-byte long long (not compressed, big-endian) */
BITS_RD, /** raw double (not compressed, big-endian) */
BITS_BD, /** bitdouble */
Expand Down
10 changes: 6 additions & 4 deletions src/dec_macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,11 +170,13 @@
#define FIELD_MC(name,dxf) FIELDG(name, MC, dxf)
#define FIELD_MS(name,dxf) FIELDG(name, MS, dxf)
#define FIELD_TF(name,len,dxf) \
{ _obj->name = bit_read_TF(dat,(int)len); \
{ VECTOR_CHKCOUNT(name,TF,len) \
_obj->name = bit_read_TF(dat,(int)len); \
LOG_INSANE( #name ": [%d TF " #dxf "]\n", len); \
LOG_INSANE_TF(FIELD_VALUE(name), (int)len); }
#define FIELD_TFF(name,len,dxf) \
{ bit_read_fixed(dat,_obj->name,(int)len); \
{ VECTOR_CHKCOUNT(name,TF,len) \
bit_read_fixed(dat,_obj->name,(int)len); \
LOG_INSANE( #name ": [%d TFF " #dxf "]\n", len); \
LOG_INSANE_TF(FIELD_VALUE(name), (int)len); }
#define FIELD_TV(name,dxf) FIELDG(name, TV, dxf)
Expand Down Expand Up @@ -696,9 +698,9 @@ static int dwg_decode_##token (Bit_Chain *restrict dat, Dwg_Object *restrict obj
vcount = (obj->size+obj->address)*8 - bit_position(dat); \
} \
if (vcount) \
LOG_HANDLE(" padding: %+ld %s\n", (long)vcount, (long)vcount >= 8 \
LOG_HANDLE(" padding: %+ld %s\n", (long)vcount, (BITCODE_BLd)vcount >= 8 \
? "MISSING" \
: ((long)vcount < 0) ? "OVERSHOOT" : ""); \
: ((BITCODE_BLd)vcount < 0) ? "OVERSHOOT" : ""); \
return error & ~DWG_ERR_UNHANDLEDCLASS; \
}

Expand Down
4 changes: 2 additions & 2 deletions src/dwg.spec
Original file line number Diff line number Diff line change
Expand Up @@ -1545,9 +1545,9 @@ static int decode_3dsolid(Bit_Chain* dat, Bit_Chain* hdl_dat,
BITCODE_BL j;
BITCODE_BL vcount, rcount1, rcount2;
BITCODE_BL i = 0;
BITCODE_BL total_size = 0;
BITCODE_BL num_blocks = 0;
int index;
int total_size = 0;
int num_blocks = 0;
int error = 0;

FIELD_B (acis_empty, 0);
Expand Down
8 changes: 4 additions & 4 deletions src/dwg_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -18397,7 +18397,7 @@ dwg_ent_get_eed(const dwg_obj_ent *restrict ent,
LOG_ERROR("%s: empty or invalid ent", __FUNCTION__)
return NULL;
}
else if (index < 0 || index >= ent->num_eed) {
else if (index >= ent->num_eed) {
*error = 2;
return NULL;
}
Expand All @@ -18424,7 +18424,7 @@ dwg_ent_get_eed_data(const dwg_obj_ent *restrict ent,
LOG_ERROR("%s: empty or invalid ent", __FUNCTION__)
return NULL;
}
else if (index < 0 || index >= ent->num_eed) {
else if (index >= ent->num_eed) {
*error = 2;
return NULL;
}
Expand Down Expand Up @@ -19019,7 +19019,7 @@ dwg_obj_get_eed(const dwg_obj_obj *restrict obj,
LOG_ERROR("%s: empty or invalid obj", __FUNCTION__)
return NULL;
}
else if (index < 0 || index >= obj->num_eed) {
else if (index >= obj->num_eed) {
*error = 2;
return NULL;
}
Expand All @@ -19046,7 +19046,7 @@ dwg_obj_get_eed_data(const dwg_obj_obj *restrict obj,
LOG_ERROR("%s: empty or invalid obj", __FUNCTION__)
return NULL;
}
else if (index < 0 || index >= obj->num_eed) {
else if (index >= obj->num_eed) {
*error = 2;
return NULL;
}
Expand Down
14 changes: 7 additions & 7 deletions src/in_dxf.c
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,7 @@ static int dxf_check_code(Bit_Chain *dat, Dxf_Pair *pair, int code)
#define FIELD_VECTOR_N(name, type, size, dxf)\
if (dxf)\
{\
for (vcount=0; vcount < (int)size; vcount++)\
for (vcount=0; vcount < (BITCODE_BL)size; vcount++)\
{\
sscanf((char*)&dat->chain[dat->byte], #name ": " FORMAT_##type ",\n", \
&_obj->name[vcount]);\
Expand All @@ -452,10 +452,10 @@ static int dxf_check_code(Bit_Chain *dat, Dxf_Pair *pair, int code)
#define FIELD_VECTOR_T(name, size, dxf)\
if (dxf) {\
PRE (R_2007) { \
for (vcount=0; vcount < (int)_obj->size; vcount++) \
for (vcount=0; vcount < (BITCODE_BL)_obj->size; vcount++) \
VALUE_TV(_obj->name[vcount], dxf); \
} else { \
for (vcount=0; vcount < (int)_obj->size; vcount++) \
for (vcount=0; vcount < (BITCODE_BL)_obj->size; vcount++) \
VALUE_TU(_obj->name[vcount], dxf); \
} \
}
Expand All @@ -464,30 +464,30 @@ static int dxf_check_code(Bit_Chain *dat, Dxf_Pair *pair, int code)

#define FIELD_2RD_VECTOR(name, size, dxf)\
if (dxf) {\
for (vcount=0; vcount < (int)_obj->size; vcount++) \
for (vcount=0; vcount < (BITCODE_BL)_obj->size; vcount++) \
{\
FIELD_2RD(name[vcount], dxf);\
}\
}

#define FIELD_2DD_VECTOR(name, size, dxf)\
FIELD_2RD(name[0], dxf);\
for (vcount = 1; vcount < (int)_obj->size; vcount++)\
for (vcount = 1; vcount < (BITCODE_BL)_obj->size; vcount++)\
{\
FIELD_2DD(name[vcount], FIELD_VALUE(name[vcount - 1].x), FIELD_VALUE(name[vcount - 1].y), dxf);\
}\

#define FIELD_3DPOINT_VECTOR(name, size, dxf)\
if (dxf) {\
for (vcount=0; vcount < (int)_obj->size; vcount++)\
for (vcount=0; vcount < (BITCODE_BL)_obj->size; vcount++)\
{\
FIELD_3DPOINT(name[vcount], dxf);\
}\
}

#define HANDLE_VECTOR_N(name, size, code, dxf) \
if (dxf) {\
for (vcount=0; vcount < (int)size; vcount++)\
for (vcount=0; vcount < (BITCODE_BL)size; vcount++)\
{\
FIELD_HANDLE_N(name[vcount], vcount, code, dxf);\
}\
Expand Down
20 changes: 10 additions & 10 deletions src/out_dxf.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,18 +325,18 @@ static int dxf_3dsolid(Bit_Chain *restrict dat,
#define FIELD_VECTOR_N(name, type, size, dxf)\
if (dxf && _obj->name)\
{\
for (vcount=0; vcount < (int)size; vcount++)\
for (vcount=0; vcount < (BITCODE_BL)size; vcount++)\
{\
VALUE_##type(_obj->name[vcount], dxf); \
}\
}
#define FIELD_VECTOR_T(name, size, dxf)\
if (dxf && _obj->name) {\
PRE (R_2007) { \
for (vcount=0; vcount < (int)_obj->size; vcount++) \
for (vcount=0; vcount < (BITCODE_BL)_obj->size; vcount++) \
VALUE_TV(_obj->name[vcount], dxf); \
} else { \
for (vcount=0; vcount < (int)_obj->size; vcount++) \
for (vcount=0; vcount < (BITCODE_BL)_obj->size; vcount++) \
VALUE_TU(_obj->name[vcount], dxf); \
} \
}
Expand All @@ -345,30 +345,30 @@ static int dxf_3dsolid(Bit_Chain *restrict dat,

#define FIELD_2RD_VECTOR(name, size, dxf)\
if (dxf && _obj->name) {\
for (vcount=0; vcount < (int)_obj->size; vcount++) \
for (vcount=0; vcount < (BITCODE_BL)_obj->size; vcount++) \
{\
FIELD_2RD(name[vcount], dxf);\
}\
}

#define FIELD_2DD_VECTOR(name, size, dxf)\
FIELD_2RD(name[0], dxf);\
for (vcount = 1; vcount < (int)_obj->size; vcount++)\
for (vcount = 1; vcount < (BITCODE_BL)_obj->size; vcount++)\
{\
FIELD_2DD(name[vcount], FIELD_VALUE(name[vcount - 1].x), FIELD_VALUE(name[vcount - 1].y), dxf);\
}\

#define FIELD_3DPOINT_VECTOR(name, size, dxf)\
if (dxf) {\
for (vcount=0; vcount < (int)_obj->size; vcount++)\
for (vcount=0; vcount < (BITCODE_BL)_obj->size; vcount++)\
{\
FIELD_3DPOINT(name[vcount], dxf);\
}\
}

#define VALUE_HANDLE_N(hdlptr, name, vcount, handle_code, dxf) \
if (dxf) {\
for (vcount=0; vcount < (int)size; vcount++)\
for (vcount=0; vcount < (BITCODE_BL)size; vcount++)\
{\
VALUE_HANDLE(hdlptr[vcount], handle_code, dxf);\
}\
Expand All @@ -377,7 +377,7 @@ static int dxf_3dsolid(Bit_Chain *restrict dat,
VALUE_HANDLE(_obj->name, handle_code, dxf)
#define HANDLE_VECTOR_N(name, size, code, dxf) \
if (dxf) {\
for (vcount=0; vcount < (int)size; vcount++)\
for (vcount=0; vcount < (BITCODE_BL)size; vcount++)\
{\
FIELD_HANDLE(name[vcount], code, dxf);\
}\
Expand Down Expand Up @@ -407,7 +407,7 @@ static int dxf_3dsolid(Bit_Chain *restrict dat,
obj->tio.object->reactors) \
{ \
fprintf(dat->fh, "102\r\n{ACAD_REACTORS\r\n");\
for (vcount=0; vcount < (int)obj->tio.object->num_reactors; vcount++)\
for (vcount=0; vcount < obj->tio.object->num_reactors; vcount++)\
{ /* soft ptr */ \
VALUE_HANDLE(obj->tio.object->reactors[vcount], code, 330); \
}\
Expand Down Expand Up @@ -552,7 +552,7 @@ dxf_write_xdata(Bit_Chain *restrict dat, Dwg_Resbuf *restrict rbuf, BITCODE_BL s
if (type == VT_INVALID) {
LOG_WARN("Invalid xdata code %d", dxftype);
} else {
LOG_WARN("Unknown xdata code %d => %d", dxftype, (int)type);
LOG_WARN("Unknown xdata code %d => %d", dxftype, (BITCODE_BL)type);
}
}

Expand Down
Loading

0 comments on commit 77d5d20

Please sign in to comment.