1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-09-20 09:04:43 +00:00
QB64-PE/internal/c/libqb/include/qbs.h
Matthew Kilgore 4f4181fbf2 Separate out qbs, command, and error handling
Moves the qbs, command, and error handling APIs into separate .cpp files
in libqb/src/. This makes only minor changes to the actual code beyond
moving the logic, many global variables are left in place to be dealt
with in further changes.

Fixes: #146
2024-02-14 17:21:14 -05:00

110 lines
3.3 KiB
C++

#ifndef INCLUDE_LIBQB_QBS_H
#define INCLUDE_LIBQB_QBS_H
#include <stdint.h>
// QB64 string descriptor structure
struct qbs_field {
int32_t fileno;
int64_t fileid;
int64_t size;
int64_t offset;
};
struct qbs {
uint8_t *chr; // a 32 bit pointer to the string's data
int32_t len; // must be signed for comparisons against signed int32s
uint8_t in_cmem; // set to 1 if in the conventional memory DBLOCK
uint16_t *cmem_descriptor;
uint16_t cmem_descriptor_offset;
uint32_t listi; // the index in the list of strings that references it
uint8_t tmp; // set to 1 if the string can be deleted immediately after being processed
uint32_t tmplisti; // the index in the list of strings that references it
uint8_t fixed; // fixed length string
uint8_t readonly; // set to 1 if string is read only
//
qbs_field *field;
};
qbs *qbs_new(int32_t, uint8_t);
qbs *qbs_new_txt(const char *);
qbs *qbs_new_cmem(int32_t size, uint8_t tmp);
qbs *qbs_new_txt_len(const char *txt, int32_t len);
qbs *qbs_new_fixed(uint8_t *offset, uint32_t size, uint8_t tmp);
qbs *qbs_add(qbs *, qbs *);
qbs *qbs_set(qbs *, qbs *);
// Called by vWatch
void set_qbs_size(intptr_t *target_qbs, int32_t newlength);
void qbs_free(qbs *str);
qbs *qbs_str(int64_t value);
qbs *qbs_str(int32_t value);
qbs *qbs_str(int16_t value);
qbs *qbs_str(int8_t value);
qbs *qbs_str(uint64_t value);
qbs *qbs_str(uint32_t value);
qbs *qbs_str(uint16_t value);
qbs *qbs_str(uint8_t value);
qbs *qbs_str(float value);
qbs *qbs_str(double value);
qbs *qbs_str(long double value);
qbs *func_chr(int32_t value);
qbs *qbs_ucase(qbs *str);
qbs *qbs_lcase(qbs *str);
qbs *qbs_left(qbs *str, int32_t l);
qbs *qbs_right(qbs *str, int32_t l);
int32_t qbs_equal(qbs *str1, qbs *str2);
int32_t qbs_notequal(qbs *str1, qbs *str2);
int32_t qbs_greaterthan(qbs *str2, qbs *str1);
int32_t qbs_lessthan(qbs *str1, qbs *str2);
int32_t qbs_lessorequal(qbs *str1, qbs *str2);
int32_t qbs_greaterorequal(qbs *str2, qbs *str1);
int32_t qbs_asc(qbs *str, uint32_t i);
int32_t qbs_asc(qbs *str);
int32_t qbs_len(qbs *str);
// FIXME: Usages of these outside of qbx.c (and qbs_cleanup()) need to be removed.
extern intptr_t *qbs_tmp_list;
extern uint32_t qbs_tmp_list_lasti;
extern uint32_t qbs_tmp_list_nexti;
template <typename T> static T qbs_cleanup(uint32_t base, T passvalue) {
while (qbs_tmp_list_nexti > base) {
qbs_tmp_list_nexti--;
if (qbs_tmp_list[qbs_tmp_list_nexti] != -1)
qbs_free((qbs *)qbs_tmp_list[qbs_tmp_list_nexti]);
} // clear any temp. strings created
return passvalue;
}
void sub_lset(qbs *dest, qbs *source);
void sub_rset(qbs *dest, qbs *source);
qbs *func_space(int32_t spaces);
qbs *func_string(int32_t characters, int32_t asciivalue);
int32_t func_instr(int32_t start, qbs *str, qbs *substr, int32_t passed);
int32_t func__instrrev(int32_t start, qbs *str, qbs *substr, int32_t passed);
void sub_mid(qbs *dest, int32_t start, int32_t l, qbs *src, int32_t passed);
qbs *func_mid(qbs *str, int32_t start, int32_t l, int32_t passed);
qbs *qbs_ltrim(qbs *str);
qbs *qbs_rtrim(qbs *str);
qbs *qbs__trim(qbs *str);
int32_t func__str_nc_compare(qbs *s1, qbs *s2);
int32_t func__str_compare(qbs *s1, qbs *s2);
// FIXME: Maybe put this in a gfs related header?
void lrset_field(qbs *str);
void field_free(qbs *str);
#endif