X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/f53020e729d583f7975095ca7b4b467741d99edb..1f3d5401a6627d0cd3dcecc54cd058e9bd8a5e9d:/client/reveng/model.c?ds=inline

diff --git a/client/reveng/model.c b/client/reveng/model.c
index 2d45b2fe..fe40404f 100644
--- a/client/reveng/model.c
+++ b/client/reveng/model.c
@@ -1,5 +1,5 @@
 /* model.c
- * Greg Cook, 9/Apr/2015
+ * Greg Cook, 29/Jul/2015
  */
 
 /* CRC RevEng, an arbitrary-precision CRC calculator and algorithm finder
@@ -21,7 +21,8 @@
  * along with CRC RevEng.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* 2014-01-14: added CRC-8/DVB-S2
+/* 2015-07-29: eliminated struct malias.isprimry
+ * 2014-01-14: added CRC-8/DVB-S2
  * 2014-01-11: corrected CRC-40/GSM, added alias CRC-8/AES
  * 2013-10-14: added CRC-13/BBC and six cdma2000 algorithms
  * 2013-06-11: ensure BMP_BIT is an integer constant to compile presets
@@ -67,8 +68,7 @@ struct mpreset {
 
 struct malias {
 	const char *name;
-	const struct mpreset *model;
-	const int isprimry;
+	const struct mpreset *const model;
 };
 
 #ifdef PRESETS
@@ -404,110 +404,110 @@ static const struct mpreset models[] = {
 
 /* List of names with pointers to models, pre-sorted for use with bsearch() */
 static const struct malias aliases[] = {
-	{"ARC",			models+47, 1},	/*   0 */
-	{"B-CRC-32",		models+ 4, 0},	/*   1 */
-	{"CKSUM",		models+ 2, 0},	/*   2 */
-	{"CRC-10",		models+58, 1},	/*   3 */
-	{"CRC-10/CDMA2000",	models+71, 1},	/*   4 */
-	{"CRC-11",		models+45, 1},	/*   5 */
-	{"CRC-12/3GPP",		models+53, 1},	/*   6 */
-	{"CRC-12/CDMA2000",	models+70, 1},	/*   7 */
-	{"CRC-12/DECT",		models+52, 1},	/*   8 */
-	{"CRC-13/BBC",		models+69, 1},	/*   9 */
-	{"CRC-14/DARC",		models+30, 1},	/*  10 */
-	{"CRC-15",		models+56, 1},	/*  11 */
-	{"CRC-15/MPT1327",	models+67, 1},	/*  12 */
-	{"CRC-16",		models+47, 0},	/*  13 */
-	{"CRC-16/ACORN",	models+15, 0},	/*  14 */
-	{"CRC-16/ARC",		models+47, 0},	/*  15 */
-	{"CRC-16/AUG-CCITT",	models+17, 1},	/*  16 */
-	{"CRC-16/BUYPASS",	models+46, 1},	/*  17 */
-	{"CRC-16/CCITT",	models+16, 0},	/*  18 */
-	{"CRC-16/CCITT-FALSE",	models+21, 1},	/*  19 */
-	{"CRC-16/CCITT-TRUE",	models+16, 0},	/*  20 */
-	{"CRC-16/CDMA2000",	models+66, 1},	/*  21 */
-	{"CRC-16/DARC",		models+22, 0},	/*  22 */
-	{"CRC-16/DDS-110",	models+49, 1},	/*  23 */
-	{"CRC-16/DECT-R",	models+ 8, 1},	/*  24 */
-	{"CRC-16/DECT-X",	models+ 7, 1},	/*  25 */
-	{"CRC-16/DNP",		models+36, 1},	/*  26 */
-	{"CRC-16/EN-13757",	models+35, 1},	/*  27 */
-	{"CRC-16/EPC",		models+22, 0},	/*  28 */
-	{"CRC-16/GENIBUS",	models+22, 1},	/*  29 */
-	{"CRC-16/I-CODE",	models+22, 0},	/*  30 */
-	{"CRC-16/IBM-SDLC",	models+24, 0},	/*  31 */
-	{"CRC-16/ISO-HDLC",	models+24, 0},	/*  32 */
-	{"CRC-16/LHA",		models+47, 0},	/*  33 */
-	{"CRC-16/MAXIM",	models+48, 1},	/*  34 */
-	{"CRC-16/MCRF4XX",	models+23, 1},	/*  35 */
-	{"CRC-16/RIELLO",	models+19, 1},	/*  36 */
-	{"CRC-16/SPI-FUJITSU",	models+17, 0},	/*  37 */
-	{"CRC-16/T10-DIF",	models+57, 1},	/*  38 */
-	{"CRC-16/TELEDISK",	models+63, 1},	/*  39 */
-	{"CRC-16/TMS37157",	models+18, 1},	/*  40 */
-	{"CRC-16/USB",		models+51, 1},	/*  41 */
-	{"CRC-16/VERIFONE",	models+46, 0},	/*  42 */
-	{"CRC-24",		models+55, 1},	/*  43 */
-	{"CRC-24/FLEXRAY-A",	models+42, 1},	/*  44 */
-	{"CRC-24/FLEXRAY-B",	models+41, 1},	/*  45 */
-	{"CRC-24/OPENPGP",	models+55, 0},	/*  46 */
-	{"CRC-3/ROHC",		models+43, 1},	/*  47 */
-	{"CRC-31/PHILIPS",	models+12, 1},	/*  48 */
-	{"CRC-32",		models+ 6, 1},	/*  49 */
-	{"CRC-32/AAL5",		models+ 4, 0},	/*  50 */
-	{"CRC-32/ADCCP",	models+ 6, 0},	/*  51 */
-	{"CRC-32/BZIP2",	models+ 4, 1},	/*  52 */
-	{"CRC-32/CASTAGNOLI",	models+29, 0},	/*  53 */
-	{"CRC-32/DECT-B",	models+ 4, 0},	/*  54 */
-	{"CRC-32/ISCSI",	models+29, 0},	/*  55 */
-	{"CRC-32/MPEG-2",	models+ 3, 1},	/*  56 */
-	{"CRC-32/POSIX",	models+ 2, 1},	/*  57 */
-	{"CRC-32C",		models+29, 1},	/*  58 */
-	{"CRC-32D",		models+65, 1},	/*  59 */
-	{"CRC-32Q",		models+54, 1},	/*  60 */
-	{"CRC-4/ITU",		models+32, 1},	/*  61 */
-	{"CRC-40/GSM",		models+ 1, 1},	/*  62 */
-	{"CRC-5/EPC",		models+40, 1},	/*  63 */
-	{"CRC-5/ITU",		models+64, 1},	/*  64 */
-	{"CRC-5/USB",		models+31, 1},	/*  65 */
-	{"CRC-6/CDMA2000-A",	models+61, 1},	/*  66 */
-	{"CRC-6/CDMA2000-B",	models+26, 1},	/*  67 */
-	{"CRC-6/DARC",		models+44, 1},	/*  68 */
-	{"CRC-6/ITU",		models+13, 1},	/*  69 */
-	{"CRC-64",		models+37, 1},	/*  70 */
-	{"CRC-64/WE",		models+38, 1},	/*  71 */
-	{"CRC-64/XZ",		models+39, 1},	/*  72 */
-	{"CRC-7",		models+25, 1},	/*  73 */
-	{"CRC-7/ROHC",		models+62, 1},	/*  74 */
-	{"CRC-8",		models+ 9, 1},	/*  75 */
-	{"CRC-8/AES",		models+28, 0},	/*  76 */
-	{"CRC-8/CDMA2000",	models+60, 1},	/*  77 */
-	{"CRC-8/DARC",		models+34, 1},	/*  78 */
-	{"CRC-8/DVB-S2",	models+68, 1},	/*  79 */
-	{"CRC-8/EBU",		models+28, 1},	/*  80 */
-	{"CRC-8/I-CODE",	models+27, 1},	/*  81 */
-	{"CRC-8/ITU",		models+10, 1},	/*  82 */
-	{"CRC-8/MAXIM",		models+33, 1},	/*  83 */
-	{"CRC-8/ROHC",		models+11, 1},	/*  84 */
-	{"CRC-8/WCDMA",		models+59, 1},	/*  85 */
-	{"CRC-82/DARC",		models+14, 1},	/*  86 */
-	{"CRC-A",		models+20, 1},	/*  87 */
-	{"CRC-B",		models+24, 0},	/*  88 */
-	{"CRC-CCITT",		models+16, 0},	/*  89 */
-	{"CRC-IBM",		models+47, 0},	/*  90 */
-	{"DOW-CRC",		models+33, 0},	/*  91 */
-	{"JAMCRC",		models+ 5, 1},	/*  92 */
-	{"KERMIT",		models+16, 1},	/*  93 */
-	{"MODBUS",		models+50, 1},	/*  94 */
-	{"PKZIP",		models+ 6, 0},	/*  95 */
-	{"R-CRC-16",		models+ 8, 0},	/*  96 */
-	{"X-25",		models+24, 1},	/*  97 */
-	{"X-CRC-12",		models+52, 0},	/*  98 */
-	{"X-CRC-16",		models+ 7, 0},	/*  99 */
-	{"XFER",		models+ 0, 1},	/* 100 */
-	{"XMODEM",		models+15, 1},	/* 101 */
-	{"ZMODEM",		models+15, 0},	/* 102 */
-	{NULL,			NULL,      0},	/* terminating entry */
+	{"ARC",			models+47},	/*   0 */
+	{"B-CRC-32",		models+ 4},	/*   1 */
+	{"CKSUM",		models+ 2},	/*   2 */
+	{"CRC-10",		models+58},	/*   3 */
+	{"CRC-10/CDMA2000",	models+71},	/*   4 */
+	{"CRC-11",		models+45},	/*   5 */
+	{"CRC-12/3GPP",		models+53},	/*   6 */
+	{"CRC-12/CDMA2000",	models+70},	/*   7 */
+	{"CRC-12/DECT",		models+52},	/*   8 */
+	{"CRC-13/BBC",		models+69},	/*   9 */
+	{"CRC-14/DARC",		models+30},	/*  10 */
+	{"CRC-15",		models+56},	/*  11 */
+	{"CRC-15/MPT1327",	models+67},	/*  12 */
+	{"CRC-16",		models+47},	/*  13 */
+	{"CRC-16/ACORN",	models+15},	/*  14 */
+	{"CRC-16/ARC",		models+47},	/*  15 */
+	{"CRC-16/AUG-CCITT",	models+17},	/*  16 */
+	{"CRC-16/BUYPASS",	models+46},	/*  17 */
+	{"CRC-16/CCITT",	models+16},	/*  18 */
+	{"CRC-16/CCITT-FALSE",	models+21},	/*  19 */
+	{"CRC-16/CCITT-TRUE",	models+16},	/*  20 */
+	{"CRC-16/CDMA2000",	models+66},	/*  21 */
+	{"CRC-16/DARC",		models+22},	/*  22 */
+	{"CRC-16/DDS-110",	models+49},	/*  23 */
+	{"CRC-16/DECT-R",	models+ 8},	/*  24 */
+	{"CRC-16/DECT-X",	models+ 7},	/*  25 */
+	{"CRC-16/DNP",		models+36},	/*  26 */
+	{"CRC-16/EN-13757",	models+35},	/*  27 */
+	{"CRC-16/EPC",		models+22},	/*  28 */
+	{"CRC-16/GENIBUS",	models+22},	/*  29 */
+	{"CRC-16/I-CODE",	models+22},	/*  30 */
+	{"CRC-16/IBM-SDLC",	models+24},	/*  31 */
+	{"CRC-16/ISO-HDLC",	models+24},	/*  32 */
+	{"CRC-16/LHA",		models+47},	/*  33 */
+	{"CRC-16/MAXIM",	models+48},	/*  34 */
+	{"CRC-16/MCRF4XX",	models+23},	/*  35 */
+	{"CRC-16/RIELLO",	models+19},	/*  36 */
+	{"CRC-16/SPI-FUJITSU",	models+17},	/*  37 */
+	{"CRC-16/T10-DIF",	models+57},	/*  38 */
+	{"CRC-16/TELEDISK",	models+63},	/*  39 */
+	{"CRC-16/TMS37157",	models+18},	/*  40 */
+	{"CRC-16/USB",		models+51},	/*  41 */
+	{"CRC-16/VERIFONE",	models+46},	/*  42 */
+	{"CRC-24",		models+55},	/*  43 */
+	{"CRC-24/FLEXRAY-A",	models+42},	/*  44 */
+	{"CRC-24/FLEXRAY-B",	models+41},	/*  45 */
+	{"CRC-24/OPENPGP",	models+55},	/*  46 */
+	{"CRC-3/ROHC",		models+43},	/*  47 */
+	{"CRC-31/PHILIPS",	models+12},	/*  48 */
+	{"CRC-32",		models+ 6},	/*  49 */
+	{"CRC-32/AAL5",		models+ 4},	/*  50 */
+	{"CRC-32/ADCCP",	models+ 6},	/*  51 */
+	{"CRC-32/BZIP2",	models+ 4},	/*  52 */
+	{"CRC-32/CASTAGNOLI",	models+29},	/*  53 */
+	{"CRC-32/DECT-B",	models+ 4},	/*  54 */
+	{"CRC-32/ISCSI",	models+29},	/*  55 */
+	{"CRC-32/MPEG-2",	models+ 3},	/*  56 */
+	{"CRC-32/POSIX",	models+ 2},	/*  57 */
+	{"CRC-32C",		models+29},	/*  58 */
+	{"CRC-32D",		models+65},	/*  59 */
+	{"CRC-32Q",		models+54},	/*  60 */
+	{"CRC-4/ITU",		models+32},	/*  61 */
+	{"CRC-40/GSM",		models+ 1},	/*  62 */
+	{"CRC-5/EPC",		models+40},	/*  63 */
+	{"CRC-5/ITU",		models+64},	/*  64 */
+	{"CRC-5/USB",		models+31},	/*  65 */
+	{"CRC-6/CDMA2000-A",	models+61},	/*  66 */
+	{"CRC-6/CDMA2000-B",	models+26},	/*  67 */
+	{"CRC-6/DARC",		models+44},	/*  68 */
+	{"CRC-6/ITU",		models+13},	/*  69 */
+	{"CRC-64",		models+37},	/*  70 */
+	{"CRC-64/WE",		models+38},	/*  71 */
+	{"CRC-64/XZ",		models+39},	/*  72 */
+	{"CRC-7",		models+25},	/*  73 */
+	{"CRC-7/ROHC",		models+62},	/*  74 */
+	{"CRC-8",		models+ 9},	/*  75 */
+	{"CRC-8/AES",		models+28},	/*  76 */
+	{"CRC-8/CDMA2000",	models+60},	/*  77 */
+	{"CRC-8/DARC",		models+34},	/*  78 */
+	{"CRC-8/DVB-S2",	models+68},	/*  79 */
+	{"CRC-8/EBU",		models+28},	/*  80 */
+	{"CRC-8/I-CODE",	models+27},	/*  81 */
+	{"CRC-8/ITU",		models+10},	/*  82 */
+	{"CRC-8/MAXIM",		models+33},	/*  83 */
+	{"CRC-8/ROHC",		models+11},	/*  84 */
+	{"CRC-8/WCDMA",		models+59},	/*  85 */
+	{"CRC-82/DARC",		models+14},	/*  86 */
+	{"CRC-A",		models+20},	/*  87 */
+	{"CRC-B",		models+24},	/*  88 */
+	{"CRC-CCITT",		models+16},	/*  89 */
+	{"CRC-IBM",		models+47},	/*  90 */
+	{"DOW-CRC",		models+33},	/*  91 */
+	{"JAMCRC",		models+ 5},	/*  92 */
+	{"KERMIT",		models+16},	/*  93 */
+	{"MODBUS",		models+50},	/*  94 */
+	{"PKZIP",		models+ 6},	/*  95 */
+	{"R-CRC-16",		models+ 8},	/*  96 */
+	{"X-25",		models+24},	/*  97 */
+	{"X-CRC-12",		models+52},	/*  98 */
+	{"X-CRC-16",		models+ 7},	/*  99 */
+	{"XFER",		models+ 0},	/* 100 */
+	{"XMODEM",		models+15},	/* 101 */
+	{"ZMODEM",		models+15},	/* 102 */
+	{NULL,			NULL     },	/* terminating entry */
 };
 #    define NALIASES 103
 
@@ -520,7 +520,7 @@ static const struct mpreset models[] = {
 #  define NPRESETS 0
 
 static const struct malias aliases[] = {
-	{NULL,			NULL,      0},	/* terminating entry */
+	{NULL,			NULL     },	/* terminating entry */
 };
 #  define NALIASES 0
 
@@ -587,13 +587,15 @@ int
 mbynam(model_t *dest, const char *key) {
 	/* Sets parameters in dest according to the model named by key.
 	 */
-	struct malias akey = {NULL, NULL, 0}, *aptr;
+	struct malias akey = {NULL, NULL}, *aptr;
 	char *ukey, *uptr;
 
 	if(!aliases->name)
 		return(-1);
-	if(!(ukey = malloc((size_t) 1 + strlen(key))))
+	if(!(ukey = malloc((size_t) 1 + strlen(key)))) {
 		uerror("cannot allocate memory for comparison string");
+		return(0);
+	}
 	akey.name = uptr = ukey;
 	do
 		*uptr++ = toupper(*key);
@@ -613,7 +615,7 @@ mbynum(model_t *dest, int num) {
 	/* Sets parameters in dest according to the model indexed by num. */
 	if(num > NPRESETS)
 		num = NPRESETS;
-	munpack(dest, models+num);
+	munpack(dest, num+models);
 }
 
 int
@@ -633,7 +635,8 @@ mnames(void) {
 	const struct malias *aptr = aliases;
 
 	while(aptr->name) {
-		if(aptr->isprimry)
+		if(aptr->name == aptr->model->name
+			|| !strcmp(aptr->name, aptr->model->name))
 			size += strlen(aptr->name) + 1;
 		++aptr;
 	}
@@ -642,7 +645,8 @@ mnames(void) {
 		aptr = aliases;
 		sptr = string;
 		while(aptr->name) {
-			if(aptr->isprimry) {
+			if(aptr->name == aptr->model->name
+				|| !strcmp(aptr->name, aptr->model->name)) {
 				strcpy(sptr, aptr->name);
 				sptr += strlen(aptr->name);
 				*sptr++ = '\n';
@@ -713,12 +717,15 @@ mtostr(const model_t *model) {
 
 void
 mmatch(model_t *model, int flags) {
+
+	if(!model) return;
+	
 	/* searches models[] for a model matching the argument, and links a name if found
 	 * if flags & M_OVERWR, copies the found model onto the argument. */
 	model_t *mptr;
-	if(!model) return;
 
 	mptr = bsearch(model, models, NPRESETS, sizeof(model_t), (int (*)(const void *, const void *)) &mcmp);
+
 	if(mptr) {
 		model->name = mptr->name;
 		if(flags & M_OVERWR)