summary refs log tree commit diff stats
path: root/tinyc/tcclib.h
diff options
context:
space:
mode:
Diffstat (limited to 'tinyc/tcclib.h')
-rw-r--r--tinyc/tcclib.h80
1 files changed, 80 insertions, 0 deletions
diff --git a/tinyc/tcclib.h b/tinyc/tcclib.h
new file mode 100644
index 000000000..8d59e4c9a
--- /dev/null
+++ b/tinyc/tcclib.h
@@ -0,0 +1,80 @@
+/* Simple libc header for TCC 
+ * 
+ * Add any function you want from the libc there. This file is here
+ * only for your convenience so that you do not need to put the whole
+ * glibc include files on your floppy disk 
+ */
+#ifndef _TCCLIB_H
+#define _TCCLIB_H
+
+#include <stddef.h>
+#include <stdarg.h>
+
+/* stdlib.h */
+void *calloc(size_t nmemb, size_t size);
+void *malloc(size_t size);
+void free(void *ptr);
+void *realloc(void *ptr, size_t size);
+int atoi(const char *nptr);
+long int strtol(const char *nptr, char **endptr, int base);
+unsigned long int strtoul(const char *nptr, char **endptr, int base);
+void exit(int);
+
+/* stdio.h */
+typedef struct __FILE FILE;
+#define EOF (-1)
+extern FILE *stdin;
+extern FILE *stdout;
+extern FILE *stderr;
+FILE *fopen(const char *path, const char *mode);
+FILE *fdopen(int fildes, const char *mode);
+FILE *freopen(const  char *path, const char *mode, FILE *stream);
+int fclose(FILE *stream);
+size_t  fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
+size_t  fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
+int fgetc(FILE *stream);
+char *fgets(char *s, int size, FILE *stream);
+int getc(FILE *stream);
+int getchar(void);
+char *gets(char *s);
+int ungetc(int c, FILE *stream);
+int fflush(FILE *stream);
+int putchar (int c);
+
+int printf(const char *format, ...);
+int fprintf(FILE *stream, const char *format, ...);
+int sprintf(char *str, const char *format, ...);
+int snprintf(char *str, size_t size, const  char  *format, ...);
+int asprintf(char **strp, const char *format, ...);
+int dprintf(int fd, const char *format, ...);
+int vprintf(const char *format, va_list ap);
+int vfprintf(FILE  *stream,  const  char *format, va_list ap);
+int vsprintf(char *str, const char *format, va_list ap);
+int vsnprintf(char *str, size_t size, const char  *format, va_list ap);
+int vasprintf(char  **strp,  const  char *format, va_list ap);
+int vdprintf(int fd, const char *format, va_list ap);
+
+void perror(const char *s);
+
+/* string.h */
+char *strcat(char *dest, const char *src);
+char *strchr(const char *s, int c);
+char *strrchr(const char *s, int c);
+char *strcpy(char *dest, const char *src);
+void *memcpy(void *dest, const void *src, size_t n);
+void *memmove(void *dest, const void *src, size_t n);
+void *memset(void *s, int c, size_t n);
+char *strdup(const char *s);
+size_t strlen(const char *s);
+
+/* dlfcn.h */
+#define RTLD_LAZY       0x001
+#define RTLD_NOW        0x002
+#define RTLD_GLOBAL     0x100
+
+void *dlopen(const char *filename, int flag);
+const char *dlerror(void);
+void *dlsym(void *handle, char *symbol);
+int dlclose(void *handle);
+
+#endif /* _TCCLIB_H */
tik.com> 2015-03-16 18:10:38 -0700 committer Kartik K. Agaram <vc@akkartik.com> 2015-03-16 18:10:38 -0700 930' href='/akkartik/mu/commit/cpp/012run?h=hlt&id=3a24d35f7582591e274d0de6fd002b7491c82696'>3a24d35f ^
10e449b5 ^


ec926027 ^
9fc64bbc ^

1228ec73 ^
ec926027 ^




c7c822b2 ^
d241c9c4 ^








eb7afe5d ^
d241c9c4 ^
9cf71627 ^
6f5d7864 ^
9fc64bbc ^


ec926027 ^


















e7f76736 ^














cae5461b ^
916ae8f5 ^
cae5461b ^
a26cc359 ^



b291f85b ^





cae5461b ^



b291f85b ^
fe67d47a ^
b291f85b ^




cae5461b ^

c1a50c82 ^
9fc64bbc ^





eaa75c87 ^
d160a8e1 ^
fe67d47a ^
eaa75c87 ^


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134




                              
                        

                           
 




                              
                        
                       
                      

                           
                     

                                       
                


                                                               

  

                       

                                                          


                           
                  

 
                      




                                                                   
                                         








                                                                                   
                                                                             
       
     
         


   


















                                                                             














                                                  
                                    
                                                             
                     



                                     





                                                                     



                                                
                            
                           




                                                                                    

 
       





                                                      
 
                           
                                 


                                                 
:(scenarios run)
:(scenario copy_literal)
recipe main [
  1:integer <- copy 23:literal
]
+run: instruction main/0
+run: ingredient 0 is 23
+mem: storing in location 1

:(scenario copy)
recipe main [
  1:integer <- copy 23:literal
  2:integer <- copy 1:integer
]
+run: instruction main/1
+run: ingredient 0 is 1
+mem: location 1 is 23
+mem: storing in location 2

:(before "End Types")
// Book-keeping while running a recipe.
// Later layers will change this.
struct routine {
  recipe_number running_recipe;
  size_t running_at;
  routine(recipe_number r) :running_recipe(r), running_at(0) {}
};

:(code)
void run(string form) {
  vector<recipe_number> recipes_added = add_recipes(form);
  run(recipes_added.front());
}

void run(recipe_number r) {
  run(routine(r));
}

void run(routine rr) {
  while (!done(rr)) {
    vector<instruction>& instructions = steps(rr);
    size_t& pc = running_at(rr);
    // Running one instruction.
    trace("run") << "instruction " << recipe_name(rr) << '/' << pc;
    switch (instructions[pc].operation) {
      // Primitive Recipe Implementations.
      case COPY: {
        trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
        vector<int> data = read_memory(instructions[pc].ingredients[0]);
        write_memory(instructions[pc].products[0], data);
        break;
      }
      // End Primitive Recipe Implementations.
      default: {
        cout << "not a primitive op: " << instructions[pc].operation << '\n';
      }
    }
    ++pc;
  }
}

// Some helpers.
// We'll need to override these later as we change the definition of routine.
// Important that they return referrences into the routine.
inline size_t& running_at(routine& rr) {
  return rr.running_at;
}

inline string recipe_name(routine& rr) {
  return Recipe[rr.running_recipe].name;
}

inline vector<instruction>& steps(routine& rr) {
  return Recipe[rr.running_recipe].steps;
}

inline bool done(routine& rr) {
  return running_at(rr) >= steps(rr).size();
}

:(before "End Main")
if (argc > 1) {
  setup();
  for (int i = 1; i < argc; ++i) {
    ifstream fin(argv[i]);
    while (!fin.eof()) add_recipe(fin);
    fin.close();
  }

  recipe_number r = Recipe_number[string("main")];
  if (r) run(r);
  dump_memory();
}

:(code)
vector<int> read_memory(reagent x) {
//?   cout << "read_memory: " << x.to_string() << '\n'; //? 1
  vector<int> result;
  if (x.types[0] == 0) {  // literal
    result.push_back(to_int(x.name));
    return result;
  }
  int base = to_int(x.name);
  for (size_t offset = 0; offset < Type[x.types[0]].size; ++offset) {
    int val = Memory[base+offset];
    trace("mem") << "location " << base+offset << " is " << val;
    result.push_back(val);
  }
  return result;
}

void write_memory(reagent x, vector<int> data) {
  int base = to_int(x.name);
  size_t size = size_of(x);
  if (size != data.size()) raise << "size mismatch in storing to " << x.to_string();
  for (size_t offset = 0; offset < size; ++offset) {
    trace("mem") << "storing in location " << base+offset;
    Memory[base+offset] = data[offset];
  }
}

:(code)
int to_int(string n) {
  char* end = NULL;
  int result = strtol(n.c_str(), &end, /*any base*/0);
  assert(*end == '\0');
  return result;
}

size_t size_of(reagent r) {
  type_info t = Type[r.types[0]];
  if (!t.is_record && !t.is_array) return t.size;
  return t.size;  // TODO
}