root/tools/find_levent.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. usage
  2. dump_levent_table
  3. process_dump
  4. main

   1 #include <stdio.h>
   2 #include <stdint.h>
   3 #include <string.h>
   4 #include <stdlib.h>
   5 #include "dumputil.h"
   6 
   7 int opt_def;
   8 int opt_full;
   9 
  10 void usage()
  11 {
  12     fprintf(stderr,"find_levent [-full] [-def] <dumpfile.bin> <base address>\n");
  13     exit(1);
  14 }
  15 
  16 void dump_levent_table(dump_t *dump,unsigned index)
  17 {
  18         unsigned i;
  19         printf("id hex, id dec, name, param\n");
  20         for(i=index; i < dump->words - 3 && dump->pw[i]; i+=3) {
  21                 printf("0x%04x, %5d, %s, %d\n",dump->pw[i+1],
  22                                                                 dump->pw[i+1],
  23                                                                 (*(deref_string_ptr(dump,i*4)))?deref_string_ptr(dump,i*4):"(none)",
  24                                                                 dump->pw[i+2]);
  25         }
  26 }
  27 
  28 int process_dump(dump_t *dump)
  29 {
  30         const char *sig_str="PressRightButton";
  31         unsigned mark_offset=0;
  32         unsigned mark_addr=0;
  33         unsigned i,j;
  34         while(find_cstring(dump,&mark_offset,sig_str)) {
  35                 mark_addr=offset_to_ptr(dump,mark_offset);
  36         // find {char *->"PressRightButton,x,0}
  37                 i=0;
  38                 while(find_word_aligned(dump,&i,mark_addr)) {
  39                         if( dump->pw[i+1] > 0x800 && 
  40                                 dump->pw[i+1] < 0xFFFF &&
  41                                 dump->pw[i+2] == 0) {
  42                                 // now work backwards to try to find start: p->"",0x800,
  43                                 for (j=i; j > 3; j-=3) {
  44                                         if(dump->pw[j+1]==0x800 && deref_byte_ptr(dump,j*4) == 0 ) {
  45                                                 if(opt_def) {
  46                                                         printf("DEF(levent_table,0x%X)\n",j*4+dump->base);
  47                                                 }
  48                                                 else {
  49                                                         printf("levent_table 0x%X\n",j*4+dump->base);
  50                                                 }
  51                                                 if(opt_full) {
  52                                                         dump_levent_table(dump,j);
  53                                                 }
  54                                                 return 1;
  55                                         }
  56                                 }
  57                         }
  58                         i++;
  59                 }
  60                 mark_offset += strlen(sig_str);
  61         }
  62         if(!mark_offset) {
  63                 fprintf(stderr,"error: \"%s\" not found\n",sig_str);
  64         }
  65         else {
  66                 fprintf(stderr,"error: event table not found\n");
  67         }
  68         return 0;
  69 }
  70 
  71 int main(int argc, char **argv)
  72 {
  73 
  74         dump_t dump;    
  75         int i;
  76         const char *dumpname=NULL;
  77         const char *base=NULL;
  78 
  79         for(i = 1; i < argc; i++) {
  80                 if ( strcmp(argv[i],"-def") == 0 ) {
  81                         opt_def = 1;
  82                 }
  83                 else if (strcmp(argv[i],"-full") == 0 ) {
  84                         opt_full = 1;
  85                 }
  86                 else if ( argv[i][0] == '-' ) {
  87                         fprintf(stderr,"%s unknown option %s\n",argv[0],argv[i]);
  88                         usage();
  89                 }
  90                 else {
  91                         if (!dumpname) {
  92                                 dumpname=argv[i];
  93                         } else if(!base) {
  94                                 base=argv[i];
  95                         } else {
  96                                 fprintf(stderr,"%s unexpected %s\n",argv[0],argv[i]);
  97                                 usage();
  98                         }
  99                 }
 100         }
 101         if(!dumpname || !base) {
 102                 usage();
 103         }
 104 
 105         if(!load_dump(dumpname,base,&dump))
 106                 return 1;
 107 
 108         if(!process_dump(&dump))
 109                 return 1;
 110 
 111         return 0;
 112 }

/* [<][>][^][v][top][bottom][index][help] */