Skip to content

Commit

Permalink
Fix #3616 - stringAppend missing in FMU
Browse files Browse the repository at this point in the history
  • Loading branch information
sjoelund authored and OpenModelica-Hudson committed Feb 5, 2016
1 parent 5fcced9 commit 1b64dc0
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 35 deletions.
33 changes: 0 additions & 33 deletions SimulationRuntime/c/meta/meta_modelica_builtin.c
Expand Up @@ -389,39 +389,6 @@ modelica_metatype boxptr_stringUpdateStringChar(threadData_t *threadData,metamod
return res;
}

metamodelica_string_const stringAppend(metamodelica_string_const s1, metamodelica_string_const s2)
{
unsigned len1 = 0, len2 = 0, nbytes = 0, header = 0, nwords = 0;
void *res = NULL;
struct mmc_string *p = NULL;
MMC_CHECK_STRING(s1);
MMC_CHECK_STRING(s2);

/* fprintf(stderr, "stringAppend([%p] %s, [%p] %s)->\n", s1, anyString(s1), s2, anyString(s2)); fflush(NULL); */
len1 = MMC_STRLEN(s1);
len2 = MMC_STRLEN(s2);

if (len1==0) {
return s2;
} else if (len2==0) {
return s1;
}

nbytes = len1+len2;
header = MMC_STRINGHDR(nbytes);
nwords = MMC_HDRSLOTS(header) + 1;
p = (struct mmc_string *) mmc_alloc_words_atomic(nwords);
/* fprintf(stderr, "at address %p\n", MMC_TAGPTR(p)); fflush(NULL); */
p->header = header;

memcpy(p->data, MMC_STRINGDATA(s1), len1);
memcpy(p->data + len1, MMC_STRINGDATA(s2), len2 + 1);
res = MMC_TAGPTR(p);
MMC_CHECK_STRING(res);
/* fprintf(stderr, "-> %s\n", anyString(res)); fflush(NULL); */
return res;
}

/* List Operations */

modelica_metatype listReverse(modelica_metatype lst)
Expand Down
3 changes: 1 addition & 2 deletions SimulationRuntime/c/meta/meta_modelica_builtin.h
Expand Up @@ -58,13 +58,12 @@ extern modelica_integer nobox_stringCharInt(threadData_t *threadData,metamodelic
#define intStringChar(X) nobox_intStringChar(threadData,X)
extern metamodelica_string nobox_intStringChar(threadData_t *threadData,modelica_integer ix);

/* String Operations */
/* String Operations (MM extensions only) */
#define stringInt(x) nobox_stringInt(threadData,x)
#define stringReal(x) nobox_stringReal(threadData,x)
extern modelica_integer nobox_stringInt(threadData_t*,metamodelica_string s);
extern modelica_real nobox_stringReal(threadData_t*,metamodelica_string s);
extern modelica_metatype stringListStringChar(metamodelica_string s);
extern metamodelica_string_const stringAppend(metamodelica_string_const s1,metamodelica_string_const s2);
extern metamodelica_string stringAppendList(modelica_metatype lst);
extern metamodelica_string stringDelimitList(modelica_metatype lst,metamodelica_string_const delimiter);
#define stringLength(x) MMC_STRLEN(x)
Expand Down
29 changes: 29 additions & 0 deletions SimulationRuntime/c/util/modelica_string.c
Expand Up @@ -326,3 +326,32 @@ int GC_asprintf(char **strp, const char *fmt, ...) {
va_end(ap);
return len;
}

modelica_string stringAppend(modelica_string s1, modelica_string s2)
{
unsigned len1 = 0, len2 = 0, nbytes = 0, header = 0, nwords = 0;
void *res = NULL;
struct mmc_string *p = NULL;
MMC_CHECK_STRING(s1);
MMC_CHECK_STRING(s2);

/* fprintf(stderr, "stringAppend([%p] %s, [%p] %s)->\n", s1, anyString(s1), s2, anyString(s2)); fflush(NULL); */
len1 = MMC_STRLEN(s1);
len2 = MMC_STRLEN(s2);

if (len1==0) {
return s2;
} else if (len2==0) {
return s1;
}

nbytes = len1+len2;
res = mmc_alloc_scon(nbytes);

memcpy(MMC_STRINGDATA(res), MMC_STRINGDATA(s1), len1);
memcpy(MMC_STRINGDATA(res) + len1, MMC_STRINGDATA(s2), len2 + 1);

MMC_CHECK_STRING(res);

return res;
}
1 change: 1 addition & 0 deletions SimulationRuntime/c/util/modelica_string.h
Expand Up @@ -38,6 +38,7 @@
#include "meta/meta_modelica_data.h"
#include "modelica_string_lit.h"

extern modelica_string stringAppend(modelica_string s1, modelica_string s2);
#define stringCompare(x,y) mmc_stringCompare(x,y)
#define stringEqual(x,y) (MMC_STRLEN(x) == MMC_STRLEN(y) && !stringCompare(x,y))

Expand Down

0 comments on commit 1b64dc0

Please sign in to comment.