freebsd-skq/sys/ddb/db_lex.h
cem 17adfbe017 ddb(4): Add some support for lexing IPv6 addresses
Allow commands to specify that (hex) numbers may start with A-F, by adding
the DRT_HEX flag for db_read_token_flags().  As before, numbers containing
invalid digits for the current radix are rejected.

Also, lex ':' and '::' tokens as tCOLON and tCOLONCOLON respectively.

There is a mild conflict here with lexed "identifiers" (tIDENT): ddb
identifiers may contain arbitrary colons, and the ddb lexer is greedy.  So
the identifier lex will swallow any colons it finds inside identifiers, and
consumers are still unable to expect the token sequence 'tIDENT tCOLON'.
That limitation does not matter for IPv6 addresses, because the lexer always
attempts to lex numbers before identifiers.

Reviewed by:	markj
Differential Revision:	https://reviews.freebsd.org/D21509
2019-09-09 16:32:23 +00:00

139 lines
3.3 KiB
C

/*-
* SPDX-License-Identifier: MIT-CMU
*
* Mach Operating System
* Copyright (c) 1991,1990 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
* $FreeBSD$
*/
#ifndef _DDB_DB_LEX_H_
#define _DDB_DB_LEX_H_
/*
* Author: David B. Golub, Carnegie Mellon University
* Date: 7/90
*/
/*
* Lexical analyzer.
*/
/*
* Options and flags can configure db_read_token() => db_lex() behavior.
*
* When a radix other than DRT_DEFAULT_RADIX is used, it overrides
* auto-detection, as well as the user-specified db_radix, in db_lex() of
* 'tNUMBER' tokens.
*/
enum {
/* Infer or use db_radix using the old logic. */
DRT_DEFAULT_RADIX = 0,
/* The following set an explicit base for tNUMBER lex. */
DRT_OCTAL,
DRT_DECIMAL,
DRT_HEXADECIMAL,
};
#define DRT_RADIX_MASK 0x3
/*
* Flag bit powers of two for db_read_token_flags.
* The low 2 bits are reserved for radix selection.
*
* WSPACE: Yield explicit tWSPACE tokens when one or more whitespace characters
* is consumed.
* HEX: Allow tNUMBER tokens to start with 'A'-'F' without explicit "0x"
* prefix.
*/
enum {
_DRT_WSPACE = 2,
_DRT_HEX,
};
#ifndef BIT
#define BIT(n) (1ull << (n))
#endif
enum {
DRT_WSPACE = BIT(_DRT_WSPACE),
DRT_HEX = BIT(_DRT_HEX),
};
#define DRT_VALID_FLAGS_MASK ((int)DRT_RADIX_MASK | \
DRT_WSPACE | \
DRT_HEX)
void db_flush_lex(void);
char *db_get_line(void);
void db_inject_line(const char *command);
int db_read_line(void);
int db_read_token_flags(int);
void db_unread_token(int t);
static inline int
db_read_token(void)
{
return (db_read_token_flags(0));
}
extern db_expr_t db_tok_number;
#define TOK_STRING_SIZE 120
extern char db_tok_string[TOK_STRING_SIZE];
#define tEOF (-1)
#define tEOL 1
#define tNUMBER 2
#define tIDENT 3
#define tPLUS 4
#define tMINUS 5
#define tDOT 6
#define tSTAR 7
#define tSLASH 8
#define tEQ 9
#define tLPAREN 10
#define tRPAREN 11
#define tPCT 12
#define tHASH 13
#define tCOMMA 14
#define tDITTO 15
#define tDOLLAR 16
#define tEXCL 17
#define tSHIFT_L 18
#define tSHIFT_R 19
#define tDOTDOT 20
#define tSEMI 21
#define tLOG_EQ 22
#define tLOG_NOT_EQ 23
#define tLESS 24
#define tLESS_EQ 25
#define tGREATER 26
#define tGREATER_EQ 27
#define tBIT_AND 28
#define tBIT_OR 29
#define tLOG_AND 30
#define tLOG_OR 31
#define tSTRING 32
#define tQUESTION 33
#define tBIT_NOT 34
#define tWSPACE 35
#define tCOLON 36
#define tCOLONCOLON 37
#endif /* !_DDB_DB_LEX_H_ */