|
| 1 | +#pragma once |
| 2 | + |
| 3 | +#define _CRT_SECURE_NO_DEPRECATE |
| 4 | +#include <objbase.h> |
| 5 | +#include <iostream> |
| 6 | +#include <fstream> |
| 7 | +#include <sstream> |
| 8 | + |
| 9 | +#define GVDLL 1 |
| 10 | + |
| 11 | +#include "cgraph.h" |
| 12 | +#include "gvc.h" |
| 13 | +#include "types.h" |
| 14 | +#include "xdot.h" |
| 15 | + |
| 16 | + |
| 17 | +using namespace std; |
| 18 | + |
| 19 | + |
| 20 | +static int rj_afread(void* stream, char* buffer, int bufsize) |
| 21 | +{ |
| 22 | + istringstream* is = (istringstream*)stream; |
| 23 | + is->read(buffer, bufsize); |
| 24 | + int result = (int)is->gcount(); |
| 25 | + return result; |
| 26 | +} |
| 27 | + |
| 28 | +static int rj_putstr(void* stream, const char* s) |
| 29 | +{ |
| 30 | + ostringstream* os = (ostringstream*)stream; |
| 31 | + (*os) << s; |
| 32 | + return 0; |
| 33 | +} |
| 34 | + |
| 35 | +static int rj_flush(void* stream) |
| 36 | +{ |
| 37 | + ostringstream* os = (ostringstream*)stream; |
| 38 | + os->flush(); |
| 39 | + return 0; |
| 40 | +} |
| 41 | + |
| 42 | +static Agiodisc_t memIoDisc = { rj_afread, rj_putstr, rj_flush }; |
| 43 | +static Agdisc_t memDisc = { 0, 0, &memIoDisc }; |
| 44 | + |
| 45 | +extern "C" { |
| 46 | + |
| 47 | + __declspec(dllexport) void free_str(char* str); |
| 48 | + |
| 49 | +#pragma region "CGraph" |
| 50 | + // Some wrappers around cgraph macros |
| 51 | + __declspec(dllexport) Agedge_t* rj_agmkin(Agedge_t* e); |
| 52 | + __declspec(dllexport) Agedge_t* rj_agmkout(Agedge_t* e); |
| 53 | + __declspec(dllexport) Agnode_t* rj_aghead(Agedge_t* edge); |
| 54 | + __declspec(dllexport) Agnode_t* rj_agtail(Agedge_t* edge); |
| 55 | + __declspec(dllexport) int rj_ageqedge(Agedge_t* e, Agedge_t* f); |
| 56 | + |
| 57 | + // Some wrappers around existing cgraph functions to handle string marshaling |
| 58 | + __declspec(dllexport) const char* rj_agmemwrite(Agraph_t* g); |
| 59 | + __declspec(dllexport) Agraph_t* rj_agmemread(const char* s); |
| 60 | + __declspec(dllexport) Agraph_t* rj_agopen(char* name, int graphtype); |
| 61 | + __declspec(dllexport) const char* rj_sym_key(Agsym_t* sym); |
| 62 | + |
| 63 | + __declspec(dllexport) double node_x(Agnode_t* node); |
| 64 | + __declspec(dllexport) double node_y(Agnode_t* node); |
| 65 | + __declspec(dllexport) double node_width(Agnode_t* node); |
| 66 | + __declspec(dllexport) double node_height(Agnode_t* node); |
| 67 | + |
| 68 | + __declspec(dllexport) textlabel_t* node_label(Agnode_t* node); |
| 69 | + __declspec(dllexport) textlabel_t* edge_label(Agedge_t* edge); |
| 70 | + __declspec(dllexport) textlabel_t* graph_label(Agraph_t* graph); |
| 71 | + |
| 72 | + __declspec(dllexport) double label_x(textlabel_t* label); |
| 73 | + __declspec(dllexport) double label_y(textlabel_t* label); |
| 74 | + __declspec(dllexport) double label_width(textlabel_t* label); |
| 75 | + __declspec(dllexport) double label_height(textlabel_t* label); |
| 76 | + __declspec(dllexport) const char* label_text(textlabel_t* label); |
| 77 | + __declspec(dllexport) double label_fontsize(textlabel_t* label); |
| 78 | + __declspec(dllexport) const char* label_fontname(textlabel_t* label); |
| 79 | + |
| 80 | + __declspec(dllexport) void clone_attribute_declarations(Agraph_t* from, Agraph_t* to); |
| 81 | + __declspec(dllexport) void convert_to_undirected(Agraph_t* graph); |
| 82 | +#pragma endregion |
| 83 | + |
| 84 | +#pragma region "xdot" |
| 85 | + |
| 86 | + __declspec(dllexport) size_t get_cnt(xdot* xdot); |
| 87 | + __declspec(dllexport) xdot_op* get_ops(xdot* xdot); |
| 88 | + __declspec(dllexport) xdot_kind get_kind(xdot_op* op); |
| 89 | + __declspec(dllexport) xdot_rect* get_ellipse(xdot_op* op); |
| 90 | + __declspec(dllexport) xdot_polyline* get_polygon(xdot_op* op); |
| 91 | + __declspec(dllexport) xdot_polyline* get_polyline(xdot_op* op); |
| 92 | + __declspec(dllexport) xdot_polyline* get_bezier(xdot_op* op); |
| 93 | + __declspec(dllexport) xdot_text* get_text(xdot_op* op); |
| 94 | + __declspec(dllexport) xdot_image* get_image(xdot_op* op); |
| 95 | + __declspec(dllexport) char* get_color(xdot_op* op); |
| 96 | + __declspec(dllexport) xdot_color* get_grad_color(xdot_op* op); |
| 97 | + __declspec(dllexport) xdot_font* get_font(xdot_op* op); |
| 98 | + __declspec(dllexport) char* get_style(xdot_op* op); |
| 99 | + __declspec(dllexport) unsigned int get_fontchar(xdot_op* op); |
| 100 | + __declspec(dllexport) xdot_rect* get_pos(xdot_image* img); |
| 101 | + __declspec(dllexport) char* get_name_image(xdot_image* img); |
| 102 | + __declspec(dllexport) double get_size(xdot_font* font); |
| 103 | + __declspec(dllexport) char* get_name_font(xdot_font* font); |
| 104 | + __declspec(dllexport) xdot_grad_type get_type(xdot_color* clr); |
| 105 | + __declspec(dllexport) char* get_clr(xdot_color* clr); |
| 106 | + __declspec(dllexport) xdot_linear_grad* get_ling(xdot_color* clr); |
| 107 | + __declspec(dllexport) xdot_radial_grad* get_ring(xdot_color* clr); |
| 108 | + __declspec(dllexport) double get_x_text(xdot_text* txt); |
| 109 | + __declspec(dllexport) double get_y_text(xdot_text* txt); |
| 110 | + __declspec(dllexport) xdot_align get_align(xdot_text* txt); |
| 111 | + __declspec(dllexport) double get_width(xdot_text* txt); |
| 112 | + __declspec(dllexport) char* get_text_str(xdot_text* txt); |
| 113 | + __declspec(dllexport) double get_x0_ling(xdot_linear_grad* ling); |
| 114 | + __declspec(dllexport) double get_y0_ling(xdot_linear_grad* ling); |
| 115 | + __declspec(dllexport) double get_x1_ling(xdot_linear_grad* ling); |
| 116 | + __declspec(dllexport) double get_y1_ling(xdot_linear_grad* ling); |
| 117 | + __declspec(dllexport) int get_n_stops_ling(xdot_linear_grad* ling); |
| 118 | + __declspec(dllexport) xdot_color_stop* get_stops_ling(xdot_linear_grad* ling); |
| 119 | + __declspec(dllexport) double get_x0_ring(xdot_radial_grad* ring); |
| 120 | + __declspec(dllexport) double get_y0_ring(xdot_radial_grad* ring); |
| 121 | + __declspec(dllexport) double get_r0_ring(xdot_radial_grad* ring); |
| 122 | + __declspec(dllexport) double get_x1_ring(xdot_radial_grad* ring); |
| 123 | + __declspec(dllexport) double get_y1_ring(xdot_radial_grad* ring); |
| 124 | + __declspec(dllexport) double get_r1_ring(xdot_radial_grad* ring); |
| 125 | + __declspec(dllexport) int get_n_stops_ring(xdot_radial_grad* ring); |
| 126 | + __declspec(dllexport) xdot_color_stop* get_stops_ring(xdot_radial_grad* ring); |
| 127 | + __declspec(dllexport) float get_frac(xdot_color_stop* stop); |
| 128 | + __declspec(dllexport) char* get_color_stop(xdot_color_stop* stop); |
| 129 | + __declspec(dllexport) size_t get_cnt_polyline(xdot_polyline* polyline); |
| 130 | + __declspec(dllexport) xdot_point* get_pts_polyline(xdot_polyline* polyline); |
| 131 | + __declspec(dllexport) double get_x_point(xdot_point* point); |
| 132 | + __declspec(dllexport) double get_y_point(xdot_point* point); |
| 133 | + __declspec(dllexport) double get_z_point(xdot_point* point); |
| 134 | + __declspec(dllexport) double get_x_rect(xdot_rect* rect); |
| 135 | + __declspec(dllexport) double get_y_rect(xdot_rect* rect); |
| 136 | + __declspec(dllexport) double get_w_rect(xdot_rect* rect); |
| 137 | + __declspec(dllexport) double get_h_rect(xdot_rect* rect); |
| 138 | + __declspec(dllexport) xdot_color_stop* get_color_stop_at_index(xdot_color_stop* stops, int index); |
| 139 | + __declspec(dllexport) xdot_op* get_op_at_index(xdot_op* ops, int index); |
| 140 | + __declspec(dllexport) xdot_point* get_pt_at_index(xdot_point* pts, int index); |
| 141 | +#pragma endregion |
| 142 | + |
| 143 | +#pragma region "testing/debugging" |
| 144 | + __declspec(dllexport) bool echobool(bool arg); |
| 145 | + __declspec(dllexport) int echoint(int arg); |
| 146 | + __declspec(dllexport) bool return_true(); |
| 147 | + __declspec(dllexport) bool return_false(); |
| 148 | + __declspec(dllexport) int return1(); |
| 149 | + __declspec(dllexport) int return_1(); |
| 150 | + |
| 151 | + typedef enum { |
| 152 | + Val1, Val2, Val3, Val4, Val5 |
| 153 | + } TestEnum; |
| 154 | + |
| 155 | + __declspec(dllexport) TestEnum echo_enum(TestEnum e); |
| 156 | + __declspec(dllexport) TestEnum return_enum1(); |
| 157 | + __declspec(dllexport) TestEnum return_enum2(); |
| 158 | + __declspec(dllexport) TestEnum return_enum5(); |
| 159 | + __declspec(dllexport) char* echo_string(char* str); |
| 160 | + __declspec(dllexport) char* return_empty_string(); |
| 161 | + __declspec(dllexport) char* return_hello(); |
| 162 | + __declspec(dllexport) int stackoverflow_repro(); |
| 163 | + __declspec(dllexport) int missing_label_repro(); |
| 164 | + __declspec(dllexport) int test_agread(); |
| 165 | + __declspec(dllexport) int test_agmemread(); |
| 166 | + __declspec(dllexport) int test_rj_agmemread(); |
| 167 | +#pragma endregion |
| 168 | +} |
| 169 | + |
| 170 | + |
| 171 | + |
0 commit comments