• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  *  Copyright (C) 2001-2003 Hewlett-Packard Co.
4  *      Contributed by Stephane Eranian <eranian@hpl.hp.com>
5  *
6  *  Copyright (C) 2001 Silicon Graphics, Inc.
7  *      Contributed by Brent Casavant <bcasavan@sgi.com>
8  *
9  *  Copyright (C) 2006-2009 Intel Corporation
10  *      Contributed by Fenghua Yu <fenghua.yu@intel.com>
11  *      Contributed by Bibo Mao <bibo.mao@intel.com>
12  *      Contributed by Chandramouli Narayanan <mouli@linux.intel.com>
13  *
14  * This file is part of the ELILO, the EFI Linux boot loader.
15  *
16  *  ELILO is free software; you can redistribute it and/or modify
17  *  it under the terms of the GNU General Public License as published by
18  *  the Free Software Foundation; either version 2, or (at your option)
19  *  any later version.
20  *
21  *  ELILO is distributed in the hope that it will be useful,
22  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
23  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  *  GNU General Public License for more details.
25  *
26  *  You should have received a copy of the GNU General Public License
27  *  along with ELILO; see the file COPYING.  If not, write to the Free
28  *  Software Foundation, 59 Temple Place - Suite 330, Boston, MA
29  *  02111-1307, USA.
30  *
31  * Please check out the elilo.txt for complete documentation on how
32  * to use this program.
33  */
34 
35 
36 #include <efi.h>
37 #include <efilib.h>
38 #include <argify.h>
39 
40 
41 
42 #define	MAX_ARGS 256
43 
44 #define CHAR_SPACE L' '
45 
46 #define DEBUG 0
47 
48 INTN
argify(CHAR16 * buf,UINTN len,CHAR16 ** argv)49 argify(CHAR16 *buf, UINTN len, CHAR16 **argv)
50 {
51 
52         UINTN     i=0, j=0;
53         CHAR16   *p = buf;
54 
55         if (buf == 0) {
56 		argv[0] = NULL;
57 		return 0;
58 	}
59 	/* len represents the number of bytes, not the number of 16 bytes chars */
60 	len = len >> 1;
61 
62 	/*
63 	 * Here we use CHAR_NULL as the terminator rather than the length
64 	 * because it seems like the EFI shell return rather bogus values for it.
65 	 * Apparently, we are guaranteed to find the '\0' character in the buffer
66 	 * where the real input arguments stop, so we use it instead.
67 	 */
68 	for(;;) {
69 		while (buf[i] == CHAR_SPACE && buf[i] != CHAR_NULL && i < len) i++;
70 
71 		if (buf[i] == CHAR_NULL || i == len) goto end;
72 
73 		p = buf+i;
74 		i++;
75 
76 		while (buf[i] != CHAR_SPACE && buf[i] != CHAR_NULL && i < len) i++;
77 
78 		argv[j++] = p;
79 
80 		if (buf[i] == CHAR_NULL) goto end;
81 
82 		buf[i]  = CHAR_NULL;
83 
84 		if (i == len)  goto end;
85 
86 		i++;
87 
88 		if (j == MAX_ARGS-1) {
89 			Print(L"too many arguments (%d) truncating\n", j);
90 			goto end;
91 		}
92 	}
93 end:
94         argv[j] = NULL;
95 	return j;
96 }
97 
98