GCC Code Coverage Report


Directory: ./
File: src/blocks_mode_data.c
Date: 2024-08-06 23:19:24
Exec Total Coverage
Lines: 80 98 81.6%
Functions: 12 13 92.3%
Branches: 16 26 61.5%

Line Branch Exec Source
1 // SPDX-License-Identifier: GPL-3.0-or-later
2 // Copyright (C) 2020 Omar Castro
3 #include <stdio.h>
4 #include "json_glib_extensions.h"
5 #include "blocks_mode_data.h"
6
7
8 const char * const input_action_names[2] = {
9 "send",
10 "filter"
11 };
12
13 static const size_t NUM_OF_INPUT_ACTIONS = (sizeof(input_action_names) / sizeof((input_action_names)[0]));
14 static const char * UNDEFINED = "";
15
16
17 static void blocks_mode_private_data_update_string(BlocksModePrivateData * data, GString ** str, const char * json_root_member);
18 static void blocks_mode_private_data_update_input_action(BlocksModePrivateData * data);
19 static void blocks_mode_private_data_update_message(BlocksModePrivateData * data);
20 static void blocks_mode_private_data_update_overlay(BlocksModePrivateData * data);
21 static void blocks_mode_private_data_update_prompt(BlocksModePrivateData * data);
22 static void blocks_mode_private_data_update_input(BlocksModePrivateData * data);
23 static void blocks_mode_private_data_update_input_format(BlocksModePrivateData * data);
24 static void blocks_mode_private_data_update_close_on_child_exit(BlocksModePrivateData * data);
25 static void blocks_mode_private_data_update_lines(BlocksModePrivateData * data);
26 static void blocks_mode_private_data_update_focus_entry(BlocksModePrivateData * data);
27
28
29
30 3 BlocksModePrivateData * blocks_mode_private_data_new(void){
31 3 BlocksModePrivateData *pd = g_malloc0 ( sizeof ( *pd ) );
32 3 pd->currentPageData = page_data_new();
33 3 pd->currentPageData->markup_default = MarkupStatus_UNDEFINED;
34 3 pd->input_format = g_string_new("{\"name\":\"{{name_escaped}}\", \"value\":\"{{value_escaped}}\", \"data\":\"{{data_escaped}}\"}");
35 3 pd->entry_to_focus = -1;
36 3 pd->input_action = InputAction__FILTER_USING_ROFI;
37 3 pd->close_on_child_exit = TRUE;
38 3 pd->cmd_pid = 0;
39 3 pd->buffer = g_string_sized_new (1024);
40 3 pd->active_line = g_string_sized_new (1024);
41 3 pd->waiting_for_idle = FALSE;
42 3 pd->parser = json_parser_new ();
43 3 pd->paintNumber = -1;
44 3 return pd;
45 }
46
47 void blocks_mode_private_data_update_destroy( BlocksModePrivateData * data ){
48 if(data->cmd_pid > 0){
49 kill(data->cmd_pid, SIGTERM);
50 }
51 if ( data->read_channel_watcher > 0 ) {
52 g_source_remove ( data->read_channel_watcher );
53 }
54 if ( data->parser ) {
55 g_object_unref ( data->parser );
56 }
57 page_data_destroy ( data->currentPageData );
58 close ( data->write_channel_fd );
59 close ( data->read_channel_fd );
60 g_free ( data->write_channel );
61 g_free ( data->read_channel );
62 g_free ( data );
63 }
64
65
66
67
68 3 void blocks_mode_private_data_update_page(BlocksModePrivateData * data){
69 3 GError * error = NULL;
70
71
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 if(! json_parser_load_from_data(data->parser,data->active_line->str,data->active_line->len,&error)){
72 fprintf(stderr, "Unable to parse line: %s\n", error->message);
73 g_error_free ( error );
74 return;
75 }
76
77
78 3 data->root = json_node_get_object(json_parser_get_root(data->parser));
79
80 3 blocks_mode_private_data_update_input_action(data);
81 3 blocks_mode_private_data_update_message(data);
82 3 blocks_mode_private_data_update_overlay(data);
83 3 blocks_mode_private_data_update_input(data);
84 3 blocks_mode_private_data_update_prompt(data);
85 3 blocks_mode_private_data_update_close_on_child_exit(data);
86 3 blocks_mode_private_data_update_input_format(data);
87 3 blocks_mode_private_data_update_lines(data);
88 3 blocks_mode_private_data_update_focus_entry(data);
89 3 data->paintNumber = 0;
90 }
91
92
93 9 static void blocks_mode_private_data_update_string(BlocksModePrivateData * data, GString ** str, const char * json_root_member){
94 9 const gchar* memberVal = json_object_get_string_member_or_else(data->root, json_root_member, NULL);
95
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
9 if(memberVal != NULL){
96
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if(*str == NULL){
97 2 *str = g_string_sized_new(64);
98 }
99 2 g_string_assign(*str,memberVal);
100 }
101 9 }
102
103 3 static void blocks_mode_private_data_update_input_action(BlocksModePrivateData * data){
104 3 const gchar* input_action = json_object_get_string_member_or_else(data->root, "input action", NULL);
105
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
3 if(input_action != NULL){
106
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
3 for (size_t i = 0; i < NUM_OF_INPUT_ACTIONS; ++i)
107 {
108
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
2 if(g_strcmp0(input_action, input_action_names[i]) == 0){
109 1 data->input_action = (InputAction) i;
110 }
111 }
112 }
113 3 }
114
115
116 3 static void blocks_mode_private_data_update_message(BlocksModePrivateData * data){
117 3 const gchar* memberVal = json_object_get_nullable_string_member_or_else(data->root, "message", UNDEFINED);
118
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
3 if(memberVal != UNDEFINED){
119 2 page_data_set_message(data->currentPageData, memberVal);
120 }
121 3 }
122
123 3 static void blocks_mode_private_data_update_overlay(BlocksModePrivateData * data){
124 3 const gchar* memberVal = json_object_get_nullable_string_member_or_else(data->root, "overlay", UNDEFINED);
125
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(memberVal != UNDEFINED){
126 page_data_set_overlay(data->currentPageData, memberVal);
127 }
128 3 }
129
130 3 static void blocks_mode_private_data_update_prompt(BlocksModePrivateData * data){
131 3 blocks_mode_private_data_update_string(data, &data->currentPageData->prompt, "prompt");
132 3 }
133
134 3 static void blocks_mode_private_data_update_input(BlocksModePrivateData * data){
135 3 blocks_mode_private_data_update_string(data, &data->currentPageData->input, "input");
136 3 }
137
138 3 static void blocks_mode_private_data_update_input_format(BlocksModePrivateData * data){
139 3 blocks_mode_private_data_update_string(data, &data->input_format, "event format");
140 3 }
141
142 3 static void blocks_mode_private_data_update_focus_entry(BlocksModePrivateData * data){
143 3 data->entry_to_focus = json_object_get_int_member_or_else(data->root, "active entry", -1);
144 3 }
145
146 3 static void blocks_mode_private_data_update_close_on_child_exit(BlocksModePrivateData * data){
147 3 gboolean orig = data->close_on_child_exit;
148 3 gboolean now = json_object_get_boolean_member_or_else(data->root, "close on exit" , orig);
149 3 data->close_on_child_exit = now;
150 3 }
151
152 3 static void blocks_mode_private_data_update_lines(BlocksModePrivateData * data){
153 3 JsonObject *root = data->root;
154 3 PageData * pageData = data->currentPageData;
155 3 const char * LINES_PROP = "lines";
156
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 if(json_object_has_member(root, LINES_PROP)){
157 3 JsonArray* lines = json_object_get_array_member(data->root, LINES_PROP);
158 3 page_data_clear_lines( pageData );
159 3 guint len = json_array_get_length(lines);
160
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 3 times.
13 for(guint index = 0; index < len; ++index){
161 10 page_data_add_line_json_node(pageData, json_array_get_element(lines, index));
162 }
163 }
164 3 }
165