1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
// Copyright 2011 Juri Glass, Mathias Runge, Nadim El Sayed
// DAI-Labor, TU-Berlin
//
// This file is part of libSML.
//
// libSML is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// libSML 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 the GNU General Public License
// along with libSML. If not, see <http://www.gnu.org/licenses/>.
#include <sml/sml_file.h>
#include <sml/sml_shared.h>
#include <sml/sml_message.h>
#include <sml/sml_number.h>
#include <sml/sml_time.h>
#include <stdio.h>
#include <string.h>
// EDL meter must provide at least 250 bytes as a receive buffer
#define SML_FILE_BUFFER_LENGTH 512
sml_file *sml_file_parse(unsigned char *buffer, size_t buffer_len) {
sml_file *file = (sml_file*) malloc(sizeof(sml_file));
*file = ( sml_file ) {
.messages = NULL,
.messages_len = 0,
.buf = NULL
};
sml_buffer *buf = sml_buffer_init(buffer_len);
memcpy(buf->buffer, buffer, buffer_len);
file->buf = buf;
sml_message *msg;
// parsing all messages
for (; buf->cursor < buf->buffer_len;) {
if(sml_buf_get_current_byte(buf) == SML_MESSAGE_END) {
// reading trailing zeroed bytes
sml_buf_update_bytes_read(buf, 1);
continue;
}
msg = sml_message_parse(buf);
if (sml_buf_has_errors(buf)) {
fprintf(stderr,"libsml: warning: could not read the whole file\n");
break;
}
sml_file_add_message(file, msg);
}
return file;
}
sml_file *sml_file_init() {
sml_file *file = (sml_file*) malloc(sizeof(sml_file));
*file = ( sml_file ) {
.messages = NULL,
.messages_len = 0,
.buf = NULL
};
sml_buffer *buf = sml_buffer_init(SML_FILE_BUFFER_LENGTH);
file->buf = buf;
return file;
}
void sml_file_add_message(sml_file *file, sml_message *message) {
file->messages_len++;
file->messages = (sml_message **) realloc(file->messages, sizeof(sml_message *) * file->messages_len);
file->messages[file->messages_len - 1] = message;
}
void sml_file_write(sml_file *file) {
int i;
if (file->messages && file->messages_len > 0) {
for (i = 0; i < file->messages_len; i++) {
sml_message_write(file->messages[i], file->buf);
}
}
}
void sml_file_free(sml_file *file) {
if (file) {
if (file->messages) {
int i;
for (i = 0; i < file->messages_len; i++) {
sml_message_free(file->messages[i]);
}
free(file->messages);
}
if (file->buf) {
sml_buffer_free(file->buf);
}
free(file);
}
}
void sml_file_print(sml_file *file) {
int i;
printf("SML file (%d SML messages, %zu bytes)\n", file->messages_len, file->buf->cursor);
for (i = 0; i < file->messages_len; i++) {
printf("SML message %4.X\n", *(file->messages[i]->message_body->tag));
}
}
|