unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Michael Welsh Duggan <md5i@md5i.com>
To: 9560@debbugs.gnu.org
Subject: bug#9560: An exact recipe
Date: Wed, 12 Oct 2011 22:33:22 -0400	[thread overview]
Message-ID: <87zkh54o3x.fsf@maru.md5i.com> (raw)
In-Reply-To: <tntaa9zdynf.fsf@waterbuck.yellow.cert.org>

[-- Attachment #1: Type: text/plain, Size: 146 bytes --]

From emacs -Q:

Do NOT resize the frame.  The recipe includes C-v, which depends on the
window (and hence frame) size.

Load the following file:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: rwsiteinfo-backup.c --]
[-- Type: text/x-csrc, Size: 14006 bytes --]

/*
** Copyright (C) 2011 by Carnegie Mellon University.
**
** @OPENSOURCE_HEADER_START@
**
** Use of the SILK system and related source code is subject to the terms
** of the following licenses:
**
** GNU Public License (GPL) Rights pursuant to Version 2, June 1991
** Government Purpose License Rights (GPLR) pursuant to DFARS 252.227.7013
**
** NO WARRANTY
**
** ANY INFORMATION, MATERIALS, SERVICES, INTELLECTUAL PROPERTY OR OTHER
** PROPERTY OR RIGHTS GRANTED OR PROVIDED BY CARNEGIE MELLON UNIVERSITY
** PURSUANT TO THIS LICENSE (HEREINAFTER THE "DELIVERABLES") ARE ON AN
** "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY
** KIND, EITHER EXPRESS OR IMPLIED AS TO ANY MATTER INCLUDING, BUT NOT
** LIMITED TO, WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE,
** MERCHANTABILITY, INFORMATIONAL CONTENT, NONINFRINGEMENT, OR ERROR-FREE
** OPERATION. CARNEGIE MELLON UNIVERSITY SHALL NOT BE LIABLE FOR INDIRECT,
** SPECIAL OR CONSEQUENTIAL DAMAGES, SUCH AS LOSS OF PROFITS OR INABILITY
** TO USE SAID INTELLECTUAL PROPERTY, UNDER THIS LICENSE, REGARDLESS OF
** WHETHER SUCH PARTY WAS AWARE OF THE POSSIBILITY OF SUCH DAMAGES.
** LICENSEE AGREES THAT IT WILL NOT MAKE ANY WARRANTY ON BEHALF OF
** CARNEGIE MELLON UNIVERSITY, EXPRESS OR IMPLIED, TO ANY PERSON
** CONCERNING THE APPLICATION OF OR THE RESULTS TO BE OBTAINED WITH THE
** DELIVERABLES UNDER THIS LICENSE.
**
** Licensee hereby agrees to defend, indemnify, and hold harmless Carnegie
** Mellon University, its trustees, officers, employees, and agents from
** all claims or demands made against them (and any related losses,
** expenses, or attorney's fees) arising out of, or relating to Licensee's
** and/or its sub licensees' negligent use or willful misuse of or
** negligent conduct or willful misconduct regarding the Software,
** facilities, or other rights or assistance granted by Carnegie Mellon
** University under this License, including, but not limited to, any
** claims of product liability, personal injury, death, damage to
** property, or violation of any laws or regulations.
**
** Carnegie Mellon University Software Engineering Institute authored
** documents are sponsored by the U.S. Department of Defense under
** Contract FA8721-05-C-0003. Carnegie Mellon University retains
** copyrights in all material produced under this contract. The U.S.
** Government retains a non-exclusive, royalty-free license to publish or
** reproduce these documents, or allow others to do so, for U.S.
** Government purposes only pursuant to the copyright license under the
** contract clause at 252.227.7013.
**
** @OPENSOURCE_HEADER_END@
*/

/*
**  Prints information about SiLK site configurations
**
**  Michael Duggan
**  September 2011
*/


#include <silk/silk.h>

RCSIDENT("$Id$");

#include <silk/skstream.h>
#include <silk/skstringmap.h>
#include <silk/sksite.h>
#include <silk/utils.h>


/* LOCAL DEFINES AND TYPEDEFS */

/* where to write --help output */
#define USAGE_FH stdout


/* LOCAL VARIABLE DEFINITIONS */
typedef enum {
    RWST_CLASS,
    RWST_TYPE,
    RWST_FLOWTYPE,
    RWST_FLOWTYPE_ID,
    RWST_SENSOR,
    RWST_SENSOR_ID,
    RWST_SENSOR_DESC,
    RWST_DEFAULT_CLASS,
    RWST_DEFAULT_TYPE,
    RWST_MARK_DEFAULTS,
    RWST_CLASS_LIST,
    RWST_TYPE_LIST,
    RWST_FLOWTYPE_LIST,
    RWST_FLOWTYPE_ID_LIST,
    RWST_SENSOR_LIST,
    RWST_SENSOR_ID_LIST,
    RWST_DEFAULT_CLASS_LIST,
    RWST_DEFAULT_TYPE_LIST
} rws_type_t;


static const sk_stringmap_entry_t field_map_entries[] = {
    {"class",    RWST_CLASS,     "class name",    NULL},
    {"type",     RWST_TYPE,      "type name",     NULL},
    {"flowtype", RWST_FLOWTYPE,  "flowtype name", NULL},
    {"id-flowtype", RWST_FLOWTYPE_ID, "flowtype integer identifier", NULL},
    {"sensor", RWST_SENSOR, "sensor name", NULL},
    {"id-sensor", RWST_SENSOR_ID, "sensor integer identifier", NULL},
    {"describe-sensor", RWST_SENSOR_DESC, "sensor description", NULL},
    {"default-class", RWST_DEFAULT_CLASS, "default class name", NULL},
    {"default-type", RWST_DEFAULT_TYPE, "default type name", NULL},
    {"mark-defaults", RWST_MARK_DEFAULTS,
     "'+' for default classes, '*' for types", NULL},
};


/* OPTIONS SETUP */

typedef enum {
    OPT_NO_TITLES, OPT_NO_COLUMNS, OPT_COLUMN_SEPARATOR,
    OPT_NO_FINAL_DELIMITER, OPT_DELIMITED,
    OPT_OUTPUT_PATH, OPT_PAGER
} appOptionsEnum;

static struct option appOptions[] = {
    {"no-titles",           NO_ARG,       0, OPT_NO_TITLES},
    {"no-columns",          NO_ARG,       0, OPT_NO_COLUMNS},
    {"column-separator",    REQUIRED_ARG, 0, OPT_COLUMN_SEPARATOR},
    {"no-final-delimiter",  NO_ARG,       0, OPT_NO_FINAL_DELIMITER},
    {"delimited",           OPTIONAL_ARG, 0, OPT_DELIMITED},
    {"output-path",         REQUIRED_ARG, 0, OPT_OUTPUT_PATH},
    {"pager",               REQUIRED_ARG, 0, OPT_PAGER},
    {0,0,0,0}               /* sentinel entry */
    {0,0,0,0}           /* sentinel entry */
};

static const char *appHelp[] = {
    "Do not print column headers. Def. Print titles.",
    "Disable fixed-width columnar output. Def. Columnar",
    "Use specified character between columns. Def. '|'",
    "Suppress column delimiter at end of line. Def. No",
    "Shortcut for --no-columns --no-final-del --column-sep=CHAR",
    "Send output to given file path. Def. stdout",
    "Program to invoke to page output. Def. $SILK_PAGER or $PAGER",
    (char *)NULL
};



/* LOCAL FUNCTION PROTOTYPES */

static void appUsageLong(void);
static void appTeardown(void);
static void appSetup(int argc, char **argv);
static int  appOptionsHandler(clientData cData, int opt_index, char *opt_arg);


/* FUNCTION DEFINITIONS */

/*
 *  appUsageLong();
 *
 *    Print complete usage information to USAGE_FH.  Pass this
 *    function to skOptionsSetUsageCallback(); skOptionsParse() will
 *    call this funciton and then exit the program when the --help
 *    option is given.
 */
static void appUsageLong(void)
{
#define USAGE_MSG                                                       \
    ("<SWITCHES>\n"                                                     \
     "\tOutputs information about a SiLK site configuration.\n")

    FILE *fh = USAGE_FH;
    int i;

    fprintf(fh, "%s %s", skAppName(), USAGE_MSG);
    fprintf(fh, "\nSWITCHES:\n");
    skOptionsDefaultUsage(fh);

    for (i = 0; appOptions[i].name; i++ ) {
        fprintf(fh, "--%s %s. ", appOptions[i].name,
                SK_OPTION_HAS_ARG(appOptions[i]));
        switch (appOptions[i].val) {
          case OPT_FIELDS:
            /* Dynamically build the help */
            usageFields(fh);
            break;
          default:
            /* Simple static help text from the appHelp array */
            fprintf(fh, "%s\n", appHelp[i]);
            break;
        }
    }

    skOptionsCtxOptionsUsage(optctx, fh);
}


/*
 *  appTeardown()
 *
 *    Teardown all modules, close all files, and tidy up all
 *    application state.
 *
 *    This function is idempotent.
 */
static void appTeardown(void)
{
    static int teardownFlag = 0;

    if (teardownFlag) {
        return;
    }
    teardownFlag = 1;

#error "Anything you put in setup should now be torn down"
    /* for example, close sample output file */
    skStreamDestroy(&out_ios);

    skAppUnregister();
}


/*
 *  appSetup(argc, argv);
 *
 *    Perform all the setup for this application include setting up
 *    required modules, parsing options, etc.  This function should be
 *    passed the same arguments that were passed into main().
 *
 *    Returns to the caller if all setup succeeds.  If anything fails,
 *    this function will cause the application to exit with a FAILURE
 *    exit status.
 */
static void appSetup(int argc, char **argv)
{
    SILK_FEATURES_DEFINE_STRUCT(features);
    int rv;

    /* verify same number of options and help strings */
    assert((sizeof(appHelp)/sizeof(char *)) ==
           (sizeof(appOptions)/sizeof(struct option)));

    /* register the application */
    skAppRegister(argv[0]);
    skAppVerifyFeatures(&features, NULL);
    skOptionsSetUsageCallback(&appUsageLong);

    /* initialize globals */
#error "Initialize any global variables here"
    /* for example: set global output to NULL */
    out_ios = NULL;

    /* register the options */
    if (skOptionsRegister(appOptions, &appOptionsHandler, NULL)
        || sksiteOptionsRegister(SK_SITE_FLAG_CONFIG_FILE))
    {
        skAppPrintErr("Unable to register options");
        exit(EXIT_FAILURE);
    }

#error "Do any other module setup here"

    /* parse the options */
    arg_index = skOptionsParse(argc, argv);
    if (arg_index < 0) {
        /* options parsing should print error */
        skAppUsage();           /* never returns */
    }

    /* try to load site config file; if it fails, we will not be able
     * to resolve flowtype and sensor from input file names */
    sksiteConfigure(0);

#error "Do any options validation here"

#error "If you expect filenames on command line keep this:"
    /* arg_index is looking at first file name to process */
    if (arg_index == argc) {
        if (FILEIsATty(stdin)) {
            skAppPrintErr("No input files on command line and"
                          " stdin is connected to a terminal");
            skAppUsage();       /* never returns */
        }
    }

#error "If you do NOT expect filenames on command line, keep this:"
    /* check for extraneous arguments */
    if (arg_index != argc) {
        skAppPrintErr("Too many arguments or unrecognized switch '%s'",
                      argv[arg_index]);
        skAppUsage();           /* never returns */
    }

#error "Once all options are set, open input and output"
    /* for example, open a SiLK flow file as an output file */
    rv = skStreamOpenSilkFlow(&out_ios, output_path, SK_IO_WRITE);
    if (rv) {
        skStreamPrintLastErr(out_ios, rv, &skAppPrintErr);
        skAppPrintErr("Unable to open output file. Exiting");
        skStreamDestroy(&out_ios);
        exit(EXIT_FAILURE);
    }

    if (atexit(appTeardown) < 0) {
        skAppPrintErr("Unable to register appTeardown() with atexit()");
        appTeardown();
        exit(EXIT_FAILURE);
    }

    return;  /* OK */
}


/*
 *  status = appOptionsHandler(cData, opt_index, opt_arg);
 *
 *    This function is passed to skOptionsRegister(); it will be called
 *    by skOptionsParse() for each user-specified switch that the
 *    application has registered; it should handle the switch as
 *    required---typically by setting global variables---and return 1
 *    if the switch processing failed or 0 if it succeeded.  Returning
 *    a non-zero from from the handler causes skOptionsParse() to return
 *    a negative value.
 *
 *    The clientData in 'cData' is typically ignored; 'opt_index' is
 *    the index number that was specified as the last value for each
 *    struct option in appOptions[]; 'opt_arg' is the user's argument
 *    to the switch for options that have a REQUIRED_ARG or an
 *    OPTIONAL_ARG.
 */
static int appOptionsHandler(
    clientData  UNUSED(cData),
    int         opt_index,
    char       *opt_arg)
{
    int rv;

    switch ((appOptionsEnum)opt_index) {
#error "Add options handling here.  Return 1 on failure."

      case OPT_FIRST:           /* remove when real options added */
        /* do something with the argument to the switch; for example,
         * parse as an integer */
        rv = skStringParseUint32(&value, opt_arg, 0, 0);
        if (rv) {
            skAppPrintErr("Invalid %s '%s': %s",
                          appOptions[opt_index].name, opt_arg,
                          skStringParseStrerror(rv));
            return 1;
        }
        break;

      case OPT_SECOND:          /* remove when real options added */
        /* set a flag based on this option */
        flag = 1;
        break;
    }

    return 0;  /* OK */
}


/*
 *  rwios = appNextInput(argc, argv);
 *
 *    Open and return the next input file from the command line or the
 *    standard input if no files were given on the command line.
 */
static skstream_t *appNextInput(int argc, char **argv)
{
    static int initialized = 0;
    skstream_t *rwios = NULL;
    const char *fname = NULL;
    int rv;

    if (arg_index < argc) {
        /* get current file and prepare to get next */
        fname = argv[arg_index];
        ++arg_index;
    } else {
        if (initialized) {
            /* no more input */
            return NULL;
        }
        /* input is from stdin */
        fname = "stdin";
    }

    initialized = 1;

    /* create rwios and open file */
    rv = skStreamOpenSilkFlow(&rwios, fname, SK_IO_READ);
    if (rv) {
        skStreamPrintLastErr(rwios, rv, NULL);
        skStreamDestroy(&rwios);
    }

    return rwios;
}


int main(int argc, char **argv)
{
    skstream_t *in_ios;
    int in_rv = SKSTREAM_OK;
    int rv = SKSTREAM_OK;

    appSetup(argc, argv);                       /* never returns on error */

#error "Loop over files on command line or read from stdin."
#error "Process each file, preferably in a separate function."
    /* For each input, process each record */
    while (NULL != (in_ios = appNextInput(argc, argv))) {
        while ((in_rv = skStreamReadRecord(in_ios, &rwrec)) == SKSTREAM_OK) {
            /* process record */
            rv = skStreamWriteRecord(out_ios, &rwrec);
            if (SKSTREAM_OK != rv) {
                skStreamPrintLastErr(out_ios, rv, &skAppPrintErr);
                skStreamDestroy(&in_ios);
                goto END;
            }
        }
        if (SKSTREAM_ERR_EOF != in_rv) {
            skStreamPrintLastErr(in_ios, in_rv, &skAppPrintErr);
        }
        skStreamDestroy(&in_ios);
    }

    rv = skStreamClose(out_ios);
    if (SKSTREAM_OK != rv) {
        skStreamPrintLastErr(out_ios, rv, &skAppPrintErr);
    }

  END:
    return ((SKSTREAM_OK == rv) ? EXIT_SUCCESS : EXIT_FAILURE);
}


/*
** Local Variables:
** mode:c
** indent-tabs-mode:nil
** c-basic-offset:4
** End:
*/

[-- Attachment #3: Type: text/plain, Size: 116 bytes --]


Type:

  M-x edit-kbd-macro RET y C-x e C-x h C-w C-x i

When prompted, insert the following keyboard macro file:


[-- Attachment #4: c-mode.macro --]
[-- Type: application/octet-stream, Size: 12394 bytes --]

;; Keyboard Macro Editor.  Press C-c C-c to finish; press C-x k RET to cancel.
;; Original keys: 3*C-v 7*C-n 21*C-k TAB { "class" , SPC RWST_C M-/ M-DEL DEL , SPC "class SPC name" , SPC NULL } , RET TAB { "type" , SPC RWST_T M-/ M-DEL DEL , SPC "type SPC name" , SPC NULL } , RET TAB { "flowtype , SPC "RWST_FLO M-/ 2*M-DEL DEL , SPC "flowtype SPC name" , SPC NULL } , RET TAB { "sensor" , SPC C-p 2*C-f , 4*DEL " , . DEL SPC C-n RWST_SE M-/ 2*M-DEL DEL , . DEL SPC "sensor SPC name" , SPC NULL } C-p C-e RET TAB { "id-flowtype" , SPC RWST_FL M-/ _ M-/ M-DEL DEL , SPC "flowtype SPC integer SPC ide M-/ M-DEL identifier" , SPC NULL } , C-n , RET TAB { "id-sensor" , SPC RST_SE 5*DEL WST_SE M-/ _ M-/ M-DEL DEL , SPC "sensor SPC integer SPC ident M-/ " , . DEL SPC NULL } , RET TAB { "dexfrib 5*DEL scribe-senro 2*DEL or" , SPC RWST_SE M-/ M-DEL D M-/ , SPC "sensor SPC desc M-/ 3*DEL iption" , SPC NULL } , RET TAB { "default-class" , SPC RWST_DRF 2*DEL EDF 2*DEL F M-/ 2*M-DEL C M-/ M-DEL DEL , SPC "default SPC class SPC name" , SPC NULL } , RET TAB { "default-type" , SPC RWST_DE 2*M-/ M-DEL DEL , SPC "default SPC type SPC name" , SPC NULL } , RET TAB { "mark-defaults" , SPC RWS_ DEL T_MA M-/ , SPC DEL RET TAB "'+' SPC for SPC default SPC classes , SPC ' * ' SPC for SPC types" , SPC N U L : DEL L } , RET TAB { "class : list" , SPC RST DEL <S-backspace> WST_CLA 2*M-/ , SPC "list SPC of SPC class SPC names" , SPC NULL } , RET TAB { "type : list" , SPC RWST_TY M-/ _L M-/ , SPC "list SPC of SPC type SPC names" , SPC NULL } , RET TAB { "flowtype : list" , SPC REST_FL DEL 2*M-DEL RWST_FL M-/ M-DEL M-l 4*C-p C-e L M-/ , SPC "list SPC of SPC flowtype SPC names" , SPC NULL } , RET 2*TAB

Command: last-kbd-macro
Key: none

Macro:

3*C-v			;; scroll-up-command
7*C-n			;; next-line
21*C-k			;; kill-line
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"class"			;; self-insert-command * 7
,			;; c-electric-semi&comma
SPC			;; self-insert-command
RWST_C			;; self-insert-command * 6
M-/			;; dabbrev-expand
M-DEL			;; backward-kill-word
DEL			;; c-electric-backspace
,			;; c-electric-semi&comma
SPC			;; self-insert-command
"class			;; self-insert-command * 6
SPC			;; self-insert-command
name"			;; self-insert-command * 5
,			;; c-electric-semi&comma
SPC			;; self-insert-command
NULL			;; self-insert-command * 4
}			;; c-electric-brace
,			;; c-electric-semi&comma
RET			;; newline
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"type"			;; self-insert-command * 6
,			;; c-electric-semi&comma
SPC			;; self-insert-command
RWST_T			;; self-insert-command * 6
M-/			;; dabbrev-expand
M-DEL			;; backward-kill-word
DEL			;; c-electric-backspace
,			;; c-electric-semi&comma
SPC			;; self-insert-command
"type			;; self-insert-command * 5
SPC			;; self-insert-command
name"			;; self-insert-command * 5
,			;; c-electric-semi&comma
SPC			;; self-insert-command
NULL			;; self-insert-command * 4
}			;; c-electric-brace
,			;; c-electric-semi&comma
RET			;; newline
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"flowtype		;; self-insert-command * 9
,			;; c-electric-semi&comma
SPC			;; self-insert-command
"RWST_FLO		;; self-insert-command * 9
M-/			;; dabbrev-expand
2*M-DEL			;; backward-kill-word
DEL			;; c-electric-backspace
,			;; c-electric-semi&comma
SPC			;; self-insert-command
"flowtype		;; self-insert-command * 9
SPC			;; self-insert-command
name"			;; self-insert-command * 5
,			;; c-electric-semi&comma
SPC			;; self-insert-command
NULL			;; self-insert-command * 4
}			;; c-electric-brace
,			;; c-electric-semi&comma
RET			;; newline
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"sensor"		;; self-insert-command * 8
,			;; c-electric-semi&comma
SPC			;; self-insert-command
C-p			;; previous-line
2*C-f			;; forward-char
,			;; c-electric-semi&comma
4*DEL			;; c-electric-backspace
"			;; self-insert-command
,			;; c-electric-semi&comma
.			;; self-insert-command
DEL			;; c-electric-backspace
SPC			;; self-insert-command
C-n			;; next-line
RWST_SE			;; self-insert-command * 7
M-/			;; dabbrev-expand
2*M-DEL			;; backward-kill-word
DEL			;; c-electric-backspace
,			;; c-electric-semi&comma
.			;; self-insert-command
DEL			;; c-electric-backspace
SPC			;; self-insert-command
"sensor			;; self-insert-command * 7
SPC			;; self-insert-command
name"			;; self-insert-command * 5
,			;; c-electric-semi&comma
SPC			;; self-insert-command
NULL			;; self-insert-command * 4
}			;; c-electric-brace
C-p			;; previous-line
C-e			;; move-end-of-line
RET			;; newline
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"id-flowtype"		;; self-insert-command * 13
,			;; c-electric-semi&comma
SPC			;; self-insert-command
RWST_FL			;; self-insert-command * 7
M-/			;; dabbrev-expand
_			;; self-insert-command
M-/			;; dabbrev-expand
M-DEL			;; backward-kill-word
DEL			;; c-electric-backspace
,			;; c-electric-semi&comma
SPC			;; self-insert-command
"flowtype		;; self-insert-command * 9
SPC			;; self-insert-command
integer			;; self-insert-command * 7
SPC			;; self-insert-command
ide			;; self-insert-command * 3
M-/			;; dabbrev-expand
M-DEL			;; backward-kill-word
identifier"		;; self-insert-command * 11
,			;; c-electric-semi&comma
SPC			;; self-insert-command
NULL			;; self-insert-command * 4
}			;; c-electric-brace
,			;; c-electric-semi&comma
C-n			;; next-line
,			;; c-electric-semi&comma
RET			;; newline
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"id-sensor"		;; self-insert-command * 11
,			;; c-electric-semi&comma
SPC			;; self-insert-command
RST_SE			;; self-insert-command * 6
5*DEL			;; c-electric-backspace
WST_SE			;; self-insert-command * 6
M-/			;; dabbrev-expand
_			;; self-insert-command
M-/			;; dabbrev-expand
M-DEL			;; backward-kill-word
DEL			;; c-electric-backspace
,			;; c-electric-semi&comma
SPC			;; self-insert-command
"sensor			;; self-insert-command * 7
SPC			;; self-insert-command
integer			;; self-insert-command * 7
SPC			;; self-insert-command
ident			;; self-insert-command * 5
M-/			;; dabbrev-expand
"			;; self-insert-command
,			;; c-electric-semi&comma
.			;; self-insert-command
DEL			;; c-electric-backspace
SPC			;; self-insert-command
NULL			;; self-insert-command * 4
}			;; c-electric-brace
,			;; c-electric-semi&comma
RET			;; newline
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"dexfrib		;; self-insert-command * 8
5*DEL			;; c-electric-backspace
scribe-senro		;; self-insert-command * 12
2*DEL			;; c-electric-backspace
or"			;; self-insert-command * 3
,			;; c-electric-semi&comma
SPC			;; self-insert-command
RWST_SE			;; self-insert-command * 7
M-/			;; dabbrev-expand
M-DEL			;; backward-kill-word
D			;; self-insert-command
M-/			;; dabbrev-expand
,			;; c-electric-semi&comma
SPC			;; self-insert-command
"sensor			;; self-insert-command * 7
SPC			;; self-insert-command
desc			;; self-insert-command * 4
M-/			;; dabbrev-expand
3*DEL			;; c-electric-backspace
iption"			;; self-insert-command * 7
,			;; c-electric-semi&comma
SPC			;; self-insert-command
NULL			;; self-insert-command * 4
}			;; c-electric-brace
,			;; c-electric-semi&comma
RET			;; newline
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"default-class"		;; self-insert-command * 15
,			;; c-electric-semi&comma
SPC			;; self-insert-command
RWST_DRF		;; self-insert-command * 8
2*DEL			;; c-electric-backspace
EDF			;; self-insert-command * 3
2*DEL			;; c-electric-backspace
F			;; self-insert-command
M-/			;; dabbrev-expand
2*M-DEL			;; backward-kill-word
C			;; self-insert-command
M-/			;; dabbrev-expand
M-DEL			;; backward-kill-word
DEL			;; c-electric-backspace
,			;; c-electric-semi&comma
SPC			;; self-insert-command
"default		;; self-insert-command * 8
SPC			;; self-insert-command
class			;; self-insert-command * 5
SPC			;; self-insert-command
name"			;; self-insert-command * 5
,			;; c-electric-semi&comma
SPC			;; self-insert-command
NULL			;; self-insert-command * 4
}			;; c-electric-brace
,			;; c-electric-semi&comma
RET			;; newline
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"default-type"		;; self-insert-command * 14
,			;; c-electric-semi&comma
SPC			;; self-insert-command
RWST_DE			;; self-insert-command * 7
2*M-/			;; dabbrev-expand
M-DEL			;; backward-kill-word
DEL			;; c-electric-backspace
,			;; c-electric-semi&comma
SPC			;; self-insert-command
"default		;; self-insert-command * 8
SPC			;; self-insert-command
type			;; self-insert-command * 4
SPC			;; self-insert-command
name"			;; self-insert-command * 5
,			;; c-electric-semi&comma
SPC			;; self-insert-command
NULL			;; self-insert-command * 4
}			;; c-electric-brace
,			;; c-electric-semi&comma
RET			;; newline
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"mark-defaults"		;; self-insert-command * 15
,			;; c-electric-semi&comma
SPC			;; self-insert-command
RWS_			;; self-insert-command * 4
DEL			;; c-electric-backspace
T_MA			;; self-insert-command * 4
M-/			;; dabbrev-expand
,			;; c-electric-semi&comma
SPC			;; self-insert-command
DEL			;; c-electric-backspace
RET			;; newline
TAB			;; c-indent-line-or-region
"'+'			;; self-insert-command * 4
SPC			;; self-insert-command
for			;; self-insert-command * 3
SPC			;; self-insert-command
default			;; self-insert-command * 7
SPC			;; self-insert-command
classes			;; self-insert-command * 7
,			;; c-electric-semi&comma
SPC			;; self-insert-command
'			;; self-insert-command
*			;; c-electric-star
'			;; self-insert-command
SPC			;; self-insert-command
for			;; self-insert-command * 3
SPC			;; self-insert-command
types"			;; self-insert-command * 6
,			;; c-electric-semi&comma
SPC			;; self-insert-command
N U L			;; self-insert-command * 3
:			;; c-electric-colon
DEL			;; c-electric-backspace
L			;; self-insert-command
}			;; c-electric-brace
,			;; c-electric-semi&comma
RET			;; newline
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"class			;; self-insert-command * 6
:			;; c-electric-colon
list"			;; self-insert-command * 5
,			;; c-electric-semi&comma
SPC			;; self-insert-command
RST			;; self-insert-command * 3
DEL			;; c-electric-backspace
<S-backspace>
WST_CLA			;; self-insert-command * 7
2*M-/			;; dabbrev-expand
,			;; c-electric-semi&comma
SPC			;; self-insert-command
"list			;; self-insert-command * 5
SPC			;; self-insert-command
of			;; self-insert-command * 2
SPC			;; self-insert-command
class			;; self-insert-command * 5
SPC			;; self-insert-command
names"			;; self-insert-command * 6
,			;; c-electric-semi&comma
SPC			;; self-insert-command
NULL			;; self-insert-command * 4
}			;; c-electric-brace
,			;; c-electric-semi&comma
RET			;; newline
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"type			;; self-insert-command * 5
:			;; c-electric-colon
list"			;; self-insert-command * 5
,			;; c-electric-semi&comma
SPC			;; self-insert-command
RWST_TY			;; self-insert-command * 7
M-/			;; dabbrev-expand
_L			;; self-insert-command * 2
M-/			;; dabbrev-expand
,			;; c-electric-semi&comma
SPC			;; self-insert-command
"list			;; self-insert-command * 5
SPC			;; self-insert-command
of			;; self-insert-command * 2
SPC			;; self-insert-command
type			;; self-insert-command * 4
SPC			;; self-insert-command
names"			;; self-insert-command * 6
,			;; c-electric-semi&comma
SPC			;; self-insert-command
NULL			;; self-insert-command * 4
}			;; c-electric-brace
,			;; c-electric-semi&comma
RET			;; newline
TAB			;; c-indent-line-or-region
{			;; c-electric-brace
"flowtype		;; self-insert-command * 9
:			;; c-electric-colon
list"			;; self-insert-command * 5
,			;; c-electric-semi&comma
SPC			;; self-insert-command
REST_FL			;; self-insert-command * 7
DEL			;; c-electric-backspace
2*M-DEL			;; backward-kill-word
RWST_FL			;; self-insert-command * 7
M-/			;; dabbrev-expand
M-DEL			;; backward-kill-word
M-l			;; downcase-word
4*C-p			;; previous-line
C-e			;; move-end-of-line
L			;; self-insert-command
M-/			;; dabbrev-expand
,			;; c-electric-semi&comma
SPC			;; self-insert-command
"list			;; self-insert-command * 5
SPC			;; self-insert-command
of			;; self-insert-command * 2
SPC			;; self-insert-command
flowtype		;; self-insert-command * 8
SPC			;; self-insert-command
names"			;; self-insert-command * 6
,			;; c-electric-semi&comma
SPC			;; self-insert-command
NULL			;; self-insert-command * 4
}			;; c-electric-brace
,			;; c-electric-semi&comma
RET			;; newline
2*TAB			;; c-indent-line-or-region

[-- Attachment #5: Type: text/plain, Size: 913 bytes --]


Type:

  C-c C-c

You should be back at rwsiteinfo-backup.c.  Execute the macro using:

  C-x e

Then type:

  TAB

At this point, you should see the indentation move to just under the `o'
in "flowtype:list".  This location is incorrect.  If you then do the
following:

  M-x set-variable RET c-echo-syntactic-information-p RET t RET TAB

you will see that c-mode believes the syntax at that point to be
topmost-intro-cont instead of the proper brace-list-entry.

When you have solved this bug, please let me know if the solution has a
reasonable chance of having solved the other problem that I have not
been able to recreate reliably, which is getting "topmost-intro indent
0" instead of "statement indent 4" when in the middle of editing a
function.  If these have little chance of being connected, I'll do my
best to try to create that scenario again (no promises).

-- 
Michael Welsh Duggan
(md5i@md5i.com)

  parent reply	other threads:[~2011-10-13  2:33 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-20 15:25 bug#9560: 24.0.50; c-mode syntax problems Michael Welsh Duggan
     [not found] ` <handler.9560.B.131653264320111.ack@debbugs.gnu.org>
2011-09-20 15:34   ` bug#9560: Acknowledgement (24.0.50; c-mode syntax problems) Michael Welsh Duggan
2011-10-02 18:24 ` bug#9560: A dribble file of an emacs -Q session that triggers the problem Michael Welsh Duggan
2011-10-10  4:15 ` bug#9560: Cache information during failure Michael Welsh Duggan
2011-10-13  2:33 ` Michael Welsh Duggan [this message]
2011-10-19 10:16   ` bug#9560: An exact recipe Alan Mackenzie
2011-10-19 13:45     ` Michael Welsh Duggan
2011-10-19 17:39       ` Alan Mackenzie
2011-10-20 11:42       ` Alan Mackenzie
2011-10-21  1:42         ` Michael Welsh Duggan
2011-10-22 11:26 ` bug#9560: Bug #9560 fixed Alan Mackenzie

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87zkh54o3x.fsf@maru.md5i.com \
    --to=md5i@md5i.com \
    --cc=9560@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).