88#include <stdio.h>
99#include <string.h>
1010#include <stdbool.h>
11- #include <json.h>
1211#include <stdint.h>
1312#include "config.h"
1413
14+ #define NOT_FOUND "NOT_FOUND"
15+
1516// max 16 bit unsigned integer number 65535
1617#define MAX_16BIT_NUM_AS_STRING_SIZE 6
1718
1819#define OBJ_NAME_PREFIX "UID_"
1920#define NLOG_OBJ_PREFIX OBJ_NAME_PREFIX "NLOG_"
2021
21- static bool config_get_by_version (const struct json_object * obj , int version_major ,
22- int version_minor , struct json_object * * value )
22+ static bool config_get_by_version (const struct json_object * obj ,
23+ int version_major , int version_minor ,
24+ struct json_object * * value )
2325{
2426 char str_key [MAX_16BIT_NUM_AS_STRING_SIZE ];
2527 char str_subkey [MAX_16BIT_NUM_AS_STRING_SIZE ];
@@ -58,6 +60,7 @@ bool sldm_config_get_struct_by_key_version(const struct json_object *config, cha
5860 struct json_object * * value )
5961{
6062 struct json_object * token = NULL ;
63+
6164 if (!json_object_object_get_ex (config , key , & token ))
6265 return false;
6366 if (!config_get_by_version (token , version_major , version_minor , value ))
@@ -90,7 +93,7 @@ const char *solidigm_config_get_nlog_obj_name(const struct json_object *config,
9093 if (!json_object_object_get_ex (nlog_names , hex_header , & obj_name ))
9194 return NULL ;
9295 name = json_object_get_string (obj_name );
93- if (( !name ) || ( strncmp (NLOG_OBJ_PREFIX , name , strlen (NLOG_OBJ_PREFIX ) )))
96+ if (!name || strncmp (NLOG_OBJ_PREFIX , name , strlen (NLOG_OBJ_PREFIX )))
9497 return NULL ;
9598
9699 return & name [strlen (OBJ_NAME_PREFIX )];
@@ -103,3 +106,99 @@ struct json_object *solidigm_config_get_nlog_formats(const struct json_object *c
103106 json_object_object_get_ex (config , "NLOG_FORMATS" , & nlog_formats );
104107 return nlog_formats ;
105108}
109+
110+ /* Enum value lookup helper functions */
111+ static const char * find_enum_value_in_member_list (
112+ struct json_object * enum_member_list ,
113+ uint64_t value )
114+ {
115+ if (!json_object_is_type (enum_member_list , json_type_array ))
116+ return UNKNOWN_ENUM_VALUE ;
117+
118+ int enum_array_len = json_object_array_length (enum_member_list );
119+
120+ for (int j = 0 ; j < enum_array_len ; j ++ ) {
121+ struct json_object * enum_item =
122+ json_object_array_get_idx (enum_member_list , j );
123+
124+ if (!enum_item )
125+ continue ;
126+
127+ json_object_object_foreach (enum_item , key , val ) {
128+ (void )key ; /* Suppress unused variable warning */
129+ if (json_object_get_uint64 (val ) == value )
130+ return key ;
131+ }
132+ }
133+ return UNKNOWN_ENUM_VALUE ;
134+ }
135+
136+ static bool is_target_enum_field (struct json_object * member ,
137+ const char * enum_field_name )
138+ {
139+ struct json_object * name_obj , * enum_obj ;
140+
141+ if (!json_object_object_get_ex (member , "name" , & name_obj ) ||
142+ !json_object_object_get_ex (member , "enum" , & enum_obj ))
143+ return false;
144+
145+ const char * name = json_object_get_string (name_obj );
146+ int is_enum = json_object_get_int (enum_obj );
147+
148+ return (strcmp (name , enum_field_name ) == 0 && is_enum == 1 );
149+ }
150+
151+ static const char * search_enum_in_member (struct json_object * member ,
152+ const char * enum_field_name ,
153+ uint64_t value )
154+ {
155+ if (!is_target_enum_field (member , enum_field_name ))
156+ return NOT_FOUND ;
157+
158+ /* Found the enum field, look for the value in its memberList */
159+ struct json_object * enum_member_list ;
160+
161+ if (!json_object_object_get_ex (member , "memberList" , & enum_member_list ))
162+ return UNKNOWN_ENUM_VALUE ;
163+
164+ return find_enum_value_in_member_list (enum_member_list , value );
165+ }
166+
167+ const char * sldm_get_enum_label_by_value (struct json_object * struct_def ,
168+ const char * enum_field_name ,
169+ uint64_t value )
170+ {
171+ struct json_object * member_list ;
172+
173+ if (!json_object_object_get_ex (struct_def , "memberList" , & member_list ))
174+ return UNKNOWN_ENUM_VALUE ;
175+
176+ if (!json_object_is_type (member_list , json_type_array ))
177+ return UNKNOWN_ENUM_VALUE ;
178+
179+ int array_len = json_object_array_length (member_list );
180+
181+ for (int i = 0 ; i < array_len ; i ++ ) {
182+ struct json_object * member =
183+ json_object_array_get_idx (member_list , i );
184+
185+ if (!member )
186+ continue ;
187+
188+ /* Try to find enum in this member */
189+ const char * result = search_enum_in_member (member ,
190+ enum_field_name ,
191+ value );
192+
193+ if (strcmp (result , NOT_FOUND ) != 0 )
194+ return result ; /* Found it or determined it's unknown */
195+
196+ /* If this member has nested members, search recursively */
197+ result = sldm_get_enum_label_by_value (member , enum_field_name ,
198+ value );
199+ if (strcmp (result , UNKNOWN_ENUM_VALUE ) != 0 )
200+ return result ;
201+ }
202+
203+ return UNKNOWN_ENUM_VALUE ;
204+ }
0 commit comments