sourcepawn/compiler/libpawnc.c
author David Anderson <dvander@alliedmods.net>
Thu Jan 25 20:08:00 2007 +0000 (2007-01-25)
changeset 353 492a8d0d5f59
parent 62 7c24f0801ae1
child 365 d830b2b0414f
permissions -rw-r--r--
added linux support
dvander@27
     1
/*	LIBPAWNC.C
dvander@27
     2
 *
dvander@27
     3
 *	A "glue file" for building the Pawn compiler as a DLL or shared library.
dvander@27
     4
 *
dvander@27
     5
 *	Copyright (c) ITB CompuPhase, 2000-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
dvander@27
     9
 *	the 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
 *	2.	Altered source versions must be plainly marked as such, and must not be
dvander@27
    20
 *			misrepresented as being the original software.
dvander@27
    21
 *	3.	This notice may not be removed or altered from any source distribution.
dvander@27
    22
 *
faluco@62
    23
 *  Version: $Id: libpawnc.c 3612 2006-07-22 09:59:46Z thiadmer $
dvander@27
    24
 */
dvander@27
    25
#include <assert.h>
dvander@27
    26
#include <stdio.h>
dvander@27
    27
#include <stdlib.h>
dvander@27
    28
#include <string.h>
dvander@27
    29
#include <malloc.h>
dvander@27
    30
#include "sc.h"
dvander@27
    31
#include "memfile.h"
dvander@27
    32
dvander@27
    33
/* pc_printf()
dvander@27
    34
 * Called for general purpose "console" output. This function prints general
dvander@27
    35
 * purpose messages; errors go through pc_error(). The function is modelled
dvander@27
    36
 * after printf().
dvander@27
    37
 */
dvander@27
    38
int pc_printf(const char *message,...)
dvander@27
    39
{
dvander@27
    40
	int ret;
dvander@27
    41
	va_list argptr;
dvander@27
    42
dvander@27
    43
	va_start(argptr,message);
dvander@27
    44
	ret=vprintf(message,argptr);
dvander@27
    45
	va_end(argptr);
dvander@27
    46
dvander@27
    47
	return ret;
dvander@27
    48
}
dvander@27
    49
dvander@27
    50
/* pc_error()
dvander@27
    51
 * Called for producing error output.
dvander@27
    52
 *		number			the error number (as documented in the manual)
dvander@27
    53
 *		message		 a string describing the error with embedded %d and %s tokens
dvander@27
    54
 *		filename		the name of the file currently being parsed
dvander@27
    55
 *		firstline	 the line number at which the expression started on which
dvander@27
    56
 *								the error was found, or -1 if there is no "starting line"
dvander@27
    57
 *		lastline		the line number at which the error was detected
dvander@27
    58
 *		argptr			a pointer to the first of a series of arguments (for macro
dvander@27
    59
 *								"va_arg")
dvander@27
    60
 * Return:
dvander@27
    61
 *		If the function returns 0, the parser attempts to continue compilation.
dvander@27
    62
 *		On a non-zero return value, the parser aborts.
dvander@27
    63
 */
dvander@27
    64
int pc_error(int number,char *message,char *filename,int firstline,int lastline,va_list argptr)
dvander@27
    65
{
dvander@27
    66
static char *prefix[3]={ "error", "fatal error", "warning" };
dvander@27
    67
dvander@27
    68
	if (number!=0) {
dvander@27
    69
		char *pre;
dvander@27
    70
dvander@27
    71
		pre=prefix[number/100];
dvander@27
    72
		if (firstline>=0)
dvander@27
    73
			fprintf(stderr,"%s(%d -- %d) : %s %03d: ",filename,firstline,lastline,pre,number);
dvander@27
    74
		else
dvander@27
    75
			fprintf(stderr,"%s(%d) : %s %03d: ",filename,lastline,pre,number);
dvander@27
    76
	} /* if */
dvander@27
    77
	vfprintf(stderr,message,argptr);
dvander@27
    78
	fflush(stderr);
dvander@27
    79
	return 0;
dvander@27
    80
}
dvander@27
    81
dvander@27
    82
/* pc_opensrc()
dvander@27
    83
 * Opens a source file (or include file) for reading. The "file" does not have
dvander@27
    84
 * to be a physical file, one might compile from memory.
dvander@27
    85
 *		filename		the name of the "file" to read from
dvander@27
    86
 * Return:
dvander@27
    87
 *		The function must return a pointer, which is used as a "magic cookie" to
dvander@27
    88
 *		all I/O functions. When failing to open the file for reading, the
dvander@27
    89
 *		function must return NULL.
dvander@27
    90
 * Note:
dvander@27
    91
 *		Several "source files" may be open at the same time. Specifically, one
dvander@27
    92
 *		file can be open for reading and another for writing.
dvander@27
    93
 */
dvander@27
    94
void *pc_opensrc(char *filename)
dvander@27
    95
{
dvander@27
    96
	return fopen(filename,"rt");
dvander@27
    97
}
dvander@27
    98
dvander@27
    99
/* pc_createsrc()
dvander@27
   100
 * Creates/overwrites a source file for writing. The "file" does not have
dvander@27
   101
 * to be a physical file, one might compile from memory.
dvander@27
   102
 *		filename		the name of the "file" to create
dvander@27
   103
 * Return:
dvander@27
   104
 *		The function must return a pointer which is used as a "magic cookie" to
dvander@27
   105
 *		all I/O functions. When failing to open the file for reading, the
dvander@27
   106
 *		function must return NULL.
dvander@27
   107
 * Note:
dvander@27
   108
 *		Several "source files" may be open at the same time. Specifically, one
dvander@27
   109
 *		file can be open for reading and another for writing.
dvander@27
   110
 */
dvander@27
   111
void *pc_createsrc(char *filename)
dvander@27
   112
{
dvander@27
   113
	return fopen(filename,"wt");
dvander@27
   114
}
dvander@27
   115
dvander@27
   116
/* pc_closesrc()
dvander@27
   117
 * Closes a source file (or include file). The "handle" parameter has the
dvander@27
   118
 * value that pc_opensrc() returned in an earlier call.
dvander@27
   119
 */
dvander@27
   120
void pc_closesrc(void *handle)
dvander@27
   121
{
dvander@27
   122
	assert(handle!=NULL);
dvander@27
   123
	fclose((FILE*)handle);
dvander@27
   124
}
dvander@27
   125
dvander@27
   126
/* pc_resetsrc()
dvander@27
   127
 * "position" may only hold a pointer that was previously obtained from
dvander@27
   128
 * pc_getpossrc()
dvander@27
   129
 */
dvander@27
   130
void pc_resetsrc(void *handle,void *position)
dvander@27
   131
{
dvander@27
   132
	assert(handle!=NULL);
dvander@27
   133
	fsetpos((FILE*)handle,(fpos_t *)position);
dvander@27
   134
}
dvander@27
   135
dvander@27
   136
/* pc_readsrc()
dvander@27
   137
 * Reads a single line from the source file (or up to a maximum number of
dvander@27
   138
 * characters if the line in the input file is too long).
dvander@27
   139
 */
dvander@27
   140
char *pc_readsrc(void *handle,unsigned char *target,int maxchars)
dvander@27
   141
{
dvander@27
   142
	return fgets((char*)target,maxchars,(FILE*)handle);
dvander@27
   143
}
dvander@27
   144
dvander@27
   145
/* pc_writesrc()
dvander@27
   146
 * Writes to to the source file. There is no automatic line ending; to end a
dvander@27
   147
 * line, write a "\n".
dvander@27
   148
 */
dvander@27
   149
int pc_writesrc(void *handle,unsigned char *source)
dvander@27
   150
{
dvander@27
   151
	return fputs((char*)source,(FILE*)handle) >= 0;
dvander@27
   152
}
dvander@27
   153
dvander@27
   154
void *pc_getpossrc(void *handle)
dvander@27
   155
{
dvander@27
   156
	static fpos_t lastpos;	/* may need to have a LIFO stack of such positions */
dvander@27
   157
dvander@27
   158
	fgetpos((FILE*)handle,&lastpos);
dvander@27
   159
	return &lastpos;
dvander@27
   160
}
dvander@27
   161
dvander@27
   162
int pc_eofsrc(void *handle)
dvander@27
   163
{
dvander@27
   164
	return feof((FILE*)handle);
dvander@27
   165
}
dvander@27
   166
dvander@27
   167
/* should return a pointer, which is used as a "magic cookie" to all I/O
dvander@27
   168
 * functions; return NULL for failure
dvander@27
   169
 */
dvander@27
   170
void *pc_openasm(char *filename)
dvander@27
   171
{
dvander@27
   172
	#if defined __MSDOS__ || defined SC_LIGHT
dvander@27
   173
		return fopen(filename,"w+t");
dvander@27
   174
	#else
dvander@27
   175
		return mfcreate(filename);
dvander@27
   176
	#endif
dvander@27
   177
}
dvander@27
   178
dvander@27
   179
void pc_closeasm(void *handle, int deletefile)
dvander@27
   180
{
dvander@27
   181
	#if defined __MSDOS__ || defined SC_LIGHT
dvander@27
   182
		if (handle!=NULL)
dvander@27
   183
			fclose((FILE*)handle);
dvander@27
   184
		if (deletefile)
dvander@27
   185
			remove(outfname);
dvander@27
   186
	#else
dvander@27
   187
		if (handle!=NULL) {
dvander@27
   188
			if (!deletefile)
dvander@27
   189
				mfdump((MEMFILE*)handle);
dvander@27
   190
			mfclose((MEMFILE*)handle);
dvander@27
   191
		} /* if */
dvander@27
   192
	#endif
dvander@27
   193
}
dvander@27
   194
dvander@27
   195
void pc_resetasm(void *handle)
dvander@27
   196
{
dvander@27
   197
	assert(handle!=NULL);
dvander@27
   198
	#if defined __MSDOS__ || defined SC_LIGHT
dvander@27
   199
		fflush((FILE*)handle);
dvander@27
   200
		fseek((FILE*)handle,0,SEEK_SET);
dvander@27
   201
	#else
dvander@27
   202
		mfseek((MEMFILE*)handle,0,SEEK_SET);
dvander@27
   203
	#endif
dvander@27
   204
}
dvander@27
   205
dvander@27
   206
int pc_writeasm(void *handle,char *string)
dvander@27
   207
{
dvander@27
   208
	#if defined __MSDOS__ || defined SC_LIGHT
dvander@27
   209
		return fputs(string,(FILE*)handle) >= 0;
dvander@27
   210
	#else
dvander@27
   211
		return mfputs((MEMFILE*)handle,string);
dvander@27
   212
	#endif
dvander@27
   213
}
dvander@27
   214
dvander@27
   215
char *pc_readasm(void *handle, char *string, int maxchars)
dvander@27
   216
{
dvander@27
   217
	#if defined __MSDOS__ || defined SC_LIGHT
dvander@27
   218
		return fgets(string,maxchars,(FILE*)handle);
dvander@27
   219
	#else
dvander@27
   220
		return mfgets((MEMFILE*)handle,string,maxchars);
dvander@27
   221
	#endif
dvander@27
   222
}
dvander@27
   223
dvander@27
   224
extern memfile_t *bin_file;
dvander@27
   225
dvander@27
   226
/* Should return a pointer, which is used as a "magic cookie" to all I/O
dvander@27
   227
 * functions; return NULL for failure.
dvander@27
   228
 */
dvander@27
   229
void *pc_openbin(char *filename)
dvander@27
   230
{
dvander@27
   231
	return memfile_creat(filename, 1);
dvander@27
   232
}
dvander@27
   233
dvander@27
   234
void pc_closebin(void *handle,int deletefile)
dvander@27
   235
{
dvander@27
   236
	if (deletefile)
dvander@27
   237
	{
dvander@27
   238
		memfile_destroy((memfile_t *)handle);
dvander@27
   239
		bin_file = NULL;
dvander@27
   240
	} else {
dvander@27
   241
		bin_file = (memfile_t *)handle;
dvander@27
   242
	}
dvander@27
   243
}
dvander@27
   244
dvander@27
   245
/* pc_resetbin()
dvander@27
   246
 * Can seek to any location in the file.
dvander@27
   247
 * The offset is always from the start of the file.
dvander@27
   248
 */
dvander@27
   249
void pc_resetbin(void *handle,long offset)
dvander@27
   250
{
dvander@27
   251
	memfile_seek((memfile_t *)handle, offset);
dvander@27
   252
}
dvander@27
   253
dvander@27
   254
int pc_writebin(void *handle,void *buffer,int size)
dvander@27
   255
{
dvander@27
   256
	return memfile_write((memfile_t *)handle, buffer, size);
dvander@27
   257
}
dvander@27
   258
dvander@27
   259
long pc_lengthbin(void *handle)
dvander@27
   260
{
dvander@27
   261
	return memfile_tell((memfile_t *)handle);
dvander@27
   262
}