示例#1
0
bool Sector::_handleRequestExceptCommandListener(Request* req,Sector* except) {
	bool suc = true;
	if (getManager()==NULL||getManager()->handleRequest(req)) {
		Command* cmd = new Command(req->getType(),req->getData());
		if(!_sendCommandExcept(cmd,except)){
			suc=false;
		}
		cmd->release();
	}
	if (getManager()==NULL||getManager()->reportToSuperior(req)) {
		if (getSuperior()!=NULL) {
			if(!getSuperior()->_handleRequestExceptCommandListener(req,this)){
				suc=false;
			}
		}
	}
	return suc;
}
char  *modulo(const char *n1, const char *n2)
{
  int   size1, size2, sup;
  char  *tmp, *tmp2, *multi;

  if (!n1 || !n2)
    return 0;
  if (!strcmp(n2, "0")) {
      return strdup("null");
    }
  if (!strcmp(n2, "1")) {
    return strdup("0");
  }
  size1 = strlen(n1);
  size2 = strlen(n2);
  if (size1 < size2) {
      return strdup(n1);
    }
  if (!strcmp(n1, n2)) {
      return strdup("0");
    }
  tmp = strdup(n1);
  while (strcmp(tmp, "0") && isBigger2(tmp, n2, size1, size2)) {
      sup = getSuperior(size1, size2, tmp, n2);
      multi = getDivider(sup, tmp, n2);
      tmp2 = mult(multi, n2);
      free(multi);
      multi = getSubstractNumber(tmp, tmp2);
      free(tmp2);
      tmp2 = multi;
      multi = substract(tmp, tmp2);
      free(tmp);
      free(tmp2);
      tmp = multi;
      size1 = strlen(tmp);
      if (!strcmp(tmp, n2)) {
	free(tmp);
	return strdup("0");
      }
    }
  return tmp;
}
char  *divide(const char *n1, const char *n2)
{
  int   size1, size2, pos = 0, sup, x, tmp_size, old_size;
  char  *ret, *tmp, *tmp2, *multi;

  if (!n1 || !n2)
    return 0;
  if (!strcmp(n2, "0")) {
      return strdup("null");
    }
  if (!strcmp(n2, "1")) {
      return strdup(n1);
    }
  size1 = strlen(n1);
  size2 = strlen(n2);
  if (size1 < size2) {
      return strdup("0");
    }
  if (!strcmp(n1, n2)) {
      return strdup("1");
    }
  ret = malloc(sizeof(*ret) * (size1 + 2));
  memset(ret, 0, size1 + 2 * sizeof(*ret));
  tmp = strdup(n1);

  while (strcmp(tmp, "0") && isBigger2(tmp, n2, size1, size2)) {
      sup = getSuperior(size1, size2, tmp, n2);
      multi = getDivider(sup, tmp, n2);
      x = 0;
      while (multi[x])
	ret[pos++] = multi[x++];
      tmp2 = mult(multi, n2);
      tmp_size = strlen(tmp2) - 1;
      free(multi);
      multi = getSubstractNumber(tmp, tmp2);
      free(tmp2);
      tmp2 = multi;
      multi = substract(tmp, tmp2);

      sup = strlen(multi);
      old_size = size1;
      x = 0;
      while (x++ < old_size - sup - size2 - tmp_size) {
          ret[pos++] = '0';
        }

      free(tmp);
      free(tmp2);
      tmp = multi;
      size1 = strlen(tmp);
    }
  free(tmp);
  tmp = mult(ret, n2);
  sup = strlen(n1) - strlen(tmp);
  while (sup-- > 0)
    ret[pos++] = '0';
  free(tmp);

  --pos;
  while (pos >= 0) {
      if (ret[pos] > '9') {
          if (!pos) {
              memcpy(ret + 1, ret, size1 + 1);
              ret[0] = '0';
              pos += 1;
            }
          ret[pos - 1] += 1;
          ret[pos] -= 10;
        }
      --pos;
    }
  if (!ret[0])
    ret[0] = '0';
  return ret;
}