/* ----------------------------------	*/

        public static void CloseFile(FILE cpf)
        {
            if (cpf.bufS != null)
            {
                cpf.bufS.Close();
            }
        }
        /* ----------------------------------	*/

        public static void WriteByte(FILE cpf, int b)
        {
            if (cpf.bufS != null)
            {
                cpf.bufS.WriteByte((byte)b);
            }
            else
            {
                throw new System.Exception("File not open for reading");
            }
        }
        /* ----------------------------------	*/

        public static int readByte(FILE cpf)
        {
            if (cpf.bufS != null)
            {
                return((int)cpf.bufS.ReadByte());
            }
            else
            {
                throw new System.Exception("File not open for reading");
            }
        }
 private static FILE openRead(System.String name)
 {
     // Opens buffered filestream for reading.
     try {
         FILE cpf = new FILE();
         cpf.path = name;
         System.IO.FileStream fStr = System.IO.File.OpenRead(name);
         cpf.bufS = new System.IO.BufferedStream(fStr);
         return(cpf);
     } catch {
         return(null);
     }
 }
        /* ----------------------------------	*/

        public static void WriteNBytes(FILE cpf,
                                       byte[] buff,
                                       int want)
        {
            if (cpf.bufS != null)
            {
                cpf.bufS.Write(buff, 0, want);
            }
            else
            {
                throw new System.Exception("File not open for reading");
            }
        }
        /* ----------------------------------	*/

        public static int  readNBytes(FILE cpf,
                                      byte[] buff,
                                      int want)
        {
            if (cpf.bufS != null)
            {
                return(cpf.bufS.Read(buff, 0, want));
            }
            else
            {
                throw new System.Exception("File not open for reading");
            }
        }
        /* ----------------------------------	*/

        public static FILE createFile(char[] arr)
        {
            FILE cpf = new FILE();

            try {
                System.String        name = mkStr(arr);
                System.IO.FileStream fStr = System.IO.File.Create(name);
                cpf.path = name;
                cpf.bufS = new System.IO.BufferedStream(fStr);
                return(cpf);
            } catch {
                return(null);
            }
        }
        /* ----------------------------------	*/

        public static FILE findOnPath(
            char[] pathName,
            char[] fileName)
        {
            //
            // Use mkStr, to trim space from end of char arrray.
            //
            System.String pName = mkStr(pathName);
            System.String fName = mkStr(fileName);
            System.String nName = "";

            System.String nextDir;
            System.String thisPath = System.Environment.GetEnvironmentVariable(pName);
//
//  System.Console.WriteLine(pName);
//  System.Console.WriteLine(thisPath);
//
            FILE cpf          = new FILE();
            bool found        = false;
            bool pathFinished = false;
            int  length       = thisPath.Length;
            int  nextLength;
            int  nextPathStart;
            int  nextPathEnd = -1;

            while (!found && !pathFinished)
            {
                nextPathStart = nextPathEnd + 1;
                nextPathEnd   = thisPath.IndexOf(GPFiles.GPFiles.pathSep, nextPathStart);
                if (nextPathEnd < 0)
                {
                    nextPathEnd = length;
                }
                nextLength   = nextPathEnd - nextPathStart;
                nextDir      = thisPath.Substring(nextPathStart, nextLength);
                nName        = nextDir + GPFiles.GPFiles.fileSep + fName;
                found        = System.IO.File.Exists(nName);
                pathFinished = nextPathEnd >= length;
            }
            if (found)
            {
                return(openRead(nName));
            }
            else
            {
                return(null);
            }
        }
        /* ----------------------------------	*/

        public static FILE createPath(char[] fileName)
        {
            System.String fName = mkStr(fileName);
            try {
                int ix = fName.LastIndexOf(GPFiles.GPFiles.fileSep);
                if (ix > 0)
                {
                    System.String path = fName.Substring(0, ix);
                    // Check if exists first?
                    if (!System.IO.Directory.Exists(path))
                    {
                        System.IO.DirectoryInfo junk = System.IO.Directory.CreateDirectory(path);
                    }
                }
                FILE cpf = new FILE();
                cpf.path = fName;
                System.IO.FileStream fStr = System.IO.File.Create(fName);
                cpf.bufS = new System.IO.BufferedStream(fStr);
                return(cpf);
            } catch {
                return(null);
            }
        }
        /* ----------------------------------	*/

        public static int length(FILE cpf)
        {
            return((int)cpf.bufS.Length);
        }
        /* ----------------------------------	*/

        public static bool EOF(FILE cpf)
        {
            return(cpf.bufS.Position >= cpf.bufS.Length);
        }
        /* ----------------------------------	*/

        public static char[] getFullPathName(FILE cpf)
        {
            return(cpf.path.ToCharArray()); // not really correct!
        }