23Fermer25
Lionel DebrouxLe 02/08/2009 à 19:19
Code de ti89_recv_VAR_h:
int ti89_recv_VAR_h(CalcHandle* handle, uint32_t * varsize, uint8_t * vartype, char *varname)
{
  uint8_t host, cmd;
  uint8_t *buffer = (uint8_t *)handle->priv2;
  uint16_t length;
  uint8_t strl;
  uint8_t flag;

  fprintf(stderr,"%s varname = %s\n", __FUNCTION__, varname);
  TRYF(dbus_recv(handle, &host, &cmd, &length, buffer));

  if (cmd == CMD_EOT)
    return ERR_EOT;		// not really an error

  if (cmd == CMD_SKP)
    return ERR_CALC_ERROR1 + err_code(buffer);

  if (cmd != CMD_VAR)
    return ERR_INVALID_CMD;

  *varsize = buffer[0] | (buffer[1] << 8) |
      (buffer[2] << 16) | (buffer[3] << 24);
  *vartype = buffer[4];
  strl = buffer[5];
  memcpy(varname, buffer + 6, strl);
  varname[strl] = '\0';
  flag = buffer[6 + strl];
  fprintf(stderr,"%s varname = %s strl=%hu\n", __FUNCTION__, varname, (unsigned short)strl); 

  if ((length != (6 + strlen(varname))) &&
      (length != (7 + strlen(varname))))
    return ERR_INVALID_PACKET;

  ticalcs_info(" TI->PC: VAR (size=0x%08X=%i, id=%02X, name=%s, flag=%i)",
	  *varsize, *varsize, *vartype, varname, flag);

  return 0;
}


dbus_recv est la fonction de réception sur le link, elle écrit dans handle->priv2 qui est un buffer de 64 KB + 4 ou 6 octets.
Sur AMS, les deux fprintf affichent le même varname, quel que soit le répertoire d'origine de la variable.
Sur PedroM, le deuxième fprintf affiche, contrairement au premier, un varname comportant le répertoire d'origine de la variable (par exemple "system\stdlib").

Même si le comportement de PedroM est changé (je pense qu'il devrait l'être), ça n'empêche naturellement pas de limiter l'utilisation par libti* de fonctions qui déclenchent abort(). Ca consiste par exemple en le remplacement des appels à ti*_error (qui appellent g_logv(..., G_LOG_LEVEL_ERROR, ...);, toujours fatal) par des appels ti*_critical.