1 1.7 jakllsch /* $NetBSD: parseutils.c,v 1.7 2014/01/05 20:52:57 jakllsch Exp $ */ 2 1.1 drochner 3 1.1 drochner /* 4 1.1 drochner * Copyright (c) 1996, 1997 5 1.1 drochner * Matthias Drochner. All rights reserved. 6 1.1 drochner * Copyright (c) 1996, 1997 7 1.1 drochner * Perry E. Metzger. All rights reserved. 8 1.1 drochner * Copyright (c) 1997 9 1.1 drochner * Jason R. Thorpe. All rights reserved 10 1.1 drochner * 11 1.1 drochner * Redistribution and use in source and binary forms, with or without 12 1.1 drochner * modification, are permitted provided that the following conditions 13 1.1 drochner * are met: 14 1.1 drochner * 1. Redistributions of source code must retain the above copyright 15 1.1 drochner * notice, this list of conditions and the following disclaimer. 16 1.1 drochner * 2. Redistributions in binary form must reproduce the above copyright 17 1.1 drochner * notice, this list of conditions and the following disclaimer in the 18 1.1 drochner * documentation and/or other materials provided with the distribution. 19 1.1 drochner * 3. All advertising materials mentioning features or use of this software 20 1.1 drochner * must display the following acknowledgements: 21 1.1 drochner * This product includes software developed for the NetBSD Project 22 1.1 drochner * by Matthias Drochner. 23 1.1 drochner * This product includes software developed for the NetBSD Project 24 1.1 drochner * by Perry E. Metzger. 25 1.1 drochner * 4. The names of the authors may not be used to endorse or promote products 26 1.1 drochner * derived from this software without specific prior written permission. 27 1.1 drochner * 28 1.1 drochner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 29 1.1 drochner * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 30 1.1 drochner * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 31 1.1 drochner * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 32 1.1 drochner * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 33 1.1 drochner * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 34 1.1 drochner * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 35 1.1 drochner * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 36 1.1 drochner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 37 1.1 drochner * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 38 1.1 drochner */ 39 1.1 drochner 40 1.1 drochner #include <lib/libkern/libkern.h> 41 1.1 drochner #include <lib/libsa/stand.h> 42 1.3 jdolecek #include <sys/boot_flag.h> 43 1.1 drochner 44 1.1 drochner #include "libi386.h" 45 1.1 drochner 46 1.1 drochner /* 47 1.1 drochner * chops the head from the arguments and returns the arguments if any, 48 1.1 drochner * or possibly an empty string. 49 1.1 drochner */ 50 1.1 drochner char * 51 1.5 christos gettrailer(char *arg) 52 1.1 drochner { 53 1.1 drochner char *options; 54 1.1 drochner 55 1.6 christos for (options = arg; *options; options++) { 56 1.6 christos switch (*options) { 57 1.6 christos case ' ': 58 1.6 christos case '\t': 59 1.6 christos *options++ = '\0'; 60 1.6 christos break; 61 1.6 christos default: 62 1.6 christos continue; 63 1.6 christos } 64 1.6 christos break; 65 1.6 christos } 66 1.6 christos if (*options == '\0') 67 1.7 jakllsch return options; 68 1.1 drochner 69 1.6 christos /* trim leading blanks/tabs */ 70 1.6 christos while (*options == ' ' || *options == '\t') 71 1.1 drochner options++; 72 1.1 drochner 73 1.5 christos return options; 74 1.1 drochner } 75 1.1 drochner 76 1.1 drochner int 77 1.5 christos parseopts(const char *opts, int *howto) 78 1.1 drochner { 79 1.1 drochner int r, tmpopt = 0; 80 1.1 drochner 81 1.1 drochner opts++; /* skip - */ 82 1.4 christos while (*opts) { 83 1.3 jdolecek r = 0; 84 1.3 jdolecek BOOT_FLAG(*opts, r); 85 1.3 jdolecek if (r == 0) { 86 1.1 drochner printf("-%c: unknown flag\n", *opts); 87 1.1 drochner command_help(NULL); 88 1.5 christos return 0; 89 1.1 drochner } 90 1.1 drochner tmpopt |= r; 91 1.1 drochner opts++; 92 1.4 christos if (*opts == ' ' || *opts == '\t') { 93 1.4 christos do 94 1.4 christos opts++; /* skip whitespace */ 95 1.4 christos while (*opts == ' ' || *opts == '\t'); 96 1.4 christos if (*opts == '-') 97 1.4 christos opts++; /* skip - */ 98 1.4 christos else if (*opts != '\0') { 99 1.4 christos printf("invalid arguments\n"); 100 1.4 christos command_help(NULL); 101 1.5 christos return 0; 102 1.4 christos } 103 1.4 christos } 104 1.1 drochner } 105 1.1 drochner 106 1.1 drochner *howto = tmpopt; 107 1.5 christos return 1; 108 1.1 drochner } 109 1.1 drochner 110 1.1 drochner int 111 1.5 christos parseboot(char *arg, char **filename, int *howto) 112 1.1 drochner { 113 1.1 drochner char *opts = NULL; 114 1.1 drochner 115 1.1 drochner *filename = 0; 116 1.1 drochner *howto = 0; 117 1.1 drochner 118 1.1 drochner /* if there were no arguments */ 119 1.1 drochner if (!*arg) 120 1.5 christos return 1; 121 1.1 drochner 122 1.1 drochner /* format is... */ 123 1.3 jdolecek /* [[xxNx:]filename] [-adqsv] */ 124 1.1 drochner 125 1.1 drochner /* check for just args */ 126 1.1 drochner if (arg[0] == '-') 127 1.1 drochner opts = arg; 128 1.1 drochner else { 129 1.1 drochner /* there's a file name */ 130 1.1 drochner *filename = arg; 131 1.1 drochner 132 1.1 drochner opts = gettrailer(arg); 133 1.1 drochner if (!*opts) 134 1.1 drochner opts = NULL; 135 1.1 drochner else if (*opts != '-') { 136 1.1 drochner printf("invalid arguments\n"); 137 1.1 drochner command_help(NULL); 138 1.5 christos return 0; 139 1.1 drochner } 140 1.1 drochner } 141 1.1 drochner 142 1.1 drochner /* at this point, we have dealt with filenames. */ 143 1.1 drochner 144 1.1 drochner /* now, deal with options */ 145 1.1 drochner if (opts) { 146 1.1 drochner if (parseopts(opts, howto) == 0) 147 1.5 christos return 0; 148 1.1 drochner } 149 1.1 drochner 150 1.5 christos return 1; 151 1.1 drochner } 152