Listing 5 A truncate-file routine without gotos

#define STS_OK       0
#define STS_BAD_LEN  -10
#define STS_ERROR    -1

extern int
truncate_file (char * path, long len)
   {
    int infile, tmp_file; /* input file */
    int ret = STS_OK;
    char tf_name [L_tmpnam];
    
    do {
        if (len < 0>
                {
                ret = STS_BAD_LENGTH;
                break;
                }
        if (len == 0)
                {
                ret = truncate_to_zero (path);
                break;
                }
        if ((infile = open (path, 0_RDONLY, 0)) < 0)
        
                {
                ret = STS_ERROR;
                break;
                }
        if (file_len (infile) <= len)
                {
                close (infile);
                ret = STS_SMALL_FILE;
                break;
                }
    /* after all error conditions are checked, we
      finally do some real work here */
      
    tmpnam (tf_name);
    tmp_file = open (tf_name, 0_RDWR | 0_CREAT, 0666);
    ret = copy_file (infile, tmp_file, path, len);
    unlink (tf_name);
    
    } while (FALSE);
  return (ret);
  }
/* End of File */