mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Corrected default alignment on temp alloc. Added str_index_of. Added simple getline. Added a simple calculator. Allow [1..] to create a zero length slice. Added some initial macro contracts. Fix accessing enum functions. Support for @checked. Bump to 0.3.4
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
module std::core::builtin;
|
||||
|
||||
/**
|
||||
* @require is_comparable_value(a) && is_comparable_value(b)
|
||||
* @require types::is_comparable_value(a) && types::is_comparable_value(b)
|
||||
**/
|
||||
macro less(a, b) @builtin
|
||||
{
|
||||
@@ -18,7 +18,7 @@ macro less(a, b) @builtin
|
||||
}
|
||||
|
||||
/**
|
||||
* @require is_comparable_value(a) && is_comparable_value(b)
|
||||
* @require types::is_comparable_value(a) && types::is_comparable_value(b)
|
||||
**/
|
||||
macro less_eq(a, b) @builtin
|
||||
{
|
||||
@@ -32,7 +32,7 @@ macro less_eq(a, b) @builtin
|
||||
}
|
||||
|
||||
/**
|
||||
* @require is_comparable_value(a) && is_comparable_value(b)
|
||||
* @require types::is_comparable_value(a) && types::is_comparable_value(b)
|
||||
**/
|
||||
macro greater(a, b) @builtin
|
||||
{
|
||||
@@ -46,7 +46,7 @@ macro greater(a, b) @builtin
|
||||
}
|
||||
|
||||
/**
|
||||
* @require is_comparable_value(a) && is_comparable_value(b)
|
||||
* @require types::is_comparable_value(a) && types::is_comparable_value(b)
|
||||
**/
|
||||
macro greater_eq(a, b) @builtin
|
||||
{
|
||||
@@ -60,7 +60,7 @@ macro greater_eq(a, b) @builtin
|
||||
}
|
||||
|
||||
/**
|
||||
* @require is_equatable_value(a) && is_equatable_value(b) `values must be equatable`
|
||||
* @require types::is_equatable_value(a) && types::is_equatable_value(b) `values must be equatable`
|
||||
**/
|
||||
macro bool equals(a, b) @builtin
|
||||
{
|
||||
|
||||
@@ -166,17 +166,17 @@ macro talloc($Type) @builtin
|
||||
return temp_allocator().alloc_aligned($Type.sizeof, $alignof($Type))!!;
|
||||
}
|
||||
|
||||
fn void* tmalloc(usize size, usize alignment = 0) @builtin @inline
|
||||
fn void* tmalloc(usize size, usize alignment = allocator::DEFAULT_MEM_ALIGNMENT) @builtin @inline
|
||||
{
|
||||
return temp_allocator().alloc_aligned(size, alignment)!!;
|
||||
}
|
||||
|
||||
fn void* tcalloc(usize size, usize alignment = 0) @builtin @inline
|
||||
fn void* tcalloc(usize size, usize alignment = allocator::DEFAULT_MEM_ALIGNMENT) @builtin @inline
|
||||
{
|
||||
return temp_allocator().calloc_aligned(size, alignment)!!;
|
||||
}
|
||||
|
||||
fn void* trealloc(void* ptr, usize size, usize alignment = 0) @builtin @inline
|
||||
fn void* trealloc(void* ptr, usize size, usize alignment = allocator::DEFAULT_MEM_ALIGNMENT) @builtin @inline
|
||||
{
|
||||
return temp_allocator().realloc_aligned(ptr, size, alignment)!!;
|
||||
}
|
||||
|
||||
@@ -29,6 +29,32 @@ fn String join(char[][] s, char[] joiner)
|
||||
return res;
|
||||
}
|
||||
|
||||
fn usize! str_index_of(char[] s, char[] needle)
|
||||
{
|
||||
usize match = 0;
|
||||
usize needed = needle.len;
|
||||
if (!needed) return SearchResult.MISSING!;
|
||||
usize index_start = 0;
|
||||
char search = needle[0];
|
||||
foreach (usize i, char c : s)
|
||||
{
|
||||
if (c == search)
|
||||
{
|
||||
if (!match) index_start = i;
|
||||
match++;
|
||||
if (match == needed) return i;
|
||||
search = needle[match];
|
||||
continue;
|
||||
}
|
||||
if (match)
|
||||
{
|
||||
match = 0;
|
||||
search = needle[0];
|
||||
}
|
||||
}
|
||||
return SearchResult.MISSING!;
|
||||
}
|
||||
|
||||
fn ZString copy_zstring(char[] s)
|
||||
{
|
||||
usize len = s.len;
|
||||
|
||||
@@ -8,7 +8,7 @@ fault ConversionResult
|
||||
VALUE_OUT_OF_UNSIGNED_RANGE,
|
||||
}
|
||||
/**
|
||||
* @require type.kind == SIGNED_INT || type.kind == UNSIGNED_INT || type.kind == ENUM, "Argument was not an integer"
|
||||
* @require $Type.kind.is_int() || $Type.kind == TypeKind.ENUM "Argument was not an integer"
|
||||
**/
|
||||
macro variant_to_int(variant v, $Type)
|
||||
{
|
||||
|
||||
@@ -169,6 +169,22 @@ fn usize! File.println(File* file, char[] string)
|
||||
return len + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param [&in] file
|
||||
* @require file.file `File must be initialized`
|
||||
*/
|
||||
fn String File.getline(File* file, Allocator* allocator = mem::current_allocator())
|
||||
{
|
||||
String s = string::new_with_capacity(120, allocator);
|
||||
while (!file.eof())
|
||||
{
|
||||
int c = libc::fgetc(file.file);
|
||||
if (c == '\n') break;
|
||||
s.append_char((char)c);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param [&in] file
|
||||
* @require file.file `File must be initialized`
|
||||
|
||||
@@ -186,6 +186,7 @@ extern fn int putchar(int c);
|
||||
extern fn int puts(char* str);
|
||||
extern fn int ungetc(int c, CFile stream);
|
||||
extern fn void perror(char* str);
|
||||
extern fn isize getline(char** linep, usize* linecapp, CFile stream);
|
||||
|
||||
// vsprintf vprintf not supported
|
||||
|
||||
|
||||
Reference in New Issue
Block a user