#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

FILE *in,*out;
char infile[20],outfile[20];
char temp[20]="sk.$$$";
int SourceFrames,DestFrames;
char buffer[1000];
char t[40],t1[40];

void parse_args(int argc, char *argv[]);
void print_usage(void);
int getline(char *s, FILE *f);
void Getword(char *s, char *t);
void writeword(char *s);
void writenumber(int n);

int main(int argc, char *argv[])
{
 int sf,df,sft,dft,l,f;
 int len=0;
 float ratio;

 parse_args(argc, argv);
 if ((in=fopen(infile,"rt"))==NULL) {
  printf("Cannot open input file %s\n",strupr(infile));
  exit(1);
 }
 if ((out=fopen(temp,"wt"))==NULL) {
  printf("Error opening temp file.\n");
  exit(1);
 }
 getline(buffer,in);
 Getword(buffer,t);
 if (strcmp(t,"STAGE")!=0) {
  printf("Input file is not Imagine Staging Language file.\n");
  fclose(out);
  fclose(in);
  remove(temp);
  exit(1);
 }
 writeword(t);
 fputc('\n',out);
 getline(buffer,in);
 Getword(buffer,t);
 writeword(t);
 Getword(buffer,t);
 SourceFrames=atoi(t);
 writenumber(DestFrames);
 fputc('\n',out);
 ratio=(float)DestFrames/(float)SourceFrames;
 f=(ratio<1) ? 1 : 0;
 while (!feof(in))
 {
 getline(buffer,in);
 while(buffer[0]!='\n') {
  Getword(buffer,t);
  if (strcmp(t,"FRAMES")==0) {
   writeword(t);
   Getword(buffer,t);
   Getword(buffer,t1);
   sf=atoi(t);
   df=atoi(t1);
   l=df-sf;
   if (sf!=1&&df!=1)
   {
    sft=len+1;
    dft=ceil(df*ratio);
    if (dft>DestFrames) dft=DestFrames;
    if (dft==DestFrames)
     len=0;
    else
     len=dft;
   }
   else if(sf==1)
   {
    sft=sf;
    dft=ceil(df*ratio);
    if (dft>DestFrames) dft=DestFrames;
    if (dft==DestFrames)
     len=0;
    else
     len=dft;
   }
   else if(sf==1&&df==1)
   {
    sft=1;
    dft=1;
    if (dft==DestFrames)
     len=0;
    else
     len=1;
   }
   writenumber(sft);
   writenumber(dft);
  }
  else
   writeword(t);
 }
 fputc('\n',out);
 }
 fclose(in);
 fclose(out);
 if (strcmp(infile,outfile)==0)
 {
  remove(infile);
  rename(temp,outfile);
 }
 else
 {
  remove(outfile);
  rename(temp,outfile);
  remove(temp);
 }
 free(t);
}

void parse_args(int argc, char *argv[])
{
 printf("\nScaleKey utility for Imagine using Imaging Staging Language.\n");
 printf("Version 1.0 Copyright (C) 1995 Andrey Zmievskiy. Jan 1995\n\n");

 if (argc<3) {
  print_usage();
 }
 strcpy(infile,"");
 strcpy(outfile,"");
 strcpy(infile,argv[1]);
 if (argv[2][0]=='-') {
  DestFrames=atoi(&argv[2][1]);
  strcpy(outfile,infile);
  return;
 }
 strcpy(outfile,argv[2]);
 if (argv[3][0]=='-') {
  DestFrames=atoi(&argv[3][1]);
  if (DestFrames<2) {
   printf("You cannot use numbers less than 2 for frames.\n");
   exit(1);
  }
 }
 else
  print_usage();
}

void print_usage(void)
{
   printf("Usage:     scalekey <filename> [outputfile] -<number of frames>\n");
   printf("Input filename should be staging file in ASCII format.\n");
   printf("Ex: scalekey stage stage.1 -180\n");
   exit(1);
}

int getline(char *s, FILE *f)
{
 fgets(s,256,f);
}

void Getword(char *s, char *tmp)
{
  int i=0;
  int k;
  int j=0;

  while (s[i]==' ') {
   for(k=0;s[k]!='\n'; k++)
    s[k]=s[k+1];
  }
  while(s[i]!=' '&&s[i]!='\n')
  {
   tmp[j++]=s[i];
   for(k=i;s[k]!='\n';k++)
    s[k]=s[k+1];
  }
  tmp[j]='\0';
}

void writeword(char *s)
{
 fputs(s,out);
 fputc(' ',out);
}

void writenumber(int n)
{
 char s[20];

 itoa(n,s,10);
 fputs(s,out);
 fputc(' ',out);
}