#include "ascii_header.h"
#include "dada_def.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define STRLEN 131072
static char* whitespace = " \t\n";
char* ascii_header_find (const char* header, const char* keyword)
{
char* key = strstr (header, keyword);
while (key > header)
{
if ( ((*(key-1) == '\n') || (*(key-1) == '\\')) &&
((*(key+strlen(keyword)) == '\t') || (*(key+strlen(keyword)) == ' ')))
break;
key = strstr (key+1, keyword);
}
return key;
}
int ascii_header_set (char* header, const char* keyword,
const char* format, ...)
{
va_list arguments;
char value[STRLEN];
char* eol = 0;
char* dup = 0;
int ret = 0;
char* key = ascii_header_find (header, keyword);
if (key) {
eol = key + strcspn (key, "#\n");
}
else {
eol = strstr (header, "DATA\n");
if (eol)
key = eol;
else
key = header + strlen (header);
}
va_start (arguments, format);
ret = vsnprintf (value, STRLEN, format, arguments);
va_end (arguments);
if (ret < 0) {
perror ("ascii_header_set: error snprintf\n");
return -1;
}
if (eol)
dup = strdup (eol);
if (sprintf (key, "%-12s %-20s ", keyword, value) < 0) {
if (dup)
free (dup);
perror ("ascii_header_set: error sprintf\n");
return -1;
}
if (dup) {
strcat (key, dup);
free (dup);
}
else
strcat (key, "\n");
return 0;
}
int ascii_header_get (const char* header, const char* keyword,
const char* format, ...)
{
va_list arguments;
char* value = 0;
int ret = 0;
char* key = ascii_header_find (header, keyword);
if (!key)
return -1;
value = key + strcspn (key, whitespace);
va_start (arguments, format);
ret = vsscanf (value, format, arguments);
va_end (arguments);
return ret;
}
int ascii_header_del (char * header, const char * keyword)
{
char * key = ascii_header_find (header, keyword);
if (key)
{
char * eol = key + strcspn (key, "\n") + 1;
char * dup = strdup (eol);
if (dup)
{
key[0] = '\0';
strcat (header, dup);
free (dup);
return 0;
}
else
return -1;
}
else
return -1;
}
size_t ascii_header_get_size (char * filename)
{
size_t hdr_size = -1;
int fd = open (filename, O_RDONLY);
if (!fd)
{
fprintf (stderr, "ascii_header_get_size: failed to open %s for reading\n", filename);
}
else
{
hdr_size = ascii_header_get_size_fd (fd);
close (fd);
}
return hdr_size;
}
size_t ascii_header_get_size_fd (int fd)
{
size_t hdr_size = -1;
size_t default_header_size = DADA_DEFAULT_HEADER_SIZE;
char * header = (char *) malloc (default_header_size + 1);
if (!header)
{
fprintf (stderr, "ascii_header_get_size: failed to allocate %ld bytes\n", default_header_size + 1);
}
else
{
lseek (fd, 0, SEEK_SET);
ssize_t ret = read (fd, header, default_header_size);
if (ret != default_header_size)
{
fprintf (stderr, "ascii_header_get_size: failed to read %ld bytes from file\n", default_header_size);
}
else
{
if (ascii_header_get (header, "HDR_SIZE", "%ld", &hdr_size) != 1)
{
fprintf (stderr, "ascii_header_get_size: failed to read HDR_SIZE from header\n");
hdr_size = -1;
}
}
lseek (fd, 0, SEEK_SET);
free (header);
}
return hdr_size;
}