Next: , Previous: , Up: Methods   [Index]


Variable arguments

Variable Arguments

C functions like scanf(3), sscanf(3), and fscanf(3) have templates that allow you to call them with a variable number of arguments.

If you need to call other C functions that use variable arguments, you must call __ctalkLibcFnWithMethodVarArgs with the name of the function, the method that contains the function’s template, and the function’s return class.

The readFormat method (implemented in String and ReadFileStream classes) can scan a string or input file into the objects that the program gives as arguments. The methods also take care of scalar-to-object translation, memory allocation, and several other tasks.

However, programs can also accomplish the same thing manually.

For example, here is the code of the template method for fscanf(3), cFscanf (CFunction class), without the preprocessing directives.

cFscanf (FILE *s, char *fmt,...) {
  EXPR_PARSER *parser;
  OBJECT *result_object;
  parser = __ctalkGetExprParserAt (__ctalkGetExprParserPtr ());
  result_object =
    __ctalkLibcFnWithMethodVarArgs ((int (*)())fscanf, parser -> e_method, "Integer");
  return result_object;
}

At run time, the e_method member of an expression parser contains the method and its arguments.

The third argument of __ctalkLibcFnWithMethodVarArgs determines the class of result_object. For C library functions that use variable arguments, the return class is Integer.

The typecast (int (*)()) in the first argument in front of fscanf is not strictly needed because we know that the number and types of arguments to fscanf(3) (or scanf(3) or any other variable-argument function) might vary from the __ctalkLibcFnWithMethodVarArgs prototype, but it tells the compiler not to print a warning message in that case.

If you simply need to print formatted output, the writeFormat or printOn methods (implemented in String, WriteFileStream and many other classes classes) perform format-argument translations automatically. Several classes also implement a readFmt method, which reads formatted input from a String or ReadFileStream. See writeFormat--class WriteFileStream, and writeFormat--class String.


Next: , Previous: , Up: Methods   [Index]