From cc7b9b34e99fa17357e14ac69f5fb2d1535b5512 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Tue, 3 Mar 2026 07:22:19 +0000 Subject: Added all built-in functions --- lib/CodeGen/StringHandler.cc | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'lib/CodeGen/StringHandler.cc') diff --git a/lib/CodeGen/StringHandler.cc b/lib/CodeGen/StringHandler.cc index fda9ea5..f777059 100644 --- a/lib/CodeGen/StringHandler.cc +++ b/lib/CodeGen/StringHandler.cc @@ -112,6 +112,35 @@ Value *StringHandler::emitRight(Value *Str, Value *Len) { return NewStrMem; } +Value *StringHandler::emitLeft(Value *Str, Value *Len) { + Value *FullLen = emitLength(Str); + if (Len->getType()->isIntegerTy() && Len->getType()->getIntegerBitWidth() != 64) { + Len = Builder.CreateSExt(Len, Type::getInt64Ty(Context), "len_ext"); + } + else if (Len->getType()->isDoubleTy()) { + Len = Builder.CreateFPToSI(Len, Type::getInt64Ty(Context), "len_int"); + } + + Value *Zero = ConstantInt::get(Context, APInt(64, 0)); + Value *IsNeg = Builder.CreateICmpSLT(Len, Zero); + Value *SafeLen = Builder.CreateSelect(IsNeg, Zero, Len); + + Value *IsTooBig = Builder.CreateICmpSGT(SafeLen, FullLen); + Value *ActualLen = Builder.CreateSelect(IsTooBig, FullLen, SafeLen); + + Value *One = ConstantInt::get(Context, APInt(64, 1)); + Value *AllocSize = Builder.CreateAdd(ActualLen, One); + Value *NewStrMem = Builder.CreateCall(MallocFunc, AllocSize, "left_str_mem"); + + std::vector Args = {NewStrMem, Str, ActualLen}; + Builder.CreateCall(MemCpyFunc, Args); + + Value *NullTermPtr = Builder.CreateInBoundsGEP(Type::getInt8Ty(Context), NewStrMem, ActualLen); + Builder.CreateStore(ConstantInt::get(Type::getInt8Ty(Context), 0), NullTermPtr); + + return NewStrMem; +} + Value *StringHandler::emitLCase(Value *Str) { Value *Len = emitLength(Str); Value *One = ConstantInt::get(Context, APInt(64, 1)); -- cgit v1.3.1-4-g156e