decl
    int store(str file, int start);
    int merge(str out, str in1, str in2);
enddecl

//Storing 512 numbers in file
int store(str file, int start)
{
  decl
    int x, fp, counter, val;
  enddecl

  begin
    //Create and open the file
    x=exposcall("Create", file);
    fp=exposcall("Open", file, 1);

    //Store the numbers into the file
    counter=0;
    while(counter<512) do
      val=4*counter+start;
      x=exposcall("Write", fp, val);
      counter=counter+1;
    endwhile;

    //Close the file
    x=exposcall("Close", fp);

    write("Stored");
    return 0;
  end
}

//Merging files "in1" and "in2" into "out"
int merge(str out, str in1, str in2)
{
  decl
    int fp, fp1, fp2;
    int x, a, b, w1, w2;
  enddecl

  begin
    //Create and open output file
    x=exposcall("Create", out, 1);
    fp=exposcall("Open", out);

    //Open both the input files
    fp1=exposcall("Open", in1);
    fp2=exposcall("Open", in2);

    //Read the first number from both input files
    //and store them in w1 and w2
    a=exposcall("Read", fp1, w1);
    b=exposcall("Read", fp2, w2);

    //Store min(w1,w2) in output file and
    //read the next number until one
    //file reaches end of file
    while(a!=-2 AND b!=-2) do
      if(w1<=w2) then
        x=exposcall("Write", fp, w1);
        a=exposcall("Read", fp1, w1);
      else
        x=exposcall("Write", fp, w2);
        b=exposcall("Read", fp2, w2);
      endif;
    endwhile;

    //If second input file ends,
    //copy the contents from first input file
    //to the output file
    while(a!=-2) do
      x=exposcall("Write", fp, w1);
      a=exposcall("Read", fp1, w1);
    endwhile;

    //If first input file ends,
    //copy the contents from second input file
    //to the output file
    while(b!=-2) do
      x=exposcall("Write", fp, w2);
      b=exposcall("Read", fp2, w2);
    endwhile;

    //Close all the files
    x=exposcall("Close", fp);
    x=exposcall("Close", fp1);
    x=exposcall("Close", fp2);

    //Delete the input files
    x=exposcall("Delete", in1);
    x=exposcall("Delete", in2);

    write("Merged");
    return 0;
  end
}

int main()
{
  decl
    int x, pid1, pid2, fp;
  enddecl

  begin
    pid1=exposcall("Fork");
    if(pid1!=0) then
      pid2=exposcall("Fork");
      if(pid2!=0) then
        //Store the numbers into "temp1.dat"
        x=store("temp1.dat", 1);

        x=exposcall("Wait", pid2);
      else
        //Store the numbers into "temp2.dat"
        x=store("temp2.dat", 2);

        x=exposcall("Exit");
      endif;

      //Merge "temp1.dat" and "temp2.dat" into "tempa.dat"
      x=merge("tempa.dat", "temp1.dat", "temp2.dat");

      x=exposcall("Wait", pid1);
    else
      pid2=exposcall("Fork");
      if(pid2!=0) then
        //Store the numbers into "temp3.dat"
        x=store("temp3.dat", 3);

        x=exposcall("Wait", pid2);
      else
        //Store the numbers into "temp4.dat"
        x=store("temp4.dat", 4);

        x=exposcall("Exit");
      endif;

      //Merge "temp3.dat" and "temp4.dat" into "tempb.dat"
      x=merge("tempb.dat", "temp3.dat", "temp4.dat");

      x=exposcall("Exit");
    endif;

    //Merge "tempa.dat" and "tempb.dat" into "merge.dat"
    //which contains numbers from 1 to 2048 in sorted order
    x=merge("merge.dat", "tempa.dat", "tempb.dat");

    return 1;
  end
}