
static int short_function_name(struct device *dev,
                               struct device_driver *drv);

/* Assuming a 60-column limit */
static int short_function_name(struct device *dev,
                               struct device_driver *drv)
{
    this->translateLabels(labelID, completedLabelID,
                          selectedLabelID, text,
                          selectedText, completedText,
                          fontId, selectedFontId,
                          completedFontId);
    call_some_really_long_function.of_some_sort(
        some_long_parameter1, some_long_parameter2);

    abc = call_some_other_really_long_function.of_some_sort(
        some_long_parameter1, some_long_parameter2);

    abc.def.ghi =
        call_some_other_really_long_function.of_some_sort(
            some_long_parameter1, some_long_parameter2);

    abcdefghijklmnopqrstuvwxyz = abc + def + ghi + jkl +
                                 mno + prq + stu + vwx + yz;

    return 1;
}

typedef
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    yyyyyyyyyyyyyyyyyyyyyy;

typedef some_return_value (*some_function_type)(another_type
                                                parameter1,
                                                another_type
                                                parameter2);

typedef struct
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{
    int yyyyyyyyyyyyyyyyyyyyyy;
} x_t;

static void some_really_long_function_name(
    struct device *dev, struct device_driver *drv)
{
    if ((some_variable_name &&
         somefunction(param1, param2, param3))) {
        asdfghjk = asdfasdfasd.aasdfasd +
                   (asdfasd.asdas * 1234.65);
    }

    for (struct something_really_really_excessive *
         a_long_ptr_name = get_first_item();
         a_long_ptr_name != NULL;
         a_long_ptr_name = get_next_item(a_long_ptr_name))
    {
    }

    for (a = get_first(); a != NULL; a = get_next(a))
    {
    }

    for (a_ptr = get_first();
         a_ptr != NULL;
         a_ptr = get_next(a))
    {
    }

    register_clcmd( "examine", "do_examine", -1,
                    "-Allows a player to examine the health and armor of a teammate" );
    register_clcmd( "/examine", "do_examine", -1,
                    "-Allows a player to examine the health and armor of a teammate" );
}

