From 08622b553642e4ebc94a3e42468f1f4899d9306d Mon Sep 17 00:00:00 2001 From: Rob Swindell <rob@synchro.net> Date: Fri, 23 Apr 2021 23:28:28 -0700 Subject: [PATCH] A SAUCE library that can read a SAUCE record or character file metadata. --- src/sbbs3/sauce.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++ src/sbbs3/sauce.h | 48 ++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 src/sbbs3/sauce.c create mode 100644 src/sbbs3/sauce.h diff --git a/src/sbbs3/sauce.c b/src/sbbs3/sauce.c new file mode 100644 index 0000000000..a70140a50f --- /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 0000000000..ed3c2d3efd --- /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 */ -- GitLab