-#ifndef _PSI_TOKEN_H
-#define _PSI_TOKEN_H
+/*******************************************************************************
+ Copyright (c) 2016, Michael Wallner <mike@php.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*******************************************************************************/
+
+#ifndef PSI_TOKEN_H
+#define PSI_TOKEN_H
#include <stddef.h>
#include <stdarg.h>
#include <stdint.h>
#include <assert.h>
+#include <sys/param.h>
+
+static inline size_t psi_align(size_t s, size_t a) {
+ return ((s - 1) | (a - 1)) + 1;
+}
+
+static inline size_t psi_offset_padding(size_t diff, size_t alignment) {
+ if (diff && diff <= psi_align(diff, alignment)) {
+ diff = 0;
+ }
+
+ return diff;
+}
#include "parser_proc.h"
return SIZEOF_FLOAT;
case PSI_T_DOUBLE:
return SIZEOF_DOUBLE;
+ case PSI_T_VOID:
case PSI_T_POINTER:
case PSI_T_FUNCTION:
return SIZEOF_VOID_P;
case PSI_T_ENUM:
return SIZEOF_INT;
default:
- assert(0);
+ assert(!t);
}
return 0;
}
+static inline const char *psi_t_indent(unsigned level) {
+ static const char indent[] =
+ "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
+ return &indent[32 - MIN(32, level)];
+}
+
+static inline const char *psi_t_indirection(unsigned pointer_level) {
+ static const char indir[] = "********************************";
+ return &indir[32 - MIN(32, pointer_level)];
+}
+
struct psi_token {
token_t type;
unsigned size, line, col;