tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceUtils.java
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
parent 41 tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceUtils.java@838cdffd57ce
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
* Static utility functions related to source files
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
*/
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.source;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.util.regex.Matcher;
hgs
parents:
diff changeset
    22
import java.util.regex.Pattern;
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
hgs
parents:
diff changeset
    25
import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.StringErrorParameters;
hgs
parents:
diff changeset
    26
import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
hgs
parents:
diff changeset
    27
import com.nokia.tracecompiler.model.TraceCompilerException;
hgs
parents:
diff changeset
    28
import com.nokia.tracecompiler.model.TraceConstantTable;
hgs
parents:
diff changeset
    29
import com.nokia.tracecompiler.model.TraceParameter;
hgs
parents:
diff changeset
    30
import com.nokia.tracecompiler.rules.ArrayParameterRule;
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
/**
hgs
parents:
diff changeset
    33
 * Static utility functions related to source files
hgs
parents:
diff changeset
    34
 * 
hgs
parents:
diff changeset
    35
 */
hgs
parents:
diff changeset
    36
public class SourceUtils {
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
	/**
hgs
parents:
diff changeset
    39
	 * Tag for array types
hgs
parents:
diff changeset
    40
	 */
hgs
parents:
diff changeset
    41
	private static final String ARRAY_TAG = "[]"; //$NON-NLS-1$
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
	/**
hgs
parents:
diff changeset
    44
	 * Start tag for printf format specifier
hgs
parents:
diff changeset
    45
	 */
hgs
parents:
diff changeset
    46
	private static final String START_TAG = "%"; //$NON-NLS-1$
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
	/**
hgs
parents:
diff changeset
    49
	 * Regular expression optional element tag
hgs
parents:
diff changeset
    50
	 */
hgs
parents:
diff changeset
    51
	private static final String OPTIONAL_TAG = "?"; //$NON-NLS-1$
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
	/**
hgs
parents:
diff changeset
    54
	 * Optional parameter pattern. Quoted from Wikipedia:
hgs
parents:
diff changeset
    55
	 * 
hgs
parents:
diff changeset
    56
	 * <strong> Parameter can be omitted or can be: 'n$' Where n is the number
hgs
parents:
diff changeset
    57
	 * of the parameter to display using this format specifier, allowing the
hgs
parents:
diff changeset
    58
	 * parameters provided to be output multiple times, using varying format
hgs
parents:
diff changeset
    59
	 * specifiers or in different orders. This is a POSIX extension and not in
hgs
parents:
diff changeset
    60
	 * C99.</strong>
hgs
parents:
diff changeset
    61
	 * 
hgs
parents:
diff changeset
    62
	 * This has not been implemented -> Currently format specifier count must
hgs
parents:
diff changeset
    63
	 * match parameter count
hgs
parents:
diff changeset
    64
	 */
hgs
parents:
diff changeset
    65
	private final static String PARAMETER_PATTERN = "(\\d+\\$)"; //$NON-NLS-1$
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
	/**
hgs
parents:
diff changeset
    68
	 * Optional flags pattern. Quoted from Wikipedia:
hgs
parents:
diff changeset
    69
	 * 
hgs
parents:
diff changeset
    70
	 * <strong> Flags can be zero or more (in any order) of:
hgs
parents:
diff changeset
    71
	 * <ul>
hgs
parents:
diff changeset
    72
	 * <li>'+' : Causes printf to always denote the sign '+' or '-' of a number
hgs
parents:
diff changeset
    73
	 * (the default is to omit the sign for positive numbers). Only applicable
hgs
parents:
diff changeset
    74
	 * to numeric types.
hgs
parents:
diff changeset
    75
	 * <li>'-' : Causes printf to left-align the output of this placeholder (the
hgs
parents:
diff changeset
    76
	 * default is to right-align the output).
hgs
parents:
diff changeset
    77
	 * <li>'#' : Alternate form. For 'g' and 'G', trailing zeros are not
hgs
parents:
diff changeset
    78
	 * removed. For 'f', 'F', 'e', 'E', 'g', 'G', the output always contains a
hgs
parents:
diff changeset
    79
	 * decimal point. For 'o', 'x', and 'X', a 0, 0x, and 0X, respectively, is
hgs
parents:
diff changeset
    80
	 * prepended to non-zero numbers.
hgs
parents:
diff changeset
    81
	 * <li>' ' : Causes printf to left-pad the output with spaces until the
hgs
parents:
diff changeset
    82
	 * required length of output is attained. If combined with '0' (see below),
hgs
parents:
diff changeset
    83
	 * it will cause the sign to become a space when positive, but the remaining
hgs
parents:
diff changeset
    84
	 * characters will be zero-padded
hgs
parents:
diff changeset
    85
	 * <li>'0' : Causes printf to use '0' (instead of spaces) to left fill a
hgs
parents:
diff changeset
    86
	 * fixed length field. For example (assume i = 3) printf("%2d", i) results
hgs
parents:
diff changeset
    87
	 * in " 3", while printf("%02d", i) results in "03"
hgs
parents:
diff changeset
    88
	 * </ul>
hgs
parents:
diff changeset
    89
	 * </strong>
hgs
parents:
diff changeset
    90
	 */
hgs
parents:
diff changeset
    91
	private final static String FLAGS_PATTERN = "([-+# 0])"; //$NON-NLS-1$
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
	/**
hgs
parents:
diff changeset
    94
	 * Optional width pattern. Quoted from Wikipedia:
hgs
parents:
diff changeset
    95
	 * 
hgs
parents:
diff changeset
    96
	 * <strong>Width can be omitted or be any of:
hgs
parents:
diff changeset
    97
	 * <ul>
hgs
parents:
diff changeset
    98
	 * <li>a number : Causes printf to pad the output of this placeholder with
hgs
parents:
diff changeset
    99
	 * spaces until it is at least number characters wide. If number has a
hgs
parents:
diff changeset
   100
	 * leading '0', then padding is done with '0' characters.
hgs
parents:
diff changeset
   101
	 * <li>'*' : Causes printf to pad the output until it is n characters wide,
hgs
parents:
diff changeset
   102
	 * where n is an integer value stored in the a function argument just
hgs
parents:
diff changeset
   103
	 * preceding that represented by the modified type. For example
hgs
parents:
diff changeset
   104
	 * printf("%*d", 5, 10) will result in "10" being printed with a width of
hgs
parents:
diff changeset
   105
	 * 5.</strong>
hgs
parents:
diff changeset
   106
	 * </ul>
hgs
parents:
diff changeset
   107
	 * </strong>
hgs
parents:
diff changeset
   108
	 * 
hgs
parents:
diff changeset
   109
	 * '*' has not been implemented -> Currently format specifier count must
hgs
parents:
diff changeset
   110
	 * match parameter count
hgs
parents:
diff changeset
   111
	 */
hgs
parents:
diff changeset
   112
	private final static String WIDTH_PATTERN = "(\\d+|\\*)"; //$NON-NLS-1$
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
	/**
hgs
parents:
diff changeset
   115
	 * Optional precision pattern. Quoted from Wikipedia:
hgs
parents:
diff changeset
   116
	 * 
hgs
parents:
diff changeset
   117
	 * Precision can be omitted or be any of: <strong>
hgs
parents:
diff changeset
   118
	 * <ul>
hgs
parents:
diff changeset
   119
	 * <li>a number : For non-integral numeric types, causes the decimal portion
hgs
parents:
diff changeset
   120
	 * of the output to be expressed in at least number digits. For the string
hgs
parents:
diff changeset
   121
	 * type, causes the output to be truncated at number characters.
hgs
parents:
diff changeset
   122
	 * <li>'*' : Same as the above, but uses an integer value in the intaken
hgs
parents:
diff changeset
   123
	 * argument to determine the number of decimal places or maximum string
hgs
parents:
diff changeset
   124
	 * length. For example, printf("%.*s", 3, "abcdef") will result in "abc"
hgs
parents:
diff changeset
   125
	 * being printed.
hgs
parents:
diff changeset
   126
	 * </ul>
hgs
parents:
diff changeset
   127
	 * </strong> If the precision is zero, nothing is printed for the
hgs
parents:
diff changeset
   128
	 * corresponding argument.
hgs
parents:
diff changeset
   129
	 * 
hgs
parents:
diff changeset
   130
	 * '*' has not been implemented -> Currently format specifier count must
hgs
parents:
diff changeset
   131
	 * match parameter count
hgs
parents:
diff changeset
   132
	 */
hgs
parents:
diff changeset
   133
	private final static String PRECISION_PATTERN = "(\\.(\\d+|\\*))"; //$NON-NLS-1$
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
	/**
hgs
parents:
diff changeset
   136
	 * Optional length pattern. Quoted from Wikipedia:
hgs
parents:
diff changeset
   137
	 * 
hgs
parents:
diff changeset
   138
	 * Length can be omitted or be any of: <strong>
hgs
parents:
diff changeset
   139
	 * <ul>
hgs
parents:
diff changeset
   140
	 * <li>'hh' : For integer types, causes printf to expect an int sized
hgs
parents:
diff changeset
   141
	 * integer argument which was promoted from a char.
hgs
parents:
diff changeset
   142
	 * <li>'h' : For integer types, causes printf to expect a int sized integer
hgs
parents:
diff changeset
   143
	 * argument which was promoted from a short.
hgs
parents:
diff changeset
   144
	 * <li>'l' : (ell) For integer types, causes printf to expect a long sized
hgs
parents:
diff changeset
   145
	 * integer argument.
hgs
parents:
diff changeset
   146
	 * <li>'ll' : (ell ell) For integer types, causes printf to expect a long
hgs
parents:
diff changeset
   147
	 * long sized integer argument.
hgs
parents:
diff changeset
   148
	 * <li>'L' : For floating point types, causes printf to expect a long double
hgs
parents:
diff changeset
   149
	 * argument.
hgs
parents:
diff changeset
   150
	 * <li>'z' : For integer types, causes printf to expect a size_t sized
hgs
parents:
diff changeset
   151
	 * integer argument.
hgs
parents:
diff changeset
   152
	 * <li>'j' : For integer types, causes printf to expect a intmax_t sized
hgs
parents:
diff changeset
   153
	 * integer argument.
hgs
parents:
diff changeset
   154
	 * <li>'t' : For integer types, causes printf to expect a ptrdiff_t sized
hgs
parents:
diff changeset
   155
	 * integer argument.
hgs
parents:
diff changeset
   156
	 * </ul>
hgs
parents:
diff changeset
   157
	 * </strong>
hgs
parents:
diff changeset
   158
	 */
hgs
parents:
diff changeset
   159
	private final static String LENGTH_PATTERN = "([lh]?[hHlLZjt])"; //$NON-NLS-1$
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
	/**
hgs
parents:
diff changeset
   162
	 * Type pattern. Quoted from Wikipedia:
hgs
parents:
diff changeset
   163
	 * 
hgs
parents:
diff changeset
   164
	 * <strong> type can be any of:
hgs
parents:
diff changeset
   165
	 * <ul>
hgs
parents:
diff changeset
   166
	 * <li>'d', 'i' : Print an int as a signed decimal number. '%d' and '%i' are
hgs
parents:
diff changeset
   167
	 * synonymous for output, but are different when used with scanf() for
hgs
parents:
diff changeset
   168
	 * input.
hgs
parents:
diff changeset
   169
	 * <li>'u' : Print decimal unsigned int.
hgs
parents:
diff changeset
   170
	 * <li>'f', 'F' : Print a double in normal (fixed-point) notation.
hgs
parents:
diff changeset
   171
	 * <li>'e', 'E' : Print a double value in standard form ([-]d.ddd
hgs
parents:
diff changeset
   172
	 * e[+/-]ddd).
hgs
parents:
diff changeset
   173
	 * <li>'g', 'G' : Print a double in either normal or exponential notation,
hgs
parents:
diff changeset
   174
	 * whichever is more appropriate for its magnitude. 'g' uses lower-case
hgs
parents:
diff changeset
   175
	 * letters, 'G' uses upper-case letters. This type differs slightly from
hgs
parents:
diff changeset
   176
	 * fixed-point notation in that insignificant zeroes to the right of the
hgs
parents:
diff changeset
   177
	 * decimal point are not included. Also, the decimal point is not included
hgs
parents:
diff changeset
   178
	 * on whole numbers.
hgs
parents:
diff changeset
   179
	 * <li>'x', 'X' : Print an unsigned int as a hexadecimal number. 'x' uses
hgs
parents:
diff changeset
   180
	 * lower-case letters and 'X' uses upper-case.
hgs
parents:
diff changeset
   181
	 * <li>'o' : Print an unsigned int in octal.
hgs
parents:
diff changeset
   182
	 * <li>'s' : Print a character string.
hgs
parents:
diff changeset
   183
	 * <li>'c' : Print a char (character).
hgs
parents:
diff changeset
   184
	 * <li>'p' : Print a void * (pointer to void) in an implementation-defined
hgs
parents:
diff changeset
   185
	 * format.
hgs
parents:
diff changeset
   186
	 * <li>'n' : Write number of characters successfully written so far into an
hgs
parents:
diff changeset
   187
	 * integer pointer parameter.
hgs
parents:
diff changeset
   188
	 * <li>'%' : Print a literal '%' character (this type doesn't accept any
hgs
parents:
diff changeset
   189
	 * flags, width, precision or length).
hgs
parents:
diff changeset
   190
	 * </ul>
hgs
parents:
diff changeset
   191
	 * </strong>
hgs
parents:
diff changeset
   192
	 * 
hgs
parents:
diff changeset
   193
	 * The pattern itself accepts all characters and the validity check is done
hgs
parents:
diff changeset
   194
	 * in {@link #mapFormatToParameterType mapFormatToType}
hgs
parents:
diff changeset
   195
	 */
hgs
parents:
diff changeset
   196
	private final static String TYPE_PATTERN = "([a-zA-Z%])"; //$NON-NLS-1$
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
	/**
hgs
parents:
diff changeset
   199
	 * Regular expression pattern for printf
hgs
parents:
diff changeset
   200
	 * 
hgs
parents:
diff changeset
   201
	 * %[parameter][flags][width][.precision][length]type
hgs
parents:
diff changeset
   202
	 */
hgs
parents:
diff changeset
   203
	private static final String STANDARD_PRINTF_PATTERN = PARAMETER_PATTERN
hgs
parents:
diff changeset
   204
			+ OPTIONAL_TAG + FLAGS_PATTERN + OPTIONAL_TAG + WIDTH_PATTERN
hgs
parents:
diff changeset
   205
			+ OPTIONAL_TAG + PRECISION_PATTERN + OPTIONAL_TAG + LENGTH_PATTERN
hgs
parents:
diff changeset
   206
			+ OPTIONAL_TAG + TYPE_PATTERN;
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
	/**
hgs
parents:
diff changeset
   209
	 * Regular expression pattern for Open System Trace printf extensions
hgs
parents:
diff changeset
   210
	 * %{Type}, %{Array[]}
hgs
parents:
diff changeset
   211
	 */
hgs
parents:
diff changeset
   212
	private static final String EXTENSION_PRINTF_PATTERN = "\\{[\\w_]+(\\[\\])?\\}"; //$NON-NLS-1$
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
	/**
hgs
parents:
diff changeset
   215
	 * Regular expression pattern for printf
hgs
parents:
diff changeset
   216
	 */
hgs
parents:
diff changeset
   217
	public static final String PRINTF_PATTERN = START_TAG + "((" //$NON-NLS-1$
hgs
parents:
diff changeset
   218
			+ STANDARD_PRINTF_PATTERN + ")|(" //$NON-NLS-1$
hgs
parents:
diff changeset
   219
			+ EXTENSION_PRINTF_PATTERN + "))"; //$NON-NLS-1$
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
	/**
hgs
parents:
diff changeset
   222
	 * The pattern for printf-formatted trace text
hgs
parents:
diff changeset
   223
	 */
hgs
parents:
diff changeset
   224
	public final static Pattern traceTextPattern = Pattern
hgs
parents:
diff changeset
   225
			.compile(PRINTF_PATTERN);
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
	/**
hgs
parents:
diff changeset
   228
	 * The pattern for parameter length in printf specifier
hgs
parents:
diff changeset
   229
	 */
hgs
parents:
diff changeset
   230
	public final static Pattern lengthPattern = Pattern.compile(LENGTH_PATTERN);
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
	/**
hgs
parents:
diff changeset
   233
	 * Hidden constructor
hgs
parents:
diff changeset
   234
	 */
hgs
parents:
diff changeset
   235
	private SourceUtils() {
hgs
parents:
diff changeset
   236
	}
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
	/**
hgs
parents:
diff changeset
   239
	 * Creates a header guard
hgs
parents:
diff changeset
   240
	 * 
hgs
parents:
diff changeset
   241
	 * @param fileName
hgs
parents:
diff changeset
   242
	 *            the name of the file
hgs
parents:
diff changeset
   243
	 * @return the header guard
hgs
parents:
diff changeset
   244
	 */
hgs
parents:
diff changeset
   245
	public static String createHeaderGuard(String fileName) {
hgs
parents:
diff changeset
   246
		StringBuffer sb = new StringBuffer();
hgs
parents:
diff changeset
   247
		String uname = fileName.replace(SourceConstants.PERIOD_CHAR,
hgs
parents:
diff changeset
   248
				SourceConstants.UNDERSCORE_CHAR).toUpperCase();
hgs
parents:
diff changeset
   249
		sb.append(SourceConstants.IFNDEF);
hgs
parents:
diff changeset
   250
		sb.append(SourceConstants.SPACE);
hgs
parents:
diff changeset
   251
		sb.append(SourceConstants.DOUBLE_UNDERSCORE);
hgs
parents:
diff changeset
   252
		sb.append(uname);
hgs
parents:
diff changeset
   253
		sb.append(SourceConstants.DOUBLE_UNDERSCORE);
hgs
parents:
diff changeset
   254
		sb.append(SourceConstants.LINE_FEED);
hgs
parents:
diff changeset
   255
		sb.append(SourceConstants.DEFINE);
hgs
parents:
diff changeset
   256
		sb.append(SourceConstants.SPACE);
hgs
parents:
diff changeset
   257
		sb.append(SourceConstants.DOUBLE_UNDERSCORE);
hgs
parents:
diff changeset
   258
		sb.append(uname);
hgs
parents:
diff changeset
   259
		sb.append(SourceConstants.DOUBLE_UNDERSCORE);
hgs
parents:
diff changeset
   260
		return sb.toString();
hgs
parents:
diff changeset
   261
	}
hgs
parents:
diff changeset
   262
hgs
parents:
diff changeset
   263
	/**
hgs
parents:
diff changeset
   264
	 * Checks the validity of name
hgs
parents:
diff changeset
   265
	 * 
hgs
parents:
diff changeset
   266
	 * @param name
hgs
parents:
diff changeset
   267
	 *            the name
hgs
parents:
diff changeset
   268
	 * @return true if valid
hgs
parents:
diff changeset
   269
	 */
hgs
parents:
diff changeset
   270
	public static boolean isValidName(String name) {
hgs
parents:
diff changeset
   271
		boolean retval;
hgs
parents:
diff changeset
   272
		if (name != null && name.length() > 0) {
hgs
parents:
diff changeset
   273
			retval = true;
hgs
parents:
diff changeset
   274
			if (!isValidNameStartChar(name.charAt(0))) {
hgs
parents:
diff changeset
   275
				retval = false;
hgs
parents:
diff changeset
   276
			} else {
hgs
parents:
diff changeset
   277
				for (int i = 1; i < name.length() && retval; i++) {
hgs
parents:
diff changeset
   278
					retval = isValidNameChar(name.charAt(i));
hgs
parents:
diff changeset
   279
				}
hgs
parents:
diff changeset
   280
			}
hgs
parents:
diff changeset
   281
		} else {
hgs
parents:
diff changeset
   282
			retval = false;
hgs
parents:
diff changeset
   283
		}
hgs
parents:
diff changeset
   284
		return retval;
hgs
parents:
diff changeset
   285
	}
hgs
parents:
diff changeset
   286
hgs
parents:
diff changeset
   287
	/**
hgs
parents:
diff changeset
   288
	 * Checks the validity of parameter name
hgs
parents:
diff changeset
   289
	 * 
hgs
parents:
diff changeset
   290
	 * @param name
hgs
parents:
diff changeset
   291
	 *            the name
hgs
parents:
diff changeset
   292
	 * @return true if valid
hgs
parents:
diff changeset
   293
	 */
hgs
parents:
diff changeset
   294
	public static boolean isValidParameterName(String name) {
hgs
parents:
diff changeset
   295
		boolean retval;
hgs
parents:
diff changeset
   296
		if (name != null && name.length() > 0) {
hgs
parents:
diff changeset
   297
			retval = true;
hgs
parents:
diff changeset
   298
			if (!isValidNameStartChar(name.charAt(0))) {
hgs
parents:
diff changeset
   299
				retval = false;
hgs
parents:
diff changeset
   300
			} else {
hgs
parents:
diff changeset
   301
				for (int i = 1; i < name.length() && retval; i++) {
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
					// Check validity of the character
hgs
parents:
diff changeset
   304
					char c = name.charAt(i);
hgs
parents:
diff changeset
   305
					retval = (isValidNameChar(c) || isValidSpecialChar(c));
hgs
parents:
diff changeset
   306
				}
hgs
parents:
diff changeset
   307
			}
hgs
parents:
diff changeset
   308
		} else {
hgs
parents:
diff changeset
   309
			retval = false;
hgs
parents:
diff changeset
   310
		}
hgs
parents:
diff changeset
   311
		return retval;
hgs
parents:
diff changeset
   312
	}
hgs
parents:
diff changeset
   313
hgs
parents:
diff changeset
   314
	/**
hgs
parents:
diff changeset
   315
	 * Checks special character validity
hgs
parents:
diff changeset
   316
	 * 
hgs
parents:
diff changeset
   317
	 * @param c
hgs
parents:
diff changeset
   318
	 *            character
hgs
parents:
diff changeset
   319
	 * @return true if valid
hgs
parents:
diff changeset
   320
	 */
hgs
parents:
diff changeset
   321
	private static boolean isValidSpecialChar(char c) {
hgs
parents:
diff changeset
   322
		boolean retval = false;
hgs
parents:
diff changeset
   323
		// Check if the character is allowed
hgs
parents:
diff changeset
   324
		if (c == '.' || c == '-' || c == '>' || c == '(' || c == ')'
hgs
parents:
diff changeset
   325
				|| c == '[' || c == ']' || c == ' ' || c == '&' || c == '*') {
hgs
parents:
diff changeset
   326
			retval = true;
hgs
parents:
diff changeset
   327
		}
hgs
parents:
diff changeset
   328
		return retval;
hgs
parents:
diff changeset
   329
	}
hgs
parents:
diff changeset
   330
hgs
parents:
diff changeset
   331
	/**
hgs
parents:
diff changeset
   332
	 * Checks start-of-name character validity
hgs
parents:
diff changeset
   333
	 * 
hgs
parents:
diff changeset
   334
	 * @param c
hgs
parents:
diff changeset
   335
	 *            character
hgs
parents:
diff changeset
   336
	 * @return true if valid
hgs
parents:
diff changeset
   337
	 */
hgs
parents:
diff changeset
   338
	private static boolean isValidNameStartChar(char c) {
hgs
parents:
diff changeset
   339
		// Ascii characters and underscore are allowed
hgs
parents:
diff changeset
   340
		return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A) // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   341
				|| c == 0x5F; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   342
	}
hgs
parents:
diff changeset
   343
hgs
parents:
diff changeset
   344
	/**
hgs
parents:
diff changeset
   345
	 * Checks name character validity
hgs
parents:
diff changeset
   346
	 * 
hgs
parents:
diff changeset
   347
	 * @param c
hgs
parents:
diff changeset
   348
	 *            character
hgs
parents:
diff changeset
   349
	 * @return true if valid
hgs
parents:
diff changeset
   350
	 */
hgs
parents:
diff changeset
   351
	private static boolean isValidNameChar(char c) {
hgs
parents:
diff changeset
   352
		// Numbers are allowed in addition to start characters
hgs
parents:
diff changeset
   353
		return isValidNameStartChar(c) || (c >= 0x30 && c <= 0x39); // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   354
	}
hgs
parents:
diff changeset
   355
hgs
parents:
diff changeset
   356
	/**
hgs
parents:
diff changeset
   357
	 * Maps a Symbian type to one of the TraceParameter types
hgs
parents:
diff changeset
   358
	 * 
hgs
parents:
diff changeset
   359
	 * @param parsedType
hgs
parents:
diff changeset
   360
	 *            the type parsed from source
hgs
parents:
diff changeset
   361
	 * @return the parameter type
hgs
parents:
diff changeset
   362
	 */
hgs
parents:
diff changeset
   363
	public static TypeMapping mapSymbianTypeToParameterType(
hgs
parents:
diff changeset
   364
			ParsedType parsedType) {
hgs
parents:
diff changeset
   365
		String type = null;
hgs
parents:
diff changeset
   366
		// The type map contains Symbian types
hgs
parents:
diff changeset
   367
		for (int i = 0; i < SymbianConstants.PARAMETER_TYPE_MAP.length
hgs
parents:
diff changeset
   368
				&& type == null; i++) {
hgs
parents:
diff changeset
   369
			if (parsedType
hgs
parents:
diff changeset
   370
					.typeEquals(SymbianConstants.PARAMETER_TYPE_MAP[i][0])) {
hgs
parents:
diff changeset
   371
				type = SymbianConstants.PARAMETER_TYPE_MAP[i][1];
hgs
parents:
diff changeset
   372
			}
hgs
parents:
diff changeset
   373
		}
hgs
parents:
diff changeset
   374
		if (type != null) {
hgs
parents:
diff changeset
   375
			if (parsedType.hasQualifier(SourceConstants.UNSIGNED)) {
hgs
parents:
diff changeset
   376
				type = convertToUnsigned(type);
hgs
parents:
diff changeset
   377
			}
hgs
parents:
diff changeset
   378
		}
hgs
parents:
diff changeset
   379
		TypeMapping retval = new TypeMapping(type);
hgs
parents:
diff changeset
   380
		if (type != null) {
hgs
parents:
diff changeset
   381
			// Value or a reference can be added to source as is
hgs
parents:
diff changeset
   382
			// Points needs to be cast to HEX32
hgs
parents:
diff changeset
   383
			if (parsedType.isPointer()) {
hgs
parents:
diff changeset
   384
				retval.type = TraceParameter.HEX32;
hgs
parents:
diff changeset
   385
				retval.needsCasting = true;
hgs
parents:
diff changeset
   386
			} else {
hgs
parents:
diff changeset
   387
				// TUint32 needs to be cast to TUint and TInt32 to TInt.
hgs
parents:
diff changeset
   388
				// Otherwise there will be some problems with extension
hgs
parents:
diff changeset
   389
				// headers
hgs
parents:
diff changeset
   390
				if (parsedType.typeEquals(SymbianConstants.TUINT32)
hgs
parents:
diff changeset
   391
						|| parsedType.typeEquals(SymbianConstants.TINT32)) {
hgs
parents:
diff changeset
   392
					retval.needsCasting = true;
hgs
parents:
diff changeset
   393
				}
hgs
parents:
diff changeset
   394
			}
hgs
parents:
diff changeset
   395
		} else if (parsedType.isPointer()) {
hgs
parents:
diff changeset
   396
			// Unrecognized pointer types are cast to Hex32
hgs
parents:
diff changeset
   397
			retval.type = TraceParameter.HEX32;
hgs
parents:
diff changeset
   398
			retval.needsCasting = true;
hgs
parents:
diff changeset
   399
		} else {
hgs
parents:
diff changeset
   400
			// Unrecognized value types are passed as pointer and cast to Hex32
hgs
parents:
diff changeset
   401
			retval.type = TraceParameter.HEX32;
hgs
parents:
diff changeset
   402
			retval.valueToPointer = true;
hgs
parents:
diff changeset
   403
			retval.needsCasting = true;
hgs
parents:
diff changeset
   404
		}
hgs
parents:
diff changeset
   405
		return retval;
hgs
parents:
diff changeset
   406
	}
hgs
parents:
diff changeset
   407
hgs
parents:
diff changeset
   408
	/**
hgs
parents:
diff changeset
   409
	 * Maps the type of a parameter to a Symbian type
hgs
parents:
diff changeset
   410
	 * 
hgs
parents:
diff changeset
   411
	 * @param parameter
hgs
parents:
diff changeset
   412
	 *            the parameter
hgs
parents:
diff changeset
   413
	 * @return the parameter type as string
hgs
parents:
diff changeset
   414
	 */
hgs
parents:
diff changeset
   415
	public static String mapParameterTypeToSymbianType(TraceParameter parameter) {
hgs
parents:
diff changeset
   416
		String retval;
hgs
parents:
diff changeset
   417
		ArrayParameterRule rule = parameter
hgs
parents:
diff changeset
   418
				.getExtension(ArrayParameterRule.class);
hgs
parents:
diff changeset
   419
		String type = parameter.getType();
hgs
parents:
diff changeset
   420
		TraceConstantTable table = parameter.getModel()
hgs
parents:
diff changeset
   421
				.findConstantTableByName(type);
hgs
parents:
diff changeset
   422
		if (table != null) {
hgs
parents:
diff changeset
   423
			type = table.getType();
hgs
parents:
diff changeset
   424
		}
hgs
parents:
diff changeset
   425
		if (rule != null) {
hgs
parents:
diff changeset
   426
			retval = mapArrayTypeToSymbianType(type);
hgs
parents:
diff changeset
   427
		} else {
hgs
parents:
diff changeset
   428
			retval = mapBasicTypeToSymbianType(type);
hgs
parents:
diff changeset
   429
		}
hgs
parents:
diff changeset
   430
		return retval;
hgs
parents:
diff changeset
   431
	}
hgs
parents:
diff changeset
   432
hgs
parents:
diff changeset
   433
	/**
hgs
parents:
diff changeset
   434
	 * Maps a basic parameter type to Symbian type
hgs
parents:
diff changeset
   435
	 * 
hgs
parents:
diff changeset
   436
	 * @param type
hgs
parents:
diff changeset
   437
	 *            the parameter type
hgs
parents:
diff changeset
   438
	 * @return the Symbian type
hgs
parents:
diff changeset
   439
	 */
hgs
parents:
diff changeset
   440
	public static String mapBasicTypeToSymbianType(String type) {
hgs
parents:
diff changeset
   441
		String retval;
hgs
parents:
diff changeset
   442
		// Unsigned and hex both use TUint types
hgs
parents:
diff changeset
   443
		// Signed uses TInt types
hgs
parents:
diff changeset
   444
		if (type.equals(TraceParameter.POINTER)) {
hgs
parents:
diff changeset
   445
			retval = SymbianConstants.CONST_TANY_PTR;
hgs
parents:
diff changeset
   446
		} else if (type.equals(TraceParameter.SDEC32)) {
hgs
parents:
diff changeset
   447
			retval = SymbianConstants.TINT;
hgs
parents:
diff changeset
   448
		} else if (type.equals(TraceParameter.UDEC32)
hgs
parents:
diff changeset
   449
				|| type.equals(TraceParameter.OCT32)
hgs
parents:
diff changeset
   450
				|| type.equals(TraceParameter.HEX32)) {
hgs
parents:
diff changeset
   451
			retval = SymbianConstants.TUINT;
hgs
parents:
diff changeset
   452
		} else if (type.equals(TraceParameter.SDEC16)) {
hgs
parents:
diff changeset
   453
			retval = SymbianConstants.TINT16;
hgs
parents:
diff changeset
   454
		} else if (type.equals(TraceParameter.UDEC16)
hgs
parents:
diff changeset
   455
				|| type.equals(TraceParameter.OCT16)
hgs
parents:
diff changeset
   456
				|| type.equals(TraceParameter.HEX16)) {
hgs
parents:
diff changeset
   457
			retval = SymbianConstants.TUINT16;
hgs
parents:
diff changeset
   458
		} else if (type.equals(TraceParameter.SDEC8)) {
hgs
parents:
diff changeset
   459
			retval = SymbianConstants.TINT8;
hgs
parents:
diff changeset
   460
		} else if (type.equals(TraceParameter.UDEC8)
hgs
parents:
diff changeset
   461
				|| type.equals(TraceParameter.OCT8)
hgs
parents:
diff changeset
   462
				|| type.equals(TraceParameter.HEX8)) {
hgs
parents:
diff changeset
   463
			retval = SymbianConstants.TUINT8;
hgs
parents:
diff changeset
   464
		} else if (type.equals(TraceParameter.SDEC64)
hgs
parents:
diff changeset
   465
				|| type.equals(TraceParameter.TIME)) {
hgs
parents:
diff changeset
   466
			retval = SymbianConstants.TINT64;
hgs
parents:
diff changeset
   467
		} else if (type.equals(TraceParameter.UDEC64)
hgs
parents:
diff changeset
   468
				|| type.equals(TraceParameter.OCT64)
hgs
parents:
diff changeset
   469
				|| type.equals(TraceParameter.HEX64)) {
hgs
parents:
diff changeset
   470
			retval = SymbianConstants.TUINT64;
hgs
parents:
diff changeset
   471
		} else if (type.equals(TraceParameter.ASCII)) {
hgs
parents:
diff changeset
   472
			retval = SymbianConstants.CONST_TDESC8_REF;
hgs
parents:
diff changeset
   473
		} else if (type.equals(TraceParameter.UNICODE)) {
hgs
parents:
diff changeset
   474
			retval = SymbianConstants.CONST_TDESC16_REF;
hgs
parents:
diff changeset
   475
		} else if (type.equals(TraceParameter.FLOAT_EXP)
hgs
parents:
diff changeset
   476
				|| type.equals(TraceParameter.FLOAT_FIX)
hgs
parents:
diff changeset
   477
				|| type.equals(TraceParameter.FLOAT_OPT)) {
hgs
parents:
diff changeset
   478
			retval = SymbianConstants.TREAL;
hgs
parents:
diff changeset
   479
		} else {
hgs
parents:
diff changeset
   480
			retval = SymbianConstants.TANY_PTR;
hgs
parents:
diff changeset
   481
		}
hgs
parents:
diff changeset
   482
		return retval;
hgs
parents:
diff changeset
   483
	}
hgs
parents:
diff changeset
   484
hgs
parents:
diff changeset
   485
	/**
hgs
parents:
diff changeset
   486
	 * Maps an array parameter type to Symbian type
hgs
parents:
diff changeset
   487
	 * 
hgs
parents:
diff changeset
   488
	 * @param type
hgs
parents:
diff changeset
   489
	 *            the parameter type
hgs
parents:
diff changeset
   490
	 * @return the Symbian type
hgs
parents:
diff changeset
   491
	 */
hgs
parents:
diff changeset
   492
	public static String mapArrayTypeToSymbianType(String type) {
hgs
parents:
diff changeset
   493
		String basic = mapBasicTypeToSymbianType(type);
hgs
parents:
diff changeset
   494
		String retval = SourceConstants.OST_ARRAY_TYPE_PREFIX + basic
hgs
parents:
diff changeset
   495
				+ SourceConstants.OST_ARRAY_TYPE_POSTFIX;
hgs
parents:
diff changeset
   496
		return retval;
hgs
parents:
diff changeset
   497
	}
hgs
parents:
diff changeset
   498
hgs
parents:
diff changeset
   499
	/**
hgs
parents:
diff changeset
   500
	 * Maps a format specifier into parameter type
hgs
parents:
diff changeset
   501
	 * 
hgs
parents:
diff changeset
   502
	 * @param formatSpecifier
hgs
parents:
diff changeset
   503
	 *            the format specifier
hgs
parents:
diff changeset
   504
	 * @return the parameter type or null if not recognized. If the type is one
hgs
parents:
diff changeset
   505
	 *         of the supported TraceParameter types, the string contains the
hgs
parents:
diff changeset
   506
	 *         integer value of the type
hgs
parents:
diff changeset
   507
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   508
	 *             if format specifier is not valid
hgs
parents:
diff changeset
   509
	 */
hgs
parents:
diff changeset
   510
	public static FormatMapping mapFormatToParameterType(String formatSpecifier)
hgs
parents:
diff changeset
   511
			throws TraceCompilerException {
hgs
parents:
diff changeset
   512
		String type;
hgs
parents:
diff changeset
   513
		boolean array = false;
hgs
parents:
diff changeset
   514
		boolean basic = false;
hgs
parents:
diff changeset
   515
		boolean extended = false;
hgs
parents:
diff changeset
   516
		int len = formatSpecifier.length();
hgs
parents:
diff changeset
   517
		// Extension format is checked first: %{x}
hgs
parents:
diff changeset
   518
		if (len > 3 && formatSpecifier.charAt(1) == '{' // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   519
				&& formatSpecifier.charAt(len - 1) == '}') {
hgs
parents:
diff changeset
   520
			// Extension format can be an array: %{x[]}
hgs
parents:
diff changeset
   521
			// In that case it could also be a basic type
hgs
parents:
diff changeset
   522
			if (len > 3 + ARRAY_TAG.length() // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   523
					&& formatSpecifier.charAt(len - 3) == '[' // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   524
					&& formatSpecifier.charAt(len - 2) == ']') { // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   525
				type = formatSpecifier.substring(2, len - 1 // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   526
						- ARRAY_TAG.length());
hgs
parents:
diff changeset
   527
				array = true;
hgs
parents:
diff changeset
   528
				if (isStringType(type)) {
hgs
parents:
diff changeset
   529
					StringErrorParameters param = new StringErrorParameters();
hgs
parents:
diff changeset
   530
					param.string = type;
hgs
parents:
diff changeset
   531
					throw new TraceCompilerException(
hgs
parents:
diff changeset
   532
							TraceCompilerErrorCode.PARAMETER_FORMAT_NOT_SUPPORTED_IN_ARRAY,
hgs
parents:
diff changeset
   533
							param, null);
hgs
parents:
diff changeset
   534
				}
hgs
parents:
diff changeset
   535
			} else {
hgs
parents:
diff changeset
   536
				type = formatSpecifier.substring(2, len - 1); // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   537
			}
hgs
parents:
diff changeset
   538
			extended = !isBasicType(type);
hgs
parents:
diff changeset
   539
		} else {
hgs
parents:
diff changeset
   540
			basic = true;
hgs
parents:
diff changeset
   541
			type = formatSpecifier;
hgs
parents:
diff changeset
   542
		}
hgs
parents:
diff changeset
   543
				
hgs
parents:
diff changeset
   544
		if (basic) {
hgs
parents:
diff changeset
   545
			type = mapBasicFormatToType(formatSpecifier);
hgs
parents:
diff changeset
   546
		}
hgs
parents:
diff changeset
   547
		if (type == null) {
hgs
parents:
diff changeset
   548
			StringErrorParameters params = new StringErrorParameters();
hgs
parents:
diff changeset
   549
			params.string = formatSpecifier;
hgs
parents:
diff changeset
   550
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   551
					TraceCompilerErrorCode.PARAMETER_FORMAT_NOT_SUPPORTED,
hgs
parents:
diff changeset
   552
					params, null);
hgs
parents:
diff changeset
   553
		}
hgs
parents:
diff changeset
   554
		FormatMapping retval = new FormatMapping(type);
hgs
parents:
diff changeset
   555
		retval.isArray = array;
hgs
parents:
diff changeset
   556
		if (extended) {
hgs
parents:
diff changeset
   557
			// In case of extended types, a constant table can still be
hgs
parents:
diff changeset
   558
			// represented with normal trace macros.
hgs
parents:
diff changeset
   559
			TraceConstantTable table = TraceCompilerEngineGlobals.getTraceModel()
hgs
parents:
diff changeset
   560
					.findConstantTableByName(retval.type);
hgs
parents:
diff changeset
   561
			if (table != null) {
hgs
parents:
diff changeset
   562
				if (!array && isSimpleType(table.getType())) {
hgs
parents:
diff changeset
   563
					retval.isSimple = true;
hgs
parents:
diff changeset
   564
				}
hgs
parents:
diff changeset
   565
			} else {
hgs
parents:
diff changeset
   566
				// Extended type must be found from the property file
hgs
parents:
diff changeset
   567
				StringErrorParameters params = new StringErrorParameters();
hgs
parents:
diff changeset
   568
				params.string = formatSpecifier;
hgs
parents:
diff changeset
   569
				throw new TraceCompilerException(
hgs
parents:
diff changeset
   570
						TraceCompilerErrorCode.PARAMETER_FORMAT_NOT_SUPPORTED,
hgs
parents:
diff changeset
   571
						params, null);
hgs
parents:
diff changeset
   572
			}
hgs
parents:
diff changeset
   573
		} else if (!retval.isArray) {
hgs
parents:
diff changeset
   574
			retval.isSimple = isSimpleType(type);
hgs
parents:
diff changeset
   575
		}
hgs
parents:
diff changeset
   576
				
hgs
parents:
diff changeset
   577
		return retval;
hgs
parents:
diff changeset
   578
	}
hgs
parents:
diff changeset
   579
hgs
parents:
diff changeset
   580
	/**
hgs
parents:
diff changeset
   581
	 * Maps basic format specifies to parameter type
hgs
parents:
diff changeset
   582
	 * 
hgs
parents:
diff changeset
   583
	 * @param formatSpecifier
hgs
parents:
diff changeset
   584
	 *            the format specifies
hgs
parents:
diff changeset
   585
	 * @return the type
hgs
parents:
diff changeset
   586
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   587
	 *             if mapping cannot be done
hgs
parents:
diff changeset
   588
	 */
hgs
parents:
diff changeset
   589
	private static String mapBasicFormatToType(String formatSpecifier)
hgs
parents:
diff changeset
   590
			throws TraceCompilerException { // CodForChk_Dis_ComplexFunc
hgs
parents:
diff changeset
   591
		String type;
hgs
parents:
diff changeset
   592
		int paramLength = SourceUtils
hgs
parents:
diff changeset
   593
				.mapFormatToParameterLength(formatSpecifier);
hgs
parents:
diff changeset
   594
		char formatChar = formatSpecifier.charAt(formatSpecifier.length() - 1);
hgs
parents:
diff changeset
   595
		switch (formatChar) {
hgs
parents:
diff changeset
   596
		case 'd':
hgs
parents:
diff changeset
   597
			type = SourceUtils.mapSignedToParameterType(paramLength);
hgs
parents:
diff changeset
   598
			break;
hgs
parents:
diff changeset
   599
		case 'x':
hgs
parents:
diff changeset
   600
		case 'X':
hgs
parents:
diff changeset
   601
			type = SourceUtils.mapHexToParameterType(paramLength);
hgs
parents:
diff changeset
   602
			break;
hgs
parents:
diff changeset
   603
		case 'u':
hgs
parents:
diff changeset
   604
			type = SourceUtils.mapUnsignedToParameterType(paramLength);
hgs
parents:
diff changeset
   605
			break;
hgs
parents:
diff changeset
   606
		case 'o':
hgs
parents:
diff changeset
   607
			type = SourceUtils.mapOctalToParameterType(paramLength);
hgs
parents:
diff changeset
   608
			break;
hgs
parents:
diff changeset
   609
		case 's':
hgs
parents:
diff changeset
   610
			type = TraceParameter.ASCII;
hgs
parents:
diff changeset
   611
			break;
hgs
parents:
diff changeset
   612
		case 'S': // Symbian extension
hgs
parents:
diff changeset
   613
			type = TraceParameter.UNICODE;
hgs
parents:
diff changeset
   614
			break;
hgs
parents:
diff changeset
   615
		case 'c':
hgs
parents:
diff changeset
   616
			type = TraceParameter.SDEC8;
hgs
parents:
diff changeset
   617
			break;
hgs
parents:
diff changeset
   618
		case 'p':
hgs
parents:
diff changeset
   619
			type = TraceParameter.POINTER;
hgs
parents:
diff changeset
   620
			break;
hgs
parents:
diff changeset
   621
		case 'f':
hgs
parents:
diff changeset
   622
		case 'F':
hgs
parents:
diff changeset
   623
			type = TraceParameter.FLOAT_FIX;
hgs
parents:
diff changeset
   624
			break;
hgs
parents:
diff changeset
   625
		case 'e':
hgs
parents:
diff changeset
   626
		case 'E':
hgs
parents:
diff changeset
   627
			type = TraceParameter.FLOAT_EXP;
hgs
parents:
diff changeset
   628
			break;
hgs
parents:
diff changeset
   629
		case 'g':
hgs
parents:
diff changeset
   630
		case 'G':
hgs
parents:
diff changeset
   631
			type = TraceParameter.FLOAT_OPT;
hgs
parents:
diff changeset
   632
			break;
hgs
parents:
diff changeset
   633
		default:
hgs
parents:
diff changeset
   634
			type = null;
hgs
parents:
diff changeset
   635
		}
hgs
parents:
diff changeset
   636
hgs
parents:
diff changeset
   637
		return type;
hgs
parents:
diff changeset
   638
	}
hgs
parents:
diff changeset
   639
hgs
parents:
diff changeset
   640
	/**
hgs
parents:
diff changeset
   641
	 * Maps a parameter type to format string
hgs
parents:
diff changeset
   642
	 * 
hgs
parents:
diff changeset
   643
	 * @param parameter
hgs
parents:
diff changeset
   644
	 *            the parameter
hgs
parents:
diff changeset
   645
	 * @return the format string
hgs
parents:
diff changeset
   646
	 */
hgs
parents:
diff changeset
   647
	public static String mapParameterTypeToFormat(TraceParameter parameter) {
hgs
parents:
diff changeset
   648
		String tag;
hgs
parents:
diff changeset
   649
		if (parameter.getExtension(ArrayParameterRule.class) != null) {
hgs
parents:
diff changeset
   650
			tag = mapArrayTypeToFormat(parameter.getType());
hgs
parents:
diff changeset
   651
		} else {
hgs
parents:
diff changeset
   652
			tag = mapNormalTypeToFormat(parameter.getType());
hgs
parents:
diff changeset
   653
		}
hgs
parents:
diff changeset
   654
		return tag;
hgs
parents:
diff changeset
   655
	}
hgs
parents:
diff changeset
   656
hgs
parents:
diff changeset
   657
	/**
hgs
parents:
diff changeset
   658
	 * Maps an array type to basic type
hgs
parents:
diff changeset
   659
	 * 
hgs
parents:
diff changeset
   660
	 * @param arrayType
hgs
parents:
diff changeset
   661
	 *            the array type
hgs
parents:
diff changeset
   662
	 * @return the basic type or null if original type is not array type
hgs
parents:
diff changeset
   663
	 */
hgs
parents:
diff changeset
   664
	public static String mapArrayTypeToBasicType(String arrayType) {
hgs
parents:
diff changeset
   665
		String retval;
hgs
parents:
diff changeset
   666
		if (arrayType.endsWith(ARRAY_TAG)) {
hgs
parents:
diff changeset
   667
			retval = arrayType.substring(0, arrayType.length()
hgs
parents:
diff changeset
   668
					- ARRAY_TAG.length());
hgs
parents:
diff changeset
   669
		} else {
hgs
parents:
diff changeset
   670
			retval = null;
hgs
parents:
diff changeset
   671
		}
hgs
parents:
diff changeset
   672
		return retval;
hgs
parents:
diff changeset
   673
	}
hgs
parents:
diff changeset
   674
hgs
parents:
diff changeset
   675
	/**
hgs
parents:
diff changeset
   676
	 * Parses a numeric value from source
hgs
parents:
diff changeset
   677
	 * 
hgs
parents:
diff changeset
   678
	 * @param number
hgs
parents:
diff changeset
   679
	 *            the number as string
hgs
parents:
diff changeset
   680
	 * @return the value
hgs
parents:
diff changeset
   681
	 */
hgs
parents:
diff changeset
   682
	public static int parseNumberFromSource(String number) {
hgs
parents:
diff changeset
   683
		int ret;
hgs
parents:
diff changeset
   684
		String low = number.toLowerCase();
hgs
parents:
diff changeset
   685
		int radix;
hgs
parents:
diff changeset
   686
		if (low.startsWith(SourceConstants.HEX_PREFIX)) {
hgs
parents:
diff changeset
   687
			radix = 16; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   688
			low = low.substring(SourceConstants.HEX_PREFIX.length());
hgs
parents:
diff changeset
   689
		} else if (low.startsWith(SourceConstants.OCTAL_PREFIX)
hgs
parents:
diff changeset
   690
				&& low.length() > SourceConstants.OCTAL_PREFIX.length()
hgs
parents:
diff changeset
   691
				&& Character.isDigit(low.charAt(SourceConstants.OCTAL_PREFIX
hgs
parents:
diff changeset
   692
						.length()))) {
hgs
parents:
diff changeset
   693
			radix = 8; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   694
			low = low.substring(SourceConstants.OCTAL_PREFIX.length());
hgs
parents:
diff changeset
   695
		} else {
hgs
parents:
diff changeset
   696
			radix = 10; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   697
		}
hgs
parents:
diff changeset
   698
		if (low.endsWith(SourceConstants.I64_POSTFIX)) {
hgs
parents:
diff changeset
   699
			low = low.substring(0, low.length()
hgs
parents:
diff changeset
   700
					- SourceConstants.I64_POSTFIX.length());
hgs
parents:
diff changeset
   701
		}
hgs
parents:
diff changeset
   702
		if (low.length() > 0) {
hgs
parents:
diff changeset
   703
			// Removes U / L characters from the end of value
hgs
parents:
diff changeset
   704
			int index = low.length() - 1;
hgs
parents:
diff changeset
   705
			boolean complete = false;
hgs
parents:
diff changeset
   706
			do {
hgs
parents:
diff changeset
   707
				char c = low.charAt(index);
hgs
parents:
diff changeset
   708
				if (c == 'u' || c == 'l') {
hgs
parents:
diff changeset
   709
					index--;
hgs
parents:
diff changeset
   710
				} else {
hgs
parents:
diff changeset
   711
					complete = true;
hgs
parents:
diff changeset
   712
				}
hgs
parents:
diff changeset
   713
			} while (!complete && index >= 0);
hgs
parents:
diff changeset
   714
			if (index < low.length() - 1 && index > 0) {
hgs
parents:
diff changeset
   715
				low = low.substring(0, index + 1);
hgs
parents:
diff changeset
   716
			}
hgs
parents:
diff changeset
   717
			ret = Integer.parseInt(low, radix);
hgs
parents:
diff changeset
   718
		} else {
hgs
parents:
diff changeset
   719
			ret = 0;
hgs
parents:
diff changeset
   720
		}
hgs
parents:
diff changeset
   721
		return ret;
hgs
parents:
diff changeset
   722
	}
hgs
parents:
diff changeset
   723
hgs
parents:
diff changeset
   724
	/**
hgs
parents:
diff changeset
   725
	 * Calculates the size of parameter
hgs
parents:
diff changeset
   726
	 * 
hgs
parents:
diff changeset
   727
	 * @param parameter
hgs
parents:
diff changeset
   728
	 *            the parameter
hgs
parents:
diff changeset
   729
	 * @return the parameter size or 0 if the size is not known at compile time
hgs
parents:
diff changeset
   730
	 */
hgs
parents:
diff changeset
   731
	public static int mapParameterTypeToSize(TraceParameter parameter) {
hgs
parents:
diff changeset
   732
		int retval;
hgs
parents:
diff changeset
   733
		ArrayParameterRule rule = parameter
hgs
parents:
diff changeset
   734
				.getExtension(ArrayParameterRule.class);
hgs
parents:
diff changeset
   735
		if (rule != null) {
hgs
parents:
diff changeset
   736
			// Array parameters are dynamic
hgs
parents:
diff changeset
   737
			retval = 0;
hgs
parents:
diff changeset
   738
		} else {
hgs
parents:
diff changeset
   739
			String type = parameter.getType();
hgs
parents:
diff changeset
   740
			TraceConstantTable table = parameter.getModel()
hgs
parents:
diff changeset
   741
					.findConstantTableByName(type);
hgs
parents:
diff changeset
   742
			if (table != null) {
hgs
parents:
diff changeset
   743
				type = table.getType();
hgs
parents:
diff changeset
   744
			}
hgs
parents:
diff changeset
   745
			retval = mapParameterTypeToSize(type);
hgs
parents:
diff changeset
   746
		}
hgs
parents:
diff changeset
   747
		return retval;
hgs
parents:
diff changeset
   748
	}
hgs
parents:
diff changeset
   749
hgs
parents:
diff changeset
   750
	/**
hgs
parents:
diff changeset
   751
	 * Calculates the size of parameter type
hgs
parents:
diff changeset
   752
	 * 
hgs
parents:
diff changeset
   753
	 * @param type
hgs
parents:
diff changeset
   754
	 *            the parameter type
hgs
parents:
diff changeset
   755
	 * @return the parameter size or 0 if size is not known at compile time
hgs
parents:
diff changeset
   756
	 */
hgs
parents:
diff changeset
   757
	public static int mapParameterTypeToSize(String type) {
hgs
parents:
diff changeset
   758
		int retval;
hgs
parents:
diff changeset
   759
		if (type.equals(TraceParameter.HEX32)
hgs
parents:
diff changeset
   760
				|| type.equals(TraceParameter.UDEC32)
hgs
parents:
diff changeset
   761
				|| type.equals(TraceParameter.SDEC32)
hgs
parents:
diff changeset
   762
				|| type.equals(TraceParameter.OCT32)
hgs
parents:
diff changeset
   763
				|| type.equals(TraceParameter.POINTER)) {
hgs
parents:
diff changeset
   764
			retval = 4; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   765
		} else if (type.equals(TraceParameter.HEX16)
hgs
parents:
diff changeset
   766
				|| type.equals(TraceParameter.UDEC16)
hgs
parents:
diff changeset
   767
				|| type.equals(TraceParameter.SDEC16)
hgs
parents:
diff changeset
   768
				|| type.equals(TraceParameter.OCT16)) {
hgs
parents:
diff changeset
   769
			retval = 2; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   770
		} else if (type.equals(TraceParameter.HEX8)
hgs
parents:
diff changeset
   771
				|| type.equals(TraceParameter.UDEC8)
hgs
parents:
diff changeset
   772
				|| type.equals(TraceParameter.SDEC8)
hgs
parents:
diff changeset
   773
				|| type.equals(TraceParameter.OCT8)) {
hgs
parents:
diff changeset
   774
			retval = 1;
hgs
parents:
diff changeset
   775
		} else if (type.equals(TraceParameter.HEX64)
hgs
parents:
diff changeset
   776
				|| type.equals(TraceParameter.UDEC64)
hgs
parents:
diff changeset
   777
				|| type.equals(TraceParameter.SDEC64)
hgs
parents:
diff changeset
   778
				|| type.equals(TraceParameter.OCT64)
hgs
parents:
diff changeset
   779
				|| type.equals(TraceParameter.FLOAT_EXP)
hgs
parents:
diff changeset
   780
				|| type.equals(TraceParameter.FLOAT_FIX)
hgs
parents:
diff changeset
   781
				|| type.equals(TraceParameter.FLOAT_OPT)) {
hgs
parents:
diff changeset
   782
			retval = 8; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   783
		} else {
hgs
parents:
diff changeset
   784
			retval = 0;
hgs
parents:
diff changeset
   785
		}
hgs
parents:
diff changeset
   786
		return retval;
hgs
parents:
diff changeset
   787
	}
hgs
parents:
diff changeset
   788
hgs
parents:
diff changeset
   789
	/**
hgs
parents:
diff changeset
   790
	 * Removes printf formatting from trace text
hgs
parents:
diff changeset
   791
	 * 
hgs
parents:
diff changeset
   792
	 * @param text
hgs
parents:
diff changeset
   793
	 *            the text to be converted
hgs
parents:
diff changeset
   794
	 * @return the new text
hgs
parents:
diff changeset
   795
	 */
hgs
parents:
diff changeset
   796
	public static String removePrintfFormatting(String text) {
hgs
parents:
diff changeset
   797
		Matcher matcher = traceTextPattern.matcher(text);
hgs
parents:
diff changeset
   798
		return matcher.replaceAll(""); //$NON-NLS-1$
hgs
parents:
diff changeset
   799
	}
hgs
parents:
diff changeset
   800
hgs
parents:
diff changeset
   801
	/**
hgs
parents:
diff changeset
   802
	 * Converts the given type to unsigned type
hgs
parents:
diff changeset
   803
	 * 
hgs
parents:
diff changeset
   804
	 * @param type
hgs
parents:
diff changeset
   805
	 *            the type
hgs
parents:
diff changeset
   806
	 * @return unsigned type
hgs
parents:
diff changeset
   807
	 */
hgs
parents:
diff changeset
   808
	private static String convertToUnsigned(String type) {
hgs
parents:
diff changeset
   809
		if (type.equals(TraceParameter.SDEC32)) {
hgs
parents:
diff changeset
   810
			type = TraceParameter.UDEC32;
hgs
parents:
diff changeset
   811
		} else if (type.equals(TraceParameter.SDEC16)) {
hgs
parents:
diff changeset
   812
			type = TraceParameter.UDEC16;
hgs
parents:
diff changeset
   813
		} else if (type.equals(TraceParameter.SDEC8)) {
hgs
parents:
diff changeset
   814
			type = TraceParameter.UDEC8;
hgs
parents:
diff changeset
   815
		} else if (type.equals(TraceParameter.SDEC64)) {
hgs
parents:
diff changeset
   816
			type = TraceParameter.UDEC64;
hgs
parents:
diff changeset
   817
		}
hgs
parents:
diff changeset
   818
		return type;
hgs
parents:
diff changeset
   819
	}
hgs
parents:
diff changeset
   820
hgs
parents:
diff changeset
   821
	/**
hgs
parents:
diff changeset
   822
	 * Maps a normal parameter type for format character
hgs
parents:
diff changeset
   823
	 * 
hgs
parents:
diff changeset
   824
	 * @param type
hgs
parents:
diff changeset
   825
	 *            the parameter type
hgs
parents:
diff changeset
   826
	 * @return the format character
hgs
parents:
diff changeset
   827
	 */
hgs
parents:
diff changeset
   828
	public static String mapNormalTypeToFormat(String type) { // CodForChk_Dis_ComplexFunc
hgs
parents:
diff changeset
   829
		String tag;
hgs
parents:
diff changeset
   830
		if (type.equals(TraceParameter.SDEC32)) {
hgs
parents:
diff changeset
   831
			tag = "%d"; //$NON-NLS-1$
hgs
parents:
diff changeset
   832
		} else if (type.equals(TraceParameter.POINTER)) {
hgs
parents:
diff changeset
   833
			tag = "%p"; //$NON-NLS-1$
hgs
parents:
diff changeset
   834
		} else if (type.equals(TraceParameter.HEX32)) {
hgs
parents:
diff changeset
   835
			tag = "%x"; //$NON-NLS-1$
hgs
parents:
diff changeset
   836
		} else if (type.equals(TraceParameter.UDEC32)) {
hgs
parents:
diff changeset
   837
			tag = "%u"; //$NON-NLS-1$
hgs
parents:
diff changeset
   838
		} else if (type.equals(TraceParameter.OCT32)) {
hgs
parents:
diff changeset
   839
			tag = "%o"; //$NON-NLS-1$			
hgs
parents:
diff changeset
   840
		} else if (type.equals(TraceParameter.SDEC16)) {
hgs
parents:
diff changeset
   841
			tag = "%hd"; //$NON-NLS-1$
hgs
parents:
diff changeset
   842
		} else if (type.equals(TraceParameter.HEX16)) {
hgs
parents:
diff changeset
   843
			tag = "%hx"; //$NON-NLS-1$
hgs
parents:
diff changeset
   844
		} else if (type.equals(TraceParameter.UDEC16)) {
hgs
parents:
diff changeset
   845
			tag = "%hu"; //$NON-NLS-1$
hgs
parents:
diff changeset
   846
		} else if (type.equals(TraceParameter.OCT16)) {
hgs
parents:
diff changeset
   847
			tag = "%ho"; //$NON-NLS-1$			
hgs
parents:
diff changeset
   848
		} else if (type.equals(TraceParameter.SDEC8)) {
hgs
parents:
diff changeset
   849
			tag = "%hhd"; //$NON-NLS-1$
hgs
parents:
diff changeset
   850
		} else if (type.equals(TraceParameter.HEX8)) {
hgs
parents:
diff changeset
   851
			tag = "%hhx"; //$NON-NLS-1$
hgs
parents:
diff changeset
   852
		} else if (type.equals(TraceParameter.UDEC8)) {
hgs
parents:
diff changeset
   853
			tag = "%hhu"; //$NON-NLS-1$
hgs
parents:
diff changeset
   854
		} else if (type.equals(TraceParameter.OCT8)) {
hgs
parents:
diff changeset
   855
			tag = "%hho"; //$NON-NLS-1$			
hgs
parents:
diff changeset
   856
		} else if (type.equals(TraceParameter.SDEC64)) {
hgs
parents:
diff changeset
   857
			tag = "%Ld"; //$NON-NLS-1$
hgs
parents:
diff changeset
   858
		} else if (type.equals(TraceParameter.HEX64)) {
hgs
parents:
diff changeset
   859
			tag = "%Lx"; //$NON-NLS-1$
hgs
parents:
diff changeset
   860
		} else if (type.equals(TraceParameter.UDEC64)) {
hgs
parents:
diff changeset
   861
			tag = "%Lu"; //$NON-NLS-1$
hgs
parents:
diff changeset
   862
		} else if (type.equals(TraceParameter.OCT64)) {
hgs
parents:
diff changeset
   863
			tag = "%Lo"; //$NON-NLS-1$			
hgs
parents:
diff changeset
   864
		} else if (type.equals(TraceParameter.ASCII)) {
hgs
parents:
diff changeset
   865
			tag = "%s"; //$NON-NLS-1$
hgs
parents:
diff changeset
   866
		} else if (type.equals(TraceParameter.UNICODE)) {
hgs
parents:
diff changeset
   867
			tag = "%S"; //$NON-NLS-1$
hgs
parents:
diff changeset
   868
		} else if (type.equals(TraceParameter.FLOAT_FIX)) {
hgs
parents:
diff changeset
   869
			tag = "%f"; //$NON-NLS-1$
hgs
parents:
diff changeset
   870
		} else if (type.equals(TraceParameter.FLOAT_EXP)) {
hgs
parents:
diff changeset
   871
			tag = "%e"; //$NON-NLS-1$
hgs
parents:
diff changeset
   872
		} else if (type.equals(TraceParameter.FLOAT_OPT)) {
hgs
parents:
diff changeset
   873
			tag = "%g"; //$NON-NLS-1$
hgs
parents:
diff changeset
   874
		} else {
hgs
parents:
diff changeset
   875
			tag = "%{" //$NON-NLS-1$
hgs
parents:
diff changeset
   876
					+ type + "}"; //$NON-NLS-1$
hgs
parents:
diff changeset
   877
		}
hgs
parents:
diff changeset
   878
		return tag;
hgs
parents:
diff changeset
   879
	}
hgs
parents:
diff changeset
   880
hgs
parents:
diff changeset
   881
	/**
hgs
parents:
diff changeset
   882
	 * Maps an array parameter type to format string
hgs
parents:
diff changeset
   883
	 * 
hgs
parents:
diff changeset
   884
	 * @param type
hgs
parents:
diff changeset
   885
	 *            the parameter type
hgs
parents:
diff changeset
   886
	 * @return the format string
hgs
parents:
diff changeset
   887
	 */
hgs
parents:
diff changeset
   888
	public static String mapArrayTypeToFormat(String type) {
hgs
parents:
diff changeset
   889
		String tag = "%{" //$NON-NLS-1$
hgs
parents:
diff changeset
   890
				+ type + "[]}"; //$NON-NLS-1$
hgs
parents:
diff changeset
   891
		return tag;
hgs
parents:
diff changeset
   892
	}
hgs
parents:
diff changeset
   893
hgs
parents:
diff changeset
   894
	/**
hgs
parents:
diff changeset
   895
	 * Maps format specifier to parameter length
hgs
parents:
diff changeset
   896
	 * 
hgs
parents:
diff changeset
   897
	 * @param formatSpecifier
hgs
parents:
diff changeset
   898
	 *            the specifier
hgs
parents:
diff changeset
   899
	 * @return the length
hgs
parents:
diff changeset
   900
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   901
	 *             if length is not valid
hgs
parents:
diff changeset
   902
	 */
hgs
parents:
diff changeset
   903
	public static int mapFormatToParameterLength(String formatSpecifier)
hgs
parents:
diff changeset
   904
			throws TraceCompilerException {
hgs
parents:
diff changeset
   905
		Matcher matcher = SourceUtils.lengthPattern.matcher(formatSpecifier);
hgs
parents:
diff changeset
   906
		int paramLength = 0;
hgs
parents:
diff changeset
   907
		if (matcher.find()) {
hgs
parents:
diff changeset
   908
			String length = matcher.group();
hgs
parents:
diff changeset
   909
hgs
parents:
diff changeset
   910
			if (length.length() == 2) { // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   911
				if (length.charAt(0) == 'h' && length.charAt(1) == 'h') {
hgs
parents:
diff changeset
   912
					paramLength = SourceConstants.BYTE_SIZE;
hgs
parents:
diff changeset
   913
				} else if (length.charAt(0) == 'l' && length.charAt(1) == 'l') {
hgs
parents:
diff changeset
   914
					paramLength = SourceConstants.LONG_SIZE;
hgs
parents:
diff changeset
   915
				} else {
hgs
parents:
diff changeset
   916
					StringErrorParameters params = new StringErrorParameters();
hgs
parents:
diff changeset
   917
					params.string = formatSpecifier;
hgs
parents:
diff changeset
   918
					throw new TraceCompilerException(
hgs
parents:
diff changeset
   919
							TraceCompilerErrorCode.PARAMETER_FORMAT_NOT_SUPPORTED,
hgs
parents:
diff changeset
   920
							params, null);
hgs
parents:
diff changeset
   921
				}
hgs
parents:
diff changeset
   922
			} else if (length.length() == 1) {
hgs
parents:
diff changeset
   923
				switch (length.charAt(0)) {
hgs
parents:
diff changeset
   924
				case 'h':
hgs
parents:
diff changeset
   925
					paramLength = SourceConstants.SHORT_SIZE;
hgs
parents:
diff changeset
   926
					break;
hgs
parents:
diff changeset
   927
				case 'l':
hgs
parents:
diff changeset
   928
					paramLength = SourceConstants.INT_SIZE;
hgs
parents:
diff changeset
   929
					break;
hgs
parents:
diff changeset
   930
				case 'L':
hgs
parents:
diff changeset
   931
					paramLength = SourceConstants.LONG_SIZE;
hgs
parents:
diff changeset
   932
					break;
hgs
parents:
diff changeset
   933
				default:
hgs
parents:
diff changeset
   934
					StringErrorParameters params = new StringErrorParameters();
hgs
parents:
diff changeset
   935
					params.string = formatSpecifier;
hgs
parents:
diff changeset
   936
					throw new TraceCompilerException(
hgs
parents:
diff changeset
   937
							TraceCompilerErrorCode.PARAMETER_FORMAT_NOT_SUPPORTED,
hgs
parents:
diff changeset
   938
							params, null);
hgs
parents:
diff changeset
   939
				}
hgs
parents:
diff changeset
   940
			} else {
hgs
parents:
diff changeset
   941
				throw new TraceCompilerException(
hgs
parents:
diff changeset
   942
						TraceCompilerErrorCode.INVALID_TRACE_TEXT_FORMAT, null,
hgs
parents:
diff changeset
   943
						formatSpecifier);
hgs
parents:
diff changeset
   944
			}
hgs
parents:
diff changeset
   945
		}
hgs
parents:
diff changeset
   946
hgs
parents:
diff changeset
   947
		return paramLength;
hgs
parents:
diff changeset
   948
	}
hgs
parents:
diff changeset
   949
hgs
parents:
diff changeset
   950
	/**
hgs
parents:
diff changeset
   951
	 * Maps signed parameter length to type
hgs
parents:
diff changeset
   952
	 * 
hgs
parents:
diff changeset
   953
	 * @param paramLength
hgs
parents:
diff changeset
   954
	 *            the length
hgs
parents:
diff changeset
   955
	 * @return the type
hgs
parents:
diff changeset
   956
	 */
hgs
parents:
diff changeset
   957
	private static String mapSignedToParameterType(int paramLength) {
hgs
parents:
diff changeset
   958
		String retval;
hgs
parents:
diff changeset
   959
		if (paramLength == SourceConstants.BYTE_SIZE) {
hgs
parents:
diff changeset
   960
			retval = TraceParameter.SDEC8;
hgs
parents:
diff changeset
   961
		} else if (paramLength == SourceConstants.SHORT_SIZE) {
hgs
parents:
diff changeset
   962
			retval = TraceParameter.SDEC16;
hgs
parents:
diff changeset
   963
		} else if (paramLength == SourceConstants.LONG_SIZE) {
hgs
parents:
diff changeset
   964
			retval = TraceParameter.SDEC64;
hgs
parents:
diff changeset
   965
		} else {
hgs
parents:
diff changeset
   966
			retval = TraceParameter.SDEC32;
hgs
parents:
diff changeset
   967
		}
hgs
parents:
diff changeset
   968
		return retval;
hgs
parents:
diff changeset
   969
	}
hgs
parents:
diff changeset
   970
hgs
parents:
diff changeset
   971
	/**
hgs
parents:
diff changeset
   972
	 * Maps unsigned parameter length to type
hgs
parents:
diff changeset
   973
	 * 
hgs
parents:
diff changeset
   974
	 * @param paramLength
hgs
parents:
diff changeset
   975
	 *            the length
hgs
parents:
diff changeset
   976
	 * @return the type
hgs
parents:
diff changeset
   977
	 */
hgs
parents:
diff changeset
   978
	public static String mapUnsignedToParameterType(int paramLength) {
hgs
parents:
diff changeset
   979
		String retval;
hgs
parents:
diff changeset
   980
		if (paramLength == SourceConstants.BYTE_SIZE) {
hgs
parents:
diff changeset
   981
			retval = TraceParameter.UDEC8;
hgs
parents:
diff changeset
   982
		} else if (paramLength == SourceConstants.SHORT_SIZE) {
hgs
parents:
diff changeset
   983
			retval = TraceParameter.UDEC16;
hgs
parents:
diff changeset
   984
		} else if (paramLength == SourceConstants.LONG_SIZE) {
hgs
parents:
diff changeset
   985
			retval = TraceParameter.UDEC64;
hgs
parents:
diff changeset
   986
		} else {
hgs
parents:
diff changeset
   987
			retval = TraceParameter.UDEC32;
hgs
parents:
diff changeset
   988
		}
hgs
parents:
diff changeset
   989
		return retval;
hgs
parents:
diff changeset
   990
	}
hgs
parents:
diff changeset
   991
hgs
parents:
diff changeset
   992
	/**
hgs
parents:
diff changeset
   993
	 * Maps hex parameter length to type
hgs
parents:
diff changeset
   994
	 * 
hgs
parents:
diff changeset
   995
	 * @param paramLength
hgs
parents:
diff changeset
   996
	 *            the length
hgs
parents:
diff changeset
   997
	 * @return the type
hgs
parents:
diff changeset
   998
	 */
hgs
parents:
diff changeset
   999
	public static String mapHexToParameterType(int paramLength) {
hgs
parents:
diff changeset
  1000
		String retval;
hgs
parents:
diff changeset
  1001
		if (paramLength == SourceConstants.BYTE_SIZE) {
hgs
parents:
diff changeset
  1002
			retval = TraceParameter.HEX8;
hgs
parents:
diff changeset
  1003
		} else if (paramLength == SourceConstants.SHORT_SIZE) {
hgs
parents:
diff changeset
  1004
			retval = TraceParameter.HEX16;
hgs
parents:
diff changeset
  1005
		} else if (paramLength == SourceConstants.LONG_SIZE) {
hgs
parents:
diff changeset
  1006
			retval = TraceParameter.HEX64;
hgs
parents:
diff changeset
  1007
		} else {
hgs
parents:
diff changeset
  1008
			retval = TraceParameter.HEX32;
hgs
parents:
diff changeset
  1009
		}
hgs
parents:
diff changeset
  1010
		return retval;
hgs
parents:
diff changeset
  1011
	}
hgs
parents:
diff changeset
  1012
hgs
parents:
diff changeset
  1013
	/**
hgs
parents:
diff changeset
  1014
	 * Maps octal parameter length to type
hgs
parents:
diff changeset
  1015
	 * 
hgs
parents:
diff changeset
  1016
	 * @param paramLength
hgs
parents:
diff changeset
  1017
	 *            the length
hgs
parents:
diff changeset
  1018
	 * @return the type
hgs
parents:
diff changeset
  1019
	 */
hgs
parents:
diff changeset
  1020
	public static String mapOctalToParameterType(int paramLength) {
hgs
parents:
diff changeset
  1021
		String retval;
hgs
parents:
diff changeset
  1022
		if (paramLength == SourceConstants.BYTE_SIZE) {
hgs
parents:
diff changeset
  1023
			retval = TraceParameter.OCT8;
hgs
parents:
diff changeset
  1024
		} else if (paramLength == SourceConstants.SHORT_SIZE) {
hgs
parents:
diff changeset
  1025
			retval = TraceParameter.OCT16;
hgs
parents:
diff changeset
  1026
		} else if (paramLength == SourceConstants.LONG_SIZE) {
hgs
parents:
diff changeset
  1027
			retval = TraceParameter.OCT64;
hgs
parents:
diff changeset
  1028
		} else {
hgs
parents:
diff changeset
  1029
			retval = TraceParameter.OCT32;
hgs
parents:
diff changeset
  1030
		}
hgs
parents:
diff changeset
  1031
hgs
parents:
diff changeset
  1032
		return retval;
hgs
parents:
diff changeset
  1033
	}
hgs
parents:
diff changeset
  1034
hgs
parents:
diff changeset
  1035
	/**
hgs
parents:
diff changeset
  1036
	 * Checks if the parameter can be represented with default trace macros
hgs
parents:
diff changeset
  1037
	 * 
hgs
parents:
diff changeset
  1038
	 * @param parameter
hgs
parents:
diff changeset
  1039
	 *            the parameter
hgs
parents:
diff changeset
  1040
	 * @return true if parameter can be represented with default trace macros
hgs
parents:
diff changeset
  1041
	 */
hgs
parents:
diff changeset
  1042
	public static boolean isSimpleType(TraceParameter parameter) {
hgs
parents:
diff changeset
  1043
		boolean retval;
hgs
parents:
diff changeset
  1044
		if (parameter.getExtension(ArrayParameterRule.class) != null) {
hgs
parents:
diff changeset
  1045
			// Arrays are always complex types
hgs
parents:
diff changeset
  1046
			retval = false;
hgs
parents:
diff changeset
  1047
		} else {
hgs
parents:
diff changeset
  1048
			String type = parameter.getType();
hgs
parents:
diff changeset
  1049
			TraceConstantTable table = parameter.getModel()
hgs
parents:
diff changeset
  1050
					.findConstantTableByName(type);
hgs
parents:
diff changeset
  1051
			if (table != null) {
hgs
parents:
diff changeset
  1052
				type = table.getType();
hgs
parents:
diff changeset
  1053
			}
hgs
parents:
diff changeset
  1054
			retval = isSimpleType(type);
hgs
parents:
diff changeset
  1055
		}
hgs
parents:
diff changeset
  1056
		return retval;
hgs
parents:
diff changeset
  1057
	}
hgs
parents:
diff changeset
  1058
hgs
parents:
diff changeset
  1059
	/**
hgs
parents:
diff changeset
  1060
	 * Simple type is 32-bit integer
hgs
parents:
diff changeset
  1061
	 * 
hgs
parents:
diff changeset
  1062
	 * @param type
hgs
parents:
diff changeset
  1063
	 *            the type
hgs
parents:
diff changeset
  1064
	 * @return true if simple, false if not
hgs
parents:
diff changeset
  1065
	 */
hgs
parents:
diff changeset
  1066
	private static boolean isSimpleType(String type) {
hgs
parents:
diff changeset
  1067
		return type.equals(TraceParameter.SDEC32)
hgs
parents:
diff changeset
  1068
				|| type.equals(TraceParameter.UDEC32)
hgs
parents:
diff changeset
  1069
				|| type.equals(TraceParameter.OCT32)
hgs
parents:
diff changeset
  1070
				|| type.equals(TraceParameter.HEX32);
hgs
parents:
diff changeset
  1071
	}
hgs
parents:
diff changeset
  1072
hgs
parents:
diff changeset
  1073
	/**
hgs
parents:
diff changeset
  1074
	 * String type is either ascii or unicode
hgs
parents:
diff changeset
  1075
	 * 
hgs
parents:
diff changeset
  1076
	 * @param type
hgs
parents:
diff changeset
  1077
	 *            the type
hgs
parents:
diff changeset
  1078
	 * @return true if string, false if not
hgs
parents:
diff changeset
  1079
	 */
hgs
parents:
diff changeset
  1080
	private static boolean isStringType(String type) {
hgs
parents:
diff changeset
  1081
		return type.equals(TraceParameter.ASCII)
hgs
parents:
diff changeset
  1082
				|| type.equals(TraceParameter.UNICODE);
hgs
parents:
diff changeset
  1083
	}
hgs
parents:
diff changeset
  1084
hgs
parents:
diff changeset
  1085
	/**
hgs
parents:
diff changeset
  1086
	 * Basic type is any of the built-in TraceParameter types
hgs
parents:
diff changeset
  1087
	 * 
hgs
parents:
diff changeset
  1088
	 * @param type
hgs
parents:
diff changeset
  1089
	 *            the type
hgs
parents:
diff changeset
  1090
	 * @return true if basic, false if not
hgs
parents:
diff changeset
  1091
	 */
hgs
parents:
diff changeset
  1092
	private static boolean isBasicType(String type) {
hgs
parents:
diff changeset
  1093
		return isSimpleType(type) || type.equals(TraceParameter.SDEC8)
hgs
parents:
diff changeset
  1094
				|| type.equals(TraceParameter.SDEC16)
hgs
parents:
diff changeset
  1095
				|| type.equals(TraceParameter.UDEC8)
hgs
parents:
diff changeset
  1096
				|| type.equals(TraceParameter.UDEC16)
hgs
parents:
diff changeset
  1097
				|| type.equals(TraceParameter.OCT16)
hgs
parents:
diff changeset
  1098
				|| type.equals(TraceParameter.HEX8)
hgs
parents:
diff changeset
  1099
				|| type.equals(TraceParameter.HEX16)
hgs
parents:
diff changeset
  1100
				|| type.equals(TraceParameter.SDEC64)
hgs
parents:
diff changeset
  1101
				|| type.equals(TraceParameter.UDEC64)
hgs
parents:
diff changeset
  1102
				|| type.equals(TraceParameter.OCT64)
hgs
parents:
diff changeset
  1103
				|| type.equals(TraceParameter.HEX64)
hgs
parents:
diff changeset
  1104
				|| type.equals(TraceParameter.ASCII)
hgs
parents:
diff changeset
  1105
				|| type.equals(TraceParameter.UNICODE)
hgs
parents:
diff changeset
  1106
				|| type.equals(TraceParameter.FLOAT_EXP)
hgs
parents:
diff changeset
  1107
				|| type.equals(TraceParameter.FLOAT_FIX)
hgs
parents:
diff changeset
  1108
				|| type.equals(TraceParameter.FLOAT_OPT)
hgs
parents:
diff changeset
  1109
				|| type.equals(TraceParameter.POINTER);
hgs
parents:
diff changeset
  1110
	}
hgs
parents:
diff changeset
  1111
hgs
parents:
diff changeset
  1112
	/**
hgs
parents:
diff changeset
  1113
	 * Checks if parameter size is dynamic
hgs
parents:
diff changeset
  1114
	 * 
hgs
parents:
diff changeset
  1115
	 * @param parameter
hgs
parents:
diff changeset
  1116
	 *            the parameter to be checked
hgs
parents:
diff changeset
  1117
	 * @return true if dynamic size
hgs
parents:
diff changeset
  1118
	 */
hgs
parents:
diff changeset
  1119
	public static boolean isParameterSizeDynamic(TraceParameter parameter) {
hgs
parents:
diff changeset
  1120
		String type = parameter.getType();
hgs
parents:
diff changeset
  1121
		ArrayParameterRule rule = parameter
hgs
parents:
diff changeset
  1122
				.getExtension(ArrayParameterRule.class);
hgs
parents:
diff changeset
  1123
		return rule != null || type.equals(TraceParameter.ASCII)
hgs
parents:
diff changeset
  1124
				|| type.equals(TraceParameter.UNICODE);
hgs
parents:
diff changeset
  1125
	}
hgs
parents:
diff changeset
  1126
hgs
parents:
diff changeset
  1127
	/**
hgs
parents:
diff changeset
  1128
	 * Checks if alignment is needed
hgs
parents:
diff changeset
  1129
	 * 
hgs
parents:
diff changeset
  1130
	 * @param type
hgs
parents:
diff changeset
  1131
	 *            the parameter type
hgs
parents:
diff changeset
  1132
	 * @return true if alignment is needed
hgs
parents:
diff changeset
  1133
	 */
hgs
parents:
diff changeset
  1134
	public static boolean isParameterAlignementNeeded(String type) {
hgs
parents:
diff changeset
  1135
		int size = SourceUtils.mapParameterTypeToSize(type);
hgs
parents:
diff changeset
  1136
		boolean retval = false;
hgs
parents:
diff changeset
  1137
		if (size == 1 || size == 2) { // CodForChk_Dis_Magic
hgs
parents:
diff changeset
  1138
			// 8 and 16-bit parameters need alignment
hgs
parents:
diff changeset
  1139
			retval = true;
hgs
parents:
diff changeset
  1140
		} else if (isStringType(type)) {
hgs
parents:
diff changeset
  1141
			retval = true;
hgs
parents:
diff changeset
  1142
		}
hgs
parents:
diff changeset
  1143
		return retval;
hgs
parents:
diff changeset
  1144
	}
hgs
parents:
diff changeset
  1145
hgs
parents:
diff changeset
  1146
}