KCC - Kayte C Compiler 1.10.0
A C compiler implementation with preprocessor, lexer, parser, and code generator
Loading...
Searching...
No Matches
builtin_macros.c
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <time.h>
5#include "preprocessor.h"
6
7// Add built-in macros to preprocessor
8void preprocessor_add_builtin_macros(Preprocessor *pp) {
9 // Compiler identification
10 preprocessor_define_macro(pp, "__KCC__", "1");
11 preprocessor_define_macro(pp, "__KCC_VERSION__", "\"1.0.0\"");
12
13 // Standard compliance
14 preprocessor_define_macro(pp, "__STDC__", "1");
15 preprocessor_define_macro(pp, "__STDC_VERSION__", "201112L");
16
17 // Date and time macros
18 time_t now = time(NULL);
19 struct tm *tm_info = localtime(&now);
20
21 char date_str[32];
22 char time_str[32];
23 strftime(date_str, sizeof(date_str), "\"%b %d %Y\"", tm_info);
24 strftime(time_str, sizeof(time_str), "\"%H:%M:%S\"", tm_info);
25
26 preprocessor_define_macro(pp, "__DATE__", date_str);
27 preprocessor_define_macro(pp, "__TIME__", time_str);
28
29 // Platform detection
30#ifdef __linux__
31 preprocessor_define_macro(pp, "__linux__", "1");
32 preprocessor_define_macro(pp, "__unix__", "1");
33 preprocessor_define_macro(pp, "__PLATFORM__", "\"Linux\"");
34#elif defined(__APPLE__)
35 preprocessor_define_macro(pp, "__APPLE__", "1");
36 preprocessor_define_macro(pp, "__unix__", "1");
37 preprocessor_define_macro(pp, "__PLATFORM__", "\"macOS\"");
38#else
39 preprocessor_define_macro(pp, "__PLATFORM__", "\"Unknown\"");
40#endif
41
42 // Architecture macros
43#if defined(__x86_64__) || defined(_M_X64)
44 preprocessor_define_macro(pp, "__x86_64__", "1");
45 preprocessor_define_macro(pp, "__ARCH__", "\"x86_64\"");
46 preprocessor_define_macro(pp, "__POINTER_SIZE__", "8");
47#elif defined(__aarch64__)
48 preprocessor_define_macro(pp, "__aarch64__", "1");
49 preprocessor_define_macro(pp, "__ARCH__", "\"ARM64\"");
50 preprocessor_define_macro(pp, "__POINTER_SIZE__", "8");
51#endif
52
53 // Common constants
54 preprocessor_define_macro(pp, "NULL", "((void*)0)");
55 preprocessor_define_macro(pp, "TRUE", "1");
56 preprocessor_define_macro(pp, "FALSE", "0");
57
58 // Mathematical constants
59 preprocessor_define_macro(pp, "PI", "3.141592653589793");
60 preprocessor_define_macro(pp, "E", "2.718281828459045");
61
62 // Memory sizes
63 preprocessor_define_macro(pp, "KB", "1024");
64 preprocessor_define_macro(pp, "MB", "(1024 * 1024)");
65 preprocessor_define_macro(pp, "GB", "(1024 * 1024 * 1024)");
66
67 // Build configuration
68#ifdef DEBUG
69 preprocessor_define_macro(pp, "BUILD_TYPE", "\"Debug\"");
70 preprocessor_define_macro(pp, "DEBUG_BUILD", "1");
71#else
72 preprocessor_define_macro(pp, "BUILD_TYPE", "\"Release\"");
73 preprocessor_define_macro(pp, "RELEASE_BUILD", "1");
74#endif
75
76 // Mark as predefined
77 for (int i = 0; i < pp->macro_count; i++) {
78 pp->macros[i].is_predefined = true;
79 }
80}
81
82// Add user-defined macros
83void preprocessor_add_user_macros(Preprocessor *pp, const char *macro_definitions[], int count) {
84 for (int i = 0; i < count; i++) {
85 const char *def = macro_definitions[i];
86 char *name = strdup(def);
87 char *equals = strchr(name, '=');
88
89 if (equals) {
90 *equals = '\0';
91 char *value = equals + 1;
92 preprocessor_define_macro(pp, name, value);
93 } else {
94 preprocessor_define_macro(pp, name, "1");
95 }
96
97 free(name);
98 }
99}
100
101// Add environment macros (simplified)
102void preprocessor_add_environment_macros(Preprocessor *pp) {
103 char *user = getenv("USER");
104 if (user) {
105 char *quoted = malloc(strlen(user) + 3);
106 sprintf(quoted, "\"%s\"", user);
107 preprocessor_define_macro(pp, "ENV_USER", quoted);
108 free(quoted);
109 }
110}
111
112// Add system macros (simplified)
113void preprocessor_add_system_macros(Preprocessor *pp) {
114 preprocessor_define_macro(pp, "__SYSTEM_NAME__", "\"Unix\"");
115 preprocessor_define_macro(pp, "__MACHINE__", "\"Unknown\"");
116}