mirror of
https://github.com/simon987/sist2.git
synced 2025-04-19 18:26:43 +00:00
inline text/util functions
This commit is contained in:
parent
9ae77fdedb
commit
7efb4957bf
@ -48,6 +48,7 @@
|
|||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "tpool.h"
|
#include "tpool.h"
|
||||||
|
#include "utf8.h/utf8.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "io/store.h"
|
#include "io/store.h"
|
||||||
#include "io/serialize.h"
|
#include "io/serialize.h"
|
||||||
@ -63,7 +64,6 @@
|
|||||||
#include "parsing/cbr.h"
|
#include "parsing/cbr.h"
|
||||||
#include "cli.h"
|
#include "cli.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "utf8.h/utf8.h"
|
|
||||||
|
|
||||||
#include "src/index/elastic.h"
|
#include "src/index/elastic.h"
|
||||||
#include "index/web.h"
|
#include "index/web.h"
|
||||||
|
229
src/util.c
229
src/util.c
@ -1,235 +1,6 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "src/ctx.h"
|
#include "src/ctx.h"
|
||||||
|
|
||||||
dyn_buffer_t dyn_buffer_create() {
|
|
||||||
dyn_buffer_t buf;
|
|
||||||
|
|
||||||
buf.size = INITIAL_BUF_SIZE;
|
|
||||||
buf.cur = 0;
|
|
||||||
buf.buf = malloc(INITIAL_BUF_SIZE);
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
void grow_buffer(dyn_buffer_t *buf, size_t size) {
|
|
||||||
if (buf->cur + size > buf->size) {
|
|
||||||
do {
|
|
||||||
buf->size *= 2;
|
|
||||||
} while (buf->cur + size > buf->size);
|
|
||||||
|
|
||||||
buf->buf = realloc(buf->buf, buf->size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void grow_buffer_small(dyn_buffer_t *buf) {
|
|
||||||
if (buf->cur + sizeof(long) > buf->size) {
|
|
||||||
buf->size *= 2;
|
|
||||||
buf->buf = realloc(buf->buf, buf->size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void dyn_buffer_write(dyn_buffer_t *buf, void *data, size_t size) {
|
|
||||||
grow_buffer(buf, size);
|
|
||||||
|
|
||||||
memcpy(buf->buf + buf->cur, data, size);
|
|
||||||
buf->cur += size;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dyn_buffer_write_char(dyn_buffer_t *buf, char c) {
|
|
||||||
grow_buffer_small(buf);
|
|
||||||
|
|
||||||
*(buf->buf + buf->cur) = c;
|
|
||||||
buf->cur += sizeof(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void dyn_buffer_write_str(dyn_buffer_t *buf, char *str) {
|
|
||||||
dyn_buffer_write(buf, str, strlen(str));
|
|
||||||
dyn_buffer_write_char(buf, '\0');
|
|
||||||
}
|
|
||||||
|
|
||||||
void dyn_buffer_append_string(dyn_buffer_t *buf, char *str) {
|
|
||||||
dyn_buffer_write(buf, str, strlen(str));
|
|
||||||
}
|
|
||||||
|
|
||||||
void dyn_buffer_write_int(dyn_buffer_t *buf, int d) {
|
|
||||||
grow_buffer_small(buf);
|
|
||||||
|
|
||||||
*(int *) (buf->buf + buf->cur) = d;
|
|
||||||
buf->cur += sizeof(int);
|
|
||||||
}
|
|
||||||
|
|
||||||
void dyn_buffer_write_short(dyn_buffer_t *buf, short s) {
|
|
||||||
grow_buffer_small(buf);
|
|
||||||
|
|
||||||
*(short *) (buf->buf + buf->cur) = s;
|
|
||||||
buf->cur += sizeof(short);
|
|
||||||
}
|
|
||||||
|
|
||||||
void dyn_buffer_write_long(dyn_buffer_t *buf, unsigned long l) {
|
|
||||||
grow_buffer_small(buf);
|
|
||||||
|
|
||||||
*(unsigned long *) (buf->buf + buf->cur) = l;
|
|
||||||
buf->cur += sizeof(unsigned long);
|
|
||||||
}
|
|
||||||
|
|
||||||
void dyn_buffer_destroy(dyn_buffer_t *buf) {
|
|
||||||
free(buf->buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
void text_buffer_destroy(text_buffer_t *buf) {
|
|
||||||
dyn_buffer_destroy(&buf->dyn_buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
text_buffer_t text_buffer_create(int max_size) {
|
|
||||||
text_buffer_t text_buf;
|
|
||||||
|
|
||||||
text_buf.dyn_buffer = dyn_buffer_create();
|
|
||||||
text_buf.max_size = max_size;
|
|
||||||
text_buf.last_char_was_whitespace = FALSE;
|
|
||||||
|
|
||||||
return text_buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
void text_buffer_terminate_string(text_buffer_t *buf) {
|
|
||||||
if (buf->dyn_buffer.cur > 0 && *(buf->dyn_buffer.buf + buf->dyn_buffer.cur - 1) == ' ') {
|
|
||||||
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur - 1) = '\0';
|
|
||||||
} else {
|
|
||||||
dyn_buffer_write_char(&buf->dyn_buffer, '\0');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
__always_inline
|
|
||||||
int utf8_validchr(const char *s) {
|
|
||||||
if (0x00 == (0x80 & *s)) {
|
|
||||||
return TRUE;
|
|
||||||
} else if (0xf0 == (0xf8 & *s)) {
|
|
||||||
if ((0x80 != (0xc0 & s[1])) || (0x80 != (0xc0 & s[2])) ||
|
|
||||||
(0x80 != (0xc0 & s[3]))) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0x80 == (0xc0 & s[4])) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((0 == (0x07 & s[0])) && (0 == (0x30 & s[1]))) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
} else if (0xe0 == (0xf0 & *s)) {
|
|
||||||
if ((0x80 != (0xc0 & s[1])) || (0x80 != (0xc0 & s[2]))) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0x80 == (0xc0 & s[3])) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((0 == (0x0f & s[0])) && (0 == (0x20 & s[1]))) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
} else if (0xc0 == (0xe0 & *s)) {
|
|
||||||
if (0x80 != (0xc0 & s[1])) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0x80 == (0xc0 & s[2])) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 == (0x1e & s[0])) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int text_buffer_append_string(text_buffer_t *buf, char *str, size_t len) {
|
|
||||||
|
|
||||||
utf8_int32_t c;
|
|
||||||
if (str == NULL || len < 1 ||
|
|
||||||
(0xf0 == (0xf8 & str[0]) && len < 4) ||
|
|
||||||
(0xe0 == (0xf0 & str[0]) && len < 3) ||
|
|
||||||
(0xc0 == (0xe0 & str[0]) && len == 1) ||
|
|
||||||
*(str) == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (void *v = utf8codepoint(str, &c); c != '\0' && ((char *) v - str + 4) < len; v = utf8codepoint(v, &c)) {
|
|
||||||
if (utf8_validchr(v)) {
|
|
||||||
text_buffer_append_char(buf, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int text_buffer_append_string0(text_buffer_t *buf, char *str) {
|
|
||||||
utf8_int32_t c;
|
|
||||||
for (void *v = utf8codepoint(str, &c); c != '\0'; v = utf8codepoint(v, &c)) {
|
|
||||||
if (utf8_validchr(v)) {
|
|
||||||
text_buffer_append_char(buf, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int text_buffer_append_char(text_buffer_t *buf, int c) {
|
|
||||||
|
|
||||||
if (SHOULD_IGNORE_CHAR(c) || c == ' ') {
|
|
||||||
if (!buf->last_char_was_whitespace && buf->dyn_buffer.cur != 0) {
|
|
||||||
dyn_buffer_write_char(&buf->dyn_buffer, ' ');
|
|
||||||
buf->last_char_was_whitespace = TRUE;
|
|
||||||
|
|
||||||
if (buf->max_size > 0 && buf->dyn_buffer.cur >= buf->max_size) {
|
|
||||||
return TEXT_BUF_FULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
buf->last_char_was_whitespace = FALSE;
|
|
||||||
grow_buffer_small(&buf->dyn_buffer);
|
|
||||||
|
|
||||||
if (0 == ((utf8_int32_t) 0xffffff80 & c)) {
|
|
||||||
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = (char) c;
|
|
||||||
} else if (0 == ((utf8_int32_t) 0xfffff800 & c)) {
|
|
||||||
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0xc0 | (char) (c >> 6);
|
|
||||||
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0x80 | (char) (c & 0x3f);
|
|
||||||
} else if (0 == ((utf8_int32_t) 0xffff0000 & c)) {
|
|
||||||
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0xe0 | (char) (c >> 12);
|
|
||||||
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0x80 | (char) ((c >> 6) & 0x3f);
|
|
||||||
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0x80 | (char) (c & 0x3f);
|
|
||||||
} else {
|
|
||||||
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0xf0 | (char) (c >> 18);
|
|
||||||
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0x80 | (char) ((c >> 12) & 0x3f);
|
|
||||||
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0x80 | (char) ((c >> 6) & 0x3f);
|
|
||||||
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0x80 | (char) (c & 0x3f);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buf->max_size > 0 && buf->dyn_buffer.cur >= buf->max_size) {
|
|
||||||
return TEXT_BUF_FULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void incremental_put(GHashTable *table, unsigned long inode_no, int mtime) {
|
|
||||||
g_hash_table_insert(table, (gpointer) inode_no, GINT_TO_POINTER(mtime));
|
|
||||||
}
|
|
||||||
|
|
||||||
int incremental_get(GHashTable *table, unsigned long inode_no) {
|
|
||||||
if (table != NULL) {
|
|
||||||
return GPOINTER_TO_INT(g_hash_table_lookup(table, (gpointer) inode_no));
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int incremental_mark_file_for_copy(GHashTable *table, unsigned long inode_no) {
|
|
||||||
g_hash_table_insert(table, GINT_TO_POINTER(inode_no), GINT_TO_POINTER(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define PBSTR "========================================"
|
#define PBSTR "========================================"
|
||||||
#define PBWIDTH 40
|
#define PBWIDTH 40
|
||||||
|
|
||||||
|
253
src/util.h
253
src/util.h
@ -32,47 +32,258 @@ dyn_buffer_t url_escape(char *str);
|
|||||||
|
|
||||||
void progress_bar_print(double percentage, size_t tn_size, size_t index_size);
|
void progress_bar_print(double percentage, size_t tn_size, size_t index_size);
|
||||||
|
|
||||||
|
|
||||||
GHashTable *incremental_get_table();
|
GHashTable *incremental_get_table();
|
||||||
|
|
||||||
dyn_buffer_t dyn_buffer_create();
|
__always_inline
|
||||||
|
static int utf8_validchr2(const char *s) {
|
||||||
|
if (0x00 == (0x80 & *s)) {
|
||||||
|
return TRUE;
|
||||||
|
} else if (0xf0 == (0xf8 & *s)) {
|
||||||
|
if ((0x80 != (0xc0 & s[1])) || (0x80 != (0xc0 & s[2])) ||
|
||||||
|
(0x80 != (0xc0 & s[3]))) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void grow_buffer(dyn_buffer_t *buf, size_t size);
|
if (0x80 == (0xc0 & s[4])) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void grow_buffer_small(dyn_buffer_t *buf);
|
if ((0 == (0x07 & s[0])) && (0 == (0x30 & s[1]))) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
} else if (0xe0 == (0xf0 & *s)) {
|
||||||
|
if ((0x80 != (0xc0 & s[1])) || (0x80 != (0xc0 & s[2]))) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void dyn_buffer_write(dyn_buffer_t *buf, void *data, size_t size);
|
if (0x80 == (0xc0 & s[3])) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void dyn_buffer_write_char(dyn_buffer_t *buf, char c);
|
if ((0 == (0x0f & s[0])) && (0 == (0x20 & s[1]))) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
} else if (0xc0 == (0xe0 & *s)) {
|
||||||
|
if (0x80 != (0xc0 & s[1])) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void dyn_buffer_write_str(dyn_buffer_t *buf, char *str);
|
if (0x80 == (0xc0 & s[2])) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void dyn_buffer_append_string(dyn_buffer_t *buf, char *str);
|
if (0 == (0x1e & s[0])) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void dyn_buffer_write_int(dyn_buffer_t *buf, int d);
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
void dyn_buffer_write_short(dyn_buffer_t *buf, short s);
|
|
||||||
|
|
||||||
void dyn_buffer_write_long(dyn_buffer_t *buf, unsigned long l);
|
__always_inline
|
||||||
|
static dyn_buffer_t dyn_buffer_create() {
|
||||||
|
dyn_buffer_t buf;
|
||||||
|
|
||||||
void dyn_buffer_destroy(dyn_buffer_t *buf);
|
buf.size = INITIAL_BUF_SIZE;
|
||||||
|
buf.cur = 0;
|
||||||
|
buf.buf = malloc(INITIAL_BUF_SIZE);
|
||||||
|
|
||||||
void text_buffer_destroy(text_buffer_t *buf);
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
text_buffer_t text_buffer_create(int max_size);
|
__always_inline
|
||||||
|
static void grow_buffer(dyn_buffer_t *buf, size_t size) {
|
||||||
|
if (buf->cur + size > buf->size) {
|
||||||
|
do {
|
||||||
|
buf->size *= 2;
|
||||||
|
} while (buf->cur + size > buf->size);
|
||||||
|
|
||||||
void text_buffer_terminate_string(text_buffer_t *buf);
|
buf->buf = realloc(buf->buf, buf->size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int text_buffer_append_string(text_buffer_t *buf, char *str, size_t len);
|
__always_inline
|
||||||
int text_buffer_append_string0(text_buffer_t *buf, char *str);
|
static void grow_buffer_small(dyn_buffer_t *buf) {
|
||||||
|
if (buf->cur + sizeof(long) > buf->size) {
|
||||||
|
buf->size *= 2;
|
||||||
|
buf->buf = realloc(buf->buf, buf->size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int text_buffer_append_char(text_buffer_t *buf, int c);
|
__always_inline
|
||||||
|
static void dyn_buffer_write(dyn_buffer_t *buf, void *data, size_t size) {
|
||||||
|
grow_buffer(buf, size);
|
||||||
|
|
||||||
void incremental_put(GHashTable *table, unsigned long inode_no, int mtime);
|
memcpy(buf->buf + buf->cur, data, size);
|
||||||
|
buf->cur += size;
|
||||||
|
}
|
||||||
|
|
||||||
int incremental_get(GHashTable *table, unsigned long inode_no);
|
__always_inline
|
||||||
|
static void dyn_buffer_write_char(dyn_buffer_t *buf, char c) {
|
||||||
|
grow_buffer_small(buf);
|
||||||
|
|
||||||
|
*(buf->buf + buf->cur) = c;
|
||||||
|
buf->cur += sizeof(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static void dyn_buffer_write_str(dyn_buffer_t *buf, char *str) {
|
||||||
|
dyn_buffer_write(buf, str, strlen(str));
|
||||||
|
dyn_buffer_write_char(buf, '\0');
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static void dyn_buffer_append_string(dyn_buffer_t *buf, char *str) {
|
||||||
|
dyn_buffer_write(buf, str, strlen(str));
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static void dyn_buffer_write_int(dyn_buffer_t *buf, int d) {
|
||||||
|
grow_buffer_small(buf);
|
||||||
|
|
||||||
|
*(int *) (buf->buf + buf->cur) = d;
|
||||||
|
buf->cur += sizeof(int);
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static void dyn_buffer_write_short(dyn_buffer_t *buf, short s) {
|
||||||
|
grow_buffer_small(buf);
|
||||||
|
|
||||||
|
*(short *) (buf->buf + buf->cur) = s;
|
||||||
|
buf->cur += sizeof(short);
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static void dyn_buffer_write_long(dyn_buffer_t *buf, unsigned long l) {
|
||||||
|
grow_buffer_small(buf);
|
||||||
|
|
||||||
|
*(unsigned long *) (buf->buf + buf->cur) = l;
|
||||||
|
buf->cur += sizeof(unsigned long);
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static void dyn_buffer_destroy(dyn_buffer_t *buf) {
|
||||||
|
free(buf->buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static void text_buffer_destroy(text_buffer_t *buf) {
|
||||||
|
dyn_buffer_destroy(&buf->dyn_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static text_buffer_t text_buffer_create(int max_size) {
|
||||||
|
text_buffer_t text_buf;
|
||||||
|
|
||||||
|
text_buf.dyn_buffer = dyn_buffer_create();
|
||||||
|
text_buf.max_size = max_size;
|
||||||
|
text_buf.last_char_was_whitespace = FALSE;
|
||||||
|
|
||||||
|
return text_buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static int text_buffer_append_char(text_buffer_t *buf, int c) {
|
||||||
|
|
||||||
|
if (SHOULD_IGNORE_CHAR(c) || c == ' ') {
|
||||||
|
if (!buf->last_char_was_whitespace && buf->dyn_buffer.cur != 0) {
|
||||||
|
dyn_buffer_write_char(&buf->dyn_buffer, ' ');
|
||||||
|
buf->last_char_was_whitespace = TRUE;
|
||||||
|
|
||||||
|
if (buf->max_size > 0 && buf->dyn_buffer.cur >= buf->max_size) {
|
||||||
|
return TEXT_BUF_FULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
buf->last_char_was_whitespace = FALSE;
|
||||||
|
grow_buffer_small(&buf->dyn_buffer);
|
||||||
|
|
||||||
|
if (0 == ((utf8_int32_t) 0xffffff80 & c)) {
|
||||||
|
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = (char) c;
|
||||||
|
} else if (0 == ((utf8_int32_t) 0xfffff800 & c)) {
|
||||||
|
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0xc0 | (char) (c >> 6);
|
||||||
|
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0x80 | (char) (c & 0x3f);
|
||||||
|
} else if (0 == ((utf8_int32_t) 0xffff0000 & c)) {
|
||||||
|
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0xe0 | (char) (c >> 12);
|
||||||
|
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0x80 | (char) ((c >> 6) & 0x3f);
|
||||||
|
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0x80 | (char) (c & 0x3f);
|
||||||
|
} else {
|
||||||
|
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0xf0 | (char) (c >> 18);
|
||||||
|
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0x80 | (char) ((c >> 12) & 0x3f);
|
||||||
|
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0x80 | (char) ((c >> 6) & 0x3f);
|
||||||
|
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur++) = 0x80 | (char) (c & 0x3f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf->max_size > 0 && buf->dyn_buffer.cur >= buf->max_size) {
|
||||||
|
return TEXT_BUF_FULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static void text_buffer_terminate_string(text_buffer_t *buf) {
|
||||||
|
if (buf->dyn_buffer.cur > 0 && *(buf->dyn_buffer.buf + buf->dyn_buffer.cur - 1) == ' ') {
|
||||||
|
*(buf->dyn_buffer.buf + buf->dyn_buffer.cur - 1) = '\0';
|
||||||
|
} else {
|
||||||
|
dyn_buffer_write_char(&buf->dyn_buffer, '\0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static int text_buffer_append_string(text_buffer_t *buf, char *str, size_t len) {
|
||||||
|
|
||||||
|
utf8_int32_t c;
|
||||||
|
if (str == NULL || len < 1 ||
|
||||||
|
(0xf0 == (0xf8 & str[0]) && len < 4) ||
|
||||||
|
(0xe0 == (0xf0 & str[0]) && len < 3) ||
|
||||||
|
(0xc0 == (0xe0 & str[0]) && len == 1) ||
|
||||||
|
*(str) == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (void *v = utf8codepoint(str, &c); c != '\0' && ((char *) v - str + 4) < len; v = utf8codepoint(v, &c)) {
|
||||||
|
if (utf8_validchr2(v)) {
|
||||||
|
text_buffer_append_char(buf, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static int text_buffer_append_string0(text_buffer_t *buf, char *str) {
|
||||||
|
utf8_int32_t c;
|
||||||
|
for (void *v = utf8codepoint(str, &c); c != '\0'; v = utf8codepoint(v, &c)) {
|
||||||
|
if (utf8_validchr2(v)) {
|
||||||
|
text_buffer_append_char(buf, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static void incremental_put(GHashTable *table, unsigned long inode_no, int mtime) {
|
||||||
|
g_hash_table_insert(table, (gpointer) inode_no, GINT_TO_POINTER(mtime));
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static int incremental_get(GHashTable *table, unsigned long inode_no) {
|
||||||
|
if (table != NULL) {
|
||||||
|
return GPOINTER_TO_INT(g_hash_table_lookup(table, (gpointer) inode_no));
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__always_inline
|
||||||
|
static int incremental_mark_file_for_copy(GHashTable *table, unsigned long inode_no) {
|
||||||
|
g_hash_table_insert(table, GINT_TO_POINTER(inode_no), GINT_TO_POINTER(1));
|
||||||
|
}
|
||||||
|
|
||||||
int incremental_mark_file_for_copy(GHashTable *table, unsigned long inode_no);
|
|
||||||
|
|
||||||
const char *find_file_in_paths(const char **paths, const char *filename);
|
const char *find_file_in_paths(const char **paths, const char *filename);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user