176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  Copyright (C) 2001-2003 Hewlett-Packard Co.
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *      Contributed by Stephane Eranian <eranian@hpl.hp.com>
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  Copyright (C) 2001 Silicon Graphics, Inc.
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *      Contributed by Brent Casavant <bcasavan@sgi.com>
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  Copyright (C) 2006-2009 Intel Corporation
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *      Contributed by Fenghua Yu <fenghua.yu@intel.com>
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *      Contributed by Bibo Mao <bibo.mao@intel.com>
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *      Contributed by Chandramouli Narayanan <mouli@linux.intel.com>
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This file is part of the ELILO, the EFI Linux boot loader.
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  ELILO is free software; you can redistribute it and/or modify
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  it under the terms of the GNU General Public License as published by
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  the Free Software Foundation; either version 2, or (at your option)
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  any later version.
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  ELILO is distributed in the hope that it will be useful,
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  but WITHOUT ANY WARRANTY; without even the implied warranty of
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  GNU General Public License for more details.
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  You should have received a copy of the GNU General Public License
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  along with ELILO; see the file COPYING.  If not, write to the Free
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  02111-1307, USA.
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Please check out the elilo.txt for complete documentation on how
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * to use this program.
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <efi.h>
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <efilib.h>
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <argify.h>
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define	MAX_ARGS 256
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define CHAR_SPACE L' '
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DEBUG 0
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanINTN
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanargify(CHAR16 *buf, UINTN len, CHAR16 **argv)
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        UINTN     i=0, j=0;
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        CHAR16   *p = buf;
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (buf == 0) {
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		argv[0] = NULL;
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return 0;
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/* len represents the number of bytes, not the number of 16 bytes chars */
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	len = len >> 1;
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/*
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * Here we use CHAR_NULL as the terminator rather than the length
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * because it seems like the EFI shell return rather bogus values for it.
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * Apparently, we are guaranteed to find the '\0' character in the buffer
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * where the real input arguments stop, so we use it instead.
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	for(;;) {
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		while (buf[i] == CHAR_SPACE && buf[i] != CHAR_NULL && i < len) i++;
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		if (buf[i] == CHAR_NULL || i == len) goto end;
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		p = buf+i;
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		i++;
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		while (buf[i] != CHAR_SPACE && buf[i] != CHAR_NULL && i < len) i++;
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		argv[j++] = p;
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		if (buf[i] == CHAR_NULL) goto end;
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		buf[i]  = CHAR_NULL;
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		if (i == len)  goto end;
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		i++;
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		if (j == MAX_ARGS-1) {
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			Print(L"too many arguments (%d) truncating\n", j);
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			goto end;
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		}
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanend:
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        argv[j] = NULL;
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return j;
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
98