/*
	Eng2Alt.h	Recodes Russian
			(Congress Library English transliterated)
			to Russian (in "Alternativnaja kodirovka").
*/

static char copyright[] =
" Written by Alexey Roytman \n"
" 1999 May 21 \n"
" Version 2.1 \n";



#include "Eng2Alt.h"

#ifndef MEMMOVE
# if (defined __linux__) || (defined __irix__)
#  define MEMMOVE memmove
# else
#  define MEMMOVE _memmove
# endif
#endif

#if (MEMMOVE == _memmove)
#include <stdlib.h>
void * _memmove(void *dest, const void *src, size_t n)
{
	void * p = malloc(n);
	if (p == (void*)0)
	{
		fprintf(stderr,"_memmove(): malloc() failed.\n");
		exit(1);
	}
	memcpy(p,src,n);
	memcpy(dest,p,n);
	free(p);
	return dest;
}/*_memmove*/
#endif	/*if (MEMMOVE == _memmove)*/

int EngCase (BYTE ch)
{
  if (islower(ch))	return(LOWERCASE);
  else if (isupper(ch))	return(UPPERCASE);
  return(NEUTRAL);
}

BYTE RusAlt2upper (BYTE ch)
{
  if	  (ch<=(BYTE)'Ÿ')	return(ch);
  else if (ch<=(BYTE)'¯')	return(ch-(BYTE)' ');
  else if ((ch>=(BYTE)'à')&&(ch<=(BYTE)'ï'))
	return(ch-(BYTE)'P');
  else if (ch==(BYTE)'ñ')	return((BYTE)'ð');
  return(ch);
}


char * eng2gostalt (char * s)		/* Changes original string too.	*/
{
  char * temp = s;
  int LetterCase, i=0;
  int found;				/* 1=yes, 0=no	*/

  while ((temp-s) < strlen(s))
  {
    for (found=0,i=0;  ((TranslateTable[i].English != NULL)&&
			(TranslateTable[i].Russian != NULL)) ; i++)
    {
      size_t len_eng = strlen(TranslateTable[i].English);
      if (STRNCMPI(temp, TranslateTable[i].English,len_eng) == 0)
      {
        found = 1;
        if (len_eng > 1 &&
            ! isalpha(TranslateTable[i].English[0]))
            LetterCase = EngCase(*(temp+1));
        else
	    LetterCase = EngCase(*temp);

	/* Replace English -> Russian.		*/
	/* AREAS MAY OVERLAP -- use memmove()	*/
	MEMMOVE (temp+strlen(TranslateTable[i].Russian),
		 temp+len_eng,
		 strlen(s) );
	memcpy (temp, TranslateTable[i].Russian,
		strlen(TranslateTable[i].Russian));

	/* Set case properly.			*/
        if (LetterCase == UPPERCASE)
	  *temp = RusAlt2upper (*temp);

	temp += strlen(TranslateTable[i].Russian)	/*+1*/;

	break;
      }/*if equal*/
    }/*for*/
    if (!found)
      temp++;

  }/*while*/

  return s;
}



BYTE s[1024];

int main (void)
{
  while ( fgets((char*)s,sizeof(s)-1,stdin) != NULL)
    fputs(eng2gostalt((char*)s),stdout);
  return 0;		/* For pipes to work OK.	*/
}


/*<EOF>*/

