summaryrefslogtreecommitdiff
path: root/protocols/Telegram/src/tgl/auto-static-print.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/src/tgl/auto-static-print.c')
-rw-r--r--protocols/Telegram/src/tgl/auto-static-print.c461
1 files changed, 0 insertions, 461 deletions
diff --git a/protocols/Telegram/src/tgl/auto-static-print.c b/protocols/Telegram/src/tgl/auto-static-print.c
deleted file mode 100644
index 3c4e810fad..0000000000
--- a/protocols/Telegram/src/tgl/auto-static-print.c
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
- This file is part of tgl-library
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- Copyright Vitaly Valtman 2014-2015
-*/
-
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-static int cur_token_len;
-static char *cur_token;
-static int cur_token_real_len;
-static int cur_token_quoted;
-static int multiline_output = 1;
-static int multiline_offset;
-static int multiline_offset_size = 2;
-
-static int *in_ptr, *in_end;
-
-static inline int fetch_int (void) {
- return *(in_ptr ++);
-}
-
-static inline int fetch_long (void) {
- long long r = *(long long *)in_ptr;
- in_ptr += 2;
- return r;
-}
-
-static inline int fetch_long (void) {
- long long r = *(long long *)in_ptr;
- in_ptr += 2;
- return r;
-}
-
-static inline void out_int (int a) {}
-static inline void out_double (double a) {}
-static inline void out_string (char *s, int l) {}
-static inline void out_long (long long a) {}
-
-static int disable_field_names;
-
-#define expect_token(token,len) \
- if (len != cur_token_len || memcmp (cur_token, token, cur_token_len)) { return -1; } \
- local_next_token ();
-
-#define expect_token_ptr(token,len) \
- if (len != cur_token_len || memcmp (cur_token, token, cur_token_len)) { return 0; } \
- local_next_token ();
-
-#define expect_token_autocomplete(token,len) \
- if (cur_token_len == -3 && len >= cur_token_real_len && !memcmp (cur_token, token, cur_token_real_len)) { set_autocomplete_string (token); return -1; }\
- if (len != cur_token_len || memcmp (cur_token, token, cur_token_len)) { return -1; } \
- local_next_token ();
-
-#define expect_token_ptr_autocomplete(token,len) \
- if (cur_token_len == -3 && len >= cur_token_real_len && !memcmp (cur_token, token, cur_token_real_len)) { set_autocomplete_string (token); return 0; }\
- if (len != cur_token_len || memcmp (cur_token, token, cur_token_len)) { return 0; } \
- local_next_token ();
-
-
-static int autocomplete_mode;
-static char *autocomplete_string;
-static int (*autocomplete_fun)(const char *, int, int, char **);
-
-static void set_autocomplete_string (const char *s) {
- if (autocomplete_string) { free (autocomplete_string); }
- autocomplete_string = strdup (s);
- assert (autocomplete_string);
- autocomplete_mode = 1;
-}
-
-static void set_autocomplete_type (int (*f)(const char *, int, int, char **)) {
- autocomplete_fun = f;
- autocomplete_mode = 2;
-}
-
-static int is_int (void) {
- if (cur_token_len <= 0) { return 0; }
- char c = cur_token[cur_token_len];
- cur_token[cur_token_len] = 0;
- char *p = 0;
-
- if (strtoll (cur_token, &p, 10)) {}
- cur_token[cur_token_len] = c;
-
- return p == cur_token + cur_token_len;
-}
-
-static long long get_int (void) {
- if (cur_token_len <= 0) { return 0; }
- char c = cur_token[cur_token_len];
- cur_token[cur_token_len] = 0;
- char *p = 0;
-
- long long val = strtoll (cur_token, &p, 0);
- cur_token[cur_token_len] = c;
-
- return val;
-}
-
-static int is_double (void) {
- if (cur_token_len <= 0) { return 0; }
- char c = cur_token[cur_token_len];
- cur_token[cur_token_len] = 0;
- char *p = 0;
-
- if (strtod (cur_token, &p)) {}
- cur_token[cur_token_len] = c;
-
- return p == cur_token + cur_token_len;
-}
-
-static double get_double (void) {
- if (cur_token_len <= 0) { return 0; }
- char c = cur_token[cur_token_len];
- cur_token[cur_token_len] = 0;
- char *p = 0;
-
- double val = strtod (cur_token, &p);
- cur_token[cur_token_len] = c;
-
- return val;
-}
-
-static struct paramed_type *paramed_type_dup (struct paramed_type *P) {
- if (ODDP (P)) { return P; }
- struct paramed_type *R = malloc (sizeof (*R));
- assert (R);
- R->type = malloc (sizeof (*R->type));
- assert (R->type);
- memcpy (R->type, P->type, sizeof (*P->type));
- R->type->id = strdup (P->type->id);
- assert (R->type->id);
-
- if (P->type->params_num) {
- R->params = malloc (sizeof (void *) * P->type->params_num);
- assert (R->params);
- int i;
- for (i = 0; i < P->type->params_num; i++) {
- R->params[i] = paramed_type_dup (P->params[i]);
- }
- }
- return R;
-}
-
-void tgl_paramed_type_free (struct paramed_type *P) {
- if (ODDP (P)) { return; }
- if (P->type->params_num) {
- int i;
- for (i = 0; i < P->type->params_num; i++) {
- tgl_paramed_type_free (P->params[i]);
- }
- free (P->params);
- }
- free (P->type->id);
- free (P->type);
- free (P);
-}
-
-static char *buffer_pos, *buffer_end;
-
-static int is_wspc (char c) {
- return c <= 32 && c > 0;
-}
-
-static void skip_wspc (void) {
- while (buffer_pos < buffer_end && is_wspc (*buffer_pos)) {
- buffer_pos ++;
- }
-}
-
-static int is_letter (char c) {
- return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '.' || c == '_' || c == '-';
-}
-
-
-static char exp_buffer[1 << 25];;
-static int exp_buffer_pos;
-
-static inline int is_hex (char c) {
- return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');
-}
-
-static inline int hex2dec (char c) {
- if (c >= '0' && c <= '9') { return c - '0'; }
- else { return c - 'a' + 10; }
-}
-
-static void expand_backslashed (char *s, int len) {
- int backslashed = 0;
- exp_buffer_pos = 0;
- int i = 0;
- while (i < len) {
- assert (i + 3 <= (1 << 25));
- if (backslashed) {
- backslashed = 0;
- switch (s[i ++]) {
- case 'n':
- exp_buffer[exp_buffer_pos ++] = '\n';
- break;
- case 'r':
- exp_buffer[exp_buffer_pos ++] = '\r';
- break;
- case 't':
- exp_buffer[exp_buffer_pos ++] = '\t';
- break;
- case 'b':
- exp_buffer[exp_buffer_pos ++] = '\b';
- break;
- case 'a':
- exp_buffer[exp_buffer_pos ++] = '\a';
- break;
- case '\\':
- exp_buffer[exp_buffer_pos ++] = '\\';
- break;
- case 'x':
- if (i + 2 > len || !is_hex (s[i]) || !is_hex (s[i + 1])) {
- exp_buffer_pos = -1;
- return;
- }
- exp_buffer[exp_buffer_pos ++] = hex2dec (s[i]) * 16 + hex2dec (s[i + 1]);
- i += 2;
- break;
- default:
- break;
- }
- } else {
- if (s[i] == '\\') {
- backslashed = 1;
- i ++;
- } else {
- exp_buffer[exp_buffer_pos ++] = s[i ++];
- }
- }
- }
-}
-
-static void local_next_token (void) {
- skip_wspc ();
- cur_token_quoted = 0;
- if (buffer_pos >= buffer_end) {
- cur_token_len = -3;
- cur_token_real_len = 0;
- return;
- }
- char c = *buffer_pos;
- if (is_letter (c)) {
- cur_token = buffer_pos;
- while (buffer_pos < buffer_end && is_letter (*buffer_pos)) {
- buffer_pos ++;
- }
- if (buffer_pos < buffer_end) {
- cur_token_len = buffer_pos - cur_token;
- } else {
- cur_token_real_len = buffer_pos - cur_token;
- cur_token_len = -3;
- }
- return;
- } else if (c == '"') {
- cur_token_quoted = 1;
- cur_token = buffer_pos ++;
- int backslashed = 0;
- while (buffer_pos < buffer_end && (*buffer_pos != '"' || backslashed)) {
- if (*buffer_pos == '\\') {
- backslashed ^= 1;
- } else {
- backslashed = 0;
- }
- buffer_pos ++;
- }
- if (*buffer_pos == '"') {
- buffer_pos ++;
- expand_backslashed (cur_token + 1, buffer_pos - cur_token - 2);
- if (exp_buffer_pos < 0) {
- cur_token_len = -2;
- } else {
- cur_token_len = exp_buffer_pos;
- cur_token = exp_buffer;
- }
- } else {
- cur_token_len = -2;
- }
- return;
- } else {
- if (c) {
- cur_token = buffer_pos ++;
- cur_token_len = 1;
- } else {
- cur_token_len = -3;
- cur_token_real_len = 0;
- }
- }
-}
-
-#define MAX_FVARS 100
-static struct paramed_type *fvars[MAX_FVARS];
-static int fvars_pos;
-
-static void add_var_to_be_freed (struct paramed_type *P) {
- assert (fvars_pos < MAX_FVARS);
- fvars[fvars_pos ++] = P;
-}
-
-static void free_vars_to_be_freed (void) {
- int i;
- for (i = 0; i < fvars_pos; i++) {
- tgl_paramed_type_free (fvars[i]);
- }
- fvars_pos = 0;
-}
-
-int tglf_extf_autocomplete (const char *text, int text_len, int index, char **R, char *data, int data_len) {
- if (index == -1) {
- buffer_pos = data;
- buffer_end = data + data_len;
- autocomplete_mode = 0;
- local_next_token ();
- struct paramed_type *P = autocomplete_function_any ();
- free_vars_to_be_freed ();
- if (P) { tgl_paramed_type_free (P); }
- }
- if (autocomplete_mode == 0) { return -1; }
- int len = strlen (text);
- if (autocomplete_mode == 1) {
- if (index >= 0) { return -1; }
- index = 0;
- if (!strncmp (text, autocomplete_string, len)) {
- *R = strdup (autocomplete_string);
- assert (*R);
- return index;
- } else {
- return -1;
- }
- } else {
- return autocomplete_fun (text, len, index, R);
- }
-}
-
-struct paramed_type *tglf_extf_store (const char *data, int data_len) {
- buffer_pos = (char *)data;
- buffer_end = (char *)(data + data_len);
- local_next_token ();
- return store_function_any ();
-}
-
-#define OUT_BUF_SIZE (1 << 25)
-static char out_buf[OUT_BUF_SIZE];
-static int out_buf_pos;
-
-#define eprintf(...) \
- do { \
- out_buf_pos += snprintf (out_buf + out_buf_pos, OUT_BUF_SIZE - out_buf_pos, __VA_ARGS__);\
- assert (out_buf_pos < OUT_BUF_SIZE);\
- } while (0)\
-
-static int valid_utf8_char (const char *str) {
- unsigned char c = (unsigned char) *str;
- int n = 0;
-
- if ((c & 0x80) == 0x00) {
- n = 0;
- } else if ((c & 0xe0) == 0xc0) {
- n = 1;
- } else if ((c & 0xf0) == 0xe0) {
- n = 2;
- } else if ((c & 0xf8) == 0xf0) {
- n = 3;
- } else if ((c & 0xfc) == 0xf8) {
- n = 4;
- } else if ((c & 0xfe) == 0xfc) {
- n = 5;
- } else {
- return -1;
- }
-
- int i;
- for (i = 0; i < n; i ++) {
- if ((((unsigned char)(str[i + 1])) & 0xc0) != 0x80) {
- return -1;
- }
- }
- return n + 1;
-}
-
-static void print_escaped_string (const char *str, int len) {
- eprintf ("\"");
- const char *end = str + len;
- while (str < end) {
- int n = valid_utf8_char (str);
- if (n < 0) {
- eprintf ("\\x%02x", (int)(unsigned char)*str);
- str ++;
- } else if (n >= 2) {
- int i;
- for (i = 0; i < n; i++) {
- eprintf ("%c", *(str ++));
- }
- } else if (((unsigned char)*str) >= ' ' && *str != '"' && *str != '\\') {
- eprintf ("%c", *str);
- str ++;
- } else {
- switch (*str) {
- case '\n':
- eprintf("\\n");
- break;
- case '\r':
- eprintf("\\r");
- break;
- case '\t':
- eprintf("\\t");
- break;
- case '\b':
- eprintf("\\b");
- break;
- case '\a':
- eprintf("\\a");
- break;
- case '\\':
- eprintf ("\\\\");
- break;
- case '"':
- eprintf ("\\\"");
- break;
- default:
- eprintf ("\\x%02x", (int)(unsigned char)*str);
- break;
- }
- str ++;
- }
- }
- eprintf ("\"");
-}
-
-static void print_offset (void) {
- int i;
- for (i = 0; i < multiline_offset; i++) {
- eprintf (" ");
- }
-}
-
-char *tglf_extf_fetch (struct paramed_type *T) {
- out_buf_pos = 0;
- fetch_type_any (T);
- return out_buf;
-}