summaryrefslogtreecommitdiff
path: root/ext/standard/iptc.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/iptc.c')
-rw-r--r--ext/standard/iptc.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/ext/standard/iptc.c b/ext/standard/iptc.c
new file mode 100644
index 0000000000..c0711d66be
--- /dev/null
+++ b/ext/standard/iptc.c
@@ -0,0 +1,132 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) 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. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | 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 both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Thies C. Arntzen (thies@digicol.de) |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+/*
+ * Functions to parse & compse IPTC data.
+ * PhotoShop >= 3.0 can read and write textual data to JPEG files.
+ * ... more to come .....
+ */
+
+/*
+ * TODO:
+ * - add IPTC translation table
+ * - implement a call to embed iptc into a JPEG file
+ */
+
+#include "php.h"
+#include "php3_iptc.h"
+
+void php3_iptcparse(INTERNAL_FUNCTION_PARAMETERS)
+{
+ unsigned int length, inx, len, inheader, tagsfound;
+ unsigned char *buffer;
+ unsigned char recnum, dataset;
+ unsigned char key[ 16 ];
+ pval values, *str, *element;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+
+
+ inx = 0;
+ length = str->value.str.len;
+ buffer = str->value.str.val;
+
+ inheader = 0; /* have we already found the IPTC-Header??? */
+ tagsfound = 0; /* number of tags already found */
+
+ while (inx < length) {
+ if (buffer[ inx++ ] != 0x1c) { /* skip all junk */
+ if (inheader) {
+ break; /* we ran against some data which does not conform to IPTC - stop parsing! */
+ } else {
+ continue;
+ }
+ } else {
+ inheader = 1;
+ }
+
+ if ((inx + 4) >= length)
+ break;
+
+ dataset = buffer[ inx++ ];
+ recnum = buffer[ inx++ ];
+
+ if (buffer[ inx ] & (unsigned char) 0x80) {
+ len = (((long) buffer[ inx + 2 ]) << 24) + (((long) buffer[ inx + 3 ]) << 16) +
+ (((long) buffer[ inx + 4 ]) << 8) + (((long) buffer[ inx + 5 ]));
+ inx += 6;
+ } else {
+ len = (((unsigned short) buffer[ inx ])<<8) | (unsigned short)buffer[ inx+1 ];
+ inx += 2;
+ }
+
+ sprintf(key,"%d#%03d",(unsigned int) dataset,(unsigned int) recnum);
+
+ if ((inx + len) > length)
+ break;
+
+ if (tagsfound == 0) { /* found the 1st tag - initialize the return array */
+ if (array_init(return_value) == FAILURE) {
+ php3_error(E_ERROR, "Unable to initialize array");
+ RETURN_FALSE;
+ }
+ }
+
+ if (_php3_hash_find(return_value->value.ht,key,strlen(key) + 1,(void **) &element) == FAILURE) {
+ if (array_init(&values) == FAILURE) {
+ php3_error(E_ERROR, "Unable to initialize array");
+ RETURN_FALSE;
+ }
+
+ _php3_hash_update(return_value->value.ht, key, strlen(key)+1, (void *) &values, sizeof(pval), (void **) &element);
+ }
+
+ add_next_index_stringl(element,buffer+inx,len,1);
+
+ inx += len;
+
+ tagsfound++;
+ }
+
+ if (! tagsfound) {
+ RETURN_FALSE;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */