рдпрд╣ рдкреЛрд╕реНрдЯ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ C [/ C ++] рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдмрд╛рдХреА рдкрдврд╝ рдирд╣реАрдВ рд╕рдХрддреЗред
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдореИрдВ рдПрдХ рдФрд░ рддрдХрдиреАрдХ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╢рд╛рдпрдж рдЬреЛрд░ рд╕реЗ рдХрд╣рд╛ред рдмрд▓реНрдХрд┐, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдмрдирд╛рдиреЗ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рдиред
рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХрдИ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред XML рдкреНрд░рд╛рд░реВрдк рд╕реЗ ... рдПрдХ рд╢рдмреНрдж рдореЗрдВ, рдмрд╣реБрдд рдХреБрдЫред рдпрд╣ рд▓реЗрдЦ рдХреБрдЫ рд╕реБрдкрд░рдиреЛрд╡рд╛ рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╢реИрд▓реА, рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдмрд╕ рдПрдХ рддреНрд╡рд░рд┐рдд рдирд┐рд░реНрдгрдп рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рд╛рд░реВрдк рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рд╕реЗ "рдмрд░рд╛рдмрд░" рд╕рдВрдХреЗрддреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкрдврд╝реЗрдВ, рдЬреИрд╕реЗ phppi
рдЧрд╛рдиреЗ рдХреЗ рдмреЛрд▓ред
рдореИрдВ рдПрдХ рдмреБрдорд░рд╛рд╣ рд╣реВрдВред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд▓рд╛рдЬрд╝рдореА рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдирд╛ рд╕рдордп рдПрдХреНрд╕рдПрдордПрд▓ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░реВрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реВрдВ, рд╡рд┐рднрд┐рдиреНрди рдЖрдИрдбреАрдИ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХреВрдВ ... рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдореИрдВ рдЦреБрдж рдмреИрдареВрдВ рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЪрд╛рд╣реВрдВ, рд╡рд╣ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПред UNIX- рдЬреИрд╕реЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП <рдкреИрд░рд╛рдореАрдЯрд░> = <value> рдкреНрд░рдХрд╛рд░ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рдЙрдкрдпреЛрдЧ рдореЗрд░реА рдкрд╕рдВрдж рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддрд╛ рд╣реИред
рд╣рд╛рдВ, рдореИрдВ "рджреЛ рдкреНрд▓рд╕рд╕" рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирд┐рдЪреНрдЫреБрдХ рд╣реВрдВред
рдФрд░ рдореИрдВ рдЯрд┐рдкреНрдкрдгреА рдлрд╝реАрдб рдореЗрдВ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рдЕрдирдЪреЗрдХ рдХрд░ рджреВрдВрдЧрд╛ред
рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛ рд╣реЛ рддреЛ рдЗрд╕реЗ рд▓рд╛рдЗрдПред рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ (рдЦрд╛рдирд╛), рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛, рдзрдиреНрдпрд╡рд╛рдж
рд▓рдХреНрд╖реНрдп stdlib рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИред
рдЕрдзрд┐рдХ рдЕрднреНрдпрд╛рд╕ред
рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдирд┐рдЬреА рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдВрдЧреЗред
cs_types.h#ifndef CS_TYPES_H #define CS_TYPES_H #if defined WIN32 || defined _WIN32 # define CS_CDECL __cdecl # define CS_STDCALL __stdcall #else # define CS_CDECL # define CS_STDCALL #endif #ifndef CS_EXTERN_C_FUNC_PTR # ifdef __cplusplus # define CS_EXTERN_C_FUNC_PTR(x) extern "C" { typedef x; } # else # define CS_EXTERN_C_FUNC_PTR(x) typedef x # endif #endif #ifndef CS_INLINE # if defined __cplusplus # define CS_INLINE inline # elif (defined WIN32 || defined _WIN32 || defined WINCE) && !defined __GNUC__ # define CS_INLINE __inline # else # define CS_INLINE static # endif #endif #ifdef __cplusplus extern "C" { #endif #if (defined WIN32 || defined _WIN32 || defined WINCE) && defined CSAPI_EXPORTS # define CS_EXPORTS __declspec(dllexport) #else # define CS_EXPORTS #endif #ifndef CS_API # define CS_API(rettype) CS_EXPORTS rettype CS_CDECL #endif #ifdef __cplusplus } #endif
рдУрдкрдирд╕реАрд╡реА рдХреЗ рд╕рд╛рде рдореИрдХреНрд░реЛрд╕ I "рд╕реНрд▓реИрдореНрдб" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ред
рдЕрдм рд╣рдо рдбреЗрдЯрд╛ рддреИрдпрд╛рд░реА рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗ: рдлрд╝рд╛рдЗрд▓
cs_common.h #ifndef SC_COMMON_H #define SC_COMMON_H #include "cs_types.h" #include <getopt.h> /*----------------------------------------------------------------------------*/ /** * @typedef opt_t * @brief struct option (@see man 3 getopt) */ typedef struct option opt_t; /*----------------------------------------------------------------------------*/ /** * @fn [CS_API] int is_digital ( * const char* __restrict param_value, * long long* __restrict param_digit, * int* param_base ); * @brief , . * * @a param_value * , long long. * @a param_base, * NULL * * @warning " " , * ( ). * * : * - <>[.e[+|-]<>]> * - [<><[h|H]> | [0x|0X]<>] * - <><[o|O]> * - <><[b|B]> * * @param param_value - * @param param_digit - * @param param_base - * @return : * 0, @a param_value - . * 1, @a param_value - . * -1, . * , -1, errno * : * EINVAL - ; * ERANGE - * ENOMEM - * EBADE - * */ CS_API(int) is_digital ( const char* __restrict param_value, long long* __restrict param_digit, int* param_base ); /*----------------------------------------------------------------------------*/ /** * @fn CS_API(char*) ltrim( const char* param_str ); * @brief . * * @param param_str - * @return NULL. * * - @a param_str, * "". * , NULL, errno * EINVAL ( ); */ CS_API(char*) ltrim( const char* param_str ); /*----------------------------------------------------------------------------*/ /** * @fn CS_API(char*) rtrim( const char* param_str ); * @brief . * * @param param_str - * @return (static pointer) NULL. * , NULL, errno * : * EINVAL - ; * ENOMEM - * EBADE - * * @warning - static pointer. ! */ CS_API(char*) rtrim( const char* param_str ); #ifdef __cplusplus } #endif #endif /* SC_COMMON_H */
"рдмрдирд╛рдП рдЧрдП - рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП - рднреВрд▓ рдЧрдП" рдХреЗ рдирд┐рджрд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрд░рд╛рдиреЗ рд╕реНрдХреНрд▓реЗрд░реЛрдЯрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рд╣рдореЗрд╢рд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдФрд░ рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдореБрдЦреНрдп рдШреЛрд╖рдгрд╛ рд▓рд┐рдЦреЗрдВрдЧреЗ
cs_configfile.h #ifndef CONFIG_UTILS_H #define CONFIG_UTILS_H #include "../include/cs_types.h" typedef enum config_value_type { ptDigital = 0x01, ptString = 0x02 } cfg_val_type_t; typedef struct { char* name; cfg_val_type_t type; union { char* str; struct { long long digit; int base; }; }; } config_t; typedef struct txt_cfg { config_t value; struct txt_cfg* prev; struct txt_cfg* next; } txt_cfg_t; #ifdef __cplusplus extern "C" { #endif CS_API(txt_cfg_t*) config_Open (const char* __restrict param_filename); CS_API(void) config_Close (txt_cfg_t** param_item); #ifdef __cplusplus } #endif #endif
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЦреЛрд▓рдиреЗ рдФрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд╕реНрдореГрддрд┐ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рдХрд╛рд░реНрдп рд╣реИрдВред
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЛред
рд╢рд╛рдпрдж рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдж рдЖрдкрдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢рд╛рдЦрд╛ рдмрдирд╛рдХрд░,
ptBool
рд▓рд┐рдП
cfg_val_type_t
рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
ptBool
ред рддрдм рддреБрдо рдЦреБрдж рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЖрд▓рд╕реА рд╣реЛ!
рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрдиред
рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдПред
cs_common.c #include "../include/cs_common.h" #include <stdlib.h> #include <errno.h> #include <limits.h> #include <string.h> #include <stdio.h> //#include <netdb.h> /*----------------------------------------------------------------------------*/ int is_digital ( const char* __restrict param_value, long long* __restrict param_digit, int* param_base ) { char* c_endptr; char* c_value; int i_base; int i_ret = 1; size_t u_len; errno = 0; if(param_value == NULL || param_digit == NULL) { errno = EINVAL; return (-1); } *param_digit = 0; errno = 0; /* */ switch(param_value[strlen(param_value)-1]) { case 'h' : case 'H' : i_base = 16; break; case 'o' : case 'O' : i_base = 8; break; case 'b' : case 'B' : i_base = 2; break; default : i_base = 10; } if(i_base == 10) { if(param_value[strlen(param_value)-1] < (int)'0' || param_value[strlen(param_value)-1] > (int)'9') { return (0); /**/ } } u_len = strlen(param_value); if(u_len > 1) { if((c_value = malloc(u_len+1)) == NULL) { /* , ! */ errno = ENOMEM; return (-1); } if((c_value = strncpy(c_value, param_value, u_len)) == NULL) { errno = EBADE; i_ret = -1; } else { /* 16- */ if(param_value[0] == '0') { switch(param_value[1]) { case 'X' : case 'x' : i_base = 16; break; default : ; } if(i_base == 16) { if((c_value = strncpy(c_value, param_value+2, u_len-2)) == NULL) { errno = EBADE; i_ret = -1; } else { if( strncpy(c_value+u_len-2, "h\0", 2) == NULL ) { errno = EBADE; i_ret = -1; } } } } } if(i_ret > -1) { /* - */ *param_digit = strtoll(c_value, &c_endptr, i_base); if(c_endptr == c_value) { /* */ i_ret = 0; } else { /* */ if( (errno == ERANGE && (*param_digit == LLONG_MIN || *param_digit == LLONG_MAX)) || (errno != 0 && *param_digit == 0) ) { /* */ i_ret = -1; } } } /* */ if(param_base != NULL) *param_base = i_base; /* */ free(c_value); } return(i_ret); } /*----------------------------------------------------------------------------*/ char* ltrim ( const char* param_str ) { size_t i; size_t u_length; if(param_str == NULL) { errno = EINVAL; return (NULL); } errno = 0; u_length = strlen(param_str); if(0 == u_length) return (""); for(i = 0; i < u_length; i++ ) if((int)(param_str[i]) != ' '/* */) /* , */ return ((char*)param_str+i); return (NULL); } /*----------------------------------------------------------------------------*/ char* rtrim( const char* param_str ) { size_t i; size_t u_length; char* ptr; /* !!! */ static /* !!! */ char* str; if(NULL == param_str) { errno = EINVAL; return (NULL); } u_length = strlen(param_str); if(u_length == 0) return (""); for(i = u_length, errno = 0; (0 == errno) && (i > 0); i--) { if((int)(param_str[i-1]) == ' ') continue; if(NULL != (ptr = malloc(i + 1))) { if(NULL != (str = strncpy(ptr, param_str, i))) { str[i] = '\0'; return(str); } else { free(ptr); errno = EBADE; } } else { errno = ENOMEM; } } return (NULL); }
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
cs_configfile.c #include "../include/cs_configfile.h" #include "../include/cs_common.h" #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <limits.h> #include <string.h> /*----------------------------------------------------------------------------*/ /**@internal * @fn void free_cfg_data (txt_cfg_t* param_result); * @brief @a txt_cfg_t. * * @param param_result - . */ void free_cfg_data (txt_cfg_t* param_result) { txt_cfg_t* p; errno = 0; for(p = param_result; p != NULL; p = p->next) { free(p->value.name); if(p->value.type == ptString) free(p->value.str); } if(param_result) free(param_result); } /*----------------------------------------------------------------------------*/ /**@internal * @fn int alloc_cfg_data ( * const char* __restrict param_name, * const char* __restrict param_value, * txt_cfg_t** __restrict param_result * ); * @brief param_result txt_cfg_t. * * @param param_name - * @param param_value - * @param param_result - * txt_params_t. * * @return 0 -1 . * , -1, * errno . * * @warning *param_result * , . * * . */ int alloc_cfg_data ( const char* __restrict param_name, const char* __restrict param_value, txt_cfg_t** __restrict param_result ) { size_t u_length_n, u_length_v; if(param_name == NULL || param_value == NULL || param_result == NULL) { errno = EINVAL; return(-1); } errno = 0; if((*param_result = malloc(sizeof(txt_cfg_t))) == NULL) return(-1); /* ""! * ( * free_param(...)) * , str NULL. * NULL, .. . * - free() */ if(memset (*param_result, 0, sizeof(txt_cfg_t)) == NULL) return(-1); u_length_n = strlen(param_name); if(u_length_n == 0) return(-1); (*param_result)->value.name = malloc(u_length_n+1); if((*param_result)->value.name == NULL) /* */ goto free; if(strncpy((*param_result)->value.name, param_name, u_length_n) != NULL) { /* */ switch( is_digital( param_value, &((*param_result)->value.digit), &((*param_result)->value.base) ) ) { case 0 : { /* */ u_length_v = strlen(param_value); if(u_length_v > 0) { /* */ (*param_result)->value.str = malloc(u_length_v+1); if((*param_result)->value.str == NULL) goto free; if(strncpy((*param_result)->value.str, param_value, u_length_v) == NULL) goto free; } (*param_result)->value.type = ptString; } break; case 1 : /* */ (*param_result)->value.type = ptDigital; break; default : { /* - */ errno = ERANGE; goto free; } } return (0); } free: free_cfg_data(*param_result); *param_result = NULL; return (-1); } /*----------------------------------------------------------------------------*/ /**@internal * * <> = <> * . * * @param param_str - [] = [] * @param param_name - * @param param_value - * @return 0 -1 . * * , -1, * errno . * * @warning *param_value / *param_name NULL, * . * . */ int parse_string ( const char* param_str, char** param_name, char** param_value ) { if(param_name == NULL || param_value == NULL) { errno = EINVAL; return -1; } *param_value = *param_name = NULL; if(param_str == NULL) { errno = EINVAL; return -1; } switch(param_str[0]) { case '\n' : case '#' : case 0 : return (0); } char c_name[MAX_INPUT]; char c_value[MAX_INPUT]; errno = 0; int i = sscanf(param_str, "%s = %s", c_name, c_value); char* p_name = ltrim(rtrim(c_name)); char* p_value = ltrim(rtrim(c_value)); if(errno != 0 || i != 2 ) return (-1); *param_name = malloc(strlen(p_name)+1); if(*param_name != NULL) { *param_value = malloc(strlen(p_value)+1); if(*param_value != NULL) { if(strcpy(*param_name, p_name) == NULL) { /* */ errno = EXFULL; goto freemem; } if(strcpy(*param_value, p_value) == NULL) { /* */ errno = EXFULL; goto freemem; } #ifdef DEBUG_MODE if(debug_level > 3) { printf("DEBUG parse_string(...). c_name = %s, c_value = %s, ", c_name, c_value); printf("*param_name = %s, *param_value = %s\n", *param_name, *param_value); } #endif return (0); } } freemem: if(*param_name != NULL) free(*param_name); if(*param_value != NULL) free(*param_value); *param_value = *param_name = NULL; return(-1); } /*----------------------------------------------------------------------------*/ /**@internal * * . * * @param param_file_name - * * @param param_result - * @return 0 * @a param_result. -1. * * @warning *param_result NULL, * . * . * * , * @a txt_params_t. * ( -1) * errno. *param_result * NULL ( ) * */ int parse_config_file ( const char* param_file_name, txt_cfg_t** param_result ) { if(param_result == NULL || param_result == NULL) { errno = EINVAL; return (-1); } char c_str[MAX_INPUT]; txt_cfg_t* t_param; char* c_name; char* c_value; errno = 0; FILE* p_fd = fopen(param_file_name, "r"); if(p_fd == NULL) /* */ return (-1); int i_res = 0; *param_result = NULL; errno = 0; /* */ while(fgets(c_str,MAX_INPUT,p_fd) != NULL && i_res == 0 ) { /* */ i_res = parse_string(c_str, &c_name, &c_value); if(i_res == 0) { if(c_name == NULL) /* (, ,...) */ continue; #ifdef DEBUG_MODE if(debug_level > 3) printf( "DEBUG parse_confif_file(...): source = \"%s\", name = %s, value = %s \n", c_str, c_name, c_value ); #endif if((i_res = alloc_cfg_data(c_name, c_value, &t_param)) == 0 ) { /* */ t_param->next = *param_result; if(*param_result != NULL) (*param_result)->prev = t_param; } /* i_res */ /* : ! */ free(c_name); free(c_value); *param_result = t_param; }/* i_res */ } if(i_res != 0) { free_cfg_data(*param_result); *param_result = NULL; } fclose(p_fd); return (i_res); } /*----------------------------------------------------------------------------*/ txt_cfg_t* config_Open (const char* param_filename) { txt_cfg_t* p_item = NULL; (void)parse_config_file(param_filename, &p_item); return (p_item); } /*----------------------------------------------------------------------------*/ void config_Close (txt_cfg_t** param_item) { if(param_item) { if(*param_item) { free_cfg_data(*param_item); *param_item = NULL; } } }
рд╕реЛрдЪреЛ!
parse_string
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ
parse_string
рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рддреЛ рдЖрдк рд╕рдорд╛рди рд╕рдВрдХреЗрдд рдХреЗ рджреЛрдиреЛрдВ рддрд░рдл рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдбрд╛рд▓рдиреЗ рдХреЗ рджрд╛рдпрд┐рддреНрд╡ рд╕реЗ рдореБрдХреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдореИрдВ рдЖрд▓рд╕реА рдерд╛ред
рд╡рд╣ рд╕рдм рд╣реИред :)
рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдореИрдВ рдиреЗрдЯрдмреАрдиреНрд╕ рдЖрдИрдбреАрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдХреНрдпреЛрдВ? рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ! :)
рдЗрд╕ рдорд╛рд╣реМрд▓ рдореЗрдВ, рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдорд╡рд░реНрдХ
рдХреНрдпреВрдирд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
ltrim
рдЙрдкрдпреЛрдЧрд┐рддрд╛
рдХреНрдпреВрдирд┐рдЯ - рд╕реА - рд╕рдВрд╕реНрдХрд░рдг 2.1-2 рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд░реВрдкрд░реЗрдЦрд╛
cunit.sourceforge.net
рдЯреЗрд╕реНрдЯ: рдЯреЗрд╕реНрдЯ 1 ...
рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред
рд╕реНрдЯреНрд░рд┐рдВрдЧ "рдЯреЗрд╕реНрдЯ 1" рд╣реИред рдкрд░рд┐рдгрд╛рдо: "test1"
рд╕реНрдЯреНрд░рд┐рдВрдЧ "рдкрд░реАрдХреНрд╖рдг 2" рд╣реИред рдкрд░рд┐рдгрд╛рдо: "рдкрд░реАрдХреНрд╖рдг 2"
рд╕реНрдЯреНрд░рд┐рдВрдЧ "! 23test3"ред рдкрд░рд┐рдгрд╛рдо: "! 23test3"
рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛
suites 1 1 n / a 0 0
рдкрд░реАрдХреНрд╖рдг 1 1 1 0 0
asserts 1 1 1 0 рдПрди / рдП
рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 0.000 рд╕реЗрдХрдВрдб
rtrim
рдЙрдкрдпреЛрдЧрд┐рддрд╛
рдХреНрдпреВрдирд┐рдЯ - рд╕реА - рд╕рдВрд╕реНрдХрд░рдг 2.1-2 рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд░реВрдкрд░реЗрдЦрд╛
cunit.sourceforge.net
рдЯреЗрд╕реНрдЯ: рдЯреЗрд╕реНрдЯ 1 ...
рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред
рд╕реНрдЯреНрд░рд┐рдВрдЧ "рдЯреЗрд╕реНрдЯ 1" рд╣реИред рдкрд░рд┐рдгрд╛рдо: "test1"
рд╕реНрдЯреНрд░рд┐рдВрдЧ "рдкрд░реАрдХреНрд╖рдг 2" рд╣реИред рдкрд░рд┐рдгрд╛рдо: "рдкрд░реАрдХреНрд╖рдг 2"
рд╕реНрдЯреНрд░рд┐рдВрдЧ "! 23test3 #"ред рдкрд░рд┐рдгрд╛рдо: "! 23test3 #"
рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛
suites 1 1 n / a 0 0
рдкрд░реАрдХреНрд╖рдг 1 1 1 0 0
asserts 1 1 1 0 рдПрди / рдП
рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 0.000 рд╕реЗрдХрдВрдб
is_digital
рдЙрдкрдпреЛрдЧрд┐рддрд╛
рдХреНрдпреВрдирд┐рдЯ - рд╕реА - рд╕рдВрд╕реНрдХрд░рдг 2.1-2 рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд░реВрдкрд░реЗрдЦрд╛
cunit.sourceforge.net
рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджрд░реНрдЬ рдХрд░реЗрдВ: 0xffff
рдЖрдкрдХреА рдкрдВрдХреНрддрд┐: "0xffff"
рд╕реБрдЗрдЯ: is_digital_test
рдЯреЗрд╕реНрдЯ: рдЯреЗрд╕реНрдЯ 1 ... рдЙрддреНрддреАрд░реНрдг
рдЯреЗрд╕реНрдЯ: рдЯреЗрд╕реНрдЯ 2 ... рдЯреЗрд╕реНрдЯ рдкрд░рд┐рдгрд╛рдо:
рд╕рдВрдЦреНрдпрд╛ = 65535, рдЧрдгрдирд╛ рдкреНрд░рдгрд╛рд▓реА = 16
рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛
рд░рди рд╕рд╛рд░рд╛рдВрд╢: рдЯрд╛рдЗрдк рд░рди рд░реЗрдВрдХ рдлреЗрд▓ рдЗрдирдПрдХреНрдЯрд┐рд╡
suites 1 1 n / a 0 0
рдкрд░реАрдХреНрд╖рдг 2 2 2 0 0
asserts 2 2 2 0 n / a
рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 0.000 рд╕реЗрдХрдВрдб
рдХреНрдпреВрдирд┐рдЯ - рд╕реА - рд╕рдВрд╕реНрдХрд░рдг 2.1-2 рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд░реВрдкрд░реЗрдЦрд╛
cunit.sourceforge.net
рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджрд░реНрдЬ рдХрд░реЗрдВ: 1277o
рдЖрдкрдХреА рдкрдВрдХреНрддрд┐: "1277o"
рд╕реБрдЗрдЯ: is_digital_test
рдЯреЗрд╕реНрдЯ: рдЯреЗрд╕реНрдЯ 1 ... рдЙрддреНрддреАрд░реНрдг
рдЯреЗрд╕реНрдЯ: рдЯреЗрд╕реНрдЯ 2 ... рдЯреЗрд╕реНрдЯ рдкрд░рд┐рдгрд╛рдо:
рд╕рдВрдЦреНрдпрд╛ = 703, рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА = 8
рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛
рд░рди рд╕рд╛рд░рд╛рдВрд╢: рдЯрд╛рдЗрдк рд░рди рд░реЗрдВрдХ рдлреЗрд▓ рдЗрдирдПрдХреНрдЯрд┐рд╡
suites 1 1 n / a 0 0
рдкрд░реАрдХреНрд╖рдг 2 2 2 0 0
asserts 2 2 2 0 n / a
рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 0.000 рд╕реЗрдХрдВрдб
рдХреНрдпреВрдирд┐рдЯ - рд╕реА - рд╕рдВрд╕реНрдХрд░рдг 2.1-2 рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд░реВрдкрд░реЗрдЦрд╛
cunit.sourceforge.net
рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджрд░реНрдЬ рдХрд░реЗрдВ: 4ret
рдЖрдкрдХреА рдкрдВрдХреНрддрд┐: "4ret"
рд╕реБрдЗрдЯ: is_digital_test
рдЯреЗрд╕реНрдЯ: рдЯреЗрд╕реНрдЯ 1 ... рдЙрддреНрддреАрд░реНрдг
рдЯреЗрд╕реНрдЯ: рдЯреЗрд╕реНрдЯ 2 ... рдЯреЗрд╕реНрдЯ рдкрд░рд┐рдгрд╛рдо:
рд╕рдВрдЦреНрдпрд╛ = 0, рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА = 0
рд╡рд┐рдлрд▓
1. рдкрд░реАрдХреНрд╖рдг / is_digital_test.c: 59 - (i_result = is_digital (c_test, & ll_digit, рдФрд░ i_base)) == 1
рд░рди рд╕рд╛рд░рд╛рдВрд╢: рдЯрд╛рдЗрдк рд░рди рд░реЗрдВрдХ рдлреЗрд▓ рдЗрдирдПрдХреНрдЯрд┐рд╡
suites 1 1 n / a 0 0
рдкрд░реАрдХреНрд╖рдг 2 2 1 1 0
asserts 2 2 1 1 n / a
рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 0.000 рд╕реЗрдХрдВрдб
рдХреНрдпреВрдирд┐рдЯ - рд╕реА - рд╕рдВрд╕реНрдХрд░рдг 2.1-2 рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд░реВрдкрд░реЗрдЦрд╛
cunit.sourceforge.net
рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджрд░реНрдЬ рдХрд░реЗрдВ: 1024
рдЖрдкрдХреА рдкрдВрдХреНрддрд┐: "1024"
рд╕реБрдЗрдЯ: is_digital_test
рдЯреЗрд╕реНрдЯ: рдЯреЗрд╕реНрдЯ 1 ... рдЙрддреНрддреАрд░реНрдг
рдЯреЗрд╕реНрдЯ: рдЯреЗрд╕реНрдЯ 2 ... рдЯреЗрд╕реНрдЯ рдкрд░рд┐рдгрд╛рдо:
рд╕рдВрдЦреНрдпрд╛ = 1024, рдЧрдгрдирд╛ рдкреНрд░рдгрд╛рд▓реА = 10
рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛
рд░рди рд╕рд╛рд░рд╛рдВрд╢: рдЯрд╛рдЗрдк рд░рди рд░реЗрдВрдХ рдлреЗрд▓ рдЗрдирдПрдХреНрдЯрд┐рд╡
suites 1 1 n / a 0 0
рдкрд░реАрдХреНрд╖рдг 2 2 2 0 0
asserts 2 2 2 0 n / a
рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 0.000 рд╕реЗрдХрдВрдб
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ред
рдлрд╝рд╛рдЗрд▓:
рдкрд░рд┐рдгрд╛рдо:рдХреНрдпреВрдирд┐рдЯ - рд╕реА - рд╕рдВрд╕реНрдХрд░рдг 2.1-2 рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд░реВрдкрд░реЗрдЦрд╛
cunit.sourceforge.net
рдЯреЗрд╕реНрдЯ: test_parse_confif_file ...
рдкреИрд░рд╛рдореАрдЯрд░:
рд╢реАрд░реНрд╖рдХ - "usb_ep_out"
рдкреНрд░рдХрд╛рд░ - рд╕рдВрдЦреНрдпрд╛
рдорд╛рди - 0x0082
рдЖрдзрд╛рд░ рдкреНрд░рдгрд╛рд▓реА - резрем
рдкреИрд░рд╛рдореАрдЯрд░:
рд╢реАрд░реНрд╖рдХ - "usb_ep_in"
рдкреНрд░рдХрд╛рд░ - рд╕рдВрдЦреНрдпрд╛
рдорд╛рди - 0x0001
рдЖрдзрд╛рд░ рдкреНрд░рдгрд╛рд▓реА - резрем
рдкреИрд░рд╛рдореАрдЯрд░:
рд╢реАрд░реНрд╖рдХ - "usb_product"
рдкреНрд░рдХрд╛рд░ - рд╕рдВрдЦреНрдпрд╛
рдорд╛рди - 1234
рдЖрдзрд╛рд░ рдкреНрд░рдгрд╛рд▓реА - -
рдкреИрд░рд╛рдореАрдЯрд░:
рд╢реАрд░реНрд╖рдХ - "usb_vendor"
рдкреНрд░рдХрд╛рд░ - рд╕рдВрдЦреНрдпрд╛
рдорд╛рди - рез
рдЖрдзрд╛рд░ рдкреНрд░рдгрд╛рд▓реА - реи
рдкреИрд░рд╛рдореАрдЯрд░:
рдирд╛рдо - "server_family"
рдкреНрд░рдХрд╛рд░ - рд╕реНрдЯреНрд░рд┐рдВрдЧ
рдорд╛рди "SOCKET_STREAM" рд╣реИ
рдкреИрд░рд╛рдореАрдЯрд░:
рдирд╛рдо - "server_port"
рдкреНрд░рдХрд╛рд░ - рд╕рдВрдЦреНрдпрд╛
рдорд╛рди - 8989
рдЖрдзрд╛рд░ рдкреНрд░рдгрд╛рд▓реА - резреж
рдкреИрд░рд╛рдореАрдЯрд░:
рд╢реАрд░реНрд╖рдХ - "server_broadcast"
рдкреНрд░рдХрд╛рд░ - рд╕реНрдЯреНрд░рд┐рдВрдЧ
рдорд╛рди "рдХреЛрдИ рднреА" рд╣реИ
рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛
suites 1 1 n / a 0 0
рдкрд░реАрдХреНрд╖рдг 1 1 1 0 0
asserts 1 1 1 0 рдПрди / рдП
рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 0.000 рд╕реЗрдХрдВрдб
рдзрдиреНрдпрд╡рд╛рджред
- рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ "рд╕реА" рдХреЗ рд╕рд░рд▓ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдбреЗрдирд┐рд╕ рд░рд┐рдЪреА (рдЖрд░рдЖрдИрдкреА);
- NetBeans IDE рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рди рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрдореНрд╕ (RIP);
- рдЬреЙрди рдбрдЧрд▓рд╕ рд▓реЙрд░реНрдб (RIP) рдХрдВрд╕рд░реНрдЯреЛ рдлреЙрд░ рдЧреНрд░реБрдк рдФрд░ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░рд╛ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдкрдж рдХреЗ рд╕рд╛рде рдереЗред
рдСрд▓ рдж рдмреЗрд╕реНрдЯ!