@abaplint/runtime
Version:
Transpiler - Runtime
124 lines • 3.77 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Character = void 0;
const _parse_1 = require("../operators/_parse");
const throw_error_1 = require("../throw_error");
const field_symbol_1 = require("./field_symbol");
const structure_1 = require("./structure");
const integer_1 = require("./integer");
const TRIMREGEX = / *$/;
class Character {
constructor(length, extra) {
this.constant = false;
this.length = length || 1;
if (typeof this.length === "object") {
throw "Character, invalid length, object: " + JSON.stringify(this.length);
}
else if (this.length <= 0) {
throw "Character, invalid length, less than zero";
}
this.extra = extra;
this.clear();
}
clone() {
const n = new Character(this.length, this.extra);
// set without trigger checks and padding
n.value = this.value;
return n;
}
setConstant() {
this.constant = true;
return this;
}
set(value) {
if (this.constant === true) {
throw new Error("Changing constant");
}
if (typeof value === "string") {
this.value = value;
}
else if (typeof value === "number") {
this.value = value + "";
}
else if (value instanceof field_symbol_1.FieldSymbol) {
if (value.getPointer() === undefined) {
throw new Error("GETWA_NOT_ASSIGNED");
}
this.set(value.getPointer());
return this;
}
else if (value instanceof structure_1.Structure) {
this.set(value.getCharacter());
return this;
}
else if (value instanceof integer_1.Integer) {
this.value = Math.abs(value.get()) + (value.get() < 0 ? "-" : " ");
this.value = this.value.padStart(this.length, " ");
}
else {
this.value = value.get() + "";
}
if (this.value.length > this.length) {
this.value = this.value.substr(0, this.length);
}
else if (this.value.length < this.length) {
this.value = this.value.padEnd(this.length, " ");
}
return this;
}
getQualifiedName() {
return this.extra?.qualifiedName;
}
getConversionExit() {
return this.extra?.conversionExit;
}
getDDICName() {
return this.extra?.ddicName;
}
getLength() {
return this.length;
}
clear() {
this.value = " ".repeat(this.length);
}
get() {
return this.value;
}
getTrimEnd() {
if (this.value.endsWith(" ") === true) {
return this.value.replace(TRIMREGEX, "");
}
else {
return this.value;
}
}
getOffset(input) {
let offset = input?.offset;
if (offset) {
offset = (0, _parse_1.parse)(offset);
}
let length = input?.length;
if (length) {
length = (0, _parse_1.parse)(length);
}
if ((offset && offset >= this.length)
|| (length && length > this.length)
|| (offset && length && offset + length > this.length)
|| (offset && offset < 0)
|| (length && length < 0)) {
(0, throw_error_1.throwError)("CX_SY_RANGE_OUT_OF_BOUNDS");
}
let ret = this.value;
if (offset) {
ret = ret.substr(offset);
}
if (length !== undefined) {
ret = ret.substr(0, length);
}
const r = new Character(ret.length);
r.set(ret);
return r;
}
}
exports.Character = Character;
//# sourceMappingURL=character.js.map