1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
use libc::{c_char, c_int, c_uint, uint8_t, int32_t, size_t, c_double};

#[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[repr(C)]
pub enum AVEscapeMode {
	AV_ESCAPE_MODE_AUTO,
	AV_ESCAPE_MODE_BACKSLASH,
	AV_ESCAPE_MODE_QUOTE,
}

pub const AV_ESCAPE_FLAG_WHITESPACE: c_int = 0x01;
pub const AV_ESCAPE_FLAG_STRICT:     c_int = 0x02;

pub const AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES:          c_uint = 1;
pub const AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS:             c_uint = 2;
pub const AV_UTF8_FLAG_ACCEPT_SURROGATES:                 c_uint = 4;
pub const AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES: c_uint = 8;
pub const AV_UTF8_FLAG_ACCEPT_ALL:                        c_uint = AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES | AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS | AV_UTF8_FLAG_ACCEPT_SURROGATES;


#[inline(always)]
pub unsafe fn av_strnlen(s: *const c_char, len: size_t) -> size_t {
	let mut result = 0;
	let mut ptr    = s;

	while result < len && *ptr != 0 {
		ptr     = ptr.offset(1);
		result += 1;
	}

	result
}

#[inline(always)]
pub unsafe fn av_toupper(c: c_int) -> c_int {
	if c >= b'a' as c_int && c <= b'z' as c_int {
		c ^ 0x20
	}
	else {
		c
	}
}

#[inline(always)]
pub unsafe fn av_tolower(c: c_int) -> c_int {
	if c >= b'A' as c_int && c <= b'Z' as c_int {
		c ^ 0x20
	}
	else {
		c
	}
}

extern {
	pub fn av_strstart(string: *const c_char, pfx: *const c_char, ptr: *const *const c_char) -> c_int;
	pub fn av_stristart(string: *const c_char, pfx: *const c_char, ptr: *const *const c_char) -> c_int;
	pub fn av_stristr(haystack: *const c_char, needle: *const c_char) -> *mut c_char;
	pub fn av_strnstr(haystack: *const c_char, needle: *const c_char, hay_length: size_t) -> *mut c_char;
	pub fn av_strlcpy(dst: *mut c_char, src: *const c_char, size: size_t) -> size_t;
	pub fn av_strlcat(dst: *mut c_char, src: *const c_char, size: size_t) -> size_t;
	pub fn av_strlcatf(dst: *mut c_char, size: size_t, fmt: *const c_char, ...) -> size_t;
	pub fn av_asprintf(fmt: *const c_char, ...) -> *mut c_char;
	pub fn av_d2str(d: c_double) -> *mut c_char;
	pub fn av_get_token(buf: *const *const c_char, term: *const c_char) -> *mut c_char;
	pub fn av_strtok(s: *mut c_char, delim: *const c_char, saveptr: *mut *mut c_char) -> *mut c_char;

	pub fn av_isdigit(c: c_int) -> c_int;
	pub fn av_isgraph(c: c_int) -> c_int;
	pub fn av_isspace(c: c_int) -> c_int;
	pub fn av_isxdigit(c: c_int) -> c_int;

	pub fn av_strcasecmp(a: *const c_char, b: *const c_char) -> c_int;
	pub fn av_strncasecmp(a: *const c_char, b: *const c_char, n: size_t) -> c_int;

	pub fn av_basename(path: *const c_char) -> *const c_char;
	pub fn av_dirname(path: *mut c_char) -> *const c_char;

	pub fn av_match_name(name: *const c_char, names: *const c_char) -> c_int;
	pub fn av_append_path_component(path: *const c_char, component: *const c_char) -> *mut c_char;
	pub fn av_escape(dst: *mut *mut c_char, src: *const c_char, special_chars: *const c_char, mode: AVEscapeMode, flags: c_int) -> c_int;
	pub fn av_utf8_decode(codep: *mut int32_t, bufp: *const *const uint8_t, buf_end: *const uint8_t, flags: c_uint) -> c_int;
	pub fn av_match_list(name: *const c_char, list: *const c_char, separator: c_char) -> c_int;
}