use std::fmt;
use libc::{ c_int, c_char };
#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Debug)]
pub struct quirc {
_dummy: [u8; 0],
}
#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
pub struct quirc_point {
pub x: c_int,
pub y: c_int,
}
#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Clone, Copy)]
pub struct quirc_code {
pub corners: [quirc_point; 4],
pub size: c_int,
pub cell_bitmap: [u8; QUIRC_MAX_BITMAP],
}
impl Default for quirc_code {
fn default() -> Self {
quirc_code {
corners: Default::default(),
size: 0,
cell_bitmap: [0; QUIRC_MAX_BITMAP],
}
}
}
impl fmt::Debug for quirc_code {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("quirc_code")
.field("corners", &self.corners)
.field("size", &self.size)
.field("cell_bitmap", &self.cell_bitmap.as_ref())
.finish()
}
}
#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Clone, Copy)]
pub struct quirc_data {
pub version: c_int,
pub ecc_level: c_int,
pub mask: c_int,
pub data_type: c_int,
pub payload: [u8; QUIRC_MAX_PAYLOAD],
pub payload_len: c_int,
pub eci: u32,
}
impl Default for quirc_data {
fn default() -> Self {
quirc_data {
version: 0,
ecc_level: 0,
mask: 0,
data_type: 0,
payload: [0; QUIRC_MAX_PAYLOAD],
payload_len: 0,
eci: 0,
}
}
}
impl fmt::Debug for quirc_data {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("quirc_data")
.field("version", &self.version)
.field("ecc_level", &self.ecc_level)
.field("mask", &self.mask)
.field("data_type", &self.data_type)
.field("payload", &self.payload.as_ref())
.field("payload_len", &self.payload_len)
.field("eci", &self.eci)
.finish()
}
}
#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum QuircEccLevel {
QUIRC_ECC_LEVEL_M = 0,
QUIRC_ECC_LEVEL_L = 1,
QUIRC_ECC_LEVEL_H = 2,
QUIRC_ECC_LEVEL_Q = 3,
}
#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum QuircDataType {
QUIRC_DATA_TYPE_NUMERIC = 1,
QUIRC_DATA_TYPE_ALPHA = 2,
QUIRC_DATA_TYPE_BYTE = 4,
QUIRC_DATA_TYPE_KANJI = 8,
}
#[repr(C)]
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum quirc_decode_error_t {
QUIRC_SUCCESS = 0,
QUIRC_ERROR_INVALID_GRID_SIZE,
QUIRC_ERROR_INVALID_VERSION,
QUIRC_ERROR_FORMAT_ECC,
QUIRC_ERROR_DATA_ECC,
QUIRC_ERROR_UNKNOWN_DATA_TYPE,
QUIRC_ERROR_DATA_OVERFLOW,
QUIRC_ERROR_DATA_UNDERFLOW,
}
pub const QUIRC_MAX_BITMAP: usize = 3917;
pub const QUIRC_MAX_PAYLOAD: usize = 8896;
extern {
pub fn quirc_version() -> *const c_char;
pub fn quirc_new() -> *mut quirc;
pub fn quirc_destroy(q: *mut quirc);
pub fn quirc_resize(q: *mut quirc, w: c_int, h: c_int) -> c_int;
pub fn quirc_begin(q: *mut quirc, q: *mut c_int, h: *mut c_int) -> *mut u8;
pub fn quirc_end(q: *mut quirc);
pub fn quirc_count(q: *const quirc) -> c_int;
pub fn quirc_extract(q: *const quirc, index: c_int, code: *mut quirc_code);
pub fn quirc_decode(code: *const quirc_code,
data: *mut quirc_data) -> quirc_decode_error_t;
}