summaryrefslogtreecommitdiff
path: root/cbtcommon/text_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'cbtcommon/text_util.c')
-rw-r--r--cbtcommon/text_util.c317
1 files changed, 317 insertions, 0 deletions
diff --git a/cbtcommon/text_util.c b/cbtcommon/text_util.c
new file mode 100644
index 0000000..052a94b
--- /dev/null
+++ b/cbtcommon/text_util.c
@@ -0,0 +1,317 @@
+/*
+ * Copyright 2001, 2002, 2003 David Mansfield and Cobite, Inc.
+ * See COPYING file for license information
+ */
+
+/**
+ * Copyright (c) 1998 Cobite, Inc. All Rights Reserved.
+ * @author Karl LaRocca
+ * @created Fri Nov 6 14:33:29 1998
+ * @version $Revision: 1.9 $$Date: 2001/10/25 18:36:11 $
+ */
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "text_util.h"
+#include "rcsid.h"
+
+RCSID("$Id: text_util.c,v 1.9 2001/10/25 18:36:11 adam Exp $");
+
+char*
+chop( char* src )
+{
+ char* p = src + strlen(src) - 1;
+
+ while( p >= src )
+ {
+ if ( *p == '\n' || *p == '\r' )
+ {
+ *p-- = 0;
+ }
+
+ else
+ {
+ break;
+ }
+ }
+
+ return( src );
+}
+
+char*
+digits( char* src )
+{
+ char* start = src;
+ char* check = src;
+
+ while( *check )
+ {
+ if ( isdigit( *check ) )
+ {
+ *start++ = *check;
+ }
+
+ check++;
+ }
+
+ *start = 0;
+
+ return( src );
+}
+
+char*
+lower_case( char* src )
+{
+ char* p = src;
+
+ while( *p )
+ {
+ *p = tolower( *p );
+ p++;
+ }
+
+ return( src );
+}
+
+char*
+reverse( char* src )
+{
+ int i;
+ int len = strlen( src );
+ char tmp;
+
+ for( i = len / 2; --i >= 0; )
+ {
+ tmp = src[ i ];
+ src[ i ] = src[ len - i - 1 ];
+ src[ len - i - 1 ] = tmp;
+ }
+
+ return( src );
+}
+
+char*
+trim( char* src )
+{
+ char *p = src + strlen(src) - 1;
+
+ while( p >= src && isspace(*p) )
+ *p-- = '\0';
+
+ return src;
+}
+
+char*
+upper_case( char* src )
+{
+ char* p = src;
+
+ while( *p )
+ {
+ *p = toupper(*p);
+ p++;
+ }
+
+ return( src );
+}
+
+int
+strrcmp( const char* haystack, const char* needle )
+{
+ int hlen = strlen( haystack );
+ int nlen = strlen( needle );
+ if( hlen < nlen )
+ return( -1 );
+ else
+ return( strcmp( haystack + hlen - nlen, needle ) );
+}
+
+/*
+ * Finding a - anywhere in the string makes it money negative.
+ * all characters other than digits, '-', and '.' are ignored, so:
+ * ab36-.g98 = -36.98
+ * This is fair, I think, if we don't want to reject anything as
+ * improperly formatted.
+ */
+long
+money2cents( const char* money )
+{
+ long retval = 0;
+ int decimal_places = -1;
+ int neg = 0;
+
+ while( *money && decimal_places < 2 )
+ {
+ if ( isdigit( *money ) )
+ {
+ if ( decimal_places >= 0 )
+ decimal_places++;
+
+ retval *= 10;
+ retval += (*money) - '0';
+ }
+
+ else if ( *money == '.' )
+ decimal_places = 0;
+
+ else if ( *money == '-' )
+ neg = 1;
+
+ money++;
+ }
+
+ if ( decimal_places == 1 )
+ retval *= 10;
+
+ else if ( decimal_places <= 0 )
+ retval *= 100;
+
+ return( neg ? -retval : retval );
+}
+
+const char*
+cents2money( long cents )
+{
+ static char buff[ 64 ];
+ int idx = 0;
+ char* d = buff;
+
+ if ( cents == 0 )
+ {
+ strcpy( buff, "0.00" );
+ }
+
+ else if ( cents < 100 )
+ {
+ sprintf( buff, "0.%2.2ld", cents );
+ }
+
+ else
+ {
+ while( cents > 0 )
+ {
+ *d++ = '0' + ( cents % 10 );
+ cents = cents / 10;
+
+ if ( idx == 1 )
+ {
+ *d++ = '.';
+ }
+
+ else if ( cents > 0 && ( idx - 1 ) % 3 == 0 )
+ {
+ *d++ = ',';
+ }
+
+ idx++;
+ }
+
+ *d++ = 0;
+
+ reverse( buff );
+ }
+
+ return( buff );
+}
+
+void trim_zeros_after_decimal( char* src )
+{
+ char * end = src + strlen( src ) - 1;
+
+ while( end != src )
+ {
+ if( *end == '0' )
+ *end = 0;
+ else if( *end == '.' )
+ {
+ *end = 0;
+ break;
+ }
+ else
+ break;
+
+ end--;
+ }
+}
+
+#ifdef linux
+extern void *memfrob(void *, size_t);
+#else
+static void * memfrob(void * mem, size_t len)
+{
+ size_t i;
+ char *c = (char *)mem;
+
+ for (i = 0; i < len; i++)
+ {
+ *c = *c ^ 42;
+ c++;
+ }
+
+ return mem;
+}
+#endif
+
+// simple functions to obfuscate strings in a binary
+char* frobstr( char* src )
+{
+ char* retval = (char*)malloc( strlen(src) * 2 + 1 );
+
+ memfrob( src, strlen( src ) );
+ str2hex( retval, src, 0 );
+ memfrob( src, strlen( src ) );
+
+ return( retval );
+}
+
+char* unfrobstr( char* src )
+{
+ int slen = strlen( src ) / 2;
+ char* retval = (char*)malloc( slen + 1 );
+
+ hex2str( retval, src, 0 );
+ memfrob( retval, slen );
+
+ return( retval );
+}
+
+void str2hex( char* dest, const char* src, int slen )
+{
+ int i;
+ char* p = dest;
+
+ if( slen == 0 )
+ slen = strlen( src );
+
+ for ( i = 0; i < slen; i++ )
+ {
+ sprintf( p, "%02x", src[i] );
+ p += 2;
+ }
+
+ *p = 0;
+}
+
+void hex2str( char* dest, const char* src, int slen )
+{
+ const char* p = src;
+ int i;
+ unsigned int v;
+
+ if( slen == 0 )
+ slen = strlen( src );
+
+ slen /= 2;
+
+ for( i = 0; i < slen; i++ )
+ {
+ sscanf( p, "%02x", &v );
+ dest[i] = (char)v;
+ p += 2;
+ }
+
+ dest[ slen ] = 0;
+}
+