sourcepawn/compiler/scmemfil.c
author David Anderson <dvander@alliedmods.net>
Sun Nov 25 18:50:13 2007 +0000 (2007-11-25)
changeset 1725 ea875bcbc286
parent 365 d830b2b0414f
permissions -rw-r--r--
small clarification to param2 in MenuAction_End
dvander@27
     1
/*  Pawn compiler
dvander@27
     2
 *
dvander@27
     3
 *  Routines to maintain a "text file" in memory.
dvander@27
     4
 *
dvander@27
     5
 *  Copyright (c) ITB CompuPhase, 2003-2006
dvander@27
     6
 *
dvander@27
     7
 *  This software is provided 'as-is', without any express or implied warranty.
dvander@27
     8
 *  In no event will the authors be held liable for any damages arising from the
dvander@27
     9
 *  use of this software.
dvander@27
    10
 *
dvander@27
    11
 *  Permission is granted to anyone to use this software for any purpose,
dvander@27
    12
 *  including commercial applications, and to alter it and redistribute it
dvander@27
    13
 *  freely, subject to the following restrictions:
dvander@27
    14
 *
dvander@27
    15
 *  1. The origin of this software must not be misrepresented; you must not
dvander@27
    16
 *     claim that you wrote the original software. If you use this software in
dvander@27
    17
 *     a product, an acknowledgment in the product documentation would be
dvander@27
    18
 *     appreciated but is not required.
dvander@27
    19
 *
dvander@27
    20
 *  2. Altered source versions must be plainly marked as such, and must not be
dvander@27
    21
 *     misrepresented as being the original software.
dvander@27
    22
 *
dvander@27
    23
 *  3. This notice may not be removed or altered from any source distribution.
dvander@27
    24
 *
dvander@365
    25
 *  Version: $Id$
dvander@27
    26
 */
dvander@27
    27
dvander@27
    28
#include <assert.h>
dvander@27
    29
#include <stdio.h>
dvander@27
    30
#include <stdlib.h>
dvander@27
    31
#include <string.h>
dvander@27
    32
#include "memfile.h"
dvander@27
    33
faluco@62
    34
#if defined FORTIFY
faluco@62
    35
  #include <alloc/fortify.h>
faluco@62
    36
#endif
dvander@27
    37
typedef memfile_t MEMFILE;
dvander@27
    38
#define tMEMFILE  1
dvander@27
    39
dvander@27
    40
#include "sc.h"
dvander@27
    41
faluco@62
    42
MEMFILE *mfcreate(const char *filename)
dvander@27
    43
{
dvander@27
    44
  return memfile_creat(filename, 4096);
dvander@27
    45
}
dvander@27
    46
dvander@27
    47
void mfclose(MEMFILE *mf)
dvander@27
    48
{
dvander@27
    49
  memfile_destroy(mf);
dvander@27
    50
}
dvander@27
    51
dvander@27
    52
int mfdump(MEMFILE *mf)
dvander@27
    53
{
dvander@27
    54
  FILE *fp;
dvander@27
    55
  int okay;
dvander@27
    56
dvander@27
    57
  assert(mf!=NULL);
dvander@27
    58
  /* create the file */
dvander@27
    59
  fp=fopen(mf->name, "wb");
dvander@27
    60
  if (fp==NULL)
dvander@27
    61
    return 0;
dvander@27
    62
dvander@27
    63
  okay=1;
dvander@27
    64
  okay = okay & (fwrite(mf->base, mf->usedoffs, 1, fp)==(size_t)mf->usedoffs);
dvander@27
    65
  
dvander@27
    66
  fclose(fp);
dvander@27
    67
  return okay;
dvander@27
    68
}
dvander@27
    69
faluco@62
    70
long mflength(const MEMFILE *mf)
dvander@27
    71
{
dvander@27
    72
  return mf->usedoffs;
dvander@27
    73
}
dvander@27
    74
dvander@27
    75
long mfseek(MEMFILE *mf,long offset,int whence)
dvander@27
    76
{
dvander@27
    77
  long length;
dvander@27
    78
dvander@27
    79
  assert(mf!=NULL);
dvander@27
    80
  if (mf->usedoffs == 0)
dvander@27
    81
    return 0L;          /* early exit: not a single byte in the file */
dvander@27
    82
dvander@27
    83
  /* find the size of the memory file */
dvander@27
    84
  length=mflength(mf);
dvander@27
    85
dvander@27
    86
  /* convert the offset to an absolute position */
dvander@27
    87
  switch (whence) {
dvander@27
    88
  case SEEK_SET:
dvander@27
    89
    break;
dvander@27
    90
  case SEEK_CUR:
dvander@27
    91
    offset+=mf->offs;
dvander@27
    92
    break;
dvander@27
    93
  case SEEK_END:
dvander@27
    94
    assert(offset<=0);
dvander@27
    95
    offset+=length;
dvander@27
    96
    break;
dvander@27
    97
  } /* switch */
dvander@27
    98
dvander@27
    99
  /* clamp to the file length limit */
dvander@27
   100
  if (offset<0)
dvander@27
   101
    offset=0;
dvander@27
   102
  else if (offset>length)
dvander@27
   103
    offset=length;
dvander@27
   104
dvander@27
   105
  /* set new position and return it */
dvander@27
   106
  memfile_seek(mf, offset);
dvander@27
   107
dvander@27
   108
  return offset;
dvander@27
   109
}
dvander@27
   110
faluco@62
   111
unsigned int mfwrite(MEMFILE *mf,const unsigned char *buffer,unsigned int size)
dvander@27
   112
{
dvander@27
   113
  return (memfile_write(mf, buffer, size) ? size : 0);
dvander@27
   114
}
dvander@27
   115
dvander@27
   116
unsigned int mfread(MEMFILE *mf,unsigned char *buffer,unsigned int size)
dvander@27
   117
{
dvander@27
   118
  return memfile_read(mf, buffer, size);
dvander@27
   119
}
dvander@27
   120
dvander@27
   121
char *mfgets(MEMFILE *mf,char *string,unsigned int size)
dvander@27
   122
{
dvander@27
   123
  char *ptr;
dvander@27
   124
  unsigned int read;
dvander@27
   125
  long seek;
dvander@27
   126
dvander@27
   127
  assert(mf!=NULL);
dvander@27
   128
dvander@27
   129
  read=mfread(mf,(unsigned char *)string,size);
dvander@27
   130
  if (read==0)
dvander@27
   131
    return NULL;
dvander@27
   132
  seek=0L;
dvander@27
   133
dvander@27
   134
  /* make sure that the string is zero-terminated */
dvander@27
   135
  assert(read<=size);
dvander@27
   136
  if (read<size) {
dvander@27
   137
    string[read]='\0';
dvander@27
   138
  } else {
dvander@27
   139
    string[size-1]='\0';
dvander@27
   140
    seek=-1;            /* undo reading the character that gets overwritten */
dvander@27
   141
  } /* if */
dvander@27
   142
dvander@27
   143
  /* find the first '\n' */
dvander@27
   144
  ptr=strchr(string,'\n');
dvander@27
   145
  if (ptr!=NULL) {
dvander@27
   146
    *(ptr+1)='\0';
dvander@27
   147
    seek=(long)(ptr-string)+1-(long)read;
dvander@27
   148
  } /* if */
dvander@27
   149
dvander@27
   150
  /* undo over-read */
dvander@27
   151
  assert(seek<=0);      /* should seek backward only */
dvander@27
   152
  if (seek!=0)
dvander@27
   153
    mfseek(mf,seek,SEEK_CUR);
dvander@27
   154
dvander@27
   155
  return string;
dvander@27
   156
}
dvander@27
   157
faluco@62
   158
int mfputs(MEMFILE *mf,const char *string)
dvander@27
   159
{
dvander@27
   160
  unsigned int written,length;
dvander@27
   161
dvander@27
   162
  assert(mf!=NULL);
dvander@27
   163
dvander@27
   164
  length=strlen(string);
dvander@27
   165
  written=mfwrite(mf,(unsigned char *)string,length);
dvander@27
   166
  return written==length;
dvander@27
   167
}