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 48INTN 49argify(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 } 93end: 94 argv[j] = NULL; 95 return j; 96} 97 98