#!/bin/sh #echo "My own special preprocessor -- $@" /usr/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/cc1plus "$@" r=$? if [ "$1" = "-E" ]; then sed -i "s/\(extern int strcasecmp\>\)/\1_disable/g" ${@: -1} sed -i "s/^\(.*strcasecmp_disable\)/extern int tolower (int __c); static int strcasecmp(const char* str1, const char* str2) { while (1) { unsigned char c1 = tolower(*str1), c2 = tolower(*str2); if (c1 \!= c2) return (c1 > c2) ? 1 : -1; if (\!c1) return 0; str1++; str2++; } }\n\1/g" ${@: -1} sed -i "s/\(extern int strncasecmp\>\)/\1_disable/g" ${@: -1} sed -i "s/^\(.*strncasecmp_disable\)/static int strncasecmp(const char* str1, const char* str2, size_t len) { char u1, u2; for (; len \!= 0; --len) { u1 = *str1++; u2 = *str2++; if (tolower(u1) \!= tolower(u2)) { return tolower(u1) - tolower(u2); } if (u1 == '\\\0') { return 0; } } return 0; }\n\1/g" ${@: -1} sed -i "s/\(extern int memcmp\>\)/\1_disable/g" ${@: -1} sed -i "s/^\(.*memcmp_disable\)/static int memcmp(const void* mem1, const void* mem2, size_t len) { while (len--) { unsigned char c1 = *(const char*)mem1, c2 = *(const char*)mem2; if (c1 \!= c2) return (c1 > c2) ? 1 : -1; mem1++; mem2++; } return 0; }\n\1/g" ${@: -1} sed -i "s/\(extern int strcmp\>\)/\1_disable/g" ${@: -1} sed -i "s/^\(.*strcmp_disable\)/static int strcmp(const char* str1, const char* str2) { while (1) { unsigned char c1 = *str1, c2 = *str2; if (c1 \!= c2) return (c1 > c2) ? 1 : -1; if (\!c1) return 0; str1++; str2++; } }\n\1/g" ${@: -1} sed -i "s/\(extern int strncmp\>\)/\1_disable/g" ${@: -1} sed -i "s/^\(.*strncmp_disable\)/static int strncmp(const char* str1, const char* str2, size_t len) { while ( *str1 \&\& len \&\& ( *str1 == *str2 ) ) { ++str1; ++str2; --len; } if ( ( len == 0 ) ) { return 0; } else { return ( *(unsigned char *)str1 - *(unsigned char *)str2 ); } }\n\1/g" ${@: -1} fi exit $r