From 201429e710c7c59022b3773a0368171bf3475eb6 Mon Sep 17 00:00:00 2001 From: nijtmans Date: Tue, 6 Jan 2009 21:58:15 +0000 Subject: A few const -> CONST86 modifications, improving backwards compatibility. Change Tk_ItemIndexProc and Tk_ItemInsertProc signature to have a Tcl_Obj parameter in stead of a string parameter. This is binary and source compatible with previous API, it just prevents the need for a type cast in the Tk_ItemType table construction. Bring doc in line with API. --- ChangeLog | 12 ++++++++++++ doc/Clipboard.3 | 4 ++-- doc/ConfigWidg.3 | 10 +++++----- doc/CrtItemType.3 | 26 +++++++++++++------------- doc/ParseArgv.3 | 6 +++--- generic/tk.h | 26 ++++++++++++++++++-------- generic/tkCanvLine.c | 13 +++++++------ generic/tkCanvPoly.c | 13 +++++++------ generic/tkCanvText.c | 20 +++++++++++--------- generic/tkCanvas.c | 18 +++++++++--------- 10 files changed, 87 insertions(+), 61 deletions(-) diff --git a/ChangeLog b/ChangeLog index dcfc8c7..270d415 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2009-01-06 Jan Nijtmans + + * generic/tk.h: A few const -> CONST86 modifications, improving + * generic/tkCanvas.c: backwards compatibility. Change Tk_ItemIndexProc + * generic/tkCanvLine.c: and Tk_ItemInsertProc signature to have a Tcl_Obj parameter + * generic/tkCanvPoly.c: in stead of a string parameter. This is binary + * generic/tkCanvText.c: and source compatible with previous API, it just prevents + * doc/CrtItemType.3: the need for a type cast in the Tk_ItemType table construction. + * doc/Clipboard.3: Bring doc in line with API + * doc/ConfigWidg.3: + * doc/ParseArgv.3: + 2009-01-06 Donal K. Fellows * generic/tkImgPhoto.c (Tk_PhotoPutBlock): Optimize a common case for diff --git a/doc/Clipboard.3 b/doc/Clipboard.3 index 42fbbb3..927a64e 100644 --- a/doc/Clipboard.3 +++ b/doc/Clipboard.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: Clipboard.3,v 1.5 2008/07/08 22:40:50 patthoyts Exp $ +'\" RCS: @(#) $Id: Clipboard.3,v 1.6 2009/01/06 21:58:15 nijtmans Exp $ '\" .so man.macros .TH Tk_ClipboardClear 3 4.0 Tk "Tk Library Procedures" @@ -33,7 +33,7 @@ Conversion type for this clipboard item; has same meaning as .AP Atom format in Representation to use when data is retrieved; has same meaning as \fIformat\fR argument to \fBTk_CreateSelHandler\fR. -.AP char *buffer in +.AP "const char" *buffer in Null terminated string containing the data to be appended to the clipboard. .BE .SH DESCRIPTION diff --git a/doc/ConfigWidg.3 b/doc/ConfigWidg.3 index 0b76ef4..c9f72f2 100644 --- a/doc/ConfigWidg.3 +++ b/doc/ConfigWidg.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: ConfigWidg.3,v 1.22 2008/10/30 21:39:16 nijtmans Exp $ +'\" RCS: @(#) $Id: ConfigWidg.3,v 1.23 2009/01/06 21:58:15 nijtmans Exp $ '\" .so man.macros .TH Tk_ConfigureWidget 3 4.1 Tk "Tk Library Procedures" @@ -105,10 +105,10 @@ option and has the following structure: .CS typedef struct { int \fItype\fR; - char *\fIargvName\fR; - char *\fIdbName\fR; - char *\fIdbClass\fR; - char *\fIdefValue\fR; + const char *\fIargvName\fR; + const char *\fIdbName\fR; + const char *\fIdbClass\fR; + const char *\fIdefValue\fR; int \fIoffset\fR; int \fIspecFlags\fR; const Tk_CustomOption *\fIcustomPtr\fR; diff --git a/doc/CrtItemType.3 b/doc/CrtItemType.3 index 2549094..a271be2 100644 --- a/doc/CrtItemType.3 +++ b/doc/CrtItemType.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: CrtItemType.3,v 1.14 2008/11/01 17:26:36 dkf Exp $ +'\" RCS: @(#) $Id: CrtItemType.3,v 1.15 2009/01/06 21:58:15 nijtmans Exp $ '\" .so man.macros .TH Tk_CreateItemType 3 4.0 Tk "Tk Library Procedures" @@ -65,7 +65,7 @@ the standard procedures implemented by the type manager: .PP .CS typedef struct Tk_ItemType { - char *\fIname\fR; + const char *\fIname\fR; int \fIitemSize\fR; Tk_ItemCreateProc *\fIcreateProc\fR; Tk_ConfigSpec *\fIconfigSpecs\fR; @@ -280,7 +280,7 @@ typedef int \fBTk_ItemConfigureProc\fR( int \fIflags\fR); .CE .PP -The \fIinterp\fR objument identifies the interpreter in which the +The \fIinterp\fR argument identifies the interpreter in which the widget command was invoked, \fIcanvas\fR is a handle for the canvas widget, and \fIitemPtr\fR is a pointer to the item being configured. \fIobjc\fR and \fIobjv\fR contain the configuration options. @@ -566,18 +566,18 @@ typedef int \fBTk_ItemIndexProc\fR( Tcl_Interp *\fIinterp\fR, Tk_Canvas \fIcanvas\fR, Tk_Item *\fIitemPtr\fR, - char *\fIindexString\fR, + Tcl_Obj *\fIindexObj\fR, int *\fIindexPtr\fR); .CE .PP The \fIinterp\fR, \fIcanvas\fR, and \fIitemPtr\fR arguments all have the usual meaning. -\fIindexString\fR contains a textual description of an index, +\fIindexObj\fR contains a textual description of an index, and \fIindexPtr\fR points to an integer value that should be filled in with a numerical index. -Note that if \fBTK_CONFIG_OBJS\fR is set in the -\fItypePtr\->alwaysRedraw\fR field, the \fIindexString\fR parameter will -actually contain a Tcl_Obj reference. +Note that if \fBTK_CONFIG_OBJS\fR is not set in the +\fItypePtr\->alwaysRedraw\fR field, the \fIindexObj\fR parameter will +actually contain a pointer to a constant string. It is up to the type manager to decide what forms of index are supported (e.g., numbers, \fBinsert\fR, \fBsel.first\fR, \fBend\fR, etc.). @@ -653,17 +653,17 @@ typedef void \fBTk_ItemInsertProc\fR( Tk_Canvas \fIcanvas\fR, Tk_Item *\fIitemPtr\fR, int \fIindex\fR, - char *\fIstring\fR); + Tcl_Obj *\fIobj\fR); .CE .PP \fIcanvas\fR and \fIitemPtr\fR have the usual meanings. \fIindex\fR is an index into the item's text, as returned by a -previous call to \fItypePtr\->insertProc\fR, and \fIstring\fR +previous call to \fItypePtr\->insertProc\fR, and \fIobj\fR contains new text to insert just before the character given by \fIindex\fR. -Note that if \fBTK_CONFIG_OBJS\fR is set in the -\fItypePtr\->alwaysRedraw\fR field, the \fIstring\fR parameter will -actually contain a Tcl_Obj reference to the string to insert. +Note that if \fBTK_CONFIG_OBJS\fR is not set in the +\fItypePtr\->alwaysRedraw\fR field, the \fIobj\fR parameter will +actually contain a pointer to a constant string to be inserted. If the item supports modification of the coordinates list by this .PP The type manager should insert the text and recompute the bounding diff --git a/doc/ParseArgv.3 b/doc/ParseArgv.3 index b5db646..bf065ee 100644 --- a/doc/ParseArgv.3 +++ b/doc/ParseArgv.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: ParseArgv.3,v 1.11 2008/06/30 22:57:01 dkf Exp $ +'\" RCS: @(#) $Id: ParseArgv.3,v 1.12 2009/01/06 21:58:15 nijtmans Exp $ '\" .so man.macros .TH Tk_ParseArgv 3 "" Tk "Tk Library Procedures" @@ -72,11 +72,11 @@ The \fIargTable\fR array specifies the kinds of arguments that are expected; each of its entries has the following structure: .CS typedef struct { - char *\fIkey\fR; + const char *\fIkey\fR; int \fItype\fR; char *\fIsrc\fR; char *\fIdst\fR; - char *\fIhelp\fR; + const char *\fIhelp\fR; } \fBTk_ArgvInfo\fR; .CE The \fIkey\fR field is a string such as diff --git a/generic/tk.h b/generic/tk.h index 1bc32e3..19a2caf 100644 --- a/generic/tk.h +++ b/generic/tk.h @@ -12,7 +12,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tk.h,v 1.127 2008/12/19 14:32:25 dgp Exp $ + * RCS: @(#) $Id: tk.h,v 1.128 2009/01/06 21:58:15 nijtmans Exp $ */ #ifndef _TK @@ -342,7 +342,7 @@ typedef struct Tk_ConfigSpec { int type; /* Type of option, such as TK_CONFIG_COLOR; * see definitions below. Last option in table * must have type TK_CONFIG_END. */ - const char *argvName; /* Switch used to specify option in argv. NULL + CONST86 char *argvName; /* Switch used to specify option in argv. NULL * means this spec is part of a group. */ Tk_Uid dbName; /* Name for option in option database. */ Tk_Uid dbClass; /* Class for option in database. */ @@ -402,14 +402,14 @@ typedef enum { */ typedef struct { - const char *key; /* The key string that flags the option in the + CONST86 char *key; /* The key string that flags the option in the * argv array. */ int type; /* Indicates option type; see below. */ char *src; /* Value to be used in setting dst; usage * depends on type. */ char *dst; /* Address of value to be modified; usage * depends on type. */ - const char *help; /* Documentation message describing this + CONST86 char *help; /* Documentation message describing this * option. */ } Tk_ArgvInfo; @@ -897,7 +897,7 @@ typedef enum { } Tk_State; typedef struct Tk_SmoothMethod { - const char *name; + CONST86 char *name; int (*coordProc) (Tk_Canvas canvas, double *pointPtr, int numPoints, int numSteps, XPoint xPoints[], double dblPoints[]); void (*postscriptProc) (Tcl_Interp *interp, Tk_Canvas canvas, @@ -1001,21 +1001,31 @@ typedef void (Tk_ItemScaleProc)(Tk_Canvas canvas, Tk_Item *itemPtr, double scaleY); typedef void (Tk_ItemTranslateProc)(Tk_Canvas canvas, Tk_Item *itemPtr, double deltaX, double deltaY); +#ifdef USE_OLD_CANVAS typedef int (Tk_ItemIndexProc)(Tcl_Interp *interp, Tk_Canvas canvas, Tk_Item *itemPtr, char *indexString, int *indexPtr); +#else +typedef int (Tk_ItemIndexProc)(Tcl_Interp *interp, Tk_Canvas canvas, + Tk_Item *itemPtr, Tcl_Obj *indexString, int *indexPtr); +#endif typedef void (Tk_ItemCursorProc)(Tk_Canvas canvas, Tk_Item *itemPtr, int index); typedef int (Tk_ItemSelectionProc)(Tk_Canvas canvas, Tk_Item *itemPtr, int offset, char *buffer, int maxBytes); +#ifdef USE_OLD_CANVAS typedef void (Tk_ItemInsertProc)(Tk_Canvas canvas, Tk_Item *itemPtr, int beforeThis, char *string); +#else +typedef void (Tk_ItemInsertProc)(Tk_Canvas canvas, Tk_Item *itemPtr, + int beforeThis, Tcl_Obj *string); +#endif typedef void (Tk_ItemDCharsProc)(Tk_Canvas canvas, Tk_Item *itemPtr, int first, int last); #ifndef __NO_OLD_CONFIG typedef struct Tk_ItemType { - const char *name; /* The name of this type of item, such as + CONST86 char *name; /* The name of this type of item, such as * "line". */ int itemSize; /* Total amount of space needed for item's * record. */ @@ -1217,7 +1227,7 @@ typedef int (Tk_ImagePostscriptProc) (ClientData clientData, */ struct Tk_ImageType { - const char *name; /* Name of image type. */ + CONST86 char *name; /* Name of image type. */ Tk_ImageCreateProc *createProc; /* Procedure to call to create a new image of * this type. */ @@ -1329,7 +1339,7 @@ typedef int (Tk_ImageStringWriteProc) (Tcl_Interp *interp, Tcl_Obj *format, */ struct Tk_PhotoImageFormat { - const char *name; /* Name of image file format */ + CONST86 char *name; /* Name of image file format */ Tk_ImageFileMatchProc *fileMatchProc; /* Procedure to call to determine whether an * image file matches this format. */ diff --git a/generic/tkCanvLine.c b/generic/tkCanvLine.c index 6abb362..61151c4 100644 --- a/generic/tkCanvLine.c +++ b/generic/tkCanvLine.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkCanvLine.c,v 1.27 2008/11/27 23:26:05 nijtmans Exp $ + * RCS: @(#) $Id: tkCanvLine.c,v 1.28 2009/01/06 21:58:15 nijtmans Exp $ */ #include @@ -236,10 +236,10 @@ Tk_ItemType tkLineType = { LineToPostscript, /* postscriptProc */ ScaleLine, /* scaleProc */ TranslateLine, /* translateProc */ - (Tk_ItemIndexProc *) GetLineIndex, /* indexProc */ + GetLineIndex, /* indexProc */ NULL, /* icursorProc */ NULL, /* selectionProc */ - (Tk_ItemInsertProc *) LineInsert, /* insertProc */ + LineInsert, /* insertProc */ LineDeleteCoords, /* dTextProc */ NULL, /* nextPtr */ }; @@ -315,7 +315,7 @@ CreateLine( */ for (i = 1; i < objc; i++) { - char *arg = Tcl_GetString(objv[i]); + const char *arg = Tcl_GetString(objv[i]); if ((arg[0] == '-') && (arg[1] >= 'a') && (arg[1] <= 'z')) { break; @@ -1752,7 +1752,7 @@ GetLineIndex( { LineItem *linePtr = (LineItem *) itemPtr; int length; - char *string = Tcl_GetStringFromObj(obj, &length); + const char *string = Tcl_GetStringFromObj(obj, &length); if (string[0] == 'e') { if (strncmp(string, "end", (unsigned) length) == 0) { @@ -1771,7 +1771,8 @@ GetLineIndex( } else if (string[0] == '@') { int i; double x, y, bestDist, dist, *coordPtr; - char *end, *p; + char *end; + const char *p; p = string+1; x = strtod(p, &end); diff --git a/generic/tkCanvPoly.c b/generic/tkCanvPoly.c index bbdf91a..aaa2d3a 100644 --- a/generic/tkCanvPoly.c +++ b/generic/tkCanvPoly.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkCanvPoly.c,v 1.23 2008/11/09 21:53:39 nijtmans Exp $ + * RCS: @(#) $Id: tkCanvPoly.c,v 1.24 2009/01/06 21:58:15 nijtmans Exp $ */ #include @@ -205,10 +205,10 @@ Tk_ItemType tkPolygonType = { PolygonToPostscript, /* postscriptProc */ ScalePolygon, /* scaleProc */ TranslatePolygon, /* translateProc */ - (Tk_ItemIndexProc *) GetPolygonIndex,/* indexProc */ + GetPolygonIndex, /* indexProc */ NULL, /* icursorProc */ NULL, /* selectionProc */ - (Tk_ItemInsertProc *) PolygonInsert,/* insertProc */ + PolygonInsert, /* insertProc */ PolygonDeleteCoords, /* dTextProc */ NULL, /* nextPtr */ }; @@ -287,7 +287,7 @@ CreatePolygon( */ for (i = 0; i < objc; i++) { - char *arg = Tcl_GetString(objv[i]); + const char *arg = Tcl_GetString(objv[i]); if ((arg[0] == '-') && (arg[1] >= 'a') && (arg[1] <= 'z')) { break; @@ -1679,7 +1679,7 @@ GetPolygonIndex( { PolygonItem *polyPtr = (PolygonItem *) itemPtr; int length; - char *string = Tcl_GetStringFromObj(obj, &length); + const char *string = Tcl_GetStringFromObj(obj, &length); if (string[0] == 'e') { if (strncmp(string, "end", (unsigned)length) != 0) { @@ -1689,7 +1689,8 @@ GetPolygonIndex( } else if (string[0] == '@') { int i; double x, y, bestDist, dist, *coordPtr; - char *end, *p; + char *end; + const char *p; p = string+1; x = strtod(p, &end); diff --git a/generic/tkCanvText.c b/generic/tkCanvText.c index 3f6900b..72da38d 100644 --- a/generic/tkCanvText.c +++ b/generic/tkCanvText.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkCanvText.c,v 1.35 2008/11/23 15:08:58 dkf Exp $ + * RCS: @(#) $Id: tkCanvText.c,v 1.36 2009/01/06 21:58:15 nijtmans Exp $ */ #include @@ -166,7 +166,7 @@ static int TextCoords(Tcl_Interp *interp, static void TextDeleteChars(Tk_Canvas canvas, Tk_Item *itemPtr, int first, int last); static void TextInsert(Tk_Canvas canvas, - Tk_Item *itemPtr, int beforeThis, char *string); + Tk_Item *itemPtr, int beforeThis, Tcl_Obj *obj); static int TextToArea(Tk_Canvas canvas, Tk_Item *itemPtr, double *rectPtr); static double TextToPoint(Tk_Canvas canvas, @@ -196,7 +196,7 @@ Tk_ItemType tkTextType = { TextToPostscript, /* postscriptProc */ ScaleText, /* scaleProc */ TranslateText, /* translateProc */ - (Tk_ItemIndexProc *) GetTextIndex,/* indexProc */ + GetTextIndex, /* indexProc */ SetTextCursor, /* icursorProc */ GetSelText, /* selectionProc */ TextInsert, /* insertProc */ @@ -285,7 +285,7 @@ CreateText( if (objc == 1) { i = 1; } else { - char *arg = Tcl_GetString(objv[1]); + const char *arg = Tcl_GetString(objv[1]); i = 2; if ((arg[0] == '-') && (arg[1] >= 'a') && (arg[1] <= 'z')) { @@ -1002,14 +1002,15 @@ TextInsert( Tk_Item *itemPtr, /* Text item to be modified. */ int index, /* Character index before which string is to * be inserted. */ - char *string) /* New characters to be inserted. */ + Tcl_Obj *obj) /* New characters to be inserted. */ { TextItem *textPtr = (TextItem *) itemPtr; int byteIndex, byteCount, charsAdded; char *newStr, *text; + const char *string; Tk_CanvasTextInfo *textInfoPtr = textPtr->textInfoPtr; - string = Tcl_GetStringFromObj((Tcl_Obj *) string, &byteCount); + string = Tcl_GetStringFromObj(obj, &byteCount); text = textPtr->text; @@ -1345,7 +1346,7 @@ GetTextIndex( int c; TkCanvas *canvasPtr = (TkCanvas *) canvas; Tk_CanvasTextInfo *textInfoPtr = textPtr->textInfoPtr; - char *string = Tcl_GetStringFromObj(obj, &length); + const char *string = Tcl_GetStringFromObj(obj, &length); c = string[0]; @@ -1371,7 +1372,8 @@ GetTextIndex( } else if (c == '@') { int x, y; double tmp, c = textPtr->cosine, s = textPtr->sine; - char *end, *p; + char *end; + const char *p; p = string+1; tmp = strtod(p, &end); @@ -1387,7 +1389,7 @@ GetTextIndex( y = (int) ((tmp < 0) ? tmp - 0.5 : tmp + 0.5); x += canvasPtr->scrollX1 - (int) textPtr->drawOrigin[0]; y += canvasPtr->scrollY1 - (int) textPtr->drawOrigin[1]; - *indexPtr = Tk_PointToChar(textPtr->textLayout, + *indexPtr = Tk_PointToChar(textPtr->textLayout, (int) (x*c - y*s), (int) (y*c + x*s)); } else if (Tcl_GetIntFromObj(NULL, obj, indexPtr) == TCL_OK) { if (*indexPtr < 0) { diff --git a/generic/tkCanvas.c b/generic/tkCanvas.c index f1d7421..f21c306 100644 --- a/generic/tkCanvas.c +++ b/generic/tkCanvas.c @@ -12,7 +12,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkCanvas.c,v 1.58 2008/12/09 21:22:56 dgp Exp $ + * RCS: @(#) $Id: tkCanvas.c,v 1.59 2009/01/06 21:58:15 nijtmans Exp $ */ /* #define USE_OLD_TAG_SEARCH 1 */ @@ -77,7 +77,7 @@ typedef struct TagSearch { * return NULL. */ int type; /* Search type (see #defs below) */ int id; /* Item id for searches by id */ - char *string; /* Tag expression string */ + const char *string; /* Tag expression string */ int stringIndex; /* Current position in string scan */ int stringLength; /* Length of tag expression string */ char *rewritebuffer; /* Tag string (after removing escapes) */ @@ -531,10 +531,10 @@ ItemIndex( return TCL_OK; } else if (itemPtr->typePtr->alwaysRedraw & TK_CONFIG_OBJS) { return itemPtr->typePtr->indexProc(interp, (Tk_Canvas) canvasPtr, - itemPtr, (char *) objPtr, indexPtr); + itemPtr, objPtr, indexPtr); } else { return itemPtr->typePtr->indexProc(interp, (Tk_Canvas) canvasPtr, - itemPtr, Tcl_GetString(objPtr), indexPtr); + itemPtr, (Tcl_Obj *) Tcl_GetString(objPtr), indexPtr); } } @@ -547,10 +547,10 @@ ItemInsert( { if (itemPtr->typePtr->alwaysRedraw & TK_CONFIG_OBJS) { itemPtr->typePtr->insertProc((Tk_Canvas) canvasPtr, itemPtr, - beforeThis, (char *) toInsert); + beforeThis, toInsert); } else { itemPtr->typePtr->insertProc((Tk_Canvas) canvasPtr, itemPtr, - beforeThis, Tcl_GetString(toInsert)); + beforeThis, (Tcl_Obj *) Tcl_GetString(toInsert)); } } @@ -975,7 +975,7 @@ CanvasWidgetCmd( if (objc == 5) { int append = 0; unsigned long mask; - char *argv4 = Tcl_GetString(objv[4]); + const char *argv4 = Tcl_GetString(objv[4]); if (argv4[0] == 0) { result = Tk_DeleteBinding(interp, canvasPtr->bindingTable, @@ -1233,7 +1233,7 @@ CanvasWidgetCmd( Tk_Item *itemPtr; int isNew = 0; Tcl_HashEntry *entryPtr; - char *arg; + const char *arg; int length; if (objc < 3) { @@ -3316,7 +3316,7 @@ TagSearchScan( TagSearch **searchPtrPtr) /* Record describing tag search; will be * initialized here. */ { - char *tag = Tcl_GetString(tagObj); + const char *tag = Tcl_GetString(tagObj); int i; TagSearch *searchPtr; -- cgit v0.12