diff --git a/src/sbbs3/sauce.c b/src/sbbs3/sauce.c new file mode 100644 index 0000000000000000000000000000000000000000..a70140a50f3121a067b0b2a0ec5d8744df867f42 --- /dev/null +++ b/src/sbbs3/sauce.c @@ -0,0 +1,75 @@ +/**************************************************************************** + * @format.tab-size 4 (Plain Text/Source Code File Header) * + * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * + * * + * Copyright Rob Swindell - http://www.synchro.net/copyright.html * + * * + * This program 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 2 * + * of the License, or (at your option) any later version. * + * See the GNU General Public License for more details: gpl.txt or * + * http://www.fsf.org/copyleft/gpl.html * + * * + * For Synchronet coding style and modification guidelines, see * + * http://www.synchro.net/source.html * + * * + * Note: If this box doesn't appear square, then you need to fix your tabs. * + ****************************************************************************/ + +#include "sauce.h" +#include "genwrap.h" +#include "filewrap.h" + +// Saves and restores current file position +// Note: Does not support comments +bool sauce_fread_record(FILE* fp, sauce_record_t* record) +{ + off_t offset = ftello(fp); + + if(offset == -1) + return false; + + if(fseeko(fp, -(int)sizeof(*record), SEEK_END) != 0) + return false; + + bool result = fread(record, sizeof(*record), 1, fp) == 1 + && memcmp(record->id, SAUCE_ID, SAUCE_LEN_ID) == 0 + && memcmp(record->ver, SAUCE_VERSION, SAUCE_LEN_VERSION) == 0; + + fseeko(fp, offset, SEEK_SET); + return result; +} + +// Get 'type' and/or 'info' from SAUCE record of open file (fp) of DataType 'Character' +bool sauce_fread_charinfo(FILE* fp, enum sauce_char_filetype* type, struct sauce_charinfo* info) +{ + sauce_record_t record; + + if(!sauce_fread_record(fp, &record)) + return false; + + if(record.datatype != sauce_datatype_char) + return false; + + if(type != NULL) + *type = record.filetype; + if(info != NULL) { + memset(info, 0, sizeof(*info)); + SAFECOPY(info->title, record.title), truncsp(info->title); + SAFECOPY(info->author, record.author), truncsp(info->author); + SAFECOPY(info->group, record.group), truncsp(info->group); + SAFECOPY(info->date, record.date), truncsp(info->date); + info->width = record.tinfo1; + info->height = record.tinfo2; + switch(record.filetype) { + case sauce_char_filetype_ascii: + case sauce_char_filetype_ansi: + case sauce_char_filetype_ansimation: + if(record.tflags & sauce_ansiflag_nonblink) + info->ice_color = true; + break; + } + } + return true; +} diff --git a/src/sbbs3/sauce.h b/src/sbbs3/sauce.h new file mode 100644 index 0000000000000000000000000000000000000000..ed3c2d3efdd79c0bb2ac3be8f02ffa13b99ec16a --- /dev/null +++ b/src/sbbs3/sauce.h @@ -0,0 +1,48 @@ +/**************************************************************************** + * @format.tab-size 4 (Plain Text/Source Code File Header) * + * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * + * * + * Copyright Rob Swindell - http://www.synchro.net/copyright.html * + * * + * This program 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 2 * + * of the License, or (at your option) any later version. * + * See the GNU General Public License for more details: gpl.txt or * + * http://www.fsf.org/copyleft/gpl.html * + * * + * For Synchronet coding style and modification guidelines, see * + * http://www.synchro.net/source.html * + * * + * Note: If this box doesn't appear square, then you need to fix your tabs. * + ****************************************************************************/ + +#ifndef SAUCE_H_ +#define SAUCE_H_ + +#include <stdio.h> +#include <stdbool.h> +#include "saucedefs.h" + +struct sauce_charinfo { + char title[SAUCE_LEN_TITLE + 1]; + char author[SAUCE_LEN_AUTHOR + 1]; + char group[SAUCE_LEN_GROUP + 1]; + char date[SAUCE_LEN_DATE + 1]; + int height; + int width; + bool ice_color; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +// Note: Does not support comments +bool sauce_fread_record(FILE*, sauce_record_t*); +bool sauce_fread_charinfo(FILE*, enum sauce_char_filetype*, struct sauce_charinfo*); + +#ifdef __cplusplus +} +#endif +#endif /* Don't add anything after this line */