const std = @import("std"); const Allocator = std.mem.Allocator; const bun = @import("root").bun; const Environment = bun.Environment; const string = @import("string_types.zig").string; const StringBuilder = @This(); const assert = std.debug.assert; const DebugHashTable = if (Environment.allow_assert) std.AutoHashMapUnmanaged(u64, void) else void; len: usize = 0, cap: usize = 0, ptr: ?[*]u8 = null, pub fn initCapacity( allocator: std.mem.Allocator, cap: usize, ) !StringBuilder { return StringBuilder{ .cap = cap, .len = 0, .ptr = (try allocator.alloc(u8, cap)).ptr, }; } pub fn count(this: *StringBuilder, slice: string) void { this.cap += slice.len; } pub fn allocate(this: *StringBuilder, allocator: Allocator) !void { var slice = try allocator.alloc(u8, this.cap); this.ptr = slice.ptr; this.len = 0; } pub fn deinit(this: *StringBuilder, allocator: Allocator) void { if (this.ptr == null or this.cap == 0) return; allocator.free(this.ptr.?[0..this.cap]); } pub fn append(this: *StringBuilder, slice: string) string { if (comptime Environment.allow_assert) { assert(this.len <= this.cap); // didn't count everything assert(this.ptr != null); // must call allocate first } bun.copy(u8, this.ptr.?[this.len..this.cap], slice); const result = this.ptr.?[this.len..this.cap][0..slice.len]; this.len += slice.len; if (comptime Environment.allow_assert) assert(this.len <= this.cap); return result; } pub fn add(this: *StringBuilder, len: usize) bun.StringPointer { if (comptime Environment.allow_assert) { assert(this.len <= this.cap); // didn't count everything assert(this.ptr != null); // must call allocate first } const start = this.len; this.len += len; if (comptime Environment.allow_assert) assert(this.len <= this.cap); return bun.StringPointer{ .offset = @truncate(u32, start), .length = @truncate(u32, len) }; } pub fn appendCount(this: *StringBuilder, slice: string) bun.StringPointer { if (comptime Environment.allow_assert) { assert(this.len <= this.cap); // didn't count everything assert(this.ptr != null); // must call allocate first } const start = this.len; bun.copy(u8, this.ptr.?[this.len..this.cap], slice); const result = this.ptr.?[this.len..this.cap][0..slice.len]; _ = result; this.len += slice.len; if (comptime Environment.allow_assert) assert(this.len <= this.cap); return bun.StringPointer{ .offset = @truncate(u32, start), .length = @truncate(u32, slice.len) }; } pub fn fmt(this: *StringBuilder, comptime str: string, args: anytype) string { if (comptime Environment.allow_assert) { assert(this.len <= this.cap); // didn't count everything assert(this.ptr != null); // must call allocate first } var buf = this.ptr.?[this.len..this.cap]; const out = std.fmt.bufPrint(buf, str, args) catch unreachable; this.len += out.len; if (comptime Environment.allow_assert) assert(this.len <= this.cap); return out; } pub fn fmtAppendCount(this: *StringBuilder, comptime str: string, args: anytype) bun.StringPointer { if (comptime Environment.allow_assert) { assert(this.len <= this.cap); // didn't count everything assert(this.ptr != null); // must call allocate first } var buf = this.ptr.?[this.len..this.cap]; const out = std.fmt.bufPrint(buf, str, args) catch unreachable; const off = this.len; this.len += out.len; if (comptime Environment.allow_assert) assert(this.len <= this.cap); return bun.StringPointer{ .offset = @truncate(u32, off), .length = @truncate(u32, out.len), }; } pub fn fmtCount(this: *StringBuilder, comptime str: string, args: anytype) void { this.cap += std.fmt.count(str, args); } pub fn allocatedSlice(this: *StringBuilder) []u8 { var ptr = this.ptr orelse return &[_]u8{}; if (comptime Environment.allow_assert) { assert(this.cap > 0); } return ptr[0..this.cap]; } pub fn writable(this: *StringBuilder) []u8 { var ptr = this.ptr orelse return &[_]u8{}; if (comptime Environment.allow_assert) { assert(this.cap > 0); } return ptr[this.len..this.cap]; } -module-field-in-exports Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
path: root/integration/snippets/jsx-top-level.tsx (unfollow)
AgeCommit message (Expand)AuthorFilesLines
2022-02-04`path.resolve()` passes testsGravatar Jarred Sumner 2-13/+81
2022-02-04Update multiple-var.jsGravatar Jarred Sumner 1-1/+2
2022-02-04:camera:Gravatar Jarred Sumner 74-340/+669
2022-02-04Update snippets.jsonGravatar Jarred Sumner 1-1/+3
2022-02-04Add integration test for reading .json files that have UTF-8 string literalsGravatar Jarred Sumner 2-0/+9
2022-02-04[http] fix segfaultGravatar Jarred Sumner 1-17/+25
2022-02-04[bun dev] Fix bug with serving static files on next.js apps introduced in af6...Gravatar Jarred Sumner 1-5/+7
2022-02-04Update types.zigGravatar Jarred Sumner 1-9/+10
2022-02-04Update test_command.zigGravatar Jarred Sumner 1-2/+0
2022-02-04`path.normalize()` tests passGravatar Jarred Sumner 2-146/+213
2022-02-03Fix test failures in path.joinGravatar Jarred Sumner 1-8/+115
2022-02-03Update mimalloc_arena.zigGravatar Jarred Sumner 1-0/+9
2022-02-03[bun test] Support multiple filesGravatar Jarred Sumner 1-2/+12
2022-02-03Update js_ast.zigGravatar Jarred Sumner 1-0/+1
2022-02-03Support loading multiple entry points by changing what `bun:main` points toGravatar Jarred Sumner 6-4/+36
2022-02-03[bun install] Configurable max http retry countGravatar Jarred Sumner 1-0/+7
2022-02-03Missing newline in errors in bun installGravatar Jarred Sumner 1-4/+8
2022-02-03Fix bug with http clientGravatar Jarred Sumner 6-107/+101
2022-02-03Move detectFastRefresh to later so HTTP request handler starts fasterGravatar Jarred Sumner 1-2/+1
2022-02-03Fix bug with macro remaps in Bun.Transpiler apiGravatar Jarred Sumner 2-5/+8
2022-02-03Slight improvement to non-ascii file path handlingGravatar Jarred Sumner 4-18/+79
2022-02-02`path.relative` passes Node's tests (which also fixed bugs)Gravatar Jarred Sumner 8-283/+571