diff --git a/sourcepawn/compiler/msvc8/spcomp.vcproj b/sourcepawn/compiler/msvc8/spcomp.vcproj
index 08d373a6..e430f784 100644
--- a/sourcepawn/compiler/msvc8/spcomp.vcproj
+++ b/sourcepawn/compiler/msvc8/spcomp.vcproj
@@ -240,6 +240,10 @@
RelativePath="..\scstate.c"
>
+
+
@@ -278,6 +282,10 @@
RelativePath="..\sc.h"
>
+
+
diff --git a/sourcepawn/compiler/sc3.c b/sourcepawn/compiler/sc3.c
index c9b2e467..e54d2c5e 100644
--- a/sourcepawn/compiler/sc3.c
+++ b/sourcepawn/compiler/sc3.c
@@ -28,6 +28,7 @@
#include
#endif
#include "sc.h"
+#include "sctracker.h"
static int skim(int *opstr,void (*testfunc)(int),int dropval,int endval,
int (*hier)(value*),value *lval);
@@ -60,104 +61,8 @@ static int dbltest(void (*oper)(),value *lval1,value *lval2);
static int commutative(void (*oper)());
static int constant(value *lval);
-#define HEAPUSE_STATIC 0
-#define HEAPUSE_DYNAMIC 1
-
-typedef struct heapuse_s {
- int type; /* HEAPUSE_STATIC or HEAPUSE_DYNAMIC */
- int size; /* size of array for static (0 for dynamic) */
- struct heapuse_s *prev; /* previous array on the list */
-} heapuse_t;
-
-typedef struct heapuse_list_s {
- struct heapuse_list_s *prev; /* last used list */
- heapuse_t *head; /* head of the current list */
-} heapuse_list_t;
-
static char lastsymbol[sNAMEMAX+1]; /* name of last function/variable */
static int bitwise_opercount; /* count of bitwise operators in an expression */
-//static int decl_heap=0;
-static heapuse_list_t *heapusage = NULL;
-
-/**
- * Creates a new heap allocation tracker entry
- */
-void pushheaplist()
-{
- heapuse_list_t *newlist=(heapuse_list_t *)malloc(sizeof(heapuse_list_t));
- newlist->prev=heapusage;
- newlist->head=NULL;
- heapusage=newlist;
-}
-
-/**
- * Generates code to free all heap allocations on a tracker
- */
-void freeheapusage(heapuse_list_t *heap)
-{
- heapuse_t *cur=heap->head;
- heapuse_t *tmp;
- while (cur) {
- if (cur->type == HEAPUSE_STATIC) {
- modheap((-1)*cur->size*sizeof(cell));
- } else {
- modheap_i();
- }
- tmp=cur->prev;
- free(cur);
- cur=tmp;
- }
- heap->head=NULL;
-}
-
-/**
- * Pops a heap list but does not free it.
- */
-heapuse_list_t *popsaveheaplist()
-{
- heapuse_list_t *oldlist=heapusage;
- heapusage=heapusage->prev;
- return oldlist;
-}
-
-/**
- * Pops a heap list and frees it.
- */
-void popheaplist()
-{
- heapuse_list_t *oldlist;
- assert(heapusage!=NULL);
-
- freeheapusage(heapusage);
- assert(heapusage->head==NULL);
-
- oldlist=heapusage->prev;
- free(heapusage);
- heapusage=oldlist;
-}
-
-/*
- * Returns the size passed in
- */
-int markheap(int type, int size)
-{
- heapuse_t *use;
- if (type==HEAPUSE_STATIC && size==0)
- return 0;
- use=heapusage->head;
- if (use && (type==HEAPUSE_STATIC)
- && (use->type == type))
- {
- use->size += size;
- } else {
- use=(heapuse_t *)malloc(sizeof(heapuse_t));
- use->type=type;
- use->size=size;
- use->prev=heapusage->head;
- heapusage->head=use;
- }
- return size;
-}
/* Function addresses of binary operators for signed operations */
static void (*op1[17])(void) = {
diff --git a/sourcepawn/compiler/sctracker.c b/sourcepawn/compiler/sctracker.c
new file mode 100644
index 00000000..2c5619f5
--- /dev/null
+++ b/sourcepawn/compiler/sctracker.c
@@ -0,0 +1,86 @@
+#include
+#include
+#include "sc.h"
+#include "sctracker.h"
+
+heapuse_list_t *heapusage = NULL;
+
+/**
+* Creates a new heap allocation tracker entry
+*/
+void pushheaplist()
+{
+ heapuse_list_t *newlist=(heapuse_list_t *)malloc(sizeof(heapuse_list_t));
+ newlist->prev=heapusage;
+ newlist->head=NULL;
+ heapusage=newlist;
+}
+
+/**
+* Generates code to free all heap allocations on a tracker
+*/
+void freeheapusage(heapuse_list_t *heap)
+{
+ heapuse_t *cur=heap->head;
+ heapuse_t *tmp;
+ while (cur) {
+ if (cur->type == HEAPUSE_STATIC) {
+ modheap((-1)*cur->size*sizeof(cell));
+ } else {
+ modheap_i();
+ }
+ tmp=cur->prev;
+ free(cur);
+ cur=tmp;
+ }
+ heap->head=NULL;
+}
+
+/**
+* Pops a heap list but does not free it.
+*/
+heapuse_list_t *popsaveheaplist()
+{
+ heapuse_list_t *oldlist=heapusage;
+ heapusage=heapusage->prev;
+ return oldlist;
+}
+
+/**
+* Pops a heap list and frees it.
+*/
+void popheaplist()
+{
+ heapuse_list_t *oldlist;
+ assert(heapusage!=NULL);
+
+ freeheapusage(heapusage);
+ assert(heapusage->head==NULL);
+
+ oldlist=heapusage->prev;
+ free(heapusage);
+ heapusage=oldlist;
+}
+
+/*
+* Returns the size passed in
+*/
+int markheap(int type, int size)
+{
+ heapuse_t *use;
+ if (type==HEAPUSE_STATIC && size==0)
+ return 0;
+ use=heapusage->head;
+ if (use && (type==HEAPUSE_STATIC)
+ && (use->type == type))
+ {
+ use->size += size;
+ } else {
+ use=(heapuse_t *)malloc(sizeof(heapuse_t));
+ use->type=type;
+ use->size=size;
+ use->prev=heapusage->head;
+ heapusage->head=use;
+ }
+ return size;
+}
\ No newline at end of file
diff --git a/sourcepawn/compiler/sctracker.h b/sourcepawn/compiler/sctracker.h
new file mode 100644
index 00000000..c936d0e9
--- /dev/null
+++ b/sourcepawn/compiler/sctracker.h
@@ -0,0 +1,26 @@
+#ifndef _INCLUDE_SOURCEPAWN_COMPILER_TRACKER_H_
+#define _INCLUDE_SOURCEPAWN_COMPILER_TRACKER_H_
+
+#define HEAPUSE_STATIC 0
+#define HEAPUSE_DYNAMIC 1
+
+typedef struct heapuse_s {
+ int type; /* HEAPUSE_STATIC or HEAPUSE_DYNAMIC */
+ int size; /* size of array for static (0 for dynamic) */
+ struct heapuse_s *prev; /* previous array on the list */
+} heapuse_t;
+
+typedef struct heapuse_list_s {
+ struct heapuse_list_s *prev; /* last used list */
+ heapuse_t *head; /* head of the current list */
+} heapuse_list_t;
+
+extern heapuse_list_t *heapusage;
+
+void pushheaplist();
+void freeheapusage(heapuse_list_t *heap);
+heapuse_list_t *popsaveheaplist();
+void popheaplist();
+int markheap(int type, int size);
+
+#endif //_INCLUDE_SOURCEPAWN_COMPILER_TRACKER_H_