cis_config
AsciiTableComm.h
1 #include <../tools.h>
2 #include <CommBase.h>
3 #include <../dataio/AsciiTable.h>
4 
6 #ifndef CISASCIITABLECOMM_H_
7 #define CISASCIITABLECOMM_H_
8 
10 static unsigned _cisAsciiTablesCreated;
11 
17 static inline
18 int init_ascii_table_comm(comm_t *comm) {
19  int flag = 0;
20  // Don't check base validity since address is name
21  comm->is_file = 1;
22  comm->type = ASCII_TABLE_COMM;
23  strcpy(comm->address, comm->name);
24  // Initialize table as handle
25  flag = update_serializer(comm->serializer, ASCII_TABLE_SERI, NULL);
26  if (flag != 0) {
27  cislog_error("init_ascii_table_comm: Could not update serializer.");
28  return -1;
29  }
30  asciiTable_t *handle = (asciiTable_t*)(comm->serializer->info);
31  if (strcmp(comm->direction, "send") == 0)
32  flag = at_update(handle, comm->address, "w");
33  else
34  flag = at_update(handle, comm->address, "r");
35  if (flag != 0) {
36  cislog_error("init_ascii_table_comm: Could not set asciiTable address.");
37  return -1;
38  }
39  comm->handle = (void*)handle;
40  // Simplify received formats
41  if (strcmp(comm->direction, "recv") == 0) {
42  flag = simplify_formats(handle->format_str, CIS_MSG_MAX);
43  if (flag < 0) {
44  cislog_error("init_ascii_table_comm: Failed to simplify recvd format.");
45  return -1;
46  }
47  }
48  // Open the table
49  flag = at_open(handle);
50  if (flag != 0) {
51  cislog_error("init_ascii_table_comm: Could not open %s", comm->name);
52  comm->valid = 0;
53  return -1;
54  }
55  // Write format to file if "send"
56  if (strcmp(comm->direction, "send") == 0)
57  at_writeformat(handle[0]);
58  // Set AsciiTable serializer
59  /* comm->serializer.type = ASCII_TABLE_SERI; */
60  /* comm->serializer.info = (void*)handle; */
61  return 0;
62 };
63 
64 // TODO: Don't create a new file, just send to original
70 static inline
71 int new_ascii_table_address(comm_t *comm) {
72  sprintf(comm->name, "tempASCIITable.%d", _cisAsciiTablesCreated);
73  int ret = init_ascii_table_comm(comm);
74  _cisAsciiTablesCreated++;
75  return ret;
76 };
77 
83 static inline
84 int init_ascii_table_array_comm(comm_t *comm) {
85  int ret = init_ascii_table_comm(comm);
86  comm->serializer->type = ASCII_TABLE_ARRAY_SERI;
87  return ret;
88 };
89 
95 static inline
96 int new_ascii_table_array_address(comm_t *comm) {
97  sprintf(comm->name, "tempASCIITableArray.%d", _cisAsciiTablesCreated);
98  int ret = init_ascii_table_array_comm(comm);
99  _cisAsciiTablesCreated++;
100  return ret;
101 };
102 
108 static inline
109 int free_ascii_table_comm(comm_t *x) {
110  if (x->handle != NULL) {
111  asciiTable_t *table = (asciiTable_t*)x->handle;
112  at_close(table);
113  at_cleanup(table);
114  x->serializer->info = NULL; // Duplicate pointer to handle
115  free(x->handle);
116  x->handle = NULL;
117  }
118  return 0;
119 };
120 
126 static inline
127 int ascii_table_comm_nmsg(const comm_t x) {
128  // Prevent C4100 warning on windows by referencing param
129 #ifdef _WIN32
130  x;
131 #endif
132  // TODO: Count lines in table.
133  return 0;
134 };
135 
145 static inline
146 int ascii_table_comm_send(const comm_t x, const char *data, const size_t len) {
147  if (is_eof(data))
148  return 0;
149  // Prevent C4100 warning on windows by referencing param
150 #ifdef _WIN32
151  len;
152 #endif
153  asciiTable_t *table = (asciiTable_t*)x.handle;
154  return at_writeline_full(table[0], data);
155 };
156 
169 static inline
170 int ascii_table_comm_recv(const comm_t x, char **data, const size_t len,
171  const int allow_realloc) {
172  asciiTable_t *table = (asciiTable_t*)x.handle;
173  return at_readline_full_realloc(table[0], data, len, allow_realloc);
174 };
175 
180 #define ascii_table_comm_send_nolimit ascii_table_comm_send
181 
186 #define ascii_table_comm_recv_nolimit ascii_table_comm_recv
187 
188 
189 #endif /*CISASCIITABLECOMM_H_*/
void * handle
Pointer to handle for comm.
Definition: CommBase.h:25
char format_str[LINE_SIZE_MAX]
Format string for rows.
Definition: AsciiTable.h:78
Communication structure.
Definition: CommBase.h:19
char address[COMM_ADDRESS_SIZE]
Comm address.
Definition: CommBase.h:22
void * info
Pointer to any extra info serializer requires.
Definition: SerializeBase.h:17
comm_type type
Comm type.
Definition: CommBase.h:20
int is_file
Flag specifying if the comm connects directly to a file.
Definition: CommBase.h:36
seri_t * serializer
Serializer for comm messages.
Definition: CommBase.h:27
char direction[COMM_DIR_SIZE]
send or recv for direction messages will go.
Definition: CommBase.h:23
char name[COMM_NAME_SIZE]
Comm name.
Definition: CommBase.h:21
int valid
1 if communicator initialized, 0 otherwise.
Definition: CommBase.h:24
Structure containing information about an ASCII table.
Definition: AsciiTable.h:76
seri_type type
Serializer type.
Definition: SerializeBase.h:16