#include <unistd.h>

int isctrl(char ch)
{
  if ((ch >= 0) && (ch <= 31))
    return 1;
  else
    return 0;
}

void update(char *ptr)
{
  *ptr += 17;
}

char crypt(char ch, char *pstate)
{
  char newch;

  if (isctrl(ch)) 
    newch = ch;
  else
    newch = 32 + ((ch - 32) ^ (*pstate & 0x1f));
  update(pstate);
  return newch;
}

int main(void)
{
  char state, ch, newch;
  int numread;

  state = 0;
  do
  {
    numread = read(0, &ch, 1);
    if (numread == 1)
    {
      newch = crypt(ch, &state);
      write(1,&newch,1);
    }
  } while (numread != 0);
}
