Files
tlib/oversampling/WDL/projectcontext.h
2024-05-24 13:28:31 +02:00

106 lines
3.9 KiB
C++

#ifndef _PROJECTCONTEXT_H_
#define _PROJECTCONTEXT_H_
#include "wdltypes.h"
class WDL_FastString;
class WDL_HeapBuf;
class WDL_FastQueue;
#ifndef _REAPER_PLUGIN_PROJECTSTATECONTEXT_DEFINED_
#define _WDL_PROJECTSTATECONTEXT_DEFINED_
class ProjectStateContext // this is also defined in reaper_plugin.h (keep them identical, thx)
{
public:
virtual ~ProjectStateContext(){};
virtual void WDL_VARARG_WARN(printf,2,3) AddLine(const char *fmt, ...) = 0;
virtual int GetLine(char *buf, int buflen)=0; // returns -1 on eof
virtual WDL_INT64 GetOutputSize()=0;
virtual int GetTempFlag()=0;
virtual void SetTempFlag(int flag)=0;
};
#endif
ProjectStateContext *ProjectCreateFileRead(const char *fn);
ProjectStateContext *ProjectCreateFileWrite(const char *fn);
ProjectStateContext *ProjectCreateMemCtx(WDL_HeapBuf *hb); // read or write (ugh, deprecated), be sure to delete it before accessing hb
ProjectStateContext *ProjectCreateMemCtx_Read(const WDL_HeapBuf *hb); // read only
ProjectStateContext *ProjectCreateMemCtx_Write(WDL_HeapBuf *hb); // write only, be sure to delete it before accessing hb
ProjectStateContext *ProjectCreateMemWriteFastQueue(WDL_FastQueue *fq); // only write! no need to do anything at all before accessing (can clear/reuse as necessary)
// helper functions
class LineParser;
bool ProjectContext_EatCurrentBlock(ProjectStateContext *ctx,
ProjectStateContext *ctxOut=NULL); // returns TRUE if got valid >, otherwise it means eof...
// writes to ctxOut if specified, will not write final >
bool ProjectContext_GetNextLine(ProjectStateContext *ctx, LineParser *lpOut); // true if lpOut is valid
char *projectcontext_fastDoubleToString(double value, char *bufOut, int prec_digits); // returns pointer to end of encoded string. prec_digits 0..18.
int ProjectContextFormatString(char *outbuf, size_t outbuf_size, const char *fmt, va_list va); // returns bytes used
int cfg_decode_binary(ProjectStateContext *ctx, WDL_HeapBuf *hb); // 0 on success, doesnt clear hb
void cfg_encode_binary(ProjectStateContext *ctx, const void *ptr, int len);
int cfg_decode_textblock(ProjectStateContext *ctx, WDL_FastString *str); // 0 on success, appends to str
void cfg_encode_textblock(ProjectStateContext *ctx, const char *text); // long lines get split by newlines
void cfg_encode_textblock2(ProjectStateContext *ctx, const char *text); // preserves newlines/long lines/etc (requires recent cfg_decode_textblock())
char getConfigStringQuoteChar(const char *in, bool prefer_quoteless=true); // returns 0 if no quote char available!
bool configStringWantsBlockEncoding(const char *in); // returns true if over 1k long, has newlines, or contains all quote chars
void makeEscapedConfigString(const char *in, WDL_FastString *out);
class ProjectStateContext_GenericRead : public ProjectStateContext
{
protected:
const char *m_ptr;
const char *m_endptr;
int m_tmpflag;
public:
ProjectStateContext_GenericRead(const void *buf, int sz) : m_tmpflag(0)
{
m_ptr = (const char *)buf;
m_endptr = m_ptr ? m_ptr+sz : NULL;
}
virtual ~ProjectStateContext_GenericRead() {}
virtual void WDL_VARARG_WARN(printf,2,3) AddLine(const char *fmt, ...) { }
virtual int GetLine(char *buf, int buflen) // returns -1 on eof
{
const char *p = m_ptr;
const char *ep = m_endptr;
while (p < ep && (!*p || *p == '\t' || *p == '\r' || *p == '\n' || *p == ' ')) p++;
if (p >= ep)
{
m_ptr=p;
return -1;
}
if (buflen > 0)
{
while (--buflen > 0 && *p) *buf++ = *p++;
*buf=0;
}
while (*p) p++;
m_ptr=p+1; // skip NUL
return 0;
}
virtual int GetTempFlag() { return m_tmpflag; }
virtual void SetTempFlag(int flag) { m_tmpflag=flag; }
virtual WDL_INT64 GetOutputSize() { return 0; }
};
#endif//_PROJECTCONTEXT_H_