diff options
| author | Matthias Melcher <github@matthiasm.com> | 2025-03-07 16:34:35 +0100 |
|---|---|---|
| committer | Matthias Melcher <github@matthiasm.com> | 2025-03-07 16:34:48 +0100 |
| commit | 1985aefc0e502048f92b91beef87c0dfbe669fed (patch) | |
| tree | af62874def4590e437a47784b4428d975ceb262f /fluid/io/code.h | |
| parent | 42a04c064d4b31c3a85210311f3ada163c406a25 (diff) | |
Restructuring Fluid source files.
Diffstat (limited to 'fluid/io/code.h')
| -rw-r--r-- | fluid/io/code.h | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/fluid/io/code.h b/fluid/io/code.h new file mode 100644 index 000000000..758e7bf45 --- /dev/null +++ b/fluid/io/code.h @@ -0,0 +1,112 @@ +// +// Code output routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2021 by Bill Spitzak and others. +// +// This library is free software. Distribution and use rights are outlined in +// the file "COPYING" which should have been included with this file. If this +// file is missing or damaged, see the license at: +// +// https://www.fltk.org/COPYING.php +// +// Please see the following page on how to report bugs and issues: +// +// https://www.fltk.org/bugs.php +// + +#ifndef _FLUID_CODE_H +#define _FLUID_CODE_H + +#include <FL/fl_attr.h> + +#include <stdarg.h> +#include <stdio.h> +#include <string> + +class Fl_Type; +struct Fd_Identifier_Tree; +struct Fd_Text_Tree; +struct Fd_Pointer_Tree; + +int is_id(char c); +int write_strings(const std::string &filename); + +class Fd_Code_Writer +{ +protected: + /// file pointer for the C++ code file + FILE *code_file; + /// file pointer for the C++ header file + FILE *header_file; + + /// tree of unique but human-readable identifiers + Fd_Identifier_Tree* id_root; + /// searchable text tree for text that is only written once to the header file + Fd_Text_Tree *text_in_header; + /// searchable text tree for text that is only written once to the code file + Fd_Text_Tree *text_in_code; + /// searchable tree for pointers that are only written once to the code file + Fd_Pointer_Tree *ptr_in_code; + + /// crc32 for blocks of text written to the code file + unsigned long block_crc_; + /// if set, we are at the start of a line and can ignore leading spaces in crc + bool block_line_start_; + /// expanding buffer for vsnprintf + char *block_buffer_; + /// size of expanding buffer for vsnprintf + int block_buffer_size_; + + void crc_add(const void *data, int n=-1); + int crc_printf(const char *format, ...); + int crc_vprintf(const char *format, va_list args); + int crc_puts(const char *text); + int crc_putc(int c); + +public: + /// current level of source code indentation + int indentation; + /// set if we write abbreviated file for the source code previewer + /// (disables binary data blocks, for example) + bool write_codeview; + /// silly thing to prevent declaring unused variables: + /// When this symbol is on, all attempts to write code don't write + /// anything, but set a variable if it looks like the variable "o" is used: + int varused_test; + /// set to 1 if varused_test found that a variable is actually used + int varused; + +public: + Fd_Code_Writer(); + ~Fd_Code_Writer(); + const char* unique_id(void* o, const char*, const char*, const char*); + /// Increment source code indentation level. + void indent_more() { indentation++; } + /// Decrement source code indentation level. + void indent_less() { indentation--; } + const char *indent(); + const char *indent(int set); + const char *indent_plus(int offset); + int write_h_once(const char *, ...) __fl_attr((__format__ (__printf__, 2, 3))); + int write_c_once(const char *, ...) __fl_attr((__format__ (__printf__, 2, 3))); + bool c_contains(void* ptr); + void write_cstring(const char *,int length); + void write_cstring(const char *); + void write_cdata(const char *,int length); + void vwrite_c(const char* format, va_list args); + void write_c(const char*, ...) __fl_attr((__format__ (__printf__, 2, 3))); + void write_cc(const char *, int, const char*, const char*); + void write_h(const char*, ...) __fl_attr((__format__ (__printf__, 2, 3))); + void write_hc(const char *, int, const char*, const char*); + void write_c_indented(const char *textlines, int inIndent, char inTrailwWith); + Fl_Type* write_static(Fl_Type* p); + Fl_Type* write_code(Fl_Type* p); + int write_code(const char *cfile, const char *hfile, bool to_codeview=false); + void write_public(int state); // writes pubic:/private: as needed + + void tag(int type, unsigned short uid); + + static unsigned long block_crc(const void *data, int n=-1, unsigned long in_crc=0, bool *inout_line_start=NULL); +}; + +#endif // _FLUID_CODE_H |
