Files
Astral3D/astral-service/static/lib/libredwg/examples/bits.c
lyf 79102a18fb Initial commit
Made-with: Cursor
2026-03-12 17:51:30 +08:00

233 lines
6.1 KiB
C

/*****************************************************************************/
/* LibreDWG - free implementation of the DWG file format */
/* */
/* Copyright (C) 2018-2019 Free Software Foundation, Inc. */
/* */
/* This library is free software, licensed under the terms of the GNU */
/* General Public License as published by the Free Software Foundation, */
/* either version 3 of the License, or (at your option) any later version. */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/*****************************************************************************/
/*
* bits.c: print all possible type/values of given bits
* written by Reini Urban
*/
#include "../src/config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "dwg.h"
#include "../src/bits.h"
static int maxoff = 0;
static int
decode (Bit_Chain *dat, int off, const int size)
{
int pos = 0;
BITCODE_BS bs = 0;
printf ("decode offset:%d, size:%d\n", off, size);
if (off >= size)
return 0;
bit_set_position (dat, off);
if (size - off >= 66)
{
double d = bit_read_BD (dat);
int p = (int)bit_position (dat);
if (d != bit_nan ())
{
printf ("%.15f BD @%d (%d)\n", d, p, size);
pos = p;
}
bit_set_position (dat, off);
}
if (size - off >= 64)
{
double d = bit_read_RD (dat);
int p = (int)bit_position (dat);
if (d != bit_nan ())
{
printf ("%.15f RD @%d (%d)\n", d, p, size);
pos = p;
}
bit_set_position (dat, off);
}
if (size - off >= 34)
{
BITCODE_BL l = (long)bit_read_BL (dat);
int p = (int)bit_position (dat);
if (p <= size - off)
{
printf ("%u BL @%d (%d)\n", l, p, size);
pos = p;
}
bit_set_position (dat, off);
}
if (size - off >= 32)
{
BITCODE_BL l = (long)bit_read_RL (dat);
pos = (int)bit_position (dat);
printf ("%u RL @%d (%d)\n", l, pos, size);
bit_set_position (dat, off);
}
if (size - off >= 16)
{
BITCODE_RS l = (int)bit_read_RS (dat);
pos = (int)bit_position (dat);
printf ("%d RS @%d (%d)\n", l, pos, size);
bit_set_position (dat, off);
}
if (size - off >= 10)
{
int p;
bs = bit_read_BS (dat);
p = (int)bit_position (dat);
if (p <= size - off)
{
printf ("%d BS @%d (%d)\n", bs, p, size);
pos = p;
}
bit_set_position (dat, off);
}
if (size - off >= 8)
{
int l = bit_read_RC (dat);
pos = (int)bit_position (dat);
printf ("%d RC @%d (%d)\n", l, pos, size);
bit_set_position (dat, off);
}
if (size - off >= 8)
{
Dwg_Handle h;
int err, p;
err = bit_read_H (dat, &h);
p = (int)bit_position (dat);
if (!err && h.size == 1 && p <= size - off)
{
printf ("%x.%d.%lX H @%d (%d)\n", h.code, h.size, h.value, p, size);
pos = p;
}
bit_set_position (dat, off);
}
if (size - off >= 4)
{
Dwg_Color c;
int p;
bit_read_CMC (dat, dat, &c);
p = (int)bit_position (dat);
if (c.index < 257 && p <= size - off)
{
printf ("%d 0x%06X 0x%x CMC @%d (%d)\n", c.index, c.rgb, c.flag, p,
size);
pos = p;
}
free (c.name);
free (c.book_name);
bit_set_position (dat, off);
}
if (size - off >= 2)
{
int i = bit_read_BB (dat);
pos = (int)bit_position (dat);
printf ("%d BB @%d (%d)\n", i, pos, size);
if (i == 2)
printf ("%d BS/BL @%d (%d)\n", 0, pos, size);
else if (i == 3)
printf ("%d BS @%d (%d)\n", 256, pos, size);
bit_set_position (dat, off);
}
// if BS is a valid length try TV also
if (bs > 0 && bs < size - off - pos)
{
int i;
char *s = bit_read_TV (dat);
int p = (int)bit_position (dat);
if (s)
{
for (i = 0; i < bs; i++)
if (!isprint (s[i]))
break;
if (i == bs)
{
printf ("%s TV @%d (%d)\n", s, pos, size);
pos = p;
}
free (s);
}
}
while (pos < size)
{
if (pos <= off)
pos++;
if (maxoff < pos)
maxoff = pos;
// printf ("offset %d\n", pos);
return decode (dat, off + 1, size);
}
return 0;
}
int
main (int argc, char *argv[])
{
int hex = 0;
int i;
int pos;
Bit_Chain dat = EMPTY_CHAIN (0);
if (argc < 2)
{
printf ("usage: examples/bits "
"001100000000000000000000000000011000000000000000100000001010010"
"00\n");
printf (
"or examples/bits -x '8055 40f9 3284 d222 3e40 7436 e0d9 23fd'\n");
return 1;
}
if (argc > 2 && !strcmp (argv[1], "-x"))
{
hex = 1;
i = 2;
}
else
{
i = 1;
}
// dat.chain = malloc (size + 1);
// dat.size = size;
dat.version = R_2004;
do
{
char *input = argv[i];
int bits = strlen (input);
if (hex)
dat.size += bits;
else
dat.size += bits / 8;
dat.chain = realloc (dat.chain, dat.size + 1);
if (hex)
{
int size = bit_write_hexbits (&dat, input);
dat.size -= dat.size - size;
}
else
bit_write_bits (&dat, input);
i++;
}
while (i < argc);
pos = (int)bit_position (&dat);
// accept all types, like CMC, BS, BL, HANDLE and print all possible variants
pos = decode (&dat, 0, (int)pos);
free (dat.chain);
return 0;
}