rawcell.h

struct RawSource {
    FILE* file;
    uint32_t uses;

    // Read num_bytes into buffer from fd starting at offset
    int64_t offset_read(void* buffer, uint64_t num_bytes, uint64_t offset) const {
#ifdef _WIN32
        // The POSIX version (pread) does not change the file cursor, this
        // does.  Furthermore, this is not thread-safe!
        FSEEK64(file, offset, SEEK_SET);
        return fread(buffer, 1, num_bytes, file);
#else
        return pread(fileno(file), buffer, num_bytes, offset);
#endif
    };
};

// Rawcells are not meant to be created except through read_rawcells.  They are
// not explicitly loaded in memory until used, so the GDSII file where they are
// loaded from, remains open until it is no longer needed.  That is done by
// reference counting.
struct RawCell {
    char* name;
    RawSource* source;
    union {
        uint8_t* data;
        uint64_t offset;
    };
    uint64_t size;
    Array<RawCell*> dependencies;
    // Used by the python interface to store the associated PyObject* (if any).
    // No functions in gdstk namespace should touch this value!
    void* owner;

    void print(bool all) const;

    void clear();

    // Append dependencies of this cell to result.  If recursive is true, also
    // includes dependencies of any dependencies recursively.
    void get_dependencies(bool recursive, Map<RawCell*>& result) const;

    // This function outputs the rawcell in the GDSII.  It is not supposed to
    // be called by the user.
    ErrorCode to_gds(FILE* out);
};

// Load a GDSII file and extract its cells as RawCell.
Map<RawCell*> read_rawcells(const char* filename, ErrorCode* error_code);