Undo breaking database modifications, add tl-parser
This commit is contained in:
parent
1ea79d2739
commit
4a1b295baa
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,3 +0,0 @@
|
||||
[submodule "td/generate/tl-parser"]
|
||||
path = td/generate/tl-parser
|
||||
url = https://git.ignuranza.net/tdlight-team/tl-parser
|
@ -11,6 +11,7 @@ endif()
|
||||
|
||||
set(SQLITE_SOURCE
|
||||
sqlite/sqlite3.c
|
||||
|
||||
sqlite/sqlite3.h
|
||||
sqlite/sqlite3ext.h
|
||||
sqlite/sqlite3session.h
|
||||
@ -29,12 +30,12 @@ if (WIN32)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(tdsqlite PRIVATE
|
||||
-DSQLITE_MAX_MMAP_SIZE=50331648
|
||||
-DSQLITE_MAX_MEMORY=50331648
|
||||
-DSQLITE_ENABLE_SORTER_REFERENCES
|
||||
-DSQLITE_DIRECT_OVERFLOW_READ
|
||||
-DSQLITE_ENABLE_MEMORY_MANAGEMENT
|
||||
-DSQLITE_DEFAULT_MEMSTATUS=0
|
||||
-DSQLITE_OMIT_LOAD_EXTENSION
|
||||
-DSQLITE_OMIT_DECLTYPE
|
||||
-DSQLITE_OMIT_PROGRESS_CALLBACK
|
||||
-DSQLITE_OMIT_DEPRECATED
|
||||
#-DSQLITE_OMIT_SHARED_CACHE
|
||||
)
|
||||
target_compile_definitions(tdsqlite PRIVATE -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLITE_ENABLE_FTS5 -DSQLITE_DISABLE_LFS -DOMIT_MEMLOCK)
|
||||
|
||||
|
15411
sqlite/sqlite/sqlite3.c
vendored
15411
sqlite/sqlite/sqlite3.c
vendored
File diff suppressed because it is too large
Load Diff
284
sqlite/sqlite/sqlite3.h
vendored
284
sqlite/sqlite/sqlite3.h
vendored
@ -123,9 +123,9 @@ extern "C" {
|
||||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
||||
** [sqlite_version()] and [sqlite_source_id()].
|
||||
*/
|
||||
#define SQLITE_VERSION "3.33.0"
|
||||
#define SQLITE_VERSION_NUMBER 3033000
|
||||
#define SQLITE_SOURCE_ID "2020-08-14 13:23:32 fca8dc8b578f215a969cd899336378966156154710873e68b3d9ac5881b0ff3f"
|
||||
#define SQLITE_VERSION "3.31.0"
|
||||
#define SQLITE_VERSION_NUMBER 3031000
|
||||
#define SQLITE_SOURCE_ID "2020-01-22 18:38:59 f6affdd41608946fcfcea914ece149038a8b25a62bbe719ed2561c649b86alt1"
|
||||
|
||||
/*
|
||||
** CAPI3REF: Run-Time Library Version Numbers
|
||||
@ -299,22 +299,26 @@ typedef sqlite_uint64 sqlite3_uint64;
|
||||
** the [sqlite3] object is successfully destroyed and all associated
|
||||
** resources are deallocated.
|
||||
**
|
||||
** Ideally, applications should [sqlite3_finalize | finalize] all
|
||||
** [prepared statements], [sqlite3_blob_close | close] all [BLOB handles], and
|
||||
** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated
|
||||
** with the [sqlite3] object prior to attempting to close the object.
|
||||
** ^If the database connection is associated with unfinalized prepared
|
||||
** statements, BLOB handlers, and/or unfinished sqlite3_backup objects then
|
||||
** sqlite3_close() will leave the database connection open and return
|
||||
** [SQLITE_BUSY]. ^If sqlite3_close_v2() is called with unfinalized prepared
|
||||
** statements, unclosed BLOB handlers, and/or unfinished sqlite3_backups,
|
||||
** it returns [SQLITE_OK] regardless, but instead of deallocating the database
|
||||
** connection immediately, it marks the database connection as an unusable
|
||||
** "zombie" and makes arrangements to automatically deallocate the database
|
||||
** connection after all prepared statements are finalized, all BLOB handles
|
||||
** are closed, and all backups have finished. The sqlite3_close_v2() interface
|
||||
** is intended for use with host languages that are garbage collected, and
|
||||
** where the order in which destructors are called is arbitrary.
|
||||
** statements or unfinished sqlite3_backup objects then sqlite3_close()
|
||||
** will leave the database connection open and return [SQLITE_BUSY].
|
||||
** ^If sqlite3_close_v2() is called with unfinalized prepared statements
|
||||
** and/or unfinished sqlite3_backups, then the database connection becomes
|
||||
** an unusable "zombie" which will automatically be deallocated when the
|
||||
** last prepared statement is finalized or the last sqlite3_backup is
|
||||
** finished. The sqlite3_close_v2() interface is intended for use with
|
||||
** host languages that are garbage collected, and where the order in which
|
||||
** destructors are called is arbitrary.
|
||||
**
|
||||
** Applications should [sqlite3_finalize | finalize] all [prepared statements],
|
||||
** [sqlite3_blob_close | close] all [BLOB handles], and
|
||||
** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated
|
||||
** with the [sqlite3] object prior to attempting to close the object. ^If
|
||||
** sqlite3_close_v2() is called on a [database connection] that still has
|
||||
** outstanding [prepared statements], [BLOB handles], and/or
|
||||
** [sqlite3_backup] objects then it returns [SQLITE_OK] and the deallocation
|
||||
** of resources is deferred until all [prepared statements], [BLOB handles],
|
||||
** and [sqlite3_backup] objects are also destroyed.
|
||||
**
|
||||
** ^If an [sqlite3] object is destroyed while a transaction is open,
|
||||
** the transaction is automatically rolled back.
|
||||
@ -503,12 +507,10 @@ SQLITE_API int sqlite3_exec(
|
||||
#define SQLITE_IOERR_BEGIN_ATOMIC (SQLITE_IOERR | (29<<8))
|
||||
#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8))
|
||||
#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8))
|
||||
#define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8))
|
||||
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
|
||||
#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8))
|
||||
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
|
||||
#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8))
|
||||
#define SQLITE_BUSY_TIMEOUT (SQLITE_BUSY | (3<<8))
|
||||
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
|
||||
#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8))
|
||||
#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
|
||||
@ -517,7 +519,6 @@ SQLITE_API int sqlite3_exec(
|
||||
#define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8))
|
||||
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
|
||||
#define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8))
|
||||
#define SQLITE_CORRUPT_INDEX (SQLITE_CORRUPT | (3<<8))
|
||||
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
|
||||
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
|
||||
#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8))
|
||||
@ -564,7 +565,7 @@ SQLITE_API int sqlite3_exec(
|
||||
#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */
|
||||
#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */
|
||||
#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */
|
||||
#define SQLITE_OPEN_SUPER_JOURNAL 0x00004000 /* VFS only */
|
||||
#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */
|
||||
#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */
|
||||
#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */
|
||||
#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */
|
||||
@ -573,9 +574,6 @@ SQLITE_API int sqlite3_exec(
|
||||
#define SQLITE_OPEN_NOFOLLOW 0x01000000 /* Ok for sqlite3_open_v2() */
|
||||
|
||||
/* Reserved: 0x00F00000 */
|
||||
/* Legacy compatibility: */
|
||||
#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */
|
||||
|
||||
|
||||
/*
|
||||
** CAPI3REF: Device Characteristics
|
||||
@ -873,7 +871,7 @@ struct sqlite3_io_methods {
|
||||
** of the xSync method. In most cases, the pointer argument passed with
|
||||
** this file-control is NULL. However, if the database file is being synced
|
||||
** as part of a multi-database commit, the argument points to a nul-terminated
|
||||
** string containing the transactions super-journal file name. VFSes that
|
||||
** string containing the transactions master-journal file name. VFSes that
|
||||
** do not need this signal should silently ignore this opcode. Applications
|
||||
** should not call [sqlite3_file_control()] with this opcode as doing so may
|
||||
** disrupt the operation of the specialized VFSes that do require it.
|
||||
@ -1089,12 +1087,10 @@ struct sqlite3_io_methods {
|
||||
** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE].
|
||||
**
|
||||
** <li>[[SQLITE_FCNTL_LOCK_TIMEOUT]]
|
||||
** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode is used to configure a VFS
|
||||
** to block for up to M milliseconds before failing when attempting to
|
||||
** obtain a file lock using the xLock or xShmLock methods of the VFS.
|
||||
** The parameter is a pointer to a 32-bit signed integer that contains
|
||||
** the value that M is to be set to. Before returning, the 32-bit signed
|
||||
** integer is overwritten with the previous value of M.
|
||||
** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode causes attempts to obtain
|
||||
** a file lock using the xLock or xShmLock methods of the VFS to wait
|
||||
** for up to M milliseconds before failing, where M is the single
|
||||
** unsigned integer parameter.
|
||||
**
|
||||
** <li>[[SQLITE_FCNTL_DATA_VERSION]]
|
||||
** The [SQLITE_FCNTL_DATA_VERSION] opcode is used to detect changes to
|
||||
@ -1116,11 +1112,6 @@ struct sqlite3_io_methods {
|
||||
** happen either internally or externally and that are associated with
|
||||
** a particular attached database.
|
||||
**
|
||||
** <li>[[SQLITE_FCNTL_CKPT_START]]
|
||||
** The [SQLITE_FCNTL_CKPT_START] opcode is invoked from within a checkpoint
|
||||
** in wal mode before the client starts to copy pages from the wal
|
||||
** file to the database file.
|
||||
**
|
||||
** <li>[[SQLITE_FCNTL_CKPT_DONE]]
|
||||
** The [SQLITE_FCNTL_CKPT_DONE] opcode is invoked from within a checkpoint
|
||||
** in wal mode after the client has finished copying pages from the wal
|
||||
@ -1164,8 +1155,6 @@ struct sqlite3_io_methods {
|
||||
#define SQLITE_FCNTL_DATA_VERSION 35
|
||||
#define SQLITE_FCNTL_SIZE_LIMIT 36
|
||||
#define SQLITE_FCNTL_CKPT_DONE 37
|
||||
#define SQLITE_FCNTL_RESERVE_BYTES 38
|
||||
#define SQLITE_FCNTL_CKPT_START 39
|
||||
|
||||
/* deprecated names */
|
||||
#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE
|
||||
@ -1270,7 +1259,7 @@ typedef struct sqlite3_api_routines sqlite3_api_routines;
|
||||
** <li> [SQLITE_OPEN_TEMP_JOURNAL]
|
||||
** <li> [SQLITE_OPEN_TRANSIENT_DB]
|
||||
** <li> [SQLITE_OPEN_SUBJOURNAL]
|
||||
** <li> [SQLITE_OPEN_SUPER_JOURNAL]
|
||||
** <li> [SQLITE_OPEN_MASTER_JOURNAL]
|
||||
** <li> [SQLITE_OPEN_WAL]
|
||||
** </ul>)^
|
||||
**
|
||||
@ -1648,7 +1637,7 @@ SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...);
|
||||
** by xInit. The pAppData pointer is used as the only parameter to
|
||||
** xInit and xShutdown.
|
||||
**
|
||||
** SQLite holds the [SQLITE_MUTEX_STATIC_MAIN] mutex when it invokes
|
||||
** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] mutex when it invokes
|
||||
** the xInit method, so the xInit method need not be threadsafe. The
|
||||
** xShutdown method is only called from [sqlite3_shutdown()] so it does
|
||||
** not need to be threadsafe either. For all other methods, SQLite
|
||||
@ -2286,7 +2275,8 @@ struct sqlite3_mem_methods {
|
||||
** [[SQLITE_DBCONFIG_TRUSTED_SCHEMA]]
|
||||
** <dt>SQLITE_DBCONFIG_TRUSTED_SCHEMA</td>
|
||||
** <dd>The SQLITE_DBCONFIG_TRUSTED_SCHEMA option tells SQLite to
|
||||
** assume that database schemas are untainted by malicious content.
|
||||
** assume that database schemas (the contents of the [sqlite_master] tables)
|
||||
** are untainted by malicious content.
|
||||
** When the SQLITE_DBCONFIG_TRUSTED_SCHEMA option is disabled, SQLite
|
||||
** takes additional defensive steps to protect the application from harm
|
||||
** including:
|
||||
@ -3543,19 +3533,8 @@ SQLITE_API int sqlite3_open_v2(
|
||||
** that check if a database file was a URI that contained a specific query
|
||||
** parameter, and if so obtains the value of that query parameter.
|
||||
**
|
||||
** The first parameter to these interfaces (hereafter referred to
|
||||
** as F) must be one of:
|
||||
** <ul>
|
||||
** <li> A database filename pointer created by the SQLite core and
|
||||
** passed into the xOpen() method of a VFS implemention, or
|
||||
** <li> A filename obtained from [sqlite3_db_filename()], or
|
||||
** <li> A new filename constructed using [sqlite3_create_filename()].
|
||||
** </ul>
|
||||
** If the F parameter is not one of the above, then the behavior is
|
||||
** undefined and probably undesirable. Older versions of SQLite were
|
||||
** more tolerant of invalid F parameters than newer versions.
|
||||
**
|
||||
** If F is a suitable filename (as described in the previous paragraph)
|
||||
** If F is the database filename pointer passed into the xOpen() method of
|
||||
** a VFS implementation or it is the return value of [sqlite3_db_filename()]
|
||||
** and if P is the name of the query parameter, then
|
||||
** sqlite3_uri_parameter(F,P) returns the value of the P
|
||||
** parameter if it exists or a NULL pointer if P does not appear as a
|
||||
@ -3638,78 +3617,6 @@ SQLITE_API const char *sqlite3_filename_database(const char*);
|
||||
SQLITE_API const char *sqlite3_filename_journal(const char*);
|
||||
SQLITE_API const char *sqlite3_filename_wal(const char*);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Database File Corresponding To A Journal
|
||||
**
|
||||
** ^If X is the name of a rollback or WAL-mode journal file that is
|
||||
** passed into the xOpen method of [sqlite3_vfs], then
|
||||
** sqlite3_database_file_object(X) returns a pointer to the [sqlite3_file]
|
||||
** object that represents the main database file.
|
||||
**
|
||||
** This routine is intended for use in custom [VFS] implementations
|
||||
** only. It is not a general-purpose interface.
|
||||
** The argument sqlite3_file_object(X) must be a filename pointer that
|
||||
** has been passed into [sqlite3_vfs].xOpen method where the
|
||||
** flags parameter to xOpen contains one of the bits
|
||||
** [SQLITE_OPEN_MAIN_JOURNAL] or [SQLITE_OPEN_WAL]. Any other use
|
||||
** of this routine results in undefined and probably undesirable
|
||||
** behavior.
|
||||
*/
|
||||
SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Create and Destroy VFS Filenames
|
||||
**
|
||||
** These interfces are provided for use by [VFS shim] implementations and
|
||||
** are not useful outside of that context.
|
||||
**
|
||||
** The sqlite3_create_filename(D,J,W,N,P) allocates memory to hold a version of
|
||||
** database filename D with corresponding journal file J and WAL file W and
|
||||
** with N URI parameters key/values pairs in the array P. The result from
|
||||
** sqlite3_create_filename(D,J,W,N,P) is a pointer to a database filename that
|
||||
** is safe to pass to routines like:
|
||||
** <ul>
|
||||
** <li> [sqlite3_uri_parameter()],
|
||||
** <li> [sqlite3_uri_boolean()],
|
||||
** <li> [sqlite3_uri_int64()],
|
||||
** <li> [sqlite3_uri_key()],
|
||||
** <li> [sqlite3_filename_database()],
|
||||
** <li> [sqlite3_filename_journal()], or
|
||||
** <li> [sqlite3_filename_wal()].
|
||||
** </ul>
|
||||
** If a memory allocation error occurs, sqlite3_create_filename() might
|
||||
** return a NULL pointer. The memory obtained from sqlite3_create_filename(X)
|
||||
** must be released by a corresponding call to sqlite3_free_filename(Y).
|
||||
**
|
||||
** The P parameter in sqlite3_create_filename(D,J,W,N,P) should be an array
|
||||
** of 2*N pointers to strings. Each pair of pointers in this array corresponds
|
||||
** to a key and value for a query parameter. The P parameter may be a NULL
|
||||
** pointer if N is zero. None of the 2*N pointers in the P array may be
|
||||
** NULL pointers and key pointers should not be empty strings.
|
||||
** None of the D, J, or W parameters to sqlite3_create_filename(D,J,W,N,P) may
|
||||
** be NULL pointers, though they can be empty strings.
|
||||
**
|
||||
** The sqlite3_free_filename(Y) routine releases a memory allocation
|
||||
** previously obtained from sqlite3_create_filename(). Invoking
|
||||
** sqlite3_free_filename(Y) where Y is a NULL pointer is a harmless no-op.
|
||||
**
|
||||
** If the Y parameter to sqlite3_free_filename(Y) is anything other
|
||||
** than a NULL pointer or a pointer previously acquired from
|
||||
** sqlite3_create_filename(), then bad things such as heap
|
||||
** corruption or segfaults may occur. The value Y should be
|
||||
** used again after sqlite3_free_filename(Y) has been called. This means
|
||||
** that if the [sqlite3_vfs.xOpen()] method of a VFS has been called using Y,
|
||||
** then the corresponding [sqlite3_module.xClose() method should also be
|
||||
** invoked prior to calling sqlite3_free_filename(Y).
|
||||
*/
|
||||
SQLITE_API char *sqlite3_create_filename(
|
||||
const char *zDatabase,
|
||||
const char *zJournal,
|
||||
const char *zWal,
|
||||
int nParam,
|
||||
const char **azParam
|
||||
);
|
||||
SQLITE_API void sqlite3_free_filename(char*);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Error Codes And Messages
|
||||
@ -4292,30 +4199,12 @@ typedef struct sqlite3_context sqlite3_context;
|
||||
** [sqlite3_bind_parameter_index()] API if desired. ^The index
|
||||
** for "?NNN" parameters is the value of NNN.
|
||||
** ^The NNN value must be between 1 and the [sqlite3_limit()]
|
||||
** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 32766).
|
||||
** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999).
|
||||
**
|
||||
** ^The third argument is the value to bind to the parameter.
|
||||
** ^If the third parameter to sqlite3_bind_text() or sqlite3_bind_text16()
|
||||
** or sqlite3_bind_blob() is a NULL pointer then the fourth parameter
|
||||
** is ignored and the end result is the same as sqlite3_bind_null().
|
||||
** ^If the third parameter to sqlite3_bind_text() is not NULL, then
|
||||
** it should be a pointer to well-formed UTF8 text.
|
||||
** ^If the third parameter to sqlite3_bind_text16() is not NULL, then
|
||||
** it should be a pointer to well-formed UTF16 text.
|
||||
** ^If the third parameter to sqlite3_bind_text64() is not NULL, then
|
||||
** it should be a pointer to a well-formed unicode string that is
|
||||
** either UTF8 if the sixth parameter is SQLITE_UTF8, or UTF16
|
||||
** otherwise.
|
||||
**
|
||||
** [[byte-order determination rules]] ^The byte-order of
|
||||
** UTF16 input text is determined by the byte-order mark (BOM, U+FEFF)
|
||||
** found in first character, which is removed, or in the absence of a BOM
|
||||
** the byte order is the native byte order of the host
|
||||
** machine for sqlite3_bind_text16() or the byte order specified in
|
||||
** the 6th parameter for sqlite3_bind_text64().)^
|
||||
** ^If UTF16 input text contains invalid unicode
|
||||
** characters, then SQLite might change those invalid characters
|
||||
** into the unicode replacement character: U+FFFD.
|
||||
**
|
||||
** ^(In those routines that have a fourth argument, its value is the
|
||||
** number of bytes in the parameter. To be clear: the value is the
|
||||
@ -4329,7 +4218,7 @@ typedef struct sqlite3_context sqlite3_context;
|
||||
** or sqlite3_bind_text16() or sqlite3_bind_text64() then
|
||||
** that parameter must be the byte offset
|
||||
** where the NUL terminator would occur assuming the string were NUL
|
||||
** terminated. If any NUL characters occurs at byte offsets less than
|
||||
** terminated. If any NUL characters occur at byte offsets less than
|
||||
** the value of the fourth parameter then the resulting string value will
|
||||
** contain embedded NULs. The result of expressions involving strings
|
||||
** with embedded NULs is undefined.
|
||||
@ -5497,7 +5386,7 @@ SQLITE_API void sqlite3_value_free(sqlite3_value*);
|
||||
**
|
||||
** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is
|
||||
** determined by the N parameter on first successful call. Changing the
|
||||
** value of N in any subsequent call to sqlite3_aggregate_context() within
|
||||
** value of N in any subsequents call to sqlite3_aggregate_context() within
|
||||
** the same aggregate function instance will not resize the memory
|
||||
** allocation.)^ Within the xFinal callback, it is customary to set
|
||||
** N=0 in calls to sqlite3_aggregate_context(C,N) so that no
|
||||
@ -5654,9 +5543,8 @@ typedef void (*sqlite3_destructor_type)(void*);
|
||||
** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16()
|
||||
** as the text of an error message. ^SQLite interprets the error
|
||||
** message string from sqlite3_result_error() as UTF-8. ^SQLite
|
||||
** interprets the string from sqlite3_result_error16() as UTF-16 using
|
||||
** the same [byte-order determination rules] as [sqlite3_bind_text16()].
|
||||
** ^If the third parameter to sqlite3_result_error()
|
||||
** interprets the string from sqlite3_result_error16() as UTF-16 in native
|
||||
** byte order. ^If the third parameter to sqlite3_result_error()
|
||||
** or sqlite3_result_error16() is negative then SQLite takes as the error
|
||||
** message all text up through the first zero character.
|
||||
** ^If the third parameter to sqlite3_result_error() or
|
||||
@ -5724,25 +5612,6 @@ typedef void (*sqlite3_destructor_type)(void*);
|
||||
** then SQLite makes a copy of the result into space obtained
|
||||
** from [sqlite3_malloc()] before it returns.
|
||||
**
|
||||
** ^For the sqlite3_result_text16(), sqlite3_result_text16le(), and
|
||||
** sqlite3_result_text16be() routines, and for sqlite3_result_text64()
|
||||
** when the encoding is not UTF8, if the input UTF16 begins with a
|
||||
** byte-order mark (BOM, U+FEFF) then the BOM is removed from the
|
||||
** string and the rest of the string is interpreted according to the
|
||||
** byte-order specified by the BOM. ^The byte-order specified by
|
||||
** the BOM at the beginning of the text overrides the byte-order
|
||||
** specified by the interface procedure. ^So, for example, if
|
||||
** sqlite3_result_text16le() is invoked with text that begins
|
||||
** with bytes 0xfe, 0xff (a big-endian byte-order mark) then the
|
||||
** first two bytes of input are skipped and the remaining input
|
||||
** is interpreted as UTF16BE text.
|
||||
**
|
||||
** ^For UTF16 input text to the sqlite3_result_text16(),
|
||||
** sqlite3_result_text16be(), sqlite3_result_text16le(), and
|
||||
** sqlite3_result_text64() routines, if the text contains invalid
|
||||
** UTF16 characters, the invalid characters might be converted
|
||||
** into the unicode replacement character, U+FFFD.
|
||||
**
|
||||
** ^The sqlite3_result_value() interface sets the result of
|
||||
** the application-defined function to be a copy of the
|
||||
** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The
|
||||
@ -5948,6 +5817,67 @@ SQLITE_API int sqlite3_collation_needed16(
|
||||
void(*)(void*,sqlite3*,int eTextRep,const void*)
|
||||
);
|
||||
|
||||
#ifdef SQLITE_HAS_CODEC
|
||||
/*
|
||||
** Specify the key for an encrypted database. This routine should be
|
||||
** called right after sqlite3_open().
|
||||
**
|
||||
** The code to implement this API is not available in the public release
|
||||
** of SQLite.
|
||||
*/
|
||||
SQLITE_API int sqlite3_key(
|
||||
sqlite3 *db, /* Database to be rekeyed */
|
||||
const void *pKey, int nKey /* The key */
|
||||
);
|
||||
SQLITE_API int sqlite3_key_v2(
|
||||
sqlite3 *db, /* Database to be rekeyed */
|
||||
const char *zDbName, /* Name of the database */
|
||||
const void *pKey, int nKey /* The key */
|
||||
);
|
||||
|
||||
/*
|
||||
** Change the key on an open database. If the current database is not
|
||||
** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the
|
||||
** database is decrypted.
|
||||
**
|
||||
** The code to implement this API is not available in the public release
|
||||
** of SQLite.
|
||||
*/
|
||||
/* BEGIN SQLCIPHER
|
||||
SQLCipher usage note:
|
||||
|
||||
If the current database is plaintext SQLCipher will NOT encrypt it.
|
||||
If the current database is encrypted and pNew==0 or nNew==0, SQLCipher
|
||||
will NOT decrypt it.
|
||||
|
||||
This routine will ONLY work on an already encrypted database in order
|
||||
to change the key.
|
||||
|
||||
Conversion from plaintext-to-encrypted or encrypted-to-plaintext should
|
||||
use an ATTACHed database and the sqlcipher_export() convenience function
|
||||
as per the SQLCipher Documentation.
|
||||
|
||||
END SQLCIPHER
|
||||
*/
|
||||
SQLITE_API int sqlite3_rekey(
|
||||
sqlite3 *db, /* Database to be rekeyed */
|
||||
const void *pKey, int nKey /* The new key */
|
||||
);
|
||||
SQLITE_API int sqlite3_rekey_v2(
|
||||
sqlite3 *db, /* Database to be rekeyed */
|
||||
const char *zDbName, /* Name of the database */
|
||||
const void *pKey, int nKey /* The new key */
|
||||
);
|
||||
|
||||
/*
|
||||
** Specify the activation key for a SEE database. Unless
|
||||
** activated, none of the SEE routines will work.
|
||||
*/
|
||||
SQLITE_API void sqlite3_activate_see(
|
||||
const char *zPassPhrase /* Activation phrase */
|
||||
);
|
||||
#endif
|
||||
|
||||
#ifdef SQLITE_ENABLE_CEROD
|
||||
/*
|
||||
** Specify the activation key for a CEROD database. Unless
|
||||
@ -6276,7 +6206,7 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
|
||||
** ^In the case of an update, this is the [rowid] after the update takes place.
|
||||
**
|
||||
** ^(The update hook is not invoked when internal system tables are
|
||||
** modified (i.e. sqlite_sequence).)^
|
||||
** modified (i.e. sqlite_master and sqlite_sequence).)^
|
||||
** ^The update hook is not invoked when [WITHOUT ROWID] tables are modified.
|
||||
**
|
||||
** ^In the current implementation, the update hook
|
||||
@ -7378,7 +7308,7 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*);
|
||||
** <ul>
|
||||
** <li> SQLITE_MUTEX_FAST
|
||||
** <li> SQLITE_MUTEX_RECURSIVE
|
||||
** <li> SQLITE_MUTEX_STATIC_MAIN
|
||||
** <li> SQLITE_MUTEX_STATIC_MASTER
|
||||
** <li> SQLITE_MUTEX_STATIC_MEM
|
||||
** <li> SQLITE_MUTEX_STATIC_OPEN
|
||||
** <li> SQLITE_MUTEX_STATIC_PRNG
|
||||
@ -7580,7 +7510,7 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*);
|
||||
*/
|
||||
#define SQLITE_MUTEX_FAST 0
|
||||
#define SQLITE_MUTEX_RECURSIVE 1
|
||||
#define SQLITE_MUTEX_STATIC_MAIN 2
|
||||
#define SQLITE_MUTEX_STATIC_MASTER 2
|
||||
#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */
|
||||
#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */
|
||||
#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */
|
||||
@ -7595,10 +7525,6 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*);
|
||||
#define SQLITE_MUTEX_STATIC_VFS2 12 /* For use by extension VFS */
|
||||
#define SQLITE_MUTEX_STATIC_VFS3 13 /* For use by application VFS */
|
||||
|
||||
/* Legacy compatibility: */
|
||||
#define SQLITE_MUTEX_STATIC_MASTER 2
|
||||
|
||||
|
||||
/*
|
||||
** CAPI3REF: Retrieve the mutex for a database connection
|
||||
** METHOD: sqlite3
|
||||
@ -7694,7 +7620,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
|
||||
#define SQLITE_TESTCTRL_PENDING_BYTE 11
|
||||
#define SQLITE_TESTCTRL_ASSERT 12
|
||||
#define SQLITE_TESTCTRL_ALWAYS 13
|
||||
#define SQLITE_TESTCTRL_RESERVE 14 /* NOT USED */
|
||||
#define SQLITE_TESTCTRL_RESERVE 14
|
||||
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
|
||||
#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */
|
||||
#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */
|
||||
@ -9394,7 +9320,7 @@ SQLITE_API int sqlite3_db_cacheflush(sqlite3*);
|
||||
**
|
||||
** ^The preupdate hook only fires for changes to real database tables; the
|
||||
** preupdate hook is not invoked for changes to [virtual tables] or to
|
||||
** system tables like sqlite_sequence or sqlite_stat1.
|
||||
** system tables like sqlite_master or sqlite_stat1.
|
||||
**
|
||||
** ^The second parameter to the preupdate callback is a pointer to
|
||||
** the [database connection] that registered the preupdate hook.
|
||||
|
15
sqlite/sqlite/sqlite3session.h
vendored
15
sqlite/sqlite/sqlite3session.h
vendored
@ -1,4 +1,3 @@
|
||||
|
||||
#if !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION)
|
||||
#define __SQLITESESSION_H_ 1
|
||||
|
||||
@ -200,7 +199,7 @@ int sqlite3session_attach(
|
||||
** The second argument (xFilter) is the "filter callback". For changes to rows
|
||||
** in tables that are not attached to the Session object, the filter is called
|
||||
** to determine whether changes to the table's rows should be tracked or not.
|
||||
** If xFilter returns 0, changes is not tracked. Note that once a table is
|
||||
** If xFilter returns 0, changes are not tracked. Note that once a table is
|
||||
** attached, xFilter will not be called again.
|
||||
*/
|
||||
void sqlite3session_table_filter(
|
||||
@ -374,7 +373,7 @@ int sqlite3session_changeset(
|
||||
** It an error if database zFrom does not exist or does not contain the
|
||||
** required compatible table.
|
||||
**
|
||||
** If the operation successful, SQLITE_OK is returned. Otherwise, an SQLite
|
||||
** If the operation is successful, SQLITE_OK is returned. Otherwise, an SQLite
|
||||
** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg
|
||||
** may be set to point to a buffer containing an English language error
|
||||
** message. It is the responsibility of the caller to free this buffer using
|
||||
@ -511,7 +510,7 @@ int sqlite3changeset_start_v2(
|
||||
** CAPI3REF: Advance A Changeset Iterator
|
||||
** METHOD: sqlite3_changeset_iter
|
||||
**
|
||||
** This function may only be used with iterators created by function
|
||||
** This function may only be used with iterators created by the function
|
||||
** [sqlite3changeset_start()]. If it is called on an iterator passed to
|
||||
** a conflict-handler callback by [sqlite3changeset_apply()], SQLITE_MISUSE
|
||||
** is returned and the call has no effect.
|
||||
@ -927,8 +926,8 @@ int sqlite3changegroup_new(sqlite3_changegroup **pp);
|
||||
** case, this function fails with SQLITE_SCHEMA. If the input changeset
|
||||
** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is
|
||||
** returned. Or, if an out-of-memory condition occurs during processing, this
|
||||
** function returns SQLITE_NOMEM. In all cases, if an error occurs the
|
||||
** final contents of the changegroup is undefined.
|
||||
** function returns SQLITE_NOMEM. In all cases, if an error occurs the state
|
||||
** of the final contents of the changegroup is undefined.
|
||||
**
|
||||
** If no error occurs, SQLITE_OK is returned.
|
||||
*/
|
||||
@ -1103,7 +1102,7 @@ void sqlite3changegroup_delete(sqlite3_changegroup*);
|
||||
**
|
||||
** It is safe to execute SQL statements, including those that write to the
|
||||
** table that the callback related to, from within the xConflict callback.
|
||||
** This can be used to further customize the applications conflict
|
||||
** This can be used to further customize the application's conflict
|
||||
** resolution strategy.
|
||||
**
|
||||
** All changes made by these functions are enclosed in a savepoint transaction.
|
||||
@ -1413,7 +1412,7 @@ int sqlite3rebaser_configure(
|
||||
**
|
||||
** Argument pIn must point to a buffer containing a changeset nIn bytes
|
||||
** in size. This function allocates and populates a buffer with a copy
|
||||
** of the changeset rebased rebased according to the configuration of the
|
||||
** of the changeset rebased according to the configuration of the
|
||||
** rebaser object passed as the first argument. If successful, (*ppOut)
|
||||
** is set to point to the new buffer containing the rebased changeset and
|
||||
** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the
|
||||
|
@ -13,83 +13,83 @@ set(TL_TD_AUTO_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/auto PARENT_SCOPE)
|
||||
set(TD_AUTO_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/auto/td)
|
||||
|
||||
set(TL_TD_AUTO_SOURCE
|
||||
${TD_AUTO_INCLUDE_DIR}/mtproto/mtproto_api.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/mtproto/mtproto_api.h
|
||||
${TD_AUTO_INCLUDE_DIR}/mtproto/mtproto_api.hpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/telegram_api.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/telegram_api.h
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/telegram_api.hpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/secret_api.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/secret_api.h
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/secret_api.hpp
|
||||
PARENT_SCOPE
|
||||
)
|
||||
${TD_AUTO_INCLUDE_DIR}/mtproto/mtproto_api.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/mtproto/mtproto_api.h
|
||||
${TD_AUTO_INCLUDE_DIR}/mtproto/mtproto_api.hpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/telegram_api.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/telegram_api.h
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/telegram_api.hpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/secret_api.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/secret_api.h
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/secret_api.hpp
|
||||
PARENT_SCOPE
|
||||
)
|
||||
|
||||
set(TL_TD_API_AUTO_SOURCE
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_api.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_api.h
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_api.hpp
|
||||
PARENT_SCOPE
|
||||
)
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_api.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_api.h
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_api.hpp
|
||||
PARENT_SCOPE
|
||||
)
|
||||
|
||||
set(TL_TD_JSON_AUTO_SOURCE
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_api_json.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_api_json.h
|
||||
PARENT_SCOPE
|
||||
)
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_api_json.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_api_json.h
|
||||
PARENT_SCOPE
|
||||
)
|
||||
|
||||
set(TL_C_AUTO_SOURCE
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_tdc_api.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_tdc_api.h
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_tdc_api_inner.h
|
||||
PARENT_SCOPE
|
||||
)
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_tdc_api.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_tdc_api.h
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/td_tdc_api_inner.h
|
||||
PARENT_SCOPE
|
||||
)
|
||||
|
||||
set(TL_DOTNET_AUTO_SOURCE
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/TdDotNetApi.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/TdDotNetApi.h
|
||||
PARENT_SCOPE
|
||||
)
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/TdDotNetApi.cpp
|
||||
${TD_AUTO_INCLUDE_DIR}/telegram/TdDotNetApi.h
|
||||
PARENT_SCOPE
|
||||
)
|
||||
|
||||
set(TL_GENERATE_COMMON_SOURCE
|
||||
generate_common.cpp
|
||||
generate_common.cpp
|
||||
|
||||
tl_writer_cpp.cpp
|
||||
tl_writer_h.cpp
|
||||
tl_writer_hpp.cpp
|
||||
tl_writer_jni_cpp.cpp
|
||||
tl_writer_jni_h.cpp
|
||||
tl_writer_td.cpp
|
||||
tl_writer_cpp.cpp
|
||||
tl_writer_h.cpp
|
||||
tl_writer_hpp.cpp
|
||||
tl_writer_jni_cpp.cpp
|
||||
tl_writer_jni_h.cpp
|
||||
tl_writer_td.cpp
|
||||
|
||||
tl_writer_cpp.h
|
||||
tl_writer_h.h
|
||||
tl_writer_hpp.h
|
||||
tl_writer_jni_cpp.h
|
||||
tl_writer_jni_h.h
|
||||
tl_writer_td.h
|
||||
)
|
||||
tl_writer_cpp.h
|
||||
tl_writer_h.h
|
||||
tl_writer_hpp.h
|
||||
tl_writer_jni_cpp.h
|
||||
tl_writer_jni_h.h
|
||||
tl_writer_td.h
|
||||
)
|
||||
|
||||
set(TL_GENERATE_C_SOURCE
|
||||
generate_c.cpp
|
||||
generate_c.cpp
|
||||
|
||||
tl_writer_c.h
|
||||
)
|
||||
tl_writer_c.h
|
||||
)
|
||||
|
||||
set(TL_GENERATE_JAVA_SOURCE
|
||||
generate_java.cpp
|
||||
generate_java.cpp
|
||||
|
||||
tl_writer_java.cpp
|
||||
tl_writer_java.cpp
|
||||
|
||||
tl_writer_java.h
|
||||
)
|
||||
tl_writer_java.h
|
||||
)
|
||||
|
||||
set(TL_GENERATE_JSON_SOURCE
|
||||
generate_json.cpp
|
||||
generate_json.cpp
|
||||
|
||||
tl_json_converter.cpp
|
||||
tl_json_converter.cpp
|
||||
|
||||
tl_json_converter.h
|
||||
)
|
||||
tl_json_converter.h
|
||||
)
|
||||
|
||||
if (NOT CMAKE_CROSSCOMPILING)
|
||||
find_program(PHP_EXECUTABLE php)
|
||||
@ -109,23 +109,23 @@ if (NOT CMAKE_CROSSCOMPILING)
|
||||
set(TLO_AUTO_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/auto/tlo)
|
||||
|
||||
add_custom_target(tl_generate_tlo
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMAND tl-parser -e auto/tlo/mtproto_api.tlo scheme/mtproto_api.tl
|
||||
COMMAND tl-parser -e auto/tlo/secret_api.tlo scheme/secret_api.tl
|
||||
COMMAND tl-parser -e auto/tlo/td_api.tlo scheme/td_api.tl
|
||||
COMMAND tl-parser -e auto/tlo/telegram_api.tlo scheme/telegram_api.tl
|
||||
COMMENT "Generate TLO files"
|
||||
DEPENDS tl-parser ${CMAKE_CURRENT_SOURCE_DIR}/scheme/mtproto_api.tl ${CMAKE_CURRENT_SOURCE_DIR}/scheme/secret_api.tl ${CMAKE_CURRENT_SOURCE_DIR}/scheme/td_api.tl ${CMAKE_CURRENT_SOURCE_DIR}/scheme/telegram_api.tl
|
||||
)
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMAND tl-parser -e auto/tlo/mtproto_api.tlo scheme/mtproto_api.tl
|
||||
COMMAND tl-parser -e auto/tlo/secret_api.tlo scheme/secret_api.tl
|
||||
COMMAND tl-parser -e auto/tlo/td_api.tlo scheme/td_api.tl
|
||||
COMMAND tl-parser -e auto/tlo/telegram_api.tlo scheme/telegram_api.tl
|
||||
COMMENT "Generate TLO files"
|
||||
DEPENDS tl-parser ${CMAKE_CURRENT_SOURCE_DIR}/scheme/mtproto_api.tl ${CMAKE_CURRENT_SOURCE_DIR}/scheme/secret_api.tl ${CMAKE_CURRENT_SOURCE_DIR}/scheme/td_api.tl ${CMAKE_CURRENT_SOURCE_DIR}/scheme/telegram_api.tl
|
||||
)
|
||||
|
||||
add_executable(generate_common ${TL_GENERATE_COMMON_SOURCE})
|
||||
target_link_libraries(generate_common PRIVATE tdtl)
|
||||
add_custom_target(tl_generate_common
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMAND ${GENERATE_COMMON_CMD}
|
||||
COMMENT "Generate common TL source files"
|
||||
DEPENDS generate_common tl_generate_tlo ${TLO_AUTO_INCLUDE_DIR}/mtproto_api.tlo ${TLO_AUTO_INCLUDE_DIR}/secret_api.tlo ${TLO_AUTO_INCLUDE_DIR}/td_api.tlo ${TLO_AUTO_INCLUDE_DIR}/telegram_api.tlo ${CMAKE_CURRENT_SOURCE_DIR}/scheme/td_api.tl ${CMAKE_CURRENT_SOURCE_DIR}/DoxygenTlDocumentationGenerator.php
|
||||
)
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMAND ${GENERATE_COMMON_CMD}
|
||||
COMMENT "Generate common TL source files"
|
||||
DEPENDS generate_common tl_generate_tlo ${TLO_AUTO_INCLUDE_DIR}/mtproto_api.tlo ${TLO_AUTO_INCLUDE_DIR}/secret_api.tlo ${TLO_AUTO_INCLUDE_DIR}/td_api.tlo ${TLO_AUTO_INCLUDE_DIR}/telegram_api.tlo ${CMAKE_CURRENT_SOURCE_DIR}/scheme/td_api.tl ${CMAKE_CURRENT_SOURCE_DIR}/DoxygenTlDocumentationGenerator.php
|
||||
)
|
||||
if (TD_ENABLE_JNI)
|
||||
target_compile_definitions(generate_common PRIVATE TD_ENABLE_JNI=1)
|
||||
endif()
|
||||
@ -136,11 +136,11 @@ if (NOT CMAKE_CROSSCOMPILING)
|
||||
add_executable(generate_c ${TL_GENERATE_C_SOURCE})
|
||||
target_link_libraries(generate_c PRIVATE tdtl)
|
||||
add_custom_target(tl_generate_c
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMAND generate_c
|
||||
COMMENT "Generate C TL source files"
|
||||
DEPENDS generate_c tl_generate_tlo ${TLO_AUTO_INCLUDE_DIR}/td_api.tlo ${CMAKE_CURRENT_SOURCE_DIR}/scheme/td_api.tl
|
||||
)
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMAND generate_c
|
||||
COMMENT "Generate C TL source files"
|
||||
DEPENDS generate_c tl_generate_tlo ${TLO_AUTO_INCLUDE_DIR}/td_api.tlo ${CMAKE_CURRENT_SOURCE_DIR}/scheme/td_api.tl
|
||||
)
|
||||
|
||||
add_executable(td_generate_java_api ${TL_GENERATE_JAVA_SOURCE})
|
||||
target_link_libraries(td_generate_java_api PRIVATE tdtl)
|
||||
@ -148,11 +148,11 @@ if (NOT CMAKE_CROSSCOMPILING)
|
||||
add_executable(generate_json ${TL_GENERATE_JSON_SOURCE})
|
||||
target_link_libraries(generate_json PRIVATE tdtl tdutils)
|
||||
add_custom_target(tl_generate_json
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMAND generate_json
|
||||
COMMENT "Generate JSON TL source files"
|
||||
DEPENDS generate_json tl_generate_tlo ${TLO_AUTO_INCLUDE_DIR}/td_api.tlo ${CMAKE_CURRENT_SOURCE_DIR}/scheme/td_api.tl
|
||||
)
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMAND generate_json
|
||||
COMMENT "Generate JSON TL source files"
|
||||
DEPENDS generate_json tl_generate_tlo ${TLO_AUTO_INCLUDE_DIR}/td_api.tlo ${CMAKE_CURRENT_SOURCE_DIR}/scheme/td_api.tl
|
||||
)
|
||||
|
||||
if (TD_ENABLE_JNI)
|
||||
install(TARGETS td_generate_java_api RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
|
||||
@ -170,11 +170,11 @@ if (NOT CMAKE_CROSSCOMPILING)
|
||||
add_executable(td_generate_dotnet_api generate_dotnet.cpp tl_writer_dotnet.h)
|
||||
target_link_libraries(td_generate_dotnet_api PRIVATE tdtl)
|
||||
add_custom_target(generate_dotnet_api
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMAND ${GENERATE_DOTNET_API_CMD}
|
||||
COMMENT "Generate .NET API files"
|
||||
DEPENDS td_generate_dotnet_api tl_generate_tlo ${TLO_AUTO_INCLUDE_DIR}/td_api.tlo ${CMAKE_CURRENT_SOURCE_DIR}/scheme/td_api.tl ${CMAKE_CURRENT_SOURCE_DIR}/DotnetTlDocumentationGenerator.php
|
||||
)
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMAND ${GENERATE_DOTNET_API_CMD}
|
||||
COMMENT "Generate .NET API files"
|
||||
DEPENDS td_generate_dotnet_api tl_generate_tlo ${TLO_AUTO_INCLUDE_DIR}/td_api.tlo ${CMAKE_CURRENT_SOURCE_DIR}/scheme/td_api.tl ${CMAKE_CURRENT_SOURCE_DIR}/DotnetTlDocumentationGenerator.php
|
||||
)
|
||||
endif()
|
||||
|
||||
add_executable(remove_documentation remove_documentation.cpp)
|
||||
|
@ -1,48 +0,0 @@
|
||||
srcdir=./tl-parser
|
||||
|
||||
CFLAGS=-g -O2
|
||||
LDFLAGS=
|
||||
CPPFLAGS=
|
||||
COMPILE_FLAGS=${CFLAGS} ${CPFLAGS} ${CPPFLAGS} ${DEFS} -Wall -Wextra -Werror -Wno-deprecated-declarations -fno-strict-aliasing -fno-omit-frame-pointer -ggdb -Wno-unused-parameter -fPIC
|
||||
|
||||
EXTRA_LIBS=-lz
|
||||
LOCAL_LDFLAGS=-rdynamic -ggdb ${EXTRA_LIBS}
|
||||
LINK_FLAGS=${LDFLAGS} ${LOCAL_LDFLAGS}
|
||||
|
||||
DEP=dep
|
||||
EXE=bin
|
||||
OBJ=objs
|
||||
DIR_LIST=${DEP} ${EXE} ${OBJ}
|
||||
|
||||
EXE_LIST=${EXE}/tl-parser
|
||||
|
||||
OBJECTS=${OBJ}/tl-parser.o ${OBJ}/tlc.o
|
||||
|
||||
DEPENDENCE=$(subst ${OBJ}/,${DEP}/,$(patsubst %.o,%.d,${OBJECTS}))
|
||||
DEPENDENCE_LIST=${DEPENDENCE}
|
||||
|
||||
INCLUDE=-I. -I${srcdir}
|
||||
CC=gcc
|
||||
|
||||
.SUFFIXES:
|
||||
|
||||
.SUFFIXES: .c .h .o
|
||||
|
||||
all: ${EXE_LIST} ${DIR_LIST} ${LIB_LIST}
|
||||
create_dirs_and_headers: ${DIR_LIST}
|
||||
create_dirs: ${DIR_LIST}
|
||||
|
||||
${DIR_LIST}:
|
||||
@test -d $@ || mkdir -p $@
|
||||
|
||||
-include ${DEPENDENCE_LIST}
|
||||
|
||||
${OBJECTS}: ${OBJ}/%.o: ${srcdir}/%.c | create_dirs_and_headers
|
||||
${CC} ${INCLUDE} ${COMPILE_FLAGS} -c -MP -MD -MF ${DEP}/$*.d -MQ ${OBJ}/$*.o -o $@ $<
|
||||
|
||||
${EXE}/tl-parser: ${OBJECTS}
|
||||
${CC} $^ ${LINK_FLAGS} -o $@
|
||||
|
||||
clean:
|
||||
rm -rf ${DIR_LIST} config.log config.status > /dev/null || echo "all clean"
|
||||
|
@ -1,97 +0,0 @@
|
||||
/* config.h. Generated from config.h.in by configure. */
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define to 1 if you have the `clock_gettime' function. */
|
||||
#define HAVE_CLOCK_GETTIME 1
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the `z' library (-lz). */
|
||||
#define HAVE_LIBZ 1
|
||||
|
||||
/* Define to 1 if you have the <mach/mach.h> header file. */
|
||||
/* #undef HAVE_MACH_MACH_H */
|
||||
|
||||
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
|
||||
to 0 otherwise. */
|
||||
#define HAVE_MALLOC 1
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#define HAVE_MEMORY_H 1
|
||||
|
||||
/* Define to 1 if you have the `memset' function. */
|
||||
#define HAVE_MEMSET 1
|
||||
|
||||
/* Define to 1 if your system has a GNU libc compatible `realloc' function,
|
||||
and to 0 otherwise. */
|
||||
#define HAVE_REALLOC 1
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the `strdup' function. */
|
||||
#define HAVE_STRDUP 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#define HAVE_SYS_TIME_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to 1 if the system has the `__builtin_bswap32' built-in function */
|
||||
#define HAVE___BUILTIN_BSWAP32 1
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT ""
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME "tl-parser"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "tl-parser 1.0"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "tl-parser"
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#define PACKAGE_URL ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "1.0"
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||
#ifndef __cplusplus
|
||||
/* #undef inline */
|
||||
#endif
|
||||
|
||||
/* Define to rpl_malloc if the replacement function should be used. */
|
||||
/* #undef malloc */
|
||||
|
||||
/* Define to rpl_realloc if the replacement function should be used. */
|
||||
/* #undef realloc */
|
||||
|
||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||
/* #undef size_t */
|
@ -1,613 +0,0 @@
|
||||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by tl-parser configure 1.0, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
$ ./tl-parser/configure
|
||||
|
||||
## --------- ##
|
||||
## Platform. ##
|
||||
## --------- ##
|
||||
|
||||
hostname = ubuntu-virtual-machine
|
||||
uname -m = x86_64
|
||||
uname -r = 5.8.1-050801-generic
|
||||
uname -s = Linux
|
||||
uname -v = #202008111432 SMP Tue Aug 11 14:34:42 UTC 2020
|
||||
|
||||
/usr/bin/uname -p = unknown
|
||||
/bin/uname -X = unknown
|
||||
|
||||
/bin/arch = unknown
|
||||
/usr/bin/arch -k = unknown
|
||||
/usr/convex/getsysinfo = unknown
|
||||
/usr/bin/hostinfo = unknown
|
||||
/bin/machine = unknown
|
||||
/usr/bin/oslevel = unknown
|
||||
/bin/universe = unknown
|
||||
|
||||
PATH: /home/ubuntu/.npm-global/bin
|
||||
PATH: /home/ubuntu/.cargo/bin
|
||||
PATH: /home/ubuntu/.local/bin
|
||||
PATH: /usr/local/sbin
|
||||
PATH: /usr/local/bin
|
||||
PATH: /usr/sbin
|
||||
PATH: /usr/bin
|
||||
PATH: /sbin
|
||||
PATH: /bin
|
||||
PATH: /usr/games
|
||||
PATH: /usr/local/games
|
||||
PATH: /snap/bin
|
||||
PATH: /usr/lib/jvm/zulu13/bin
|
||||
PATH: /usr/lib/jvm/zulu13/db/bin
|
||||
|
||||
|
||||
## ----------- ##
|
||||
## Core tests. ##
|
||||
## ----------- ##
|
||||
|
||||
configure:2290: checking for gcc
|
||||
configure:2306: found /usr/bin/gcc
|
||||
configure:2317: result: gcc
|
||||
configure:2546: checking for C compiler version
|
||||
configure:2555: gcc --version >&5
|
||||
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
|
||||
Copyright (C) 2019 Free Software Foundation, Inc.
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
configure:2566: $? = 0
|
||||
configure:2555: gcc -v >&5
|
||||
Using built-in specs.
|
||||
COLLECT_GCC=gcc
|
||||
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
|
||||
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
|
||||
OFFLOAD_TARGET_DEFAULT=1
|
||||
Target: x86_64-linux-gnu
|
||||
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.3.0-17ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-HskZEa/gcc-9-9.3.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
|
||||
Thread model: posix
|
||||
gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
|
||||
configure:2566: $? = 0
|
||||
configure:2555: gcc -V >&5
|
||||
gcc: error: unrecognized command line option '-V'
|
||||
gcc: fatal error: no input files
|
||||
compilation terminated.
|
||||
configure:2566: $? = 1
|
||||
configure:2555: gcc -qversion >&5
|
||||
gcc: error: unrecognized command line option '-qversion'; did you mean '--version'?
|
||||
gcc: fatal error: no input files
|
||||
compilation terminated.
|
||||
configure:2566: $? = 1
|
||||
configure:2586: checking whether the C compiler works
|
||||
configure:2608: gcc conftest.c >&5
|
||||
configure:2612: $? = 0
|
||||
configure:2660: result: yes
|
||||
configure:2663: checking for C compiler default output file name
|
||||
configure:2665: result: a.out
|
||||
configure:2671: checking for suffix of executables
|
||||
configure:2678: gcc -o conftest conftest.c >&5
|
||||
configure:2682: $? = 0
|
||||
configure:2704: result:
|
||||
configure:2726: checking whether we are cross compiling
|
||||
configure:2734: gcc -o conftest conftest.c >&5
|
||||
configure:2738: $? = 0
|
||||
configure:2745: ./conftest
|
||||
configure:2749: $? = 0
|
||||
configure:2737: result: no
|
||||
configure:2742: checking for suffix of object files
|
||||
configure:2764: gcc -c conftest.c >&5
|
||||
configure:2768: $? = 0
|
||||
configure:2789: result: o
|
||||
configure:2793: checking whether we are using the GNU C compiler
|
||||
configure:2812: gcc -c conftest.c >&5
|
||||
configure:2812: $? = 0
|
||||
configure:2821: result: yes
|
||||
configure:2830: checking whether gcc accepts -g
|
||||
configure:2850: gcc -c -g conftest.c >&5
|
||||
configure:2850: $? = 0
|
||||
configure:2891: result: yes
|
||||
configure:2908: checking for gcc option to accept ISO C89
|
||||
configure:2971: gcc -c -g -O2 conftest.c >&5
|
||||
configure:2971: $? = 0
|
||||
configure:2984: result: none needed
|
||||
configure:3008: checking for crc32_combine in -lz
|
||||
configure:3033: gcc -o conftest -g -O2 conftest.c -lz >&5
|
||||
configure:3033: $? = 0
|
||||
configure:3042: result: yes
|
||||
configure:3060: checking how to run the C preprocessor
|
||||
configure:3091: gcc -E conftest.c
|
||||
configure:3091: $? = 0
|
||||
configure:3105: gcc -E conftest.c
|
||||
conftest.c:10:10: fatal error: ac_nonexistent.h: No such file or directory
|
||||
10 | #include <ac_nonexistent.h>
|
||||
| ^~~~~~~~~~~~~~~~~~
|
||||
compilation terminated.
|
||||
configure:3105: $? = 1
|
||||
configure: failed program was:
|
||||
| /* confdefs.h */
|
||||
| #define PACKAGE_NAME "tl-parser"
|
||||
| #define PACKAGE_TARNAME "tl-parser"
|
||||
| #define PACKAGE_VERSION "1.0"
|
||||
| #define PACKAGE_STRING "tl-parser 1.0"
|
||||
| #define PACKAGE_BUGREPORT ""
|
||||
| #define PACKAGE_URL ""
|
||||
| #define HAVE_LIBZ 1
|
||||
| /* end confdefs.h. */
|
||||
| #include <ac_nonexistent.h>
|
||||
configure:3130: result: gcc -E
|
||||
configure:3150: gcc -E conftest.c
|
||||
configure:3150: $? = 0
|
||||
configure:3164: gcc -E conftest.c
|
||||
conftest.c:10:10: fatal error: ac_nonexistent.h: No such file or directory
|
||||
10 | #include <ac_nonexistent.h>
|
||||
| ^~~~~~~~~~~~~~~~~~
|
||||
compilation terminated.
|
||||
configure:3164: $? = 1
|
||||
configure: failed program was:
|
||||
| /* confdefs.h */
|
||||
| #define PACKAGE_NAME "tl-parser"
|
||||
| #define PACKAGE_TARNAME "tl-parser"
|
||||
| #define PACKAGE_VERSION "1.0"
|
||||
| #define PACKAGE_STRING "tl-parser 1.0"
|
||||
| #define PACKAGE_BUGREPORT ""
|
||||
| #define PACKAGE_URL ""
|
||||
| #define HAVE_LIBZ 1
|
||||
| /* end confdefs.h. */
|
||||
| #include <ac_nonexistent.h>
|
||||
configure:3193: checking for grep that handles long lines and -e
|
||||
configure:3251: result: /bin/grep
|
||||
configure:3256: checking for egrep
|
||||
configure:3318: result: /bin/grep -E
|
||||
configure:3323: checking for ANSI C header files
|
||||
configure:3343: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3343: $? = 0
|
||||
configure:3416: gcc -o conftest -g -O2 conftest.c -lz >&5
|
||||
configure:3416: $? = 0
|
||||
configure:3416: ./conftest
|
||||
configure:3416: $? = 0
|
||||
configure:3427: result: yes
|
||||
configure:3440: checking for sys/types.h
|
||||
configure:3440: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3440: $? = 0
|
||||
configure:3440: result: yes
|
||||
configure:3440: checking for sys/stat.h
|
||||
configure:3440: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3440: $? = 0
|
||||
configure:3440: result: yes
|
||||
configure:3440: checking for stdlib.h
|
||||
configure:3440: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3440: $? = 0
|
||||
configure:3440: result: yes
|
||||
configure:3440: checking for string.h
|
||||
configure:3440: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3440: $? = 0
|
||||
configure:3440: result: yes
|
||||
configure:3440: checking for memory.h
|
||||
configure:3440: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3440: $? = 0
|
||||
configure:3440: result: yes
|
||||
configure:3440: checking for strings.h
|
||||
configure:3440: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3440: $? = 0
|
||||
configure:3440: result: yes
|
||||
configure:3440: checking for inttypes.h
|
||||
configure:3440: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3440: $? = 0
|
||||
configure:3440: result: yes
|
||||
configure:3440: checking for stdint.h
|
||||
configure:3440: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3440: $? = 0
|
||||
configure:3440: result: yes
|
||||
configure:3440: checking for unistd.h
|
||||
configure:3440: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3440: $? = 0
|
||||
configure:3440: result: yes
|
||||
configure:3455: checking fcntl.h usability
|
||||
configure:3455: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3455: $? = 0
|
||||
configure:3455: result: yes
|
||||
configure:3455: checking fcntl.h presence
|
||||
configure:3455: gcc -E conftest.c
|
||||
configure:3455: $? = 0
|
||||
configure:3455: result: yes
|
||||
configure:3455: checking for fcntl.h
|
||||
configure:3455: result: yes
|
||||
configure:3455: checking mach/mach.h usability
|
||||
configure:3455: gcc -c -g -O2 conftest.c >&5
|
||||
conftest.c:54:10: fatal error: mach/mach.h: No such file or directory
|
||||
54 | #include <mach/mach.h>
|
||||
| ^~~~~~~~~~~~~
|
||||
compilation terminated.
|
||||
configure:3455: $? = 1
|
||||
configure: failed program was:
|
||||
| /* confdefs.h */
|
||||
| #define PACKAGE_NAME "tl-parser"
|
||||
| #define PACKAGE_TARNAME "tl-parser"
|
||||
| #define PACKAGE_VERSION "1.0"
|
||||
| #define PACKAGE_STRING "tl-parser 1.0"
|
||||
| #define PACKAGE_BUGREPORT ""
|
||||
| #define PACKAGE_URL ""
|
||||
| #define HAVE_LIBZ 1
|
||||
| #define STDC_HEADERS 1
|
||||
| #define HAVE_SYS_TYPES_H 1
|
||||
| #define HAVE_SYS_STAT_H 1
|
||||
| #define HAVE_STDLIB_H 1
|
||||
| #define HAVE_STRING_H 1
|
||||
| #define HAVE_MEMORY_H 1
|
||||
| #define HAVE_STRINGS_H 1
|
||||
| #define HAVE_INTTYPES_H 1
|
||||
| #define HAVE_STDINT_H 1
|
||||
| #define HAVE_UNISTD_H 1
|
||||
| #define HAVE_FCNTL_H 1
|
||||
| /* end confdefs.h. */
|
||||
| #include <stdio.h>
|
||||
| #ifdef HAVE_SYS_TYPES_H
|
||||
| # include <sys/types.h>
|
||||
| #endif
|
||||
| #ifdef HAVE_SYS_STAT_H
|
||||
| # include <sys/stat.h>
|
||||
| #endif
|
||||
| #ifdef STDC_HEADERS
|
||||
| # include <stdlib.h>
|
||||
| # include <stddef.h>
|
||||
| #else
|
||||
| # ifdef HAVE_STDLIB_H
|
||||
| # include <stdlib.h>
|
||||
| # endif
|
||||
| #endif
|
||||
| #ifdef HAVE_STRING_H
|
||||
| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
|
||||
| # include <memory.h>
|
||||
| # endif
|
||||
| # include <string.h>
|
||||
| #endif
|
||||
| #ifdef HAVE_STRINGS_H
|
||||
| # include <strings.h>
|
||||
| #endif
|
||||
| #ifdef HAVE_INTTYPES_H
|
||||
| # include <inttypes.h>
|
||||
| #endif
|
||||
| #ifdef HAVE_STDINT_H
|
||||
| # include <stdint.h>
|
||||
| #endif
|
||||
| #ifdef HAVE_UNISTD_H
|
||||
| # include <unistd.h>
|
||||
| #endif
|
||||
| #include <mach/mach.h>
|
||||
configure:3455: result: no
|
||||
configure:3455: checking mach/mach.h presence
|
||||
configure:3455: gcc -E conftest.c
|
||||
conftest.c:21:10: fatal error: mach/mach.h: No such file or directory
|
||||
21 | #include <mach/mach.h>
|
||||
| ^~~~~~~~~~~~~
|
||||
compilation terminated.
|
||||
configure:3455: $? = 1
|
||||
configure: failed program was:
|
||||
| /* confdefs.h */
|
||||
| #define PACKAGE_NAME "tl-parser"
|
||||
| #define PACKAGE_TARNAME "tl-parser"
|
||||
| #define PACKAGE_VERSION "1.0"
|
||||
| #define PACKAGE_STRING "tl-parser 1.0"
|
||||
| #define PACKAGE_BUGREPORT ""
|
||||
| #define PACKAGE_URL ""
|
||||
| #define HAVE_LIBZ 1
|
||||
| #define STDC_HEADERS 1
|
||||
| #define HAVE_SYS_TYPES_H 1
|
||||
| #define HAVE_SYS_STAT_H 1
|
||||
| #define HAVE_STDLIB_H 1
|
||||
| #define HAVE_STRING_H 1
|
||||
| #define HAVE_MEMORY_H 1
|
||||
| #define HAVE_STRINGS_H 1
|
||||
| #define HAVE_INTTYPES_H 1
|
||||
| #define HAVE_STDINT_H 1
|
||||
| #define HAVE_UNISTD_H 1
|
||||
| #define HAVE_FCNTL_H 1
|
||||
| /* end confdefs.h. */
|
||||
| #include <mach/mach.h>
|
||||
configure:3455: result: no
|
||||
configure:3455: checking for mach/mach.h
|
||||
configure:3455: result: no
|
||||
configure:3455: checking for stdlib.h
|
||||
configure:3455: result: yes
|
||||
configure:3455: checking for string.h
|
||||
configure:3455: result: yes
|
||||
configure:3455: checking sys/time.h usability
|
||||
configure:3455: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3455: $? = 0
|
||||
configure:3455: result: yes
|
||||
configure:3455: checking sys/time.h presence
|
||||
configure:3455: gcc -E conftest.c
|
||||
configure:3455: $? = 0
|
||||
configure:3455: result: yes
|
||||
configure:3455: checking for sys/time.h
|
||||
configure:3455: result: yes
|
||||
configure:3455: checking for unistd.h
|
||||
configure:3455: result: yes
|
||||
configure:3467: checking for inline
|
||||
configure:3483: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3483: $? = 0
|
||||
configure:3491: result: inline
|
||||
configure:3509: checking for size_t
|
||||
configure:3509: gcc -c -g -O2 conftest.c >&5
|
||||
configure:3509: $? = 0
|
||||
configure:3509: gcc -c -g -O2 conftest.c >&5
|
||||
conftest.c: In function 'main':
|
||||
conftest.c:61:21: error: expected expression before ')' token
|
||||
61 | if (sizeof ((size_t)))
|
||||
| ^
|
||||
configure:3509: $? = 1
|
||||
configure: failed program was:
|
||||
| /* confdefs.h */
|
||||
| #define PACKAGE_NAME "tl-parser"
|
||||
| #define PACKAGE_TARNAME "tl-parser"
|
||||
| #define PACKAGE_VERSION "1.0"
|
||||
| #define PACKAGE_STRING "tl-parser 1.0"
|
||||
| #define PACKAGE_BUGREPORT ""
|
||||
| #define PACKAGE_URL ""
|
||||
| #define HAVE_LIBZ 1
|
||||
| #define STDC_HEADERS 1
|
||||
| #define HAVE_SYS_TYPES_H 1
|
||||
| #define HAVE_SYS_STAT_H 1
|
||||
| #define HAVE_STDLIB_H 1
|
||||
| #define HAVE_STRING_H 1
|
||||
| #define HAVE_MEMORY_H 1
|
||||
| #define HAVE_STRINGS_H 1
|
||||
| #define HAVE_INTTYPES_H 1
|
||||
| #define HAVE_STDINT_H 1
|
||||
| #define HAVE_UNISTD_H 1
|
||||
| #define HAVE_FCNTL_H 1
|
||||
| #define HAVE_STDLIB_H 1
|
||||
| #define HAVE_STRING_H 1
|
||||
| #define HAVE_SYS_TIME_H 1
|
||||
| #define HAVE_UNISTD_H 1
|
||||
| /* end confdefs.h. */
|
||||
| #include <stdio.h>
|
||||
| #ifdef HAVE_SYS_TYPES_H
|
||||
| # include <sys/types.h>
|
||||
| #endif
|
||||
| #ifdef HAVE_SYS_STAT_H
|
||||
| # include <sys/stat.h>
|
||||
| #endif
|
||||
| #ifdef STDC_HEADERS
|
||||
| # include <stdlib.h>
|
||||
| # include <stddef.h>
|
||||
| #else
|
||||
| # ifdef HAVE_STDLIB_H
|
||||
| # include <stdlib.h>
|
||||
| # endif
|
||||
| #endif
|
||||
| #ifdef HAVE_STRING_H
|
||||
| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
|
||||
| # include <memory.h>
|
||||
| # endif
|
||||
| # include <string.h>
|
||||
| #endif
|
||||
| #ifdef HAVE_STRINGS_H
|
||||
| # include <strings.h>
|
||||
| #endif
|
||||
| #ifdef HAVE_INTTYPES_H
|
||||
| # include <inttypes.h>
|
||||
| #endif
|
||||
| #ifdef HAVE_STDINT_H
|
||||
| # include <stdint.h>
|
||||
| #endif
|
||||
| #ifdef HAVE_UNISTD_H
|
||||
| # include <unistd.h>
|
||||
| #endif
|
||||
| int
|
||||
| main ()
|
||||
| {
|
||||
| if (sizeof ((size_t)))
|
||||
| return 0;
|
||||
| ;
|
||||
| return 0;
|
||||
| }
|
||||
configure:3509: result: yes
|
||||
configure:3524: checking for stdlib.h
|
||||
configure:3524: result: yes
|
||||
configure:3534: checking for GNU libc compatible malloc
|
||||
configure:3558: gcc -o conftest -g -O2 conftest.c -lz >&5
|
||||
configure:3558: $? = 0
|
||||
configure:3558: ./conftest
|
||||
configure:3558: $? = 0
|
||||
configure:3568: result: yes
|
||||
configure:3591: checking for stdlib.h
|
||||
configure:3591: result: yes
|
||||
configure:3601: checking for GNU libc compatible realloc
|
||||
configure:3625: gcc -o conftest -g -O2 conftest.c -lz >&5
|
||||
configure:3625: $? = 0
|
||||
configure:3625: ./conftest
|
||||
configure:3625: $? = 0
|
||||
configure:3635: result: yes
|
||||
configure:3659: checking for clock_gettime
|
||||
configure:3659: gcc -o conftest -g -O2 conftest.c -lz >&5
|
||||
configure:3659: $? = 0
|
||||
configure:3659: result: yes
|
||||
configure:3659: checking for memset
|
||||
configure:3659: gcc -o conftest -g -O2 conftest.c -lz >&5
|
||||
conftest.c:53:6: warning: conflicting types for built-in function 'memset'; expected 'void *(void *, int, long unsigned int)' [-Wbuiltin-declaration-mismatch]
|
||||
53 | char memset ();
|
||||
| ^~~~~~
|
||||
conftest.c:41:1: note: 'memset' is declared in header '<string.h>'
|
||||
40 | # include <limits.h>
|
||||
41 | #else
|
||||
configure:3659: $? = 0
|
||||
configure:3659: result: yes
|
||||
configure:3659: checking for strdup
|
||||
configure:3659: gcc -o conftest -g -O2 conftest.c -lz >&5
|
||||
conftest.c:54:6: warning: conflicting types for built-in function 'strdup'; expected 'char *(const char *)' [-Wbuiltin-declaration-mismatch]
|
||||
54 | char strdup ();
|
||||
| ^~~~~~
|
||||
configure:3659: $? = 0
|
||||
configure:3659: result: yes
|
||||
configure:3672: checking for __builtin_bswap32
|
||||
configure:3691: gcc -o conftest -g -O2 conftest.c -lz >&5
|
||||
configure:3691: $? = 0
|
||||
configure:3700: result: yes
|
||||
configure:3822: creating ./config.status
|
||||
|
||||
## ---------------------- ##
|
||||
## Running config.status. ##
|
||||
## ---------------------- ##
|
||||
|
||||
This file was extended by tl-parser config.status 1.0, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
CONFIG_FILES =
|
||||
CONFIG_HEADERS =
|
||||
CONFIG_LINKS =
|
||||
CONFIG_COMMANDS =
|
||||
$ ./config.status
|
||||
|
||||
on ubuntu-virtual-machine
|
||||
|
||||
config.status:808: creating Makefile
|
||||
config.status:808: creating config.h
|
||||
|
||||
## ---------------- ##
|
||||
## Cache variables. ##
|
||||
## ---------------- ##
|
||||
|
||||
ac_cv_c_compiler_gnu=yes
|
||||
ac_cv_c_inline=inline
|
||||
ac_cv_env_CC_set=
|
||||
ac_cv_env_CC_value=
|
||||
ac_cv_env_CFLAGS_set=
|
||||
ac_cv_env_CFLAGS_value=
|
||||
ac_cv_env_CPPFLAGS_set=
|
||||
ac_cv_env_CPPFLAGS_value=
|
||||
ac_cv_env_CPP_set=
|
||||
ac_cv_env_CPP_value=
|
||||
ac_cv_env_LDFLAGS_set=
|
||||
ac_cv_env_LDFLAGS_value=
|
||||
ac_cv_env_LIBS_set=
|
||||
ac_cv_env_LIBS_value=
|
||||
ac_cv_env_build_alias_set=
|
||||
ac_cv_env_build_alias_value=
|
||||
ac_cv_env_host_alias_set=
|
||||
ac_cv_env_host_alias_value=
|
||||
ac_cv_env_target_alias_set=
|
||||
ac_cv_env_target_alias_value=
|
||||
ac_cv_func_clock_gettime=yes
|
||||
ac_cv_func_malloc_0_nonnull=yes
|
||||
ac_cv_func_memset=yes
|
||||
ac_cv_func_realloc_0_nonnull=yes
|
||||
ac_cv_func_strdup=yes
|
||||
ac_cv_header_fcntl_h=yes
|
||||
ac_cv_header_inttypes_h=yes
|
||||
ac_cv_header_mach_mach_h=no
|
||||
ac_cv_header_memory_h=yes
|
||||
ac_cv_header_stdc=yes
|
||||
ac_cv_header_stdint_h=yes
|
||||
ac_cv_header_stdlib_h=yes
|
||||
ac_cv_header_string_h=yes
|
||||
ac_cv_header_strings_h=yes
|
||||
ac_cv_header_sys_stat_h=yes
|
||||
ac_cv_header_sys_time_h=yes
|
||||
ac_cv_header_sys_types_h=yes
|
||||
ac_cv_header_unistd_h=yes
|
||||
ac_cv_lib_z_crc32_combine=yes
|
||||
ac_cv_objext=o
|
||||
ac_cv_path_EGREP='/bin/grep -E'
|
||||
ac_cv_path_GREP=/bin/grep
|
||||
ac_cv_prog_CPP='gcc -E'
|
||||
ac_cv_prog_ac_ct_CC=gcc
|
||||
ac_cv_prog_cc_c89=
|
||||
ac_cv_prog_cc_g=yes
|
||||
ac_cv_type_size_t=yes
|
||||
ax_cv_have___builtin_bswap32=yes
|
||||
|
||||
## ----------------- ##
|
||||
## Output variables. ##
|
||||
## ----------------- ##
|
||||
|
||||
CC='gcc'
|
||||
CFLAGS='-g -O2'
|
||||
CPP='gcc -E'
|
||||
CPPFLAGS=''
|
||||
DEFS='-DHAVE_CONFIG_H'
|
||||
ECHO_C=''
|
||||
ECHO_N='-n'
|
||||
ECHO_T=''
|
||||
EGREP='/bin/grep -E'
|
||||
EXEEXT=''
|
||||
GREP='/bin/grep'
|
||||
LDFLAGS=''
|
||||
LIBOBJS=''
|
||||
LIBS='-lz '
|
||||
LTLIBOBJS=''
|
||||
OBJEXT='o'
|
||||
PACKAGE_BUGREPORT=''
|
||||
PACKAGE_NAME='tl-parser'
|
||||
PACKAGE_STRING='tl-parser 1.0'
|
||||
PACKAGE_TARNAME='tl-parser'
|
||||
PACKAGE_URL=''
|
||||
PACKAGE_VERSION='1.0'
|
||||
PATH_SEPARATOR=':'
|
||||
SHELL='/bin/bash'
|
||||
ac_ct_CC='gcc'
|
||||
bindir='${exec_prefix}/bin'
|
||||
build_alias=''
|
||||
datadir='${datarootdir}'
|
||||
datarootdir='${prefix}/share'
|
||||
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
|
||||
dvidir='${docdir}'
|
||||
exec_prefix='${prefix}'
|
||||
host_alias=''
|
||||
htmldir='${docdir}'
|
||||
includedir='${prefix}/include'
|
||||
infodir='${datarootdir}/info'
|
||||
libdir='${exec_prefix}/lib'
|
||||
libexecdir='${exec_prefix}/libexec'
|
||||
localedir='${datarootdir}/locale'
|
||||
localstatedir='${prefix}/var'
|
||||
mandir='${datarootdir}/man'
|
||||
oldincludedir='/usr/include'
|
||||
pdfdir='${docdir}'
|
||||
prefix='/usr/local'
|
||||
program_transform_name='s,x,x,'
|
||||
psdir='${docdir}'
|
||||
runstatedir='${localstatedir}/run'
|
||||
sbindir='${exec_prefix}/sbin'
|
||||
sharedstatedir='${prefix}/com'
|
||||
sysconfdir='${prefix}/etc'
|
||||
target_alias=''
|
||||
|
||||
## ----------- ##
|
||||
## confdefs.h. ##
|
||||
## ----------- ##
|
||||
|
||||
/* confdefs.h */
|
||||
#define PACKAGE_NAME "tl-parser"
|
||||
#define PACKAGE_TARNAME "tl-parser"
|
||||
#define PACKAGE_VERSION "1.0"
|
||||
#define PACKAGE_STRING "tl-parser 1.0"
|
||||
#define PACKAGE_BUGREPORT ""
|
||||
#define PACKAGE_URL ""
|
||||
#define HAVE_LIBZ 1
|
||||
#define STDC_HEADERS 1
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
#define HAVE_STDLIB_H 1
|
||||
#define HAVE_STRING_H 1
|
||||
#define HAVE_MEMORY_H 1
|
||||
#define HAVE_STRINGS_H 1
|
||||
#define HAVE_INTTYPES_H 1
|
||||
#define HAVE_STDINT_H 1
|
||||
#define HAVE_UNISTD_H 1
|
||||
#define HAVE_FCNTL_H 1
|
||||
#define HAVE_STDLIB_H 1
|
||||
#define HAVE_STRING_H 1
|
||||
#define HAVE_SYS_TIME_H 1
|
||||
#define HAVE_UNISTD_H 1
|
||||
#define HAVE_STDLIB_H 1
|
||||
#define HAVE_MALLOC 1
|
||||
#define HAVE_STDLIB_H 1
|
||||
#define HAVE_REALLOC 1
|
||||
#define HAVE_CLOCK_GETTIME 1
|
||||
#define HAVE_MEMSET 1
|
||||
#define HAVE_STRDUP 1
|
||||
#define HAVE___BUILTIN_BSWAP32 1
|
||||
|
||||
configure: exit 0
|
@ -1,987 +0,0 @@
|
||||
#! /bin/bash
|
||||
# Generated by configure.
|
||||
# Run this file to recreate the current configuration.
|
||||
# Compiler output produced by configure, useful for debugging
|
||||
# configure, is in config.log if it exists.
|
||||
|
||||
debug=false
|
||||
ac_cs_recheck=false
|
||||
ac_cs_silent=false
|
||||
|
||||
SHELL=${CONFIG_SHELL-/bin/bash}
|
||||
export SHELL
|
||||
## -------------------- ##
|
||||
## M4sh Initialization. ##
|
||||
## -------------------- ##
|
||||
|
||||
# Be more Bourne compatible
|
||||
DUALCASE=1; export DUALCASE # for MKS sh
|
||||
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
|
||||
emulate sh
|
||||
NULLCMD=:
|
||||
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
|
||||
# is contrary to our usage. Disable this feature.
|
||||
alias -g '${1+"$@"}'='"$@"'
|
||||
setopt NO_GLOB_SUBST
|
||||
else
|
||||
case `(set -o) 2>/dev/null` in #(
|
||||
*posix*) :
|
||||
set -o posix ;; #(
|
||||
*) :
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
|
||||
as_nl='
|
||||
'
|
||||
export as_nl
|
||||
# Printing a long string crashes Solaris 7 /usr/bin/printf.
|
||||
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
|
||||
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
|
||||
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
|
||||
# Prefer a ksh shell builtin over an external printf program on Solaris,
|
||||
# but without wasting forks for bash or zsh.
|
||||
if test -z "$BASH_VERSION$ZSH_VERSION" \
|
||||
&& (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
|
||||
as_echo='print -r --'
|
||||
as_echo_n='print -rn --'
|
||||
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
|
||||
as_echo='printf %s\n'
|
||||
as_echo_n='printf %s'
|
||||
else
|
||||
if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
|
||||
as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
|
||||
as_echo_n='/usr/ucb/echo -n'
|
||||
else
|
||||
as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
|
||||
as_echo_n_body='eval
|
||||
arg=$1;
|
||||
case $arg in #(
|
||||
*"$as_nl"*)
|
||||
expr "X$arg" : "X\\(.*\\)$as_nl";
|
||||
arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
|
||||
esac;
|
||||
expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
|
||||
'
|
||||
export as_echo_n_body
|
||||
as_echo_n='sh -c $as_echo_n_body as_echo'
|
||||
fi
|
||||
export as_echo_body
|
||||
as_echo='sh -c $as_echo_body as_echo'
|
||||
fi
|
||||
|
||||
# The user is always right.
|
||||
if test "${PATH_SEPARATOR+set}" != set; then
|
||||
PATH_SEPARATOR=:
|
||||
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
|
||||
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
|
||||
PATH_SEPARATOR=';'
|
||||
}
|
||||
fi
|
||||
|
||||
|
||||
# IFS
|
||||
# We need space, tab and new line, in precisely that order. Quoting is
|
||||
# there to prevent editors from complaining about space-tab.
|
||||
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
|
||||
# splitting by setting IFS to empty value.)
|
||||
IFS=" "" $as_nl"
|
||||
|
||||
# Find who we are. Look in the path if we contain no directory separator.
|
||||
as_myself=
|
||||
case $0 in #((
|
||||
*[\\/]* ) as_myself=$0 ;;
|
||||
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
for as_dir in $PATH
|
||||
do
|
||||
IFS=$as_save_IFS
|
||||
test -z "$as_dir" && as_dir=.
|
||||
test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
|
||||
done
|
||||
IFS=$as_save_IFS
|
||||
|
||||
;;
|
||||
esac
|
||||
# We did not find ourselves, most probably we were run as `sh COMMAND'
|
||||
# in which case we are not to be found in the path.
|
||||
if test "x$as_myself" = x; then
|
||||
as_myself=$0
|
||||
fi
|
||||
if test ! -f "$as_myself"; then
|
||||
$as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Unset variables that we do not need and which cause bugs (e.g. in
|
||||
# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
|
||||
# suppresses any "Segmentation fault" message there. '((' could
|
||||
# trigger a bug in pdksh 5.2.14.
|
||||
for as_var in BASH_ENV ENV MAIL MAILPATH
|
||||
do eval test x\${$as_var+set} = xset \
|
||||
&& ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
|
||||
done
|
||||
PS1='$ '
|
||||
PS2='> '
|
||||
PS4='+ '
|
||||
|
||||
# NLS nuisances.
|
||||
LC_ALL=C
|
||||
export LC_ALL
|
||||
LANGUAGE=C
|
||||
export LANGUAGE
|
||||
|
||||
# CDPATH.
|
||||
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
|
||||
|
||||
|
||||
# as_fn_error STATUS ERROR [LINENO LOG_FD]
|
||||
# ----------------------------------------
|
||||
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
|
||||
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
|
||||
# script with STATUS, using 1 if that was 0.
|
||||
as_fn_error ()
|
||||
{
|
||||
as_status=$1; test $as_status -eq 0 && as_status=1
|
||||
if test "$4"; then
|
||||
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
|
||||
fi
|
||||
$as_echo "$as_me: error: $2" >&2
|
||||
as_fn_exit $as_status
|
||||
} # as_fn_error
|
||||
|
||||
|
||||
# as_fn_set_status STATUS
|
||||
# -----------------------
|
||||
# Set $? to STATUS, without forking.
|
||||
as_fn_set_status ()
|
||||
{
|
||||
return $1
|
||||
} # as_fn_set_status
|
||||
|
||||
# as_fn_exit STATUS
|
||||
# -----------------
|
||||
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
|
||||
as_fn_exit ()
|
||||
{
|
||||
set +e
|
||||
as_fn_set_status $1
|
||||
exit $1
|
||||
} # as_fn_exit
|
||||
|
||||
# as_fn_unset VAR
|
||||
# ---------------
|
||||
# Portably unset VAR.
|
||||
as_fn_unset ()
|
||||
{
|
||||
{ eval $1=; unset $1;}
|
||||
}
|
||||
as_unset=as_fn_unset
|
||||
# as_fn_append VAR VALUE
|
||||
# ----------------------
|
||||
# Append the text in VALUE to the end of the definition contained in VAR. Take
|
||||
# advantage of any shell optimizations that allow amortized linear growth over
|
||||
# repeated appends, instead of the typical quadratic growth present in naive
|
||||
# implementations.
|
||||
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
|
||||
eval 'as_fn_append ()
|
||||
{
|
||||
eval $1+=\$2
|
||||
}'
|
||||
else
|
||||
as_fn_append ()
|
||||
{
|
||||
eval $1=\$$1\$2
|
||||
}
|
||||
fi # as_fn_append
|
||||
|
||||
# as_fn_arith ARG...
|
||||
# ------------------
|
||||
# Perform arithmetic evaluation on the ARGs, and store the result in the
|
||||
# global $as_val. Take advantage of shells that can avoid forks. The arguments
|
||||
# must be portable across $(()) and expr.
|
||||
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
|
||||
eval 'as_fn_arith ()
|
||||
{
|
||||
as_val=$(( $* ))
|
||||
}'
|
||||
else
|
||||
as_fn_arith ()
|
||||
{
|
||||
as_val=`expr "$@" || test $? -eq 1`
|
||||
}
|
||||
fi # as_fn_arith
|
||||
|
||||
|
||||
if expr a : '\(a\)' >/dev/null 2>&1 &&
|
||||
test "X`expr 00001 : '.*\(...\)'`" = X001; then
|
||||
as_expr=expr
|
||||
else
|
||||
as_expr=false
|
||||
fi
|
||||
|
||||
if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
|
||||
as_basename=basename
|
||||
else
|
||||
as_basename=false
|
||||
fi
|
||||
|
||||
if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
|
||||
as_dirname=dirname
|
||||
else
|
||||
as_dirname=false
|
||||
fi
|
||||
|
||||
as_me=`$as_basename -- "$0" ||
|
||||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
|
||||
X"$0" : 'X\(//\)$' \| \
|
||||
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
|
||||
$as_echo X/"$0" |
|
||||
sed '/^.*\/\([^/][^/]*\)\/*$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\/\(\/\/\)$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\/\(\/\).*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
s/.*/./; q'`
|
||||
|
||||
# Avoid depending upon Character Ranges.
|
||||
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
|
||||
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
|
||||
as_cr_digits='0123456789'
|
||||
as_cr_alnum=$as_cr_Letters$as_cr_digits
|
||||
|
||||
ECHO_C= ECHO_N= ECHO_T=
|
||||
case `echo -n x` in #(((((
|
||||
-n*)
|
||||
case `echo 'xy\c'` in
|
||||
*c*) ECHO_T=' ';; # ECHO_T is single tab character.
|
||||
xy) ECHO_C='\c';;
|
||||
*) echo `echo ksh88 bug on AIX 6.1` > /dev/null
|
||||
ECHO_T=' ';;
|
||||
esac;;
|
||||
*)
|
||||
ECHO_N='-n';;
|
||||
esac
|
||||
|
||||
rm -f conf$$ conf$$.exe conf$$.file
|
||||
if test -d conf$$.dir; then
|
||||
rm -f conf$$.dir/conf$$.file
|
||||
else
|
||||
rm -f conf$$.dir
|
||||
mkdir conf$$.dir 2>/dev/null
|
||||
fi
|
||||
if (echo >conf$$.file) 2>/dev/null; then
|
||||
if ln -s conf$$.file conf$$ 2>/dev/null; then
|
||||
as_ln_s='ln -s'
|
||||
# ... but there are two gotchas:
|
||||
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
|
||||
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
|
||||
# In both cases, we have to default to `cp -pR'.
|
||||
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
|
||||
as_ln_s='cp -pR'
|
||||
elif ln conf$$.file conf$$ 2>/dev/null; then
|
||||
as_ln_s=ln
|
||||
else
|
||||
as_ln_s='cp -pR'
|
||||
fi
|
||||
else
|
||||
as_ln_s='cp -pR'
|
||||
fi
|
||||
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
|
||||
rmdir conf$$.dir 2>/dev/null
|
||||
|
||||
|
||||
# as_fn_mkdir_p
|
||||
# -------------
|
||||
# Create "$as_dir" as a directory, including parents if necessary.
|
||||
as_fn_mkdir_p ()
|
||||
{
|
||||
|
||||
case $as_dir in #(
|
||||
-*) as_dir=./$as_dir;;
|
||||
esac
|
||||
test -d "$as_dir" || eval $as_mkdir_p || {
|
||||
as_dirs=
|
||||
while :; do
|
||||
case $as_dir in #(
|
||||
*\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
|
||||
*) as_qdir=$as_dir;;
|
||||
esac
|
||||
as_dirs="'$as_qdir' $as_dirs"
|
||||
as_dir=`$as_dirname -- "$as_dir" ||
|
||||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||
X"$as_dir" : 'X\(//\)[^/]' \| \
|
||||
X"$as_dir" : 'X\(//\)$' \| \
|
||||
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
|
||||
$as_echo X"$as_dir" |
|
||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\/\)[^/].*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\/\)$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\).*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
s/.*/./; q'`
|
||||
test -d "$as_dir" && break
|
||||
done
|
||||
test -z "$as_dirs" || eval "mkdir $as_dirs"
|
||||
} || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
|
||||
|
||||
|
||||
} # as_fn_mkdir_p
|
||||
if mkdir -p . 2>/dev/null; then
|
||||
as_mkdir_p='mkdir -p "$as_dir"'
|
||||
else
|
||||
test -d ./-p && rmdir ./-p
|
||||
as_mkdir_p=false
|
||||
fi
|
||||
|
||||
|
||||
# as_fn_executable_p FILE
|
||||
# -----------------------
|
||||
# Test if FILE is an executable regular file.
|
||||
as_fn_executable_p ()
|
||||
{
|
||||
test -f "$1" && test -x "$1"
|
||||
} # as_fn_executable_p
|
||||
as_test_x='test -x'
|
||||
as_executable_p=as_fn_executable_p
|
||||
|
||||
# Sed expression to map a string onto a valid CPP name.
|
||||
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
|
||||
|
||||
# Sed expression to map a string onto a valid variable name.
|
||||
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
|
||||
|
||||
|
||||
exec 6>&1
|
||||
## ----------------------------------- ##
|
||||
## Main body of $CONFIG_STATUS script. ##
|
||||
## ----------------------------------- ##
|
||||
# Save the log message, to keep $0 and so on meaningful, and to
|
||||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by tl-parser $as_me 1.0, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
CONFIG_HEADERS = $CONFIG_HEADERS
|
||||
CONFIG_LINKS = $CONFIG_LINKS
|
||||
CONFIG_COMMANDS = $CONFIG_COMMANDS
|
||||
$ $0 $@
|
||||
|
||||
on `(hostname || uname -n) 2>/dev/null | sed 1q`
|
||||
"
|
||||
|
||||
# Files that config.status was made for.
|
||||
config_files=" Makefile"
|
||||
config_headers=" config.h"
|
||||
|
||||
ac_cs_usage="\
|
||||
\`$as_me' instantiates files and other configuration actions
|
||||
from templates according to the current configuration. Unless the files
|
||||
and actions are specified as TAGs, all are instantiated by default.
|
||||
|
||||
Usage: $0 [OPTION]... [TAG]...
|
||||
|
||||
-h, --help print this help, then exit
|
||||
-V, --version print version number and configuration settings, then exit
|
||||
--config print configuration, then exit
|
||||
-q, --quiet, --silent
|
||||
do not print progress messages
|
||||
-d, --debug don't remove temporary files
|
||||
--recheck update $as_me by reconfiguring in the same conditions
|
||||
--file=FILE[:TEMPLATE]
|
||||
instantiate the configuration file FILE
|
||||
--header=FILE[:TEMPLATE]
|
||||
instantiate the configuration header FILE
|
||||
|
||||
Configuration files:
|
||||
$config_files
|
||||
|
||||
Configuration headers:
|
||||
$config_headers
|
||||
|
||||
Report bugs to the package provider."
|
||||
|
||||
ac_cs_config=""
|
||||
ac_cs_version="\
|
||||
tl-parser config.status 1.0
|
||||
configured by ./tl-parser/configure, generated by GNU Autoconf 2.69,
|
||||
with options \"$ac_cs_config\"
|
||||
|
||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
This config.status script is free software; the Free Software Foundation
|
||||
gives unlimited permission to copy, distribute and modify it."
|
||||
|
||||
ac_pwd='/home/ubuntu/CLionProjects/tdlight/td/generate'
|
||||
srcdir='./tl-parser'
|
||||
test -n "$AWK" || AWK=awk
|
||||
# The default lists apply if the user does not specify any file.
|
||||
ac_need_defaults=:
|
||||
while test $# != 0
|
||||
do
|
||||
case $1 in
|
||||
--*=?*)
|
||||
ac_option=`expr "X$1" : 'X\([^=]*\)='`
|
||||
ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
|
||||
ac_shift=:
|
||||
;;
|
||||
--*=)
|
||||
ac_option=`expr "X$1" : 'X\([^=]*\)='`
|
||||
ac_optarg=
|
||||
ac_shift=:
|
||||
;;
|
||||
*)
|
||||
ac_option=$1
|
||||
ac_optarg=$2
|
||||
ac_shift=shift
|
||||
;;
|
||||
esac
|
||||
|
||||
case $ac_option in
|
||||
# Handling of the options.
|
||||
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
|
||||
ac_cs_recheck=: ;;
|
||||
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
|
||||
$as_echo "$ac_cs_version"; exit ;;
|
||||
--config | --confi | --conf | --con | --co | --c )
|
||||
$as_echo "$ac_cs_config"; exit ;;
|
||||
--debug | --debu | --deb | --de | --d | -d )
|
||||
debug=: ;;
|
||||
--file | --fil | --fi | --f )
|
||||
$ac_shift
|
||||
case $ac_optarg in
|
||||
*\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
|
||||
'') as_fn_error $? "missing file argument" ;;
|
||||
esac
|
||||
as_fn_append CONFIG_FILES " '$ac_optarg'"
|
||||
ac_need_defaults=false;;
|
||||
--header | --heade | --head | --hea )
|
||||
$ac_shift
|
||||
case $ac_optarg in
|
||||
*\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
|
||||
esac
|
||||
as_fn_append CONFIG_HEADERS " '$ac_optarg'"
|
||||
ac_need_defaults=false;;
|
||||
--he | --h)
|
||||
# Conflict between --help and --header
|
||||
as_fn_error $? "ambiguous option: \`$1'
|
||||
Try \`$0 --help' for more information.";;
|
||||
--help | --hel | -h )
|
||||
$as_echo "$ac_cs_usage"; exit ;;
|
||||
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
|
||||
| -silent | --silent | --silen | --sile | --sil | --si | --s)
|
||||
ac_cs_silent=: ;;
|
||||
|
||||
# This is an error.
|
||||
-*) as_fn_error $? "unrecognized option: \`$1'
|
||||
Try \`$0 --help' for more information." ;;
|
||||
|
||||
*) as_fn_append ac_config_targets " $1"
|
||||
ac_need_defaults=false ;;
|
||||
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
ac_configure_extra_args=
|
||||
|
||||
if $ac_cs_silent; then
|
||||
exec 6>/dev/null
|
||||
ac_configure_extra_args="$ac_configure_extra_args --silent"
|
||||
fi
|
||||
|
||||
if $ac_cs_recheck; then
|
||||
set X /bin/bash './tl-parser/configure' $ac_configure_extra_args --no-create --no-recursion
|
||||
shift
|
||||
$as_echo "running CONFIG_SHELL=/bin/bash $*" >&6
|
||||
CONFIG_SHELL='/bin/bash'
|
||||
export CONFIG_SHELL
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
exec 5>>config.log
|
||||
{
|
||||
echo
|
||||
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
|
||||
## Running $as_me. ##
|
||||
_ASBOX
|
||||
$as_echo "$ac_log"
|
||||
} >&5
|
||||
|
||||
|
||||
# Handling of arguments.
|
||||
for ac_config_target in $ac_config_targets
|
||||
do
|
||||
case $ac_config_target in
|
||||
"config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
|
||||
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
|
||||
|
||||
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
# If the user did not use the arguments to specify the items to instantiate,
|
||||
# then the envvar interface is used. Set only those that are not.
|
||||
# We use the long form for the default assignment because of an extremely
|
||||
# bizarre bug on SunOS 4.1.3.
|
||||
if $ac_need_defaults; then
|
||||
test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
|
||||
test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
|
||||
fi
|
||||
|
||||
# Have a temporary directory for convenience. Make it in the build tree
|
||||
# simply because there is no reason against having it here, and in addition,
|
||||
# creating and moving files from /tmp can sometimes cause problems.
|
||||
# Hook for its removal unless debugging.
|
||||
# Note that there is a small window in which the directory will not be cleaned:
|
||||
# after its creation but before its name has been assigned to `$tmp'.
|
||||
$debug ||
|
||||
{
|
||||
tmp= ac_tmp=
|
||||
trap 'exit_status=$?
|
||||
: "${ac_tmp:=$tmp}"
|
||||
{ test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
|
||||
' 0
|
||||
trap 'as_fn_exit 1' 1 2 13 15
|
||||
}
|
||||
# Create a (secure) tmp directory for tmp files.
|
||||
|
||||
{
|
||||
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
|
||||
test -d "$tmp"
|
||||
} ||
|
||||
{
|
||||
tmp=./conf$$-$RANDOM
|
||||
(umask 077 && mkdir "$tmp")
|
||||
} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
|
||||
ac_tmp=$tmp
|
||||
|
||||
# Set up the scripts for CONFIG_FILES section.
|
||||
# No need to generate them if there are no CONFIG_FILES.
|
||||
# This happens for instance with `./config.status config.h'.
|
||||
if test -n "$CONFIG_FILES"; then
|
||||
|
||||
|
||||
ac_cr=`echo X | tr X '\015'`
|
||||
# On cygwin, bash can eat \r inside `` if the user requested igncr.
|
||||
# But we know of no other shell where ac_cr would be empty at this
|
||||
# point, so we can use a bashism as a fallback.
|
||||
if test "x$ac_cr" = x; then
|
||||
eval ac_cr=\$\'\\r\'
|
||||
fi
|
||||
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
|
||||
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
|
||||
ac_cs_awk_cr='\\r'
|
||||
else
|
||||
ac_cs_awk_cr=$ac_cr
|
||||
fi
|
||||
|
||||
echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
|
||||
cat >>"$ac_tmp/subs1.awk" <<\_ACAWK &&
|
||||
S["LTLIBOBJS"]=""
|
||||
S["LIBOBJS"]=""
|
||||
S["EGREP"]="/bin/grep -E"
|
||||
S["GREP"]="/bin/grep"
|
||||
S["CPP"]="gcc -E"
|
||||
S["OBJEXT"]="o"
|
||||
S["EXEEXT"]=""
|
||||
S["ac_ct_CC"]="gcc"
|
||||
S["CPPFLAGS"]=""
|
||||
S["LDFLAGS"]=""
|
||||
S["CFLAGS"]="-g -O2"
|
||||
S["CC"]="gcc"
|
||||
S["target_alias"]=""
|
||||
S["host_alias"]=""
|
||||
S["build_alias"]=""
|
||||
S["LIBS"]="-lz "
|
||||
S["ECHO_T"]=""
|
||||
S["ECHO_N"]="-n"
|
||||
S["ECHO_C"]=""
|
||||
S["DEFS"]="-DHAVE_CONFIG_H"
|
||||
S["mandir"]="${datarootdir}/man"
|
||||
S["localedir"]="${datarootdir}/locale"
|
||||
S["libdir"]="${exec_prefix}/lib"
|
||||
S["psdir"]="${docdir}"
|
||||
S["pdfdir"]="${docdir}"
|
||||
S["dvidir"]="${docdir}"
|
||||
S["htmldir"]="${docdir}"
|
||||
S["infodir"]="${datarootdir}/info"
|
||||
S["docdir"]="${datarootdir}/doc/${PACKAGE_TARNAME}"
|
||||
S["oldincludedir"]="/usr/include"
|
||||
S["includedir"]="${prefix}/include"
|
||||
S["runstatedir"]="${localstatedir}/run"
|
||||
S["localstatedir"]="${prefix}/var"
|
||||
S["sharedstatedir"]="${prefix}/com"
|
||||
S["sysconfdir"]="${prefix}/etc"
|
||||
S["datadir"]="${datarootdir}"
|
||||
S["datarootdir"]="${prefix}/share"
|
||||
S["libexecdir"]="${exec_prefix}/libexec"
|
||||
S["sbindir"]="${exec_prefix}/sbin"
|
||||
S["bindir"]="${exec_prefix}/bin"
|
||||
S["program_transform_name"]="s,x,x,"
|
||||
S["prefix"]="/usr/local"
|
||||
S["exec_prefix"]="${prefix}"
|
||||
S["PACKAGE_URL"]=""
|
||||
S["PACKAGE_BUGREPORT"]=""
|
||||
S["PACKAGE_STRING"]="tl-parser 1.0"
|
||||
S["PACKAGE_VERSION"]="1.0"
|
||||
S["PACKAGE_TARNAME"]="tl-parser"
|
||||
S["PACKAGE_NAME"]="tl-parser"
|
||||
S["PATH_SEPARATOR"]=":"
|
||||
S["SHELL"]="/bin/bash"
|
||||
_ACAWK
|
||||
cat >>"$ac_tmp/subs1.awk" <<_ACAWK &&
|
||||
for (key in S) S_is_set[key] = 1
|
||||
FS = ""
|
||||
|
||||
}
|
||||
{
|
||||
line = $ 0
|
||||
nfields = split(line, field, "@")
|
||||
substed = 0
|
||||
len = length(field[1])
|
||||
for (i = 2; i < nfields; i++) {
|
||||
key = field[i]
|
||||
keylen = length(key)
|
||||
if (S_is_set[key]) {
|
||||
value = S[key]
|
||||
line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
|
||||
len += length(value) + length(field[++i])
|
||||
substed = 1
|
||||
} else
|
||||
len += 1 + keylen
|
||||
}
|
||||
|
||||
print line
|
||||
}
|
||||
|
||||
_ACAWK
|
||||
if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
|
||||
sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
|
||||
else
|
||||
cat
|
||||
fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
|
||||
|| as_fn_error $? "could not setup config files machinery" "$LINENO" 5
|
||||
fi # test -n "$CONFIG_FILES"
|
||||
|
||||
# Set up the scripts for CONFIG_HEADERS section.
|
||||
# No need to generate them if there are no CONFIG_HEADERS.
|
||||
# This happens for instance with `./config.status Makefile'.
|
||||
if test -n "$CONFIG_HEADERS"; then
|
||||
cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
|
||||
BEGIN {
|
||||
D["PACKAGE_NAME"]=" \"tl-parser\""
|
||||
D["PACKAGE_TARNAME"]=" \"tl-parser\""
|
||||
D["PACKAGE_VERSION"]=" \"1.0\""
|
||||
D["PACKAGE_STRING"]=" \"tl-parser 1.0\""
|
||||
D["PACKAGE_BUGREPORT"]=" \"\""
|
||||
D["PACKAGE_URL"]=" \"\""
|
||||
D["HAVE_LIBZ"]=" 1"
|
||||
D["STDC_HEADERS"]=" 1"
|
||||
D["HAVE_SYS_TYPES_H"]=" 1"
|
||||
D["HAVE_SYS_STAT_H"]=" 1"
|
||||
D["HAVE_STDLIB_H"]=" 1"
|
||||
D["HAVE_STRING_H"]=" 1"
|
||||
D["HAVE_MEMORY_H"]=" 1"
|
||||
D["HAVE_STRINGS_H"]=" 1"
|
||||
D["HAVE_INTTYPES_H"]=" 1"
|
||||
D["HAVE_STDINT_H"]=" 1"
|
||||
D["HAVE_UNISTD_H"]=" 1"
|
||||
D["HAVE_FCNTL_H"]=" 1"
|
||||
D["HAVE_STDLIB_H"]=" 1"
|
||||
D["HAVE_STRING_H"]=" 1"
|
||||
D["HAVE_SYS_TIME_H"]=" 1"
|
||||
D["HAVE_UNISTD_H"]=" 1"
|
||||
D["HAVE_STDLIB_H"]=" 1"
|
||||
D["HAVE_MALLOC"]=" 1"
|
||||
D["HAVE_STDLIB_H"]=" 1"
|
||||
D["HAVE_REALLOC"]=" 1"
|
||||
D["HAVE_CLOCK_GETTIME"]=" 1"
|
||||
D["HAVE_MEMSET"]=" 1"
|
||||
D["HAVE_STRDUP"]=" 1"
|
||||
D["HAVE___BUILTIN_BSWAP32"]=" 1"
|
||||
for (key in D) D_is_set[key] = 1
|
||||
FS = ""
|
||||
}
|
||||
/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\t (]|$)/ {
|
||||
line = $ 0
|
||||
split(line, arg, " ")
|
||||
if (arg[1] == "#") {
|
||||
defundef = arg[2]
|
||||
mac1 = arg[3]
|
||||
} else {
|
||||
defundef = substr(arg[1], 2)
|
||||
mac1 = arg[2]
|
||||
}
|
||||
split(mac1, mac2, "(") #)
|
||||
macro = mac2[1]
|
||||
prefix = substr(line, 1, index(line, defundef) - 1)
|
||||
if (D_is_set[macro]) {
|
||||
# Preserve the white space surrounding the "#".
|
||||
print prefix "define", macro P[macro] D[macro]
|
||||
next
|
||||
} else {
|
||||
# Replace #undef with comments. This is necessary, for example,
|
||||
# in the case of _POSIX_SOURCE, which is predefined and required
|
||||
# on some systems where configure will not decide to define it.
|
||||
if (defundef == "undef") {
|
||||
print "/*", prefix defundef, macro, "*/"
|
||||
next
|
||||
}
|
||||
}
|
||||
}
|
||||
{ print }
|
||||
_ACAWK
|
||||
as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
|
||||
fi # test -n "$CONFIG_HEADERS"
|
||||
|
||||
|
||||
eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS "
|
||||
shift
|
||||
for ac_tag
|
||||
do
|
||||
case $ac_tag in
|
||||
:[FHLC]) ac_mode=$ac_tag; continue;;
|
||||
esac
|
||||
case $ac_mode$ac_tag in
|
||||
:[FHL]*:*);;
|
||||
:L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
|
||||
:[FH]-) ac_tag=-:-;;
|
||||
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
|
||||
esac
|
||||
ac_save_IFS=$IFS
|
||||
IFS=:
|
||||
set x $ac_tag
|
||||
IFS=$ac_save_IFS
|
||||
shift
|
||||
ac_file=$1
|
||||
shift
|
||||
|
||||
case $ac_mode in
|
||||
:L) ac_source=$1;;
|
||||
:[FH])
|
||||
ac_file_inputs=
|
||||
for ac_f
|
||||
do
|
||||
case $ac_f in
|
||||
-) ac_f="$ac_tmp/stdin";;
|
||||
*) # Look for the file first in the build tree, then in the source tree
|
||||
# (if the path is not absolute). The absolute path cannot be DOS-style,
|
||||
# because $ac_f cannot contain `:'.
|
||||
test -f "$ac_f" ||
|
||||
case $ac_f in
|
||||
[\\/$]*) false;;
|
||||
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
|
||||
esac ||
|
||||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
|
||||
esac
|
||||
case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
|
||||
as_fn_append ac_file_inputs " '$ac_f'"
|
||||
done
|
||||
|
||||
# Let's still pretend it is `configure' which instantiates (i.e., don't
|
||||
# use $as_me), people would be surprised to read:
|
||||
# /* config.h. Generated by config.status. */
|
||||
configure_input='Generated from '`
|
||||
$as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
|
||||
`' by configure.'
|
||||
if test x"$ac_file" != x-; then
|
||||
configure_input="$ac_file. $configure_input"
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
|
||||
$as_echo "$as_me: creating $ac_file" >&6;}
|
||||
fi
|
||||
# Neutralize special characters interpreted by sed in replacement strings.
|
||||
case $configure_input in #(
|
||||
*\&* | *\|* | *\\* )
|
||||
ac_sed_conf_input=`$as_echo "$configure_input" |
|
||||
sed 's/[\\\\&|]/\\\\&/g'`;; #(
|
||||
*) ac_sed_conf_input=$configure_input;;
|
||||
esac
|
||||
|
||||
case $ac_tag in
|
||||
*:-:* | *:-) cat >"$ac_tmp/stdin" \
|
||||
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
ac_dir=`$as_dirname -- "$ac_file" ||
|
||||
$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||
X"$ac_file" : 'X\(//\)[^/]' \| \
|
||||
X"$ac_file" : 'X\(//\)$' \| \
|
||||
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
|
||||
$as_echo X"$ac_file" |
|
||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\/\)[^/].*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\/\)$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\).*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
s/.*/./; q'`
|
||||
as_dir="$ac_dir"; as_fn_mkdir_p
|
||||
ac_builddir=.
|
||||
|
||||
case "$ac_dir" in
|
||||
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
|
||||
*)
|
||||
ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
|
||||
# A ".." for each directory in $ac_dir_suffix.
|
||||
ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
|
||||
case $ac_top_builddir_sub in
|
||||
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
|
||||
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
|
||||
esac ;;
|
||||
esac
|
||||
ac_abs_top_builddir=$ac_pwd
|
||||
ac_abs_builddir=$ac_pwd$ac_dir_suffix
|
||||
# for backward compatibility:
|
||||
ac_top_builddir=$ac_top_build_prefix
|
||||
|
||||
case $srcdir in
|
||||
.) # We are building in place.
|
||||
ac_srcdir=.
|
||||
ac_top_srcdir=$ac_top_builddir_sub
|
||||
ac_abs_top_srcdir=$ac_pwd ;;
|
||||
[\\/]* | ?:[\\/]* ) # Absolute name.
|
||||
ac_srcdir=$srcdir$ac_dir_suffix;
|
||||
ac_top_srcdir=$srcdir
|
||||
ac_abs_top_srcdir=$srcdir ;;
|
||||
*) # Relative name.
|
||||
ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
|
||||
ac_top_srcdir=$ac_top_build_prefix$srcdir
|
||||
ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
|
||||
esac
|
||||
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
|
||||
|
||||
|
||||
case $ac_mode in
|
||||
:F)
|
||||
#
|
||||
# CONFIG_FILE
|
||||
#
|
||||
|
||||
# If the template does not know about datarootdir, expand it.
|
||||
# FIXME: This hack should be removed a few years after 2.60.
|
||||
ac_datarootdir_hack=; ac_datarootdir_seen=
|
||||
ac_sed_dataroot='
|
||||
/datarootdir/ {
|
||||
p
|
||||
q
|
||||
}
|
||||
/@datadir@/p
|
||||
/@docdir@/p
|
||||
/@infodir@/p
|
||||
/@localedir@/p
|
||||
/@mandir@/p'
|
||||
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
|
||||
*datarootdir*) ac_datarootdir_seen=yes;;
|
||||
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
|
||||
$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
|
||||
ac_datarootdir_hack='
|
||||
s&@datadir@&${datarootdir}&g
|
||||
s&@docdir@&${datarootdir}/doc/${PACKAGE_TARNAME}&g
|
||||
s&@infodir@&${datarootdir}/info&g
|
||||
s&@localedir@&${datarootdir}/locale&g
|
||||
s&@mandir@&${datarootdir}/man&g
|
||||
s&\${datarootdir}&${prefix}/share&g' ;;
|
||||
esac
|
||||
ac_sed_extra="
|
||||
|
||||
:t
|
||||
/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
|
||||
s|@configure_input@|$ac_sed_conf_input|;t t
|
||||
s&@top_builddir@&$ac_top_builddir_sub&;t t
|
||||
s&@top_build_prefix@&$ac_top_build_prefix&;t t
|
||||
s&@srcdir@&$ac_srcdir&;t t
|
||||
s&@abs_srcdir@&$ac_abs_srcdir&;t t
|
||||
s&@top_srcdir@&$ac_top_srcdir&;t t
|
||||
s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
|
||||
s&@builddir@&$ac_builddir&;t t
|
||||
s&@abs_builddir@&$ac_abs_builddir&;t t
|
||||
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
|
||||
$ac_datarootdir_hack
|
||||
"
|
||||
eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
|
||||
>$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
|
||||
|
||||
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
|
||||
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
|
||||
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
|
||||
"$ac_tmp/out"`; test -z "$ac_out"; } &&
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
|
||||
which seems to be undefined. Please make sure it is defined" >&5
|
||||
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
|
||||
which seems to be undefined. Please make sure it is defined" >&2;}
|
||||
|
||||
rm -f "$ac_tmp/stdin"
|
||||
case $ac_file in
|
||||
-) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
|
||||
*) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
|
||||
esac \
|
||||
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
|
||||
;;
|
||||
:H)
|
||||
#
|
||||
# CONFIG_HEADER
|
||||
#
|
||||
if test x"$ac_file" != x-; then
|
||||
{
|
||||
$as_echo "/* $configure_input */" \
|
||||
&& eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
|
||||
} >"$ac_tmp/config.h" \
|
||||
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
|
||||
if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
|
||||
$as_echo "$as_me: $ac_file is unchanged" >&6;}
|
||||
else
|
||||
rm -f "$ac_file"
|
||||
mv "$ac_tmp/config.h" "$ac_file" \
|
||||
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
|
||||
fi
|
||||
else
|
||||
$as_echo "/* $configure_input */" \
|
||||
&& eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
|
||||
|| as_fn_error $? "could not create -" "$LINENO" 5
|
||||
fi
|
||||
;;
|
||||
|
||||
|
||||
esac
|
||||
|
||||
done # for ac_tag
|
||||
|
||||
|
||||
as_fn_exit 0
|
1
td/generate/tl-parser/.gitignore
vendored
Normal file
1
td/generate/tl-parser/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
build/
|
20
td/generate/tl-parser/CMakeLists.txt
Normal file
20
td/generate/tl-parser/CMakeLists.txt
Normal file
@ -0,0 +1,20 @@
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
project(tl-parser)
|
||||
|
||||
set(SOURCES crc32.h crc32.c tlc.c tl-parser.c tl-parser.h tl-parser-tree.h tl-tl.h portable_endian.h)
|
||||
|
||||
if (WIN32)
|
||||
list(APPEND SOURCES wingetopt.c wingetopt.h)
|
||||
endif()
|
||||
if (MSVC)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "/SUBSYSTEM:CONSOLE")
|
||||
endif()
|
||||
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG .)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE .)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO .)
|
||||
|
||||
add_executable(${PROJECT_NAME} ${SOURCES})
|
||||
if (NOT WIN32)
|
||||
target_link_libraries(${PROJECT_NAME} m)
|
||||
endif()
|
339
td/generate/tl-parser/LICENSE
Normal file
339
td/generate/tl-parser/LICENSE
Normal file
@ -0,0 +1,339 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
1
td/generate/tl-parser/README.md
Normal file
1
td/generate/tl-parser/README.md
Normal file
@ -0,0 +1 @@
|
||||
Parse tl scheme to tlo file. Formely part of telegram-cli
|
663
td/generate/tl-parser/crc32.c
Normal file
663
td/generate/tl-parser/crc32.c
Normal file
@ -0,0 +1,663 @@
|
||||
/*
|
||||
This file is part of VK/KittenPHP-DB-Engine Library.
|
||||
|
||||
VK/KittenPHP-DB-Engine 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 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
VK/KittenPHP-DB-Engine 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 VK/KittenPHP-DB-Engine Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright 2009-2012 Vkontakte Ltd
|
||||
2009-2012 Nikolai Durov
|
||||
2009-2012 Andrei Lopatin
|
||||
2012 Anton Maydell
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "crc32.h"
|
||||
|
||||
static inline unsigned _bswap32(unsigned x) {
|
||||
return ((x << 24) & 0xff000000 ) |
|
||||
((x << 8) & 0x00ff0000 ) |
|
||||
((x >> 8) & 0x0000ff00 ) |
|
||||
((x >> 24) & 0x000000ff );
|
||||
}
|
||||
|
||||
unsigned int crc32_table[256] =
|
||||
{
|
||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
|
||||
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
|
||||
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
||||
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
|
||||
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
|
||||
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
|
||||
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
|
||||
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
|
||||
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
|
||||
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
|
||||
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
|
||||
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
|
||||
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
|
||||
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
|
||||
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
|
||||
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
|
||||
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
|
||||
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
|
||||
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
|
||||
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
|
||||
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
|
||||
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
|
||||
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
|
||||
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
|
||||
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
|
||||
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
|
||||
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
|
||||
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
|
||||
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
|
||||
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
|
||||
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
|
||||
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
|
||||
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
|
||||
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
|
||||
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
|
||||
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
|
||||
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
|
||||
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
|
||||
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
|
||||
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
|
||||
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
|
||||
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
|
||||
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
|
||||
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
|
||||
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
|
||||
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
|
||||
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
|
||||
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
|
||||
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
|
||||
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
|
||||
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
|
||||
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
|
||||
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
|
||||
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
|
||||
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
|
||||
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
|
||||
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
|
||||
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
|
||||
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
|
||||
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
|
||||
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
|
||||
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
|
||||
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
|
||||
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
|
||||
};
|
||||
|
||||
unsigned int crc32_table2[256] =
|
||||
{
|
||||
0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3,
|
||||
0x646cc504, 0x7d77f445, 0x565aa786, 0x4f4196c7,
|
||||
0xc8d98a08, 0xd1c2bb49, 0xfaefe88a, 0xe3f4d9cb,
|
||||
0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, 0x87981ccf,
|
||||
0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192,
|
||||
0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496,
|
||||
0x821b9859, 0x9b00a918, 0xb02dfadb, 0xa936cb9a,
|
||||
0xe6775d5d, 0xff6c6c1c, 0xd4413fdf, 0xcd5a0e9e,
|
||||
0x958424a2, 0x8c9f15e3, 0xa7b24620, 0xbea97761,
|
||||
0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265,
|
||||
0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69,
|
||||
0x39316bae, 0x202a5aef, 0x0b07092c, 0x121c386d,
|
||||
0xdf4636f3, 0xc65d07b2, 0xed705471, 0xf46b6530,
|
||||
0xbb2af3f7, 0xa231c2b6, 0x891c9175, 0x9007a034,
|
||||
0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38,
|
||||
0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c,
|
||||
0xf0794f05, 0xe9627e44, 0xc24f2d87, 0xdb541cc6,
|
||||
0x94158a01, 0x8d0ebb40, 0xa623e883, 0xbf38d9c2,
|
||||
0x38a0c50d, 0x21bbf44c, 0x0a96a78f, 0x138d96ce,
|
||||
0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca,
|
||||
0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97,
|
||||
0xded79850, 0xc7cca911, 0xece1fad2, 0xf5facb93,
|
||||
0x7262d75c, 0x6b79e61d, 0x4054b5de, 0x594f849f,
|
||||
0x160e1258, 0x0f152319, 0x243870da, 0x3d23419b,
|
||||
0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864,
|
||||
0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60,
|
||||
0xad24e1af, 0xb43fd0ee, 0x9f12832d, 0x8609b26c,
|
||||
0xc94824ab, 0xd05315ea, 0xfb7e4629, 0xe2657768,
|
||||
0x2f3f79f6, 0x362448b7, 0x1d091b74, 0x04122a35,
|
||||
0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31,
|
||||
0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d,
|
||||
0x838a36fa, 0x9a9107bb, 0xb1bc5478, 0xa8a76539,
|
||||
0x3b83984b, 0x2298a90a, 0x09b5fac9, 0x10aecb88,
|
||||
0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, 0x74c20e8c,
|
||||
0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180,
|
||||
0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484,
|
||||
0x71418a1a, 0x685abb5b, 0x4377e898, 0x5a6cd9d9,
|
||||
0x152d4f1e, 0x0c367e5f, 0x271b2d9c, 0x3e001cdd,
|
||||
0xb9980012, 0xa0833153, 0x8bae6290, 0x92b553d1,
|
||||
0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5,
|
||||
0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a,
|
||||
0xca6b79ed, 0xd37048ac, 0xf85d1b6f, 0xe1462a2e,
|
||||
0x66de36e1, 0x7fc507a0, 0x54e85463, 0x4df36522,
|
||||
0x02b2f3e5, 0x1ba9c2a4, 0x30849167, 0x299fa026,
|
||||
0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b,
|
||||
0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f,
|
||||
0x2c1c24b0, 0x350715f1, 0x1e2a4632, 0x07317773,
|
||||
0x4870e1b4, 0x516bd0f5, 0x7a468336, 0x635db277,
|
||||
0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, 0xe0d7848d,
|
||||
0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189,
|
||||
0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85,
|
||||
0x674f9842, 0x7e54a903, 0x5579fac0, 0x4c62cb81,
|
||||
0x8138c51f, 0x9823f45e, 0xb30ea79d, 0xaa1596dc,
|
||||
0xe554001b, 0xfc4f315a, 0xd7626299, 0xce7953d8,
|
||||
0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4,
|
||||
0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0,
|
||||
0x5e7ef3ec, 0x4765c2ad, 0x6c48916e, 0x7553a02f,
|
||||
0x3a1236e8, 0x230907a9, 0x0824546a, 0x113f652b,
|
||||
0x96a779e4, 0x8fbc48a5, 0xa4911b66, 0xbd8a2a27,
|
||||
0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23,
|
||||
0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e,
|
||||
0x70d024b9, 0x69cb15f8, 0x42e6463b, 0x5bfd777a,
|
||||
0xdc656bb5, 0xc57e5af4, 0xee530937, 0xf7483876,
|
||||
0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, 0x9324fd72,
|
||||
};
|
||||
|
||||
unsigned int crc32_table1[256] =
|
||||
{
|
||||
0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59,
|
||||
0x0709a8dc, 0x06cbc2eb, 0x048d7cb2, 0x054f1685,
|
||||
0x0e1351b8, 0x0fd13b8f, 0x0d9785d6, 0x0c55efe1,
|
||||
0x091af964, 0x08d89353, 0x0a9e2d0a, 0x0b5c473d,
|
||||
0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29,
|
||||
0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5,
|
||||
0x1235f2c8, 0x13f798ff, 0x11b126a6, 0x10734c91,
|
||||
0x153c5a14, 0x14fe3023, 0x16b88e7a, 0x177ae44d,
|
||||
0x384d46e0, 0x398f2cd7, 0x3bc9928e, 0x3a0bf8b9,
|
||||
0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065,
|
||||
0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901,
|
||||
0x3157bf84, 0x3095d5b3, 0x32d36bea, 0x331101dd,
|
||||
0x246be590, 0x25a98fa7, 0x27ef31fe, 0x262d5bc9,
|
||||
0x23624d4c, 0x22a0277b, 0x20e69922, 0x2124f315,
|
||||
0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71,
|
||||
0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad,
|
||||
0x709a8dc0, 0x7158e7f7, 0x731e59ae, 0x72dc3399,
|
||||
0x7793251c, 0x76514f2b, 0x7417f172, 0x75d59b45,
|
||||
0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, 0x7ccf6221,
|
||||
0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd,
|
||||
0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9,
|
||||
0x6bb5866c, 0x6a77ec5b, 0x68315202, 0x69f33835,
|
||||
0x62af7f08, 0x636d153f, 0x612bab66, 0x60e9c151,
|
||||
0x65a6d7d4, 0x6464bde3, 0x662203ba, 0x67e0698d,
|
||||
0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579,
|
||||
0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5,
|
||||
0x46c49a98, 0x4706f0af, 0x45404ef6, 0x448224c1,
|
||||
0x41cd3244, 0x400f5873, 0x4249e62a, 0x438b8c1d,
|
||||
0x54f16850, 0x55330267, 0x5775bc3e, 0x56b7d609,
|
||||
0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5,
|
||||
0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1,
|
||||
0x5deb9134, 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d,
|
||||
0xe1351b80, 0xe0f771b7, 0xe2b1cfee, 0xe373a5d9,
|
||||
0xe63cb35c, 0xe7fed96b, 0xe5b86732, 0xe47a0d05,
|
||||
0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461,
|
||||
0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd,
|
||||
0xfd13b8f0, 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9,
|
||||
0xfa1a102c, 0xfbd87a1b, 0xf99ec442, 0xf85cae75,
|
||||
0xf300e948, 0xf2c2837f, 0xf0843d26, 0xf1465711,
|
||||
0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd,
|
||||
0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339,
|
||||
0xde71f5bc, 0xdfb39f8b, 0xddf521d2, 0xdc374be5,
|
||||
0xd76b0cd8, 0xd6a966ef, 0xd4efd8b6, 0xd52db281,
|
||||
0xd062a404, 0xd1a0ce33, 0xd3e6706a, 0xd2241a5d,
|
||||
0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049,
|
||||
0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895,
|
||||
0xcb4dafa8, 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1,
|
||||
0xcc440774, 0xcd866d43, 0xcfc0d31a, 0xce02b92d,
|
||||
0x91af9640, 0x906dfc77, 0x922b422e, 0x93e92819,
|
||||
0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5,
|
||||
0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1,
|
||||
0x98b56f24, 0x99770513, 0x9b31bb4a, 0x9af3d17d,
|
||||
0x8d893530, 0x8c4b5f07, 0x8e0de15e, 0x8fcf8b69,
|
||||
0x8a809dec, 0x8b42f7db, 0x89044982, 0x88c623b5,
|
||||
0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1,
|
||||
0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d,
|
||||
0xa9e2d0a0, 0xa820ba97, 0xaa6604ce, 0xaba46ef9,
|
||||
0xaeeb787c, 0xaf29124b, 0xad6fac12, 0xacadc625,
|
||||
0xa7f18118, 0xa633eb2f, 0xa4755576, 0xa5b73f41,
|
||||
0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d,
|
||||
0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89,
|
||||
0xb2cddb0c, 0xb30fb13b, 0xb1490f62, 0xb08b6555,
|
||||
0xbbd72268, 0xba15485f, 0xb853f606, 0xb9919c31,
|
||||
0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, 0xbe9834ed,
|
||||
};
|
||||
|
||||
unsigned int crc32_table0[256] = {
|
||||
0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee,
|
||||
0x8f629757, 0x37def032, 0x256b5fdc, 0x9dd738b9,
|
||||
0xc5b428ef, 0x7d084f8a, 0x6fbde064, 0xd7018701,
|
||||
0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, 0x58631056,
|
||||
0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871,
|
||||
0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26,
|
||||
0x95ad7f70, 0x2d111815, 0x3fa4b7fb, 0x8718d09e,
|
||||
0x1acfe827, 0xa2738f42, 0xb0c620ac, 0x087a47c9,
|
||||
0xa032af3e, 0x188ec85b, 0x0a3b67b5, 0xb28700d0,
|
||||
0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787,
|
||||
0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f,
|
||||
0xeae41086, 0x525877e3, 0x40edd80d, 0xf851bf68,
|
||||
0xf02bf8a1, 0x48979fc4, 0x5a22302a, 0xe29e574f,
|
||||
0x7f496ff6, 0xc7f50893, 0xd540a77d, 0x6dfcc018,
|
||||
0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0,
|
||||
0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7,
|
||||
0x9b14583d, 0x23a83f58, 0x311d90b6, 0x89a1f7d3,
|
||||
0x1476cf6a, 0xaccaa80f, 0xbe7f07e1, 0x06c36084,
|
||||
0x5ea070d2, 0xe61c17b7, 0xf4a9b859, 0x4c15df3c,
|
||||
0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b,
|
||||
0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c,
|
||||
0x446f98f5, 0xfcd3ff90, 0xee66507e, 0x56da371b,
|
||||
0x0eb9274d, 0xb6054028, 0xa4b0efc6, 0x1c0c88a3,
|
||||
0x81dbb01a, 0x3967d77f, 0x2bd27891, 0x936e1ff4,
|
||||
0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed,
|
||||
0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba,
|
||||
0xfe92dfec, 0x462eb889, 0x549b1767, 0xec277002,
|
||||
0x71f048bb, 0xc94c2fde, 0xdbf98030, 0x6345e755,
|
||||
0x6b3fa09c, 0xd383c7f9, 0xc1366817, 0x798a0f72,
|
||||
0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825,
|
||||
0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d,
|
||||
0x21e91f24, 0x99557841, 0x8be0d7af, 0x335cb0ca,
|
||||
0xed59b63b, 0x55e5d15e, 0x47507eb0, 0xffec19d5,
|
||||
0x623b216c, 0xda874609, 0xc832e9e7, 0x708e8e82,
|
||||
0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a,
|
||||
0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d,
|
||||
0xbd40e1a4, 0x05fc86c1, 0x1749292f, 0xaff54e4a,
|
||||
0x322276f3, 0x8a9e1196, 0x982bbe78, 0x2097d91d,
|
||||
0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, 0x6a4166a5,
|
||||
0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2,
|
||||
0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb,
|
||||
0xc2098e52, 0x7ab5e937, 0x680046d9, 0xd0bc21bc,
|
||||
0x88df31ea, 0x3063568f, 0x22d6f961, 0x9a6a9e04,
|
||||
0x07bda6bd, 0xbf01c1d8, 0xadb46e36, 0x15080953,
|
||||
0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174,
|
||||
0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623,
|
||||
0xd8c66675, 0x607a0110, 0x72cfaefe, 0xca73c99b,
|
||||
0x57a4f122, 0xef189647, 0xfdad39a9, 0x45115ecc,
|
||||
0x764dee06, 0xcef18963, 0xdc44268d, 0x64f841e8,
|
||||
0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf,
|
||||
0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907,
|
||||
0x3c9b51be, 0x842736db, 0x96929935, 0x2e2efe50,
|
||||
0x2654b999, 0x9ee8defc, 0x8c5d7112, 0x34e11677,
|
||||
0xa9362ece, 0x118a49ab, 0x033fe645, 0xbb838120,
|
||||
0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98,
|
||||
0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf,
|
||||
0xd67f4138, 0x6ec3265d, 0x7c7689b3, 0xc4caeed6,
|
||||
0x591dd66f, 0xe1a1b10a, 0xf3141ee4, 0x4ba87981,
|
||||
0x13cb69d7, 0xab770eb2, 0xb9c2a15c, 0x017ec639,
|
||||
0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e,
|
||||
0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949,
|
||||
0x090481f0, 0xb1b8e695, 0xa30d497b, 0x1bb12e1e,
|
||||
0x43d23e48, 0xfb6e592d, 0xe9dbf6c3, 0x516791a6,
|
||||
0xccb0a91f, 0x740cce7a, 0x66b96194, 0xde0506f1,
|
||||
};
|
||||
|
||||
unsigned crc32_partial_old (const void *data, int len, unsigned crc) {
|
||||
const char *p = data;
|
||||
for (; len > 0; len--) {
|
||||
crc = crc32_table[(crc ^ *p++) & 0xff] ^ (crc >> 8);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
/*
|
||||
unsigned crc32_partial_fast (const void *data, int len, unsigned crc) {
|
||||
const int *p = (const int *) data;
|
||||
int x;
|
||||
for (x = (len >> 2); x > 0; x--) {
|
||||
crc ^= *p++;
|
||||
crc = crc32_table0[crc & 0xff] ^ crc32_table1[(crc & 0xff00) >> 8] ^ crc32_table2[(crc & 0xff0000) >> 16] ^ crc32_table[crc >> 24];
|
||||
}
|
||||
const char *q = (const char *) p;
|
||||
switch (len & 3) {
|
||||
case 3:
|
||||
crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
|
||||
case 2:
|
||||
crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
|
||||
case 1:
|
||||
crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
*/
|
||||
|
||||
unsigned crc32_partial (const void *data, int len, unsigned crc) {
|
||||
const int *p = (const int *) data;
|
||||
int x;
|
||||
#define DO_ONE(v) crc ^= v; crc = crc32_table0[crc & 0xff] ^ crc32_table1[(crc & 0xff00) >> 8] ^ crc32_table2[(crc & 0xff0000) >> 16] ^ crc32_table[crc >> 24];
|
||||
#define DO_FOUR(p) DO_ONE((p)[0]); DO_ONE((p)[1]); DO_ONE((p)[2]); DO_ONE((p)[3]);
|
||||
|
||||
for (x = (len >> 5); x > 0; x--) {
|
||||
DO_FOUR (p);
|
||||
DO_FOUR (p + 4);
|
||||
p += 8;
|
||||
}
|
||||
if (len & 16) {
|
||||
DO_FOUR (p);
|
||||
p += 4;
|
||||
}
|
||||
if (len & 8) {
|
||||
DO_ONE (p[0]);
|
||||
DO_ONE (p[1]);
|
||||
p += 2;
|
||||
}
|
||||
if (len & 4) {
|
||||
DO_ONE (*p++);
|
||||
}
|
||||
/*
|
||||
for (x = (len >> 2) & 7; x > 0; x--) {
|
||||
DO_ONE (*p++);
|
||||
}
|
||||
*/
|
||||
#undef DO_ONE
|
||||
#undef DO_FOUR
|
||||
const char *q = (const char *) p;
|
||||
if (len & 2) {
|
||||
crc = crc32_table[(crc ^ q[0]) & 0xff] ^ (crc >> 8);
|
||||
crc = crc32_table[(crc ^ q[1]) & 0xff] ^ (crc >> 8);
|
||||
q += 2;
|
||||
}
|
||||
if (len & 1) {
|
||||
crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
unsigned compute_crc32 (const void *data, int len) {
|
||||
return crc32_partial (data, len, -1) ^ -1;
|
||||
}
|
||||
|
||||
unsigned long long crc64_table[256] = {
|
||||
0x0000000000000000LL, 0xb32e4cbe03a75f6fLL, 0xf4843657a840a05bLL, 0x47aa7ae9abe7ff34LL,
|
||||
0x7bd0c384ff8f5e33LL, 0xc8fe8f3afc28015cLL, 0x8f54f5d357cffe68LL, 0x3c7ab96d5468a107LL,
|
||||
0xf7a18709ff1ebc66LL, 0x448fcbb7fcb9e309LL, 0x0325b15e575e1c3dLL, 0xb00bfde054f94352LL,
|
||||
0x8c71448d0091e255LL, 0x3f5f08330336bd3aLL, 0x78f572daa8d1420eLL, 0xcbdb3e64ab761d61LL,
|
||||
0x7d9ba13851336649LL, 0xceb5ed8652943926LL, 0x891f976ff973c612LL, 0x3a31dbd1fad4997dLL,
|
||||
0x064b62bcaebc387aLL, 0xb5652e02ad1b6715LL, 0xf2cf54eb06fc9821LL, 0x41e11855055bc74eLL,
|
||||
0x8a3a2631ae2dda2fLL, 0x39146a8fad8a8540LL, 0x7ebe1066066d7a74LL, 0xcd905cd805ca251bLL,
|
||||
0xf1eae5b551a2841cLL, 0x42c4a90b5205db73LL, 0x056ed3e2f9e22447LL, 0xb6409f5cfa457b28LL,
|
||||
0xfb374270a266cc92LL, 0x48190ecea1c193fdLL, 0x0fb374270a266cc9LL, 0xbc9d3899098133a6LL,
|
||||
0x80e781f45de992a1LL, 0x33c9cd4a5e4ecdceLL, 0x7463b7a3f5a932faLL, 0xc74dfb1df60e6d95LL,
|
||||
0x0c96c5795d7870f4LL, 0xbfb889c75edf2f9bLL, 0xf812f32ef538d0afLL, 0x4b3cbf90f69f8fc0LL,
|
||||
0x774606fda2f72ec7LL, 0xc4684a43a15071a8LL, 0x83c230aa0ab78e9cLL, 0x30ec7c140910d1f3LL,
|
||||
0x86ace348f355aadbLL, 0x3582aff6f0f2f5b4LL, 0x7228d51f5b150a80LL, 0xc10699a158b255efLL,
|
||||
0xfd7c20cc0cdaf4e8LL, 0x4e526c720f7dab87LL, 0x09f8169ba49a54b3LL, 0xbad65a25a73d0bdcLL,
|
||||
0x710d64410c4b16bdLL, 0xc22328ff0fec49d2LL, 0x85895216a40bb6e6LL, 0x36a71ea8a7ace989LL,
|
||||
0x0adda7c5f3c4488eLL, 0xb9f3eb7bf06317e1LL, 0xfe5991925b84e8d5LL, 0x4d77dd2c5823b7baLL,
|
||||
0x64b62bcaebc387a1LL, 0xd7986774e864d8ceLL, 0x90321d9d438327faLL, 0x231c512340247895LL,
|
||||
0x1f66e84e144cd992LL, 0xac48a4f017eb86fdLL, 0xebe2de19bc0c79c9LL, 0x58cc92a7bfab26a6LL,
|
||||
0x9317acc314dd3bc7LL, 0x2039e07d177a64a8LL, 0x67939a94bc9d9b9cLL, 0xd4bdd62abf3ac4f3LL,
|
||||
0xe8c76f47eb5265f4LL, 0x5be923f9e8f53a9bLL, 0x1c4359104312c5afLL, 0xaf6d15ae40b59ac0LL,
|
||||
0x192d8af2baf0e1e8LL, 0xaa03c64cb957be87LL, 0xeda9bca512b041b3LL, 0x5e87f01b11171edcLL,
|
||||
0x62fd4976457fbfdbLL, 0xd1d305c846d8e0b4LL, 0x96797f21ed3f1f80LL, 0x2557339fee9840efLL,
|
||||
0xee8c0dfb45ee5d8eLL, 0x5da24145464902e1LL, 0x1a083bacedaefdd5LL, 0xa9267712ee09a2baLL,
|
||||
0x955cce7fba6103bdLL, 0x267282c1b9c65cd2LL, 0x61d8f8281221a3e6LL, 0xd2f6b4961186fc89LL,
|
||||
0x9f8169ba49a54b33LL, 0x2caf25044a02145cLL, 0x6b055fede1e5eb68LL, 0xd82b1353e242b407LL,
|
||||
0xe451aa3eb62a1500LL, 0x577fe680b58d4a6fLL, 0x10d59c691e6ab55bLL, 0xa3fbd0d71dcdea34LL,
|
||||
0x6820eeb3b6bbf755LL, 0xdb0ea20db51ca83aLL, 0x9ca4d8e41efb570eLL, 0x2f8a945a1d5c0861LL,
|
||||
0x13f02d374934a966LL, 0xa0de61894a93f609LL, 0xe7741b60e174093dLL, 0x545a57dee2d35652LL,
|
||||
0xe21ac88218962d7aLL, 0x5134843c1b317215LL, 0x169efed5b0d68d21LL, 0xa5b0b26bb371d24eLL,
|
||||
0x99ca0b06e7197349LL, 0x2ae447b8e4be2c26LL, 0x6d4e3d514f59d312LL, 0xde6071ef4cfe8c7dLL,
|
||||
0x15bb4f8be788911cLL, 0xa6950335e42fce73LL, 0xe13f79dc4fc83147LL, 0x521135624c6f6e28LL,
|
||||
0x6e6b8c0f1807cf2fLL, 0xdd45c0b11ba09040LL, 0x9aefba58b0476f74LL, 0x29c1f6e6b3e0301bLL,
|
||||
0xc96c5795d7870f42LL, 0x7a421b2bd420502dLL, 0x3de861c27fc7af19LL, 0x8ec62d7c7c60f076LL,
|
||||
0xb2bc941128085171LL, 0x0192d8af2baf0e1eLL, 0x4638a2468048f12aLL, 0xf516eef883efae45LL,
|
||||
0x3ecdd09c2899b324LL, 0x8de39c222b3eec4bLL, 0xca49e6cb80d9137fLL, 0x7967aa75837e4c10LL,
|
||||
0x451d1318d716ed17LL, 0xf6335fa6d4b1b278LL, 0xb199254f7f564d4cLL, 0x02b769f17cf11223LL,
|
||||
0xb4f7f6ad86b4690bLL, 0x07d9ba1385133664LL, 0x4073c0fa2ef4c950LL, 0xf35d8c442d53963fLL,
|
||||
0xcf273529793b3738LL, 0x7c0979977a9c6857LL, 0x3ba3037ed17b9763LL, 0x888d4fc0d2dcc80cLL,
|
||||
0x435671a479aad56dLL, 0xf0783d1a7a0d8a02LL, 0xb7d247f3d1ea7536LL, 0x04fc0b4dd24d2a59LL,
|
||||
0x3886b22086258b5eLL, 0x8ba8fe9e8582d431LL, 0xcc0284772e652b05LL, 0x7f2cc8c92dc2746aLL,
|
||||
0x325b15e575e1c3d0LL, 0x8175595b76469cbfLL, 0xc6df23b2dda1638bLL, 0x75f16f0cde063ce4LL,
|
||||
0x498bd6618a6e9de3LL, 0xfaa59adf89c9c28cLL, 0xbd0fe036222e3db8LL, 0x0e21ac88218962d7LL,
|
||||
0xc5fa92ec8aff7fb6LL, 0x76d4de52895820d9LL, 0x317ea4bb22bfdfedLL, 0x8250e80521188082LL,
|
||||
0xbe2a516875702185LL, 0x0d041dd676d77eeaLL, 0x4aae673fdd3081deLL, 0xf9802b81de97deb1LL,
|
||||
0x4fc0b4dd24d2a599LL, 0xfceef8632775faf6LL, 0xbb44828a8c9205c2LL, 0x086ace348f355aadLL,
|
||||
0x34107759db5dfbaaLL, 0x873e3be7d8faa4c5LL, 0xc094410e731d5bf1LL, 0x73ba0db070ba049eLL,
|
||||
0xb86133d4dbcc19ffLL, 0x0b4f7f6ad86b4690LL, 0x4ce50583738cb9a4LL, 0xffcb493d702be6cbLL,
|
||||
0xc3b1f050244347ccLL, 0x709fbcee27e418a3LL, 0x3735c6078c03e797LL, 0x841b8ab98fa4b8f8LL,
|
||||
0xadda7c5f3c4488e3LL, 0x1ef430e13fe3d78cLL, 0x595e4a08940428b8LL, 0xea7006b697a377d7LL,
|
||||
0xd60abfdbc3cbd6d0LL, 0x6524f365c06c89bfLL, 0x228e898c6b8b768bLL, 0x91a0c532682c29e4LL,
|
||||
0x5a7bfb56c35a3485LL, 0xe955b7e8c0fd6beaLL, 0xaeffcd016b1a94deLL, 0x1dd181bf68bdcbb1LL,
|
||||
0x21ab38d23cd56ab6LL, 0x9285746c3f7235d9LL, 0xd52f0e859495caedLL, 0x6601423b97329582LL,
|
||||
0xd041dd676d77eeaaLL, 0x636f91d96ed0b1c5LL, 0x24c5eb30c5374ef1LL, 0x97eba78ec690119eLL,
|
||||
0xab911ee392f8b099LL, 0x18bf525d915feff6LL, 0x5f1528b43ab810c2LL, 0xec3b640a391f4fadLL,
|
||||
0x27e05a6e926952ccLL, 0x94ce16d091ce0da3LL, 0xd3646c393a29f297LL, 0x604a2087398eadf8LL,
|
||||
0x5c3099ea6de60cffLL, 0xef1ed5546e415390LL, 0xa8b4afbdc5a6aca4LL, 0x1b9ae303c601f3cbLL,
|
||||
0x56ed3e2f9e224471LL, 0xe5c372919d851b1eLL, 0xa26908783662e42aLL, 0x114744c635c5bb45LL,
|
||||
0x2d3dfdab61ad1a42LL, 0x9e13b115620a452dLL, 0xd9b9cbfcc9edba19LL, 0x6a978742ca4ae576LL,
|
||||
0xa14cb926613cf817LL, 0x1262f598629ba778LL, 0x55c88f71c97c584cLL, 0xe6e6c3cfcadb0723LL,
|
||||
0xda9c7aa29eb3a624LL, 0x69b2361c9d14f94bLL, 0x2e184cf536f3067fLL, 0x9d36004b35545910LL,
|
||||
0x2b769f17cf112238LL, 0x9858d3a9ccb67d57LL, 0xdff2a94067518263LL, 0x6cdce5fe64f6dd0cLL,
|
||||
0x50a65c93309e7c0bLL, 0xe388102d33392364LL, 0xa4226ac498dedc50LL, 0x170c267a9b79833fLL,
|
||||
0xdcd7181e300f9e5eLL, 0x6ff954a033a8c131LL, 0x28532e49984f3e05LL, 0x9b7d62f79be8616aLL,
|
||||
0xa707db9acf80c06dLL, 0x14299724cc279f02LL, 0x5383edcd67c06036LL, 0xe0ada17364673f59LL
|
||||
};
|
||||
|
||||
unsigned long long crc64_partial (const void *data, int len, unsigned long long crc) {
|
||||
const char *p = data;
|
||||
for (; len > 0; len--) {
|
||||
crc = crc64_table[(crc ^ *p++) & 0xff] ^ (crc >> 8);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
unsigned long long crc64 (const void *data, int len) {
|
||||
return crc64_partial (data, len, -1LL) ^ -1LL;
|
||||
}
|
||||
|
||||
static unsigned gf32_matrix_times (unsigned *matrix, unsigned vector) {
|
||||
unsigned sum = 0;
|
||||
while (vector) {
|
||||
if (vector & 1) {
|
||||
sum ^= *matrix;
|
||||
}
|
||||
vector >>= 1;
|
||||
matrix++;
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
static void gf32_matrix_square (unsigned *square, unsigned *matrix) {
|
||||
int n = 0;
|
||||
do {
|
||||
square[n] = gf32_matrix_times (matrix, matrix[n]);
|
||||
} while (++n < 32);
|
||||
}
|
||||
|
||||
unsigned compute_crc32_combine (unsigned crc1, unsigned crc2, int len2) {
|
||||
assert (len2 < (1 << 29));
|
||||
static int power_buf_initialized = 0;
|
||||
static unsigned power_buf[1024];
|
||||
int n;
|
||||
/* degenerate case (also disallow negative lengths) */
|
||||
if (len2 <= 0) {
|
||||
return crc1;
|
||||
}
|
||||
if (!power_buf_initialized) {
|
||||
power_buf[0] = 0xedb88320UL;
|
||||
for (n = 0; n < 31; n++) {
|
||||
power_buf[n+1] = 1U << n;
|
||||
}
|
||||
for (n = 1; n < 32; n++) {
|
||||
gf32_matrix_square (power_buf + (n << 5), power_buf + ((n - 1) << 5));
|
||||
}
|
||||
power_buf_initialized = 1;
|
||||
}
|
||||
|
||||
unsigned int *p = power_buf + 64;
|
||||
do {
|
||||
p += 32;
|
||||
if (len2 & 1) {
|
||||
crc1 = gf32_matrix_times (p, crc1);
|
||||
}
|
||||
len2 >>= 1;
|
||||
} while (len2);
|
||||
return crc1 ^ crc2;
|
||||
}
|
||||
|
||||
|
||||
/********************************* crc32 repair ************************/
|
||||
struct fcb_table_entry {
|
||||
unsigned p; //zeta ^ k
|
||||
int i;
|
||||
};
|
||||
|
||||
static inline unsigned gf32_mod (unsigned long long r, int high_bit) {
|
||||
int j = high_bit;
|
||||
for (j = high_bit; j >= 32; j--) {
|
||||
if ((1ULL << j) & r) {
|
||||
r ^= 0x04C11DB7ULL << (j - 32);
|
||||
}
|
||||
}
|
||||
return (unsigned) r;
|
||||
}
|
||||
|
||||
static unsigned gf32_mult (unsigned a, unsigned b) {
|
||||
int i;
|
||||
const unsigned long long m = b;
|
||||
unsigned long long r = 0;
|
||||
for (i = 0; i < 32; i++) {
|
||||
if (a & (1U << i)) {
|
||||
r ^= m << i;
|
||||
}
|
||||
}
|
||||
return gf32_mod (r, 62);
|
||||
}
|
||||
|
||||
static unsigned gf32_shl (unsigned int a, int shift) {
|
||||
unsigned long long r = a;
|
||||
r <<= shift;
|
||||
return gf32_mod (r, 31 + shift);
|
||||
}
|
||||
|
||||
static unsigned gf32_pow (unsigned a, int k) {
|
||||
if (!k) { return 1; }
|
||||
unsigned x = gf32_pow (gf32_mult (a, a), k >> 1);
|
||||
if (k & 1) {
|
||||
x = gf32_mult (x, a);
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
static int cmp_fcb_table_entry (const void *a, const void *b) {
|
||||
const struct fcb_table_entry *x = a;
|
||||
const struct fcb_table_entry *y = b;
|
||||
if (x->p < y->p) { return -1; }
|
||||
if (x->p > y->p) { return 1; }
|
||||
if (x->i < y->i) { return -1; }
|
||||
if (x->i > y->i) { return 1; }
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define GROUP_SWAP(x,m,s) ((x & m) << s) | ((x & (~m)) >> s)
|
||||
static unsigned revbin (unsigned x) {
|
||||
x = GROUP_SWAP(x,0x55555555U,1);
|
||||
x = GROUP_SWAP(x,0x33333333U,2);
|
||||
x = GROUP_SWAP(x,0x0f0f0f0fU,4);
|
||||
x = _bswap32 (x);
|
||||
return x;
|
||||
}
|
||||
#undef GROUP_SWAP
|
||||
|
||||
static inline unsigned xmult (unsigned a) {
|
||||
unsigned r = a << 1;
|
||||
if (a & (1U<<31)) {
|
||||
r ^= 0x04C11DB7U;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
static int find_corrupted_bit (int size, unsigned d) {
|
||||
int i, j;
|
||||
size += 4;
|
||||
d = revbin (d);
|
||||
int n = size << 3;
|
||||
int r = (int) (sqrt (n) + 0.5);
|
||||
struct fcb_table_entry *T = calloc (r, sizeof (struct fcb_table_entry));
|
||||
assert (T != NULL);
|
||||
T[0].i = 0;
|
||||
T[0].p = 1;
|
||||
for (i = 1; i < r; i++) {
|
||||
T[i].i = i;
|
||||
T[i].p = xmult (T[i-1].p);
|
||||
}
|
||||
assert (xmult (0x82608EDB) == 1);
|
||||
qsort (T, r, sizeof (T[0]), cmp_fcb_table_entry);
|
||||
unsigned q = gf32_pow (0x82608EDB, r);
|
||||
|
||||
unsigned A[32];
|
||||
for (i = 0; i < 32; i++) {
|
||||
A[i] = gf32_shl (q, i);
|
||||
}
|
||||
|
||||
unsigned x = d;
|
||||
int max_j = n / r, res = -1;
|
||||
for (j = 0; j <= max_j; j++) {
|
||||
int a = -1, b = r;
|
||||
while (b - a > 1) {
|
||||
int c = ((a + b) >> 1);
|
||||
if (T[c].p <= x) { a = c; } else { b = c; }
|
||||
}
|
||||
if (a >= 0 && T[a].p == x) {
|
||||
res = T[a].i + r * j;
|
||||
break;
|
||||
}
|
||||
x = gf32_matrix_times (A, x);
|
||||
}
|
||||
free (T);
|
||||
return res;
|
||||
}
|
||||
|
||||
static int repair_bit (unsigned char *input, int l, int k) {
|
||||
if (k < 0) {
|
||||
return -1;
|
||||
}
|
||||
int idx = k >> 5, bit = k & 31, i = (l - 1) - (idx - 1) * 4;
|
||||
while (bit >= 8) {
|
||||
i--;
|
||||
bit -= 8;
|
||||
}
|
||||
if (i < 0) {
|
||||
return -2;
|
||||
}
|
||||
if (i >= l) {
|
||||
return -3;
|
||||
}
|
||||
int j = 7 - bit;
|
||||
input[i] ^= 1 << j;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int crc32_check_and_repair (void *input, int l, unsigned *input_crc32, int force_exit) {
|
||||
unsigned computed_crc32 = compute_crc32 (input, l);
|
||||
const unsigned crc32_diff = computed_crc32 ^ (*input_crc32);
|
||||
if (!crc32_diff) {
|
||||
return 0;
|
||||
}
|
||||
int k = find_corrupted_bit (l, crc32_diff);
|
||||
int r = repair_bit (input, l, k);
|
||||
if (!r) {
|
||||
assert (compute_crc32 (input, l) == *input_crc32);
|
||||
return 1;
|
||||
}
|
||||
if (!(crc32_diff & (crc32_diff - 1))) { /* crc32_diff is power of 2 */
|
||||
*input_crc32 = computed_crc32;
|
||||
return 2;
|
||||
}
|
||||
assert (!force_exit);
|
||||
*input_crc32 = computed_crc32;
|
||||
return -1;
|
||||
}
|
59
td/generate/tl-parser/crc32.h
Normal file
59
td/generate/tl-parser/crc32.h
Normal file
@ -0,0 +1,59 @@
|
||||
/*
|
||||
This file is part of VK/KittenPHP-DB-Engine Library.
|
||||
|
||||
VK/KittenPHP-DB-Engine 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 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
VK/KittenPHP-DB-Engine 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 VK/KittenPHP-DB-Engine Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright 2009-2012 Vkontakte Ltd
|
||||
2009-2012 Nikolai Durov
|
||||
2009-2012 Andrei Lopatin
|
||||
2012 Anton Maydell
|
||||
*/
|
||||
|
||||
#ifndef __CRC32_H__
|
||||
#define __CRC32_H__
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern unsigned int crc32_table[256];
|
||||
unsigned crc32_partial (const void *data, int len, unsigned crc);
|
||||
//unsigned crc32_partial_fast (const void *data, int len, unsigned crc);
|
||||
//unsigned crc32_partial_fastest (const void *data, int len, unsigned crc);
|
||||
unsigned compute_crc32 (const void *data, int len);
|
||||
unsigned compute_crc32_combine (unsigned crc1, unsigned crc2, int len2);
|
||||
|
||||
extern unsigned long long crc64_table[256];
|
||||
unsigned long long crc64_partial (const void *data, int len, unsigned long long crc);
|
||||
unsigned long long crc64 (const void *data, int len);
|
||||
|
||||
//unsigned gf32_matrix_times (unsigned *matrix, unsigned vector);
|
||||
|
||||
/* crc32_check_and_repair returns
|
||||
0 : Cyclic redundancy check is ok
|
||||
1 : Cyclic redundancy check fails, but we fix one bit in input
|
||||
2 : Cyclic redundancy check fails, but we fix one bit in input_crc32
|
||||
-1 : Cyclic redundancy check fails, no repair possible.
|
||||
In this case *input_crc32 will be equal crc32 (input, l)
|
||||
|
||||
Case force_exit == 1 (case 1, 2: kprintf call, case -1: assert fail).
|
||||
*/
|
||||
int crc32_check_and_repair (void *input, int l, unsigned *input_crc32, int force_exit);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
124
td/generate/tl-parser/portable_endian.h
Normal file
124
td/generate/tl-parser/portable_endian.h
Normal file
@ -0,0 +1,124 @@
|
||||
// "License": Public Domain
|
||||
// I, Mathias Panzenböck, place this file hereby into the public domain. Use it at your own risk for whatever you like.
|
||||
// In case there are jurisdictions that don't support putting things in the public domain you can also consider it to
|
||||
// be "dual licensed" under the BSD, MIT and Apache licenses, if you want to. This code is trivial anyway. Consider it
|
||||
// an example on how to get the endian conversion functions on different platforms.
|
||||
|
||||
/* Originally cloned from https://gist.github.com/PkmX/63dd23f28ba885be53a5
|
||||
* Commit was: 1eca2ab34f2301b9641aa73d1016b951fff3fc39
|
||||
* Re-published at https://github.com/BenWiederhake/portable-endian.h to provide a means to submit patches and report issues. */
|
||||
|
||||
#ifndef PORTABLE_ENDIAN_H__
|
||||
#define PORTABLE_ENDIAN_H__
|
||||
|
||||
#if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) && !defined(__WINDOWS__)
|
||||
|
||||
# define __WINDOWS__
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__linux__) || defined(__CYGWIN__)
|
||||
|
||||
# include <endian.h>
|
||||
|
||||
#elif defined(__APPLE__)
|
||||
|
||||
# include <libkern/OSByteOrder.h>
|
||||
|
||||
# define htobe16(x) OSSwapHostToBigInt16(x)
|
||||
# define htole16(x) OSSwapHostToLittleInt16(x)
|
||||
# define be16toh(x) OSSwapBigToHostInt16(x)
|
||||
# define le16toh(x) OSSwapLittleToHostInt16(x)
|
||||
|
||||
# define htobe32(x) OSSwapHostToBigInt32(x)
|
||||
# define htole32(x) OSSwapHostToLittleInt32(x)
|
||||
# define be32toh(x) OSSwapBigToHostInt32(x)
|
||||
# define le32toh(x) OSSwapLittleToHostInt32(x)
|
||||
|
||||
# define htobe64(x) OSSwapHostToBigInt64(x)
|
||||
# define htole64(x) OSSwapHostToLittleInt64(x)
|
||||
# define be64toh(x) OSSwapBigToHostInt64(x)
|
||||
# define le64toh(x) OSSwapLittleToHostInt64(x)
|
||||
|
||||
# define __BYTE_ORDER BYTE_ORDER
|
||||
# define __BIG_ENDIAN BIG_ENDIAN
|
||||
# define __LITTLE_ENDIAN LITTLE_ENDIAN
|
||||
# define __PDP_ENDIAN PDP_ENDIAN
|
||||
|
||||
#elif defined(__OpenBSD__)
|
||||
|
||||
# include <sys/endian.h>
|
||||
|
||||
#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
|
||||
|
||||
# include <sys/endian.h>
|
||||
|
||||
# define be16toh(x) betoh16(x)
|
||||
# define le16toh(x) letoh16(x)
|
||||
|
||||
# define be32toh(x) betoh32(x)
|
||||
# define le32toh(x) letoh32(x)
|
||||
|
||||
# define be64toh(x) betoh64(x)
|
||||
# define le64toh(x) letoh64(x)
|
||||
|
||||
#elif defined(__WINDOWS__)
|
||||
|
||||
# include <winsock2.h>
|
||||
# ifdef __MINGW32__
|
||||
# include <sys/param.h>
|
||||
# endif
|
||||
|
||||
# if BYTE_ORDER == LITTLE_ENDIAN
|
||||
|
||||
# define htobe16(x) htons(x)
|
||||
# define htole16(x) (x)
|
||||
# define be16toh(x) ntohs(x)
|
||||
# define le16toh(x) (x)
|
||||
|
||||
# define htobe32(x) htonl(x)
|
||||
# define htole32(x) (x)
|
||||
# define be32toh(x) ntohl(x)
|
||||
# define le32toh(x) (x)
|
||||
|
||||
# define htobe64(x) htonll(x)
|
||||
# define htole64(x) (x)
|
||||
# define be64toh(x) ntohll(x)
|
||||
# define le64toh(x) (x)
|
||||
|
||||
# elif BYTE_ORDER == BIG_ENDIAN
|
||||
|
||||
/* that would be xbox 360 */
|
||||
# define htobe16(x) (x)
|
||||
# define htole16(x) __builtin_bswap16(x)
|
||||
# define be16toh(x) (x)
|
||||
# define le16toh(x) __builtin_bswap16(x)
|
||||
|
||||
# define htobe32(x) (x)
|
||||
# define htole32(x) __builtin_bswap32(x)
|
||||
# define be32toh(x) (x)
|
||||
# define le32toh(x) __builtin_bswap32(x)
|
||||
|
||||
# define htobe64(x) (x)
|
||||
# define htole64(x) __builtin_bswap64(x)
|
||||
# define be64toh(x) (x)
|
||||
# define le64toh(x) __builtin_bswap64(x)
|
||||
|
||||
# else
|
||||
|
||||
# error byte order not supported
|
||||
|
||||
# endif
|
||||
|
||||
# define __BYTE_ORDER BYTE_ORDER
|
||||
# define __BIG_ENDIAN BIG_ENDIAN
|
||||
# define __LITTLE_ENDIAN LITTLE_ENDIAN
|
||||
# define __PDP_ENDIAN PDP_ENDIAN
|
||||
|
||||
#else
|
||||
|
||||
# error platform not supported
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
178
td/generate/tl-parser/tl-parser-tree.h
Normal file
178
td/generate/tl-parser/tl-parser-tree.h
Normal file
@ -0,0 +1,178 @@
|
||||
/*
|
||||
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 2013-2014
|
||||
*/
|
||||
#ifndef __TREE_H__
|
||||
#define __TREE_H__
|
||||
#include <stdio.h>
|
||||
|
||||
#include <memory.h>
|
||||
#include <assert.h>
|
||||
|
||||
#pragma pack(push,4)
|
||||
#define DEFINE_TREE(X_NAME, X_TYPE, X_CMP, X_UNSET) \
|
||||
struct tree_ ## X_NAME { \
|
||||
struct tree_ ## X_NAME *left, *right;\
|
||||
X_TYPE x;\
|
||||
int y;\
|
||||
};\
|
||||
\
|
||||
static struct tree_ ## X_NAME *new_tree_node_ ## X_NAME (X_TYPE x, int y) {\
|
||||
struct tree_ ## X_NAME *T = malloc (sizeof (*T));\
|
||||
T->x = x;\
|
||||
T->y = y;\
|
||||
T->left = T->right = 0;\
|
||||
return T;\
|
||||
}\
|
||||
\
|
||||
static void delete_tree_node_ ## X_NAME (struct tree_ ## X_NAME *T) {\
|
||||
free (T);\
|
||||
}\
|
||||
\
|
||||
static void tree_split_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x, struct tree_ ## X_NAME **L, struct tree_ ## X_NAME **R) {\
|
||||
if (!T) {\
|
||||
*L = *R = 0;\
|
||||
} else {\
|
||||
int c = X_CMP (x, T->x);\
|
||||
if (c < 0) {\
|
||||
tree_split_ ## X_NAME (T->left, x, L, &T->left);\
|
||||
*R = T;\
|
||||
} else {\
|
||||
tree_split_ ## X_NAME (T->right, x, &T->right, R);\
|
||||
*L = T;\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
static struct tree_ ## X_NAME *tree_insert_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x, int y) __attribute__ ((warn_unused_result,unused));\
|
||||
static struct tree_ ## X_NAME *tree_insert_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x, int y) {\
|
||||
if (!T) {\
|
||||
return new_tree_node_ ## X_NAME (x, y);\
|
||||
} else {\
|
||||
if (y > T->y) {\
|
||||
struct tree_ ## X_NAME *N = new_tree_node_ ## X_NAME (x, y);\
|
||||
tree_split_ ## X_NAME (T, x, &N->left, &N->right);\
|
||||
return N;\
|
||||
} else {\
|
||||
int c = X_CMP (x, T->x);\
|
||||
assert (c);\
|
||||
if (c < 0) { \
|
||||
T->left = tree_insert_ ## X_NAME (T->left, x, y);\
|
||||
} else { \
|
||||
T->right = tree_insert_ ## X_NAME (T->right, x, y);\
|
||||
} \
|
||||
return T; \
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
static struct tree_ ## X_NAME *tree_merge_ ## X_NAME (struct tree_ ## X_NAME *L, struct tree_ ## X_NAME *R) {\
|
||||
if (!L || !R) {\
|
||||
return L ? L : R;\
|
||||
} else {\
|
||||
if (L->y > R->y) {\
|
||||
L->right = tree_merge_ ## X_NAME (L->right, R);\
|
||||
return L;\
|
||||
} else {\
|
||||
R->left = tree_merge_ ## X_NAME (L, R->left);\
|
||||
return R;\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
static struct tree_ ## X_NAME *tree_delete_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x) __attribute__ ((warn_unused_result,unused));\
|
||||
static struct tree_ ## X_NAME *tree_delete_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x) {\
|
||||
assert (T);\
|
||||
int c = X_CMP (x, T->x);\
|
||||
if (!c) {\
|
||||
struct tree_ ## X_NAME *N = tree_merge_ ## X_NAME (T->left, T->right);\
|
||||
delete_tree_node_ ## X_NAME (T);\
|
||||
return N;\
|
||||
} else {\
|
||||
if (c < 0) { \
|
||||
T->left = tree_delete_ ## X_NAME (T->left, x); \
|
||||
} else { \
|
||||
T->right = tree_delete_ ## X_NAME (T->right, x); \
|
||||
} \
|
||||
return T; \
|
||||
}\
|
||||
}\
|
||||
\
|
||||
static X_TYPE tree_get_min_ ## X_NAME (struct tree_ ## X_NAME *t) __attribute__ ((unused));\
|
||||
static X_TYPE tree_get_min_ ## X_NAME (struct tree_ ## X_NAME *T) {\
|
||||
if (!T) { return X_UNSET; } \
|
||||
while (T->left) { T = T->left; }\
|
||||
return T->x; \
|
||||
} \
|
||||
\
|
||||
static X_TYPE tree_lookup_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x) __attribute__ ((unused));\
|
||||
static X_TYPE tree_lookup_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x) {\
|
||||
int c;\
|
||||
while (T && (c = X_CMP (x, T->x))) {\
|
||||
T = (c < 0 ? T->left : T->right);\
|
||||
}\
|
||||
return T ? T->x : X_UNSET;\
|
||||
}\
|
||||
\
|
||||
static void tree_act_ ## X_NAME (struct tree_ ## X_NAME *T, void (*act)(X_TYPE)) __attribute__ ((unused));\
|
||||
static void tree_act_ ## X_NAME (struct tree_ ## X_NAME *T, void (*act)(X_TYPE)) {\
|
||||
if (!T) { return; } \
|
||||
tree_act_ ## X_NAME (T->left, act); \
|
||||
act (T->x); \
|
||||
tree_act_ ## X_NAME (T->right, act); \
|
||||
}\
|
||||
\
|
||||
static void tree_act_ex_ ## X_NAME (struct tree_ ## X_NAME *T, void (*act)(X_TYPE, void *), void *extra) __attribute__ ((unused));\
|
||||
static void tree_act_ex_ ## X_NAME (struct tree_ ## X_NAME *T, void (*act)(X_TYPE, void *), void *extra) {\
|
||||
if (!T) { return; } \
|
||||
tree_act_ex_ ## X_NAME (T->left, act, extra); \
|
||||
act (T->x, extra); \
|
||||
tree_act_ex_ ## X_NAME (T->right, act, extra); \
|
||||
}\
|
||||
\
|
||||
static int tree_count_ ## X_NAME (struct tree_ ## X_NAME *T) __attribute__ ((unused));\
|
||||
static int tree_count_ ## X_NAME (struct tree_ ## X_NAME *T) { \
|
||||
if (!T) { return 0; }\
|
||||
return 1 + tree_count_ ## X_NAME (T->left) + tree_count_ ## X_NAME (T->right); \
|
||||
}\
|
||||
static void tree_check_ ## X_NAME (struct tree_ ## X_NAME *T) __attribute__ ((unused));\
|
||||
static void tree_check_ ## X_NAME (struct tree_ ## X_NAME *T) { \
|
||||
if (!T) { return; }\
|
||||
if (T->left) { \
|
||||
assert (T->left->y <= T->y);\
|
||||
assert (X_CMP (T->left->x, T->x) < 0); \
|
||||
}\
|
||||
if (T->right) { \
|
||||
assert (T->right->y <= T->y);\
|
||||
assert (X_CMP (T->right->x, T->x) > 0); \
|
||||
}\
|
||||
tree_check_ ## X_NAME (T->left); \
|
||||
tree_check_ ## X_NAME (T->right); \
|
||||
}\
|
||||
static struct tree_ ## X_NAME *tree_clear_ ## X_NAME (struct tree_ ## X_NAME *T) __attribute__ ((unused));\
|
||||
static struct tree_ ## X_NAME *tree_clear_ ## X_NAME (struct tree_ ## X_NAME *T) { \
|
||||
if (!T) { return 0; }\
|
||||
tree_clear_ ## X_NAME (T->left); \
|
||||
tree_clear_ ## X_NAME (T->right); \
|
||||
delete_tree_node_ ## X_NAME (T); \
|
||||
return 0; \
|
||||
} \
|
||||
|
||||
#define int_cmp(a,b) ((a) - (b))
|
||||
#pragma pack(pop)
|
||||
#endif
|
3127
td/generate/tl-parser/tl-parser.c
Normal file
3127
td/generate/tl-parser/tl-parser.c
Normal file
File diff suppressed because it is too large
Load Diff
221
td/generate/tl-parser/tl-parser.h
Normal file
221
td/generate/tl-parser/tl-parser.h
Normal file
@ -0,0 +1,221 @@
|
||||
/*
|
||||
This file is part of tgl-libary/tlc
|
||||
|
||||
Tgl-library/tlc is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Tgl-library/tlc 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this tgl-library/tlc. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright Vitaly Valtman 2014
|
||||
|
||||
It is derivative work of VK/KittenPHP-DB-Engine (https://github.com/vk-com/kphp-kdb/)
|
||||
Copyright 2012-2013 Vkontakte Ltd
|
||||
2012-2013 Vitaliy Valtman
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __TL_PARSER_NEW_H__
|
||||
#define __TL_PARSER_NEW_H__
|
||||
#if defined(WIN32) || defined(_WIN32)
|
||||
#define lrand48() rand()
|
||||
#define _PRINTF_INT64_ "I64"
|
||||
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
#define read _read
|
||||
#define write _write
|
||||
#define close _close
|
||||
#define lseek _lseek
|
||||
#define strdup _strdup
|
||||
#define __attribute__(x)
|
||||
#endif
|
||||
#else
|
||||
#define _PRINTF_INT64_ "ll"
|
||||
#endif
|
||||
|
||||
enum lex_type {
|
||||
lex_error,
|
||||
lex_char,
|
||||
lex_triple_minus,
|
||||
lex_uc_ident,
|
||||
lex_lc_ident,
|
||||
lex_eof,
|
||||
lex_final,
|
||||
lex_new,
|
||||
lex_none,
|
||||
lex_num,
|
||||
lex_empty
|
||||
};
|
||||
|
||||
|
||||
struct curlex {
|
||||
char *ptr;
|
||||
int len;
|
||||
enum lex_type type;
|
||||
int flags;
|
||||
};
|
||||
|
||||
struct parse {
|
||||
char *text;
|
||||
int pos;
|
||||
int len;
|
||||
int line;
|
||||
int line_pos;
|
||||
struct curlex lex;
|
||||
};
|
||||
|
||||
|
||||
enum tree_type {
|
||||
type_tl_program,
|
||||
type_fun_declarations,
|
||||
type_constr_declarations,
|
||||
type_declaration,
|
||||
type_combinator_decl,
|
||||
type_equals,
|
||||
type_partial_app_decl,
|
||||
type_final_decl,
|
||||
type_full_combinator_id,
|
||||
type_opt_args,
|
||||
type_args,
|
||||
type_args1,
|
||||
type_args2,
|
||||
type_args3,
|
||||
type_args4,
|
||||
type_boxed_type_ident,
|
||||
type_subexpr,
|
||||
type_partial_comb_app_decl,
|
||||
type_partial_type_app_decl,
|
||||
type_final_new,
|
||||
type_final_final,
|
||||
type_final_empty,
|
||||
// type_type,
|
||||
type_var_ident,
|
||||
type_var_ident_opt,
|
||||
type_multiplicity,
|
||||
type_type_term,
|
||||
type_term,
|
||||
type_percent,
|
||||
type_result_type,
|
||||
type_expr,
|
||||
type_nat_term,
|
||||
type_combinator_id,
|
||||
type_nat_const,
|
||||
type_type_ident,
|
||||
type_builtin_combinator_decl,
|
||||
type_exclam,
|
||||
type_optional_arg_def
|
||||
};
|
||||
|
||||
struct tree {
|
||||
char *text;
|
||||
int len;
|
||||
enum tree_type type;
|
||||
int lex_line;
|
||||
int lex_line_pos;
|
||||
int flags;
|
||||
int size;
|
||||
int nc;
|
||||
struct tree **c;
|
||||
};
|
||||
|
||||
|
||||
#define TL_ACT(x) (x == act_var ? "act_var" : x == act_field ? "act_field" : x == act_plus ? "act_plus" : x == act_type ? "act_type" : x == act_nat_const ? "act_nat_const" : x == act_array ? "act_array" : x == act_question_mark ? "act_question_mark" : \
|
||||
x == act_union ? "act_union" : x == act_arg ? "act_arg" : x == act_opt_field ? "act_opt_field" : "act_unknown")
|
||||
|
||||
#define TL_TYPE(x) (x == type_num ? "type_num" : x == type_type ? "type_type" : x == type_list_item ? "type_list_item" : x == type_list ? "type_list" : x == type_num_value ? "type_num_value" : "type_unknown")
|
||||
enum combinator_tree_action {
|
||||
act_var,
|
||||
act_field,
|
||||
act_plus,
|
||||
act_type,
|
||||
act_nat_const,
|
||||
act_array,
|
||||
act_question_mark,
|
||||
act_union,
|
||||
act_arg,
|
||||
act_opt_field
|
||||
};
|
||||
|
||||
enum combinator_tree_type {
|
||||
type_num,
|
||||
type_num_value,
|
||||
type_type,
|
||||
type_list_item,
|
||||
type_list
|
||||
};
|
||||
|
||||
struct tl_combinator_tree {
|
||||
enum combinator_tree_action act;
|
||||
struct tl_combinator_tree *left, *right;
|
||||
char *name;
|
||||
void *data;
|
||||
long long flags;
|
||||
enum combinator_tree_type type;
|
||||
int type_len;
|
||||
long long type_flags;
|
||||
};
|
||||
|
||||
|
||||
struct tl_program {
|
||||
int types_num;
|
||||
int functions_num;
|
||||
int constructors_num;
|
||||
struct tl_type **types;
|
||||
struct tl_function **functions;
|
||||
// struct tl_constuctor **constructors;
|
||||
};
|
||||
|
||||
struct tl_type {
|
||||
char *id;
|
||||
char *print_id;
|
||||
char *real_id;
|
||||
unsigned name;
|
||||
int flags;
|
||||
|
||||
int params_num;
|
||||
long long params_types;
|
||||
|
||||
int constructors_num;
|
||||
struct tl_constructor **constructors;
|
||||
};
|
||||
|
||||
struct tl_constructor {
|
||||
char *id;
|
||||
char *print_id;
|
||||
char *real_id;
|
||||
unsigned name;
|
||||
struct tl_type *type;
|
||||
|
||||
struct tl_combinator_tree *left;
|
||||
struct tl_combinator_tree *right;
|
||||
};
|
||||
|
||||
struct tl_var {
|
||||
char *id;
|
||||
struct tl_combinator_tree *ptr;
|
||||
int type;
|
||||
int flags;
|
||||
};
|
||||
|
||||
struct parse *tl_init_parse_file (const char *fname);
|
||||
struct tree *tl_parse_lex (struct parse *P);
|
||||
void tl_print_parse_error (void);
|
||||
struct tl_program *tl_parse (struct tree *T);
|
||||
|
||||
void write_types (int f);
|
||||
|
||||
#define FLAG_BARE 1
|
||||
#define FLAG_OPT_VAR (1 << 17)
|
||||
#define FLAG_EXCL (1 << 18)
|
||||
#define FLAG_OPT_FIELD (1 << 20)
|
||||
#define FLAG_IS_VAR (1 << 21)
|
||||
#define FLAG_DEFAULT_CONSTRUCTOR (1 << 25)
|
||||
#define FLAG_EMPTY (1 << 10)
|
||||
|
||||
#endif
|
55
td/generate/tl-parser/tl-tl.h
Normal file
55
td/generate/tl-parser/tl-tl.h
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
This file is part of VK/KittenPHP-DB-Engine.
|
||||
|
||||
VK/KittenPHP-DB-Engine is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
VK/KittenPHP-DB-Engine 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with VK/KittenPHP-DB-Engine. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
This program is released under the GPL with the additional exemption
|
||||
that compiling, linking, and/or using OpenSSL is allowed.
|
||||
You are free to remove this exemption from derived works.
|
||||
|
||||
Copyright 2012-2013 Vkontakte Ltd
|
||||
2012-2013 Vitaliy Valtman
|
||||
*/
|
||||
|
||||
#ifndef __TL_TL_H__
|
||||
#define __TL_TL_H__
|
||||
|
||||
// Current tl-tl schema is V2
|
||||
// See https://core.telegram.org/mtproto/TL-tl
|
||||
|
||||
#define TLS_SCHEMA_V2 0x3a2f9be2
|
||||
#define TLS_TYPE 0x12eb4386
|
||||
#define TLS_COMBINATOR 0x5c0a1ed5
|
||||
#define TLS_COMBINATOR_LEFT_BUILTIN 0xcd211f63
|
||||
#define TLS_COMBINATOR_LEFT 0x4c12c6d9
|
||||
#define TLS_COMBINATOR_RIGHT_V2 0x2c064372
|
||||
#define TLS_ARG_V2 0x29dfe61b
|
||||
|
||||
#define TLS_EXPR_TYPE 0xecc9da78
|
||||
#define TLS_EXPR_NAT 0xdcb49bd8
|
||||
|
||||
#define TLS_NAT_CONST 0xdcb49bd8
|
||||
#define TLS_NAT_VAR 0x4e8a14f0
|
||||
#define TLS_TYPE_VAR 0x0142ceae
|
||||
#define TLS_ARRAY 0xd9fb20de
|
||||
#define TLS_TYPE_EXPR 0xc1863d08
|
||||
|
||||
/* Deprecated (old versions), read-only */
|
||||
#define TLS_TREE_NAT_CONST 0xc09f07d7
|
||||
#define TLS_TREE_NAT_VAR 0x90ea6f58
|
||||
#define TLS_TREE_TYPE_VAR 0x1caa237a
|
||||
#define TLS_TREE_ARRAY 0x80479360
|
||||
#define TLS_TREE_TYPE 0x10f32190
|
||||
|
||||
#endif
|
183
td/generate/tl-parser/tlc.c
Normal file
183
td/generate/tl-parser/tlc.c
Normal file
@ -0,0 +1,183 @@
|
||||
/*
|
||||
This file is part of tl-parser
|
||||
|
||||
tl-parser is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
tl-parser 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this tl-parser. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright Vitaly Valtman 2014
|
||||
|
||||
It is derivative work of VK/KittenPHP-DB-Engine (https://github.com/vk-com/kphp-kdb/)
|
||||
Copyright 2012-2013 Vkontakte Ltd
|
||||
2012-2013 Vitaliy Valtman
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#include <io.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include "wingetopt.h"
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include "tl-parser.h"
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
#ifdef HAVE_EXECINFO_H
|
||||
#include <execinfo.h>
|
||||
#endif
|
||||
#include <stdarg.h>
|
||||
|
||||
int verbosity;
|
||||
int output_expressions;
|
||||
void usage (void) {
|
||||
printf ("usage: tl-parser [-v] [-h] <TL-schema-file>\n"
|
||||
"\tTL compiler\n"
|
||||
"\t-v\toutput statistical and debug information into stderr\n"
|
||||
"\t-E\twhenever is possible output to stdout expressions\n"
|
||||
"\t-e <file>\texport serialized schema to file\n"
|
||||
);
|
||||
exit (2);
|
||||
}
|
||||
|
||||
int vkext_write (const char *filename) {
|
||||
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
int f = 0;
|
||||
int r = _sopen_s(&f, filename, _O_CREAT | _O_WRONLY | _O_TRUNC | _O_BINARY, _SH_DENYNO, _S_IREAD | _S_IWRITE);
|
||||
if (r != 0)
|
||||
{
|
||||
fprintf(stderr, "Cannot write file %s\n", filename);
|
||||
abort();
|
||||
}
|
||||
#elif defined(WIN32) || defined(_WIN32)
|
||||
int f = open(filename, O_CREAT | O_WRONLY | O_TRUNC | O_BINARY, 0640);
|
||||
#else
|
||||
int f = open (filename, O_CREAT | O_WRONLY | O_TRUNC, 0640);
|
||||
#endif
|
||||
if (!f)
|
||||
{
|
||||
fprintf(stderr, "Cannot write file %s\n", filename);
|
||||
abort();
|
||||
}
|
||||
write_types (f);
|
||||
close (f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void logprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2)));
|
||||
void logprintf (const char *format __attribute__ ((unused)), ...) {
|
||||
va_list ap;
|
||||
va_start (ap, format);
|
||||
vfprintf (stderr, format, ap);
|
||||
va_end (ap);
|
||||
}
|
||||
|
||||
void hexdump (int *in_ptr, int *in_end) {
|
||||
int *ptr = in_ptr;
|
||||
while (ptr < in_end) { printf (" %08x", *(ptr ++)); }
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
#ifdef HAVE_EXECINFO_H
|
||||
void print_backtrace (void) {
|
||||
void *buffer[255];
|
||||
const int calls = backtrace (buffer, sizeof (buffer) / sizeof (void *));
|
||||
backtrace_symbols_fd (buffer, calls, 1);
|
||||
}
|
||||
#else
|
||||
void print_backtrace (void) {
|
||||
if (write (1, "No libexec. Backtrace disabled\n", 32) < 0) {
|
||||
// Sad thing
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void sig_segv_handler (int signum __attribute__ ((unused))) {
|
||||
if (write (1, "SIGSEGV received\n", 18) < 0) {
|
||||
// Sad thing
|
||||
}
|
||||
print_backtrace ();
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
void sig_abrt_handler (int signum __attribute__ ((unused))) {
|
||||
if (write (1, "SIGABRT received\n", 18) < 0) {
|
||||
// Sad thing
|
||||
}
|
||||
print_backtrace ();
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
signal (SIGSEGV, sig_segv_handler);
|
||||
signal (SIGABRT, sig_abrt_handler);
|
||||
int i;
|
||||
char *vkext_file = 0;
|
||||
while ((i = getopt (argc, argv, "Ehve:w:")) != -1) {
|
||||
switch (i) {
|
||||
case 'E':
|
||||
output_expressions++;
|
||||
break;
|
||||
case 'h':
|
||||
usage ();
|
||||
return 2;
|
||||
case 'e':
|
||||
vkext_file = optarg;
|
||||
break;
|
||||
case 'v':
|
||||
verbosity++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (argc != optind + 1) {
|
||||
usage ();
|
||||
}
|
||||
|
||||
|
||||
struct parse *P = tl_init_parse_file (argv[optind]);
|
||||
if (!P) {
|
||||
return 0;
|
||||
}
|
||||
struct tree *T;
|
||||
if (!(T = tl_parse_lex (P))) {
|
||||
fprintf (stderr, "Error in parse:\n");
|
||||
tl_print_parse_error ();
|
||||
return 0;
|
||||
} else {
|
||||
if (verbosity) {
|
||||
fprintf (stderr, "Parse ok\n");
|
||||
}
|
||||
if (!tl_parse (T)) {
|
||||
if (verbosity) {
|
||||
fprintf (stderr, "Fail\n");
|
||||
}
|
||||
return 1;
|
||||
} else {
|
||||
if (verbosity) {
|
||||
fprintf (stderr, "Ok\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (vkext_file) {
|
||||
vkext_write (vkext_file);
|
||||
}
|
||||
return 0;
|
||||
}
|
82
td/generate/tl-parser/wingetopt.c
Normal file
82
td/generate/tl-parser/wingetopt.c
Normal file
@ -0,0 +1,82 @@
|
||||
/*
|
||||
POSIX getopt for Windows
|
||||
|
||||
AT&T Public License
|
||||
|
||||
Code given out at the 1985 UNIFORUM conference in Dallas.
|
||||
*/
|
||||
|
||||
#ifndef __GNUC__
|
||||
|
||||
#include "wingetopt.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
#define EOF (-1)
|
||||
#define ERR(s, c) if(opterr){\
|
||||
char errbuf[2];\
|
||||
errbuf[0] = c; errbuf[1] = '\n';\
|
||||
fputs(argv[0], stderr);\
|
||||
fputs(s, stderr);\
|
||||
fputc(c, stderr);}
|
||||
//(void) write(2, argv[0], (unsigned)strlen(argv[0]));\
|
||||
//(void) write(2, s, (unsigned)strlen(s));\
|
||||
//(void) write(2, errbuf, 2);}
|
||||
|
||||
int opterr = 1;
|
||||
int optind = 1;
|
||||
int optopt;
|
||||
char *optarg;
|
||||
|
||||
int
|
||||
getopt(argc, argv, opts)
|
||||
int argc;
|
||||
char **argv, *opts;
|
||||
{
|
||||
static int sp = 1;
|
||||
register int c;
|
||||
register char *cp;
|
||||
|
||||
if (sp == 1)
|
||||
if (optind >= argc ||
|
||||
argv[optind][0] != '-' || argv[optind][1] == '\0')
|
||||
return(EOF);
|
||||
else if (strcmp(argv[optind], "--") == (int)NULL) {
|
||||
optind++;
|
||||
return(EOF);
|
||||
}
|
||||
optopt = c = argv[optind][sp];
|
||||
if (c == ':' || (cp = strchr(opts, c)) == NULL) {
|
||||
ERR(": illegal option -- ", c);
|
||||
if (argv[optind][++sp] == '\0') {
|
||||
optind++;
|
||||
sp = 1;
|
||||
}
|
||||
return('?');
|
||||
}
|
||||
if (*++cp == ':') {
|
||||
if (argv[optind][sp + 1] != '\0')
|
||||
optarg = &argv[optind++][sp + 1];
|
||||
else if (++optind >= argc) {
|
||||
ERR(": option requires an argument -- ", c);
|
||||
sp = 1;
|
||||
return('?');
|
||||
}
|
||||
else
|
||||
optarg = argv[optind++];
|
||||
sp = 1;
|
||||
}
|
||||
else {
|
||||
if (argv[optind][++sp] == '\0') {
|
||||
sp = 1;
|
||||
optind++;
|
||||
}
|
||||
optarg = NULL;
|
||||
}
|
||||
return(c);
|
||||
}
|
||||
|
||||
#endif /* __GNUC__ */
|
32
td/generate/tl-parser/wingetopt.h
Normal file
32
td/generate/tl-parser/wingetopt.h
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
POSIX getopt for Windows
|
||||
|
||||
AT&T Public License
|
||||
|
||||
Code given out at the 1985 UNIFORUM conference in Dallas.
|
||||
*/
|
||||
|
||||
#ifdef __GNUC__
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
#ifndef __GNUC__
|
||||
|
||||
#ifndef _WINGETOPT_H_
|
||||
#define _WINGETOPT_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int opterr;
|
||||
extern int optind;
|
||||
extern int optopt;
|
||||
extern char *optarg;
|
||||
extern int getopt(int argc, char **argv, char *opts);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _GETOPT_H_ */
|
||||
#endif /* __GNUC__ */
|
@ -504,7 +504,7 @@ class ClientManager::Impl final {
|
||||
if (response.request_id == 0 && response.object != nullptr &&
|
||||
response.object->get_id() == td_api::updateAuthorizationState::ID &&
|
||||
static_cast<const td_api::updateAuthorizationState *>(response.object.get())->authorization_state_->get_id() ==
|
||||
td_api::authorizationStateClosed::ID) {
|
||||
td_api::authorizationStateClosed::ID) {
|
||||
auto lock = impls_mutex_.lock_write().move_as_ok();
|
||||
close_impl(response.client_id);
|
||||
|
||||
|
@ -15973,8 +15973,6 @@ void ContactsManager::memory_cleanup(bool full) {
|
||||
secret_chats_with_user_.clear();
|
||||
secret_chats_with_user_.rehash(0);
|
||||
}
|
||||
dialog_invite_links_.clear();
|
||||
dialog_invite_links_.rehash(0);
|
||||
invite_link_infos_.clear();
|
||||
invite_link_infos_.rehash(0);
|
||||
dialog_access_by_invite_link_.clear();
|
||||
@ -16013,8 +16011,6 @@ void ContactsManager::memory_cleanup(bool full) {
|
||||
imported_contacts_.rehash(0);
|
||||
received_channel_participant_.clear();
|
||||
received_channel_participant_.rehash(0);
|
||||
received_channel_participants_.clear();
|
||||
received_channel_participants_.rehash(0);
|
||||
cached_channel_participants_.clear();
|
||||
cached_channel_participants_.rehash(0);
|
||||
load_contacts_queries_.clear();
|
||||
@ -16076,8 +16072,6 @@ void ContactsManager::memory_stats(vector<string> &output) {
|
||||
output.push_back(",");
|
||||
output.push_back("\"secret_chats_with_user_\":"); output.push_back(std::to_string(secret_chats_with_user_.size()));
|
||||
output.push_back(",");
|
||||
output.push_back("\"dialog_invite_links_\":"); output.push_back(std::to_string(dialog_invite_links_.size()));
|
||||
output.push_back(",");
|
||||
output.push_back("\"invite_link_infos_\":"); output.push_back(std::to_string(invite_link_infos_.size()));
|
||||
output.push_back(",");
|
||||
output.push_back("\"dialog_access_by_invite_link_\":"); output.push_back(std::to_string(dialog_access_by_invite_link_.size()));
|
||||
@ -16114,8 +16108,6 @@ void ContactsManager::memory_stats(vector<string> &output) {
|
||||
output.push_back(",");
|
||||
output.push_back("\"received_channel_participant_\":"); output.push_back(std::to_string(received_channel_participant_.size()));
|
||||
output.push_back(",");
|
||||
output.push_back("\"received_channel_participants_\":"); output.push_back(std::to_string(received_channel_participants_.size()));
|
||||
output.push_back(",");
|
||||
output.push_back("\"cached_channel_participants_\":"); output.push_back(std::to_string(cached_channel_participants_.size()));
|
||||
output.push_back(",");
|
||||
output.push_back("\"load_contacts_queries_\":"); output.push_back(std::to_string(load_contacts_queries_.size()));
|
||||
|
@ -5,11 +5,15 @@
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
#include "td/telegram/DialogDb.h"
|
||||
|
||||
#include "td/telegram/Version.h"
|
||||
|
||||
#include "td/actor/actor.h"
|
||||
#include "td/actor/SchedulerLocalStorage.h"
|
||||
|
||||
#include "td/db/SqliteConnectionSafe.h"
|
||||
#include "td/db/SqliteDb.h"
|
||||
#include "td/db/SqliteKeyValue.h"
|
||||
#include "td/db/SqliteStatement.h"
|
||||
|
||||
#include "td/utils/common.h"
|
||||
@ -22,58 +26,288 @@
|
||||
namespace td {
|
||||
// NB: must happen inside a transaction
|
||||
Status init_dialog_db(SqliteDb &db, int32 version, KeyValueSyncInterface &binlog_pmc, bool &was_created) {
|
||||
LOG(INFO) << "Init dialog database " << tag("version", version);
|
||||
was_created = false;
|
||||
|
||||
// Check if database exists
|
||||
TRY_RESULT(has_table, db.has_table("dialogs"));
|
||||
if (!has_table) {
|
||||
version = 0;
|
||||
}
|
||||
|
||||
if (version < static_cast<int32>(DbVersion::DialogDbCreated) || version > current_db_version()) {
|
||||
TRY_STATUS(drop_dialog_db(db, version));
|
||||
version = 0;
|
||||
}
|
||||
|
||||
auto create_notification_group_table = [&db] {
|
||||
return db.exec(
|
||||
"CREATE TABLE IF NOT EXISTS notification_groups (notification_group_id INT4 PRIMARY KEY, dialog_id "
|
||||
"INT8, last_notification_date INT4)");
|
||||
};
|
||||
|
||||
auto create_last_notification_date_index = [&db] {
|
||||
return db.exec(
|
||||
"CREATE INDEX IF NOT EXISTS notification_group_by_last_notification_date ON notification_groups "
|
||||
"(last_notification_date, dialog_id, notification_group_id) WHERE last_notification_date IS NOT NULL");
|
||||
};
|
||||
|
||||
auto add_dialogs_in_folder_index = [&db] {
|
||||
return db.exec(
|
||||
"CREATE INDEX IF NOT EXISTS dialog_in_folder_by_dialog_order ON dialogs (folder_id, dialog_order, dialog_id) "
|
||||
"WHERE folder_id IS NOT NULL");
|
||||
};
|
||||
|
||||
if (version == 0) {
|
||||
LOG(INFO) << "Create new dialog database";
|
||||
was_created = true;
|
||||
TRY_STATUS(
|
||||
db.exec("CREATE TABLE IF NOT EXISTS dialogs (dialog_id INT8 PRIMARY KEY, dialog_order INT8, data BLOB, "
|
||||
"folder_id INT4)"));
|
||||
TRY_STATUS(create_notification_group_table());
|
||||
TRY_STATUS(create_last_notification_date_index());
|
||||
TRY_STATUS(add_dialogs_in_folder_index());
|
||||
version = current_db_version();
|
||||
}
|
||||
if (version < static_cast<int32>(DbVersion::AddNotificationsSupport)) {
|
||||
TRY_STATUS(create_notification_group_table());
|
||||
TRY_STATUS(create_last_notification_date_index());
|
||||
}
|
||||
if (version < static_cast<int32>(DbVersion::AddFolders)) {
|
||||
TRY_STATUS(db.exec("DROP INDEX IF EXISTS dialog_by_dialog_order"));
|
||||
TRY_STATUS(db.exec("ALTER TABLE dialogs ADD COLUMN folder_id INT4"));
|
||||
TRY_STATUS(add_dialogs_in_folder_index());
|
||||
TRY_STATUS(db.exec("UPDATE dialogs SET folder_id = 0 WHERE dialog_id < -1500000000000 AND dialog_order > 0"));
|
||||
}
|
||||
if (version < static_cast<int32>(DbVersion::StorePinnedDialogsInBinlog)) {
|
||||
// 9221294780217032704 == get_dialog_order(Auto(), MIN_PINNED_DIALOG_DATE - 1)
|
||||
TRY_RESULT(get_pinned_dialogs_stmt,
|
||||
db.get_statement("SELECT dialog_id FROM dialogs WHERE folder_id == ?1 AND dialog_order > "
|
||||
"9221294780217032704 ORDER BY dialog_order DESC, dialog_id DESC"));
|
||||
for (auto folder_id = 0; folder_id < 2; folder_id++) {
|
||||
vector<string> pinned_dialog_ids;
|
||||
TRY_STATUS(get_pinned_dialogs_stmt.bind_int32(1, folder_id));
|
||||
TRY_STATUS(get_pinned_dialogs_stmt.step());
|
||||
while (get_pinned_dialogs_stmt.has_row()) {
|
||||
pinned_dialog_ids.push_back(PSTRING() << get_pinned_dialogs_stmt.view_int64(0));
|
||||
TRY_STATUS(get_pinned_dialogs_stmt.step());
|
||||
}
|
||||
get_pinned_dialogs_stmt.reset();
|
||||
|
||||
binlog_pmc.set(PSTRING() << "pinned_dialog_ids" << folder_id, implode(pinned_dialog_ids, ','));
|
||||
}
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
// NB: must happen inside a transaction
|
||||
Status drop_dialog_db(SqliteDb &db, int version) {
|
||||
return Status::OK();
|
||||
if (version < static_cast<int32>(DbVersion::DialogDbCreated)) {
|
||||
LOG(WARNING) << "Drop old pmc dialog_db";
|
||||
SqliteKeyValue kv;
|
||||
kv.init_with_connection(db.clone(), "common").ensure();
|
||||
kv.erase_by_prefix("di");
|
||||
}
|
||||
|
||||
LOG(WARNING) << "Drop dialog_db " << tag("version", version) << tag("current_db_version", current_db_version());
|
||||
auto status = db.exec("DROP TABLE IF EXISTS dialogs");
|
||||
TRY_STATUS(db.exec("DROP TABLE IF EXISTS notification_groups"));
|
||||
return status;
|
||||
}
|
||||
|
||||
class DialogDbImpl : public DialogDbSyncInterface {
|
||||
public:
|
||||
explicit DialogDbImpl(SqliteDb db) {
|
||||
explicit DialogDbImpl(SqliteDb db) : db_(std::move(db)) {
|
||||
init().ensure();
|
||||
}
|
||||
|
||||
Status init() {
|
||||
TRY_RESULT_ASSIGN(add_dialog_stmt_, db_.get_statement("INSERT OR REPLACE INTO dialogs VALUES(?1, ?2, ?3, ?4)"));
|
||||
TRY_RESULT_ASSIGN(add_notification_group_stmt_,
|
||||
db_.get_statement("INSERT OR REPLACE INTO notification_groups VALUES(?1, ?2, ?3)"));
|
||||
TRY_RESULT_ASSIGN(delete_notification_group_stmt_,
|
||||
db_.get_statement("DELETE FROM notification_groups WHERE notification_group_id = ?1"));
|
||||
TRY_RESULT_ASSIGN(get_dialog_stmt_, db_.get_statement("SELECT data FROM dialogs WHERE dialog_id = ?1"));
|
||||
TRY_RESULT_ASSIGN(
|
||||
get_dialogs_stmt_,
|
||||
db_.get_statement("SELECT data, dialog_id, dialog_order FROM dialogs WHERE "
|
||||
"folder_id == ?1 AND (dialog_order < ?2 OR (dialog_order = ?2 AND dialog_id < ?3)) ORDER "
|
||||
"BY dialog_order DESC, dialog_id DESC LIMIT ?4"));
|
||||
TRY_RESULT_ASSIGN(
|
||||
get_notification_groups_by_last_notification_date_stmt_,
|
||||
db_.get_statement("SELECT notification_group_id, dialog_id, last_notification_date FROM notification_groups "
|
||||
"WHERE last_notification_date < ?1 OR (last_notification_date = ?1 "
|
||||
"AND (dialog_id < ?2 OR (dialog_id = ?2 AND notification_group_id < ?3))) ORDER BY "
|
||||
"last_notification_date DESC, dialog_id DESC LIMIT ?4"));
|
||||
// "WHERE (last_notification_date, dialog_id, notification_group_id) < (?1, ?2, ?3) ORDER BY "
|
||||
// "last_notification_date DESC, dialog_id DESC, notification_group_id DESC LIMIT ?4"));
|
||||
TRY_RESULT_ASSIGN(
|
||||
get_notification_group_stmt_,
|
||||
db_.get_statement(
|
||||
"SELECT dialog_id, last_notification_date FROM notification_groups WHERE notification_group_id = ?1"));
|
||||
TRY_RESULT_ASSIGN(
|
||||
get_secret_chat_count_stmt_,
|
||||
db_.get_statement(
|
||||
"SELECT COUNT(*) FROM dialogs WHERE folder_id = ?1 AND dialog_order > 0 AND dialog_id < -1500000000000"));
|
||||
|
||||
// LOG(ERROR) << get_dialog_stmt_.explain().ok();
|
||||
// LOG(ERROR) << get_dialogs_stmt_.explain().ok();
|
||||
// LOG(ERROR) << get_notification_groups_by_last_notification_date_stmt_.explain().ok();
|
||||
// LOG(ERROR) << get_notification_group_stmt_.explain().ok();
|
||||
// LOG(FATAL) << "EXPLAINED";
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
Status add_dialog(DialogId dialog_id, FolderId folder_id, int64 order, BufferSlice data,
|
||||
vector<NotificationGroupKey> notification_groups) override {
|
||||
SCOPE_EXIT {
|
||||
add_dialog_stmt_.reset();
|
||||
};
|
||||
add_dialog_stmt_.bind_int64(1, dialog_id.get()).ensure();
|
||||
add_dialog_stmt_.bind_int64(2, order).ensure();
|
||||
add_dialog_stmt_.bind_blob(3, data.as_slice()).ensure();
|
||||
if (order > 0) {
|
||||
add_dialog_stmt_.bind_int32(4, folder_id.get()).ensure();
|
||||
} else {
|
||||
add_dialog_stmt_.bind_null(4).ensure();
|
||||
}
|
||||
|
||||
TRY_STATUS(add_dialog_stmt_.step());
|
||||
|
||||
for (auto &to_add : notification_groups) {
|
||||
if (to_add.dialog_id.is_valid()) {
|
||||
SCOPE_EXIT {
|
||||
add_notification_group_stmt_.reset();
|
||||
};
|
||||
add_notification_group_stmt_.bind_int32(1, to_add.group_id.get()).ensure();
|
||||
add_notification_group_stmt_.bind_int64(2, to_add.dialog_id.get()).ensure();
|
||||
if (to_add.last_notification_date != 0) {
|
||||
add_notification_group_stmt_.bind_int32(3, to_add.last_notification_date).ensure();
|
||||
} else {
|
||||
add_notification_group_stmt_.bind_null(3).ensure();
|
||||
}
|
||||
TRY_STATUS(add_notification_group_stmt_.step());
|
||||
} else {
|
||||
SCOPE_EXIT {
|
||||
delete_notification_group_stmt_.reset();
|
||||
};
|
||||
delete_notification_group_stmt_.bind_int32(1, to_add.group_id.get()).ensure();
|
||||
TRY_STATUS(delete_notification_group_stmt_.step());
|
||||
}
|
||||
}
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
Result<BufferSlice> get_dialog(DialogId dialog_id) override {
|
||||
return Status::Error("Not found");
|
||||
SCOPE_EXIT {
|
||||
get_dialog_stmt_.reset();
|
||||
};
|
||||
|
||||
get_dialog_stmt_.bind_int64(1, dialog_id.get()).ensure();
|
||||
TRY_STATUS(get_dialog_stmt_.step());
|
||||
if (!get_dialog_stmt_.has_row()) {
|
||||
return Status::Error("Not found");
|
||||
}
|
||||
return BufferSlice(get_dialog_stmt_.view_blob(0));
|
||||
}
|
||||
|
||||
Result<NotificationGroupKey> get_notification_group(NotificationGroupId notification_group_id) override {
|
||||
return Status::Error("Not found");
|
||||
SCOPE_EXIT {
|
||||
get_notification_group_stmt_.reset();
|
||||
};
|
||||
get_notification_group_stmt_.bind_int32(1, notification_group_id.get()).ensure();
|
||||
TRY_STATUS(get_notification_group_stmt_.step());
|
||||
if (!get_notification_group_stmt_.has_row()) {
|
||||
return Status::Error("Not found");
|
||||
}
|
||||
return NotificationGroupKey(notification_group_id, DialogId(get_notification_group_stmt_.view_int64(0)),
|
||||
get_last_notification_date(get_notification_group_stmt_, 1));
|
||||
}
|
||||
|
||||
Result<int32> get_secret_chat_count(FolderId folder_id) override {
|
||||
return 0;
|
||||
SCOPE_EXIT {
|
||||
get_secret_chat_count_stmt_.reset();
|
||||
};
|
||||
get_secret_chat_count_stmt_.bind_int32(1, folder_id.get()).ensure();
|
||||
TRY_STATUS(get_secret_chat_count_stmt_.step());
|
||||
CHECK(get_secret_chat_count_stmt_.has_row());
|
||||
return get_secret_chat_count_stmt_.view_int32(0);
|
||||
}
|
||||
|
||||
Result<DialogDbGetDialogsResult> get_dialogs(FolderId folder_id, int64 order, DialogId dialog_id,
|
||||
int32 limit) override {
|
||||
SCOPE_EXIT {
|
||||
get_dialogs_stmt_.reset();
|
||||
};
|
||||
|
||||
get_dialogs_stmt_.bind_int32(1, folder_id.get()).ensure();
|
||||
get_dialogs_stmt_.bind_int64(2, order).ensure();
|
||||
get_dialogs_stmt_.bind_int64(3, dialog_id.get()).ensure();
|
||||
get_dialogs_stmt_.bind_int32(4, limit).ensure();
|
||||
|
||||
DialogDbGetDialogsResult result;
|
||||
TRY_STATUS(get_dialogs_stmt_.step());
|
||||
while (get_dialogs_stmt_.has_row()) {
|
||||
BufferSlice data(get_dialogs_stmt_.view_blob(0));
|
||||
result.next_dialog_id = DialogId(get_dialogs_stmt_.view_int64(1));
|
||||
result.next_order = get_dialogs_stmt_.view_int64(2);
|
||||
LOG(INFO) << "Load " << result.next_dialog_id << " with order " << result.next_order;
|
||||
result.dialogs.emplace_back(std::move(data));
|
||||
TRY_STATUS(get_dialogs_stmt_.step());
|
||||
}
|
||||
|
||||
return std::move(result);
|
||||
}
|
||||
|
||||
Result<vector<NotificationGroupKey>> get_notification_groups_by_last_notification_date(
|
||||
NotificationGroupKey notification_group_key, int32 limit) override {
|
||||
auto &stmt = get_notification_groups_by_last_notification_date_stmt_;
|
||||
SCOPE_EXIT {
|
||||
stmt.reset();
|
||||
};
|
||||
|
||||
stmt.bind_int32(1, notification_group_key.last_notification_date).ensure();
|
||||
stmt.bind_int64(2, notification_group_key.dialog_id.get()).ensure();
|
||||
stmt.bind_int32(3, notification_group_key.group_id.get()).ensure();
|
||||
stmt.bind_int32(4, limit).ensure();
|
||||
|
||||
vector<NotificationGroupKey> notification_groups;
|
||||
TRY_STATUS(stmt.step());
|
||||
while (stmt.has_row()) {
|
||||
notification_groups.emplace_back(NotificationGroupId(stmt.view_int32(0)), DialogId(stmt.view_int64(1)),
|
||||
get_last_notification_date(stmt, 2));
|
||||
TRY_STATUS(stmt.step());
|
||||
}
|
||||
|
||||
return std::move(notification_groups);
|
||||
}
|
||||
|
||||
Status begin_transaction() override {
|
||||
return Status::OK();
|
||||
return db_.begin_transaction();
|
||||
}
|
||||
Status commit_transaction() override {
|
||||
return Status::OK();
|
||||
return db_.commit_transaction();
|
||||
}
|
||||
|
||||
private:
|
||||
SqliteDb db_;
|
||||
|
||||
SqliteStatement add_dialog_stmt_;
|
||||
SqliteStatement add_notification_group_stmt_;
|
||||
SqliteStatement delete_notification_group_stmt_;
|
||||
SqliteStatement get_dialog_stmt_;
|
||||
SqliteStatement get_dialogs_stmt_;
|
||||
SqliteStatement get_notification_groups_by_last_notification_date_stmt_;
|
||||
SqliteStatement get_notification_group_stmt_;
|
||||
SqliteStatement get_secret_chat_count_stmt_;
|
||||
|
||||
static int32 get_last_notification_date(SqliteStatement &stmt, int id) {
|
||||
if (stmt.view_datatype(id) == SqliteStatement::Datatype::Null) {
|
||||
return 0;
|
||||
}
|
||||
return stmt.view_int32(id);
|
||||
}
|
||||
};
|
||||
|
||||
@ -219,12 +453,28 @@ class DialogDbAsync : public DialogDbAsyncInterface {
|
||||
}
|
||||
|
||||
void add_read_query() {
|
||||
do_flush();
|
||||
}
|
||||
|
||||
void do_flush() {
|
||||
if (pending_writes_.empty()) {
|
||||
return;
|
||||
}
|
||||
sync_db_->begin_transaction().ensure();
|
||||
for (auto &query : pending_writes_) {
|
||||
query.set_value(Unit());
|
||||
}
|
||||
sync_db_->commit_transaction().ensure();
|
||||
pending_writes_.clear();
|
||||
for (auto &p : pending_write_results_) {
|
||||
p.first.set_result(std::move(p.second));
|
||||
}
|
||||
pending_write_results_.clear();
|
||||
cancel_timeout();
|
||||
}
|
||||
|
||||
void timeout_expired() override {
|
||||
do_flush();
|
||||
}
|
||||
|
||||
void start_up() override {
|
||||
|
@ -54,44 +54,44 @@ Status init_messages_db(SqliteDb &db, int32 version) {
|
||||
}
|
||||
|
||||
auto add_media_indices = [&db](int begin, int end) {
|
||||
// for (int i = begin; i < end; i++) {
|
||||
// TRY_STATUS(db.exec(PSLICE() << "CREATE INDEX IF NOT EXISTS message_index_" << i
|
||||
// << " ON messages (dialog_id, message_id) WHERE (index_mask & " << (1 << i)
|
||||
// << ") != 0"));
|
||||
// }
|
||||
for (int i = begin; i < end; i++) {
|
||||
TRY_STATUS(db.exec(PSLICE() << "CREATE INDEX IF NOT EXISTS message_index_" << i
|
||||
<< " ON messages (dialog_id, message_id) WHERE (index_mask & " << (1 << i)
|
||||
<< ") != 0"));
|
||||
}
|
||||
return Status::OK();
|
||||
};
|
||||
|
||||
auto add_fts = [&db] {
|
||||
// TRY_STATUS(
|
||||
// db.exec("CREATE INDEX IF NOT EXISTS message_by_search_id ON messages "
|
||||
// "(search_id) WHERE search_id IS NOT NULL"));
|
||||
TRY_STATUS(
|
||||
db.exec("CREATE INDEX IF NOT EXISTS message_by_search_id ON messages "
|
||||
"(search_id) WHERE search_id IS NOT NULL"));
|
||||
|
||||
// TRY_STATUS(
|
||||
// db.exec("CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(text, content='messages', "
|
||||
// "content_rowid='search_id', tokenize = \"unicode61 remove_diacritics 0 tokenchars '\a'\")"));
|
||||
// TRY_STATUS(db.exec(
|
||||
// "CREATE TRIGGER IF NOT EXISTS trigger_fts_delete BEFORE DELETE ON messages WHEN OLD.search_id IS NOT NULL"
|
||||
// " BEGIN INSERT INTO messages_fts(messages_fts, rowid, text) VALUES(\'delete\', OLD.search_id, OLD.text); END"));
|
||||
// TRY_STATUS(db.exec(
|
||||
// "CREATE TRIGGER IF NOT EXISTS trigger_fts_insert AFTER INSERT ON messages WHEN NEW.search_id IS NOT NULL"
|
||||
// " BEGIN INSERT INTO messages_fts(rowid, text) VALUES(NEW.search_id, NEW.text); END"));
|
||||
// //TRY_STATUS(db.exec(
|
||||
// //"CREATE TRIGGER IF NOT EXISTS trigger_fts_update AFTER UPDATE ON messages WHEN NEW.search_id IS NOT NULL OR "
|
||||
// //"OLD.search_id IS NOT NULL"
|
||||
// //" BEGIN "
|
||||
// //"INSERT INTO messages_fts(messages_fts, rowid, text) VALUES(\'delete\', OLD.search_id, OLD.text); "
|
||||
// //"INSERT INTO messages_fts(rowid, text) VALUES(NEW.search_id, NEW.text); "
|
||||
// //" END"));
|
||||
TRY_STATUS(
|
||||
db.exec("CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(text, content='messages', "
|
||||
"content_rowid='search_id', tokenize = \"unicode61 remove_diacritics 0 tokenchars '\a'\")"));
|
||||
TRY_STATUS(db.exec(
|
||||
"CREATE TRIGGER IF NOT EXISTS trigger_fts_delete BEFORE DELETE ON messages WHEN OLD.search_id IS NOT NULL"
|
||||
" BEGIN INSERT INTO messages_fts(messages_fts, rowid, text) VALUES(\'delete\', OLD.search_id, OLD.text); END"));
|
||||
TRY_STATUS(db.exec(
|
||||
"CREATE TRIGGER IF NOT EXISTS trigger_fts_insert AFTER INSERT ON messages WHEN NEW.search_id IS NOT NULL"
|
||||
" BEGIN INSERT INTO messages_fts(rowid, text) VALUES(NEW.search_id, NEW.text); END"));
|
||||
//TRY_STATUS(db.exec(
|
||||
//"CREATE TRIGGER IF NOT EXISTS trigger_fts_update AFTER UPDATE ON messages WHEN NEW.search_id IS NOT NULL OR "
|
||||
//"OLD.search_id IS NOT NULL"
|
||||
//" BEGIN "
|
||||
//"INSERT INTO messages_fts(messages_fts, rowid, text) VALUES(\'delete\', OLD.search_id, OLD.text); "
|
||||
//"INSERT INTO messages_fts(rowid, text) VALUES(NEW.search_id, NEW.text); "
|
||||
//" END"));
|
||||
|
||||
return Status::OK();
|
||||
};
|
||||
auto add_call_index = [&db] {
|
||||
// for (int i = static_cast<int>(MessageSearchFilter::Call) - 1; i < static_cast<int>(MessageSearchFilter::MissedCall);
|
||||
// i++) {
|
||||
// TRY_STATUS(db.exec(PSLICE() << "CREATE INDEX IF NOT EXISTS full_message_index_" << i
|
||||
// << " ON messages (unique_message_id) WHERE (index_mask & " << (1 << i) << ") != 0"));
|
||||
// }
|
||||
for (int i = static_cast<int>(MessageSearchFilter::Call) - 1; i < static_cast<int>(MessageSearchFilter::MissedCall);
|
||||
i++) {
|
||||
TRY_STATUS(db.exec(PSLICE() << "CREATE INDEX IF NOT EXISTS full_message_index_" << i
|
||||
<< " ON messages (unique_message_id) WHERE (index_mask & " << (1 << i) << ") != 0"));
|
||||
}
|
||||
return Status::OK();
|
||||
};
|
||||
auto add_notification_id_index = [&db] {
|
||||
@ -115,7 +115,7 @@ Status init_messages_db(SqliteDb &db, int32 version) {
|
||||
TRY_STATUS(
|
||||
db.exec("CREATE TABLE IF NOT EXISTS messages (dialog_id INT8, message_id INT8, unique_message_id INT4, "
|
||||
"sender_user_id INT4, random_id INT8, data BLOB, ttl_expires_at INT4, index_mask INT4, search_id INT8, "
|
||||
"text STRING, notification_id INT4, top_thread_message_id INT8, seqno INT32, PRIMARY KEY (dialog_id, message_id))"));
|
||||
"text STRING, notification_id INT4, top_thread_message_id INT8, PRIMARY KEY (dialog_id, message_id))"));
|
||||
|
||||
TRY_STATUS(
|
||||
db.exec("CREATE INDEX IF NOT EXISTS message_by_random_id ON messages (dialog_id, random_id) "
|
||||
@ -183,60 +183,56 @@ class MessagesDbImpl : public MessagesDbSyncInterface {
|
||||
}
|
||||
|
||||
Status init() {
|
||||
seqno_ = 0;
|
||||
db_memory_ = SqliteDb::open_with_key(":memory:", DbKey::empty()).move_as_ok();
|
||||
TRY_STATUS(init_messages_db(db_memory_, db_.user_version().move_as_ok()));
|
||||
|
||||
TRY_RESULT_ASSIGN(
|
||||
add_message_stmt_,
|
||||
db_memory_.get_statement("INSERT OR REPLACE INTO messages VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13)"));
|
||||
db_.get_statement("INSERT OR REPLACE INTO messages VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)"));
|
||||
TRY_RESULT_ASSIGN(delete_message_stmt_,
|
||||
db_memory_.get_statement("DELETE FROM messages WHERE dialog_id = ?1 AND message_id = ?2"));
|
||||
db_.get_statement("DELETE FROM messages WHERE dialog_id = ?1 AND message_id = ?2"));
|
||||
TRY_RESULT_ASSIGN(delete_all_dialog_messages_stmt_,
|
||||
db_memory_.get_statement("DELETE FROM messages WHERE dialog_id = ?1 AND message_id <= ?2"));
|
||||
db_.get_statement("DELETE FROM messages WHERE dialog_id = ?1 AND message_id <= ?2"));
|
||||
TRY_RESULT_ASSIGN(delete_dialog_messages_from_user_stmt_,
|
||||
db_memory_.get_statement("DELETE FROM messages WHERE dialog_id = ?1 AND sender_user_id == ?2"));
|
||||
db_.get_statement("DELETE FROM messages WHERE dialog_id = ?1 AND sender_user_id == ?2"));
|
||||
|
||||
TRY_RESULT_ASSIGN(get_message_stmt_,
|
||||
db_memory_.get_statement("SELECT data FROM messages WHERE dialog_id = ?1 AND message_id = ?2"));
|
||||
db_.get_statement("SELECT data FROM messages WHERE dialog_id = ?1 AND message_id = ?2"));
|
||||
TRY_RESULT_ASSIGN(get_message_by_random_id_stmt_,
|
||||
db_memory_.get_statement("SELECT data FROM messages WHERE dialog_id = ?1 AND random_id = ?2"));
|
||||
db_.get_statement("SELECT data FROM messages WHERE dialog_id = ?1 AND random_id = ?2"));
|
||||
TRY_RESULT_ASSIGN(get_message_by_unique_message_id_stmt_,
|
||||
db_memory_.get_statement("SELECT dialog_id, data FROM messages WHERE unique_message_id = ?1"));
|
||||
db_.get_statement("SELECT dialog_id, data FROM messages WHERE unique_message_id = ?1"));
|
||||
|
||||
TRY_RESULT_ASSIGN(
|
||||
get_expiring_messages_stmt_,
|
||||
db_memory_.get_statement("SELECT dialog_id, data FROM messages WHERE ?1 < ttl_expires_at AND ttl_expires_at <= ?2"));
|
||||
db_.get_statement("SELECT dialog_id, data FROM messages WHERE ?1 < ttl_expires_at AND ttl_expires_at <= ?2"));
|
||||
TRY_RESULT_ASSIGN(get_expiring_messages_helper_stmt_,
|
||||
db_memory_.get_statement("SELECT MAX(ttl_expires_at), COUNT(*) FROM (SELECT ttl_expires_at FROM "
|
||||
db_.get_statement("SELECT MAX(ttl_expires_at), COUNT(*) FROM (SELECT ttl_expires_at FROM "
|
||||
"messages WHERE ?1 < ttl_expires_at LIMIT ?2) AS T"));
|
||||
|
||||
TRY_RESULT_ASSIGN(get_messages_stmt_.asc_stmt_,
|
||||
db_memory_.get_statement("SELECT data, message_id FROM messages WHERE dialog_id = ?1 AND message_id > "
|
||||
db_.get_statement("SELECT data, message_id FROM messages WHERE dialog_id = ?1 AND message_id > "
|
||||
"?2 ORDER BY message_id ASC LIMIT ?3"));
|
||||
TRY_RESULT_ASSIGN(get_messages_stmt_.desc_stmt_,
|
||||
db_memory_.get_statement("SELECT data, message_id FROM messages WHERE dialog_id = ?1 AND message_id < "
|
||||
db_.get_statement("SELECT data, message_id FROM messages WHERE dialog_id = ?1 AND message_id < "
|
||||
"?2 ORDER BY message_id DESC LIMIT ?3"));
|
||||
TRY_RESULT_ASSIGN(get_scheduled_messages_stmt_,
|
||||
db_memory_.get_statement("SELECT data, message_id FROM scheduled_messages WHERE dialog_id = ?1 AND "
|
||||
db_.get_statement("SELECT data, message_id FROM scheduled_messages WHERE dialog_id = ?1 AND "
|
||||
"message_id < ?2 ORDER BY message_id DESC LIMIT ?3"));
|
||||
TRY_RESULT_ASSIGN(get_messages_from_notification_id_stmt_,
|
||||
db_memory_.get_statement("SELECT data, message_id FROM messages WHERE dialog_id = ?1 AND "
|
||||
db_.get_statement("SELECT data, message_id FROM messages WHERE dialog_id = ?1 AND "
|
||||
"notification_id < ?2 ORDER BY notification_id DESC LIMIT ?3"));
|
||||
// TRY_RESULT_ASSIGN(
|
||||
// get_messages_fts_stmt_,
|
||||
// db_memory_.get_statement(
|
||||
// "SELECT dialog_id, data, search_id FROM messages WHERE search_id IN (SELECT rowid FROM messages_fts WHERE "
|
||||
// "messages_fts MATCH ?1 AND rowid < ?2 ORDER BY rowid DESC LIMIT ?3) ORDER BY search_id DESC"));
|
||||
TRY_RESULT_ASSIGN(
|
||||
get_messages_fts_stmt_,
|
||||
db_.get_statement(
|
||||
"SELECT dialog_id, data, search_id FROM messages WHERE search_id IN (SELECT rowid FROM messages_fts WHERE "
|
||||
"messages_fts MATCH ?1 AND rowid < ?2 ORDER BY rowid DESC LIMIT ?3) ORDER BY search_id DESC"));
|
||||
|
||||
for (int32 i = 0; i < MESSAGES_DB_INDEX_COUNT; i++) {
|
||||
TRY_RESULT_ASSIGN(get_messages_from_index_stmts_[i].desc_stmt_,
|
||||
db_memory_.get_statement(PSLICE() << "SELECT data, message_id FROM messages WHERE dialog_id = ?1 "
|
||||
db_.get_statement(PSLICE() << "SELECT data, message_id FROM messages WHERE dialog_id = ?1 "
|
||||
"AND message_id < ?2 AND (index_mask & "
|
||||
<< (1 << i) << ") != 0 ORDER BY message_id DESC LIMIT ?3"));
|
||||
|
||||
TRY_RESULT_ASSIGN(get_messages_from_index_stmts_[i].asc_stmt_,
|
||||
db_memory_.get_statement(PSLICE() << "SELECT data, message_id FROM messages WHERE dialog_id = ?1 "
|
||||
db_.get_statement(PSLICE() << "SELECT data, message_id FROM messages WHERE dialog_id = ?1 "
|
||||
"AND message_id > ?2 AND (index_mask & "
|
||||
<< (1 << i) << ") != 0 ORDER BY message_id ASC LIMIT ?3"));
|
||||
|
||||
@ -248,24 +244,24 @@ class MessagesDbImpl : public MessagesDbSyncInterface {
|
||||
i < static_cast<int>(MessageSearchFilter::MissedCall); i++, pos++) {
|
||||
TRY_RESULT_ASSIGN(
|
||||
get_calls_stmts_[pos],
|
||||
db_memory_.get_statement(
|
||||
db_.get_statement(
|
||||
PSLICE() << "SELECT dialog_id, data FROM messages WHERE unique_message_id < ?1 AND (index_mask & "
|
||||
<< (1 << i) << ") != 0 ORDER BY unique_message_id DESC LIMIT ?2"));
|
||||
}
|
||||
|
||||
TRY_RESULT_ASSIGN(add_scheduled_message_stmt_,
|
||||
db_memory_.get_statement("INSERT OR REPLACE INTO scheduled_messages VALUES(?1, ?2, ?3, ?4)"));
|
||||
db_.get_statement("INSERT OR REPLACE INTO scheduled_messages VALUES(?1, ?2, ?3, ?4)"));
|
||||
TRY_RESULT_ASSIGN(
|
||||
get_scheduled_message_stmt_,
|
||||
db_memory_.get_statement("SELECT data FROM scheduled_messages WHERE dialog_id = ?1 AND message_id = ?2"));
|
||||
db_.get_statement("SELECT data FROM scheduled_messages WHERE dialog_id = ?1 AND message_id = ?2"));
|
||||
TRY_RESULT_ASSIGN(
|
||||
get_scheduled_server_message_stmt_,
|
||||
db_memory_.get_statement("SELECT data FROM scheduled_messages WHERE dialog_id = ?1 AND server_message_id = ?2"));
|
||||
db_.get_statement("SELECT data FROM scheduled_messages WHERE dialog_id = ?1 AND server_message_id = ?2"));
|
||||
TRY_RESULT_ASSIGN(delete_scheduled_message_stmt_,
|
||||
db_memory_.get_statement("DELETE FROM scheduled_messages WHERE dialog_id = ?1 AND message_id = ?2"));
|
||||
db_.get_statement("DELETE FROM scheduled_messages WHERE dialog_id = ?1 AND message_id = ?2"));
|
||||
TRY_RESULT_ASSIGN(
|
||||
delete_scheduled_server_message_stmt_,
|
||||
db_memory_.get_statement("DELETE FROM scheduled_messages WHERE dialog_id = ?1 AND server_message_id = ?2"));
|
||||
db_.get_statement("DELETE FROM scheduled_messages WHERE dialog_id = ?1 AND server_message_id = ?2"));
|
||||
|
||||
// LOG(ERROR) << get_message_stmt_.explain().ok();
|
||||
// LOG(ERROR) << get_messages_from_notification_id_stmt.explain().ok();
|
||||
@ -291,16 +287,6 @@ class MessagesDbImpl : public MessagesDbSyncInterface {
|
||||
SCOPE_EXIT {
|
||||
add_message_stmt_.reset();
|
||||
};
|
||||
|
||||
seqno_++;
|
||||
|
||||
if (seqno_ % 8128 == 0) {
|
||||
TRY_STATUS(db_memory_.exec("DELETE FROM messages WHERE seqno < " + to_string(seqno_ - 7168)));
|
||||
TRY_STATUS(db_.exec("PRAGMA shrink_memory"));
|
||||
}
|
||||
|
||||
add_message_stmt_.bind_int32(12, seqno_).ensure();
|
||||
|
||||
add_message_stmt_.bind_int64(1, dialog_id.get()).ensure();
|
||||
add_message_stmt_.bind_int64(2, message_id.get()).ensure();
|
||||
|
||||
@ -686,57 +672,56 @@ class MessagesDbImpl : public MessagesDbSyncInterface {
|
||||
}
|
||||
|
||||
Result<MessagesDbFtsResult> get_messages_fts(MessagesDbFtsQuery query) override {
|
||||
// SCOPE_EXIT {
|
||||
// get_messages_fts_stmt_.reset();
|
||||
// };
|
||||
SCOPE_EXIT {
|
||||
get_messages_fts_stmt_.reset();
|
||||
};
|
||||
|
||||
// LOG(INFO) << tag("query", query.query) << query.dialog_id << tag("index_mask", query.index_mask)
|
||||
// << tag("from_search_id", query.from_search_id) << tag("limit", query.limit);
|
||||
// string words = prepare_query(query.query);
|
||||
// LOG(INFO) << tag("from", query.query) << tag("to", words);
|
||||
LOG(INFO) << tag("query", query.query) << query.dialog_id << tag("index_mask", query.index_mask)
|
||||
<< tag("from_search_id", query.from_search_id) << tag("limit", query.limit);
|
||||
string words = prepare_query(query.query);
|
||||
LOG(INFO) << tag("from", query.query) << tag("to", words);
|
||||
|
||||
// // dialog_id kludge
|
||||
// if (query.dialog_id.is_valid()) {
|
||||
// words += PSTRING() << " \"\a" << query.dialog_id.get() << "\"";
|
||||
// }
|
||||
// dialog_id kludge
|
||||
if (query.dialog_id.is_valid()) {
|
||||
words += PSTRING() << " \"\a" << query.dialog_id.get() << "\"";
|
||||
}
|
||||
|
||||
// // index_mask kludge
|
||||
// if (query.index_mask != 0) {
|
||||
// int index_i = -1;
|
||||
// for (int i = 0; i < MESSAGES_DB_INDEX_COUNT; i++) {
|
||||
// if (query.index_mask == (1 << i)) {
|
||||
// index_i = i;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// if (index_i == -1) {
|
||||
// return Status::Error("Union of index types is not supported");
|
||||
// }
|
||||
// words += PSTRING() << " \"\a\a" << index_i << "\"";
|
||||
// }
|
||||
// index_mask kludge
|
||||
if (query.index_mask != 0) {
|
||||
int index_i = -1;
|
||||
for (int i = 0; i < MESSAGES_DB_INDEX_COUNT; i++) {
|
||||
if (query.index_mask == (1 << i)) {
|
||||
index_i = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (index_i == -1) {
|
||||
return Status::Error("Union of index types is not supported");
|
||||
}
|
||||
words += PSTRING() << " \"\a\a" << index_i << "\"";
|
||||
}
|
||||
|
||||
// auto &stmt = get_messages_fts_stmt_;
|
||||
// stmt.bind_string(1, words).ensure();
|
||||
// if (query.from_search_id == 0) {
|
||||
// query.from_search_id = std::numeric_limits<int64>::max();
|
||||
// }
|
||||
// stmt.bind_int64(2, query.from_search_id).ensure();
|
||||
// stmt.bind_int32(3, query.limit).ensure();
|
||||
// MessagesDbFtsResult result;
|
||||
// auto status = stmt.step();
|
||||
// if (status.is_error()) {
|
||||
// LOG(ERROR) << status;
|
||||
// return std::move(result);
|
||||
// }
|
||||
// while (stmt.has_row()) {
|
||||
// auto dialog_id = stmt.view_int64(0);
|
||||
// auto data_slice = stmt.view_blob(1);
|
||||
// auto search_id = stmt.view_int64(2);
|
||||
// result.next_search_id = search_id;
|
||||
// result.messages.push_back(MessagesDbMessage{DialogId(dialog_id), BufferSlice(data_slice)});
|
||||
// stmt.step().ensure();
|
||||
// }
|
||||
MessagesDbFtsResult result;
|
||||
auto &stmt = get_messages_fts_stmt_;
|
||||
stmt.bind_string(1, words).ensure();
|
||||
if (query.from_search_id == 0) {
|
||||
query.from_search_id = std::numeric_limits<int64>::max();
|
||||
}
|
||||
stmt.bind_int64(2, query.from_search_id).ensure();
|
||||
stmt.bind_int32(3, query.limit).ensure();
|
||||
MessagesDbFtsResult result;
|
||||
auto status = stmt.step();
|
||||
if (status.is_error()) {
|
||||
LOG(ERROR) << status;
|
||||
return std::move(result);
|
||||
}
|
||||
while (stmt.has_row()) {
|
||||
auto dialog_id = stmt.view_int64(0);
|
||||
auto data_slice = stmt.view_blob(1);
|
||||
auto search_id = stmt.view_int64(2);
|
||||
result.next_search_id = search_id;
|
||||
result.messages.push_back(MessagesDbMessage{DialogId(dialog_id), BufferSlice(data_slice)});
|
||||
stmt.step().ensure();
|
||||
}
|
||||
return std::move(result);
|
||||
}
|
||||
|
||||
@ -809,9 +794,6 @@ class MessagesDbImpl : public MessagesDbSyncInterface {
|
||||
|
||||
private:
|
||||
SqliteDb db_;
|
||||
SqliteDb db_memory_;
|
||||
|
||||
int32_t seqno_;
|
||||
|
||||
SqliteStatement add_message_stmt_;
|
||||
|
||||
@ -836,7 +818,7 @@ class MessagesDbImpl : public MessagesDbSyncInterface {
|
||||
std::array<GetMessagesStmt, MESSAGES_DB_INDEX_COUNT> get_messages_from_index_stmts_;
|
||||
std::array<SqliteStatement, 2> get_calls_stmts_;
|
||||
|
||||
// SqliteStatement get_messages_fts_stmt_;
|
||||
SqliteStatement get_messages_fts_stmt_;
|
||||
|
||||
SqliteStatement add_scheduled_message_stmt_;
|
||||
SqliteStatement get_scheduled_message_stmt_;
|
||||
|
@ -329,16 +329,17 @@ Status TdDb::init_sqlite(int32 scheduler_id, const TdParameters ¶meters, DbK
|
||||
|
||||
// init DialogDb
|
||||
bool dialog_db_was_created = false;
|
||||
|
||||
if (use_dialog_db) {
|
||||
TRY_STATUS(init_dialog_db(db, user_version, binlog_pmc, dialog_db_was_created));
|
||||
} else {
|
||||
TRY_STATUS(drop_dialog_db(db, user_version));
|
||||
}
|
||||
|
||||
// init MessagesDb
|
||||
TRY_STATUS(drop_messages_db(db, user_version));
|
||||
|
||||
if (use_message_db) {
|
||||
TRY_STATUS(init_messages_db(db, user_version));
|
||||
} else {
|
||||
TRY_STATUS(drop_messages_db(db, user_version));
|
||||
}
|
||||
|
||||
// init filesDb
|
||||
@ -526,6 +527,8 @@ Result<string> TdDb::get_stats() {
|
||||
<< mask << "'",
|
||||
PSLICE() << table << ":" << mask);
|
||||
};
|
||||
TRY_STATUS(run_query("SELECT 0, SUM(length(data)), COUNT(*) FROM messages WHERE 1", "messages"));
|
||||
TRY_STATUS(run_query("SELECT 0, SUM(length(data)), COUNT(*) FROM dialogs WHERE 1", "dialogs"));
|
||||
TRY_STATUS(run_kv_query("%", "common"));
|
||||
TRY_STATUS(run_kv_query("%", "files"));
|
||||
TRY_STATUS(run_kv_query("wp%"));
|
||||
|
@ -4199,4 +4199,5 @@ void FileManager::tear_down() {
|
||||
// Completely clear memory when closing, to avoid memory leaks
|
||||
memory_cleanup(true);
|
||||
}
|
||||
|
||||
} // namespace td
|
||||
|
@ -153,6 +153,7 @@ class FileNode {
|
||||
FileEncryptionKey encryption_key_;
|
||||
FileDbId pmc_id_;
|
||||
std::vector<FileId> file_ids_;
|
||||
|
||||
FileId main_file_id_ = {};
|
||||
|
||||
double last_successful_force_reupload_time_ = -1e10;
|
||||
|
@ -249,10 +249,10 @@ class LogEventStorerImpl : public Storer {
|
||||
size_t store(uint8 *ptr) const override {
|
||||
LogEventStorerUnsafe storer(ptr);
|
||||
td::store(event_, storer);
|
||||
//#ifdef TD_DEBUG
|
||||
// T check_result;
|
||||
// log_event_parse(check_result, Slice(ptr, storer.get_buf())).ensure();
|
||||
//#endif
|
||||
#ifdef TD_DEBUG
|
||||
T check_result;
|
||||
log_event_parse(check_result, Slice(ptr, storer.get_buf())).ensure();
|
||||
#endif
|
||||
return static_cast<size_t>(storer.get_buf() - ptr);
|
||||
}
|
||||
|
||||
@ -290,10 +290,10 @@ BufferSlice log_event_store(const T &data) {
|
||||
LogEventStorerUnsafe storer_unsafe(ptr);
|
||||
store(data, storer_unsafe);
|
||||
|
||||
//#ifdef TD_DEBUG
|
||||
// T check_result;
|
||||
// log_event_parse(check_result, value_buffer.as_slice()).ensure();
|
||||
//#endif
|
||||
#ifdef TD_DEBUG
|
||||
T check_result;
|
||||
log_event_parse(check_result, value_buffer.as_slice()).ensure();
|
||||
#endif
|
||||
return value_buffer;
|
||||
}
|
||||
|
||||
|
@ -72,26 +72,17 @@ SqliteDb::~SqliteDb() = default;
|
||||
Status SqliteDb::init(CSlice path, bool *was_created) {
|
||||
// If database does not exist, delete all other files which may left
|
||||
// from older database
|
||||
|
||||
if (path == ":memory:") {
|
||||
if (was_created != nullptr) {
|
||||
*was_created = false;
|
||||
}
|
||||
} else {
|
||||
bool is_db_exists = stat(path).is_ok();
|
||||
|
||||
if (!is_db_exists) {
|
||||
TRY_STATUS(destroy(path));
|
||||
}
|
||||
|
||||
if (was_created != nullptr) {
|
||||
*was_created = !is_db_exists;
|
||||
}
|
||||
bool is_db_exists = stat(path).is_ok();
|
||||
if (!is_db_exists) {
|
||||
TRY_STATUS(destroy(path));
|
||||
}
|
||||
|
||||
if (was_created != nullptr) {
|
||||
*was_created = !is_db_exists;
|
||||
}
|
||||
sqlite3 *db;
|
||||
CHECK(sqlite3_threadsafe() != 0);
|
||||
int rc = sqlite3_open_v2(path.c_str(), &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
|
||||
int rc = sqlite3_open_v2(path.c_str(), &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE /*| SQLITE_OPEN_SHAREDCACHE*/,
|
||||
nullptr);
|
||||
if (rc != SQLITE_OK) {
|
||||
auto res = Status::Error(PSLICE() << "Failed to open database: " << detail::RawSqliteDb::last_error(db, path));
|
||||
@ -195,7 +186,11 @@ Status SqliteDb::commit_transaction() {
|
||||
}
|
||||
|
||||
Status SqliteDb::check_encryption() {
|
||||
return Status::OK();
|
||||
auto status = exec("SELECT count(*) FROM sqlite_master");
|
||||
if (status.is_ok()) {
|
||||
enable_logging_ = true;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
Result<SqliteDb> SqliteDb::open_with_key(CSlice path, const DbKey &db_key, optional<int32> cipher_version) {
|
||||
@ -209,21 +204,80 @@ Result<SqliteDb> SqliteDb::open_with_key(CSlice path, const DbKey &db_key, optio
|
||||
Result<SqliteDb> SqliteDb::do_open_with_key(CSlice path, const DbKey &db_key, int32 cipher_version) {
|
||||
SqliteDb db;
|
||||
TRY_STATUS(db.init(path));
|
||||
if (!db_key.is_empty()) {
|
||||
if (db.check_encryption().is_ok()) {
|
||||
return Status::Error(PSLICE() << "No key is needed for database \"" << path << '"');
|
||||
}
|
||||
auto key = db_key_to_sqlcipher_key(db_key);
|
||||
TRY_STATUS(db.exec(PSLICE() << "PRAGMA key = " << key));
|
||||
if (cipher_version != 0) {
|
||||
LOG(INFO) << "Trying SQLCipher compatibility mode with version = " << cipher_version;
|
||||
TRY_STATUS(db.exec(PSLICE() << "PRAGMA cipher_compatibility = " << cipher_version));
|
||||
}
|
||||
db.set_cipher_version(cipher_version);
|
||||
}
|
||||
TRY_STATUS_PREFIX(db.check_encryption(), "Can't open database: ");
|
||||
return std::move(db);
|
||||
}
|
||||
|
||||
void SqliteDb::set_cipher_version(int32 cipher_version) {
|
||||
raw_->set_cipher_version(cipher_version);
|
||||
}
|
||||
|
||||
optional<int32> SqliteDb::get_cipher_version() const {
|
||||
return optional<int32>{3};
|
||||
return raw_->get_cipher_version();
|
||||
}
|
||||
|
||||
Result<SqliteDb> SqliteDb::change_key(CSlice path, const DbKey &new_db_key, const DbKey &old_db_key) {
|
||||
SqliteDb db;
|
||||
TRY_STATUS(db.init(path));
|
||||
PerfWarningTimer perf("change key", 0.001);
|
||||
|
||||
return std::move(db);
|
||||
// fast path
|
||||
{
|
||||
auto r_db = open_with_key(path, new_db_key);
|
||||
if (r_db.is_ok()) {
|
||||
return r_db;
|
||||
}
|
||||
}
|
||||
|
||||
TRY_RESULT(db, open_with_key(path, old_db_key));
|
||||
TRY_RESULT(user_version, db.user_version());
|
||||
auto new_key = db_key_to_sqlcipher_key(new_db_key);
|
||||
if (old_db_key.is_empty() && !new_db_key.is_empty()) {
|
||||
LOG(DEBUG) << "ENCRYPT";
|
||||
PerfWarningTimer timer("Encrypt SQLite database", 0.1);
|
||||
auto tmp_path = path.str() + ".encrypted";
|
||||
TRY_STATUS(destroy(tmp_path));
|
||||
|
||||
// make shure that database is not empty
|
||||
TRY_STATUS(db.exec("CREATE TABLE IF NOT EXISTS encryption_dummy_table(id INT PRIMARY KEY)"));
|
||||
TRY_STATUS(db.exec(PSLICE() << "ATTACH DATABASE '" << quote_string(tmp_path) << "' AS encrypted KEY " << new_key));
|
||||
TRY_STATUS(db.exec("SELECT sqlcipher_export('encrypted')"));
|
||||
TRY_STATUS(db.exec(PSLICE() << "PRAGMA encrypted.user_version = " << user_version));
|
||||
TRY_STATUS(db.exec("DETACH DATABASE encrypted"));
|
||||
db.close();
|
||||
TRY_STATUS(rename(tmp_path, path));
|
||||
} else if (!old_db_key.is_empty() && new_db_key.is_empty()) {
|
||||
LOG(DEBUG) << "DECRYPT";
|
||||
PerfWarningTimer timer("Decrypt SQLite database", 0.1);
|
||||
auto tmp_path = path.str() + ".encrypted";
|
||||
TRY_STATUS(destroy(tmp_path));
|
||||
|
||||
TRY_STATUS(db.exec(PSLICE() << "ATTACH DATABASE '" << quote_string(tmp_path) << "' AS decrypted KEY ''"));
|
||||
TRY_STATUS(db.exec("SELECT sqlcipher_export('decrypted')"));
|
||||
TRY_STATUS(db.exec(PSLICE() << "PRAGMA decrypted.user_version = " << user_version));
|
||||
TRY_STATUS(db.exec("DETACH DATABASE decrypted"));
|
||||
db.close();
|
||||
TRY_STATUS(rename(tmp_path, path));
|
||||
} else {
|
||||
LOG(DEBUG) << "REKEY";
|
||||
PerfWarningTimer timer("Rekey SQLite database", 0.1);
|
||||
TRY_STATUS(db.exec(PSLICE() << "PRAGMA rekey = " << new_key));
|
||||
}
|
||||
|
||||
TRY_RESULT(new_db, open_with_key(path, new_db_key));
|
||||
LOG_CHECK(new_db.user_version().ok() == user_version) << new_db.user_version().ok() << " " << user_version;
|
||||
return std::move(new_db);
|
||||
}
|
||||
|
||||
Status SqliteDb::destroy(Slice path) {
|
||||
return detail::RawSqliteDb::destroy(path);
|
||||
}
|
||||
|
@ -11,33 +11,119 @@
|
||||
namespace td {
|
||||
|
||||
Result<bool> SqliteKeyValue::init(string path) {
|
||||
return true;
|
||||
path_ = std::move(path);
|
||||
bool is_created = false;
|
||||
SqliteDb db;
|
||||
TRY_STATUS(db.init(path, &is_created));
|
||||
TRY_STATUS(db.exec("PRAGMA encoding=\"UTF-8\""));
|
||||
TRY_STATUS(db.exec("PRAGMA synchronous=NORMAL"));
|
||||
TRY_STATUS(db.exec("PRAGMA journal_mode=WAL"));
|
||||
TRY_STATUS(db.exec("PRAGMA temp_store=MEMORY"));
|
||||
TRY_STATUS(init_with_connection(std::move(db), "KV"));
|
||||
return is_created;
|
||||
}
|
||||
|
||||
Status SqliteKeyValue::init_with_connection(SqliteDb connection, string table_name) {
|
||||
auto init_guard = ScopeExit() + [&] {
|
||||
close();
|
||||
};
|
||||
db_ = std::move(connection);
|
||||
table_name_ = std::move(table_name);
|
||||
TRY_STATUS(init(db_, table_name_));
|
||||
|
||||
TRY_RESULT_ASSIGN(set_stmt_,
|
||||
db_.get_statement(PSLICE() << "REPLACE INTO " << table_name_ << " (k, v) VALUES (?1, ?2)"));
|
||||
TRY_RESULT_ASSIGN(get_stmt_, db_.get_statement(PSLICE() << "SELECT v FROM " << table_name_ << " WHERE k = ?1"));
|
||||
TRY_RESULT_ASSIGN(erase_stmt_, db_.get_statement(PSLICE() << "DELETE FROM " << table_name_ << " WHERE k = ?1"));
|
||||
TRY_RESULT_ASSIGN(get_all_stmt_, db_.get_statement(PSLICE() << "SELECT k, v FROM " << table_name_));
|
||||
|
||||
TRY_RESULT_ASSIGN(erase_by_prefix_stmt_,
|
||||
db_.get_statement(PSLICE() << "DELETE FROM " << table_name_ << " WHERE ?1 <= k AND k < ?2"));
|
||||
TRY_RESULT_ASSIGN(erase_by_prefix_rare_stmt_,
|
||||
db_.get_statement(PSLICE() << "DELETE FROM " << table_name_ << " WHERE ?1 <= k"));
|
||||
|
||||
TRY_RESULT_ASSIGN(get_by_prefix_stmt_,
|
||||
db_.get_statement(PSLICE() << "SELECT k, v FROM " << table_name_ << " WHERE ?1 <= k AND k < ?2"));
|
||||
TRY_RESULT_ASSIGN(get_by_prefix_rare_stmt_,
|
||||
db_.get_statement(PSLICE() << "SELECT k, v FROM " << table_name_ << " WHERE ?1 <= k"));
|
||||
|
||||
init_guard.dismiss();
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
Status SqliteKeyValue::drop() {
|
||||
return Status::OK();
|
||||
if (empty()) {
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
auto result = drop(db_, table_name_);
|
||||
close();
|
||||
return result;
|
||||
}
|
||||
|
||||
SqliteKeyValue::SeqNo SqliteKeyValue::set(Slice key, Slice value) {
|
||||
set_stmt_.bind_blob(1, key).ensure();
|
||||
set_stmt_.bind_blob(2, value).ensure();
|
||||
auto status = set_stmt_.step();
|
||||
if (status.is_error()) {
|
||||
LOG(FATAL) << "Failed to set \"" << key << '"';
|
||||
}
|
||||
// set_stmt_.step().ensure();
|
||||
set_stmt_.reset();
|
||||
return 0;
|
||||
}
|
||||
|
||||
string SqliteKeyValue::get(Slice key) {
|
||||
return "";
|
||||
SCOPE_EXIT {
|
||||
get_stmt_.reset();
|
||||
};
|
||||
get_stmt_.bind_blob(1, key).ensure();
|
||||
get_stmt_.step().ensure();
|
||||
if (!get_stmt_.has_row()) {
|
||||
return "";
|
||||
}
|
||||
auto data = get_stmt_.view_blob(0).str();
|
||||
get_stmt_.step().ignore();
|
||||
return data;
|
||||
}
|
||||
|
||||
SqliteKeyValue::SeqNo SqliteKeyValue::erase(Slice key) {
|
||||
erase_stmt_.bind_blob(1, key).ensure();
|
||||
erase_stmt_.step().ensure();
|
||||
erase_stmt_.reset();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SqliteKeyValue::erase_by_prefix(Slice prefix) {
|
||||
auto next = next_prefix(prefix);
|
||||
if (next.empty()) {
|
||||
SCOPE_EXIT {
|
||||
erase_by_prefix_rare_stmt_.reset();
|
||||
};
|
||||
erase_by_prefix_rare_stmt_.bind_blob(1, prefix).ensure();
|
||||
erase_by_prefix_rare_stmt_.step().ensure();
|
||||
} else {
|
||||
SCOPE_EXIT {
|
||||
erase_by_prefix_stmt_.reset();
|
||||
};
|
||||
erase_by_prefix_stmt_.bind_blob(1, prefix).ensure();
|
||||
erase_by_prefix_stmt_.bind_blob(2, next).ensure();
|
||||
erase_by_prefix_stmt_.step().ensure();
|
||||
}
|
||||
}
|
||||
|
||||
string SqliteKeyValue::next_prefix(Slice prefix) {
|
||||
string next = prefix.str();
|
||||
size_t pos = next.size();
|
||||
while (pos) {
|
||||
pos--;
|
||||
auto value = static_cast<uint8>(next[pos]);
|
||||
value++;
|
||||
next[pos] = static_cast<char>(value);
|
||||
if (value != 0) {
|
||||
return next;
|
||||
}
|
||||
}
|
||||
return string{};
|
||||
}
|
||||
|
||||
|
@ -20,17 +20,17 @@ namespace td {
|
||||
class SqliteKeyValue {
|
||||
public:
|
||||
static Status drop(SqliteDb &connection, Slice table_name) TD_WARN_UNUSED_RESULT {
|
||||
return Status::OK();
|
||||
return connection.exec(PSLICE() << "DROP TABLE IF EXISTS " << table_name);
|
||||
}
|
||||
|
||||
static Status init(SqliteDb &connection, Slice table_name) TD_WARN_UNUSED_RESULT {
|
||||
return Status::OK();
|
||||
return connection.exec(PSLICE() << "CREATE TABLE IF NOT EXISTS " << table_name << " (k BLOB PRIMARY KEY, v BLOB)");
|
||||
}
|
||||
|
||||
using SeqNo = uint64;
|
||||
|
||||
bool empty() const {
|
||||
return false;
|
||||
return db_.empty();
|
||||
}
|
||||
|
||||
Result<bool> init(string path) TD_WARN_UNUSED_RESULT;
|
||||
@ -54,10 +54,10 @@ class SqliteKeyValue {
|
||||
SeqNo erase(Slice key);
|
||||
|
||||
Status begin_transaction() TD_WARN_UNUSED_RESULT {
|
||||
return Status::OK();
|
||||
return db_.begin_transaction();
|
||||
}
|
||||
Status commit_transaction() TD_WARN_UNUSED_RESULT {
|
||||
return Status::OK();
|
||||
return db_.commit_transaction();
|
||||
}
|
||||
|
||||
void erase_by_prefix(Slice prefix);
|
||||
@ -107,7 +107,14 @@ class SqliteKeyValue {
|
||||
|
||||
private:
|
||||
string path_;
|
||||
string table_name_;
|
||||
SqliteDb db_;
|
||||
SqliteStatement get_stmt_;
|
||||
SqliteStatement set_stmt_;
|
||||
SqliteStatement erase_stmt_;
|
||||
SqliteStatement get_all_stmt_;
|
||||
SqliteStatement erase_by_prefix_stmt_;
|
||||
SqliteStatement erase_by_prefix_rare_stmt_;
|
||||
SqliteStatement get_by_prefix_stmt_;
|
||||
SqliteStatement get_by_prefix_rare_stmt_;
|
||||
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include <cstdlib>
|
||||
#include <limits>
|
||||
#include <mutex>
|
||||
#include <csignal>
|
||||
|
||||
#if TD_ANDROID
|
||||
#include <android/log.h>
|
||||
|
Loading…
Reference in New Issue
Block a user