diff --git a/internal/c/libqb/include/compression.h b/internal/c/libqb/include/compression.h index d7c971318..0364f7b02 100644 --- a/internal/c/libqb/include/compression.h +++ b/internal/c/libqb/include/compression.h @@ -9,5 +9,7 @@ struct qbs; +uint32_t func__adler32(qbs *text); +uint32_t func__crc32(qbs *text); qbs *func__deflate(qbs *text); qbs *func__inflate(qbs *text, int64_t originalsize, int32_t passed); diff --git a/internal/c/libqb/include/font.h b/internal/c/libqb/include/font.h index 24a4c6922..f96c343f7 100644 --- a/internal/c/libqb/include/font.h +++ b/internal/c/libqb/include/font.h @@ -49,6 +49,7 @@ bool FontRenderTextASCII(int32_t fh, const uint8_t *codepoint, int32_t codepoint int32_t FontPrintWidthUTF32(int32_t fh, const uint32_t *codepoint, int32_t codepoints); int32_t FontPrintWidthASCII(int32_t fh, const uint8_t *codepoint, int32_t codepoints); +qbs *func__md5(qbs *text); int32_t func__UFontHeight(int32_t qb64_fh, int32_t passed); int32_t func__UPrintWidth(const qbs *text, int32_t utf_encoding, int32_t qb64_fh, int32_t passed); int32_t func__ULineSpacing(int32_t qb64_fh, int32_t passed); diff --git a/internal/c/parts/compression/build.mk b/internal/c/parts/compression/build.mk index 044b4b275..192c54c46 100644 --- a/internal/c/parts/compression/build.mk +++ b/internal/c/parts/compression/build.mk @@ -10,7 +10,7 @@ MINIZ_OBJS := $(patsubst %.c,$(PATH_INTERNAL_C)/parts/compression/%.o,$(MINIZ_SR COMPRESSION_OBJS := $(patsubst %.cpp,$(PATH_INTERNAL_C)/parts/compression/%.o,$(COMPRESSION_SRCS)) $(PATH_INTERNAL_C)/parts/compression/%.o: $(PATH_INTERNAL_C)/parts/compression/%.c - $(CC) -O2 $(CFLAGS) -DDEPENDENCY_CONSOLE_ONLY -Wall $< -c -o $@ + $(CC) -O2 $(CFLAGS) -DDEPENDENCY_CONSOLE_ONLY -DMINIZ_NO_STDIO -DMINIZ_NO_TIME -DMINIZ_NO_ARCHIVE_APIS -DMINIZ_NO_ARCHIVE_WRITING_APIS -Wall $< -c -o $@ $(PATH_INTERNAL_C)/parts/compression/%.o: $(PATH_INTERNAL_C)/parts/compression/%.cpp $(CXX) -O2 $(CXXFLAGS) -DDEPENDENCY_CONSOLE_ONLY -Wall $< -c -o $@ diff --git a/internal/c/parts/compression/compression.cpp b/internal/c/parts/compression/compression.cpp index 25909daea..bfb064ee7 100644 --- a/internal/c/parts/compression/compression.cpp +++ b/internal/c/parts/compression/compression.cpp @@ -7,6 +7,16 @@ #include "../../libqb.h" #include "miniz.h" +uint32_t func__adler32(qbs *text) { + if (!text->len) return 1; + return (uint32_t) adler32(1, text->chr, text->len); +} + +uint32_t func__crc32(qbs *text) { + if (!text->len) return 0; + return (uint32_t) crc32(0, text->chr, text->len); +} + qbs *func__deflate(qbs *text) { uLongf filesize = (uint32_t)text->len; // length of the text uLongf compsize = compressBound(filesize); diff --git a/internal/c/parts/video/font/font.cpp b/internal/c/parts/video/font/font.cpp index 22c9514e4..fd7b589be 100644 --- a/internal/c/parts/video/font/font.cpp +++ b/internal/c/parts/video/font/font.cpp @@ -14,6 +14,9 @@ #include #include #include FT_FREETYPE_H +extern "C" { +#include "freetype/md5.h" +} #include #include @@ -1006,6 +1009,27 @@ bool FontRenderTextASCII(int32_t fh, const uint8_t *codepoint, int32_t codepoint return false; } +/// @brief Expose freetype's MD5 procedure for public use +/// @param text The message to build the MD5 hash of +/// @return The generated MD5 hash as hexadecimal string +qbs *func__md5(qbs *text) { + { + MD5_CTX ctx; + unsigned char md5[16]; + qbs *res; + int i; + + MD5_Init(&ctx); + if (text->len) MD5_Update(&ctx, text->chr, text->len); + MD5_Final(md5,&ctx); + + res = qbs_new(32, 1); + for (i = 0; i < 16; i++) sprintf((char*)&res->chr[i*2], "%02X", md5[i]); + + return res; + } +} + /// @brief Return the true font height in pixel /// @param qb64_fh A QB64 font handle (this can be a builtin font as well) /// @param passed Optional arguments flag diff --git a/source/subs_functions/subs_functions.bas b/source/subs_functions/subs_functions.bas index 81bb8acf8..e0bd102ef 100644 --- a/source/subs_functions/subs_functions.bas +++ b/source/subs_functions/subs_functions.bas @@ -1411,6 +1411,18 @@ id.ret = LONGTYPE - ISPOINTER id.hr_syntax = "_FONT[(imageHandle&)]" regid +clearid +id.n = qb64prefix$ + "Md5" +id.Dependency=DEPENDENCY_LOADFONT +id.musthave = "$" +id.subfunc = 1 +id.callname = "func__md5" +id.args = 1 +id.arg = MKL$(STRINGTYPE - ISPOINTER) +id.ret = STRINGTYPE - ISPOINTER +id.hr_syntax = "_MD5$(dataString$)" +regid + clearid id.n = qb64prefix$ + "PrintString" id.subfunc = 2 @@ -3814,6 +3826,28 @@ id.hr_syntax = "_ROR(numericalVariable, numericalValue)" regid ' a740g: end of ROR & ROL additions +clearid +id.n = qb64prefix$ + "Adler32" +id.Dependency=DEPENDENCY_ZLIB +id.subfunc = 1 +id.callname = "func__adler32" +id.args = 1 +id.arg = MKL$(STRINGTYPE - ISPOINTER) +id.ret = ULONGTYPE - ISPOINTER +id.hr_syntax = "_ADLER32(dataString$)" +regid + +clearid +id.n = qb64prefix$ + "Crc32" +id.Dependency=DEPENDENCY_ZLIB +id.subfunc = 1 +id.callname = "func__crc32" +id.args = 1 +id.arg = MKL$(STRINGTYPE - ISPOINTER) +id.ret = ULONGTYPE - ISPOINTER +id.hr_syntax = "_CRC32(dataString$)" +regid + clearid id.n = qb64prefix$ + "Deflate" id.Dependency=DEPENDENCY_ZLIB diff --git a/source/subs_functions/syntax_highlighter_list.bas b/source/subs_functions/syntax_highlighter_list.bas index 30ed41c8e..2d3e7c023 100644 --- a/source/subs_functions/syntax_highlighter_list.bas +++ b/source/subs_functions/syntax_highlighter_list.bas @@ -4,6 +4,6 @@ listOfKeywords$ = listOfKeywords$ + "_ERRORLINE@_ERRORMESSAGE$@_EXIT@_EXPLICIT@_ listOfKeywords$ = listOfKeywords$ + "_GLCOPYTEXSUBIMAGE2D@_GLCULLFACE@_GLDELETELISTS@_GLDELETETEXTURES@_GLDEPTHFUNC@_GLDEPTHMASK@_GLDEPTHRANGE@_GLDISABLE@_GLDISABLECLIENTSTATE@_GLDRAWARRAYS@_GLDRAWBUFFER@_GLDRAWELEMENTS@_GLDRAWPIXELS@_GLEDGEFLAG@_GLEDGEFLAGPOINTER@_GLEDGEFLAGV@_GLENABLE@_GLENABLECLIENTSTATE@_GLEND@_GLENDLIST@_GLEVALCOORD1D@_GLEVALCOORD1DV@_GLEVALCOORD1F@_GLEVALCOORD1FV@_GLEVALCOORD2D@_GLEVALCOORD2DV@_GLEVALCOORD2F@_GLEVALCOORD2FV@_GLEVALMESH1@_GLEVALMESH2@_GLEVALPOINT1@_GLEVALPOINT2@_GLFEEDBACKBUFFER@_GLFINISH@_GLFLUSH@_GLFOGF@_GLFOGFV@_GLFOGI@_GLFOGIV@_GLFRONTFACE@_GLFRUSTUM@_GLGENLISTS@_GLGENTEXTURES@_GLGETBOOLEANV@_GLGETCLIPPLANE@_GLGETDOUBLEV@_GLGETERROR@_GLGETFLOATV@_GLGETINTEGERV@_GLGETLIGHTFV@_GLGETLIGHTIV@_GLGETMAPDV@_GLGETMAPFV@_GLGETMAPIV@_GLGETMATERIALFV@_GLGETMATERIALIV@_GLGETPIXELMAPFV@_GLGETPIXELMAPUIV@_GLGETPIXELMAPUSV@_GLGETPOINTERV@_GLGETPOLYGONSTIPPLE@_GLGETSTRING@_GLGETTEXENVFV@_GLGETTEXENVIV@_GLGETTEXGENDV@_GLGETTEXGENFV@_GLGETTEXGENIV@_GLGETTEXIMAGE@_GLGETTEXLEVELPARAMETERFV@_GLGETTEXLEVELPARAMETERIV@_GLGETTEXPARAMETERFV@_GLGETTEXPARAMETERIV@_GLHINT@_GLINDEXMASK@_GLINDEXPOINTER@_GLINDEXD@_GLINDEXDV@_GLINDEXF@_GLINDEXFV@_GLINDEXI@_GLINDEXIV@_GLINDEXS@_GLINDEXSV@_GLINDEXUB@_GLINDEXUBV@_GLINITNAMES@_GLINTERLEAVEDARRAYS@_GLISENABLED@_GLISLIST@_GLISTEXTURE@_GLLIGHTMODELF@_GLLIGHTMODELFV@_GLLIGHTMODELI@_GLLIGHTMODELIV@_GLLIGHTF@_GLLIGHTFV@_GLLIGHTI@_GLLIGHTIV@_GLLINESTIPPLE@_GLLINEWIDTH@_GLLISTBASE@_GLLOADIDENTITY@_GLLOADMATRIXD@_GLLOADMATRIXF@_GLLOADNAME@_GLLOGICOP@_GLMAP1D@_GLMAP1F@_GLMAP2D@_GLMAP2F@_GLMAPGRID1D@_GLMAPGRID1F@_GLMAPGRID2D@_GLMAPGRID2F@_GLMATERIALF@_GLMATERIALFV@_GLMATERIALI@_GLMATERIALIV@_GLMATRIXMODE@_GLMULTMATRIXD@_GLMULTMATRIXF@_GLNEWLIST@_GLNORMAL3B@_GLNORMAL3BV@_GLNORMAL3D@_GLNORMAL3DV@_GLNORMAL3F@_GLNORMAL3FV@_GLNORMAL3I@_GLNORMAL3IV@_GLNORMAL3S@_GLNORMAL3SV@_GLNORMALPOINTER@_GLORTHO@_GLPASSTHROUGH@_GLPIXELMAPFV@_GLPIXELMAPUIV@_GLPIXELMAPUSV@_GLPIXELSTOREF@_GLPIXELSTOREI@_GLPIXELTRANSFERF@_GLPIXELTRANSFERI@_GLPIXELZOOM@_GLPOINTSIZE@_GLPOLYGONMODE@_GLPOLYGONOFFSET@_GLPOLYGONSTIPPLE@" listOfKeywords$ = listOfKeywords$ + "_GLPOPATTRIB@_GLPOPCLIENTATTRIB@_GLPOPMATRIX@_GLPOPNAME@_GLPRIORITIZETEXTURES@_GLPUSHATTRIB@_GLPUSHCLIENTATTRIB@_GLPUSHMATRIX@_GLPUSHNAME@_GLRASTERPOS2D@_GLRASTERPOS2DV@_GLRASTERPOS2F@_GLRASTERPOS2FV@_GLRASTERPOS2I@_GLRASTERPOS2IV@_GLRASTERPOS2S@_GLRASTERPOS2SV@_GLRASTERPOS3D@_GLRASTERPOS3DV@_GLRASTERPOS3F@_GLRASTERPOS3FV@_GLRASTERPOS3I@_GLRASTERPOS3IV@_GLRASTERPOS3S@_GLRASTERPOS3SV@_GLRASTERPOS4D@_GLRASTERPOS4DV@_GLRASTERPOS4F@_GLRASTERPOS4FV@_GLRASTERPOS4I@_GLRASTERPOS4IV@_GLRASTERPOS4S@_GLRASTERPOS4SV@_GLREADBUFFER@_GLREADPIXELS@_GLRECTD@_GLRECTDV@_GLRECTF@_GLRECTFV@_GLRECTI@_GLRECTIV@_GLRECTS@_GLRECTSV@_GLRENDERMODE@_GLROTATED@_GLROTATEF@_GLSCALED@_GLSCALEF@_GLSCISSOR@_GLSELECTBUFFER@_GLSHADEMODEL@_GLSTENCILFUNC@_GLSTENCILMASK@_GLSTENCILOP@_GLTEXCOORD1D@_GLTEXCOORD1DV@_GLTEXCOORD1F@_GLTEXCOORD1FV@_GLTEXCOORD1I@_GLTEXCOORD1IV@_GLTEXCOORD1S@_GLTEXCOORD1SV@_GLTEXCOORD2D@_GLTEXCOORD2DV@_GLTEXCOORD2F@_GLTEXCOORD2FV@_GLTEXCOORD2I@_GLTEXCOORD2IV@_GLTEXCOORD2S@_GLTEXCOORD2SV@_GLTEXCOORD3D@_GLTEXCOORD3DV@_GLTEXCOORD3F@_GLTEXCOORD3FV@_GLTEXCOORD3I@_GLTEXCOORD3IV@_GLTEXCOORD3S@_GLTEXCOORD3SV@_GLTEXCOORD4D@_GLTEXCOORD4DV@_GLTEXCOORD4F@_GLTEXCOORD4FV@_GLTEXCOORD4I@_GLTEXCOORD4IV@_GLTEXCOORD4S@_GLTEXCOORD4SV@_GLTEXCOORDPOINTER@_GLTEXENVF@_GLTEXENVFV@_GLTEXENVI@_GLTEXENVIV@_GLTEXGEND@_GLTEXGENDV@_GLTEXGENF@_GLTEXGENFV@_GLTEXGENI@_GLTEXGENIV@_GLTEXIMAGE1D@_GLTEXIMAGE2D@_GLTEXPARAMETERF@_GLTEXPARAMETERFV@_GLTEXPARAMETERI@_GLTEXPARAMETERIV@_GLTEXSUBIMAGE1D@_GLTEXSUBIMAGE2D@_GLTRANSLATED@_GLTRANSLATEF@_GLVERTEX2D@_GLVERTEX2DV@_GLVERTEX2F@_GLVERTEX2FV@_GLVERTEX2I@_GLVERTEX2IV@_GLVERTEX2S@_GLVERTEX2SV@_GLVERTEX3D@_GLVERTEX3DV@_GLVERTEX3F@_GLVERTEX3FV@_GLVERTEX3I@_GLVERTEX3IV@_GLVERTEX3S@_GLVERTEX3SV@_GLVERTEX4D@_GLVERTEX4DV@_GLVERTEX4F@_GLVERTEX4FV@_GLVERTEX4I@_GLVERTEX4IV@_GLVERTEX4S@_GLVERTEX4SV@_GLVERTEXPOINTER@_GLVIEWPORT@SMOOTH@STRETCH@_ANTICLOCKWISE@_BEHIND@_CLEAR@_FILLBACKGROUND@_GLUPERSPECTIVE@_HARDWARE@_HARDWARE1@_KEEPBACKGROUND@_NONE@_OFF@_ONLY@_ONLYBACKGROUND@_ONTOP@_SEAMLESS@_SMOOTH@_SMOOTHSHRUNK@_SMOOTHSTRETCHED@" listOfKeywords$ = listOfKeywords$ + "_SOFTWARE@_SQUAREPIXELS@_STRETCH@_ALLOWFULLSCREEN@_ALL@_ECHO@_INSTRREV@_TRIM$@_ACCEPTFILEDROP@_FINISHDROP@_TOTALDROPPEDFILES@_DROPPEDFILE@_DROPPEDFILE$@_SHR@_SHL@_ROR@_ROL@" -listOfKeywords$ = listOfKeywords$ + "_DEFLATE$@_INFLATE$@_READBIT@_RESETBIT@_SETBIT@_TOGGLEBIT@$ASSERTS@CONSOLE@_ASSERT@_CAPSLOCK@_NUMLOCK@_SCROLLLOCK@_TOGGLE@_CONSOLEFONT@_CONSOLECURSOR@_CONSOLEINPUT@_CINP@$NOPREFIX@$COLOR@$DEBUG@$EMBED@_EMBEDDED$@_ENVIRONCOUNT@$UNSTABLE@$MIDISOUNDFONT@" +listOfKeywords$ = listOfKeywords$ + "_ADLER32@_CRC32@_MD5$@_DEFLATE$@_INFLATE$@_READBIT@_RESETBIT@_SETBIT@_TOGGLEBIT@$ASSERTS@CONSOLE@_ASSERT@_CAPSLOCK@_NUMLOCK@_SCROLLLOCK@_TOGGLE@_CONSOLEFONT@_CONSOLECURSOR@_CONSOLEINPUT@_CINP@$NOPREFIX@$COLOR@$DEBUG@$EMBED@_EMBEDDED$@_ENVIRONCOUNT@$UNSTABLE@$MIDISOUNDFONT@" listOfKeywords$ = listOfKeywords$ + "_NOTIFYPOPUP@_MESSAGEBOX@_INPUTBOX$@_SELECTFOLDERDIALOG$@_COLORCHOOSERDIALOG@_OPENFILEDIALOG$@_SAVEFILEDIALOG$@_SAVEIMAGE@_FILES$@_FULLPATH$@" listOfKeywords$ = listOfKeywords$ + "_STATUSCODE@_SNDNEW@_SCALEDWIDTH@_SCALEDHEIGHT@_UFONTHEIGHT@_UPRINTWIDTH@_ULINESPACING@_UPRINTSTRING@_UCHARPOS@" diff --git a/tests/compile_tests/hash/test.bas b/tests/compile_tests/hash/test.bas new file mode 100644 index 000000000..bfec94efc --- /dev/null +++ b/tests/compile_tests/hash/test.bas @@ -0,0 +1,21 @@ +$CONSOLE +_DEST _CONSOLE + +t$ = "QB64 Phoenix Edition" +PRINT " Text: "; t$ +PRINT "Txt-Len: "; LTRIM$(STR$(LEN(t$))) +PRINT "-----------------------------------------" +PRINT "Adler32: "; RIGHT$("00000000" + HEX$(_ADLER32(t$)), 8) +PRINT " Crc32: "; RIGHT$("00000000" + HEX$(_CRC32(t$)), 8) +PRINT " Md5: "; _MD5$(t$) +PRINT +t$ = "" +PRINT " Text: "; t$ +PRINT "Txt-Len: "; LTRIM$(STR$(LEN(t$))) +PRINT "-----------------------------------------" +PRINT "Adler32: "; RIGHT$("00000000" + HEX$(_ADLER32(t$)), 8) +PRINT " Crc32: "; RIGHT$("00000000" + HEX$(_CRC32(t$)), 8) +PRINT " Md5: "; _MD5$(t$) + +SYSTEM + diff --git a/tests/compile_tests/hash/test.output b/tests/compile_tests/hash/test.output new file mode 100644 index 000000000..c8aac1fb5 --- /dev/null +++ b/tests/compile_tests/hash/test.output @@ -0,0 +1,13 @@ + Text: QB64 Phoenix Edition +Txt-Len: 20 +----------------------------------------- +Adler32: 41F806E5 + Crc32: 691EE005 + Md5: E512ECA19E9487D7C2F564E848314238 + + Text: +Txt-Len: 0 +----------------------------------------- +Adler32: 00000001 + Crc32: 00000000 + Md5: D41D8CD98F00B204E9800998ECF8427E