--- /dev/null
+/*BEGIN_LEGAL
+Intel Open Source License
+
+Copyright (c) 2002-2007 Intel Corporation
+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. Neither the name of
+the Intel Corporation nor the names of its contributors may be used to
+endorse or promote products derived from this software without
+specific prior written permission.
+
+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 INTEL OR
+ITS 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.
+END_LEGAL */
+/// @file xed-ex4.c
+/// @author Mark Charney <mark.charney@intel.com>
+
+// decoder example. This is the "C" version of xed-ex2.cpp (which is C++).
+
+#include "xed-interface.h"
+#include "xed-examples-util.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h> //strcmp
+#include <assert.h>
+
+int main(int argc, char** argv);
+
+int
+main(int argc, char** argv)
+{
+ xed_error_enum_t xed_error;
+
+ xed_bool_t long_mode = 0;
+ xed_state_t dstate;
+ unsigned int first_argv;
+ unsigned int bytes = 0;
+ unsigned char itext[XED_MAX_INSTRUCTION_BYTES];
+ int i;
+ unsigned int u;
+ xed_decoded_inst_t xedd;
+#define BUFLEN 1000
+ char buffer[BUFLEN];
+ xed_bool_t ok;
+ xed_syntax_enum_t syntax;
+
+ xed_tables_init();
+ xed_state_zero(&dstate);
+ xed_set_verbosity( 99 );
+
+ if (argc > 2 && strcmp(argv[1], "-64") == 0)
+ long_mode = 1;
+
+ if (long_mode) {
+ first_argv = 2;
+ dstate.mmode=XED_MACHINE_MODE_LONG_64;
+ }
+ else {
+ first_argv=1;
+ xed_state_init(&dstate,
+ XED_MACHINE_MODE_LEGACY_32,
+ XED_ADDRESS_WIDTH_32b,
+ XED_ADDRESS_WIDTH_32b);
+ }
+
+ xed_decoded_inst_zero_set_mode(&xedd, &dstate);
+ for( i=first_argv ;i < argc; i++) {
+ xed_uint8_t x = (xed_uint8_t)(xed_atoi_hex(argv[i]));
+ assert(bytes < XED_MAX_INSTRUCTION_BYTES);
+ itext[bytes++] = x;
+ }
+ if (bytes == 0) {
+ fprintf(stderr, "Must supply some hex bytes\n");
+ exit(1);
+ }
+
+ printf("PARSING BYTES: ");
+ for( u=0;u<bytes; u++)
+ printf("%02x ", STATIC_CAST(unsigned int,itext[u]));
+ printf("\n");
+
+ xed_error = xed_decode(&xedd,
+ REINTERPRET_CAST(const xed_uint8_t*,itext),
+ bytes);
+ switch(xed_error)
+ {
+ case XED_ERROR_NONE:
+ break;
+ case XED_ERROR_BUFFER_TOO_SHORT:
+ fprintf(stderr,"Not enough bytes provided\n");
+ exit(1);
+ case XED_ERROR_GENERAL_ERROR:
+ fprintf(stderr,"Could not decode given input.\n");
+ exit(1);
+ default:
+ fprintf(stderr,"Unhandled error code %s\n", xed_error_enum_t2str(xed_error));
+ exit(1);
+ }
+
+ //memset(buffer,0,BUFLEN);
+ xed_decoded_inst_dump(&xedd,buffer, BUFLEN);
+ printf("%s\n",buffer);
+
+
+ for(syntax= XED_SYNTAX_XED; syntax < XED_SYNTAX_LAST; syntax++) {
+ ok = xed_format(syntax, &xedd, buffer, BUFLEN, 0);
+ if (ok)
+ printf("%s syntax: %s\n", xed_syntax_enum_t2str(syntax), buffer);
+ else
+ printf("Error disassembling %s syntax\n", xed_syntax_enum_t2str(syntax));
+ }
+ return 0;
+}