⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 int_expr.c

📁 LastWave
💻 C
📖 第 1 页 / 共 5 页
字号:
    if (!strncmp(begin,*op,*opSize) && !IsValidSymbolChar(begin[*opSize])) break;   }  opIndex = op-opArray4+1;      if (*op != NULL) {        /* Check some types */    if (!(flagType & SignalType)) {      SetErrorf("Expecting a signal !");      Clean(*resVC);      return(0);    }    /* Skip operator */     begin2= begin;     begin  += *opSize;     ParamSkipSpace(begin);    *left = begin;    /* Check '(' */    if (*begin != '(') {      *left = begin;      SetErrorf("Missing a parenthesis '('");      Clean(*resVC);      return(0);    }    begin1 = begin;    begin++;    *left = begin;        /* Get first argument */    oldFlagSpace = defParam->flagSpace;    defParam->flagSpace = YES;    oldFlagEmptySI = defParam->flagEmptySI;    defParam->flagEmptySI = NO;    if (!(r1=TTExpr1(begin,left,resFlt,resVC,SignalType | RangeType,defParam))) return(0);    defParam->flagEmptySI = oldFlagEmptySI;    vc1 = *resVC;       /* Read 'op(expr0_Sig,expr0_Sig)' */    begin = *left;    if (*begin != ',') {      SetErrorf("Missing a comma ','");      Clean(*resVC);      return(0);    }    s1 = NULL;    rg1 = NULL;    if (r1 == SignalType) {s1 = (SIGNAL) vc1; size1 = s1->size;}    else {rg1 = (RANGE) vc1; size1 = rg1->size;}    begin++;    *left = begin;            /* Get second argument */    SetDefaultX(defParam,vc1);    vc2 = NULL;    oldFlagEmptySI = defParam->flagEmptySI;    defParam->flagEmptySI = NO;    if (!(r2 = TTExpr1(begin,left,&f2,&vc2,SignalType | RangeType,defParam))) {      Clean(*resVC);      return(0);    }    defParam->flagEmptySI = oldFlagEmptySI;    SetDefaultX(defParam,NULL);    s2 = NULL;    rg2 = NULL;    if (r2 == SignalType) {s2 = (SIGNAL) vc2; size2 = s2->size;}    else {rg2 = (RANGE) vc2;  size2 = rg2->size;}    if (size1 != size2) {      *left = begin2;      SetErrorf("Signals/Ranges have different size");      Clean(vc1);      Clean(vc2);      *resVC = NULL;      return(0);    }    /* Closing parenthesis */    if (**left != ')') {      SetErrorf("Expecting a parenthesis ')'");       Clean(vc1);      Clean(vc2);      *resVC = NULL;      return(0);    }    (*left)++;    begin = (*left);    defParam->flagSpace = oldFlagSpace;    s3 = TNewSignal();    if (rg1 && rg1->step > 0) {      SizeSignal(s3,rg1->size,YSIG);      if (s2) for (j=0;j<rg1->size;j++) {s3->Y[j] = s2->Y[j];}      else  for (j=0;j<rg1->size;j++) {s3->Y[j] = RangeVal(rg2,j);}      s3->dx = rg1->step;      s3->x0 = rg1->first;    }    else {      SizeSignal(s3,size1,XYSIG);      if (rg1  && s2) for (j=0;j<rg1->size;j++) {s3->X[j] = RangeVal(rg1,j);s3->Y[j] = s2->Y[j];}      else if (rg1  && rg2) for (j=0;j<rg1->size;j++) {s3->X[j] = RangeVal(rg1,j);s3->Y[j] = RangeVal(rg2,j);}      else if (s1 && rg2) for (j=0;j<s1->size;j++) {s3->X[j] = s1->Y[j];s3->Y[j] = RangeVal(rg2,j);}      else  for (j=0;j<s1->size;j++) {s3->X[j] = s1->Y[j];s3->Y[j] = s2->Y[j];}    }    Clean(vc1);    Clean(vc2);    *resVC = (VALUE) s3;    if (s3->type == XYSIG) SortSig(s3);    return(SignalType);  }               /***********************************************************   *    * Operators "X","der","prim"   *    * 'op(expr0_Sig)'   *   ***********************************************************/  /* Fifth array */  arrayIndex = 5;  for (op = opArray5, opSize = opSizeArray5 ;;op++,opSize++) {                                                             if (*op == NULL) break;     if (!strncmp(begin,*op,*opSize) && !IsValidSymbolChar(begin[*opSize])) break;   }  opIndex = op-opArray5+1;      if (*op != NULL && (opIndex != 1 || begin[*opSize] == '(')) {        /* Check some types */    if (!(flagType & SignalType)) {      SetErrorf("Not expecting a signal");      Clean(*resVC);      return(0);    }    /* Skip operator */     begin2= begin;     begin  += *opSize;     ParamSkipSpace(begin);    *left = begin;    /* Check '(' */    if (*begin != '(') {      SetErrorf("Missing a parenthesis '('");      Clean(*resVC);      return(0);    }    begin1= begin;     begin++;    *left = begin;        /* Get argument */    oldFlagSpace = defParam->flagSpace;    defParam->flagSpace = YES;    oldFlagEmptySI = defParam->flagEmptySI;    defParam->flagEmptySI = NO;    if (!(r=TTExpr1(begin,left,resFlt,resVC,SignalType | RangeType,defParam))) return(0);    defParam->flagEmptySI = oldFlagEmptySI;    /* Closing parenthesis of op(expr0_Int) */    if (**left != ')') {      SetErrorf("Expecting a parenthesis ')'");       Clean(*resVC);      return(0);    }    (*left)++;    begin = (*left);        defParam->flagSpace = oldFlagSpace;    /* Set output */    if (opIndex != 1 && opIndex != 4) TTSetOutput1(r,*resVC,&vc3);    else if (opIndex == 1) {      AddRefValue(*resVC);      TTSetOutput1(r,*resVC,&vc3);      RemoveRefValue(*resVC);    }    s = NULL;    rg = NULL;    if (r == SignalType) s = (SIGNAL) *resVC;    else rg = (RANGE) *resVC;    if (opIndex != 4) s3 = (SIGNAL) vc3;    else {      i3 = TNewImage();      if (rg) SizeImage(i3,rg->size,rg->size);      else SizeImage(i3,s->size,s->size);      vc3 = (VALUE) i3;    }    /* Computation */    switch(opIndex) {          /* X */      case 1 :         if (rg) for (j=0;j<s3->size;j++) s3->Y[j] = j;        else for (j=0;j<s3->size;j++) s3->Y[j] = XSig(s,j);         break;              /* der */      case 2 :         if (rg) {          temp = s3->Y[0] = RangeVal(rg,0);          for (j=1;j<s3->size;j++) {            temp1 = RangeVal(rg,j);            s3->Y[j] = temp1-temp;            temp = temp1;          }        }        else {          temp = s3->Y[0] = s->Y[0];          for (j=1;j<s3->size;j++) {            temp1 = s->Y[j];            s3->Y[j] = temp1-temp;            temp = temp1;          }        }        break;      /* prim */      case 3 :         if (rg) {          s3->Y[0] = RangeVal(rg,0);          for (j=1;j<s3->size;j++) s3->Y[j] = RangeVal(rg,j) + s3->Y[j-1];        }        else {          s3->Y[0] = s->Y[0];          for (j=1;j<s3->size;j++) {          s3->Y[j] = s->Y[j] + s3->Y[j-1];          }        }        break;      /* diag */      case 4 :         ZeroImage(i3);        if (rg) {          for (j=0;j<rg->size;j++) i3->pixels[j*(i3->ncol+1)] = RangeVal(rg,j);        }        else {          for (j=0;j<s->size;j++) i3->pixels[j*(i3->ncol+1)] = s->Y[j];        }        break;              default : Errorf("Expr9() : Weired error Array3");    }    if (*resVC != vc3) {      Clean(*resVC);      *resVC = vc3;    }    return(r);  }      /***********************************************************   *    * Operators "type"   *    * 'op(expr)'   *   ***********************************************************/  /* Sixth array */  arrayIndex = 6;  for (op = opArray6, opSize = opSizeArray6 ;;op++,opSize++) {                                                             if (*op == NULL) break;     if (!strncmp(begin,*op,*opSize) && !IsValidSymbolChar(begin[*opSize])) break;   }  opIndex = op-opArray6+1;      if (*op != NULL && (opIndex != 1 || begin[*opSize] == '(')) {        /* Check some types */    if (!(flagType & StringType)) {      SetErrorf("Not expecting a string");      Clean(*resVC);      return(0);    }    /* Skip operator */     begin2= begin;     begin  += *opSize;     ParamSkipSpace(begin);    *left = begin;    /* Check '(' */    if (*begin != '(') {      SetErrorf("Missing a parenthesis '('");      Clean(*resVC);      return(0);    }    begin1= begin;     begin++;    *left = begin;        /* Get argument */    oldFlagSpace = defParam->flagSpace;    defParam->flagSpace = YES;    if (!(r=TTExpr1(begin,left,resFlt,resVC,AnyType,defParam))) return(0);    /* Closing parenthesis of op(expr) */    if (**left != ')') {      SetErrorf("Expecting a parenthesis ')'");       Clean(*resVC);      return(0);    }    (*left)++;    begin = (*left);        defParam->flagSpace = oldFlagSpace;        /* Computation */    switch(opIndex) {          /* type */      case 1 :         sc = TNewStrValue();        if (*resVC == NULL) SetStrValue(sc,numType);        else SetStrValue(sc,GetTypeValue(*resVC));        *resVC = (VALUE) sc;                r = StringType;        break;      /* btype */      case 2 :         sc = TNewStrValue();        if (*resVC == NULL) SetStrValue(sc,numType);        else SetStrValue(sc,GetBTypeContent(*resVC));        *resVC = (VALUE) sc;                r = StringType;        break;              default : Errorf("Expr9() : Weired error Array6");    }    return(r);  }  /***********************************************************   *    * Operators "min","max"   *    * 'op' 'op(expression)' 'op(num,num)'    *   ***********************************************************/  /* Seventh array */  arrayIndex = 7;  for (op = opArray7, opSize = opSizeArray7 ;;op++,opSize++) {                                                             if (*op == NULL) break;     if (!strncmp(begin,*op,*opSize) && !IsValidSymbolChar(begin[*opSize])) break;   }  opIndex = op-opArray7+1;      if (*op != NULL) {        /* Check some types */    if (!(flagType & (FloatType | SignalType | ImageType))) {      SetErrorf("Not expecting a number, a signal or an image");      Clean(*resVC);      return(0);    }    /* Skip operator */    begin2= begin;     begin  += *opSize;     ParamSkipSpace(begin);     *left = begin;    /* test (... */    if (*begin != '(') {      SetErrorf("Expecting a '('");      *left = begin;      Clean(*resVC);      return(0);    }    begin2 = begin;        /* Read expression */    i3 = NULL;    begin1 = begin;    begin++;    *left = begin;    oldFlagSpace = defParam->flagSpace;    defParam->flagSpace = YES;    if (!(r=TTExpr1(begin,left,resFlt,resVC,FloatType | RangeType | ImageType | SignalType,defParam))) return(0);    defParam->flagSpace = oldFlagSpace;        /* Case of op(expression) */    if (**left == ')') {      (*left)++;      if (!(flagType & FloatType)) {        SetErrorf("Not expecting a number");        *left = begin;        Clean(*resVC);        return(0);      }      if (r == FloatType) {        Clean(*resVC);        return(FloatType);      }      if (r != RangeType) {        if (r == SignalType) {          s3 = (SIGNAL) *resVC;          array3 = s3->Y;          size3 = s3->size;          if (size3 == 0 && opIndex != 3) {            SetErrorf("Not expecting empty signal");            *left = begin2+1;            Clean(*resVC);            return(0);          }        }        else if (r == FloatType) {          array3 = resFlt;          size3 = 1;        }        else {          i3 = (IMAGE) *resVC;          array3 = i3->pixels;          size3 = i3->ncol*i3->nrow;          if (size3 == 0 && opIndex != 3) {            SetErrorf("Not expecting emty image");            *left = begin2+1;            Clean(*resVC);            return(0);          }        }        switch(opIndex) {                /* min */        case 1:          *resFlt = array3[0];          for(j=1;j<size3;j++) *resFlt = MIN(*resFlt,array3[j]);          break;                /* max */        case 2:          *resFlt = array3[0];          for(j=1;j<size3;j++) *resFlt = MAX(*resFlt,array3[j]);          break;        /* sum */        case 3:          if (size3 == 0) {*resFlt = 0; break;}          *resFlt = array3[0];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -