Skip to content
Snippets Groups Projects
Commit e61df90f authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

A SAUCE library that can read a SAUCE record or character file metadata.

parent 5f2c1052
No related branches found
No related tags found
No related merge requests found
/****************************************************************************
* @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;
}
/****************************************************************************
* @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 */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment