summaryrefslogtreecommitdiff
path: root/dmake/dmstring.c
diff options
context:
space:
mode:
Diffstat (limited to 'dmake/dmstring.c')
-rw-r--r--dmake/dmstring.c300
1 files changed, 300 insertions, 0 deletions
diff --git a/dmake/dmstring.c b/dmake/dmstring.c
new file mode 100644
index 000000000000..53068a9deba0
--- /dev/null
+++ b/dmake/dmstring.c
@@ -0,0 +1,300 @@
+/* RCS $Id: dmstring.c,v 1.2 2007-01-18 09:29:40 vg Exp $
+--
+-- SYNOPSIS
+-- String handling code
+--
+-- DESCRIPTION
+-- Routines to handle string manipulation. This code is not specific
+-- to dmake and has/and will be used in other programs. The string
+-- "" is considered the NULL string, if NIL(char) is received instead
+-- undefined results may occurr. (In reality NIL(char) is checked for
+-- but in general it is not safe to assume NIL(char) == NULL)
+--
+-- AUTHOR
+-- Dennis Vadura, dvadura@dmake.wticorp.com
+--
+-- WWW
+-- http://dmake.wticorp.com/
+--
+-- COPYRIGHT
+-- Copyright (c) 1996,1997 by WTI Corp. All rights reserved.
+--
+-- This program is NOT free software; you can redistribute it and/or
+-- modify it under the terms of the Software License Agreement Provided
+-- in the file <distribution-root>/readme/license.txt.
+--
+-- LOG
+-- Use cvs log to obtain detailed change logs.
+*/
+
+#include "extern.h"
+
+PUBLIC char *
+DmStrJoin( src, data, n, fr )/*
+===============================
+ Join data to src according to value of n.
+
+ n = -1 - return strcat( src, data )
+ n >= 0 - return strncat( src, data, n )
+
+ FREE original src if fr == TRUE, else leave it alone */
+
+char *src;
+char *data;
+int n;
+int fr;
+{
+ char *t;
+ int l;
+ int flag = FALSE;
+
+ DB_ENTER( "DmStrJoin" );
+
+ if( src == NIL(char) ) { src = ""; flag = TRUE; }
+ if( data == NIL(char) ) data = "";
+ DB_PRINT( "str", ("Joining [%s] [%s] %d", src, data, n) );
+
+ if( n == -1 ) n = strlen( data );
+
+ l = strlen( src ) + n + 1;
+ if( (t = MALLOC( l, char )) == NIL(char) ) No_ram();
+
+ strcpy( t, src );
+ if (n) strncat( t, data, n );
+ t[ l-1 ] = '\0';
+
+ if( !flag && fr ) FREE( src );
+
+ DB_PRINT( "str", ("Result [%s]", t) );
+ DB_RETURN( t );
+}
+
+
+
+
+PUBLIC char *
+DmStrAdd( src, data, fr )/*
+===========================
+ append data to src with space in between if src is not NIL(char) or ""
+ and free both src and data if fr == TRUE, otherwise leave them be */
+
+char *src;
+char *data;
+int fr;
+{
+ char *t;
+ int l;
+ int sflag;
+ int dflag;
+
+ DB_ENTER( "DmStrAdd" );
+
+ sflag = dflag = fr;
+
+ if( src == NIL(char) ) { src = ""; sflag = FALSE; }
+ if( data == NIL(char) ) { data = ""; dflag = FALSE; }
+ DB_PRINT( "str", ("Adding [%s] [%s] %d", src, data, fr) );
+
+ l = strlen(src) + strlen(data) + 1;
+ if( *src ) l++;
+
+ if( (t = MALLOC( l, char )) == NIL(char) ) No_ram();
+
+ strcpy( t, src );
+
+ if( *data )
+ {
+ if( *src ) strcat( t, " " );
+ strcat( t, data );
+ }
+
+ if( sflag ) FREE( src );
+ if( dflag ) FREE( data );
+
+ DB_PRINT( "str", ("Result [%s]", t) );
+ DB_RETURN( t );
+}
+
+
+
+PUBLIC char *
+DmStrApp( src1, src2 )/*
+========================
+ Append two strings together, and return the result with a space between
+ the two strings. FREE the first string if it is not NIL and always
+ leave the second string be. */
+char *src1;
+char *src2;
+{
+ src2 = DmStrAdd( src1, src2, FALSE );
+ if( src1 != NIL(char) ) FREE( src1 );
+ return( src2 );
+}
+
+
+PUBLIC char *
+DmStrDup( str )/*
+================= Duplicate the contents of a string, by using malloc */
+char *str;
+{
+ char *t;
+
+ if( str == NIL(char) ) return( NIL(char) );
+
+ if( (t = MALLOC( strlen( str )+1, char )) == NIL(char) ) No_ram();
+ strcpy( t, str );
+
+ return( t );
+}
+
+
+
+PUBLIC char *
+DmStrDup2( str )/*
+==================
+ This function is used solely to properly quote command line arguments when
+ they are reinserted int MAKEMACROS so that they can be used further in
+ a processing line. */
+char *str;
+{
+ char *t;
+ size_t size;
+ size_t alloced;
+ char *tmp;
+ char *dest;
+ int seen_equal = 0;
+
+ if(str == NIL(char)) return(NIL(char));
+ size = strlen(str) + 1;
+ alloced = size + 2; /* for two quotes */
+
+ for(tmp = str; *tmp; tmp++)
+ if(*tmp == '"')
+ alloced++;
+
+ if((t = MALLOC(alloced, char)) == NIL(char)) No_ram();
+
+ for(tmp = str, dest = t; *tmp; tmp++, dest++) {
+ if(*tmp == '=' && !seen_equal) {
+ seen_equal = 1;
+ *dest++ = *tmp;
+ *dest = '"';
+ continue;
+ }
+ if(*tmp == '"')
+ *dest++ = '\\';
+ *dest = *tmp;
+ }
+
+ if(!seen_equal)
+ Fatal("DmStrDup2 invoked without argument of form x=y\n");
+
+ *dest++ = '"';
+ *dest = 0;
+
+ return t;
+}
+
+
+
+PUBLIC char *
+DmStrPbrk( s1, s2 )/*
+====================
+ find first occurrence of char in s2 in string s1.
+ Returns a pointer to the first occurrence. NOTE '\0' is considered part
+ of s2 and a pointer to it is returned if no other chars match. */
+
+char *s1;
+char *s2;
+{
+ register char *t;
+
+ if( s1 == NIL(char) || s2 == NIL(char) ) return( "" );
+
+ for( t=s1; *t && (strchr( s2, *t ) == NIL(char)); t++ );
+ return( t );
+}
+
+
+
+
+PUBLIC char *
+DmStrSpn( s1, s2 )/*
+====================
+ return pointer to first char in s1 that does not belong to s2.
+ Returns the pointer if match found, else returns pointer to null char
+ in s1. (ie. "" ) */
+
+char *s1;
+char *s2;
+{
+ register char *t;
+
+ if( s1 == NIL(char) || s2 == NIL(char) ) return( "" );
+
+ for( t=s1; *t && (strchr( s2, *t ) != NIL(char)); t++ );
+ return( t );
+}
+
+
+
+
+PUBLIC char *
+DmStrStr( s1, s2 )/*
+==================== find first occurrence in s1 of s2 */
+char *s1;
+char *s2;
+{
+ register char *s;
+ register char *p;
+ register char *r;
+
+ if( s1 != NIL(char) && s2 != NIL(char) )
+ for( s=s1; *s; s++ )
+ if( *s == *s2 )
+ {
+ for( r=s+1, p = s2+1; *p && (*r == *p); r++, p++ );
+ if( !*p ) return( s );
+ }
+
+ return( NIL(char) );
+}
+
+
+
+PUBLIC char *
+DmSubStr( s, e )/*
+==================
+ Return the string between the two pointers s and e, not including the
+ char that e points to. NOTE: This routine assumes that s and e point
+ into the same string. */
+
+char *s;
+char *e;
+{
+ char save;
+ int len = e-s;
+
+ if( len < 0 || len > strlen(s) )
+ Fatal( "Internal Error: SubStr fails consistency test" );
+
+ save = *e;
+ *e = '\0';
+ s = DmStrDup( s );
+ *e = save;
+
+ return( s );
+}
+
+
+/* Provide "missing" string function. */
+#ifndef HAVE_STRLWR
+char *
+strlwr(char *s)
+{
+ char *p;
+ for(p=s; *p; p++ )
+ *p = tolower(*p);
+ return s;
+}
+#endif