Révision 136 pobysoC-4.0/src/pobyso.c

pobyso.c (revision 136)
136 136
{
137 137
  int expressionLength, i;
138 138
  char *expressionWithSemiCo;
139
  sollya_obj_t expressionSa;
139
  sollya_obj_t expressionSo;
140 140

  
141 141
  /* Arguments check. */
142 142
  if (expression == NULL)
......
166 166
    if (expression[i] == ';') /* Nothing special to do:
167 167
                                 try to parse the string*/
168 168
    {
169
      expressionSa = sollya_lib_parse_string(expression);
170
      return expressionSa;
169
      expressionSo = sollya_lib_parse_string(expression);
170
      if (sollya_lib_obj_is_error(expressionSo))
171
      {
172
        sollya_lib_clear_obj(expressionSo);
173
        return NULL;
174
      }
175
      else
176
      {
177
        return expressionSo;
178
      }
171 179
    }
172 180
    else
173 181
    {
......
191 199
        strncpy(expressionWithSemiCo, expression, i+1);
192 200
        expressionWithSemiCo[i + 1] = ';';
193 201
        expressionWithSemiCo[i + 2] = '\0';
194
        expressionSa = sollya_lib_parse_string(expressionWithSemiCo);
202
        expressionSo = sollya_lib_parse_string(expressionWithSemiCo);
195 203
        free(expressionWithSemiCo);
196
        return expressionSa;
204
        if (sollya_lib_obj_is_error(expressionSo))
205
        {
206
          sollya_lib_clear_obj(expressionSo);
207
          return NULL;
208
        }
209
        else
210
        {
211
          return expressionSo;
212
        }
197 213
      } /* End character != ';' and from a blank. */
198 214
    /* Create a new string for the expression, add the ";" and
199 215
     * and call sollya_lib_parse_string. */
......
206 222
                       "ONLY_BLANK_ARGUMENT",
207 223
                        "The expression is only made of blanks");
208 224
  return NULL;
209

  
210 225
} /* pobyso_parse_string */
211 226

  
212 227
pobyso_func_exp_t
......
295 310
 * @see pobyso.h#pobyso_subpoly
296 311
 */
297 312
pobyso_func_exp_t
298
pobyso_subpoly(pobyso_func_exp_t polynomialSo, long expsNum,...)
313
pobyso_subpoly(pobyso_func_exp_t polynomialSo, long expsNum, long int* expsList)
299 314
{
300
  sollya_obj_t expsListSo = NULL;
301
  sollya_obj_t* expsList  = NULL;
302
  sollya_obj_t subpoly    = NULL;
315
  sollya_obj_t  expsListSo    = NULL;
316
  sollya_obj_t* expsList_pso  = NULL;
317
  sollya_obj_t subpoly        = NULL;
318
  int i, j;
303 319

  
304
  va_list vaExpsList;
305
  int currentExp;
306
  int i;
307

  
308 320
  /* Arguments check. */
309 321
  if (polynomialSo == NULL) return NULL;
310 322
  if (expsNum < 0) return NULL;
311 323
  if (expsNum == 0) return sollya_lib_copy_obj(polynomialSo);
312

  
313
  va_start(vaExpsList, expsNum);
314
  expsList = (sollya_obj_t*) malloc(expsNum * sizeof(sollya_obj_t));
315
  if (expsList == NULL)
324
  if (expsList == 0) return NULL;
325
  /* Create a list of Sollya constants. */
326
  expsList_pso = (sollya_obj_t*) malloc(expsNum * sizeof(sollya_obj_t));
327
  if (expsList_pso == NULL)
316 328
  {
317 329
    pobyso_error_message("pobyso_subpoly",
318 330
                          "MEMORY_ALLOCATION_ERROR",
319
                          "Could not allocate the expression string");
331
                          "Could not allocate the Sollya exponents list");
320 332
    return NULL;
321 333
  }
334
  /* Fill up the list. */
322 335
  for (i = 0 ; i < expsNum ; i++)
323 336
  {
324
    currentExp = va_arg(vaExpsList, long);
325
    expsList[i] = sollya_lib_constant_from_int64(currentExp);
337
    /* Abort if an exponent is negative. */
338
    if (expsList[i] < 0 )
339
    {
340
      for (j = 0 ; j < i ; j++)
341
      {
342
        sollya_lib_clear_obj(expsList_pso[j]);
343
      }
344
      free(expsList_pso);
345
      return NULL;
346
    }
347
    expsList_pso[i] = sollya_lib_constant_from_int64(expsList[i]);
326 348
  } /* End for */
327
  va_end(vaExpsList);
328
  expsListSo = sollya_lib_list(expsList, expsNum);
329
  if (expsList == NULL)
349
  expsListSo = sollya_lib_list(expsList_pso, expsNum);
350
  for (i = 0 ; i < expsNum ; i++)
330 351
  {
352
    sollya_lib_clear_obj(expsList_pso[i]);
353
  }
354
  free(expsList_pso);
355
  if (expsListSo == NULL)
356
  {
331 357
    pobyso_error_message("pobyso_subpoly",
332 358
                          "LIST_CREATIONERROR",
333 359
                          "Could not create the exponents list");
334
    for (i = 0 ; i < expsNum ; i++)
335
    {
336
      sollya_lib_clear_obj(expsList[i]);
337
    }
338
    free(expsList);
339 360
    return NULL;
340 361
  }
341 362
  subpoly = sollya_lib_subpoly(polynomialSo, expsListSo);
363
  pobyso_autoprint(expsListSo);
342 364
  sollya_lib_clear_obj(expsListSo);
343
  for (i = 0 ; i < expsNum ; i++)
344
  {
345
    sollya_lib_clear_obj(expsList[i]);
346
  }
347
  free(expsList);
348 365
  return subpoly;
349 366
} /* pobyso_subpoly. */
350 367

  

Formats disponibles : Unified diff