22
22
*/
23
23
24
24
#include "add.h"
25
- #include "jsonc/json.h"
26
- #include "mainloop.h"
27
- #include "state.h"
28
25
29
26
typedef struct __PersistStateEntry
30
27
{
@@ -40,12 +37,6 @@ check_directory_exists(gchar *path)
40
37
return g_file_test (path , G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR );
41
38
}
42
39
43
- gboolean
44
- check_file_exists (gchar * path )
45
- {
46
- return g_file_test (path , G_FILE_TEST_IS_REGULAR | G_FILE_TEST_EXISTS );
47
- }
48
-
49
40
PersistStateEntry *
50
41
persist_state_entry_new (void )
51
42
{
@@ -67,6 +58,56 @@ persist_state_parse_entry(PersistStateEntry *self, gchar *entry)
67
58
return TRUE;
68
59
}
69
60
61
+ #define NAME_LENGTH 40
62
+ #define MAX_LINE_LEN 4000
63
+ #define MAX_ENTRY_VALUE_LENGTH (3*MAX_LINE_LEN)
64
+
65
+ /* This function parses a JSON style string
66
+ * containing series of integer values.
67
+ * For example:
68
+ * { "value": "00 00 00 00 01 02 03 0A" } */
69
+ gint
70
+ parse_value_string (gchar * value_str , gchar * buffer , gint buffer_length )
71
+ {
72
+ gchar * p = strchr (value_str , ':' );
73
+ if (!p )
74
+ return -1 ;
75
+
76
+ p = strchr (p , '"' );
77
+ if (!p || strlen (p )< 1 )
78
+ return -1 ;
79
+
80
+ p = g_strchug (p + 1 ); // p points to the first value
81
+
82
+ gint count = 0 ;
83
+ gint token_index = 0 ;
84
+ gchar * token = NULL ;
85
+
86
+ gchar * * token_list = g_strsplit (p ," " ,-1 );
87
+ while ((token = token_list [token_index ++ ]))
88
+ {
89
+ int value ;
90
+ int result = sscanf (token , "%X" , & value );
91
+
92
+ if (result == EOF || result == 0 )
93
+ continue ;
94
+
95
+ if (count >= buffer_length )
96
+ break ;
97
+
98
+ if (value > 0xFF )
99
+ {
100
+ fprintf (stderr ,"invalid numeric value (%s)\n" , token );
101
+ return -1 ;
102
+ }
103
+
104
+ buffer [count ++ ] = (gchar )value ;
105
+ }
106
+
107
+ g_strfreev (token_list );
108
+ return count ;
109
+ }
110
+
70
111
void
71
112
persist_state_entry_free (PersistStateEntry * self )
72
113
{
@@ -75,15 +116,10 @@ persist_state_entry_free(PersistStateEntry *self)
75
116
g_free (self );
76
117
}
77
118
78
- #define NAME_LENGTH 40
79
- #define MAX_LINE_LEN 4000
80
-
81
119
gint
82
120
add_entry_to_persist_file (gchar * entry , PersistTool * self )
83
121
{
84
122
PersistStateEntry * persist_entry = persist_state_entry_new ();
85
- NameValueContainer * container = name_value_container_new ();
86
- StateHandler * state_handler = NULL ;
87
123
GError * error = NULL ;
88
124
gint result = 0 ;
89
125
@@ -94,45 +130,42 @@ add_entry_to_persist_file(gchar *entry, PersistTool *self)
94
130
error = g_error_new (1 , 1 , "Invalid entry syntax" );
95
131
goto exit ;
96
132
}
97
- fprintf (stderr , "%s" , persist_entry -> name );
98
- if (!name_value_container_parse_json_string (container , persist_entry -> value ))
99
- {
100
- result = 1 ;
101
- error = g_error_new (1 , 1 , "JSON parsing error" );
102
- goto exit ;
103
- }
104
- state_handler = persist_tool_get_state_handler (self , persist_entry -> name );
105
- if (!state_handler )
133
+
134
+ gchar buffer [MAX_ENTRY_VALUE_LENGTH ];
135
+ gint value_count = parse_value_string (persist_entry -> value , buffer , MAX_ENTRY_VALUE_LENGTH );
136
+ if (value_count < 0 )
106
137
{
107
138
result = 1 ;
108
- error = g_error_new (1 , 1 , "Unknown prefix" );
139
+ fprintf (stderr ,"value string is invalid (%s)\n" , entry );
140
+ error = g_error_new (1 , 1 , "Invalid value string in input" );
109
141
goto exit ;
110
142
}
111
143
112
- if (!state_handler_load_state (state_handler , container , & error ))
144
+ PersistEntryHandle handle = persist_state_alloc_entry (self -> state , persist_entry -> name , value_count );
145
+ if (!handle )
113
146
{
114
147
result = 1 ;
148
+ fprintf (stderr , "%.*s" , NAME_LENGTH , entry );
149
+ error = g_error_new (1 , 1 , "Can't alloc entry" );
115
150
goto exit ;
116
151
}
152
+
153
+ gpointer block = persist_state_map_entry (self -> state , handle );
154
+ memcpy (block , buffer , value_count );
155
+
156
+ persist_state_unmap_entry (self -> state , handle );
157
+
117
158
exit :
118
159
if (result == 0 )
119
160
{
120
- fprintf (stderr , "\tOK \n" );
161
+ fprintf (stderr , "%s\t-->>OK \n" , persist_entry -> name );
121
162
}
122
163
else
123
164
{
124
- fprintf (stderr , "\tFAILED (error: %s)\n" ,error ? error -> message : "<UNKNOWN>" );
125
- }
126
- if (error )
127
- {
128
- g_error_free (error );
129
- }
130
- if (state_handler )
131
- {
132
- state_handler_free (state_handler );
165
+ fprintf (stderr , "%s\t-->>FAILED (error: %s)\n" , persist_entry -> name , error ? error -> message : "<UNKNOWN>" );
133
166
}
167
+ g_clear_error (& error );
134
168
135
- name_value_container_free (container );
136
169
persist_state_entry_free (persist_entry );
137
170
return result ;
138
171
}
@@ -149,11 +182,11 @@ lookup_entry(gpointer data, gpointer user_data)
149
182
persist_state_lookup_entry (self -> state , name , & value_len , & version );
150
183
}
151
184
152
- /* this function reads all entries in persist to update the in_use struct memeber */
185
+ /* this function reads all entries in persist to update the in_use struct member */
153
186
static void
154
- dump_all_entries (PersistTool * self )
187
+ ref_all_entries (PersistTool * self )
155
188
{
156
- GList * keys = persist_state_get_key_list (self -> state );
189
+ GList * keys = g_hash_table_get_keys (self -> state -> keys );
157
190
g_list_foreach (keys , lookup_entry , self );
158
191
g_list_free (keys );
159
192
}
@@ -177,7 +210,8 @@ add_main(int argc, char *argv[])
177
210
fprintf (stderr , "Directory doesn't exist: %s\n" , persist_state_dir );
178
211
return 1 ;
179
212
}
180
- filename = g_build_path (G_DIR_SEPARATOR_S , persist_state_dir , DEFAULT_PERSIST_FILE , NULL );
213
+ filename = g_build_path (G_DIR_SEPARATOR_S , persist_state_dir ,
214
+ persist_state_name ? persist_state_name : DEFAULT_PERSIST_FILE , NULL );
181
215
182
216
if (argc < 2 )
183
217
{
@@ -202,8 +236,12 @@ add_main(int argc, char *argv[])
202
236
}
203
237
}
204
238
205
-
206
239
self = persist_tool_new (filename , persist_mode_edit );
240
+ if (!self )
241
+ {
242
+ fprintf (stderr ,"Error creating persist tool\n" );
243
+ return 1 ;
244
+ }
207
245
208
246
while (fgets (line , MAX_LINE_LEN , input_file ))
209
247
{
@@ -214,7 +252,7 @@ add_main(int argc, char *argv[])
214
252
}
215
253
g_free (line );
216
254
217
- dump_all_entries (self );
255
+ ref_all_entries (self );
218
256
219
257
persist_tool_free (self );
220
258
if (input_file != stdin )
0 commit comments