📄 glue.c
字号:
/** * * $Id: glue.c,v 1.1 2004/08/28 19:25:46 dannybackx Exp $ * * Copyright (C) 1995 Free Software Foundation, Inc. * Copyright (C) 1995-2001 LessTif Development Team * * This file is part of the GNU LessTif Library. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * * Original author: Geoffrey W. Ritchey * codesmit@southwind.net **/#include <LTconfig.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <ctype.h>#include <X11/Xlib.h>#include "FakeWidget.h"#include "glue.h"#include "uil.h"#include "MrmTypes.h"#include "main.h"static void Check(void);#define StripQuotes(s) {s++;s[strlen(s)-1] = 0;}/*** *** c is a child widget of the widget currently being defind in w. *** c may not be already defined but space has been allocated for it *** already and c points to that space. This function must put that *** pointer in w's list of children and set c's parent. ***/voidfeatures_controls(char *w, char *c){ FakeWidgetList *children = (FakeWidgetList *)c; FakeWidgetType *wid = (FakeWidgetType *)w; FakeWidgetList *widChild = FakeWidgetTypeKids(wid); if (NULL == c) { return; } FakeWidgetListAppendLists(widChild, children); FakeWidgetListSetParents(widChild, wid);}/* * a is list of attributes that describe the widget being created * in w. 'a' needs to be appended to the attribute list that w * has aquired so far. */voidfeatures_arguments(char *w, char *a){ FakeWidgetType *wid = ((FakeWidgetType *)w); AttributeList *widAtts = FakeWidgetTypeAtts(wid); AttributeList *al = (AttributeList *)a; if (NULL == a) { return; } AttributeListAppendLists(widAtts, al);}voidfeatures_callbacks(char *w, char *c){ CallbackList *cl = (CallbackList *)c; FakeWidgetType *wid = ((FakeWidgetType *)w); CallbackList *widCalls = FakeWidgetTypeCalls(wid); if (NULL == cl) { cl = CallbackListNew(); } CallbackListAppendLists(widCalls, cl);}/* * This is the bottom of the line, Create space for a widget * to be defined as we move back up the stack. It may turn out * that space the widget we are defining here has already been * forward referced. In that case, this widget will be copied to * that one and destroyed. */char *Features_NULL(void){ FakeWidgetType *wid = FakeWidgetTypeNew(); return (char *)wid;}char *InheritControls(char *w, char *name){ FakeWidgetList *wil = (FakeWidgetList *)w; FakeWidgetType *wid; wid = FakeWidgetTypeNew2(name, "Inherited", 0); if (NULL == wil) { wil = FakeWidgetListNew(NULL); } FakeWidgetListAppend(wil, wid); return (char *)wil;}/* * We are referencing a widget that might not exist yet. * Look up the widget in the symbol table (Widget List) * and return its pointer if it is found. If it doesn't exit * Create the symbol table entry and return a pointer to it. * The WidgetList being built will be the list of children * of a Widget being built. */char *controllist_controllist_ID_ID(char *w, char *theClass, char *name, char managed){ FakeWidgetList *wil = (FakeWidgetList *)w; FakeWidgetType *wid; wid = FakeWidgetTypeNew2(name, theClass, managed); if (NULL == wil) { wil = FakeWidgetListNew(NULL); } FakeWidgetListUpdate(&WidgetTable, &wid); FakeWidgetListAppend(wil, wid); return (char *)wil;}char *control_list_ID_features(char *w, char *theType, char *wid, char managed){ FakeWidgetList *wil = (FakeWidgetList *)w; FakeWidgetType *widget = (FakeWidgetType *)wid; if (NULL == wil) { wil = FakeWidgetListNew(NULL); } FakeWidgetTypeSetName(widget, NULL, theType); if (!managed) { FakeWidgetTypeUnmanage(widget); } FakeWidgetListUpdate(&WidgetTable, &widget); FakeWidgetListAppend(wil, widget); return (char *)wil;}/* * We are building the attribute list for the widget currently * being built. Each new attribute is created here. Its name * is passed as 'n' and its value is in expr passed through 'e'. * The attribute should be added to the list in 'a' after its * creation. */char *arglist_arglist_ID_addexpr(char *a, char *name, char *e){ AttributeList *list = (AttributeList *)a; ExpressionType *expr = (ExpressionType *)e; if (NULL == list) { list = AttributeListNew(); } if (expr) { AttributeListAppend(list, ExpressionElementNew1(name, expr)); } return (char *)list;}char *Parameter(char *pl, char *e){ ParameterList *list = (ParameterList *)pl; ExpressionType *expr = (ExpressionType *)e; ParameterElement *elem = ParameterElementNew1(expr); if (NULL == list) { list = ParameterListNew(); } if (expr) { ParameterListAppend(list, elem); } return (char *)list;}char *WidgetArgument(char *a, char *name, char *widName){ AttributeList *list = (AttributeList *)a; ExpressionType *expr = (ExpressionType *)AddrNameNew(widName); ExpressionElement *elem = ExpressionElementNew1(name, expr); if (NULL == list) { list = AttributeListNew(); } AttributeListAppend(list, elem); return (char *)list;}char *InsertString(char *sl, char *s){ char temp[256]; Char8Vector *StringList = (Char8Vector *)sl; if (NULL == StringList) { StringList = Char8VectorNew(); } if ('"' == s[0]) { StripQuotes(s); } else { strcpy(&temp[1], s); temp[0] = '~'; s = temp; } Char8VectorAppend(StringList, __MrmStore(s)); return (char *)StringList;}char *InheritCallback(char *name){ CallbackType *callback = CallbackTypeNew("Inherited", name, NULL); CallbackList *cb = CallbackListNew(); CallbackListAppend(cb, callback); return (char *)cb;}char *InheritArgument(char *a, char *name){ AttributeList *list = (AttributeList *)a; ExpressionType *Expr = (ExpressionType *)InheritItemNew(name); ExpressionElement *Elem = ExpressionElementNew1(name, Expr); if (NULL == list) { list = AttributeListNew(); } AttributeListAppend(list, Elem); return (char *)list;}char *expr_STRING_Compound(char *st, int Separate, int IsAddress){ if (!IsAddress) { StripQuotes(st); } return (char *)CStringNew(st, NULL, IsAddress, Separate);}/* * The rvalue of an equation is a string. Set values and return. */char *expr_STRING(char *st, char *cs, int CompoundString){ char s[256]; int i; FontSet *fs = (FontSet *) cs; char *FontName = NULL; if (fs) { FontName = fs->fontset.name; } for (i = 0; *st; i++) { if ('\\' == *st) { st++; while (*st && isdigit(*st)) { s[i] = s[i] * 10 + *st++ - '0'; } if (*st != '\\') { __MrmExit(LOC, "String ERROR\n"); } st++; } else { s[i] = *st++; } } s[i] = 0; st = s; if (CompoundString) { return (char *)CStringNew(st, FontName, 0, 0); } else { StripQuotes(st); return (char *)CStringNew(st, FontName, 0, 0); }}/* * The rvalue of an equation is a integer. Set values and return. */char *prim_exp(char *s){ return (char *)IntegerNew(atoi(s));}char *expr_BOOL(char *s){ return (char *)BooleanMNew((Bool)(long)s);}char *expr_ID(char *s){ return (char *)AddrNameNew(s);}/* * We are building a complex string. Just push the * strings passed in and return a pointer to the stack. */static char StackString[1000];char *string_push(char *s){ strcat(StackString, s); return StackString;}voidstring_clear(void){ StackString[0] = 0;}/* * Here we are generating the list of callbacks in 'l' * for the widget that is currently being built. */char *callbacklist_callbacklist_PROCID_arglist(char *l, char *id, char *fn, char *parm){ CallbackList *list = (CallbackList *)l; ParameterList *Parameters = (ParameterList *)parm; if (NULL == list) { list = CallbackListNew(); } CallbackListAppend(list, CallbackTypeNew(id, fn, Parameters)); return (char *)list;}/* * The widget 'w' has just been built. Add it to the list * 'wl' and to the symbol table. */char *body_OBJECT_object(char *wl, char *w){ FakeWidgetType *wid = (FakeWidgetType *)w; FakeWidgetList *list = (FakeWidgetList *)wl; if (NULL == list) { list = FakeWidgetListNew(NULL); } if (0 == strcmp(wid->theName, "layoutRTForm")) { fprintf(stderr, "HERE\n"); } FakeWidgetListUpdate(&WidgetTable, &wid); FakeWidgetListAppend(list, wid); return (char *)list;}void AddCallbackList(char *name, char *c){ CallbackList *Callbacks = (CallbackList *)c; FakeWidgetType *wid = FakeWidgetTypeNew1(name, "list"); CallbackList *calls = (CallbackList *)wid->Callbacks; if (NULL != Callbacks) { CallbackListAppendLists(calls, Callbacks); } FakeWidgetListUpdate(&WidgetTable, &wid);}void AddControlList(char *name, char *c){ FakeWidgetList *children = (FakeWidgetList *)c; FakeWidgetType *wid = FakeWidgetTypeNew1(name, "list"); FakeWidgetList *kids = FakeWidgetTypeKids(wid); if (NULL != children) { FakeWidgetListAppendLists(kids, children); } FakeWidgetListUpdate(&WidgetTable, &wid);}voidAddAttributeList(char *name, char *a){ AttributeList *Attributes = (AttributeList *)a; FakeWidgetType *wid = FakeWidgetTypeNew1(name, "list"); AttributeList *atts = FakeWidgetTypeAtts(wid); AttributeListAppendLists(atts, Attributes); FakeWidgetListUpdate(&WidgetTable, &wid);}voidID_ID_features(char *name, char *theClass, char *w){ FakeWidgetType *wid = (FakeWidgetType *)w; FakeWidgetTypeSetName(wid, name, theClass);}void MakeTable(char *VariableName, char *Ex, int global){ ExpressionType *Expression = (ExpressionType *)Ex; if (global) { ExpressionListAppend(&GlobalSymbolTable, ExpressionElementNew1(VariableName, Expression)); } else { ExpressionListAppend(&LocalSymbolTable, ExpressionElementNew1(VariableName, Expression)); }}char *pixmap(char *n, char *s){ Char8Vector *strings = (Char8Vector *)s; return (char *)PixmapImageNew(n, strings);}char *AddFont(char *fs, char *f, char *l){ FontM *font; FontSet *theFontSet = (FontSet *) fs; FontTable *list = (FontTable *) l; font = FontMNew(f); if (NULL == list) { list = FontTableNew(); } FontTableAppend(list, theFontSet, font); return (char *)list;}char *AddColor(char *c, char *representation, char *l, int IsAddressd){ Color *color; ColorTable *list = (ColorTable *)l; int IsAddress = 1; if ('"' == c[0]) { StripQuotes(c); IsAddress = 0; } StripQuotes(representation); color = ColorNew(c, 0, 0, 0); if (IsAddress) { ColorSetAddress(color); } if (NULL == list) { list = ColorTableNew(); } ColorTableAppend(list, representation, color); return (char *)list;}char *color(char *s, char *r, char *g, char *b){ if (s && s[0]) { if ('"' == s[0]) { StripQuotes(s); } return (char *)ColorNew(s, 0, 0, 0); } else { return (char *)ColorNew(NULL, atoi(r), atoi(g), atoi(b)); }}char *font(char *s){ if ('"' == s[0]) { StripQuotes(s); } return (char *)FontMNew(s);}char *keysym(char *s){ char temp[256]; if ('"' == s[0]) { StripQuotes(s); } else { temp[0] = '~'; strcpy(&temp[1], s); s = temp; } return (char *)KeysymNew(s);}char *bitmap(char *s){ StripQuotes(s); return (char *)XBitmapFileNew(s);}char *MakeNewCharSet(void){ return (char *)FontSetNew();}char *CharSetRToL(char *cs, int d){ FontSet *CharSet = (FontSet *) cs; FontSetDirectionRtoL(CharSet, d); return cs;}char *CharSet16Bit(char *cs, int bits16){ FontSet *CharSet = (FontSet *) cs; FontSet16Bit(CharSet, bits16); return cs;}char *CharSetName(char *cs, char *name){ FontSet *CharSet; if (NULL == cs) { CharSet = FontSetNew(); } else { CharSet = (FontSet *) cs; } FontSetName(CharSet, name); return (char *)CharSet;}char *AppendStrings(char *p1, char *p2){ CString *param1 = (CString *)p1; CString *param2 = (CString *)p2; if (param1->theExpression.type == MrmRtypeAddrName) { param1 = CStringNew1((AddrName *)p1); } if (param2->theExpression.type == MrmRtypeAddrName) { param2 = CStringNew1((AddrName *)p2); } CStringAdd(param1, param2); return (char *)param1;}char *Add(char *p1, char *p2){ ExpressionType *param1 = (ExpressionType *)p1; ExpressionType *param2 = (ExpressionType *)p2; ExpressionTypeAdd(param1, param2); ExpressionTypeDelete(param2); return (char *)param1;}char *Subtract(char *p1, char *p2){ ExpressionType *param1 = (ExpressionType *)p1; ExpressionType *param2 = (ExpressionType *)p2; ExpressionTypeSubtract(param1, param2); ExpressionTypeDelete(param2); return (char *)param1;}char *Multiply(char *p1, char *p2){ ExpressionType *param1 = (ExpressionType *)p1; ExpressionType *param2 = (ExpressionType *)p2; ExpressionTypeMultiply(param1, param2); ExpressionTypeDelete(param2); return (char *)param1;}char *Divide(char *p1, char *p2){ ExpressionType *param1 = (ExpressionType *)p1; ExpressionType *param2 = (ExpressionType *)p2; ExpressionTypeDivide(param1, param2); ExpressionTypeDelete(param2); return (char *)param1;}static void Check(void){ int a; if (WidgetTable.theList) { if (WidgetTable.theList->Next) { if (WidgetTable.theList->Next->theWidget) { if (WidgetTable.theList->Next->theWidget->theName) { a = strcmp("titleArgs", WidgetTable.theList->Next->theWidget->theName); if (a == 0) { fprintf(stderr, "title Arg OK\n"); return; } } } } } fprintf(stderr, "title Arg NOT OK\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -