рд╕рд░рд▓ рдмрд╛рддреЗрдВред рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдЫреЛрдЯреЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЯреНрд░реЗрд▓рд░

рдпрд╣ рдкреЛрд╕реНрдЯ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ 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 /* CS_INLINE */ #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 //#define DEBUG_MODE #ifdef DEBUG_MODE static short debug_level = 3; #endif #endif /* CS_TYPES_H */ 


рдУрдкрдирд╕реАрд╡реА рдХреЗ рд╕рд╛рде рдореИрдХреНрд░реЛрд╕ 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 cfg_val_type_t * @brief    */ typedef enum config_value_type { ptDigital = 0x01, /**<   -  */ ptString = 0x02 /**<   -   */ } cfg_val_type_t; /** * @typedef config_t * @brief     */ typedef struct { char* name; /**<   */ cfg_val_type_t type; /**<   @a param_type*/ union { /**<   */ char* str; /**<   */ struct { long long digit; /**<   */ int base; /**<     */ }; }; } config_t; /** * @typedef txt_cfg_t * @brief   . */ typedef struct txt_cfg { config_t value; struct txt_cfg* prev;/**<      */ struct txt_cfg* next;/**<       */ } txt_cfg_t; #ifdef __cplusplus extern "C" { #endif /*----------------------------------------------------------------------------*/ /** * @fn [CS_API] txt_cfg_t* config_Open (const char* __restrict param_filename); * @brief          @a txt_cfg_t. * * @param param_file_name -   * @return     ,   *      \a param_filename    (NULL). * *    NULL,    errno   *  . *     errno: * EINVAL -     param_filename * ENOMEM -    * ERANGE -  .  * EBADE -     * *      ,    *    < > = < >. * : * * # server_broadcast = ANY ( ) * server_broadcast = ANY * * #      * server_port = 8989 * * #   * #  : * # * # server_family = SOCKET_STREAM ( ) * server_family = SOCKET_STREAM * * #usb_vendor = 0x1111 * usb_vendor = 0xffff * usb_product = 0xaaaa * usb_ep_in = 0x01 * * @see config_Close */ CS_API(txt_cfg_t*) config_Open (const char* __restrict param_filename); /*----------------------------------------------------------------------------*/ /** * @fn [CS_API] void config_Close (txt_cfg_t** param_item); * @brief   . * * @param param_item -    @a txt_cfg_t * *        @a param_item . *     NULL. * * @see @a config_Open * @see @a free */ CS_API(void) config_Close (txt_cfg_t** param_item); #ifdef __cplusplus } #endif #endif /* CONFIG_UTILS_H */ 



рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЦреЛрд▓рдиреЗ рдФрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд╕реНрдореГрддрд┐ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рдХрд╛рд░реНрдп рд╣реИрдВред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЛред

рд╢рд╛рдпрдж рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдж рдЖрдкрдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢рд╛рдЦрд╛ рдмрдирд╛рдХрд░, 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 рд╕реЗрдХрдВрдб



рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ред

рдлрд╝рд╛рдЗрд▓:
 #------------------------------------------------------------------------------- # :          #    . #------------------------------------------------------------------------------- # #pid_file = ereusb.pid #    #  : bla, bla, bla... # # server_broadcast = ANY ( ) server_broadcast = ANY #      server_port = 8989 #   #  : # # server_family = SOCKET_STREAM ( ) server_family = SOCKET_STREAM #usb_vendor = 0x1111 usb_vendor = 0001b usb_product = 1234o usb_ep_in = 0x01 usb_ep_out = 0x82 


рдкрд░рд┐рдгрд╛рдо:
рдХреНрдпреВрдирд┐рдЯ - рд╕реА - рд╕рдВрд╕реНрдХрд░рдг 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 рд╕реЗрдХрдВрдб



рдзрдиреНрдпрд╡рд╛рджред



рдСрд▓ рдж рдмреЗрд╕реНрдЯ!

Source: https://habr.com/ru/post/In148930/


All Articles