String Processing

(Solution to ACS Practice Problem E3)

/****************************************************
 *   ACS Computing Competition July 1995.
 *  
 *   C solution to
 *   PracticeProblem E3 : String Processing 
 *  
 *   Brendan Humphreys.
 *   brendan@cssa.anu.edu.au
 *  
 *  
 */


#include <stdio.h>
#include <stdlib.h>

#define GOSTART  '0'   /* command char macros */
#define GOEOS    '$'
#define DEL      'x'
#define SWAP     's'
#define INSERT   'i'
#define UPPER    'u'
#define LEFT     '-'
#define RIGHT    '+'

#define EOL      '\n'
#define EOS      '\0'
#define TERMCH   "#"


char string[100];  /* the input line */
char temp[100];    /* temp storage for insert operation */


void main()
{
 int ch; 
 int done;                 
 char *cursor, *start, *end;  /* pointers to parts of the input string */

 while(1)
 {
     
     gets(string); /* get the input string from stdin */

     if (strcmp(string,TERMCH) == 0) /* catch the terminating condition */
	 exit(0);

     cursor = start = string;           
     end = string + strlen(string) - 1; /* end points to last char in string */
     done = 0; 

     while (!done) 
     {  
	 ch = getchar();  /* get next command */
	 switch (ch)
	 { 
	   case GOSTART:
	     cursor = start;   /* cursor now points to start of string */  
	     break;	 
	     
	   case GOEOS:
	     cursor = end+1;    /* cursor now points to EOS */
	     break;
	     
	   case DEL:
	     if (cursor <= end)
	     {
		 *cursor = EOS;           /* replace char with EOS */  
		 strcat(string,(char *)(cursor+1)); /* concatenate strings */
	         end--;
	     }
	     break;
	     
	   case SWAP:
	     if (cursor < end)    /* this op not allowed if near EOS */
	     {
		 ch = *cursor;           /* get char at cursor */
		 *cursor = *(cursor+1);  /* copy near right char */
		 *(cursor+1) = ch;       /* put char in its place */
	     }
	     break;
	     
	   case INSERT:
	     ch = getchar();       /* get char to insert */
	     strcpy(temp,cursor);  /* save second half of string */
	     *cursor = ch;         /* add the char */
             *(cursor+1) = EOS;    /* terminate the first half */
	     strcat(string,temp);  /* join the halves */
             cursor++;             /* move cursor to right one place */
	     end++;
	     break;
	     
	   case UPPER:
	     *cursor = toupper(*cursor); /* convert to upper case */
	     if (cursor <= end)
	       cursor++;                /* move cursor to right one place */
	     break;	 
	    
	   case LEFT: 
	     if (cursor > start) /* don't allow if at start of string */   
		 cursor--;       /* move cursor one place left */
	     break; 
            
	   case RIGHT:
	     if (cursor <= end)  /* don't allow if at end of string */
		 cursor++;      /* move cursor one place right */
	     break;
	     
	   case EOL:              
	     done = 1;    /* all done... */
	     break;	 
	    
	   default:
	     printf("Unknown command '%c' \n",ch);
	     exit(1);
	 }
     }
     printf("%s\n",string);   
 }
}









ACS Australian Programming Competition, July 1995.