blob: 5603e885b413d3ae1cce86c96dd162e5331d571c [file] [log] [blame]
/****************************************************************************
| (C) Copyright 2008 Novell, Inc. All Rights Reserved.
|
| GPLv2: This program is free software; you can redistribute it
| and/or modify it under the terms of version 2 of the GNU General
| Public License as published by the Free Software Foundation.
|
| This program is distributed in the hope that it will be useful,
| but WITHOUT ANY WARRANTY; without even the implied warranty of
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| GNU General Public License for more details.
+-------------------------------------------------------------------------*/
/*
* style.h define types needed by the coding suggestions below. style.h should
* be included after standard header files, especially <sys/types.h> or header
* files including <sys/types.h>.
*
*
* NOT SO GENTLE CODING SUGESTIONS
*
* Authors: Greg Pachner, Vandana Rungta, Paul Taysom
* Monday April 2, 2007 : July 8, 2005
*
* Data Types:
*
* 1. For media structures use only: __u8, __u16, __u32, __u64,
* __s8, __s16, __s32, __s64, char. char is only used for strings
* stored on the media.
*
* 2. Other types use: u8, u16, u32, u64, s8, s16, s32, s64, unint,
* snint, char *, addr, saddr. For error returns, use int.
*
* 3. Only use (char *) for strings. Do not use (u8 *).
*
* 4. A separate header file will be used for media structures. This
* header file should only contain media dependent structures and
* be independent of other header files, except <linux/kernel.h>
* which defines __u8, __u16, etc.
*
* 5. Typedefs should end with _s, _u, or _t. The kernel folks don't
* seem to like typedefs, however, we have found the following
* convention works well with 'cscope.'
* typedef struct greg_s {
* u64 gr_a;
* u32 gr_b;
* } greg_s;
*
* 6. All characters strings use utf-8 encoding. Because some languages
* need 32 bit unicode, the utf-8 encoding can take up to 6 octets.
* Code that cares about the maximum number of characters should allow
* 6 octets for every utf-8 character.
*
* Coding Guidelines:
*
* 1. Tab stops 8. Use tabs, not spaces.
*
* 2. K&R style curly braces:
* if {
* } else {
* }
*
* 3. Use curly braces around statements in body of `if`, `while`,
* `switch`, `do`, and `for` statements.
*
* 4. routines_use_underscores_to_separate_words.
*
* 5. Global variables begin with a capital letter.
*
* 6. Use unique names in structure elements.
* // instead of:
* typedef struct paul_s {
* void *link;
* ...
* } paul_s;
* // use:
* typedef struct paul_s {
* void *p_link;
* ...
* } paul_s;
*
* 7. Use longer, descriptive names for local variable. I'm not sure I
* agree with this one. I'm starting to tend towards single character
* variable names -- a, b, c for parameters, x, y, z for variables,
* i, j, k for indices, p, q for pointers, and r, s, t for strings.
*
* 8. Routines should fit in one full screen except `switch` statements
* can be longer.
*
* 9. To avoid variable name conflicts and scoping problems, use inline
* functions instead of macros for small routines.
*
* 10. Clean Header files (what did I mean by this?)
*
* 11. No global spinlock. Today, NSS uses one global spinlock. This does
* make it simpler to ensure code correctness, however, now that most
* systems have multiple cores and processors, we must not prevent
* applications from taking advantage of parallelism.
*
* 12. For machine specific code use:
* __i386__ - 32 bit x86
* __x86_64__ - 64 bit x86
*
* 13. For all other cases, we default to
* /usr/src/linux/Documentation/CodingStyle.
*
* Lessons Learned
*
* 1. Using -1 for an invalid value for unsigned values, is a bad idea.
* Use 0xff...fff.
*
* Acknowledgments:
* Thanks to William Taysom for editing.
*
* gcc -E -dM - </dev/null # to print all predefineds
*/
#ifndef _STYLE_H_
#define _STYLE_H_ 1
#ifdef __KERNEL__
#ifndef LINUX_VERSION_CODE
#include <linux/version.h>
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define ENABLE (1
#define DISABLE (0
#define IS_ENABLED ==1)
#define IS_DISABLED ==0)
#if defined(__APPLE__) || defined(__WINDOWS__)
typedef unsigned long long __u64;
typedef unsigned int __u32;
typedef unsigned short __u16;
typedef unsigned char __u8;
typedef long long __s64;
typedef int __s32;
typedef short __s16;
typedef char __s8;
#else
#ifndef _LINUX_TYPES_H
#include <linux/types.h>
#endif
#endif
#ifndef __KERNEL__
typedef unsigned long long u64;
typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;
typedef long long s64;
typedef int s32;
typedef short s16;
typedef char s8;
#endif
#ifndef _NATURAL_INT_
#define _NATURAL_INT_ 1
typedef long snint;
typedef unsigned long unint;
#endif
#ifndef _ADDR_
#define _ADDR_ 1
typedef unsigned long addr;
#endif
#ifndef _SADDR_
#define _SADDR_ 1
typedef unsigned long saddr;
#endif
#if !defined(_BOOL_) && !defined(__cplusplus) && !(__WINDOWS__)
#ifndef FALSE
enum { FALSE, TRUE };
#endif
#if defined(__KERNEL__)
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
#undef bool
#define _BOOL_ 1
typedef _Bool bool;
#endif
#else
#undef bool
#define _BOOL_ 1
typedef _Bool bool;
#endif
#endif
#ifdef __WINDOWS__
#ifndef FALSE
enum { FALSE, TRUE };
#endif
typedef unsigned char bool;
#endif
#ifndef _UTF8_T
#define _UTF8_T
typedef char utf8_t;
#endif
typedef u8 guid_t[16];
#ifdef _UUID_UUID_H
enum { GUID_ASSERT = 1 / (sizeof(guid_t) == sizeof(uuid_t)) };
#endif
typedef struct timeval timeval_s;
#ifndef NULL
#define NULL 0
#endif
#define unused(_x) ((void) _x)
enum {
ONE_THOUSAND = 1000,
ONE_MILLION = ONE_THOUSAND * ONE_THOUSAND,
ONE_BILLION = ONE_MILLION * ONE_THOUSAND
};
#ifndef MAGIC_STRING
#define MAGIC_STRING(_x_) # _x_
#define MAKE_STRING(_x_) MAGIC_STRING(_x_)
#endif
#undef WHERE
#ifdef KBUILD_BASENAME
#ifdef KBUILD_MODNAME
#define WHERE KBUILD_MODNAME ":" KBUILD_BASENAME \
"<" MAKE_STRING(__LINE__) "> "
#else
#define WHERE KBUILD_BASENAME "<" MAKE_STRING(__LINE__) "> "
#endif
#elif defined _F
#define WHERE _F "<" MAKE_STRING(__LINE__) "> "
#else
#define WHERE __FILE__ "<" MAKE_STRING(__LINE__) "> "
#endif
/*
* Macros for checking values of constants
* Generates a divide by 0 error during compilation
*/
#define CONCATENATE_DETAIL(_x_, _y_) _x_##_y_
#define CONCATENATE(_x_, _y_) CONCATENATE_DETAIL(_x_, _y_)
#define MAKE_UNIQUE(_x_) CONCATENATE(_x_, __COUNTER__)
#define CHECK_CONST(_expression_) \
enum { MAKE_UNIQUE(CHECK_) = 1 / (_expression_) }
/*
* When given a pointer to a field of sub-struct of a
* structure, container returns a pointer to the beginning
* of structure.
*/
#define container(_item, _type, _field) \
((_type *)(((addr)(_item)) - offsetof(_type, _field)))
/*
* field returns the offset of a field in a structure
*/
#define field(_x, _f) ((addr)&(((__typeof__(_x))0)->_f))
#define zero(_x) (memset( &(_x), 0, sizeof(_x)))
#undef ALIGN
#define ALIGN(_x_, _p_) (((_x_) + (_p_) - 1) & ~((_p_) - 1))
#ifdef __cplusplus
}
#endif
#endif