You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
3.1 KiB

/* BEGIN_LEGAL
Copyright (c) 2021 Intel Corporation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
END_LEGAL */
/// @file xed-ex3.c
/// Encoder example
#include "xed/xed-interface.h"
#include "xed-examples-util.h"
#include "xed-enc-lang.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv);
void
usage(char* progname)
{
fprintf(stderr,"Usage: %s [-16|-32|-64] [-s16|-s32] encode-string\n",
progname);
exit(1);
}
ascii_encode_request_t
parse_args(int argc, char** argv)
{
char const* c = 0;
unsigned int i = 1;
unsigned int argcu = (unsigned int)argc;
ascii_encode_request_t r;
if (argcu == 1)
usage(argv[0]);
r.dstate.mmode = XED_MACHINE_MODE_LEGACY_32;
r.dstate.stack_addr_width = XED_ADDRESS_WIDTH_32b;
for( ; i< argcu; i++)
if (strcmp(argv[i],"-16")==0)
r.dstate.mmode = XED_MACHINE_MODE_LEGACY_16;
else if (strcmp(argv[i],"-32")==0)
r.dstate.mmode = XED_MACHINE_MODE_LEGACY_32;
else if (strcmp("-64", argv[i]) == 0) {
r.dstate.mmode = XED_MACHINE_MODE_LONG_64;
}
else if (strcmp("-32", argv[i]) == 0)
r.dstate.mmode = XED_MACHINE_MODE_LEGACY_32;
else if (strcmp("-16", argv[i]) == 0)
r.dstate.mmode = XED_MACHINE_MODE_LEGACY_16;
else if (strcmp(argv[i],"-s32")==0)
r.dstate.stack_addr_width = XED_ADDRESS_WIDTH_32b;
else if (strcmp(argv[i],"-s16")==0)
r.dstate.stack_addr_width = XED_ADDRESS_WIDTH_16b;
else
break;
if (i == argcu)
usage(argv[0]);
c = xed_strdup(argv[i++]);
for( ;i<argcu;i++) {
c = xedex_append_string(c, " ");
c = xedex_append_string(c, argv[i]);
}
r.command = c;
return r;
}
int main(int argc, char** argv) {
#define XED_EX3_BUFLEN 5000
char buf[XED_EX3_BUFLEN];
unsigned int ilen = XED_MAX_INSTRUCTION_BYTES;
unsigned int olen;
xed_uint8_t array[XED_MAX_INSTRUCTION_BYTES];
ascii_encode_request_t areq;
xed_encoder_request_t req;
xed_error_enum_t xed_error;
xed_bool_t encode_okay;
xed_tables_init();
areq = parse_args(argc,argv);
req = parse_encode_request(areq);
printf("Encode request:\n");
xed_encode_request_print(&req, buf, XED_EX3_BUFLEN);
printf("%s\n",buf);
xed_error = xed_encode(&req, array, ilen, &olen);
encode_okay = ( xed_error == XED_ERROR_NONE);
if (!encode_okay) {
printf("Could not encode\n");
return 1;
}
xed_print_hex_line(buf, array, olen, XED_EX3_BUFLEN);
printf("Encodable! %s\n",buf);
return 0;
}