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 |