From e5f821dc1ca221c89743eaa3c4c4521f301cf638 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Anian=20B=C3=BChler?=
 <anian.buehler@reutlingen-university.de>
Date: Wed, 2 Feb 2022 17:28:28 +0100
Subject: [PATCH] added ArrayReferenceBlock (&array[1])

---
 .../block/arrays/ArrayReferenceBlock.java     | 48 +++++++++++++++++++
 .../com/ardublock/block/ardublock.properties  |  1 +
 .../com/ardublock/block/ardublock.xml         | 31 ++++++++++++
 .../ardublock/block/ardublock_de.properties   |  5 ++
 .../block/ardublock_en_GB.properties          |  5 ++
 .../ardublock/block/block-mapping.properties  |  2 +
 6 files changed, 92 insertions(+)
 create mode 100644 src/main/java/com/ardublock/translator/block/arrays/ArrayReferenceBlock.java

diff --git a/src/main/java/com/ardublock/translator/block/arrays/ArrayReferenceBlock.java b/src/main/java/com/ardublock/translator/block/arrays/ArrayReferenceBlock.java
new file mode 100644
index 0000000..572cc51
--- /dev/null
+++ b/src/main/java/com/ardublock/translator/block/arrays/ArrayReferenceBlock.java
@@ -0,0 +1,48 @@
+package com.ardublock.translator.block.arrays;
+
+
+import java.util.ResourceBundle;
+
+import com.ardublock.translator.Translator;
+import com.ardublock.translator.block.TranslatorBlock;
+import com.ardublock.translator.block.exception.BlockException;
+import com.ardublock.translator.block.exception.SocketNullException;
+import com.ardublock.translator.block.exception.SubroutineNotDeclaredException;
+import com.ardublock.translator.block.numbers.ConstantStringBlock;
+import com.ardublock.translator.block.numbers.LocalVariableStringBlock;
+import com.ardublock.translator.block.numbers.NumberBlock;
+import com.ardublock.translator.block.numbers.StringBlock;
+import com.ardublock.translator.block.numbers.VariableStringBlock;
+
+public class ArrayReferenceBlock extends TranslatorBlock
+{
+	private static ResourceBundle uiMessageBundle = ResourceBundle.getBundle("com/ardublock/block/ardublock");
+	
+	public ArrayReferenceBlock(Long blockId, Translator translator, String codePrefix, String codeSuffix, String label)
+	{
+		super(blockId, translator, codePrefix, codeSuffix, label);
+	}
+
+	@Override
+	public String toCode() throws SocketNullException, SubroutineNotDeclaredException
+	{
+		TranslatorBlock tb_name   = this.getRequiredTranslatorBlockAtSocket(0);
+		TranslatorBlock tb_offset = this.getRequiredTranslatorBlockAtSocket(1);
+
+		String arrayName       = tb_name.toCode();
+		String referenceOffset = tb_offset.toCode();
+
+
+		if ((tb_name instanceof StringBlock) || (tb_name instanceof NumberBlock)) {
+		      throw new BlockException(blockId, uiMessageBundle.getString("ardublock.error_msg.var_slot"));
+		    }
+
+		String ret = "&"+arrayName+"[" + referenceOffset + "]";
+
+		return ret;
+	}
+
+}
+
+
+
diff --git a/src/main/resources/com/ardublock/block/ardublock.properties b/src/main/resources/com/ardublock/block/ardublock.properties
index b1364cb..41f440b 100644
--- a/src/main/resources/com/ardublock/block/ardublock.properties
+++ b/src/main/resources/com/ardublock/block/ardublock.properties
@@ -106,6 +106,7 @@ ardublock.error_msg.char_var_slot=Char variable slot must take a char variable n
 ardublock.error_msg.array_var_slot='Array variable' slot must take an 'array variable' name.\nHint: Look at the 'variable' socket on the highlighted block
 ardublock.error_msg.array_size_slot='Array size' slot must take a standard integer constant
 ardublock.error_msg.string_var_slot=String variable slot must take a String variable name.\nHint: Look at the 'variable' socket on the highlighted block
+ardublock.error_msg.var_slot= The slot must take an variable-block
 ardublock.error_msg.string_slot=String slot must take a String variable or a String variable name.\nHint: Look at the 'variable' socket on the highlighted block
 ardublock.error_msg.Digital_pin_slot=Pin# must be a valid digital pin number found on an Arduino Board
 ardublock.error_msg.Analog_pin_slot=Pin# must be a valid analog input pin number found on an Arduino Board
diff --git a/src/main/resources/com/ardublock/block/ardublock.xml b/src/main/resources/com/ardublock/block/ardublock.xml
index 979ca2c..6b92bb4 100644
--- a/src/main/resources/com/ardublock/block/ardublock.xml
+++ b/src/main/resources/com/ardublock/block/ardublock.xml
@@ -2260,6 +2260,35 @@
 				</BlockConnector>
 			</BlockConnectors>
 		</BlockGenus>
+		<BlockGenus name="reference_string" kind="data" color="200 0 0" initlabel="bg.reference_string">
+			<description>
+				<text>reference_string</text>
+			</description>
+			<BlockConnectors>
+				<BlockConnector connector-type="string" connector-kind="plug" />
+				<BlockConnector connector-type="string" connector-kind="socket" label="bc.string">
+					<DefaultArg genus-name="variable_string" label="Name_der_Zeichenkette" />
+				</BlockConnector>
+				<BlockConnector connector-type="number" connector-kind="socket" label="offset">
+					<DefaultArg genus-name="number" label="0" />
+				</BlockConnector>
+			</BlockConnectors>
+		</BlockGenus>
+		<BlockGenus name="reference_number" kind="data" color="200 0 0" initlabel="bg.reference_number">
+			<description>
+				<text>reference_number</text>
+			</description>
+			<BlockConnectors>
+				<BlockConnector connector-type="number" connector-kind="plug" />
+				<BlockConnector connector-type="number" connector-kind="socket" label="bc.string">
+					<DefaultArg genus-name="variable_number" label="Name_der_Tabelle" />
+				</BlockConnector>
+				<BlockConnector connector-type="number" connector-kind="socket" label="offset">
+					<DefaultArg genus-name="number" label="0" />
+				</BlockConnector>
+			</BlockConnectors>
+		</BlockGenus>
+		
 	    
 		<!-- ******************** Communication *************** -->
 		<BlockGenus name="communicationDivider1" kind="command" is-starter="yes" is-terminator="yes" initlabel="bg.communicationDivider1" color="150 150 150" />
@@ -3450,6 +3479,8 @@
 				<BlockGenusMember>memcpy_string</BlockGenusMember>
 				<BlockGenusMember>memset_string</BlockGenusMember>
 				<BlockGenusMember>strcpy_string</BlockGenusMember>
+				<BlockGenusMember>reference_string</BlockGenusMember>
+				<BlockGenusMember>reference_number</BlockGenusMember>
 			</BlockDrawer>
 			
 			<BlockDrawer button-color="165 42 42" name="bd.communication" type="default">
diff --git a/src/main/resources/com/ardublock/block/ardublock_de.properties b/src/main/resources/com/ardublock/block/ardublock_de.properties
index ae404af..02ef6e9 100644
--- a/src/main/resources/com/ardublock/block/ardublock_de.properties
+++ b/src/main/resources/com/ardublock/block/ardublock_de.properties
@@ -109,6 +109,7 @@ ardublock.error_msg.array_var_slot=Der 'Variable'-Sockel ben
 ardublock.error_msg.array_size_slot=Der 'Größe' Slot muss einen analogen Wert enthalten
 ardublock.error_msg.string_var_slot=Der 'Variable'-Slot benötigt einen 'Name_der_String_Variable'-Block.\nTIPP: Schaue an dem 'Variable' Sockel an dem hervorgehobenen Block!
 ardublock.error_msg.string_slot= Der 'Wert'-Slot benötigt einen 'String_Variable'-Block oder einen 'Name_der_String_Variable'-Block.\nTIPP: Schaue an dem 'Variable' Sockel an dem hervorgehobenen Block!
+ardublock.error_msg.var_slot= Der Slot benötigt einen 'Variable'-Block
 ardublock.error_msg.local_var_slot=Der 'Variable'-Sockel benötigt einen 'lokale_X_Variable'-Block.\nTIPP: Schaue an dem 'Variable' Sockel an dem hervorgehobenen Block!
 ardublock.error_msg.var_value_slot=Der Sockel benötigt einen 'Variable' oder 'Wert'-Block.\nTIPP: Schaue an dem hervorgehobenen Block!
 ardublock.error_msg.var_value_slot=Es ist nur ein Rueckgabeparameter pro Unterprogramm erlaubt!
@@ -719,6 +720,10 @@ bg.memset_string=setze Wert in Tabelle
 bg.memset_string.description=kopiere ein Zeichen/Wert wiederholt in einer Zeichenkette oder Tabelle
 bg.strcpy_string=kopiere Zeichenkette
 bg.strcpy_string.description=kopiere eine Zeichenkette in eine andere
+bg.reference_string=Start der Zeichenkette verschieben
+bg.reference_string.description=Verschiebt die Startposition ab der die Zeichenkette verwendet wird
+bg.reference_number=Start der Tabelle verschieben
+bg.reference_number.description=Verschiebt die Startposition ab der die Tabelle verwendet wird
 
 bc.string=Zeichenkette
 bc.position=Stelle
diff --git a/src/main/resources/com/ardublock/block/ardublock_en_GB.properties b/src/main/resources/com/ardublock/block/ardublock_en_GB.properties
index 58c032b..381420d 100644
--- a/src/main/resources/com/ardublock/block/ardublock_en_GB.properties
+++ b/src/main/resources/com/ardublock/block/ardublock_en_GB.properties
@@ -109,6 +109,7 @@ ardublock.error_msg.array_var_slot=Der 'Variable'-Sockel ben
 ardublock.error_msg.number_const_write=
 ardublock.error_msg.array_size_slot=Der 'Größe' Slot muss einen analogen Wert enthalten
 ardublock.error_msg.string_var_slot=Der 'Variable'-Slot benötigt einen 'Name_der_String_Variable'-Block.\nTIPP: Schaue an dem 'Variable' Sockel an dem hervorgehobenen Block!
+ardublock.error_msg.var_slot= Der Slot benötigt einen 'Variable'-Block
 ardublock.error_msg.string_slot= Der 'Wert'-Slot benötigt einen 'String_Variable'-Block oder einen 'Name_der_String_Variable'-Block.\nTIPP: Schaue an dem 'Variable' Sockel an dem hervorgehobenen Block!
 ardublock.error_msg.local_var_slot=Der 'Variable'-Sockel benötigt einen 'lokale_X_Variable'-Block.\nTIPP: Schaue an dem 'Variable' Sockel an dem hervorgehobenen Block!
 ardublock.error_msg.var_value_slot=Der Sockel benötigt einen 'Variable' oder 'Wert'-Block.\nTIPP: Schaue an dem hervorgehobenen Block!
@@ -718,6 +719,10 @@ bg.memset_string=memset
 bg.memset_string.description=kopiere ein Zeichen/Wert wiederholt in einer Zeichenkette oder Tabelle
 bg.strcpy_string=strcpy
 bg.strcpy_string.description=kopiere eine Zeichenkette in eine andere
+bg.reference_string=Referenz erzeugen
+bg.reference_string.description=Verschiebt die Startposition ab der das char-Array verwendet wird
+bg.reference_number=Referenz erzeugen
+bg.reference_number.description=Verschiebt die Startposition ab der das Array verwendet wird
 
 bc.string=char-Array
 bc.position=Stelle
diff --git a/src/main/resources/com/ardublock/block/block-mapping.properties b/src/main/resources/com/ardublock/block/block-mapping.properties
index cf5ef85..898a557 100644
--- a/src/main/resources/com/ardublock/block/block-mapping.properties
+++ b/src/main/resources/com/ardublock/block/block-mapping.properties
@@ -241,6 +241,8 @@ setter_char_array=com.ardublock.translator.block.arrays.SetterCharArrayBlock
 memcpy_string=com.ardublock.translator.block.arrays.MemcpyBlock
 memset_string=com.ardublock.translator.block.arrays.MemsetBlock
 strcpy_string=com.ardublock.translator.block.arrays.StrcpyBlock
+reference_string=com.ardublock.translator.block.arrays.ArrayReferenceBlock
+reference_number=com.ardublock.translator.block.arrays.ArrayReferenceBlock
 
 #COMMUNICATION
 #****************************
-- 
GitLab