Overview
Comment: | Add SQL functions BCAT and BYTE for dealing with blobs. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
50395b8093280a51cfaae1cb6405001e |
User & Date: | user on 2021-11-09 08:22:27 |
Other Links: | manifest | tags |
Context
2021-11-16
| ||
08:45 | Fix the =Animate instruction. check-in: 222a54522d user: user tags: trunk | |
2021-11-09
| ||
08:22 | Add SQL functions BCAT and BYTE for dealing with blobs. check-in: 50395b8093 user: user tags: trunk | |
2021-11-07
| ||
19:59 | Remote note at top of document about being incomplete; it does not seem to be incomplete. check-in: ab03b51d6f user: user tags: trunk | |
Changes
Modified function.c from [e8f3bec2de] to [6d93dbc609].
︙ | |||
31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | } } } static void fn_basename(sqlite3_context*cxt,int argc,sqlite3_value**argv) { sqlite3_result_text(cxt,basefilename,-1,SQLITE_STATIC); } static void fn_bcat(sqlite3_context*cxt,int argc,sqlite3_value**argv) { sqlite3_str*str=sqlite3_str_new(userdb); const char*p; int i; for(i=0;i<argc;i++) if(p=sqlite3_value_blob(argv[i])) sqlite3_str_append(str,p,sqlite3_value_bytes(argv[i])); i=sqlite3_str_errcode(str); if(i==SQLITE_NOMEM) { sqlite3_result_error_nomem(cxt); } else if(i==SQLITE_TOOBIG) { sqlite3_result_error_toobig(cxt); } else if(i) { sqlite3_result_error(cxt,"Unknown error",-1); } if(i) { sqlite3_free(sqlite3_str_finish(str)); return; } if(i=sqlite3_str_length(str)) { sqlite3_result_blob(cxt,sqlite3_str_finish(str),i,sqlite3_free); } else { sqlite3_free(sqlite3_str_finish(str)); sqlite3_result_zeroblob(cxt,0); } } static void fn_byte(sqlite3_context*cxt,int argc,sqlite3_value**argv) { Uint8*s=malloc(argc+1); int i; if(!s) { sqlite3_result_error_nomem(cxt); return; } for(i=0;i<argc;i++) s[i]=sqlite3_value_int(argv[i]); sqlite3_result_blob(cxt,s,argc,free); } static void fn_cacheid(sqlite3_context*cxt,int argc,sqlite3_value**argv) { sqlite3_result_int64(cxt,*(sqlite3_int64*)sqlite3_user_data(cxt)); } static void fn_cl(sqlite3_context*cxt,int argc,sqlite3_value**argv) { int a; |
︙ | |||
1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 | 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 | + + | .xColumn=vt1_playfield_column, .xFilter=vt1_playfield_filter, .xNext=vt1_playfield_next, ); void init_sql_functions(sqlite3_int64*ptr0,sqlite3_int64*ptr1) { sqlite3_create_function(userdb,"BASENAME",0,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_basename,0,0); sqlite3_create_function(userdb,"BCAT",-1,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_bcat,0,0); sqlite3_create_function(userdb,"BYTE",-1,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_byte,0,0); sqlite3_create_function(userdb,"CL",1,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_cl,0,0); sqlite3_create_function(userdb,"CLASS_DATA",2,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_class_data,0,0); sqlite3_create_function(userdb,"CVALUE",1,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_cvalue,0,0); sqlite3_create_function(userdb,"HEROMESH_ESCAPE",1,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_heromesh_escape,0,0); sqlite3_create_function(userdb,"HEROMESH_TYPE",1,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_heromesh_type,0,0); sqlite3_create_function(userdb,"HEROMESH_UNESCAPE",1,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_heromesh_unescape,0,0); sqlite3_create_function(userdb,"INRECT",2,SQLITE_UTF8,0,fn_inrect,0,0); |
︙ |
Modified sql.doc from [556d466297] to [4e9feff88b].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | + + + + + + + + | This document explains the SQL functions and SQL tables which are available for the user customization in Free Hero Mesh. (You cannot use SQL to define the rules of the game.) === Functions === Asterisks denote aggregate/window functions. BASENAME() The base name, which is a copy of the first command-line argument (not counting the switches or the program name). BCAT(...) Concatenate several blobs. Nulls are skipped, if any. BYTE(...) Make a blob; each argument is a number, of which the low 8-bits are used to make the value of one byte in the blob, so the size of the blob will then be the same as the number of arguments. CL(text) Returns the class number, given the class name. If there is no such class, then the result is null. (This may be useful as a shortcut when used with the "OBJECTS" or "CLASSES" table.) CLASS_DATA(id,info) Returns data about a class. |
︙ |