GCC Code Coverage Report


Directory: ./
File: src/page_data.c
Date: 2024-08-06 23:19:24
Exec Total Coverage
Lines: 66 84 78.6%
Functions: 14 16 87.5%
Branches: 23 44 52.3%

Line Branch Exec Source
1 // SPDX-License-Identifier: GPL-3.0-or-later
2 // Copyright (C) 2020 Omar Castro
3
4
5 #include "json_glib_extensions.h"
6 #include "page_data.h"
7
8 static const gchar* EMPTY_STRING = "";
9
10 4 PageData * page_data_new(void){
11 4 PageData * pageData = g_malloc0( sizeof ( *pageData ) );
12 4 pageData->message = NULL;
13 4 pageData->overlay = NULL;
14 4 pageData->prompt = NULL;
15 4 pageData->input = g_string_sized_new(256);
16 4 pageData->lines = g_array_new (FALSE, TRUE, sizeof (LineData));
17 4 return pageData;
18 }
19
20 1 void page_data_destroy(PageData * pageData){
21 1 page_data_clear_lines(pageData);
22
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(pageData->message != NULL) { g_string_free(pageData->message, TRUE); }
23
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(pageData->overlay != NULL) { g_string_free(pageData->overlay, TRUE); }
24
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(pageData->prompt != NULL) { g_string_free(pageData->prompt, TRUE); }
25 1 g_string_free(pageData->input, TRUE);
26 1 g_array_free (pageData->lines, TRUE);
27 1 g_free(pageData);
28 1 }
29
30
31
32 static gboolean is_page_data_string_member_empty(GString *string_member);
33 static const char * get_page_data_string_member_or_empty_string(GString *string_member);
34 static void set_page_data_string_member(GString **string_member, const char * new_string);
35
36
37
38 8 gboolean page_data_is_message_empty(PageData * pageData){
39
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 return pageData == NULL ? TRUE : is_page_data_string_member_empty(pageData->message);
40 }
41
42 4 const char * page_data_get_message_or_empty_string(PageData * pageData){
43
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 return pageData == NULL ? EMPTY_STRING : get_page_data_string_member_or_empty_string(pageData->message);
44 }
45
46 2 void page_data_set_message(PageData * pageData, const char * message){
47 2 set_page_data_string_member(&pageData->message, message);
48 2 }
49
50 gboolean page_data_is_overlay_empty(PageData * pageData){
51 return pageData == NULL ? TRUE : is_page_data_string_member_empty(pageData->overlay);
52 }
53
54 6 const char * page_data_get_overlay_or_empty_string(PageData * pageData){
55
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 return pageData == NULL ? EMPTY_STRING : get_page_data_string_member_or_empty_string(pageData->overlay);
56 }
57
58 void page_data_set_overlay(PageData * pageData, const char * overlay){
59 set_page_data_string_member(&pageData->overlay, overlay);
60 }
61
62
63
64
65 19 size_t page_data_get_number_of_lines(PageData * pageData){
66 19 return pageData->lines->len;
67 }
68
69
70 57 LineData * page_data_get_line_by_index_or_else(PageData * pageData, unsigned int index, LineData * elseValue){
71
4/4
✓ Branch 0 taken 56 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 55 times.
57 if(pageData == NULL || index >= pageData->lines->len){
72 2 return elseValue;
73 }
74 55 LineData * result = &g_array_index (pageData->lines, LineData, index);
75 55 return result;
76 }
77
78
79 11 void page_data_add_line(PageData * pageData, const gchar * label, const gchar * icon, const gchar * data, gboolean urgent, gboolean highlight, gboolean markup, gboolean nonselectable){
80 11 LineData line = {
81 11 .text = g_strdup(label),
82 11 .icon = g_strdup(icon),
83 11 .data = g_strdup(data),
84 .urgent = urgent,
85 .highlight = highlight,
86 .markup = markup,
87 .nonselectable = nonselectable
88 };
89 11 g_array_append_val(pageData->lines, line);
90 11 }
91
92 10 void page_data_add_line_json_node(PageData * pageData, JsonNode * element){
93
2/4
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
10 if(JSON_NODE_HOLDS_VALUE(element) && json_node_get_value_type(element) == G_TYPE_STRING){
94 10 page_data_add_line(pageData, json_node_get_string(element), EMPTY_STRING, EMPTY_STRING, FALSE, FALSE, pageData->markup_default == MarkupStatus_ENABLED, FALSE);
95 } else if(JSON_NODE_HOLDS_OBJECT(element)){
96 JsonObject * line_obj = json_node_get_object(element);
97 const gchar * text = json_object_get_string_member_or_else(line_obj, "text", EMPTY_STRING);
98 const gchar * icon = json_object_get_string_member_or_else(line_obj, "icon", EMPTY_STRING);
99 const gchar * data = json_object_get_string_member_or_else(line_obj, "data", EMPTY_STRING);
100 gboolean urgent = json_object_get_boolean_member_or_else(line_obj, "urgent", FALSE);
101 gboolean highlight = json_object_get_boolean_member_or_else(line_obj, "highlight", FALSE);
102 gboolean markup = json_object_get_boolean_member_or_else(line_obj, "markup", pageData->markup_default == MarkupStatus_ENABLED);
103 gboolean nonselectable = json_object_get_boolean_member_or_else(line_obj, "nonselectable", FALSE);
104 page_data_add_line(pageData, text, icon, data, urgent, highlight, markup, nonselectable);
105 }
106 10 }
107
108 4 void page_data_clear_lines(PageData * pageData){
109 4 GArray * lines = pageData->lines;
110 4 int lines_length = lines->len;
111
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
5 for (int i = 0; i < lines_length; i++){
112 1 LineData line = g_array_index (lines, LineData, i);
113 1 g_free(line.text);
114 1 g_free(line.icon);
115 1 g_free(line.data);
116 }
117 4 g_array_set_size(pageData->lines, 0);
118 4 }
119
120
121
122 8 static gboolean is_page_data_string_member_empty(GString *string_member){
123
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
8 return string_member == NULL || string_member->len <= 0;
124 }
125
126 10 static const char * get_page_data_string_member_or_empty_string(GString *string_member){
127
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 6 times.
10 return string_member == NULL ? EMPTY_STRING : string_member->str;
128 }
129
130 2 static void set_page_data_string_member(GString **string_member, const char * new_string){
131 2 gboolean isDefined = *string_member != NULL;
132 2 gboolean willDefine = new_string != NULL;
133
134
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2 if( isDefined && willDefine ){
135 g_string_assign(*string_member, new_string);
136
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2 } else if( isDefined && !willDefine ){
137 g_string_free(*string_member, TRUE);
138 *string_member = NULL;
139
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 } else if ( !isDefined && willDefine ){
140 2 *string_member = g_string_new (new_string);
141 }
142 //else do nothing, *string_member is already NULL
143
144 2 }
145