static void pawnExec( Pawn * pawn ) { chSysLock(); pawn->isRunning = 0; chSysUnlock(); uint32_t i; unsigned char * tmp = (unsigned char *)&pawn->amx; for ( i=0; i<sizeof( pawn->amx ); i++ ) tmp[i] = 0; pawn->amx.data = (uint8_t *)pawn->memblock; uint8_t * rom = (uint8_t *)(PAWN_FLASH_START + PAWN_PAGE_SIZE * PAWN_START_PAGE); pawn->result = amx_Init( &pawn->amx, rom ); if ( pawn->result != AMX_ERR_NONE ) return; static cell ret = 0; chSysLock(); pawn->isRunning = 1; chSysUnlock(); pawn->error = amx_Exec( &pawn->amx, &ret, AMX_EXEC_MAIN ); pawn->result = ret; amx_Cleanup( &pawn->amx ); chSysLock(); pawn->isRunning = 0; chSysUnlock(); }
/* aux_FreeProgram() * Clean up a program and free memory. * This function is extracted out of AMXAUX.C. */ int AMXAPI aux_FreeProgram(AMX *amx) { if (amx->base!=NULL) { amx_Cleanup(amx); free(amx->base); memset(amx,0,sizeof(AMX)); } /* if */ return AMX_ERR_NONE; }
int main(int argc,char *argv[]) { extern int amx_ConsoleInit(AMX *amx); extern int amx_ConsoleCleanup(AMX *amx); extern int amx_CoreInit(AMX *amx); extern int amx_CoredCleanp(AMX *amx); size_t memsize; void *program; AMX amx; int index, err; cell amx_addr, *phys_addr; char output[128]; if (argc != 4) PrintUsage(argv[0]); if ((memsize = aux_ProgramSize(argv[1])) == 0) PrintUsage(argv[0]); program = malloc(memsize); if (program == NULL) ErrorExit(NULL, AMX_ERR_MEMORY); err = aux_LoadProgram(&amx, argv[1], program); if (err) ErrorExit(&amx, err); amx_ConsoleInit(amx); err = amx_CoreInit(amx); if (err) ErrorExit(&amx, err); err = amx_FindPublic(&amx, argv[2], &index); if (err) ErrorExit(&amx, err); err = amx_Allot(&amx, strlen(argv[3]) + 1, &amx_addr, &phys_addr); if (err) ErrorExit(&amx, err); amx_SetString(phys_addr, argv[3], 0); err = amx_Exec(&amx, NULL, index, 1, amx_addr); if (err) ErrorExit(&amx, err); amx_GetString(output, phys_addr); amx_Release(&amx, amx_addr); printf("%s returns %s\n", argv[1], output); amx_ConsoleCleanup(&amx); amx_CoreCleanup(&amx); amx_Cleanup(&amx); free(program); return 0; }
void cleanup_pawn_machine (pawn_machine *machine) { if (machine->initialized) { amx_ElCleanup (&(machine->amx)); amx_StringCleanup (&(machine->amx)); amx_FloatCleanup (&(machine->amx)); amx_ConsoleCleanup (&(machine->amx)); amx_Cleanup (&(machine->amx)); machine->initialized = 0; } if (machine->buffer) { free (machine->buffer); machine->buffer = NULL; machine->buf_size = 0; } }