1 /*
2     OW -- One-Wire filesystem
3     version 0.4 7/2/2003
4 */
5 
6 // encapsulation or parameters for read, write and directory
7 
8 #ifndef OW_ONEWIREQUERY_H		/* tedious wrapper */
9 #define OW_ONEWIREQUERY_H
10 
11 enum owq_cleanup {
12 	owq_cleanup_none    = 0,
13 	owq_cleanup_owq     = 0x01,
14 	owq_cleanup_pn      = 0x02,
15 	owq_cleanup_buffer  = 0x04,
16 	owq_cleanup_rbuffer = 0x08,
17 	owq_cleanup_array   = 0x10,
18 
19 	// unrelated flag
20 	owq_simultaneous    = 0x1000,
21 	} ;
22 
23 union value_object {
24 	int I;
25 	unsigned int U;
26 	_FLOAT F;
27 	_DATE D;
28 	int Y;						//boolean
29 	size_t length;
30 	union value_object *array;
31 };
32 
33 struct one_wire_query {
34 	char *buffer;
35 	//char *read_buffer;
36 	//const char *write_buffer;
37 	size_t size;
38 	off_t offset;
39 	struct parsedname pn;
40 	enum owq_cleanup cleanup;
41 	union value_object val;
42 };
43 
44 #define NO_ONE_WIRE_QUERY NULL
45 
46 #define OWQ_pn(owq)	      ((owq)->pn)
47 #define OWQ_buffer(owq)       ((owq)->buffer)
48 #define OWQ_read_buffer(owq)  ((owq)->read_buffer)
49 #define OWQ_write_buffer(owq) ((owq)->write_buffer)
50 #define OWQ_size(owq)         ((owq)->size)
51 #define OWQ_offset(owq)	      ((owq)->offset)
52 #define OWQ_cleanup(owq)      ((owq)->cleanup)
53 #define OWQ_val(owq)	      ((owq)->val)
54 #define OWQ_array(owq)	      (((owq)->val).array)
55 #define PN(owq)               (&OWQ_pn(owq))
56 
57 #define OWQ_I(owq)            ((OWQ_val(owq)).I)
58 #define OWQ_U(owq)            ((OWQ_val(owq)).U)
59 #define OWQ_F(owq)            ((OWQ_val(owq)).F)
60 #define OWQ_D(owq)            ((OWQ_val(owq)).D)
61 #define OWQ_Y(owq)            ((OWQ_val(owq)).Y)
62 #define OWQ_length(owq)       ((OWQ_val(owq)).length)
63 
64 #define OWQ_array_I(owq,i)    ((OWQ_array(owq)[i]).I)
65 #define OWQ_array_U(owq,i)    ((OWQ_array(owq)[i]).U)
66 #define OWQ_array_F(owq,i)    ((OWQ_array(owq)[i]).F)
67 #define OWQ_array_D(owq,i)    ((OWQ_array(owq)[i]).D)
68 #define OWQ_array_Y(owq,i)    ((OWQ_array(owq)[i]).Y)
69 #define OWQ_array_length(owq,i) ((OWQ_array(owq)[i]).length)
70 
71 #define OWQ_explode(owq)	(BYTE *)OWQ_buffer(owq),OWQ_size(owq),OWQ_offset(owq),PN(owq)
72 
73 #define OWQ_SIMUL_SET(owq)    (((owq)->cleanup) |= owq_simultaneous )
74 #define OWQ_SIMUL_CLR(owq)    (((owq)->cleanup) &= (~owq_simultaneous) )
75 #define OWQ_SIMUL_TEST(owq)   ((((owq)->cleanup) & owq_simultaneous) != 0 )
76 
77 //#define OWQ_allocate_struct_and_pointer( owq_name )	struct one_wire_query struct_##owq_name ; struct one_wire_query * owq_name = & struct_##owq_name
78 // perhaps it would be nice to clear the memory try trace errors. OWQ_allocate_struct_and_pointer() needs to be defined as the last local variable now...
79 
80 // "owq_name->cleanup = owq_cleanup_none" is needed at least... but why not clear the whole struct just to make sure it never happens again.
81 #define OWQ_allocate_struct_and_pointer( owq_name )	struct one_wire_query struct_##owq_name ; struct one_wire_query * owq_name = & struct_##owq_name; memset(&struct_##owq_name, 0, sizeof(struct one_wire_query));
82 
83 GOOD_OR_BAD OWQ_create(const char *path, struct one_wire_query *owq);
84 GOOD_OR_BAD OWQ_create_plus(const char *path, const char *file, struct one_wire_query *owq);
85 
86 void OWQ_destroy(struct one_wire_query *owq);
87 
88 struct one_wire_query * OWQ_create_from_path(const char *path) ;
89 struct one_wire_query * OWQ_create_sibling(const char *sibling, struct one_wire_query *owq_original) ;
90 
91 GOOD_OR_BAD OWQ_allocate_read_buffer(struct one_wire_query * owq ) ;
92 GOOD_OR_BAD OWQ_allocate_write_buffer( const char * write_buffer, size_t buffer_length, off_t offset, struct one_wire_query * owq ) ;
93 
94 void OWQ_assign_read_buffer(char *buffer, size_t size, off_t offset, struct one_wire_query *owq) ;
95 void OWQ_assign_write_buffer(const char *buffer, size_t size, off_t offset, struct one_wire_query *owq) ;
96 
97 struct one_wire_query * OWQ_create_separate( int extension, struct one_wire_query * owq_aggregate ) ;
98 struct one_wire_query * OWQ_create_aggregate( struct one_wire_query * owq_single );
99 
100 void OWQ_create_temporary(struct one_wire_query *owq_temporary, char *buffer, size_t size, off_t offset, struct parsedname *pn);
101 
102 ZERO_OR_ERROR OWQ_format_output_offset_and_size(const char *string, size_t length, struct one_wire_query *owq);
103 ZERO_OR_ERROR OWQ_format_output_offset_and_size_z(const char *string, struct one_wire_query *owq);
104 
105 struct one_wire_query * ALLtoBYTE( struct one_wire_query *owq_all  );
106 struct one_wire_query * BYTEtoALL( struct one_wire_query *owq_byte );
107 
108 int OWQ_parse_input(struct one_wire_query *owq);
109 SIZE_OR_ERROR OWQ_parse_output(struct one_wire_query *owq);
110 void _print_owq(struct one_wire_query *owq);
111 
112 #endif							/* OW_ONEWIREQUERY_H */
113