123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /* go-string-to-int-array.c -- convert a string to an array of ints in Go.
- Copyright 2010 The Go Authors. All rights reserved.
- Use of this source code is governed by a BSD-style
- license that can be found in the LICENSE file. */
- #include "runtime.h"
- #include "go-alloc.h"
- #include "go-string.h"
- #include "array.h"
- #include "arch.h"
- #include "malloc.h"
- struct __go_open_array
- __go_string_to_int_array (String str)
- {
- size_t c;
- const unsigned char *p;
- const unsigned char *pend;
- uintptr mem;
- uint32_t *data;
- uint32_t *pd;
- struct __go_open_array ret;
- c = 0;
- p = str.str;
- pend = p + str.len;
- while (p < pend)
- {
- int rune;
- ++c;
- p += __go_get_rune (p, pend - p, &rune);
- }
- if (c > MaxMem / sizeof (uint32_t))
- runtime_throw ("out of memory");
- mem = runtime_roundupsize (c * sizeof (uint32_t));
- data = (uint32_t *) runtime_mallocgc (mem, 0, FlagNoScan | FlagNoZero);
- p = str.str;
- pd = data;
- while (p < pend)
- {
- int rune;
- p += __go_get_rune (p, pend - p, &rune);
- *pd++ = rune;
- }
- if (mem > (uintptr) c * sizeof (uint32_t))
- __builtin_memset (data + c, 0, mem - (uintptr) c * sizeof (uint32_t));
- ret.__values = (void *) data;
- ret.__count = c;
- ret.__capacity = (intgo) (mem / sizeof (uint32_t));
- return ret;
- }
|