= Starlink C Programming = The Starlink software is mainly in Fortran but we are now writing new code in C to help with multi-threading goals. This page contains general C programming style guides and Starlink-specific instructions using new facilities added directly for the C programmer. == General C tips == * Do not use malloc/free directly. See below. * Never cast the return value of a malloc type routine since void* does not need type casting * When determining how many bytes to malloc do not use sizeof(int) or sizeof(double) or whatever, use sizeof(*var). This way if you have declared something as "int *x" and then decide it should be a "long *x" you do not have to remember to fix all the sizeof(int) lines, since sizeof(*x) will already be correct. * Do not use global variables if at all possible. Makes threading impossible. * Make use of structs and typedef * Turn on as many compiler warnings as you can (-Wall -Wextra at the very least) and '''listen''' to them. They are there to help. * Never use sprintf. Always use snprintf and check the return value. == Starlink C tips == * If you have an AST dependency in your library/application use astMalloc/astFree/astGrow for memory management * If you do not have an AST dependendency use starMalloc/starFree * The MERS routines have sprintf formatting so use of message tokens is rarely necessary. msgOutiff, ersRepf and others let you embed formatting directly. * If you need access to a fortran library put the C wrapper in the library itself rather than locally in your application. Then other people can benefit. * The ONE library gives a number of helper routines specifically to allow use of C library routines with Starlink status: one_snprintf, one_strlcpy, one_strlcat and one_strtod. Use them. Also one_wordexp_noglob for shell expansion.