At Friday, 26. April 2019 10:32:34 UTC+2 [email protected] wrote:

    Hello

    I made progress in calling a C function from JavaScript.

   ...

    I had not the time to make tests with getenv() and setenv(), but
    "It compiles so it must be okay". (Copyright Thomas Mertes) :-)
    Feel free to use it for emscripten.


Famous last words ...
Now I had time to do some tests with my C implementations of
getenv() and setenv(). And I have to admit: There was actually
a bug in setenv(). A multiplication with sizeof(char *) was
missing in the realloc...

Below are the newest versions of getenv() and setenv().
Feel free to use them for Emscripten.

-------------------- Begin of code snippet --------------------
char **environ = NULL;


char *getenv (const char *name)

  {
    size_t len;
    char **p, *c;

  /* getenv */
    if (name == NULL || environ == NULL || strchr(name, '=') != NULL) {
      return NULL;
    } else {
      len = strlen(name);
      for (p = environ; (c = *p) != NULL; ++p) {
        if (strncmp(c, name, len) == 0 && c[len] == '=') {
          return &c[len + 1];
        } /* if */
      } /* for */
      return NULL;
    } /* if */
  } /* getenv */


int setenv (const char *name, const char *value, int overwrite)

  {
    size_t len;
    char **p, *c;
    size_t nameCount = 0;

  /* setenv */
    if (name == NULL || name[0] == '\0' || strchr(name, '=') != NULL) {
      errno = EINVAL;
      return -1;
    } else {
      len = strlen(name);
      if (environ != NULL) {
        for (p = environ; (c = *p) != NULL; ++p) {
          nameCount ++;
          if (strncmp(c, name, len) == 0 && c[len] == '=') {
            if (overwrite) {
              if ((*p = realloc(*p, len + strlen(value) + 2)) == NULL) {
                errno = ENOMEM;
                return -1;
              } else {
                strcpy(&c[len + 1], value);
              } /* if */
            } /* if **/
            return 0;
          } /* if */
        } /* for */
      } /* if */
      if ((environ = realloc(environ7, sizeof(char *) * (nameCount + 2))) 
== NULL ||
          (c = malloc(len + strlen(value) + 2)) == NULL) {
        errno = ENOMEM;
        return -1;
      } else {
        memcpy(c, name, len);
        c[len] = '=';
        strcpy(&c[len + 1], value);
        environ[nameCount] = c;
        environ[nameCount + 1] = NULL;
        return 0;
      } /* if */
    } /* if */
  } /* setenv */
-------------------- End of code snippet --------------------

I would really prefer, when the runtime library of emcc
would have a working getenv() and setenv() without

  Error: Environment size exceeded TOTAL_ENV_SIZE!

This is not a way a C run-time function should work.
Artificial limitations like: "The size of the environment
must be less than 1024", should be a thing of the past.

Sorry for the rant. Emscripten is great and I succeed in
compiling the Seed7 interpreter with it. The test programs
for the Seed7 interpreter succeed. The latest release of
Seed7 contains the changes necessary to compile Seed7
with emcc. You can download seed7_05_20190407.tgz from

  https://sourceforge.net/projects/seed7/files/

The file seed7/src/read_me.txt contains detailed
information how to compile Seed7 with emcc.

Many thanks to the developers of Emscripten.
Keep on with the good work.


Regards,
Thomas Mertes

-- 
Seed7 Homepage:  http://seed7.sourceforge.net
Seed7 - The extensible programming language: User defined statements
and operators, abstract data types, templates without special
syntax, OO with interfaces and multiple dispatch, statically typed,
interpreted or compiled, portable, runs under linux/unix/windows.

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to