On Thu, Feb 04, 2010 at 05:34:36PM +0000, Matthew Booth wrote:
> + int prompt = isatty (0) ? 2 : 0;
You've already got this in a global. In fact, I can't see it used
anywhere. Doesn't this generate a warning?
Yup, this is a bug -- removed -- thanks.
> + buf = rl_gets (" key> ");
> + buf = rl_gets ("value> ");
Why no indentation on this prompt, as for key?
So they line up ^^^
> + if (!buf) {
> + fprintf (stderr, _("hivexsh: setval: unexpected end of input\n"));
> + quit = 1;
> + goto error;
> + }
> +
> + if (STREQ (buf, "none")) {
> + values[i].t = hive_t_none;
> + values[i].len = 0;
> + }
> + else if (STRPREFIX (buf, "string:")) {
> + buf += 7;
> + values[i].t = hive_t_string;
> + int nr_chars = strlen (buf);
> + values[i].len = 2 * (nr_chars + 1);
> + values[i].value = malloc (values[i].len);
> + if (!values[i].value) {
> + perror ("malloc");
> + exit (EXIT_FAILURE);
> + }
> + for (j = 0; j <= /* sic */ nr_chars; ++j) {
> + if (buf[j] & 0x80) {
> + fprintf (stderr, _("hivexsh: string(utf16le): only 7 bit ASCII
strings are supported for input\n"));
> + goto error;
> + }
> + values[i].value[2*j] = buf[j];
> + values[i].value[2*j+1] = '\0';
There must be a library function to do the above. Where does the 7 bit
ASCII restriction come from?
There's iconv, but that's even crazier than doing it by hand. This is
fine for 7 bit ASCII, but would break if you pass in UTF-8 (hence the
check that no high bits are set).
This doesn't look like regedit's expandstring format.
What's the purpose
of it?
> + else if (STRPREFIX (buf, "expandstring:")) {
Not sure what you mean -- expandstring is a separate type in the
hive. We don't care about what regedit may or may not do.
> + xerr = xstrtol (buf, NULL, 0, &n, "");
Does xstrtol support 0x notation?
Yes.
> +#if 0
> + if (n < 0 || n > UINT64_MAX) {
> + fprintf (stderr, _("%s: %s: integer out of range\n"),
> + "setval", "dword");
> + goto error;
> + }
> +#endif
Why have you commented this out?
You can't test a 64 bit int against UINT64_MAX. In any case it's just
documentation of what the limits are.
> + for (j = 0; *buf && j < 2; buf++) {
> + if (c_isxdigit (*buf)) { /* NB: ignore non-hex digits. */
The documentation defines the limiter to be a comma. I'd stick to this
strictly, making it more likely to catch typos.
The documentation just says that non-hex digits are ignored, and I
can't be bothered to code more complex parsing here.
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
New in Fedora 11: Fedora Windows cross-compiler. Compile Windows
programs, test, and build Windows installers. Over 70 libraries supprt'd
http://fedoraproject.org/wiki/MinGW http://www.annexia.org/fedora_mingw