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