summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/lib
diff options
context:
space:
mode:
authorPeter Breitenlohner <peb@mppmu.mpg.de>2015-07-04 11:28:05 +0000
committerPeter Breitenlohner <peb@mppmu.mpg.de>2015-07-04 11:28:05 +0000
commit1b54746a7a7087af138fe21c002cd967fdaf6597 (patch)
tree7b2910c2dc0bf60f055f7adba0f25fc8b7b42b2a /Build/source/texk/web2c/lib
parent4ebe01e691e6b0b4d0373f42e02118c6641573ed (diff)
e-(u)pTeX: Add \pdfmdfivesum as in pdfTeX (from Hironori Kitagawa)
git-svn-id: svn://tug.org/texlive/trunk@37756 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/lib')
-rw-r--r--Build/source/texk/web2c/lib/ChangeLog5
-rw-r--r--Build/source/texk/web2c/lib/texmfmp.c78
2 files changed, 82 insertions, 1 deletions
diff --git a/Build/source/texk/web2c/lib/ChangeLog b/Build/source/texk/web2c/lib/ChangeLog
index 7771412da7a..2bb8387c24f 100644
--- a/Build/source/texk/web2c/lib/ChangeLog
+++ b/Build/source/texk/web2c/lib/ChangeLog
@@ -1,3 +1,8 @@
+2015-07-02 Hironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
+
+ * texmfmp.c: Moved convertStringToHexString() and getmd5sum()
+ from ../pdftexdir/utils.c to here.
+
2015-06-12 Peter Breitenlohner <peb@mppmu.mpg.de>
Integrate MFLua and MFLuaJIT.
diff --git a/Build/source/texk/web2c/lib/texmfmp.c b/Build/source/texk/web2c/lib/texmfmp.c
index b81526a8519..bbe10eb376a 100644
--- a/Build/source/texk/web2c/lib/texmfmp.c
+++ b/Build/source/texk/web2c/lib/texmfmp.c
@@ -2836,6 +2836,7 @@ makesrcspecial (strnumber srcfilename, int lineno)
#if defined (pdfTeX) || defined (epTeX) || defined (eupTeX)
#include <kpathsea/c-stat.h>
+#include "md5.h"
#define check_nprintf(size_get, size_want) \
if ((unsigned)(size_get) >= (unsigned)(size_want)) \
@@ -3135,7 +3136,82 @@ void getfiledump(integer s, int offset, int length)
}
xfree(file_name);
}
-#endif /* e-pTeX or e-upTeX */
+
+
+/* Converts any given string in into an allowed PDF string which is
+ * hexadecimal encoded;
+ * sizeof(out) should be at least lin*2+1.
+ */
+void convertStringToHexString(const char *in, char *out, int lin)
+{
+ int i, j, k;
+ char buf[3];
+ j = 0;
+ for (i = 0; i < lin; i++) {
+ k = snprintf(buf, sizeof(buf),
+ "%02X", (unsigned int) (unsigned char) in[i]);
+ check_nprintf(k, sizeof(buf));
+ out[j++] = buf[0];
+ out[j++] = buf[1];
+ }
+ out[j] = '\0';
+}
+
+#define DIGEST_SIZE 16
+#define FILE_BUF_SIZE 1024
+
+void getmd5sum(strnumber s, boolean file)
+{
+ md5_state_t state;
+ md5_byte_t digest[DIGEST_SIZE];
+ char outbuf[2 * DIGEST_SIZE + 1];
+ int len = 2 * DIGEST_SIZE;
+
+ if (file) {
+ char file_buf[FILE_BUF_SIZE];
+ int read = 0;
+ FILE *f;
+
+ char *file_name = kpse_find_tex(makecfilename(s));
+ if (file_name == NULL) {
+ return; /* empty string */
+ }
+ /* in case of error the empty string is returned,
+ no need for xfopen that aborts on error.
+ */
+ f = fopen(file_name, FOPEN_RBIN_MODE);
+ if (f == NULL) {
+ xfree(file_name);
+ return;
+ }
+ recorder_record_input(file_name);
+ md5_init(&state);
+ while ((read = fread(&file_buf, sizeof(char), FILE_BUF_SIZE, f)) > 0) {
+ md5_append(&state, (const md5_byte_t *) file_buf, read);
+ }
+ md5_finish(&state, digest);
+ fclose(f);
+
+ xfree(file_name);
+ } else {
+ /* s contains the data */
+ md5_init(&state);
+ md5_append(&state,
+ (const md5_byte_t *) &strpool[strstart[s]],
+ strstart[s + 1] - strstart[s]);
+ md5_finish(&state, digest);
+ }
+
+ if (poolptr + len >= poolsize) {
+ /* error by str_toks that calls str_room(1) */
+ return;
+ }
+ convertStringToHexString((char *) digest, outbuf, DIGEST_SIZE);
+ memcpy(&strpool[poolptr], outbuf, len);
+ poolptr += len;
+}
+
+#endif /* pdfTeX or e-pTeX or e-upTeX */
#endif /* TeX */
/* Metafont/MetaPost fraction routines. Replaced either by assembler or C.