home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / compress / xfh132.lzh / XFH / src / misc.c < prev    next >
C/C++ Source or Header  |  1993-01-19  |  4KB  |  143 lines

  1. /* misc.c - misc support functions.
  2.    Copyright (C) 1991, 1992, 1993 Kristian Nielsen.
  3.  
  4.    This file is part of XFH, the compressing file system handler.
  5.  
  6.    This program is free software; you can redistribute it and/or modify
  7.    it under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 2 of the License, or
  9.    (at your option) any later version.
  10.  
  11.    This program is distributed in the hope that it will be useful,
  12.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.    GNU General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License
  17.    along with this program; if not, write to the Free Software
  18.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.            */
  19.  
  20. /* $Log:    misc.c,v $
  21.  * Revision 1.2  93/01/14  15:29:27  Kristian
  22.  * Added RCS keywords.
  23.  * 
  24.  */
  25.  
  26. #include "CFS.h"
  27.  
  28. #include <string.h>
  29. #include <dossupport.h>
  30.  
  31. /* Allocate (CSTR) copy of BSTR. Result is modifyable. */
  32. /* (NOTE: 'bstr' is a BPTR, not UBYTE *). */
  33. char *copybstr(BSTR bstr){
  34.    UBYTE buf[256];
  35.    
  36.    if(!bstr) return NULL;
  37.    bstr2c(bstr,buf);
  38.    return copystr(buf);
  39. }
  40.  
  41. /* Allocate copy of C string. */
  42. char *copystr(char *str){
  43.    char *p;
  44.    
  45.   if(!str) return NULL;
  46.   if(!(p=dosalloc(strlen(str)+1))) return NULL;
  47.   strcpy(p,str);
  48.   return p;
  49. }
  50.  
  51. /* Free allocated string. */
  52. void freestr(char *str){
  53.    dosfree(str);
  54. }
  55.  
  56.  
  57. /* "Safe" (bounded-buffer) versions of bstr2cinplace() / cstr2binplace(). */
  58. /* Only does their stuff if string seems a valid BSTR. */
  59. char *safebstr2cinplace(UBYTE *pp, int buflen){
  60.    register int len;
  61.    register UBYTE *p;
  62.    
  63.    len = *pp;
  64.    if(len < buflen){
  65.       for( p=pp; len--; p++ ) p[0] = p[1];
  66.       *p = '\0';
  67.    }
  68.    return (char *)pp;
  69. }
  70.  
  71.  
  72. BSTR safecstr2binplace(char *pp, int buflen){
  73.    register int len;
  74.    register char c,d;
  75.    register char *p;
  76.    
  77.    for(len=0,p=pp; len<buflen && *p; len++,p++);
  78.    if(len<buflen){
  79.       for( c=len,p=pp; len--; p++ ){
  80.          d=*p;
  81.          *p=c;
  82.          c=d;
  83.       }
  84.       *p=c;
  85.    }
  86.    return (BSTR)((ULONG)pp>>2);
  87. }
  88.  
  89.  
  90. /* ank - give the error ERROR_ACTION_NOT_KNOWN. */
  91. LONG ank( glb glob, ... ){
  92.    glob->ioerr = ERROR_ACTION_NOT_KNOWN;
  93.    return 0L;
  94. }
  95.  
  96. /* ank_fail - give the error ERROR_ACTION_NOT_KNOWN, but fail with -1L. */
  97. LONG ank_fail( glb glob, ... ){
  98.    glob->ioerr = ERROR_ACTION_NOT_KNOWN;
  99.    return -1L;
  100. }
  101.  
  102. /* own - give the error ERROR_OBJECT_WRONG_TYPE. */
  103. LONG owt( glb glob, ... ){
  104.    glob->ioerr = ERROR_OBJECT_WRONG_TYPE;
  105.    return 0L;
  106. }
  107.  
  108. /* abs_seek_pos - get absolute seek pos from pos/offset pair. */
  109. LONG abs_seek_pos( LONG currentpos, LONG filelen, LONG pos, LONG offset ){
  110.    
  111.    switch(offset){
  112.       case OFFSET_BEGINNING:
  113.          return pos;
  114.       case OFFSET_CURRENT:
  115.          return currentpos + pos;
  116.       case OFFSET_END:
  117.          return filelen + pos;
  118.       default:
  119.          debug(("Error: abs_seek_pos: Bad offset value for Seek(): %ld\n",offset));
  120.          return -1L;
  121.    }
  122. }
  123.  
  124.  
  125. /* Get size of file from UFS filehandle. Return -1 if error. */
  126. LONG xFileSizeXfh( glb glob, struct FileHandle *xfh ){
  127.    LONG oldpos;
  128.    LONG size;
  129.    
  130.    oldpos = xSeek( glob, xfh, 0, OFFSET_END );
  131.    if( oldpos == -1L ){
  132.       debug(("Error: xFileSizeXfh(): Cannot obtain size.\n"));
  133.       return -1L;
  134.    }
  135.    size = xSeek( glob, xfh, oldpos, OFFSET_BEGINNING );
  136.    if( size == -1L ){
  137.       debug(("Error: xFileSizeXfh(): Cannot obtain size.\n"));
  138.    }
  139.    return size;
  140. }
  141.  
  142. /* End of misc.c */
  143.