php-src/ext/standard/iptc.c
1999-05-16 11:19:26 +00:00

133 lines
4.2 KiB
C

/*
+----------------------------------------------------------------------+
| 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"
PHP_FUNCTION(iptcparse)
{
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:
*/