lib/iec_std_lib.h
changeset 384 4626828277f9
parent 379 7dc97c825bb8
child 389 94b67e38188a
equal deleted inserted replaced
383:0b81b59f333b 384:4626828277f9
  1852 
  1852 
  1853     /****************/
  1853     /****************/
  1854     /*     LEFT     */
  1854     /*     LEFT     */
  1855     /****************/
  1855     /****************/
  1856 
  1856 
  1857 static inline STRING __left(STRING IN, __strlen_t L){
  1857 #define __left(TYPENAME) \
  1858     STRING res;
  1858 static inline STRING LEFT__STRING__STRING__##TYPENAME(EN_ENO_PARAMS, STRING IN, TYPENAME L){\
  1859     res = __INIT_STRING;
  1859     STRING res;\
  1860     L = L < IN.len ? L : IN.len;
  1860     TEST_EN_COND(STRING, L < 0)\
  1861     memcpy(&res.body, &IN.body, L);
  1861     res = __INIT_STRING;\
  1862     res.len = L;
  1862     L = L < (TYPENAME)IN.len ? L : (TYPENAME)IN.len;\
  1863     return res;
  1863     memcpy(&res.body, &IN.body, L);\
  1864 }
  1864     res.len = L;\
  1865 
  1865     return res;\
  1866 #define __iec_(TYPENAME) \
  1866 }
  1867 static inline STRING LEFT__STRING__STRING__##TYPENAME(EN_ENO_PARAMS, STRING str, TYPENAME L){\
  1867 __ANY_INT(__left)
  1868   TEST_EN_COND(STRING, L < 0)\
       
  1869   return (STRING)__left(str,L);\
       
  1870 }
       
  1871 __ANY_INT(__iec_)
       
  1872 #undef __iec_
       
  1873 
  1868 
  1874 
  1869 
  1875     /*****************/
  1870     /*****************/
  1876     /*     RIGHT     */
  1871     /*     RIGHT     */
  1877     /*****************/
  1872     /*****************/
  1879 #define __right(TYPENAME) \
  1874 #define __right(TYPENAME) \
  1880 static inline STRING RIGHT__STRING__STRING__##TYPENAME(EN_ENO_PARAMS, STRING IN, TYPENAME L){\
  1875 static inline STRING RIGHT__STRING__STRING__##TYPENAME(EN_ENO_PARAMS, STRING IN, TYPENAME L){\
  1881   STRING res;\
  1876   STRING res;\
  1882   TEST_EN_COND(STRING, L < 0)\
  1877   TEST_EN_COND(STRING, L < 0)\
  1883   res = __INIT_STRING;\
  1878   res = __INIT_STRING;\
  1884   L = L < IN.len ? L : IN.len;\
  1879   L = L < (TYPENAME)IN.len ? L : (TYPENAME)IN.len;\
  1885   memcpy(&res.body, &IN.body[IN.len - L], L);\
  1880   memcpy(&res.body, &IN.body[(TYPENAME)IN.len - L], L);\
  1886   res.len = L;\
  1881   res.len = L;\
  1887   return res;\
  1882   return res;\
  1888 }
  1883 }
  1889 __ANY_INT(__right)
  1884 __ANY_INT(__right)
  1890 
  1885 
  1896 #define __mid(TYPENAME) \
  1891 #define __mid(TYPENAME) \
  1897 static inline STRING MID__STRING__STRING__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, STRING IN, TYPENAME L, TYPENAME P){\
  1892 static inline STRING MID__STRING__STRING__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, STRING IN, TYPENAME L, TYPENAME P){\
  1898   STRING res;\
  1893   STRING res;\
  1899   TEST_EN_COND(STRING, L < 0 || P < 0)\
  1894   TEST_EN_COND(STRING, L < 0 || P < 0)\
  1900   res = __INIT_STRING;\
  1895   res = __INIT_STRING;\
  1901   if(P <= IN.len){\
  1896   if(P <= (TYPENAME)IN.len){\
  1902 	P -= 1; /* now can be used as [index]*/\
  1897 	P -= 1; /* now can be used as [index]*/\
  1903 	L = L + P <= IN.len ? L : IN.len - P;\
  1898 	L = L + P <= (TYPENAME)IN.len ? L : (TYPENAME)IN.len - P;\
  1904 	memcpy(&res.body, &IN.body[P] , L);\
  1899 	memcpy(&res.body, &IN.body[P] , L);\
  1905 	  res.len = L;\
  1900 	res.len = L;\
  1906   }\
  1901   }\
  1907   return res;\
  1902   return res;\
  1908 }
  1903 }
  1909 __ANY_INT(__mid)
  1904 __ANY_INT(__mid)
  1910 
  1905