
 - fix build problems in user/sh/ with gcc 3.3.
 - add a missing bourne shell feature: ${variable#prefix}

Submitted by Bernardo Innocenti <bernie@develer.com>

Applies to uClinux-dist-20030522 and uclinux-cvs.


diff -u -3 -p -r1.1.1.1 -r1.3
--- user/sh/sh.h	22 Jan 2002 00:31:06 -0000	1.1.1.1
+++ user/sh/sh.h	17 Jun 2003 05:12:50 -0000	1.3
@@ -187,7 +187,7 @@ int (*inbuilt())();
 #endif
 
 #ifdef __STDC__
-#define _PROTOTYPE(x,y) x ## y
+#define _PROTOTYPE(x,y) x y
 #endif
 
 _PROTOTYPE(char *rexecve , (char *c , char **v , char **envp ));
@@ -474,3 +474,5 @@ _PROTOTYPE(void setsig, (int n, void (*f
 _PROTOTYPE(void tempname, (char *tname ));
 _PROTOTYPE(void varput, (char *s, int out ));
 _PROTOTYPE(void yyerror, (char *s ));
+_PROTOTYPE(void *dupstate, (void));
+
diff -u -3 -p -r1.1.1.1 -r1.3
--- user/sh/sh1.c	22 Jan 2002 00:31:06 -0000	1.1.1.1
+++ user/sh/sh1.c	17 Jun 2003 05:12:50 -0000	1.3
@@ -794,7 +794,7 @@ register int sub;
 /* -------- area.c -------- */
 #define	REGSIZE		sizeof(struct region)
 #define GROWBY		256
-#undef	SHRINKBY	64
+/*#define	SHRINKBY	64*/
 #define FREE 32767
 #define BUSY 0
 #define	ALIGN (sizeof(int)-1)
@@ -818,7 +818,7 @@ static void * brktop;
 static void * brkaddr;
 static void * brkstrt;
 
-#define sbrk(X) ({ void * __q = -1; if (brkaddr + (int)(X) < brktop) { __q = brkaddr; brkaddr+=(int)(X); } __q;})
+#define sbrk(X) ({ void * __q = (void *)-1; if (brkaddr + (int)(X) < brktop) { __q = brkaddr; brkaddr+=(int)(X); } __q;})
 
 void
 initarea()
diff -u -3 -p -r1.1.1.1 -r1.2
--- user/sh/sh3.c	22 Jan 2002 00:31:06 -0000	1.1.1.1
+++ user/sh/sh3.c	1 Mar 2002 20:20:32 -0000	1.2
@@ -299,9 +299,9 @@ int *pforked;
 		hwp = *wp;
 		htalking = talking;
 		hintr = intr;
-		hbrklist = brklist;
+		hbrklist = (int)brklist;
 		hexecflg = execflg;
-	
+
 		i = vfork();
 		if (i != 0) {
                 	/* who wrote this crappy non vfork safe shit? */
@@ -311,7 +311,7 @@ int *pforked;
 			*wp = hwp;
 			talking = htalking;
 			intr = hintr;
-			brklist = hbrklist;
+			brklist = (struct brkcon *)hbrklist;
 			execflg = hexecflg;
 
 			*pforked = 0;
diff -u -3 -p -r1.1.1.1 -r1.2
--- user/sh/sh4.c	22 Jan 2002 00:31:06 -0000	1.1.1.1
+++ user/sh/sh4.c	3 Mar 2002 17:11:20 -0000	1.2
@@ -300,7 +300,7 @@ int quoted;
 	*e.linep = 0;
 	if (*s)
 		for (cp = s+1; *cp; cp++)
-			if (any(*cp, "=-+?")) {
+			if (any(*cp, "=-+?#")) {
 				c = *cp;
 				*cp++ = 0;
 				break;
@@ -343,8 +343,17 @@ int quoted;
 			gflg++;
 			break;
 		}
-	} else if (c == '+')
-		dolp = strsave(cp, areanum);
+	} else switch(c)
+	{
+		case '+':
+			dolp = strsave(cp, areanum);
+			break;
+
+		case '#':
+			if (!strncmp(vp->value, cp, strlen(cp)))
+				dolp = strsave(vp->value + strlen(cp), areanum);
+			break;
+	}
 	if (flag['u'] && dolp == null) {
 		prs("unset variable: ");
 		err(s);
