lib/iec_std_lib.h
changeset 379 7dc97c825bb8
parent 378 7f2e120c7352
child 384 4626828277f9
equal deleted inserted replaced
378:7f2e120c7352 379:7dc97c825bb8
  1874 
  1874 
  1875     /*****************/
  1875     /*****************/
  1876     /*     RIGHT     */
  1876     /*     RIGHT     */
  1877     /*****************/
  1877     /*****************/
  1878 
  1878 
  1879 static inline STRING __right(STRING IN, __strlen_t L){
  1879 #define __right(TYPENAME) \
  1880     STRING res;
  1880 static inline STRING RIGHT__STRING__STRING__##TYPENAME(EN_ENO_PARAMS, STRING IN, TYPENAME L){\
  1881     res = __INIT_STRING;
  1881   STRING res;\
  1882     L = L < IN.len ? L : IN.len;
       
  1883     memcpy(&res.body, &IN.body[IN.len - L], L);
       
  1884     res.len = L;
       
  1885     return res;
       
  1886 }
       
  1887 
       
  1888 
       
  1889 #define __iec_(TYPENAME) \
       
  1890 static inline STRING RIGHT__STRING__STRING__##TYPENAME(EN_ENO_PARAMS, STRING str, TYPENAME L){\
       
  1891   TEST_EN_COND(STRING, L < 0)\
  1882   TEST_EN_COND(STRING, L < 0)\
  1892   return (STRING)__right(str,L);\
  1883   res = __INIT_STRING;\
  1893 }
  1884   L = L < IN.len ? L : IN.len;\
  1894 __ANY_INT(__iec_)
  1885   memcpy(&res.body, &IN.body[IN.len - L], L);\
  1895 #undef __iec_
  1886   res.len = L;\
       
  1887   return res;\
       
  1888 }
       
  1889 __ANY_INT(__right)
  1896 
  1890 
  1897 
  1891 
  1898     /***************/
  1892     /***************/
  1899     /*     MID     */
  1893     /*     MID     */
  1900     /***************/
  1894     /***************/
  1901 
  1895 
  1902 static inline STRING __mid(STRING IN, __strlen_t L, __strlen_t P){
  1896 #define __mid(TYPENAME) \
  1903     STRING res;
  1897 static inline STRING MID__STRING__STRING__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, STRING IN, TYPENAME L, TYPENAME P){\
  1904     res = __INIT_STRING;
  1898   STRING res;\
  1905     if(P <= IN.len){
       
  1906 	    P -= 1; /* now can be used as [index]*/
       
  1907 	    L = L + P <= IN.len ? L : IN.len - P;
       
  1908 	    memcpy(&res.body, &IN.body[P] , L);
       
  1909         res.len = L;
       
  1910     }
       
  1911     return res;
       
  1912 }
       
  1913 
       
  1914 #define __iec_(TYPENAME) \
       
  1915 static inline STRING MID__STRING__STRING__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, STRING str, TYPENAME L, TYPENAME P){\
       
  1916   TEST_EN_COND(STRING, L < 0 || P < 0)\
  1899   TEST_EN_COND(STRING, L < 0 || P < 0)\
  1917   return (STRING)__mid(str,L,P);\
  1900   res = __INIT_STRING;\
  1918 }
  1901   if(P <= IN.len){\
  1919 __ANY_INT(__iec_)
  1902 	P -= 1; /* now can be used as [index]*/\
  1920 #undef __iec_
  1903 	L = L + P <= IN.len ? L : IN.len - P;\
       
  1904 	memcpy(&res.body, &IN.body[P] , L);\
       
  1905 	  res.len = L;\
       
  1906   }\
       
  1907   return res;\
       
  1908 }
       
  1909 __ANY_INT(__mid)
  1921 
  1910 
  1922 
  1911 
  1923     /******************/
  1912     /******************/
  1924     /*     CONCAT     */
  1913     /*     CONCAT     */
  1925     /******************/
  1914     /******************/
  1926 
  1915 
  1927 static inline STRING CONCAT__STRING__STRING(UINT param_count, ...){
  1916 static inline STRING CONCAT(EN_ENO_PARAMS, UINT param_count, ...){
  1928   UINT i;
  1917   UINT i;
  1929   STRING res;
  1918   STRING res;
  1930   va_list ap;
  1919   va_list ap;
  1931   __strlen_t charcount;
  1920   __strlen_t charcount;
       
  1921   TEST_EN(STRING)
  1932   charcount = 0;
  1922   charcount = 0;
  1933   res = __INIT_STRING;
  1923   res = __INIT_STRING;
  1934 
  1924 
  1935   va_start (ap, param_count);         /* Initialize the argument list.  */
  1925   va_start (ap, param_count);         /* Initialize the argument list.  */
  1936 
  1926