/*

Kelsey Hawkins

Senior (3)

Enloe High

ACSL #3

*/

 

#include <iostream.h>

#include <conio.h>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

#include <dos.h>

 

char *strsub(char *str,int p,int l) {

            char *substr= new char[50];

            for(int i=0;i<l;i++)

                        substr[i]= str[i+p-1];

            substr[l]= 0;

            return substr;

}

 

char *leftShift(char *str,int x) {

            int size= strlen(str);

            str+= x;

            for(int i=size-x;i<size;i++)

                        str[i]= '#';

            str[size]= 0;

            return str;

}

 

char *rightShift(char *str,int x) {

            int size= strlen(str);

            str-= x;

            for(int i=0;i<x;i++)

                        str[i]= '#';

            str[size]= 0;

            return str;

}

 

char *leftCirc1(char *str) {

            int size= strlen(str);

            str[size]= str[0];

            str++;

            str[size]= 0;

            return str;

}

 

char *rightCirc1(char *str) {

            int size= strlen(str);

            str--;

            str[0]= str[size];

            str[size]= 0;

            return str;

}

 

char *leftCirc(char *str,int x) {

            for(int i=0;i<x;i++)

                        str= leftCirc1(str);

            return str;

}

 

char *rightCirc(char *str,int x) {

            for(int i=0;i<x;i++)

                        str= rightCirc1(str);

            return str;

}

 

char *subCirc(char *str,int s,int l,int x,char d) {

            char *substr= strsub(str,s,l);

            if(d=='R')

                        substr= rightCirc(substr,x);

            else

                        substr= leftCirc(substr,x);

            for(int j=0;j<l;j++)

                        str[j+s-1]= substr[j];

            return str;

}

 

char *revStr(char *str,int s,int l) {

            char *substr= strsub(str,s,l);

            substr= strrev(substr);

            for(int j=0;j<l;j++)

                        str[j+s-1]= substr[j];

            return str;

}

 

char *swapStr(char *str,int s,int l,int p) {

            char *substr1= strsub(str,s,l), *substr2= strsub(str,p,l);

            for(int k=0;k<l;k++)

                        str[k+p-1]= substr1[k];

            for(int n=0;n<l;n++)

                        str[n+s-1]= substr2[n];

            return str;

}

 

char *sort(char *str) {

            int size= strlen(str);

            for(int i=0;i<size-1;i++)

                        for(int j=0;j<size-1;j++)

                                    if(str[j]>str[j+1]) {

                                                char temp= str[j];

                                                str[j]= str[j+1];

                                                str[j+1]= temp;

                                    }

            return str;

}

 

char *sortStr(char *str,int s,int l,char m) {

            char *substr= strsub(str,s,l);

            substr= sort(substr);

            if(m=='D')

                        substr= strrev(substr);

            for(int i=0;i<l;i++)

                        str[i+s-1]= substr[i];

            return str;

}

 

char *execFunction(char *str,char *function) {

            if(strstr(function,"LS")!=NULL)

                        return leftShift(str,atoi(strsub(function,4,strlen(function)-3)));

            if(strstr(function,"RS")!=NULL)

                        return rightShift(str,atoi(strsub(function,4,strlen(function)-3)));

            if(strstr(function,"LC")!=NULL)

                        return leftCirc(str,atoi(strsub(function,4,strlen(function)-3)));

            if(strstr(function,"RC")!=NULL)

                        return rightCirc(str,atoi(strsub(function,4,strlen(function)-3)));

            if(strstr(function,"MC")!=NULL)

                        return subCirc(str,function[3]-48,function[4]-48,function[5]-48,function[6]);

            if(strstr(function,"REV")!=NULL)

                        return revStr(str,function[4]-48,function[5]-48);

            if(strstr(function,"SWAP")!=NULL)

                        return swapStr(str,function[5]-48,function[6]-48,function[7]-48);

            if(strstr(function,"SORT")!=NULL)

                        return sortStr(str,function[5]-48,function[6]-48,function[7]);

            return "ERROR";

}

 

void main() {

            clrscr();

            for(int i=0;i<5;i++) {

                        char *inputstr;

                        cout<< "String: ";

                        cin.getline(inputstr,100);

                        char *functions[20];

                        int pos= 0,lastpos= 1,numfunct= 0;

                        while(inputstr[pos]!=0) {

                                    if(inputstr[pos]=='/') {

                                                functions[numfunct]= strsub(inputstr,lastpos,pos-lastpos+1);

                                                numfunct++;

                                                lastpos= pos+2;

                                    }

                                    pos++;

                        }c

                        char *str= strsub(inputstr,lastpos,pos-lastpos+1);

                        for(int i=0;i<numfunct;i++)

                                    str= execFunction(str,functions[i]);

                        cout<< str << endl;

                        getch();

            }

}