diff --git a/psys/src/newci.c b/psys/src/newci.c
index 6ff961bd275b4951d0b2cd5328e69b0d5cf0210c..36d430e9e1afce479b4458c5890192c67d6da76a 100644
--- a/psys/src/newci.c
+++ b/psys/src/newci.c
@@ -37,189 +37,216 @@ void newci_loadprogram(char *name)
 
 void newci_markprogram(long *id)
 {
-  *id = 0;
-  return;
+	*id = 0;
+	return;
 }
 
 
 void newci_releaseprogram(long *id)
 {
-  *id = 0;
-  return;
+	*id = 0;
+	return;
 }
 
 
 /*  This procedure should be made to do something real.  */
 void newci_inputstring(char *s, int mode, char *possterm, char *term, int echoterm, long *pos)
 {
-  char buf[1024];
-  char *cp;
+	char buf[1024];
+	char *cp;
 
-  fgets(buf, 1024, stdin);
-  if ((cp = (char *) strchr(buf, '\n')))
-    *cp = '\0';
-  if (*buf)
-    strcpy(s, buf);
+	fgets(buf, 1024, stdin);
+	if ((cp = (char *) strchr(buf, '\n')))
+		*cp = '\0';
+	if (*buf)
+		strcpy(s, buf);
 }
 
 
 static void goodfixname(char *name, char *ext, char *home, int force)
 {
-  long i;
-  int hassuffix;
-  char STR1[256];
-  long FORLIM;
-
- /* fs_zapspaces(name); */
-  if (strlen(name) > 2 && name[0] == '*' && name[1] == '*') {
-    strcpy_overlap(name, name + 2);
-    sprintf(name, "%s%s", home, strcpy(STR1, name));
-  }
-  if (force) {
-    i = strlen(name);
-    while (i > 0 && name[i - 1] != '.' && name[i - 1] != '/' && name[i - 1] != ':')
-      i--;
-    if (i > 0 && name[i - 1] == '.')
-      name[i - 1] = '\0';
-  }
-  if (*name == '\0')
-    return;
-  if (name[strlen(name) - 1] == '.') {
-    name[strlen(name) - 1] = '\0';
-    return;
-  }
-  if (name[strlen(name) - 1] == ':')
-    return;
-  hassuffix = false;
-  FORLIM = strlen(name);
-  for (i = 0; i < FORLIM; i++) {
-    switch (name[i]) {
-
-    case '/':
-    case ':':
-      hassuffix = false;
-      break;
-
-    case '.':
-      hassuffix = true;
-      break;
-    }
-  }
-  if (!hassuffix && *ext != '\0')
-    sprintf(name + strlen(name), ".%s", ext);
-}
+	size_t i;
+	int hassuffix;
+	size_t len = strlen(name);
 
+	/* fs_zapspaces(name); */
+	if (len > 2 && name[0] == '*' && name[1] == '*')
+	{
+		char *sz_tmp = malloc(sizeof(char) * len + 1);
+		strcpy(sz_tmp, name);
+
+		/* expand to can add home */
+		len += strlen(home) + 1; /* name + home + '\0' */
+		name = realloc(name, sizeof(char) * len);
+
+		/* Add home value before the name value */ 
+		sprintf(name, "%s%s", home, sz_tmp);
+		free(sz_tmp);
+	}
+
+	if (force)
+	{
+		i = strlen(name);
+		while (i > 0 && name[i - 1] != '.' && name[i - 1] != '/' && name[i - 1] != ':')
+			i--;
+		if (i > 0 && name[i - 1] == '.')
+			name[i - 1] = '\0';
+	}
+
+	if (*name == '\0')
+		return;
+
+	i = strlen(name) - 1;
+	if (name[i] == '.')
+	{
+		name[i] = '\0';
+		return;
+	}
+
+	if (name[i] == ':')
+		return;
+	
+	hassuffix = false;
+	
+	len = strlen(name);
+	for (i = 0; i < len; ++i)
+	{
+		switch (name[i])
+		{
+
+			case '/':
+			case ':':
+			hassuffix = false;
+			break;
+
+			case '.':
+			hassuffix = true;
+			break;
+		}
+	}
+
+	if (!hassuffix && *ext != '\0')
+	{
+		name = realloc(name, sizeof(char) * (len + strlen(ext) + 2)); /* name + '.' + ext + '\0' */
+		sprintf(name + strlen(name), ".%s", ext);
+	}
+}
 
 void newci_fixfname(char * s, char * ext, char * home)
 {
-  goodfixname(s, ext, home, 0);
+	goodfixname(s, ext, home, 0);
 }
 
 void newci_forcefname(char *s, char *ext, char *home)
 {
-  goodfixname(s, ext, home, 1);
+	goodfixname(s, ext, home, 1);
 }
 
-
 void newci_fullshellescape(char *args, char *opts)
 {
-  while (isspace(*args) || *args == '!') args++;
-  if (fork())
-    wait(NULL);
-  else
-    if (*args)
-      execlp("/bin/csh", "xterm", "-e", args, (char *)0);
-    else
-      execlp("/bin/csh", "xterm", (char *)0);
+	while (isspace(*args) || *args == '!')
+		args++;
+
+	if (fork())
+		wait(NULL);
+	else
+		if (*args)
+			execlp("/bin/csh", "xterm", "-e", args, (char *)0);
+		else
+			execlp("/bin/csh", "xterm", (char *)0);
 }
 
 void newci_shellescape(char *args)
 {
-  newci_fullshellescape(args, "");
+	newci_fullshellescape(args, "");
 }
 
 void newci_fulleditescape(char *fn, char *opts, long ln, long pos)
 {
-  if (fork())
-    wait(NULL);
-  else
-    execlp("emacs", "emacs", fn, (char *)0);
+	if (fork())
+		wait(NULL);
+	else
+		execlp("emacs", "emacs", fn, (char *)0);
 }
 
 
 void newci_eatargument()
 {
-  int i;
+	int i;
 
-  for (i = 2; i < P_argc; P_argv[i-1] = P_argv[i], i++)
-    ;
-  P_argc--;
+	/* move the argmuments to the left*/
+	for (i = 2; i < P_argc; ++i)
+		P_argv[i-1] = P_argv[i];
+	P_argc--;
 }
 
-void newci_parseswitch(tab, size, bad)
-newci_parsetab tab;
-long size;
-char *bad;
+void newci_parseswitch(newci_parsetab tab, long size, char *bad)
 {
-  int i, j, found, pos = 1;
+	int i, j, found, pos = 1;
 
-  for (i = 0; i < size; tab[i++].used = 0)
-    ;
-  *bad = '\000';
+	for (i = 0; i < size; ++i)
+		tab[i].used = 0;
+	*bad = '\000';
   
-  while ((P_argc > 1) && (P_argv[1][0] == '-')) {
-    found = 0;
-    for (i = 0; (i < size) && (! found); i++) {
-      for (j = 0; (tab[i].switch_[j] != '\0') && (! found); j++)
-	if (tab[i].switch_[j] == P_argv[1][1]) 
-	  found = 1;
-      if (found) break;
-    }
-    if (! found) {
-      bad[strlen(bad)+1] = '\0';
-      bad[strlen(bad)] = P_argv[1][1];
-    } else {
-      tab[i].used = pos++;
-      switch (toupper(tab[i].kind)) {
-      case 'B':
-	break;
-      case 'I':
-	tab[i].UU.i = atol(P_argv[1]+2);
-	break;
-      case 'R':
-	sscanf(P_argv[1]+2, "%lf", &tab[i].UU.r);
-	break;
-      case 'S':
-	tab[i].UU.s = P_argv[1]+2;
-	break;
-      case 'M':
-	if (P_argc > 2 && !P_argv[1][2]) {
-	  tab[i].UU.s = P_argv[2];
-	  newci_eatargument();
-	} else {
-	  tab[i].UU.s = P_argv[1]+2;
+	while ((P_argc > 1) && (P_argv[1][0] == '-'))
+	{
+		found = 0;
+		for (i = 0; (i < size) && (!found); i++)
+		{
+    		for (j = 0; (tab[i].switch_[j] != '\0') && (!found); j++)
+				if (tab[i].switch_[j] == P_argv[1][1]) 
+					found = 1;
+			if (found) break;
+		}
+		if (!found)
+		{
+    		bad[strlen(bad) + 1] = '\0';
+    		bad[strlen(bad)] = P_argv[1][1];
+		}
+		else
+		{
+			tab[i].used = pos++;
+			switch (toupper(tab[i].kind))
+			{
+				case 'B':
+				break;
+				case 'I':
+				tab[i].UU.i = atol(P_argv[1]+2);
+				break;
+				case 'R':
+				sscanf(P_argv[1]+2, "%lf", &tab[i].UU.r);
+				break;
+				case 'S':
+				tab[i].UU.s = P_argv[1]+2;
+				break;
+				case 'M':
+				if (P_argc > 2 && !P_argv[1][2])
+				{
+					tab[i].UU.s = P_argv[2];
+					newci_eatargument();
+				}
+				else
+				{
+					tab[i].UU.s = P_argv[1] + 2;
+				}
+				break;
+			}
+		}
+		newci_eatargument();
 	}
-	break;
-      }
-    }
-    newci_eatargument();
-  }
 }
 
-
 long timers_sysclock()
 {
 	return sysclock();
 }
 
-
 long newci_fullseconds()
 {
-  return(time(NULL));
+	return(time(NULL));
 }
 
-
 void newci_nullrecover()
 {
-  _Escape(P_escapecode);
+	_Escape(P_escapecode);
 }