+ e = Jim_GetLong( interp, argv[2], &l );
+ width = l;
+ if( e != JIM_OK ){
+ return e;
+ }
+
+ e = Jim_GetLong( interp, argv[3], &l );
+ addr = l;
+ if( e != JIM_OK ){
+ return e;
+ }
+ e = Jim_GetLong( interp, argv[4], &l );
+ len = l;
+ if( e != JIM_OK ){
+ return e;
+ }
+ switch(width){
+ case 8:
+ width = 1;
+ break;
+ case 16:
+ width = 2;
+ break;
+ case 32:
+ width = 4;
+ break;
+ default:
+ Jim_SetResult(interp,
+ Jim_NewEmptyStringObj(interp));
+ Jim_AppendStrings( interp, Jim_GetResult(interp),
+ "Invalid width param, must be 8/16/32", NULL );
+ return JIM_ERR;
+ }
+ if( len == 0 ){
+ Jim_SetResult(interp,
+ Jim_NewEmptyStringObj(interp));
+ Jim_AppendStrings( interp, Jim_GetResult(interp),
+ "mem2array: zero width read?", NULL );
+ return JIM_ERR;
+ }
+ if( (addr + (len * width)) < addr ){
+ Jim_SetResult(interp,
+ Jim_NewEmptyStringObj(interp));
+ Jim_AppendStrings( interp, Jim_GetResult(interp),
+ "mem2array: addr + len - wraps to zero?", NULL );
+ return JIM_ERR;
+ }
+ /* absurd transfer size? */
+ if( len > 65536 ){
+ Jim_SetResult(interp,
+ Jim_NewEmptyStringObj(interp));
+ Jim_AppendStrings( interp, Jim_GetResult(interp),
+ "mem2array: absurd > 64K item request", NULL );
+ return JIM_ERR;
+ }
+
+ if( (width == 1) ||
+ ((width == 2) && ((addr & 1) == 0)) ||
+ ((width == 4) && ((addr & 3) == 0)) ){
+ /* all is well */
+ } else {
+ char buf[100];
+ Jim_SetResult(interp,
+ Jim_NewEmptyStringObj(interp));
+ sprintf( buf,
+ "mem2array address: 0x%08x is not aligned for %d byte reads",
+ addr, width );
+
+ Jim_AppendStrings( interp, Jim_GetResult(interp),
+ buf , NULL );
+ return JIM_ERR;
+ }