1.1 --- a/sourcepawn/vm/sp_vm.c Sun Aug 06 18:38:00 2006 +0000
1.2 +++ b/sourcepawn/vm/sp_vm.c Sun Aug 06 23:08:02 2006 +0000
1.3 @@ -403,10 +403,6 @@
1.4 }
1.5
1.6 memcpy(ph_addr, array, numcells * sizeof(cell_t));
1.7 - if (phys_addr)
1.8 - {
1.9 - *phys_addr = ph_addr;
1.10 - }
1.11
1.12 if ((err = SP_PushCell(ctx, *local_addr)) != SP_ERR_NONE)
1.13 {
1.14 @@ -414,6 +410,11 @@
1.15 return err;
1.16 }
1.17
1.18 + if (phys_addr)
1.19 + {
1.20 + *phys_addr = ph_addr;
1.21 + }
1.22 +
1.23 return SP_ERR_NONE;
1.24 }
1.25
1.26 @@ -467,16 +468,43 @@
1.27 }
1.28 ph_addr[numcells] = '\0';
1.29
1.30 - if (phys_addr)
1.31 - {
1.32 - *phys_addr = ph_addr;
1.33 - }
1.34 -
1.35 if ((err = SP_PushCell(ctx, *local_addr)) != SP_ERR_NONE)
1.36 {
1.37 SP_HeapRelease(ctx, *local_addr);
1.38 return err;
1.39 }
1.40
1.41 + if (phys_addr)
1.42 + {
1.43 + *phys_addr = ph_addr;
1.44 + }
1.45 +
1.46 return SP_ERR_NONE;
1.47 }
1.48 +
1.49 +int SP_StringToLocal(sp_context_t *ctx, cell_t local_addr, size_t chars, const char *source)
1.50 +{
1.51 + cell_t *dest;
1.52 + size_t i, len;
1.53 +
1.54 + if (((local_addr >= ctx->hp) && (local_addr < ctx->sp)) || (local_addr < 0) || ((ucell_t)local_addr >= ctx->memory))
1.55 + {
1.56 + return SP_ERR_INVALID_ADDRESS;
1.57 + }
1.58 +
1.59 + len = strlen(source);
1.60 + dest = (cell_t *)(ctx->data + local_addr);
1.61 +
1.62 + if (len >= chars)
1.63 + {
1.64 + len = chars - 1;
1.65 + }
1.66 +
1.67 + for (i=0; i<len; i++)
1.68 + {
1.69 + dest[i] = (cell_t)source[i];
1.70 + }
1.71 + dest[len] = '\0';
1.72 +
1.73 + return SP_ERR_NONE;
1.74 +}