Filewatcher File Search
FTP Search
  
Directory 
  
Content Search 
   
pkg://jex-1.3.7-1.src.rpm:114631/jex-1.3.7.tar.gz  info  downloads

jex-1.3.7/ 40755      0      0           0  6674510012  10273 5ustar  rootrootjex-1.3.7/about.c100644      0      0       10655  6672727026  11712 0ustar  rootroot#include <Xm/MessageB.h>
#include <Xm/Form.h>
#include <Xm/Label.h>
#include "jex.h"
#include "xpm.h"
#include "jexlogo.xpm"
#include "jexrlogo.xpm"

Pixmap logo=0,logo2;
extern Widget top;

void AboutOK(Widget w,Editor *e,void *cbs)
{
  SetCurrentWidget(e->text);
}

void ShowAboutDialog(Editor *e)
{
  Widget w,f,l,l2;
  Pixel fg,bg;
  XmString xstr;
  char version[30];

SP("ShowAboutDialog");
  WatchCursor(e,1);
  if (!e->abd)
  {
    e->abd=XmCreateMessageDialog(e->shell,"About",NULL,0);
    XtUnmanageChild(XmMessageBoxGetChild(e->abd,XmDIALOG_CANCEL_BUTTON));
    XtUnmanageChild(XmMessageBoxGetChild(e->abd,XmDIALOG_HELP_BUTTON));
    XtAddCallback(e->abd,XmNokCallback,(XtCallbackProc)AboutOK,(void*)e);
    if (!logo)
    {
      XtVaGetValues(e->abd,XmNforeground,&fg,XmNbackground,&bg,NULL);
/*      logo=XCreatePixmapFromBitmapData(XtDisplay(top),
		  RootWindowOfScreen(XtScreen(top)),
		  jexlogo_bits,jexlogo_width,jexlogo_height,
		  fg,bg,
		  DefaultDepthOfScreen(XtScreen(top)));
      logo2=XCreatePixmapFromBitmapData(XtDisplay(top),
		  RootWindowOfScreen(XtScreen(top)),
		  jexrlogo_bits,jexrlogo_width,jexrlogo_height,
		  fg,bg,
		  DefaultDepthOfScreen(XtScreen(top)));*/
      logo=CreatePixmapFromXPM(top,jexlogo_xpm);
      logo2=CreatePixmapFromXPM(top,jexrlogo_xpm);
		  
    }
    f=XtVaCreateManagedWidget("aboutform",xmFormWidgetClass,e->abd,
        XmNfractionBase,8,
    	NULL);
    l=XtVaCreateManagedWidget("aboutlogo",xmLabelWidgetClass,f,
    	XmNlabelType,XmPIXMAP,
    	XmNlabelPixmap,logo,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_NONE,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNbottomAttachment,XmATTACH_FORM,
    	NULL);
    l2=XtVaCreateManagedWidget("aboutlogo2",xmLabelWidgetClass,f,
    	XmNlabelType,XmPIXMAP,
    	XmNlabelPixmap,logo2,
    	XmNleftAttachment,XmATTACH_NONE,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNbottomAttachment,XmATTACH_FORM,
    	NULL);
    xstr=XmStringCreateLocalized("JEX");
    w=XtVaCreateManagedWidget("about1",xmLabelWidgetClass,f,
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,l,
    	XmNrightAttachment,XmATTACH_WIDGET,
    	XmNrightWidget,l2,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNbottomAttachment,XmATTACH_POSITION,
    	XmNbottomPosition,2,
        XmNleftOffset,20,
        XmNrightOffset,20,
        XmNlabelString,xstr,
	NULL);
    XmStringFree(xstr);
    xstr=XmStringCreateLocalized("Jorgen Editor for X");
    w=XtVaCreateManagedWidget("about2",xmLabelWidgetClass,f,
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,l,
    	XmNrightAttachment,XmATTACH_WIDGET,
    	XmNrightWidget,l2,
    	XmNtopAttachment,XmATTACH_POSITION,
    	XmNtopPosition,2,
    	XmNbottomAttachment,XmATTACH_POSITION,
    	XmNbottomPosition,3,
        XmNleftOffset,20,
        XmNrightOffset,20,
        XmNlabelString,xstr,
	NULL);
    XmStringFree(xstr);
    xstr=XmStringCreateLocalized("A programmer's editor");
    w=XtVaCreateManagedWidget("about3",xmLabelWidgetClass,f,
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,l,
    	XmNrightAttachment,XmATTACH_WIDGET,
    	XmNrightWidget,l2,
    	XmNtopAttachment,XmATTACH_POSITION,
    	XmNtopPosition,3,
    	XmNbottomAttachment,XmATTACH_POSITION,
    	XmNbottomPosition,4,
        XmNleftOffset,20,
        XmNrightOffset,20,
        XmNlabelString,xstr,
	NULL);
    XmStringFree(xstr);
    sprintf(version,"Version %d.%d.%d",MAJOR_VERSION,MINOR_VERSION,SUB_MINOR_VERSION);
    xstr=XmStringCreateLocalized(version);
    w=XtVaCreateManagedWidget("about4",xmLabelWidgetClass,f,
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,l,
    	XmNrightAttachment,XmATTACH_WIDGET,
    	XmNrightWidget,l2,
    	XmNtopAttachment,XmATTACH_POSITION,
    	XmNtopPosition,5,
    	XmNbottomAttachment,XmATTACH_POSITION,
    	XmNbottomPosition,6,
        XmNleftOffset,20,
        XmNrightOffset,20,
        XmNlabelString,xstr,
	NULL);
    XmStringFree(xstr);
    xstr=XmStringCreateLocalized("(c) 1996-1998 by Jorgen Bosman");
    w=XtVaCreateManagedWidget("about5",xmLabelWidgetClass,f,
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,l,
    	XmNrightAttachment,XmATTACH_WIDGET,
    	XmNrightWidget,l2,
    	XmNtopAttachment,XmATTACH_POSITION,
    	XmNtopPosition,7,
    	XmNbottomAttachment,XmATTACH_FORM,
        XmNleftOffset,20,
        XmNrightOffset,20,
        XmNlabelString,xstr,
	NULL);
    XmStringFree(xstr);
  }
  XtManageChild(e->abd);
  WatchCursor(e,0);
EP;
}

jex-1.3.7/asksave.c100644      0      0        2510  6672726717  12212 0ustar  rootroot#include <stdio.h>
#include <Xm/MessageB.h>
#include "jex.h"

extern Widget top;

void Function(void (*f)(),Editor *e)
{
SP("Function");
  if (f)
    f(e);
EP;
}

void NoSave(Widget w,Editor *e,void *cbs)
{
SP("NoSave");
  if (e->f!=NULL)
    Function((void(*)(void))e->f,e);
EP;
}  

void CancelAskToSave(Widget w,Editor *e,void *cbs)
{
SP("CancelAskToSave");
  XtUnmanageChild(e->ats);
  SetCurrentWidget(e->text);
EP;
}

void AskToSaveOK(Widget w,Editor *e,void *cbs)
{
SP("AskToSaveOK");
  Save(NULL,e,e->f);
  SetCurrentWidget(e->text);
EP;
}

void AskToSave(Editor *e,void *f)
{
SP("AskToSave");
  if (e->ats==NULL)
  {
    e->ats=XmCreateQuestionDialog(e->shell,"AskToSave",NULL,0);
    e->f=f;
    XtAddCallback(e->ats,XmNokCallback,(XtCallbackProc)AskToSaveOK,e);
    XtAddCallback(e->ats,XmNcancelCallback,(XtCallbackProc)NoSave,e);
    XtAddCallback(e->ats,XmNhelpCallback,(XtCallbackProc)CancelAskToSave,e);
  }
  else
  {
    XtRemoveAllCallbacks(e->ats,XmNokCallback);
    XtRemoveAllCallbacks(e->ats,XmNcancelCallback);
    XtRemoveAllCallbacks(e->ats,XmNhelpCallback);
    e->f=f;
    XtAddCallback(e->ats,XmNokCallback,(XtCallbackProc)AskToSaveOK,e);
    XtAddCallback(e->ats,XmNcancelCallback,(XtCallbackProc)NoSave,e);
    XtAddCallback(e->ats,XmNhelpCallback,(XtCallbackProc)CancelAskToSave,e);
  }
  XtManageChild(e->ats);
EP;
}  
jex-1.3.7/bookmark.c100644      0      0        7665  6672726717  12402 0ustar  rootroot#include "jex.h"
#include <Xm/List.h>
#include <Xm/MessageB.h>
#include <Xm/PushBG.h>

Widget bd=NULL,bdl;
extern Widget top;
extern Pixmap pixmap;

void OpenBookmark(Widget w,Editor *e,void *cbs)
{
  XmString xstr;
  char *str;
  
SP("OpenBookmark");
  XtVaGetValues(w,XmNlabelString,&xstr,NULL);
  XmStringGetLtoR(xstr,XmSTRING_DEFAULT_CHARSET,&str);
  XmStringFree(xstr);
  if (e->new_window)
  {
    CreateNewEditor();
    if (loadfile(editor[editors-1],str,0,1))
      LoadError(editor[editors-1]);
  }
  else
  {
    db_strcpy(e->choice,str);
    if (e->saved)
      LoadOldFile(e);
    else
      AskToSave(e,(void*)LoadOldFile);
  }
EP;
}

void UpdateEditorBookmarks(Editor *e)
{
  int count,x;
  XmStringTable items;

  SP("UpdateEditorBookmarks");
  XtVaGetValues(bdl,XmNitemCount,&count,XmNitems,&items,NULL);
  for (x=0;x<count && x<MAXBOOKMARKBUTTONS;x++)
  {
    e->bookm[x]=XtVaCreateManagedWidget("bookmarkbutton",
      xmPushButtonGadgetClass,e->bookmarkmenu,XmNlabelString,items[x],NULL);
    XtAddCallback(e->bookm[x],XmNactivateCallback,(XtCallbackProc)OpenBookmark,(void*)e);
  }
  EP;
}

void DeleteEditorBookmarks(Editor *e)
{
  int count,x;

  SP("DeleteEditorBookmarks");
  XtVaGetValues(bdl,XmNitemCount,&count,NULL);
  for (x=0;x<count && x<MAXBOOKMARKBUTTONS;x++)
    XtDestroyWidget(e->bookm[x]);
  EP;
}

void CloseBookmark(Widget w,void *e,void *cbs)
{
SP("CloseBookmark");
  XtPopdown(bd);
EP;
}

void GotoBookmark(Widget w,void *date,XmListCallbackStruct *cbs)
{
  XmStringTable selected_items;
  int num_selected;
  char *str;
  int x;
  
SP("GotoBookmark");
  XtVaGetValues(bdl,XmNselectedItemCount,&num_selected,XmNselectedItems,&selected_items,NULL);
  if (num_selected==0)
  {
    EP;
    return;
  }
  XmStringGetLtoR(selected_items[0],XmSTRING_DEFAULT_CHARSET,&str);
  for (x=0;x<editors;x++)
  {
    if (db_strcmp(editor[x]->filename,str)==0)
    {
      XMapRaised(XtDisplay(editor[x]->shell),XtWindow(editor[x]->shell));
      XtFree(str);
      EP;
      return;
    }
  }
  CreateNewEditor();
  if (loadfile(editor[editors-1],str,0,1))
    LoadError(editor[editors-1]);
  XtFree(str);
EP;
}

void DeleteBookmark(Widget w,void *data,void *cbs)
{
  int *pos,count,x;
  
SP("DeleteBookmark");
  XmListGetSelectedPos(bdl,&pos,&count);
  if (count)
  {
    for (x=0;x<editors;x++)
      DeleteEditorBookmarks(editor[x]);
    XmListDeletePos(bdl,pos[0]);
    XtFree((char*)pos);
    for (x=0;x<editors;x++)
      UpdateEditorBookmarks(editor[x]);
  }
EP;
}
   
void CreateBookmarkDialog(void)
{
  Widget w;
  Arg arg[2];

SP("CreateBookmarkDialog");
  if (bd==NULL)
  {
    bd=XtVaAppCreateShell("BookmarkDialog","BookmarkDialog",topLevelShellWidgetClass,XtDisplay(top),
  	XmNallowShellResize,True,
    	XmNiconPixmap,pixmap,
  	NULL);
    w=XmCreateMessageBox(bd,"BookmarkDialog",NULL,0);
    XtSetArg(arg[0],XmNlistSizePolicy,XmCONSTANT);
    bdl=XmCreateScrolledList(w,"BookmarkList",arg,1);
    XtVaSetValues(XtParent(bdl),
    	XmNscrollBarDisplayPolicy,XmSTATIC, 
    	NULL);
    XtVaSetValues(bdl,
    	XmNscrollBarDisplayPolicy,XmSTATIC, 
    	XmNlistSizePolicy,XmCONSTANT, 
    	NULL);
    XtAddCallback(bdl,XmNdefaultActionCallback,(XtCallbackProc)GotoBookmark,NULL);
    XtAddCallback(w,XmNokCallback,(XtCallbackProc)CloseBookmark,NULL);
    XtAddCallback(w,XmNcancelCallback,(XtCallbackProc)GotoBookmark,NULL);
    XtAddCallback(w,XmNhelpCallback,(XtCallbackProc)DeleteBookmark,NULL);
    XtManageChild(bdl);
    XtManageChild(w);
  }
EP;
}

void AddBookmark(char *str)
{
  XmString xstr;
  int x;
  
SP("AddBookmark");
  if (bdl && str[0])
  {
    for (x=0;x<editors;x++)
      DeleteEditorBookmarks(editor[x]);
    xstr=XmStringCreateLocalized(str);
    if (!XmListItemExists(bdl,xstr))
      XmListAddItemUnselected(bdl,xstr,0);
    XmStringFree(xstr);
    for (x=0;x<editors;x++)
      UpdateEditorBookmarks(editor[x]);
  }
EP;
}

void ShowBookmarkDialog(void)
{
SP("ShowBookmarkDialog");
  XtPopup(bd,XtGrabNone);
  XMapRaised(XtDisplay(bd),XtWindow(bd));
EP;
}

jex-1.3.7/combo.c100644      0      0       14217  6672726722  11677 0ustar  rootroot#include <Xm/Xm.h>
#include <Xm/Form.h>
#include <Xm/TextF.h>
#include <Xm/DrawnB.h>
#include <Xm/RowColumn.h>
#include <Xm/PushBG.h>
#include "jbdbg.h"
#include "jex.h"
#include "list.h"

List combo_list=NULL;
extern Pixmap lov;
extern OwnRes ownres;

void ComboBoxSelect(Widget w,Widget text,void *cbs)
{
  ComboBox c;
  int x;
  
SP("ComboBoxSelect");
  if (!FindElement(combo_list,&c,sizeof(Widget),&text))
  {
    EP;
    return;
  }
  for (x=0;x<c.itemcount;x++)
  {
    if (c.items[x].button==w)
    {
      XtVaSetValues(text,XmNvalue,c.items[x].item,NULL);
      if (c.function)
        c.function(w,c.client_data,cbs);
      break;
    }
  }
EP;
}

void UpdateComboBox(Widget w,char *str)
{
  int x,end,exists=0;
  XmString xstr;
  ComboBox c;

SP("UpdateComboBox");
  if (!FindElement(combo_list,&c,sizeof(Widget),&w))
  {
    EP;
    return;
  }
  end=c.itemcount;
  if (str && str[0])
  {
    for (x=0;x<c.itemcount;x++)
    {
      if (db_strcmp(c.items[x].item,str)==0)
      {
        end=x+1;
        exists=1;
        break;
      }
    }
    if (c.itemcount<c.maxitems && !exists)
    {
      if (c.form)
      {
        c.items[c.itemcount].button=XtVaCreateManagedWidget("combobutton",
            xmPushButtonGadgetClass,c.popup,NULL);
        XtAddCallback(c.items[c.itemcount].button,XmNactivateCallback,(XtCallbackProc)ComboBoxSelect,c.text);
      }
      c.items[c.itemcount].item=NULL;
      c.itemcount++;
      end=c.itemcount;
    }
    for (x=end-2;x>=0;x--)
    {
      c.items[x+1].item=(char*)db_realloc(c.items[x+1].item,db_strlen(c.items[x].item)+1);
      db_strcpy(c.items[x+1].item,c.items[x].item);
    }
    c.items[0].item=(char*)db_realloc(c.items[0].item,db_strlen(str)+1);
    db_strcpy(c.items[0].item,str);
  }
  for (x=0;c.form && x<end;x++)
  {
    xstr=XmStringCreateLocalized(c.items[x].item);
    XtVaSetValues(c.items[x].button,XmNlabelString,xstr,NULL);
    XmStringFree(xstr);
  }
  ReplaceCurrentElement(combo_list,&c);
EP;
}

void ShowComboMenu(Widget b,Widget text,XmPushButtonCallbackStruct *cbs)
{
  Position y,y2,h,x,x2,w;
  Widget tmp;
  ComboBox c;
  XButtonPressedEvent xbe;

SP("ShowComboMenu");
  if (!FindElement(combo_list,&c,sizeof(Widget),&text))
  {
    EP;
    return;
  }
  xbe=*(XButtonPressedEvent*)&cbs->event;
  tmp=XtParent(c.text);
  y2=0;
  x2=0;
  while (!XtIsShell(tmp))
  {
    XtVaGetValues(tmp,XmNx,&x,XmNy,&y,NULL);
    x2+=x;
    y2+=y;
    tmp=XtParent(tmp);
  }
  XtVaGetValues(c.text,XmNx,&x,XmNy,&y,XmNwidth,&w,XmNheight,&h,NULL);
  xbe.y_root=y2+y+h;
  xbe.x_root=x2+x;
  XtVaGetValues(c.button,XmNwidth,&x,NULL);
  w+=x;
  if (c.itemcount)
    XtVaSetValues(c.items[0].button,XmNwidth,w,NULL);
  XmMenuPosition(c.popup,&xbe);
  XtManageChild(c.popup);
EP;
}

Widget CreateComboBox(Widget parent,String name,ArgList arglist,Cardinal argcount,int maxitems)
{
  ComboBox c;
  char str[100];
  
  SP("CreateComboBox");
  if (!combo_list)
    combo_list=CreateList(sizeof(ComboBox));
  c.maxitems=maxitems;
  c.itemcount=0;
  c.items=(ComboButton*)db_malloc(sizeof(ComboButton)*maxitems);
  c.function=NULL;
  if (parent)
  {
    db_sprintf(str,"%s_form",name);
    c.form=XmCreateForm(parent,str,arglist,argcount);
    XtManageChild(c.form);
    db_sprintf(str,"%s_button",name);
    c.button=XtVaCreateManagedWidget(str,xmDrawnButtonWidgetClass,c.form,
          XmNrightAttachment,XmATTACH_FORM,
          XmNtopAttachment,XmATTACH_FORM,
          XmNbottomAttachment,XmATTACH_FORM,
          XmNlabelType,XmPIXMAP,
          XmNlabelPixmap,lov,
          XmNhighlightThickness,0,
          XmNtopOffset,2,
          XmNbottomOffset,2,
          NULL);
    c.text=XtVaCreateManagedWidget(name,xmTextFieldWidgetClass,c.form,
          XmNleftAttachment,XmATTACH_FORM,
          XmNtopAttachment,XmATTACH_FORM,
          XmNbottomAttachment,XmATTACH_FORM,
          XmNrightAttachment,XmATTACH_WIDGET,
          XmNrightWidget,c.button,
          NULL);
    db_sprintf(str,"%s_popup",name);
    c.popup=XmVaCreateSimplePopupMenu(c.form,str,NULL,
          NULL);
    XtAddCallback(c.button,XmNarmCallback,(XtCallbackProc)ShowComboMenu,c.text);  
  }
  else
  {
    c.text=(Widget)db_strdup(name);
    c.form=NULL;
    c.button=NULL;
    c.popup=NULL;
  }
  AddElement(combo_list,&c);
EP;
  return c.text;
}  	

void DestroyAllComboBoxes(void)
{
  ComboBox c;
  int x;

  if (combo_list)
  {
    if (GetFirstElement(combo_list,&c))
    {
      do
      {
        for (x=0;x<c.itemcount;x++)
          db_free(c.items[x].item);
        db_free(c.items);
        if (!c.form)
          db_free(c.text);
      } while (GetNextElement(combo_list,&c));
    }
    DisposeList(combo_list);
  }
}

int GetComboBox(Widget w,ComboBox *c)
{
  SP("GetComboBox");
  if (!FindElement(combo_list,c,sizeof(Widget),&w))
  {
    EP;
    return 0;
  }
  EP;
  return 1;
}

void InitializeComboBox(Widget w,Widget ref)
{
  ComboBox c;
  int x;
  char *home,file[255],ini[255],*param,str[255],label[255];
  FILE *f;
  
  SP("InitializeComboBox");
  if (editors)
  {
    if (!GetComboBox(ref,&c))
    {
      EP;
      return;
    }
    for (x=0;x<c.itemcount;x++)
      UpdateComboBox(w,c.items[x].item);
  }
  else
  {
    if (!GetComboBox(w,&c))
    {
      EP;
      return;
    }
    if ((int)ownres.histhome)
    {
      home=getenv("HOME");
      if (home)
        db_sprintf(file,"%s/.jexhistory",home);
      else
        db_strcpy(file,".jexhistory");
    }
    else
      db_strcpy(file,".jexhistory");
    if ((f=fopen(file,"r"))==NULL)
    {
      EP;
      return;
    }
    sprintf(label,"%s:",(c.form!=NULL)?XtName(w):(char*)w);
    while (fgets(str,255,f))
    {
      str[db_strlen(str)-1]='\0';
      sscanf(str,"%s",ini);
      param=&str[db_strlen(ini)+1];
      if (!strcmp(ini,label))
        UpdateComboBox(w,param);
    }
    fclose(f);
  }
  EP;
}

void CopyComboBoxToFile(Widget w,FILE *f)
{
  ComboBox c;
  int x;
  
  SP("CopyComboBoxToFile");
  if (GetComboBox(w,&c))
  {
    for (x=0;x<c.itemcount;x++)
      fprintf(f,"%s: %s\n",(c.form!=NULL)?XtName(w):(char*)w,c.items[x].item);
  }
  EP;
}

void ComboBoxAddCallback(Widget w,XtCallbackProc f,void *d)
{
  ComboBox c;
  
  if (!GetComboBox(w,&c))
    return;
  c.function=f;
  c.client_data=d;
  ReplaceCurrentElement(combo_list,&c);
}
jex-1.3.7/edit.c100644      0      0       20032  6672726717  11521 0ustar  rootroot#include <Xm/MessageB.h>
#include <Xm/Text.h>
#include <ctype.h>
#include "jex.h"

extern Widget top;

void ClearSelection(Widget w,Editor *e,void *cbs)
{
  XmTextPosition f,l,x;
  char *str;

SP("ClearSelection");
  if (e->read_only)
  {
    EP;
    return;
  }
  WatchCursor(e,1);
  XmTextGetSelectionPosition(e->text,&f,&l);
  if (f==l)
  {
    WatchCursor(e,0);
EP;
    return;
  }
  str=XmTextGetSelection(e->text);
  for (x=0;x<l-f;x++)
  {
    if (str[x]!='\n')
      str[x]=' ';
  }
  XmTextReplace(e->text,f,l,str);
  XtFree(str);
  SetCurrentWidget(e->text);
  WatchCursor(e,0);
EP;
}

void CapsSelection(Widget w,Editor *e,void *cbs)
{
  XmTextPosition f,l,x;
  char *str;

SP("CapsSelection");
  if (e->read_only)
  {
    EP;
    return;
  }
  WatchCursor(e,1);
  XmTextGetSelectionPosition(e->text,&f,&l);
  if (f==l)
  {
    WatchCursor(e,0);
    EP;
    return;
  }
  str=XmTextGetSelection(e->text);
  for (x=0;x<l-f;x++)
  {
    if (str[x]!='\n')
      str[x]=toupper(str[x]);
  }
  XmTextReplace(e->text,f,l,str);
  XmTextSetSelection(e->text,f,l,0);
  XtFree(str);
  SetCurrentWidget(e->text);
  WatchCursor(e,0);
EP;
}

void LowsSelection(Widget w,Editor *e,void *cbs)
{
  XmTextPosition f,l,x;
  char *str;

SP("LowsSelection");
  if (e->read_only)
  {
    EP;
    return;
  }
  WatchCursor(e,1);
  XmTextGetSelectionPosition(e->text,&f,&l);
  if (f==l)
  {
    WatchCursor(e,0);
EP;
    return;
  }
  str=XmTextGetSelection(e->text);
  for (x=0;x<l-f;x++)
  {
    if (str[x]!='\n')
      str[x]=tolower(str[x]);
  }
  XmTextReplace(e->text,f,l,str);
  XmTextSetSelection(e->text,f,l,0);
  XtFree(str);
  SetCurrentWidget(e->text);
  WatchCursor(e,0);
EP;
}

int FindTextString(Editor *e,char *str,int start_over,int set_pos)
{
  static XmTextPosition pos=1,prev_pos=0,len=0;
  XmTextPosition f,l;
 
SP("FindTextString");
  XmTextGetSelectionPosition(e->text,&f,&l);
  if (f!=l && f && pos!=0)
    XmTextSetInsertionPosition(e->text,f+1); 
  if (XmTextFindString(e->text,XmTextGetInsertionPosition(e->text),str,XmTEXT_FORWARD,&pos))
  {
    prev_pos=pos;
    len=db_strlen(str);
    if (set_pos)
      XmTextShowPosition(e->text,pos);
    XmTextSetSelection(e->text,pos,pos+len,0);
    if (set_pos)
      XmTextSetInsertionPosition(e->text,pos+len);
EP;
    return 1;
  }
  else if (pos!=0 && start_over)
  {
    if (XmTextFindString(e->text,0,str,XmTEXT_FORWARD,&pos))
    {
      pos=0;
      if (set_pos)
        XmTextSetInsertionPosition(e->text,0);
EP;
      return FindTextString(e,str,1,set_pos);
    }
    else
    {
EP;    
      return 0;
    }
  }
EP;  
  return 0;
}

int FindReverseTextString(Editor *e,char *str,int start_over)
{
  static XmTextPosition pos=1,prev_pos=0,len=0;
  XmTextPosition f,l;
 
SP("FindReverseTextString");
  XmTextGetSelectionPosition(e->text,&f,&l);
  if (f!=l && f && pos!=XmTextGetLastPosition(e->text))
    XmTextSetInsertionPosition(e->text,f-1); 
  if (XmTextFindString(e->text,XmTextGetInsertionPosition(e->text),str,XmTEXT_BACKWARD,&pos))
  {
    prev_pos=pos;
    len=db_strlen(str);
    XmTextShowPosition(e->text,pos);
    XmTextSetSelection(e->text,pos,pos+len,0);
    if (pos)
      XmTextSetInsertionPosition(e->text,pos+len);
    else
      XmTextSetInsertionPosition(e->text,XmTextGetLastPosition(e->text));
EP;
    return 1;
  }
  else if (pos!=XmTextGetLastPosition(e->text) && start_over)
  {
    if (XmTextFindString(e->text,XmTextGetLastPosition(e->text),str,XmTEXT_BACKWARD,&pos))
    {
      pos=XmTextGetLastPosition(e->text);
      XmTextSetInsertionPosition(e->text,pos);
EP;
      return FindReverseTextString(e,str,1);
    }
    else
    {
EP;    
      return 0;
    }
  }
EP;
  return 0;
}

void ReplaceText(Editor *e,char *str)
{
  XmTextPosition f,l;
  
SP("ReplaceText");
  if (e->read_only)
  {
  EP;
    return;
  }
  XmTextGetSelectionPosition(e->text,&f,&l);
  XmTextReplace(e->text,f,l,str);
EP;
}

void CutText(Widget w,Editor *e,void *cbs)
{
SP("CutText");
  XmTextCut(e->text,0);
EP;
}

void CopyText(Widget w,Editor *e,void *cbs)
{
SP("CopyText");
  XmTextCopy(e->text,0);
EP;
}

void PasteText(Widget w,Editor *e,void *cbs)
{
SP("PasteText");
  if (e->read_only)
  {
    EP;
    return;
  }
  XmTextPaste(e->text);
EP;
}

void DeleteLine(Widget w,XAnyEvent *event,String *args,int *num_args)
{
  char *str;  
  XmTextPosition left,right;
  int len,selection=1;
  
SP("DeleteLine");
  XtVaGetValues(w,XmNvalue,&str,NULL);
  len=db_strlen(str);
  if (!XmTextGetSelectionPosition(w,&left,&right) || left==right)
  {
    left=right=XmTextGetInsertionPosition(w);
    selection=0;
  }
  while (left>0 && str[left-1]!='\0' && str[left-1]!='\n')
    left--;
  if ((right && str[right-1]!='\n') || right!=left)
    right--;
  while (right>=0 && right<len && str[right]!='\0' && str[right]!='\n')
    right++;
  if (right<len-1)
    right++;    
  else if (left)
    left--;
  if (left>=right)
  {
    XtFree(str);
EP;
    return;
  }
  XtFree(str);
  XmTextSetSelection(w,left,right,0);
  XmTextRemove(w);
EP;
}  

void NotFound(Editor *e,char *findstr)
{
  char str[200];
  XmString xstr;

SP("NotFound");
  if (db_strlen(findstr)>150)
    strcpy(str,"Search string not found!");
  else
    sprintf(str,"String '%s' not found!",findstr);
  xstr=XmStringCreateLocalized(str);
  if (e->fd==NULL)
  {
    e->fd=XmCreateWarningDialog(e->shell,"NotFound",NULL,0);
    XtUnmanageChild(XmMessageBoxGetChild(e->fd,XmDIALOG_CANCEL_BUTTON));
    XtUnmanageChild(XmMessageBoxGetChild(e->fd,XmDIALOG_HELP_BUTTON));
  }
  XtVaSetValues(e->fd,XmNmessageString,xstr,NULL);
  XmStringFree(xstr);
  XtManageChild(e->fd);
EP;
}

void FindDown(Widget w,Editor *e,void *cbs)
{
  char *str,*str2;

SP("FindDown");
  WatchCursor(e,1);
  XtVaGetValues(e->findf,XmNvalue,&str,NULL);
  if (str[0])
  {
    UpdateComboBox(e->findf,str);
    if (FindTextString(e,str,0,1)==0)
      NotFound(e,str);
  }
  else
  {
    str2=XmTextGetSelection(e->text);
    if (str2)
    {
      if (FindTextString(e,str2,0,1)==0)
        NotFound(e,str2);
      XtFree(str2);
    }
  }    
  XtFree(str);
  WatchCursor(e,0);
EP;
}

void FindUp(Widget w,Editor *e,void *cbs)
{
  char *str,*str2;
  int x;

SP("FindUp");
  WatchCursor(e,1);
  XtVaGetValues(e->findf,XmNvalue,&str,NULL);
  if (str[0])
  {
    for (x=0;x<editors;x++)
      UpdateComboBox(editor[0]->findf,str);
/*    UpdateFindList(str);*/
    if (FindReverseTextString(e,str,0)==0)
      NotFound(e,str);
  }
  else
  {
    str2=XmTextGetSelection(e->text);
    if (str2)
    {
      if (FindReverseTextString(e,str2,0)==0)
        NotFound(e,str2);
      XtFree(str2);
    }
  }    
  XtFree(str);
  WatchCursor(e,0);
EP;
}

void Replace(Widget w,Editor *e,void *cbs)
{
  char *findstr,*replstr;
  XmTextPosition f,l;
  int x;

SP("Replace");
  if (e->read_only)
  {
    EP;
    return;
  }
  WatchCursor(e,1);
  XtVaGetValues(e->findf,XmNvalue,&findstr,NULL);
  XtVaGetValues(e->replf,XmNvalue,&replstr,NULL);
  XmTextGetSelectionPosition(e->text,&f,&l);
  if (w)
  {
/*    UpdateReplList(replstr);
    UpdateFindList(findstr);*/
    for (x=0;x<editors;x++)
    {
      UpdateComboBox(editor[0]->findf,findstr);
      UpdateComboBox(editor[0]->replf,replstr);
    }
  }
  if (f!=l)
    ReplaceText(e,replstr);
  if (findstr[0])
    FindTextString(e,findstr,0,((int)cbs==-1)?0:1);
  XtFree(findstr);
  XtFree(replstr);
  WatchCursor(e,0);
EP;
}

void ReplaceAll(Widget w,Editor *e,void *cbs)
{
  char *findstr,*replstr;
  XmTextPosition f,l;
  int x;

SP("ReplaceAll");
  if (e->read_only)
  {
    EP;
    return;
  }
  WatchCursor(e,1);
  XtVaGetValues(e->findf,XmNvalue,&findstr,NULL);
  XtVaGetValues(e->replf,XmNvalue,&replstr,NULL);
  XmTextGetSelectionPosition(e->text,&f,&l);
  for (x=0;x<editors;x++)
  {
    UpdateComboBox(editor[0]->findf,findstr);
    UpdateComboBox(editor[0]->replf,replstr);
  }
/*  UpdateReplList(replstr);
  UpdateFindList(findstr);*/
  if (db_strcmp(findstr,replstr)!=0)
  {
    if (f==l)
    {
      FindTextString(e,findstr,0,0);
      XmTextGetSelectionPosition(e->text,&f,&l);
    }
    while (f!=l)
    {
      Replace(NULL,e,(void*)-1);
      XmTextGetSelectionPosition(e->text,&f,&l);
    }
  }
  XtFree(findstr);
  XtFree(replstr);
  WatchCursor(e,0);
EP;
}
jex-1.3.7/editors.c100644      0      0        4445  6672726717  12237 0ustar  rootroot#include "jex.h"
#include <Xm/List.h>
#include <Xm/MessageB.h>

Widget edd=NULL,edl;
extern Widget top;
extern Pixmap pixmap;

void CloseEditors(Widget w,void *e,void *cbs)
{
SP("CloseEditors");
/*  XtUnmanageChild(edd);*/
  XtPopdown(edd);
EP;
}

void GotoEditor(Widget w,void *data,XmListCallbackStruct *cbs)
{
  int pos_count;
  int *positions;
  
SP("GotoEditor");
  if (XmListGetSelectedPos(edl,&positions,&pos_count))
  {
    if (positions[0]<=editors)
      XMapRaised(XtDisplay(editor[positions[0]-1]->shell),XtWindow(editor[positions[0]-1]->shell));
    XtFree((char*)positions);
  }      
EP;
}

void CreateEditorDialog(void)
{
  Widget w;
  Arg arg[2];

SP("CreateEditorDialog");
  if (edd==NULL)
  {
    edd=XtVaAppCreateShell("EditorsDialog","EditorsDialog",topLevelShellWidgetClass,XtDisplay(top),
  	XmNallowShellResize,True,
    	XmNiconPixmap,pixmap,
  	NULL);
    w=XmCreateMessageBox(edd,"EditorsDialog",NULL,0);
    XtSetArg(arg[0],XmNlistSizePolicy,XmCONSTANT);
    edl=XmCreateScrolledList(w,"EditorList",arg,1);
    XtVaSetValues(XtParent(edl),
    	XmNscrollBarDisplayPolicy,XmSTATIC,
    	NULL);
    XtVaSetValues(edl,
    	XmNscrollBarDisplayPolicy,XmSTATIC,
    	XmNlistSizePolicy,XmCONSTANT,
    	NULL);
    XtAddCallback(edl,XmNdefaultActionCallback,(XtCallbackProc)GotoEditor,NULL);
/*    XtUnmanageChild(XmMessageBoxGetChild(w,XmDIALOG_HELP_BUTTON));*/
    XtAddCallback(w,XmNokCallback,(XtCallbackProc)CloseEditors,NULL);
    XtAddCallback(w,XmNcancelCallback,(XtCallbackProc)GotoEditor,NULL);
    XtAddCallback(w,XmNhelpCallback,(XtCallbackProc)Help,"Editors");
    XtManageChild(edl);
    XtManageChild(w);
  }
EP;
}

void UpdateEditorDialog(void)
{
  int x;
  XmString xstr;
  
SP("UpdateEditorDialog");
  if (edl)
  {
    XtUnmanageChild(edl);
    XmListDeleteAllItems(edl);
    for (x=0;x<editors;x++)
    {
      if (editor[x]->filename[0])
        xstr=XmStringCreateLocalized(editor[x]->filename);
      else
        xstr=XmStringCreateLocalized("<Untitled>");
      XmListAddItemUnselected(edl,xstr,0);
      XmStringFree(xstr);
    }
    XtManageChild(edl);
  }
EP;
}

void ShowEditorDialog(void)
{
SP("ShowEditorDialog");
  if (!edd)
  {
    CreateEditorDialog();
    UpdateEditorDialog();
  }
/*  XtManageChild(edd);*/
  XtPopup(edd,XtGrabNone);
  XMapRaised(XtDisplay(edd),XtWindow(edd));
EP;
}

jex-1.3.7/execute.c100644      0      0       45007  6672726717  12247 0ustar  rootroot#include <Xm/Xm.h>
#include <Xm/Text.h>
#include <Xm/TextF.h>
#include <Xm/DialogS.h>
#include <Xm/List.h>
#include <Xm/MessageB.h>
#include <Xm/Form.h>
#include <Xm/LabelG.h>
#include <Xm/PushBG.h>
#include <Xm/Separator.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/wait.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <unistd.h>
#include <fcntl.h>
#include "jex.h"

extern Widget top;
extern XtAppContext app;
extern Pixmap pixmap;

#define WORKTIMEOUT 150
#define WORKCOUNTS 20
/*char *workstr[]={"|","/","-","\\"};*/
char *workstr[]={
"/.........",
"./........",
"../.......",
".../......",
"..../.....",
"...../....",
"....../...",
"......./..",
"......../.",
"........./",
".........\\",
"........\\.",
".......\\..",
"......\\...",
".....\\....",
"....\\.....",
"...\\......",
"..\\.......",
".\\........",
"\\........."
};

void InputCallback1(Editor *e,int f,XtInputId l);
void InputCallback2(Editor *e,int f,XtInputId l);

void SetLabel(Editor *e,...)
{
  va_list app;
  char str[255],*tmp;
  XmString xstr;
  
SP("SetLabel");
  va_start(app,e);
  tmp=va_arg(app,char *);
  vsprintf(str,tmp,app);
  va_end(app);
  xstr=XmStringCreateLtoR(str,XmSTRING_DEFAULT_CHARSET);
  XtVaSetValues(e->iodtext,XmNlabelString,xstr,NULL);
  XmStringFree(xstr);
EP;
}

void wprintf(Widget window,...)
{
  va_list app;
  char str[512],*tmp;
  XmString xstr;

SP("wprintf");
  va_start(app,window);
/*  if (!XtIsManaged(XtParent(XtParent(XtParent(window)))))
    XtManageChild(XtParent(XtParent(XtParent(window))));*/
/*  XtPopup(XtParent(XtParent(XtParent(window))),XtGrabNone);*/
  tmp=va_arg(app,char *);
  vsprintf(str,tmp,app);
  va_end(app);
  xstr=XmStringCreateLtoR(str,XmSTRING_DEFAULT_CHARSET);
  XmListAddItemUnselected(window,xstr,0);
  XmListSetBottomPos(window,0);
  XmStringFree(xstr);
EP;
}

void SplitUp(char *str,char *list[])
{
SP("SplitUP");
  while (*str!=0)
  {
    while ((*str==' ') || (*str=='\t') || (*str=='\n'))
      *(str++)=0;
    *(list++)=str;
    while ((*str!=0) && (*str!=' ') && (*str!='\t') && (*str!='\n'))
      str++;
  }
  *list=0;
EP;
}

void RemoveInputs(Editor *e,void *tid)
{
SP("RemoveInputs");
  XtRemoveInput(e->t.id);  
  XtRemoveInput(e->t.id2);
  db_close(e->t.fd[0]); 
  db_close(e->t.fd[1]);
  db_close(e->t.fd2[0]);
  db_close(e->t.fd2[1]);
  db_close(e->t.fd3[0]);
  db_close(e->t.fd3[1]);
EP;
}  

void FreeClose(int sig,XtIntervalId tid)
{
  int status,pid=0,x,y;

SP("FreeClose");
  for (y=0;y<editors;y++)
  {
    if (editor[y]->t.pid)
    {
      if ((pid=waitpid(editor[y]->t.pid,&status,WNOHANG))==-1)
      {
        EP;
        return;
      }
      else
      {
        if (pid)
        {
          for (x=0;x<editors;x++)
          {
            if (editor[x]->t.pid==pid)
            {
              XtAppAddTimeOut(app,0,(XtTimerCallbackProc)RemoveInputs,editor[x]);
              if (sig)
              {
                InputCallback1(editor[x],0,0);
                InputCallback2(editor[x],0,0);
              }
              if (editor[x]->x)
              {
                editor[x]->buf[editor[x]->x]=0;
                wprintf(editor[x]->io_win,"%s",editor[x]->buf);
              }
              if (WIFEXITED(status)!=0) 
              {
                if (WEXITSTATUS(status)==0)
                  SetLabel(editor[x],"%s has finished normally.",editor[x]->t.name);
                else
                  SetLabel(editor[x],"%s has finished with error code %d.",
                      editor[x]->t.name,WEXITSTATUS(status));
              }
              else if (WIFSIGNALED(status)) 
                SetLabel(editor[x],"%s has finished abnormally!! (signal %d)",
                    editor[x]->t.name,WTERMSIG(status));
              else
                SetLabel(editor[x],"%s has finished abnormally for an unknown reason!!",
                      editor[x]->t.name);
              XtVaSetValues(editor[x]->compile,XmNsensitive,True,NULL);  
              XtVaSetValues(editor[x]->make,XmNsensitive,True,NULL);  
              XtVaSetValues(editor[x]->run,XmNsensitive,True,NULL);  
              XtVaSetValues(editor[x]->grep,XmNsensitive,True,NULL);  
      #ifndef LESSTIFF        
              XtVaSetValues(XtNameToWidget(editor[x]->mb,"*toolsmenu.button_0"),XmNsensitive,True,NULL);
              XtVaSetValues(XtNameToWidget(editor[x]->mb,"*toolsmenu.button_1"),XmNsensitive,True,NULL);
              XtVaSetValues(XtNameToWidget(editor[x]->mb,"*toolsmenu.button_2"),XmNsensitive,True,NULL);
              XtVaSetValues(XtNameToWidget(editor[x]->mb,"*toolsmenu.button_3"),XmNsensitive,True,NULL);
      #endif
              if (editor[x]->tid)
              {
                XtRemoveTimeOut(editor[x]->tid);
                editor[x]->tid=0;
              }
              editor[x]->t.pid=0;
            }
          }
        }
      }
    }
  }
EP;
}

void ChildSignal(int sig)
{
  SP("ChildSignal");
  XtAppAddTimeOut(app,0,(XtTimerCallbackProc)FreeClose,(void*)sig);
  EP;
}
  
void InputTimeout1(Editor *e,XtIntervalId tid)
{
  
SP("InputTimeout1");
  if (e->x)
  {
    if (e->same_line)
      XmListDeletePos(e->io_win,0);
    e->buf[e->x]=0;
    wprintf(e->io_win,e->buf);
    e->same_line=1;
  }
  e->tid7=0;
EP;
}

void InputCallback1(Editor *e,int f,XtInputId l)
{
  unsigned int bread;

SP("InputCallback1");
  if (e->tid7)
    XtRemoveTimeOut(e->tid7);
  e->tid7=XtAppAddTimeOut(app,250,(XtTimerCallbackProc)InputTimeout1,e);
  while ((bread=read(e->t.fd[0],&e->buf[e->x],1))==1)
  {
    if (e->x+1==BUFSIZE-1 || e->buf[e->x]=='\n')
    {
      if (e->buf[e->x]=='\n')
        e->buf[e->x]='\0'; /* Make sure string is 0-terminated. */
      else
        e->buf[e->x+1]='\0'; /* Make sure string is 0-terminated. */
      wprintf(e->io_win,"%s",e->buf);
      e->same_line=0;
      e->x=0;
    }
    else
    {
      e->x++;
    }
  }
  if (bread==-1 && l==0)
    FreeClose(0,0);
EP;
}

void InputCallback2(Editor *e,int f,XtInputId l)
{
  unsigned int bread;

SP("InputCallback2");
  if (e->tid7)
    XtRemoveTimeOut(e->tid7);
  e->tid7=XtAppAddTimeOut(app,250,(XtTimerCallbackProc)InputTimeout1,e);
  while ((bread=read(e->t.fd2[0],&e->buf[e->x],1))==1)
  {
    if (e->x+1==BUFSIZE-1 || e->buf[e->x]=='\n')
    {
      if (e->buf[e->x]=='\n')
        e->buf[e->x]='\0'; /* Make sure string is 0-terminated. */
      else
        e->buf[e->x+1]='\0'; /* Make sure string is 0-terminated. */
      wprintf(e->io_win,"%s",e->buf);
      e->x=0;
    }
    else
      e->x++;
  }
  if (bread==-1 && l==0)
    FreeClose(0,0);
EP;
}

void CloseCompile(Widget w,Editor *e,void *cbs)
{
SP("CloseCompile");
/*  XtUnmanageChild(e->iod);*/
  XtPopdown(e->iod);
  SetCurrentWidget(e->text);
EP;
}

void CheckChild(int pid,XtIntervalId tid)
{
  int status,result;

  SP("CheckChild");
  result=waitpid(pid,&status,WNOHANG);
  if (result>=0)
  {
    kill(pid,SIGKILL);
  }
  EP;
}

void StopCompile(Widget w,Editor *e,void *cbs)
{
SP("StopCompile");
  if (e->t.pid)
  {
    kill(e->t.pid,SIGQUIT);
    SetLabel(e,"Sent quit signal to program...");
    XtAppAddTimeOut(app,5000,(XtTimerCallbackProc)CheckChild,(void*)e->t.pid);
    if (e->tid)
    {
      XtRemoveTimeOut(e->tid);
      e->tid=0;
    }
  }
EP;
}

void SendInput(Widget w,Editor *e,void *cbs)
{
  char *tmpstr;
  
SP("SendInput");
  if (e->t.pid)
  {
    XtVaGetValues(e->owi,XmNvalue,&tmpstr,NULL);
    write(e->t.fd3[1],tmpstr,strlen(tmpstr));
    write(e->t.fd3[1],"\n",strlen("\n"));
    if (strlen(e->buf)+strlen(tmpstr)<BUFSIZE)
    {
      if (e->same_line)
        XmListDeletePos(e->io_win,0);
      strcat(e->buf,tmpstr);
      wprintf(e->io_win,"%s",e->buf);
      e->x=0;
      e->same_line=0;
    }
    XtFree(tmpstr);
    XmTextFieldSetString(e->owi,""); // Clear the textfield.
  }
EP;
}

void CreateOutputWindow(Editor *e)
{
  Widget w,w2,w3;
  Arg arg[9];
  Dimension height;

SP("CreateOutputWindow");
  if (!e->iod)
  {
/*    e->iod=XtVaCreateManagedWidget("IODialog",topLevelShellWidgetClass,top,
    	XmNallowShellResize,False,
    	XmNiconPixmap,pixmap,
    	NULL);*/
    e->iod=XtVaAppCreateShell("IODialog","IODialog",topLevelShellWidgetClass,XtDisplay(top),
  	XmNallowShellResize,False,
    	XmNiconPixmap,pixmap,
  	NULL);
    w2=XtVaCreateManagedWidget("IODialogForm",xmFormWidgetClass,e->iod,
    	NULL);
    e->iodtext=XtVaCreateManagedWidget("IODialogText",xmLabelGadgetClass,w2,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNbottomAttachment,XmATTACH_NONE,
	XmNalignment,XmALIGNMENT_CENTER,
    	NULL);
    	
    w3=XtVaCreateManagedWidget("IOButtons",xmFormWidgetClass,w2,    	
    	XmNtopAttachment,XmATTACH_NONE,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNbottomAttachment,XmATTACH_FORM,
    	XmNfractionBase,9,
    	XmNbottomOffset,10,
    	NULL);
    w=XtVaCreateManagedWidget("IO_OK",xmPushButtonGadgetClass,w3,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNleftAttachment,XmATTACH_POSITION,
    	XmNleftPosition,1,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,2,
    	XmNbottomAttachment,XmATTACH_FORM,
	NULL);    	
    XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)CloseCompile,e);
    w=XtVaCreateManagedWidget("IO_Stop",xmPushButtonGadgetClass,w3,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNleftAttachment,XmATTACH_POSITION,
    	XmNleftPosition,3,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,4,
    	XmNbottomAttachment,XmATTACH_FORM,
	NULL);    	
    XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)StopCompile,e);
    
    w=XtVaCreateManagedWidget("IO_Goto",xmPushButtonGadgetClass,w3,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNleftAttachment,XmATTACH_POSITION,
    	XmNleftPosition,5,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,6,
    	XmNbottomAttachment,XmATTACH_FORM,
	NULL);    	
    XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)GotoError,e);
    
    w=XtVaCreateManagedWidget("IO_Help",xmPushButtonGadgetClass,w3,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNleftAttachment,XmATTACH_POSITION,
    	XmNleftPosition,7,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,8,
    	XmNbottomAttachment,XmATTACH_FORM,
	NULL);    	
    XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)Help,"OutputWindow");
    
    w=XtVaCreateManagedWidget("IOSep",xmSeparatorWidgetClass,w2,
    	XmNtopAttachment,XmATTACH_NONE,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNbottomAttachment,XmATTACH_WIDGET,
    	XmNbottomWidget,w3,
    	XmNorientation,XmHORIZONTAL,
    	XmNbottomOffset,10,
    	NULL);

    w3=XtVaCreateManagedWidget("IOInputLabel",xmLabelGadgetClass,w2,
    	XmNtopAttachment,XmATTACH_NONE,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_NONE,
    	XmNbottomAttachment,XmATTACH_WIDGET,
    	XmNbottomWidget,w,
    	NULL);

    e->owi=XtVaCreateManagedWidget("IOInputField",xmTextFieldWidgetClass,w2,
    	XmNtopAttachment,XmATTACH_NONE,
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,w3,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNbottomAttachment,XmATTACH_WIDGET,
    	XmNbottomWidget,w,
    	NULL);
    XtAddCallback(e->owi,XmNactivateCallback,(XtCallbackProc)SendInput,e);
    XtVaGetValues(e->owi,XmNheight,&height,NULL);
    XtVaSetValues(w3,XmNheight,height,NULL);

    XtSetArg(arg[0],XmNtopAttachment,XmATTACH_WIDGET);
    XtSetArg(arg[1],XmNtopWidget,e->iodtext);
    XtSetArg(arg[2],XmNleftAttachment,XmATTACH_FORM);
    XtSetArg(arg[3],XmNrightAttachment,XmATTACH_FORM);
    XtSetArg(arg[4],XmNbottomAttachment,XmATTACH_WIDGET);
    XtSetArg(arg[5],XmNbottomWidget,e->owi);
    XtSetArg(arg[6],XmNlistSizePolicy,XmCONSTANT);
    XtSetArg(arg[7],XmNbottomOffset,10);
    XtSetArg(arg[8],XmNtopOffset,10);
    e->io_win=XmCreateScrolledList(w2,"IOList",arg,9);
    XtVaSetValues(e->io_win,
    	XmNscrollBarDisplayPolicy,XmSTATIC,
    	XmNlistSizePolicy,XmCONSTANT,
    	NULL);
    XtAddCallback(e->io_win,XmNdefaultActionCallback,(XtCallbackProc)GotoError,(void*)e);

    XtManageChild(e->io_win);
  }
EP;
}

void SetWorkingLabel(Editor *e,void *t)
{
SP("SetWorkingLabel");
  e->workcount=(e->workcount+1)%WORKCOUNTS;
  SetLabel(e,workstr[e->workcount]);
  e->tid=XtAppAddTimeOut(app,WORKTIMEOUT,(XtTimerCallbackProc)SetWorkingLabel,e);
EP;
}

void ExecProg(Editor *e,char *_prog)
{
  static char *command[20];
  char *prog;
  int pid;

SP("ExecProg");
  WatchCursor(e,1);
  XtVaSetValues(e->compile,XmNsensitive,False,NULL);  
  XtVaSetValues(e->make,XmNsensitive,False,NULL); 
  XtVaSetValues(e->run,XmNsensitive,False,NULL); 
  XtVaSetValues(e->grep,XmNsensitive,False,NULL);
#ifndef LESSTIFF    
  XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_0"),XmNsensitive,False,NULL);
  XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_1"),XmNsensitive,False,NULL);
  XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_2"),XmNsensitive,False,NULL);
  XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_3"),XmNsensitive,False,NULL);
#endif
  CreateOutputWindow(e); 
/* XtManageChild(e->iod);*/
  XtPopup(e->iod,XtGrabNone);
  XMapRaised(XtDisplay(e->iod),XtWindow(e->iod));
  XmListDeleteAllItems(e->io_win);
  e->x=0;
  WatchCursor(e,0);
  
  if (db_pipe(e->t.fd)!=0)
  {
    SetLabel(e,"Too many open files!");
    XtVaSetValues(e->compile,XmNsensitive,True,NULL);  
    XtVaSetValues(e->make,XmNsensitive,True,NULL);  
    XtVaSetValues(e->run,XmNsensitive,True,NULL);  
    XtVaSetValues(e->grep,XmNsensitive,True,NULL);  
#ifndef LESSTIFF    
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_0"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_1"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_2"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_3"),XmNsensitive,True,NULL);
#endif
EP;
    return;
  }
  if (db_pipe(e->t.fd2)!=0)
  {
    SetLabel(e,"Too many open files!");
    db_close(e->t.fd[0]);
    db_close(e->t.fd[1]);
    XtVaSetValues(e->compile,XmNsensitive,True,NULL);
    XtVaSetValues(e->make,XmNsensitive,True,NULL);
    XtVaSetValues(e->run,XmNsensitive,True,NULL);
    XtVaSetValues(e->grep,XmNsensitive,True,NULL);  
#ifndef LESSTIFF    
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_0"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_1"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_2"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_3"),XmNsensitive,True,NULL);
#endif
EP;
    return;
  }
  if (db_pipe(e->t.fd3)!=0)
  {
    SetLabel(e,"Too many open files!");
    db_close(e->t.fd[0]);
    db_close(e->t.fd[1]);
    db_close(e->t.fd2[0]);
    db_close(e->t.fd2[1]);
    XtVaSetValues(e->compile,XmNsensitive,True,NULL);
    XtVaSetValues(e->make,XmNsensitive,True,NULL);
    XtVaSetValues(e->run,XmNsensitive,True,NULL);
    XtVaSetValues(e->grep,XmNsensitive,True,NULL);  
#ifndef LESSTIFF    
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_0"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_1"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_2"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_3"),XmNsensitive,True,NULL);
#endif
EP;
    return;
  }

  prog=(char*)db_malloc(db_strlen(_prog)*2); 
  db_strcpy(prog,_prog);			 
  SetLabel(e,"%s",prog);
  e->tid=XtAppAddTimeOut(app,500,(XtTimerCallbackProc)SetWorkingLabel,(void*)e);
  e->same_line=0;

  fcntl(e->t.fd[0],F_SETFL,O_NONBLOCK);
  fcntl(e->t.fd2[0],F_SETFL,O_NONBLOCK);

  e->t.id=XtAppAddInput(app,e->t.fd[0],(XtPointer)XtInputReadMask,(XtInputCallbackProc)InputCallback1,(XtPointer)e);
  e->t.id2=XtAppAddInput(app,e->t.fd2[0],(XtPointer)XtInputReadMask,(XtInputCallbackProc)InputCallback2,(XtPointer)e);

  SplitUp(prog,command);
  db_strncpy(e->t.name,command[0],99);
  signal(SIGCHLD,ChildSignal);

  if ((pid=fork())>=0)
  {
    if (pid>0)
    {
      e->t.pid=pid;
      db_free(prog);
      e->grepped=0;
    }
    if (pid==0)
    {
      db_dup2(e->t.fd3[0],0);
      db_dup2(e->t.fd[1],1);
      db_dup2(e->t.fd2[1],2);
      if (execvp(command[0],command)==-1)
        exit(-1);
      exit(0);
    }
  }
  else
  {
    SetLabel(e,"fork() failed!");
    XtVaSetValues(e->compile,XmNsensitive,True,NULL);  
    XtVaSetValues(e->make,XmNsensitive,True,NULL);  
    XtVaSetValues(e->run,XmNsensitive,True,NULL);  
    XtVaSetValues(e->grep,XmNsensitive,True,NULL);  
#ifndef LESSTIFF    
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_0"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_1"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_2"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_3"),XmNsensitive,True,NULL);
#endif
EP;
    return;
  }
EP;
}

void CompileOK(Editor *e)
{
  char str[255];
  
SP("CompileOK");
  sprintf(str,e->compile_command,e->filename);
  ExecProg(e,str);
EP;
}

void Compile(Widget w,Editor *e,void *cbs)
{
  int x;
  
SP("Compile");
  for (x=0;x<editors;x++)
  {
    if (!editor[x]->saved  && editor[x]->filename[0])
      Save(NULL,editor[x],NULL);
  }
  if (e->saved && e->filename[0])
    CompileOK(e);
  else
    Save(NULL,e,(void*)CompileOK);
EP;
}

void MakeOK(Editor *e)
{
SP("MakeOK");
  ExecProg(e,e->make_command);
EP;
}

void Make(Widget w,Editor *e,void *cbs)
{
  int x;
  
SP("Make");
  for (x=0;x<editors;x++)
  {
    if (!editor[x]->saved  && editor[x]->filename[0])
      Save(NULL,editor[x],NULL);
  }
  if (e->saved && e->filename[0])
    MakeOK(e);
  else
    Save(NULL,e,(void*)MakeOK);
EP;
}

void LatestVersion(void)
{
  char *cmd[3];
  char browser[256];
  
  if (!FindHelpFile("netscape",browser))
  {
    if (!FindHelpFile("Mosaic",browser))
    {
      if (!FindHelpFile("arena",browser))
      {
	HelpError("You can find the latest version at http://www.club.innet.be/~year1939/applications.html");
	return;
      }
    }
  }
  if (!fork())
  {
    cmd[0]=strdup(browser);
    cmd[1]=strdup("http://www.club.innet.be/~year1939/applications.html");
    cmd[2]=NULL;
    if (execvp(cmd[0],cmd)==-1)
      exit(-1);
    exit(0);
  }
}

void RunOK(Editor *e)
{
  char runstr[1000];
  
SP("Run");
  sprintf(runstr,e->run_command,e->filename);
  ExecProg(e,runstr);
EP;
}

void Run(Widget w,Editor *e,void *cbs)
{
SP("Run");
  if (!e->run_command[0])
    ShowError(e,"You must specify in the settings which program to run!");
  else
  {
    if (e->saved && e->filename[0])
      RunOK(e);
    else
      Save(NULL,e,(void*)RunOK);
  }
EP;
}
jex-1.3.7/filemenu.c100644      0      0       15372  6672726717  12413 0ustar  rootroot#include <stdio.h>
#include <Xm/Xm.h>
#include <Xm/RowColumn.h>
#include "jex.h"

extern char fl_files[FILELIST][255];

void Quit(Widget w,Editor *e,void *cbs)
{
SP("Quit");
  if (e->saved)
    Exit(e);
  else
    AskToSave(e,(void*)Exit);
EP;
}  

void DoNew(Widget *w,Editor *e,void *cbs)
{  
  SP("DoNew");
  if (e->saved)
    New(e);
  else
    AskToSave(e,(void*)New);
  EP;
}

void DoOpen(Widget *w,Editor *e,void *cbs)
{  
  SP("DoOpen");
  if (e->saved)
    Load(e);
  else
    AskToSave(e,(void*)Load);
  EP;
}

void DoNewWindow(Widget *w,void *e,void *cbs)
{  
  SP("DoNewWindow");
  CreateNewEditor();
  EP;
}

void DoClone(Widget *w,Editor *e,void *cbs)
{  
  SP("DoClone");
  CreateNewEditor();
  if (e->filename[0])
  {
    if (loadfile(editor[editors-1],e->filename,0,1))
      LoadError(editor[editors-1]);
  }
  EP;
}

void file_cb(Widget w,int item,void *cbs)
{
  int x;

SP("file_cb");
  for (x=0;x<editors;x++)
  {
    if (editor[x]->mb==XtParent(XtParent(XtParent(w))))
    {
      switch (item)
      {
        case 0: /* New window */
	    CreateNewEditor();
            break;
        case 1: /* New window */
	    CreateNewEditor();
	    if (editor[x]->filename[0])
	    {
              if (loadfile(editor[editors-1],editor[x]->filename,0,1))
                LoadError(editor[editors-1]);
            }
            break;
        case 2: /* New */
            if (editor[x]->saved)
     	      New(editor[x]);
            else
              AskToSave(editor[x],(void*)New);
            break;
        case 3: /* Load */
            if (editor[x]->saved)
     	      Load(editor[x]);
            else
              AskToSave(editor[x],(void*)Load);
            break;
        case 4: 
            Save(NULL,editor[x],NULL);
            break;
        case 5: 
            editor[x]->func2=NULL;
            SaveAs(editor[x]);
            break;
        case 6: 
            Reload(editor[x]);
            break;
        case 7: 
            Revert(editor[x]);
            break;
        case 8: 
            Insert(editor[x]);
            break;
        case 9: 
            Print(editor[x]);
            break;
        case 10: 
            Quit(NULL,editor[x],NULL);
            break;
      }
    }
  }
EP;
}

void edit_cb(Widget w,int item,void *cbs)
{
  int x;
  
SP("edit_cb");
  for (x=0;x<editors;x++)
  {
    if (editor[x]->mb==XtParent(XtParent(XtParent(w))))
    {
      switch (item)
      {
        case 0:
            UndoAction(NULL,editor[x],NULL);
            break;
        case 1:
            RedoAction(NULL,editor[x],NULL);
            break;
        case 2:
            RepeatAction(NULL,editor[x],NULL);
            break;
        case 3:
            CopyText(NULL,editor[x],NULL);
            break;
        case 4:
            CutText(NULL,editor[x],NULL);
            break;
        case 5:
            PasteText(NULL,editor[x],NULL);
            break;
        case 6:
            ClearSelection(NULL,editor[x],NULL);
            break;
        case 7:
            CapsSelection(NULL,editor[x],NULL);
            break;
        case 8:
            LowsSelection(NULL,editor[x],NULL);
            break;
        case 9:
            ShiftLeft(NULL,editor[x],NULL);
            break;
        case 10:
            ShiftRight(NULL,editor[x],NULL);
            break;
        case 11:
            FindMatchingChar(NULL,editor[x],NULL);
            break;
        case 12:
            SetMarker(NULL,editor[x],NULL);
            break;
        case 13:
            GotoMarker(NULL,editor[x],NULL);
            break;
      }
    }
  }
EP;
}

void PopupMenu(Widget w,XButtonPressedEvent *event,String *args,int *num_args)
{
  int x;
  
SP("PopupMenu");
  while (!XtIsShell(w))
    w=XtParent(w);
  for (x=0;x<editors;x++)
  {
    if (editor[x]->shell==w)
    {
      XmMenuPosition(editor[x]->pm,event);
      XtManageChild(editor[x]->pm);
    }
  }
EP;
}

void popup_cb(Widget w,int item,XmAnyCallbackStruct *cbs)
{
  int x;
  
SP("popup_cb");
  for (x=0;x<editors;x++)
  {
    if (editor[x]->pm==XtParent(w))
    {
      switch ((int)item)
      {
        case 0:
            CopyText(NULL,editor[x],NULL);
            break;
        case 1:
            CutText(NULL,editor[x],NULL);
            break;
        case 2:
            PasteText(NULL,editor[x],NULL);
            break;
        case 3:
            ClearSelection(NULL,editor[x],NULL);
            break;
        case 4:
            UndoAction(NULL,editor[x],NULL);
            break;
        case 5:
            RedoAction(NULL,editor[x],NULL);
            break;
        case 6:
            GotoLine(NULL,editor[x],NULL);
            break;
      }
    }
  }
EP;
}


void option_cb(Widget w,int item,void *cbs)
{
  int x;
  Boolean set;
  
SP("option_cb");
  for (x=0;x<editors;x++)
  {
    if (editor[x]->mb==XtParent(XtParent(XtParent(w))))
    {
      switch (item)
      {
        case 0: Settings(editor[x]);break;
        case 1: XtVaGetValues(w,XmNset,&set,NULL);
        	XtVaSetValues(editor[x]->text,XmNeditable,set?False:True,NULL);
        	editor[x]->read_only=set?1:0;
        	break;
        case 3: Compile(NULL,editor[x],NULL);break;
        case 4: Make(NULL,editor[x],NULL);break;
        case 5: Grep(NULL,editor[x],NULL);break;
      }
    }
  }
EP;
}

void bookmark_cb(Widget w,int item,void *cbs)
{
  int x;
  
SP("bookmark_cb");
  for (x=0;x<editors;x++)
  {
    if (editor[x]->mb==XtParent(XtParent(XtParent(w))))
    {
      switch (item)
      {
        case 0: AddBookmark(editor[x]->filename);break;
        case 1: ShowBookmarkDialog();break;
      }
    }
  }
EP;
}

void tools_cb(Widget w,int item,void *cbs)
{
  int x;
  
SP("tools_cb");
  for (x=0;x<editors;x++)
  {
    if (editor[x]->mb==XtParent(XtParent(XtParent(w))))
    {
      switch (item)
      {
        case 0: Compile(NULL,editor[x],NULL);break;
        case 1: Make(NULL,editor[x],NULL);break;
        case 2: Run(NULL,editor[x],NULL);break;
        case 3: Grep(NULL,editor[x],NULL);break;
      }
    }
  }
EP;
}

void view_cb(Widget w,int item,void *cbs)
{
  int x;
  
SP("view_cb");
  for (x=0;x<editors;x++)
  {
    if (editor[x]->mb==XtParent(XtParent(XtParent(w))))
    {
      switch (item)
      {
        case 0: ShowEditorDialog();break;
        case 1: CreateOutputWindow(editor[x]);
        	/*XtManageChild(editor[x]->iod);*/
        	XtPopup(editor[x]->iod,XtGrabNone);
        	XMapRaised(XtDisplay(editor[x]->iod),XtWindow(editor[x]->iod));
        	break;
        case 2: ShowStats(editor[x]);break;
      }
    }
  }
EP;
}

void help_cb(Widget w,int item,void *cbs)
{
  int x;
  
SP("help_cb");
  for (x=0;x<editors;x++)
  {
    if (editor[x]->mb==XtParent(XtParent(XtParent(w))))
    {
      switch (item)
      {
        case 0: Help(NULL,"Contents",NULL);break;
        case 1: LatestVersion();break;
        case 2: ShowAboutDialog(editor[x]);break;
      }
    }
  }
EP;
}

jex-1.3.7/files.c100644      0      0       13174  6672726717  11707 0ustar  rootroot#include <Xm/Xm.h>
#include <Xm/FileSB.h>
#include <Xm/Text.h>
#include <Xm/TextStrSoP.h>
#include <Xm/MessageB.h>
#include "jex.h"

extern Widget top;

void CheckSaveAsOK(Widget w,Editor *e,Widget fw);

void SetTitle(Editor *e,char *str)
{
  char title[255],directory[255],file[255];

SP("SetTitle");
  if (str && *str)
  {
    sprintf(title,"jex: %s",str);
    SplitPath(str,directory,file);
    XtVaSetValues(e->shell,XmNiconName,file,NULL);
  }
  else
  {
    db_strcpy(title,"jex");
    XtVaSetValues(e->shell,XmNiconName,"jex",NULL);
  }
  XtVaSetValues(e->shell,XmNtitle,title,NULL);
  UpdateEditorDialog();
EP;
}

void SaveOK(Editor *e)
{
  int stat;
  char *str;

SP("SaveOK");
  if (e->read_only)
  {
    EP;
    return;
  }
  XtVaGetValues(e->text,XmNvalue,&str,NULL);
  stat=savefile(e,e->filename,str);
  XtFree(str);
  if (!stat)
    SaveError(e);
  else
  {
    e->saved=1;
    e->changes=0;
/*    XtUnmanageChild(e->save);*/
    SetSave(e,False);
    if (e->func2!=NULL)
      Function((void(*)(void))e->func2,e);
  }
EP;
}

void SaveAsOK(Widget w,Editor *e,Widget fw)
{
  char *file;
  int x;

SP("SaveAsOK");
  if (e->read_only)
  {
    EP;
    return;
  }
  XtVaGetValues(fw,XmNvalue,&file,NULL);
  db_strcpy(e->filename,file);
  GetFullFileName(e->filename);
  SetTitle(e,e->filename);
  SaveOK(e);
  if (strcmp(e->filename,file))
  {
    if (e->oldsource)
    {
printf("1\n");
       DetachEditor(e,file);
    }
    else
    {
printf("2\n");
      for (x=0;x<editors;x++)
      {
        if (editor[x]!=e && db_strcmp(editor[x]->filename,file)==0)
        {
printf("3\n");
          XmTextSetSource(e->tmpsource,XmTextGetSource(e->text),0,0);
          XmTextSetSource(e->text,XmTextGetSource(editor[x]->text),0,0);
          e->oldsource=1;
          editor[x]->oldsource=1;
          break;
        }
      }
    }
  }
  XtFree(file);
EP;
}

void NoOverwrite(Widget w,Editor *e,void *cbs)
{
SP("NoOverwrite");
  CreateFileSelectionDialog(e,"Save As",(void*)CheckSaveAsOK,e->func2);
EP;
}  

void CancelAskToOverwrite(Widget w,Editor *e,void *cbs)
{
SP("CancelAskToOverwrite");
  XtUnmanageChild(e->ato);
  SetCurrentWidget(e->text);
EP;
}

void AskToOverwriteOK(Widget w,Editor *e,void *cbs)
{
SP("AskToOverwriteOK");
  SaveAsOK(w,e,e->f);
  SetCurrentWidget(e->text);
EP;
}

void CheckSaveAsOK(Widget w,Editor *e,Widget fw)
{
  char *file;
  struct stat st;

SP("CheckSaveAsOK");
  if (e->read_only)
  {
    EP;
    return;
  }
  XtVaGetValues(fw,XmNvalue,&file,NULL);
  if (db_stat(file,&st)==-1)
    SaveAsOK(w,e,fw);
  else
  {
    if (e->ato==NULL)
    {
      e->ato=XmCreateQuestionDialog(e->shell,"AskToOverwrite",NULL,0);
      e->f=fw;
      XtAddCallback(e->ato,XmNokCallback,(XtCallbackProc)AskToOverwriteOK,e);
      XtAddCallback(e->ato,XmNcancelCallback,(XtCallbackProc)NoOverwrite,e);
      XtAddCallback(e->ato,XmNhelpCallback,(XtCallbackProc)CancelAskToOverwrite,e);
    }
    else
    {
      XtRemoveAllCallbacks(e->ato,XmNokCallback);
      XtRemoveAllCallbacks(e->ato,XmNcancelCallback);
      XtRemoveAllCallbacks(e->ato,XmNhelpCallback);
      e->f=fw;
      XtAddCallback(e->ato,XmNokCallback,(XtCallbackProc)AskToOverwriteOK,e);
      XtAddCallback(e->ato,XmNcancelCallback,(XtCallbackProc)NoOverwrite,e);
      XtAddCallback(e->ato,XmNhelpCallback,(XtCallbackProc)CancelAskToOverwrite,e);
    }
    XtManageChild(e->ato);
  }      
}

void SaveAs(Editor *e)
{
SP("SaveAs");
  if (e->read_only)
  {
    EP;
    return;
  }
  CreateFileSelectionDialog(e,"Save As",(void*)CheckSaveAsOK,e->func2);
EP;
}    

void Save(Widget w,Editor *e,void *cbs)
{
SP("Save");
  if (e->read_only)
  {
    EP;
    return;
  }
  if (w)
    e->func2=NULL;
  else
    e->func2=cbs;
  if (e->filename[0])
    SaveOK(e);
  else
    SaveAs(e);
EP;
}

void ValueChanged(Widget w,Editor *e,void *cbs)
{
SP("ValueChanged");
/*  XtManageChild(e->save);*/
  SetSave(e,True);
  e->saved=0;
EP;
}

void New(Editor *e)
{
SP("New");
  UnlinkFile(e);
  DetachEditor(e,NULL);
  XtVaSetValues(e->text,XmNvalue,"",NULL);
  e->saved=1;
  SetTitle(e,"");
  e->filename[0]=0;
/*  XtUnmanageChild(e->save);*/
  SetSave(e,False);
  NoUndo(e);
EP;
}

void LoadOK(Widget w,Editor *e,Widget fw)
{
  char *file;

SP("LoadOK");
  XtVaGetValues(fw,XmNvalue,&file,NULL);
  if (loadfile(e,file,0,1))
    LoadError(e);
  else
  {
 /*   db_strcpy(e->filename,file);*/
    XtFree(file);
/*    SetTitle(e,e->filename);*/
  }
EP;
}

void Load(Editor *e)
{
SP("Load");
  CreateFileSelectionDialog(e,"Load",(void*)LoadOK,NULL);
EP;
}

void Revert(Editor *e)
{
  char tmpstr[255];
  int result;
  FILE *f;

SP("Revert");
  if (e->read_only)
  {
    EP;
    return;
  }
  if (e->filename[0])
  {
    if (e->saved)
    {
      sprintf(tmpstr,"%s~",e->filename);
      if ((f=fopen(tmpstr,"r"))!=NULL)
      {
        fclose(f);
        CopyFile(tmpstr,e->filename);
        result=loadfile(e,tmpstr,0,0);
        CopyFile(e->filename,tmpstr);
      }
      else
      {
        EP;
        return;
      }
    }
    else
      result=loadfile(e,e->filename,0,0);
    if (result!=0)
      LoadError(e);
    else
      SetTitle(e,e->filename);
  }
EP;
}

void PrintOK(Editor *e)
{
SP("PrintOK");
  printfile(e,e->filename);
EP;
}

void Print(Editor *e)
{
SP("Print");
  if (!e->saved)
  {
    e->f=(void*)PrintOK;
    Save(NULL,(void*)e,NULL);
  }
  else
    PrintOK(e);
EP;
}

void InsertOK(Widget w,Editor *e,Widget fw)
{
  char *file;

SP("InsertOK");
  if (e->read_only)
  {
    EP;
    return;
  }
  XtVaGetValues(fw,XmNvalue,&file,NULL);
  if (loadfile(e,file,1,0))
    LoadError(e);
  XtFree(file);
EP;
}

void Insert(Editor *e)
{
SP("Insert");
  if (e->read_only)
  {
    EP;
    return;
  }
  CreateFileSelectionDialog(e,"Insert",(void*)InsertOK,NULL);
EP;
}

jex-1.3.7/filesb.c100644      0      0       27565  6672726717  12062 0ustar  rootroot#include <stdio.h>
#include <string.h>
#include <Xm/MessageB.h>
#include <Xm/LabelG.h>
#include <Xm/Form.h>
#include <Xm/List.h>
#include <Xm/TextF.h>
#include <Xm/RowColumn.h>
#include <Xm/SeparatoG.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include "match.h"
#include "jex.h"

extern Widget top,combo1,combo2,combo3;

void AddItem(Widget list,char *newtext)
{
  char *text;
  XmString str,*strlist;
  int u_bound,l_bound=0,i;
  
SP("AddItem");
  XtVaGetValues(list,XmNitemCount,&u_bound,
  	XmNitems,&strlist,
 	NULL);
  u_bound--;
  while (u_bound>=l_bound)
  {
    i=l_bound+(u_bound-l_bound)/2;
    if (!XmStringGetLtoR(strlist[i],XmSTRING_DEFAULT_CHARSET,&text))
      break;
    if (db_strcmp(text,newtext)>0)
      u_bound=i-1;
    else
      l_bound=i+1;
    XtFree(text);
  }
  str=XmStringCreateLocalized(newtext);
  XmListAddItemUnselected(list,str,l_bound+1);
  XmStringFree(str);
EP;
}

void SplitPath(char *orig_path,char *directory,char *filter)
{
  char *tmp;
  char path[255];
  
SP("SplitPath");
  db_strcpy(path,orig_path);
  tmp=db_strrchr(path,'/');
  if (tmp)
  {
    *tmp=0;
    db_strcpy(directory,path);
    if (!directory[0])
      db_strcpy(directory,"/");
    db_strcpy(filter,tmp+1);
    if (!filter[0])
      db_strcpy(filter,"*");
  }
  else
  {
    db_strcpy(directory,".");
    db_strcpy(filter,path);
    if (!filter[0])
      db_strcpy(filter,"*");
  }
EP;
}

void GetDirectory(Editor *e,char *directory,char *filter)
{
  DIR *dp;
  struct dirent *dir;
  struct stat sbuf;
  char file[255];
  
SP("GetDirectory");
  XmListDeleteAllItems(e->filefield);
  XmListDeleteAllItems(e->dir_field);
  if ((dp=db_opendir(directory))==NULL)
  {
/*    fprintf(stderr,"Can't open directory %s\n",path);*/
EP;
    return;
  }
  XtUnmanageChild(e->filefield);
  XtUnmanageChild(e->dir_field);
  while ((dir=db_readdir(dp))!=NULL)
  {
    if (dir->d_ino==0)
      continue;
    if (directory[db_strlen(directory)-1]!='/')
      sprintf(file,"%s/%s",directory,dir->d_name);
    else
      sprintf(file,"%s%s",directory,dir->d_name);
    if (db_stat(file,&sbuf)<0)
    {
      if (db_lstat(file,&sbuf)<0)
      {
        continue;
      }
    }
    if ((sbuf.st_mode&S_IFMT)==S_IFDIR)
    {
      AddItem(e->dir_field,file);
      continue;
    }
    if (match(filter,dir->d_name))
    {
      AddItem(e->filefield,dir->d_name);
    }
  }
  db_closedir(dp);
  XtManageChild(e->filefield);
  XtManageChild(e->dir_field);
EP;
}

void SelectDir(Widget w,Editor *e,XmListCallbackStruct *cbs)
{
  char *newdir,*curdir,directory[255],*filter,newpath[255],prevdir[255],tmp[255];
  char olddir[255],newdirectory[255];
  XmString size;
  
SP("SelectDir");
  WatchCursor(e,1);
  XmStringGetLtoR(cbs->item,XmSTRING_DEFAULT_CHARSET,&newdir);
  XtVaGetValues(e->dirfilter_field,XmNvalue,&curdir,NULL);
  XtVaGetValues(e->filter_field,XmNvalue,&filter,NULL);
  SplitPath(newdir,olddir,newdirectory);
  if (db_strcmp(newdirectory,".")==0)
  {
    if (olddir[db_strlen(prevdir)-1]!='/')
      sprintf(newpath,"%s/%s",olddir,filter);
    else
      sprintf(newpath,"%s%s",olddir,filter);
  }
  else if (db_strcmp(newdirectory,"..")==0)
  {
    SplitPath(curdir,prevdir,tmp);
    if (prevdir[db_strlen(prevdir)-1]!='/')
      sprintf(newpath,"%s/%s",prevdir,filter);
    else
      sprintf(newpath,"%s%s",prevdir,filter);
  }
  else
  {
    if (newdir[db_strlen(newdir)-1]!='/')
      sprintf(newpath,"%s/%s",newdir,filter);
    else
      sprintf(newpath,"%s%s",newdir,filter);
  } 
  SplitPath(newpath,directory,filter);
  XtVaSetValues(e->dirfilter_field,XmNvalue,directory,NULL);
  XtVaSetValues(e->sel_field,XmNvalue,directory,NULL);
  size=XmStringCreateLocalized("0 bytes");
  XtVaSetValues(e->fssize,XmNlabelString,size,NULL);
  GetDirectory(e,directory,filter);
  XmStringFree(size);
  XtFree(curdir);
  XtFree(filter);
  XtFree(newdir);
  WatchCursor(e,0);
EP;
}
 
void BrowseSelect(Widget w,Editor *e,XmListCallbackStruct *cbs)
{
  char *newfile,*curdir,filter[255];
  struct stat st;
  XmString size;
  
SP("BrowseSelect");
  XmStringGetLtoR(cbs->item,XmSTRING_DEFAULT_CHARSET,&newfile);
  XtVaGetValues(e->dirfilter_field,XmNvalue,&curdir,NULL);
  if (curdir[db_strlen(curdir)-1]!='/')
    sprintf(filter,"%s/%s",curdir,newfile);
  else
    sprintf(filter,"%s%s",curdir,newfile);
  XtVaSetValues(e->sel_field,XmNvalue,filter,NULL);
  db_stat(filter,&st);
  if (st.st_size>1024*1024)
    sprintf(filter,"%.1f Mb",(double)st.st_size/(1024.0*1024.0));
  else if (st.st_size>1024)
    sprintf(filter,"%.1f Kb",(double)st.st_size/1024.0);
  else
    sprintf(filter,"%lu bytes",(unsigned long)st.st_size);
  size=XmStringCreateLocalized(filter);
  XtVaSetValues(e->fssize,XmNlabelString,size,NULL);
  XmStringFree(size);
  XtFree(newfile);
  XtFree(curdir);
EP;
}

void CallFunction(void (*f)(),Editor *e)
{
SP("CallFunction");
  f(e->fs,e,e->sel_field);
EP;
}

void FSOKCallback(Widget w,Editor *e,void *cbs)
{
  char *str;
  int x;
  
SP("FSOKCallback");
  XtVaGetValues(e->sel_field,XmNvalue,&str,NULL);
  UpdateComboBox(combo3,str);
  for (x=0;x<editors;x++)
  {
    if (editor[x]->fs)
      UpdateComboBox(editor[x]->sel_field,str);
  }
  XtFree(str);
  XtUnmanageChild(e->fs);
  if (e->func!=NULL)
    CallFunction((void(*)(void))e->func,e);
EP;
}
 
void FSCancelCallback(Widget w,Editor *e,void *cbs)
{
SP("FSCancelCallback");
  XtUnmanageChild(e->fs);
EP;
}
 
void FSFilterCallback(Widget w,Editor *e,void *cbs)
{
  char *filter,*dir;
  XmString size;
  int x;
  
SP("FSFilterCallback");
  XtVaGetValues(e->filter_field,XmNvalue,&filter,NULL);
  XtVaGetValues(e->dirfilter_field,XmNvalue,&dir,NULL);
  UpdateComboBox(combo1,filter);
  UpdateComboBox(combo2,dir);
  for (x=0;x<editors;x++)
  { 
    UpdateComboBox(editor[x]->filter_field,filter);
    UpdateComboBox(editor[x]->dirfilter_field,dir);
  }
  GetDirectory(e,dir,filter);
  size=XmStringCreateLocalized("0 bytes");
  XtVaSetValues(e->fssize,XmNlabelString,size,NULL);
  XmStringFree(size);
  XtFree(dir);
  XtFree(filter);
EP;
}
 
void CreateFileSelectionDialog(Editor *e,char *title,void *f,void *f2)
{
  XmString xstr;
  Arg arg[10];
  char path[255];
  Widget w,rc,l;
  int n;
  
SP("CreateFileSelectionDialog");
  e->func=f;
  e->func2=f2;
  WatchCursor(e,1);
  if (e->fs==NULL)
  {
    XtSetArg(arg[0],XmNautoUnmanage,False);
    XtSetArg(arg[1],XmNdefaultButtonType,NULL);
    e->fs=XmCreateMessageDialog(e->shell,"FileSelection",arg,2);
    XtAddCallback(e->fs,XmNokCallback,(XtCallbackProc)FSOKCallback,(void*)e);
    XtAddCallback(e->fs,XmNcancelCallback,(XtCallbackProc)FSCancelCallback,(void*)e);
    XtAddCallback(e->fs,XmNhelpCallback,(XtCallbackProc)FSFilterCallback,(void*)e);
    xstr=XmStringCreateLocalized("Filter");
    XtVaSetValues(e->fs,
    	XmNhelpLabelString,xstr,
    	XmNdialogStyle,XmDIALOG_FULL_APPLICATION_MODAL,
    	NULL);
    XmStringFree(xstr);
    e->form=XtVaCreateManagedWidget("FSForm",xmFormWidgetClass,e->fs,NULL);
    l=XtVaCreateManagedWidget("FSTitle",xmLabelGadgetClass,e->form,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNleftAttachment,XmATTACH_FORM,
    	NULL);
    l=XtVaCreateManagedWidget("FSTitle",xmSeparatorGadgetClass,e->form,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,l,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNleftAttachment,XmATTACH_FORM,
    	NULL);
    rc=XtVaCreateManagedWidget("FSRC",xmRowColumnWidgetClass,e->form,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,l,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNorientation,XmVERTICAL,
    	XmNmarginWidth,0,
    	XmNmarginHeight,0,
    	NULL);
    w=XtVaCreateManagedWidget("FSFilter",xmLabelGadgetClass,rc,
    	XmNalignment,XmALIGNMENT_BEGINNING,
    	NULL);
    e->filter_field=CreateComboBox(rc,"FSFilterField",NULL,0,10);
    InitializeComboBox(e->filter_field,combo1);
    ComboBoxAddCallback(e->filter_field,(XtCallbackProc)FSFilterCallback,(void*)e);
    XtAddCallback(e->filter_field,XmNactivateCallback,(XtCallbackProc)FSFilterCallback,(void*)e);
    rc=XtVaCreateManagedWidget("FSRC",xmRowColumnWidgetClass,e->form,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,l,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_WIDGET,
    	XmNrightWidget,rc,
    	XmNorientation,XmVERTICAL,
    	XmNmarginWidth,0,
    	XmNmarginHeight,0,
    	NULL);
    w=XtVaCreateManagedWidget("FSFilterDirLabel",xmLabelGadgetClass,rc,
    	XmNalignment,XmALIGNMENT_BEGINNING,
    	NULL);
    e->dirfilter_field=CreateComboBox(rc,"FSFilterDirField",NULL,0,10);
    InitializeComboBox(e->dirfilter_field,combo2);
    ComboBoxAddCallback(e->dirfilter_field,(XtCallbackProc)FSFilterCallback,(void*)e);
    XtAddCallback(e->dirfilter_field,XmNactivateCallback,(XtCallbackProc)FSFilterCallback,(void*)e);
    e->dirlabel=XtVaCreateManagedWidget("FSDirLabel",xmLabelGadgetClass,e->form,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,XtParent(XtParent(e->filter_field)),
    	XmNleftAttachment,XmATTACH_FORM,
    	NULL);
    XtSetArg(arg[0],XmNlistSizePolicy,XmRESIZE_IF_POSSIBLE);
    e->dir_field=XmCreateScrolledList(e->form,"FSDirList",arg,1);
    XtVaSetValues(XtParent(e->dir_field),
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->dirlabel,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNscrollBarDisplayPolicy,XmSTATIC,
    	NULL);
    XtVaSetValues(e->dir_field,
    	XmNscrollBarDisplayPolicy,XmSTATIC,
    	XmNlistSizePolicy,XmRESIZE_IF_POSSIBLE,
    	NULL);
    XtAddCallback(e->dir_field,XmNdefaultActionCallback,(XtCallbackProc)SelectDir,(void*)e);
    XtManageChild(e->dir_field);
    e->filelabel=XtVaCreateManagedWidget("FSFileLabel",xmLabelGadgetClass,e->form,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,XtParent(XtParent(e->filter_field)),
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,XtParent(e->dir_field),
    	XmNrightAttachment,XmATTACH_FORM,
    	NULL);
    e->filefield=XmCreateScrolledList(e->form,"FSFileList",arg,1);
    XtVaSetValues(XtParent(e->filefield),
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->filelabel,
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,XtParent(e->dir_field),
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNscrollBarDisplayPolicy,XmSTATIC,
    	XmNlistSizePolicy,XmRESIZE_IF_POSSIBLE,
    	NULL);
    XtVaSetValues(e->filefield,
    	XmNscrollBarDisplayPolicy,XmSTATIC,
    	XmNlistSizePolicy,XmRESIZE_IF_POSSIBLE,
    	NULL);
   XtAddCallback(e->filefield,XmNbrowseSelectionCallback,(XtCallbackProc)BrowseSelect,(void*)e);
   XtAddCallback(e->filefield,XmNdefaultActionCallback,(XtCallbackProc)FSOKCallback,(void*)e);
   XtManageChild(e->filefield);
   e->fssize=XtVaCreateManagedWidget("FSSize",xmLabelGadgetClass,e->form,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,XtParent(e->dir_field),
    	XmNleftAttachment,XmATTACH_NONE,
    	XmNrightAttachment,XmATTACH_FORM,
    	NULL);
   e->selection=XtVaCreateManagedWidget("FSSelection",xmLabelGadgetClass,e->form,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,XtParent(e->dir_field),
    	XmNleftAttachment,XmATTACH_FORM,
    	NULL);
    n=0;
    XtSetArg(arg[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
    XtSetArg(arg[n],XmNtopWidget,e->selection);n++;
    XtSetArg(arg[n],XmNleftAttachment,XmATTACH_FORM);n++;
    XtSetArg(arg[n],XmNrightAttachment,XmATTACH_FORM);n++;
    e->sel_field=CreateComboBox(e->form,"FSSelectionField",arg,n,10);
    InitializeComboBox(e->sel_field,combo3);
    XtAddCallback(e->sel_field,XmNactivateCallback,(XtCallbackProc)FSOKCallback,(void*)e);
    db_getcwd(path,255);
    XtVaSetValues(e->filter_field,XmNvalue,"*",NULL);
    XtVaSetValues(e->dirfilter_field,XmNvalue,path,NULL);
    XtVaSetValues(e->sel_field,XmNvalue,path,NULL);
    GetDirectory(e,path,"*");
  }
  else
    FSFilterCallback(NULL,e,NULL); /* Refresh */
  XtVaSetValues(XtParent(e->fs),XmNtitle,title,NULL);
  xstr=XmStringCreateLocalized(title);
#ifndef LESSTIFF    
  XtVaSetValues(XtNameToWidget(e->fs,"*FSTitle"),XmNlabelString,xstr,NULL);
#endif
  XmStringFree(xstr);
  XtManageChild(e->fs);
  WatchCursor(e,0);
EP;
}
jex-1.3.7/genres.c100644      0      0        2114  6672726717  12040 0ustar  rootroot#include <stdio.h>
#include "jbdbg.h"

int main(int argc,char *argv[])
{
  FILE *f1,*f2;
  int ml=0;
  char str[100];
  
  if (argc!=3)
  {
    printf("Usage: genres header-file resource-file\n");
    return 1;
  }
  if ((f1=db_fopen(argv[1],"r"))==NULL)
  {
    printf("Can't open file %s\n",argv[1]);
    return 1;
  }
  if ((f2=db_fopen(argv[2],"w+"))==NULL)
  {
    printf("Can't create file %s\n",argv[2]);
    return 1;
  }
  while (db_fgets(str,100,f1))
  {
    str[db_strlen(str)-1]=0;
    if (db_strlen(str)>3 && str[0]=='"' && str[db_strlen(str)-1]==',' && str[db_strlen(str)-2]=='"')
    {
      str[db_strlen(str)-2]='\0';
      fprintf(f2,"%s\n",&str[1]);
    }
    else if (db_strlen(str)>3 && str[db_strlen(str)-1]=='\\')
    {
      if (str[0]=='"')
        fprintf(f2,"%s\n",&str[1]);
      else
        fprintf(f2,"%s\n",str);
      ml=1;
    }
    else if (ml && db_strlen(str)>3 && str[db_strlen(str)-1]==',' && str[db_strlen(str)-2]=='"')
    {
      str[db_strlen(str)-2]='\0';
      fprintf(f2,"%s\n",str);
      ml=0;
    }
  }
  db_fclose(f1);
  db_fclose(f2);
  return 0;
}
jex-1.3.7/gotoerr.c100644      0      0        3534  6672726717  12245 0ustar  rootroot#include "jex.h"
#include <ctype.h>
#include <Xm/List.h>

int FindFileLine(char *str,Editor *e,char *file,int *l)
{
  int x;
  
  if (e->grepped)
    return sscanf(str,"%[^:]:%d:",file,l);
  for (x=0;x<e->ce_count;x++)
  {
    if (sscanf(str,e->compiler_error[x],file,l)==2)
      return 2;
  }
  return 0;
}

void GotoError(Widget w,Editor *e,void *cbs)
{
  char *str;
  char file[255]/*,dir[255],name[255],name2[255]*/;
  int line,x;
  XmStringTable selected_items;
  int num_selected,res;
  
SP("GotoError");
  XtVaGetValues(e->io_win,XmNselectedItemCount,&num_selected,XmNselectedItems,&selected_items,NULL);
  if (num_selected==0)
  {
    EP;
    return;
  }
  WatchCursor(e,1);
  XmStringGetLtoR(selected_items[0],XmSTRING_DEFAULT_CHARSET,&str);
  res=FindFileLine(str,e,file,&line);
  if (res==2)
  {
/*    SplitPath(file,dir,name2);*/
    GetFullFileName(file);
    for (x=0;x<editors;x++)
    {
     /* SplitPath(editor[x]->filename,dir,name);
      if (db_strcmp(name,name2)==0)*/
      if (db_strcmp(editor[x]->filename,file)==0)
      {
        XMapRaised(XtDisplay(editor[x]->shell),XtWindow(editor[x]->shell));
        if (res==2)
        {
          sprintf(file,"%d",line);
          XtVaSetValues(editor[x]->gotofield,XmNvalue,file,NULL);
          GotoLine(NULL,editor[x],NULL);
        }
        XtFree(str);
        WatchCursor(e,0);
        EP;
        return;
      }
    }
    CreateNewEditor();
 /*   db_strcpy(editor[editors-1]->filename,file);
    SetTitle(editor[editors-1],editor[editors-1]->filename);*/
    if (loadfile(editor[editors-1],file,0,1))
      LoadError(editor[editors-1]);
    if (res==2)
    {
      sprintf(file,"%d",line);
      XtVaSetValues(editor[editors-1]->gotofield,XmNvalue,file,NULL);
      GotoLine(NULL,editor[editors-1],NULL);
    }
    XtFree(str);
    WatchCursor(e,0);
    EP;
    return;
  }      
  WatchCursor(e,0);
EP;
}
jex-1.3.7/grep.c100644      0      0       10026  6672726717  11533 0ustar  rootroot#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <ctype.h>
#include "match.h"
#include "jex.h"
#include "list.h"

int subdirs=0,case_sensitive=0,do_replace=0;
List f_list=NULL;

void strupr(char *str)
{
SP("strupr");
  while (str && *str)
  {
    *str=toupper(*str);
    str++;
  }
EP;
}

void ReplaceString(char *str,char *srch,char *repl)
{
  int x;
  char tmpstr[255],tmppat[255];
  
  SP("ReplaceString");
  db_strcpy(tmpstr,str);
  db_strcpy(tmppat,srch);
  if (!case_sensitive)
  {
    strupr(tmpstr);
    strupr(tmppat);
  }
  for (x=0;x<db_strlen(tmpstr);x++)
  {
    if ((x>db_strlen(tmpstr)-db_strlen(srch)) || ((db_strlen(tmpstr)+db_strlen(repl)-db_strlen(tmppat))>=255))
    {
      EP;
      return;
    }
    if (db_memcmp(&tmpstr[x],tmppat,db_strlen(tmppat))==0)
    {
      if (x==0 || (x>0 && !isalpha(tmpstr[x-1]) && tmpstr[x-1]!='_'))
      {
        db_memmove(&str[x],&str[x+db_strlen(srch)],db_strlen(str)-x-db_strlen(srch)+1);
        db_memmove(&str[x+db_strlen(repl)],&str[x],db_strlen(str)-x+1);
        db_memcpy(&str[x],repl,db_strlen(repl));
        db_memmove(&tmpstr[x],&tmpstr[x+db_strlen(tmppat)],db_strlen(tmpstr)-x-db_strlen(tmppat)+1);
        db_memmove(&tmpstr[x+db_strlen(repl)],&tmpstr[x],db_strlen(tmpstr)-x+1);
        db_memcpy(&tmpstr[x],repl,db_strlen(repl));
        x+=db_strlen(repl);
      }
    }
  }
  EP;
}

void DoGrep(char *patrn,char *replace)
{
  FILE *f,*f3=NULL;
  int line=0,x,nl=1;
  char str[255],str2[255],nw[255];
  char path[255],direc[255],pattern[255],file[255],pat[255];
  DIR *dp;
  struct dirent *dir;
  struct stat sbuf;
 
SP("DoGrep");
  sprintf(pat,"*%s*",patrn);
  if (!case_sensitive)
    strupr(pat);
  while (GetFirstElement(f_list,path))
  {
    DeleteFirstElement(f_list);
    SplitPath(path,direc,pattern);
    if ((dp=db_opendir(direc))==NULL)
    {
      fprintf(stderr,"Can't open directory %s\n",path);
      continue;
    }
    while ((dir=db_readdir(dp))!=NULL)
    {
      if (dir->d_ino==0)
        continue;
      if (db_strcmp(direc,".")==0 || db_strcmp(direc,"./")==0)
        sprintf(file,dir->d_name);
      else
      {
        if (direc[db_strlen(direc)-1]!='/')
          sprintf(file,"%s/%s",direc,dir->d_name);
        else
          sprintf(file,"%s%s",direc,dir->d_name);
      }
      if (db_stat(file,&sbuf)<0)
      {
        if (db_lstat(file,&sbuf)<0)
        {
          continue;
        }
      }
      if ((sbuf.st_mode&S_IFMT)==S_IFDIR)
      {
        if (subdirs && db_strcmp(dir->d_name,".")!=0 && db_strcmp(dir->d_name,"..")!=0)
        {
          sprintf(path,"%s/%s",file,pattern);
          AddFirstElement(f_list,path);
        }
        continue;
      }
      if (match(pattern,dir->d_name))
      {
        if ((f=db_fopen(file,"r"))==NULL)
        {
          printf("Can't open file %s\n",file);
          continue;
        }
        if (do_replace)
        {
          sprintf(nw,"%s.tmp",file);
          if ((f3=db_fopen(nw,"w+"))==NULL)
          {
            printf("Cannot open file %s\n",nw);
            db_fclose(f);
            return;
          }
        }
        line=0;
        while (db_fgets(str,254,f)!=NULL)
        {
          if (str[db_strlen(str)-1]=='\n')
          {
            line++;
            str[db_strlen(str)-1]='\0';
            nl=1;
          }
          else
            nl=0;
          db_strcpy(str2,str);
          if (do_replace)
          {
            ReplaceString(str2,patrn,replace);
            if (nl)
              db_fprintf(f3,"%s\n",str2);
            else
              db_fprintf(f3,"%s",str2);
          }
          if (!case_sensitive)
            strupr(str);
          if (match(pat,str))
          {
            for (x=0;x<db_strlen(str2);x++)
            {
              if (str2[x]=='\t')
                str2[x]=' ';
            }
            printf("%s:%d: %s\n",file,line,str2);
          }
        }
        db_fclose(f);
        if (do_replace)
          db_fclose(f3);
        db_rename(nw,file);
      }
    }
    db_closedir(dp);
  }
EP;
}

jex-1.3.7/grepd.c100644      0      0       24633  6672726717  11710 0ustar  rootroot#include <Xm/MessageB.h>
#include <Xm/Form.h>
#include <Xm/LabelG.h>
#include <Xm/TextF.h>
#include <Xm/ToggleB.h>
#include <Xm/DrawnB.h>
#include <Xm/PushBG.h>
#include <Xm/List.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/wait.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <unistd.h>
#include "list.h"
#include "jex.h"

extern List f_list;
extern int subdirs,grep_size,grep_file_size,case_sensitive,do_replace;
extern XtAppContext app;
extern Pixmap lov;
extern Widget combo4,combo5,combo6;

void GrepOK(Widget wdg,Editor *e,void *cbs)
{
  char *what;
  char *where;
  char *repl="";
  char str[255];
  Boolean subdir,casesens,replace;
  char *args[20];
  int x,pid;
  
SP("GrepOK");
  XtVaGetValues(e->gpat,XmNvalue,&what,NULL);
  if (what[0]=='\0')
  {
    XtFree(what);
EP;
    return;
  }
  UpdateComboBox(combo4,what);
  for (x=0;x<editors;x++)
    UpdateComboBox(editor[x]->gpat,what);
/*  UpdateGrepList(what);*/
  XtVaSetValues(e->compile,XmNsensitive,False,NULL);  
  XtVaSetValues(e->make,XmNsensitive,False,NULL); 
  XtVaSetValues(e->run,XmNsensitive,False,NULL); 
  XtVaSetValues(e->grep,XmNsensitive,False,NULL);  
#ifndef LESSTIFF    
  XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_0"),XmNsensitive,False,NULL);
  XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_1"),XmNsensitive,False,NULL);
  XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_2"),XmNsensitive,False,NULL);
  XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_3"),XmNsensitive,False,NULL);
#endif
  XtVaGetValues(e->gfiles,XmNvalue,&where,NULL);
  if (where[0]=='\0')
  {
    XtFree(where);
    where=(char*)XtMalloc(2);
    db_strcpy(where,"*");
  }
  XtVaGetValues(XtNameToWidget(e->gd,"*GrepReplace"),XmNset,&replace,NULL);
  if (replace)
  {
    do_replace=replace?1:0;
#ifndef LESSTIFF    
    XtVaGetValues(XtNameToWidget(e->gd,"*GrepReplaceField"),XmNvalue,&repl,NULL);
#endif
    UpdateComboBox(combo6,repl);
    for (x=0;x<editors;x++)
    {
#ifndef LESSTIFF    
      if (XtNameToWidget(editor[x]->gd,"*GrepReplaceField"))
        UpdateComboBox(XtNameToWidget(editor[x]->gd,"*GrepReplaceField"),repl);
#endif
    }
  }
  UpdateComboBox(combo5,where);
  for (x=0;x<editors;x++)
    UpdateComboBox(editor[x]->gfiles,where);
/*  UpdateGrepFileList(where);*/
  XtVaGetValues(e->gsubd,XmNset,&subdir,NULL);
  XtVaGetValues(e->casesens,XmNset,&casesens,NULL);
  SplitUp(where,args);
  e->t.pid=0;
  CreateOutputWindow(e); 
  XtPopup(e->iod,XtGrabNone);
  XMapRaised(XtDisplay(e->iod),XtWindow(e->iod));
  XmListDeleteAllItems(e->io_win);
  e->x=0;
  SetLabel(e,"Grep");
  if (db_pipe(e->t.fd)!=0)
  {
    SetLabel(e,"Too many open files!");
    XtVaSetValues(e->compile,XmNsensitive,True,NULL);  
    XtVaSetValues(e->make,XmNsensitive,True,NULL);  
    XtVaSetValues(e->run,XmNsensitive,True,NULL);  
    XtVaSetValues(e->grep,XmNsensitive,True,NULL);  
#ifndef LESSTIFF    
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_0"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_1"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_2"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_3"),XmNsensitive,True,NULL);
#endif
    if (replace)
      XtFree(repl);
EP;
    return;
  }
  if (db_pipe(e->t.fd2)!=0)
  {
    SetLabel(e,"Too many open files!");
    db_close(e->t.fd[0]);
    db_close(e->t.fd[1]);
    XtVaSetValues(e->compile,XmNsensitive,True,NULL);
    XtVaSetValues(e->make,XmNsensitive,True,NULL);
    XtVaSetValues(e->run,XmNsensitive,True,NULL);
    XtVaSetValues(e->grep,XmNsensitive,True,NULL);  
#ifndef LESSTIFF    
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_0"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_1"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_2"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_3"),XmNsensitive,True,NULL);
#endif
    if (replace)
      XtFree(repl);
EP;
    return;
  }
  if (db_pipe(e->t.fd3)!=0)
  {
    SetLabel(e,"Too many open files!");
    db_close(e->t.fd[0]);
    db_close(e->t.fd[1]);
    db_close(e->t.fd2[0]);
    db_close(e->t.fd2[1]);
    XtVaSetValues(e->compile,XmNsensitive,True,NULL);
    XtVaSetValues(e->make,XmNsensitive,True,NULL);
    XtVaSetValues(e->run,XmNsensitive,True,NULL);
    XtVaSetValues(e->grep,XmNsensitive,True,NULL);  
#ifndef LESSTIFF    
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_0"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_1"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_2"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_3"),XmNsensitive,True,NULL);
#endif
EP;
    return;
  }

  e->tid=XtAppAddTimeOut(app,500,(XtTimerCallbackProc)SetWorkingLabel,(void*)e);

  fcntl(e->t.fd[0],F_SETFL,O_NONBLOCK);
  fcntl(e->t.fd2[0],F_SETFL,O_NONBLOCK);

  e->t.id=XtAppAddInput(app,e->t.fd[0],(XtPointer)XtInputReadMask,(XtInputCallbackProc)InputCallback1,(XtPointer)e);
  e->t.id2=XtAppAddInput(app,e->t.fd2[0],(XtPointer)XtInputReadMask,(XtInputCallbackProc)InputCallback2,(XtPointer)e);

  db_strcpy(e->t.name,"Grep");
  signal(SIGCHLD,ChildSignal);

  if ((pid=fork())>=0)
  {
    if (pid>0)
    {
      e->t.pid=pid;
      XtFree(what);
      XtFree(where);
      e->grepped=1;
    }
    if (pid==0)
    {
      db_postmortemdump=0;
      signal(SIGQUIT,SIG_DFL);
      signal(SIGILL,SIG_DFL);
      signal(SIGTRAP,SIG_DFL);
      signal(SIGIOT,SIG_DFL);
      signal(SIGFPE,SIG_DFL);
      signal(SIGKILL,SIG_DFL);
      signal(SIGBUS,SIG_DFL);
      signal(SIGSEGV,SIG_DFL);
      signal(SIGTERM,SIG_DFL);
      signal(SIGHUP,SIG_DFL);
      signal(SIGSTOP,SIG_DFL);
      signal(SIGINT,SIG_DFL);
      signal(SIGIO,SIG_DFL);
      signal(SIGPIPE,SIG_DFL);
      signal(SIGUSR1,SIG_DFL);
      signal(SIGUSR2,SIG_DFL);
      signal(SIGPROF,SIG_DFL);
      signal(SIGABRT,SIG_DFL);
      db_setbuf(stdout,NULL);
      db_dup2(e->t.fd[1],1);
      db_dup2(e->t.fd2[1],2);
      db_dup2(e->t.fd3[0],0);
      subdirs=subdir;
      case_sensitive=casesens;
      f_list=CreateList(255);
      x=0;
      while (args[x])
      {
        db_strcpy(str,args[x]);
        AddElement(f_list,str);
        x++;
      }
      DoGrep(what,repl);
      DisposeList(f_list);
      exit(0);
    }
  }
  else
  {
    SetLabel(e,"fork() failed!");
    XtVaSetValues(e->compile,XmNsensitive,True,NULL);  
    XtVaSetValues(e->make,XmNsensitive,True,NULL);  
    XtVaSetValues(e->run,XmNsensitive,True,NULL);  
    XtVaSetValues(e->grep,XmNsensitive,True,NULL);  
#ifndef LESSTIFF    
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_0"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_1"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_2"),XmNsensitive,True,NULL);
    XtVaSetValues(XtNameToWidget(e->mb,"*toolsmenu.button_3"),XmNsensitive,True,NULL);
#endif
EP;
    return;
  }
EP;}

void GrepCancel(Widget w,Editor *e,void *cbs)
{
  SetCurrentWidget(e->text);
}

void ReplaceActive(Widget w,Widget f,XmToggleButtonCallbackStruct *cbs)
{
  SP("ReplaceActive");
  XtVaSetValues(f,XmNsensitive,(Boolean)cbs->set,NULL);
  EP;
}

void Grep(Widget wdg,Editor *e,void *cbs)
{
  Widget f,w1,w2,w3,w;
  int n;
  Arg arg[10];

SP("Grep");
  WatchCursor(e,1);
  if (e->gd==NULL)
  {
    e->gd=XmCreateMessageDialog(e->shell,"GrepDialog",NULL,0);
    XtAddCallback(e->gd,XmNokCallback,(XtCallbackProc)GrepOK,(void*)e);
    XtAddCallback(e->gd,XmNcancelCallback,(XtCallbackProc)GrepCancel,(void*)e);
    XtAddCallback(e->gd,XmNhelpCallback,(XtCallbackProc)Help,"Grep");
    f=XtVaCreateManagedWidget("GrepForm",xmFormWidgetClass,e->gd,
    	XmNfractionBase,3,NULL);
    w1=XtVaCreateManagedWidget("GrepPatLabel",xmLabelGadgetClass,f,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNtopOffset,5,
	XmNalignment,XmALIGNMENT_BEGINNING,
    	NULL);
    n=0;
    XtSetArg(arg[n],XmNtopAttachment,XmATTACH_FORM);n++;
    XtSetArg(arg[n],XmNleftAttachment,XmATTACH_WIDGET);n++;
    XtSetArg(arg[n],XmNleftWidget,w1);n++;
    XtSetArg(arg[n],XmNrightAttachment,XmATTACH_FORM);n++;
    e->gpat=CreateComboBox(f,"GrepPattern",arg,n,10);
    InitializeComboBox(e->gpat,combo4);
    w3=XtVaCreateManagedWidget("GrepFileLabel",xmLabelGadgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,XtParent(e->gpat),
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_OPPOSITE_WIDGET,
    	XmNrightWidget,w1,
    	XmNtopOffset,5,
	XmNalignment,XmALIGNMENT_BEGINNING,
    	NULL);
    	
    n=0;
    XtSetArg(arg[n],XmNtopAttachment,XmATTACH_WIDGET);n++;	  
    XtSetArg(arg[n],XmNtopWidget,XtParent(e->gpat));n++;	  
    XtSetArg(arg[n],XmNleftAttachment,XmATTACH_WIDGET);n++;	  
    XtSetArg(arg[n],XmNleftWidget,w3);n++;	  
    XtSetArg(arg[n],XmNrightAttachment,XmATTACH_FORM);n++;	  
    e->gfiles=CreateComboBox(f,"GrepFiles",arg,n,10);
    InitializeComboBox(e->gfiles,combo5);

    w2=XtVaCreateManagedWidget("GrepReplace",xmToggleButtonWidgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,XtParent(e->gfiles),
    	XmNleftAttachment,XmATTACH_FORM,
	NULL);
    w3=XtVaCreateManagedWidget("GrepReplaceLabel",xmLabelGadgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,w2,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_OPPOSITE_WIDGET,
    	XmNrightWidget,w1,
    	XmNtopOffset,5,
	XmNalignment,XmALIGNMENT_BEGINNING,
    	NULL);
    n=0;
    XtSetArg(arg[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
    XtSetArg(arg[n],XmNtopWidget,w2);n++;
    XtSetArg(arg[n],XmNleftAttachment,XmATTACH_WIDGET);n++;
    XtSetArg(arg[n],XmNleftWidget,w3);n++;
    XtSetArg(arg[n],XmNrightAttachment,XmATTACH_FORM);n++;
    w=CreateComboBox(f,"GrepReplaceField",arg,n,10);
    InitializeComboBox(w,combo6);
    XtAddCallback(w2,XmNvalueChangedCallback,(XtCallbackProc)ReplaceActive,(void*)w);
    	
    e->gsubd=XtVaCreateManagedWidget("GrepSubDirs",xmToggleButtonWidgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,XtParent(w),
    	XmNleftAttachment,XmATTACH_FORM,
	NULL);
    e->casesens=XtVaCreateManagedWidget("GrepCase",xmToggleButtonWidgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->gsubd,
    	XmNleftAttachment,XmATTACH_FORM,
	NULL);
  }
  XtManageChild(e->gd);
  WatchCursor(e,0);
EP;
}


jex-1.3.7/help.c100644      0      0       24102  6672726717  11526 0ustar  rootroot#include <Xm/Xm.h>
#include <Xm/MessageB.h>
#include <Xm/Text.h>
#include <Xm/List.h>
#include <Xm/DialogS.h>
#include <Xm/Protocols.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#include "jex.h"
#include "help.h"
#include "helpstack.h"

extern Widget top;
List help_topics=NULL;
extern Pixmap pixmap;
Widget help_dialog=NULL,textw,tlist=NULL,tshell=NULL,ad=NULL;
HStack *hst=NULL;
char current_topic[40],helpfile[255];
List l=NULL;
extern XtAppContext app;

void SetZeroPos(Widget w,void *id)
{
SP("SetZeroPos");
  XmTextSetInsertionPosition(w,0);
  XmTextShowPosition(w,0);
EP;
}  

/* Checks if the user has clicked on a link, if so, the current link is pushed
   on the stack and the next topic is displayed.*/
void CheckLink(Widget w,List data,XmTextVerifyCallbackStruct *cbs)
{
  int pos=cbs->newInsert;
  HelpText ht;
  HStackElem el;

SP("CheckLink");
  if (GetFirstElement(data,&ht))
  {
    do
    {
      if (pos>=ht.start && pos<=ht.end)
      {
	XtRemoveCallback(w,XmNmotionVerifyCallback,(XtCallbackProc)CheckLink,data);
        db_strncpy(el.data,current_topic,40);
        Push(hst,el);
        XtSetSensitive(XmMessageBoxGetChild(help_dialog,XmDIALOG_CANCEL_BUTTON),True);
	DisplayTopic(w,ht.link,helpfile,data);
	XtAppAddTimeOut(app,0,(XtTimerCallbackProc)SetZeroPos,w);
EP;
	return;
      }
    } while (GetNextElement(data,&ht));
  }
EP;
}

/* Display a new topic in the help window. The text is loaded from the file. */
void DisplayTopic(Widget w,char *topic,char *file,List l)
{
  FILE *f;
  HelpTopic htop;
  HelpText ht,ht2;
  char *str;
  XmTextPosition position=0;
  int found=0,first;

SP("DisplayTopic");
/*  XmTextSetString(w,""); */
  if ((f=db_fopen(file,"r"))==NULL)
  {
/*    XmTextSetString(w,"Cannot open help file!");*/
    HelpError("Cannot open help file!");
    XtAddCallback(w,XmNmotionVerifyCallback,(XtCallbackProc)CheckLink,l);
EP;
    return;
  }
  if (GetFirstElement(help_topics,&htop))
  {
    do
    {
      if (db_strcmp(topic,htop.topic)==0)
      {
	found=1;
        break;
      }
    } while (GetNextElement(help_topics,&htop));
    if (!found)
    {
/*      XmTextSetString(w,"Topic not found!");*/
      HelpError("Topic not found!");
      XtAddCallback(w,XmNmotionVerifyCallback,(XtCallbackProc)CheckLink,l);
      db_fclose(f);
EP;
      return;
    }
  }
  db_strncpy(current_topic,topic,40);
  ClearList(l);
  XmTextSetString(w,""); 
  if (GetFirstElement(htop.list,&ht)) 
  {				      
    first=ht.start;
    do
    {
      db_fseek(f,ht.start,0);
      str=(char *)db_malloc(ht.end-ht.start+1);          
      db_fread(str,ht.end-ht.start,1,f);
      str[ht.end-ht.start]=0;
      XmTextReplace(w,position,position+ht.end-ht.start,str);
      ht2.start=position;
      position+=ht.end-ht.start;
      ht2.end=position;
      db_strcpy(ht2.link,ht.link);
      db_free(str);
      if (ht.type==LINK_TEXT)
      {
	XmTextSetHighlight(w,ht2.start,ht2.end,XmHIGHLIGHT_SECONDARY_SELECTED);
	AddElement(l,&ht2);
      }
/*      XmTextSetInsertionPosition(w,0);
      XmTextShowPosition(w,0);*/
    } while (GetNextElement(htop.list,&ht));
  }
  XmTextSetInsertionPosition(w,0);
  XmTextShowPosition(w,0);
  XtAddCallback(w,XmNmotionVerifyCallback,(XtCallbackProc)CheckLink,l);
  db_fclose(f);
EP;
}

void help_ok(Widget w,List data,void *cbs)
{
SP("help_ok");
/*  DisposeList(data);
  l=NULL;
  XtPopdown(XtParent(help_dialog));
  help_dialog=NULL; */
  XtUnmanageChild(help_dialog);
EP;
}

void help_cancel(Widget w,List data,void *cbs)
{
  HStackElem el;

SP("help_cancel");
  Pop(hst,&el);
  XtRemoveCallback(textw,XmNmotionVerifyCallback,(XtCallbackProc)CheckLink,data);
  if (StackSize(hst)==0)
    XtSetSensitive(XmMessageBoxGetChild(help_dialog,XmDIALOG_CANCEL_BUTTON),False);
  DisplayTopic(textw,el.data,helpfile,data);
EP;
}

void Help(Widget widget,char *c,void *d)
{
  Arg arg[7];
  XmTextScanType s_array[5];
/*  Atom wm_delete;*/

SP("Help");
  if (help_dialog==NULL)
  {
    hst=CreateHStack();
    if ((help_topics=CompileHelp())==NULL)
    {
      HelpError("Can't find help file!");
EP;
      return;
    }
    l=CreateList(sizeof(HelpText));
    XtSetArg(arg[1],XmNdeleteResponse,XmDO_NOTHING);
    XtSetArg(arg[0],XmNautoUnmanage,False);
    help_dialog=XmCreateMessageDialog(top,"Help",arg,1);
    XtAddCallback(help_dialog,XmNokCallback,help_ok,l);
    XtAddCallback(help_dialog,XmNcancelCallback,help_cancel,l);
    XtAddCallback(help_dialog,XmNhelpCallback,Index,NULL);
    XtSetSensitive(XmMessageBoxGetChild(help_dialog,XmDIALOG_CANCEL_BUTTON),False);
    if (help_topics==0)
      XtSetSensitive(XmMessageBoxGetChild(help_dialog,XmDIALOG_HELP_BUTTON),False);
    s_array[0]=XmSELECT_POSITION;
    s_array[1]=XmSELECT_POSITION;
    s_array[2]=XmSELECT_POSITION;
    s_array[3]=XmSELECT_POSITION;
    s_array[4]=XmSELECT_POSITION;
    XtSetArg(arg[0],XmNeditable,False);
    XtSetArg(arg[1],XmNeditMode,XmMULTI_LINE_EDIT);
    XtSetArg(arg[2],XmNselectionArray,s_array);
    XtSetArg(arg[3],XmNselectionArrayCount,5);
    XtSetArg(arg[4],XmNcursorPositionVisible,False);
    XtSetArg(arg[5],XmNwordWrap,True);
    XtSetArg(arg[6],XmNscrollHorizontal,False);
    textw=XmCreateScrolledText(help_dialog,"help_text",arg,7);
/*    wm_delete=XmInternAtom(XtDisplay(help_dialog),"WM_DELETE_WINDOW",False);
    XmAddWMProtocolCallback(XtParent(help_dialog),wm_delete,help_ok,NULL);*/
    XtManageChild(textw);
    XtManageChild(help_dialog);
  }
  else
  {
    HStackElem el;
   
    db_strncpy(el.data,current_topic,40);
    Push(hst,el);
    XtSetSensitive(XmMessageBoxGetChild(help_dialog,XmDIALOG_CANCEL_BUTTON),True);
    if (help_topics==0)
      XtSetSensitive(XmMessageBoxGetChild(help_dialog,XmDIALOG_HELP_BUTTON),False);
    XtRemoveCallback(textw,XmNmotionVerifyCallback,(XtCallbackProc)CheckLink,l);
    XtManageChild(help_dialog);
  }
  DisplayTopic(textw,c,helpfile,l);  
EP;
}

/* Callback for the index, when the user selects a topic. */
void list_select(Widget w,void *data,XmListCallbackStruct *cbs)
{
  HelpTopic htop;

SP("list_select");
  GetNthElement(help_topics,cbs->item_position-1,&htop);
  Help(NULL,htop.topic,NULL);  
  XtPopdown(tshell);
EP;
}

void index_close(Widget w,void *d,void *cbs)
{
SP("index_close");
  XtPopdown(tshell);
EP;
}

int SortProc(const void *n1,const void *n2)
{
  int x;

SP("SortProc");
  x=db_strcmp(((HelpTopic*)n1)->topic_text,((HelpTopic*)n2)->topic_text);
  if (x<0)
  {
    EP;
    return -1;
  }
  else if (x>0)
  {
    EP;
    return 1;
  }
EP;
  return 0;
}

void Index(Widget w,void *data,void *cbs)
{
  XmStringTable tops;
  int x=0,n;
  HelpTopic htop;
  Atom wm_delete;

SP("Index");
  if (tshell==NULL)
  {
    n=NumberElements(help_topics);
    if (n==0)
    {
      EP;
      return;
    }
    tops=(XmStringTable)XtMalloc(n*sizeof(XmString));
    SortList(help_topics,SortProc);	    
    if (GetFirstElement(help_topics,&htop)) 
    {					    
      do
      {
        tops[x++]=XmStringCreateLocalized(htop.topic_text);
      } while (GetNextElement(help_topics,&htop));
    }

    tshell=XtVaCreatePopupShell("Topics",xmDialogShellWidgetClass,top,
		XmNdeleteResponse,XmDO_NOTHING,
	 	XmNallowShellResize,True,	
		NULL);

    tlist=XmCreateScrolledList(tshell,"help_topics",NULL,0);
    XtVaSetValues(tlist,XmNitems,tops,
		XmNitemCount,n,
		XmNdeleteResponse,XmDO_NOTHING,	
		XmNselectionPolicy,XmBROWSE_SELECT,
		NULL);

    XtAddCallback(tlist,XmNdefaultActionCallback,(XtCallbackProc)list_select,NULL);
    wm_delete=XmInternAtom(XtDisplay(tshell),"WM_DELETE_WINDOW",False);
    XmAddWMProtocolCallback(tshell,wm_delete,index_close,NULL);
    XtManageChild(tlist);
    XtManageChild(tshell);
  }
  else
    XtPopup(tshell,XtGrabNone);
EP;
}

int FindHelpFile(char *helpfile,char *file)
{
  char *env,*pos,*orig;
  FILE *f;

SP("FindHelp");
  if (!getenv("PATH"))
  {
    EP;
    return 0;
  }
  orig=env=db_strdup(getenv("PATH"));
  pos=db_strchr(env,':');
  while (pos)
  {
    *pos=0;
    sprintf(file,"%s/%s",env,helpfile);
    if ((f=fopen(file,"r"))!=NULL)
    {
      fclose(f);
      db_free(orig);
      EP;
      return 1;
    }
    env=pos+1;
    pos=db_strchr(env,':');
  }
  sprintf(file,"%s/%s",env,helpfile);
  if ((f=fopen(file,"r"))!=NULL)
  {
    fclose(f);
    db_free(orig);
    EP;
    return 1;
  }
  db_free(orig);
EP;
  return 0;
}

List CompileHelp(void)
{
  FILE *f;
  char ch,str[100];
  int start,end,eof=0;
  HelpText ht;
  HelpTopic htop;
  List l;

SP("CompileHelp");
  if (!FindHelpFile("jex.hlp",helpfile))
  {
    EP;
    return NULL;
  }
  if ((f=db_fopen(helpfile,"r"))==NULL)
  {
    EP;
    return NULL;
  }
  l=CreateList(sizeof(HelpTopic));
  while (!db_feof(f))
  {
    start=db_ftell(f);
    fscanf(f,"%s",str);
    if (db_strcmp(str,".topic")==0) 
    {
      htop.list=CreateList(sizeof(HelpText));
      fscanf(f,"%s",htop.topic);
      ht.start=start=db_ftell(f)+1;
      while ('\n'!=db_fgetc(f));
      while ((ch=db_fgetc(f))==' ' || ch=='\t' || ch=='\n');
      db_ungetc(ch,f);
      db_fgets(htop.topic_text,100,f);
      htop.topic_text[strlen(htop.topic_text)-1]=0;
      AddElement(l,&htop); 
      for (;;)
      {
	ch=db_fgetc(f);
	if (db_feof(f))
 	{
	  end=db_ftell(f);
	  eof=1;
	  break;
	}
	if (ch=='.')
	{
	  end=db_ftell(f)-1;
	  fscanf(f,"%s",str);
	  db_fseek(f,end,0);
	  if (db_strcmp(str,"topic")==0)
	    break;
	  else
	    db_fseek(f,end+1,0);
	}
	else if (ch=='{') 
	{
	  end=db_ftell(f)-1;
	  ht.end=end;
	  ht.type=NORMAL_TEXT;
	  AddElement(htop.list,&ht); 
	  ht.start=end+1;
	  ht.type=LINK_TEXT;
	  do
	  {
	    ch=db_fgetc(f);
	  } while (ch!=':' && ch!='}');
	  ht.end=db_ftell(f)-1;
	  if (ch=='}')
	    db_fseek(f,end+1,0);
	  end=0;
	  do  
	  {
	    ch=db_fgetc(f);
	    if (ch!=' ' && ch!='}')
	      ht.link[end++]=ch;
	  } while (ch!='}');
	  ht.link[end]=0;
	  AddElement(htop.list,&ht);
	  ht.start=start=db_ftell(f);
	}
	else if (ch=='\\') 
	{
	  ht.end=db_ftell(f)-1;
          ht.type=NORMAL_TEXT;
          AddElement(htop.list,&ht);
          db_fgetc(f);
          ht.start=db_ftell(f)-1;
        }
      }
      ht.type=NORMAL_TEXT;
      ht.end=end;
      AddElement(htop.list,&ht);
      if (eof)
	break;
    }
    else
    {
      db_fclose(f);
      EP;
      return NULL;
    }
  }
  db_fclose(f);
EP;
  return l;
}

jex-1.3.7/helpstack.c100644      0      0        3304  6672726717  12535 0ustar  rootroot#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "helpstack.h"
#include "jex.h"

HStack *CreateHStack(void)
{
  HStack *hst;
  
SP("CreateHStack");
  if ((hst=(HStack*)db_malloc(sizeof(HStack)))==NULL)
  {
    EP;
    return NULL;
  }
  hst->nelems=0;
  hst->last=NULL;
EP;
  return hst;
}

void DestroyHStack(HStack *hst)
{
  HStackElement *ptr;

SP("DestroyHStack");
  if (!hst)
  {
    EP;
    return;
  }
  ptr=hst->last;
  while (hst->last && ptr->prev)
  {
    hst->last=ptr->prev;
    db_free(ptr);
    ptr=hst->last;
  }
  if (hst->last)
    db_free(hst->last);
  db_free(hst);
EP;
}

void StackClear(HStack *hst)
{
  HStackElement *ptr;

SP("StackClear");
  if (!hst)
  {
    EP;
    return;
  }
  ptr=hst->last;
  while (hst->last && ptr->prev)
  {
    hst->last=ptr->prev;
    db_free(ptr);
    ptr=hst->last;
  }
  if (hst->last)
    db_free(hst->last);
  hst->last=NULL;
  hst->nelems=0;
EP;
}

int Push(HStack *hst,HStackElem data)
{
  HStackElement *ptr;

SP("Push");
  if (!hst)
  {
    EP;
    return 0;
  }
  if ((ptr=(HStackElement *)db_malloc(sizeof(HStackElement)))==NULL)
  {
    EP;
    return -1;
  }
  db_memcpy(&ptr->s,&data,sizeof(HStackElem));
  ptr->prev=hst->last;
  hst->last=ptr;
  hst->nelems++;
EP;
  return hst->nelems-1;
}

int Pop(HStack *hst,HStackElem *data)
{
  HStackElement *ptr;

SP("Pop");
  if (!hst || !data)
  {
    EP;
    return 0;
  }
  if (hst->nelems==0)
  {
    EP;
    return 0;
  }
  db_memcpy(data,&hst->last->s,sizeof(HStackElem));
  ptr=hst->last;
  hst->last=hst->last->prev;
  db_free(ptr);
  hst->nelems--;
EP;
  return hst->nelems;
}

int StackSize(HStack *hst)
{
SP("StackSize");
  if (!hst)
  {
    EP;
    return 0;
  }
EP;
  return hst->nelems;
}
jex-1.3.7/history.c100644      0      0        3665  6672726717  12272 0ustar  rootroot#include <Xm/PushB.h>
#include <Xm/Xm.h>
#include <Xm/RowColumn.h>
#include <Xm/PushBG.h>
#include "jex.h"

int fl_size=0;
char fl_files[FILELIST][255];

void LoadOldFile(Editor *e)
{
SP("LoadOldFile");
  if (loadfile(e,e->choice,0,1))
    LoadError(e);
EP;
}

void OpenOldFile(Widget w,Editor *e,void *cbs)
{
  int x;
  
SP("OpenOldFile");
  for (x=0;x<fl_size;x++)
  {
    if (e->filelist[x]==w)
    {
      if (e->new_window)
      {
        CreateNewEditor();
        if (loadfile(editor[editors-1],fl_files[x],0,1))
          LoadError(editor[editors-1]);
      }
      else
      {
        db_strcpy(e->choice,fl_files[x]);
        if (e->saved)
          LoadOldFile(e);
        else
          AskToSave(e,(void*)LoadOldFile);
      }
      break;
    }
  }
EP;
}

void UpdateFileList(char *file)
{
  int x,end,exists=0,e;
  XmString xstr;

SP("UpdateFileList");
  end=fl_size;
  if (file && file[0])
  {
    for (x=0;x<fl_size;x++)
    {
      if (db_strcmp(fl_files[x],file)==0)
      {
        end=x+1;
        exists=1;
        break;
      }
    }
    if (fl_size<FILELIST && !exists)
    {
      for (x=0;x<editors;x++)
      {
        editor[x]->filelist[fl_size]=XtVaCreateManagedWidget("filebutton",
       	  xmPushButtonGadgetClass,editor[x]->filemenu,NULL);
        XtAddCallback(editor[x]->filelist[fl_size],XmNactivateCallback,(XtCallbackProc)OpenOldFile,(void*)editor[x]);
      }
      fl_size++;
      end=fl_size;
    }
    for (x=end-2;x>=0;x--)
      db_strcpy(fl_files[x+1],fl_files[x]);
    db_strcpy(fl_files[0],file);
  }
  for (x=0;x<end;x++)
  {
    xstr=XmStringCreateLocalized(fl_files[x]);
    for (e=0;e<editors;e++)
    {
      XtVaSetValues(editor[e]->filelist[x],XmNlabelString,xstr,NULL);
    }
    XmStringFree(xstr);
  }
EP;
}

void Reload(Editor *e)
{
SP("Reload");
  if (e->filename[0])
  {
    db_strcpy(e->choice,e->filename);
    if (e->saved)
      LoadOldFile(e);
    else
      AskToSave(e,(void*)LoadOldFile);
  }
EP;
}

jex-1.3.7/jex.c100644      0      0      100317  6672727056  11404 0ustar  rootroot#include <stdio.h>
#include <Xm/Xm.h>
#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/Text.h>
#include <Xm/TextF.h>
#include <Xm/PushBG.h>
#include <Xm/PushB.h>
#include <Xm/DrawnB.h>
#include <Xm/ArrowBG.h>
#include <Xm/LabelG.h>
#include <Xm/ArrowB.h>
#include <Xm/Protocols.h>
#include <X11/Shell.h>
#include <sys/types.h>
#include <sys/time.h>
#include "fallbacks.h"
#include "jex.h"
#include "xpm.h"
#include "jex.xpm"
#include "lov.xbm"
#include "new.xpm"
#include "open.xpm"
#include "save.xpm"
#include "save2.xpm"
#include "clear.xpm"
#include "clone.xpm"
#include "compile.xpm"
#include "copy.xpm"
#include "cut.xpm"
#include "grep.xpm"
#include "left.xpm"
#include "make.xpm"
#include "newwind.xpm"
#include "paste.xpm"
#include "redo.xpm"
#include "right.xpm"
#include "undo.xpm"
#include "undo2.xpm"
#include "redo2.xpm"
#include "compile2.xpm"
#include "make2.xpm"
#include "grep2.xpm"
#include "up.xpm"
#include "down.xpm"
#include "setmarker.xpm"
#include "gotomarker.xpm"
#include "gotomarker2.xpm"
#include "caps.xpm"
#include "lows.xpm"
#include "down2.xpm"
#include "run.xpm"
#include "run2.xpm"
#include "gotoline.xpm"

#ifndef MAX
#define MAX(x,y) (((x)>(y))?(x):(y))
#endif

Widget top,combo1,combo2,combo3,combo4,combo5,combo6;
XtAppContext app;
int editors=0;
Editor *editor[MAXEDITORS];
Pixmap pixmap,lov,_new,_open,_save,_save2,_clear,_clone,_compile,_copy,_cut;
Pixmap _grep,_left,_make,_newwind,_paste,_redo,_right,_undo,_undo2,_redo2;
Pixmap _compile2,_make2,_grep2,_up,_down,_lows,_caps,_setmarker,_gotomarker;
Pixmap _gotomarker2,_down2,_run,_run2,_gotoline;
extern int fl_size,find_size,repl_size;
OwnRes ownres;
XtResource resources[]={
{"history_in_home_dir","History_In_Home_Dir",XtRBoolean,sizeof(Boolean),XtOffsetOf(OwnRes,histhome),XtRString,"False"},
{"settings_in_home_dir","Settings_In_Home_Dir",XtRBoolean,sizeof(Boolean),XtOffsetOf(OwnRes,setthome),XtRString,"False"}
};

void WriteTime(Editor *e,XtIntervalId id)
{
  char timebuffer[100];
  time_t t;
  XmString xstr;
  struct tm *lt;
  
SP("WriteTime");
  time(&t);
  strftime(timebuffer, 100, "%d/%m/%Y %H:%M",
           localtime(&t));
  xstr=XmStringCreateLocalized(timebuffer);
  XtVaSetValues(e->clock,XmNlabelString,xstr,NULL);
  XmStringFree(xstr);
  lt=localtime(&t);
  if (lt->tm_sec>60 || lt->tm_sec<0)
    lt->tm_sec=59;
  e->tid2=XtAppAddTimeOut(app,MAX(0,(60-lt->tm_sec)*1000),(XtTimerCallbackProc)WriteTime,e);
EP;
}

void CreateEditor(Widget top)
{
  Widget mf,rc1,rc2,find,repl,aup,adown,replall;
  Widget w,_goto,lows,caps;
  Arg args[10];
  Atom atom;
  Editor *e;
  int x,n;
  
SP("CreateEditor");
  if (editors>=MAXEDITORS)
  {
    EP;
    return;
  }
    
  e=(Editor*)db_malloc(sizeof(Editor));
  editor[editors]=e;

  e->undolist=CreateList(sizeof(Undo_T));
  e->redolist=CreateList(sizeof(Undo_T));
  mf=XtVaCreateManagedWidget("mainform",xmFormWidgetClass,top,NULL);

  e->mb=XmVaCreateSimpleMenuBar(mf,"menubar",
	XmVaCASCADEBUTTON,NULL,0,
	XmVaCASCADEBUTTON,NULL,0,
	XmVaCASCADEBUTTON,NULL,0,
	XmVaCASCADEBUTTON,NULL,0,
	XmVaCASCADEBUTTON,NULL,0,
	XmVaCASCADEBUTTON,NULL,0,
	XmVaCASCADEBUTTON,NULL,0,
	XmVaCASCADEBUTTON,NULL,0,
	XmNrightAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_FORM,
	XmNtopAttachment,XmATTACH_FORM,
	NULL);

  e->filemenu=XmVaCreateSimplePulldownMenu(e->mb,"filemenu",0,file_cb,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaSEPARATOR,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaSEPARATOR,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaSEPARATOR,
	NULL);

  XmVaCreateSimplePulldownMenu(e->mb,"editmenu",1,edit_cb,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaSEPARATOR,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaSEPARATOR,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	NULL);

  XmVaCreateSimplePulldownMenu(e->mb,"optionmenu",2,option_cb,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaRADIOBUTTON,NULL,0,NULL,NULL,
	NULL);

  e->bookmarkmenu=XmVaCreateSimplePulldownMenu(e->mb,"bookmarkmenu",3,bookmark_cb,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaSEPARATOR,
	NULL);

  XmVaCreateSimplePulldownMenu(e->mb,"toolsmenu",4,tools_cb,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	NULL);

  XmVaCreateSimplePulldownMenu(e->mb,"viewmenu",5,view_cb,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	NULL);

  w=XmVaCreateSimplePulldownMenu(e->mb,"helpmenu",7,help_cb,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	XmVaSEPARATOR,
	XmVaPUSHBUTTON,NULL,0,NULL,NULL,
	NULL);

#ifndef LESSTIFF    
  if ((w=XtNameToWidget(e->mb,"button_7"))!=NULL)
    XtVaSetValues(e->mb,XmNmenuHelpWidget,w,NULL);
#endif

  XtManageChild(e->mb);

  rc1=XtVaCreateManagedWidget("toprc",xmFormWidgetClass,mf,
	XmNtopAttachment,XmATTACH_WIDGET,
	XmNtopWidget,e->mb,
	XmNleftAttachment,XmATTACH_FORM,
	XmNrightAttachment,XmATTACH_FORM,
	XmNbottomAttachment,XmATTACH_NONE,
	XmNfractionBase,10,
	NULL);

  e->rowcol=XtVaCreateManagedWidget("1:1",xmLabelGadgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_NONE,
	XmNrightAttachment,XmATTACH_FORM,
	XmNbottomAttachment,XmATTACH_FORM,
	NULL);

  w=XtVaCreateManagedWidget("DBNew",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_FORM,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_new,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)DoNew,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,False,(XtEventHandler)SmallHelp,(void*)1);
  XtAddEventHandler(w,LeaveWindowMask,False,(XtEventHandler)RemoveSmallHelp,NULL);

  w=XtVaCreateManagedWidget("DBOpen",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_open,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)DoOpen,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)2);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  e->save=XtVaCreateManagedWidget("DBSave",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_save,
	XmNlabelInsensitivePixmap,_save2,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);
  XtAddCallback(e->save,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(e->save,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)3);
  XtAddEventHandler(e->save,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  w=XtVaCreateManagedWidget("DBNewWind",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,e->save,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_newwind,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	XmNleftOffset,10,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)DoNewWindow,NULL);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)4);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  w=XtVaCreateManagedWidget("DBClone",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_clone,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)DoClone,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)5);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  w=XtVaCreateManagedWidget("DBCut",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_cut,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	XmNleftOffset,10,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)CutText,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)6);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  w=XtVaCreateManagedWidget("DBCopy",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_copy,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)CopyText,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)7);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  w=XtVaCreateManagedWidget("DBPaste",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_paste,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)PasteText,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)8);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  w=XtVaCreateManagedWidget("DBClear",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_clear,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)ClearSelection,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)9);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  w=XtVaCreateManagedWidget("DBUndo",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_undo,
	XmNlabelInsensitivePixmap,_undo2,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	XmNleftOffset,10,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)UndoAction,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)10);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);
  e->undo=w;

  w=XtVaCreateManagedWidget("DBRedo",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_redo,
	XmNlabelInsensitivePixmap,_redo2,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RedoAction,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)11);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);
  e->redo=w;

  w=XtVaCreateManagedWidget("DBCompile",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_compile,
	XmNlabelInsensitivePixmap,_compile2,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	XmNleftOffset,10,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)Compile,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)14);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);
  e->compile=w;

  w=XtVaCreateManagedWidget("DBMake",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_make,
	XmNlabelInsensitivePixmap,_make2,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)Make,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)15);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);
  e->make=w;

  w=XtVaCreateManagedWidget("DBRun",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_run,
	XmNlabelInsensitivePixmap,_run2,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)Run,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)26);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);
  e->run=w;

  w=XtVaCreateManagedWidget("DBGrep",xmDrawnButtonWidgetClass,rc1,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_grep,
	XmNlabelInsensitivePixmap,_grep2,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)Grep,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)16);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);
  e->grep=w;

  e->clock=XtNameToWidget(e->mb,"button_6");	

  XtAddCallback(e->save,XmNactivateCallback,(XtCallbackProc)Save,e);
  SetSave(e,False);

  rc2=XtVaCreateManagedWidget("bottomform",xmFormWidgetClass,mf,
	XmNtopAttachment,XmATTACH_NONE,
	XmNleftAttachment,XmATTACH_FORM,
	XmNrightAttachment,XmATTACH_FORM,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNhorizontalSpacing,0,
	XmNfractionBase,20,
	NULL);

  repl=XtVaCreateManagedWidget("Replace",xmLabelGadgetClass,rc2,
	XmNtopAttachment,XmATTACH_POSITION,
	XmNtopPosition,10,
	XmNleftAttachment,XmATTACH_FORM,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_FORM,
	XmNalignment,XmALIGNMENT_BEGINNING,
	NULL);

  find=XtVaCreateManagedWidget("Find",xmLabelGadgetClass,rc2,
	XmNtopAttachment,XmATTACH_FORM,
	XmNleftAttachment,XmATTACH_FORM,
	XmNrightAttachment,XmATTACH_OPPOSITE_WIDGET,
	XmNrightWidget,repl,
	XmNbottomAttachment,XmATTACH_POSITION,
	XmNbottomPosition,10,
	XmNalignment,XmALIGNMENT_BEGINNING,
	NULL);

  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM);n++;	
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET);n++;	
  XtSetArg(args[n],XmNleftWidget,find);n++;	
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE);n++;	
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_POSITION);n++;	
  XtSetArg(args[n],XmNbottomPosition,10);n++;	
  e->findf=CreateComboBox(rc2,"findfield",args,n,10);
  InitializeComboBox(e->findf,editor[0]->findf);
  XtAddCallback(e->findf,XmNactivateCallback,(XtCallbackProc)FindDown,e);

  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,XtParent(e->findf));n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNleftWidget,repl);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM);n++;
  e->replf=CreateComboBox(rc2,"replacefield",args,n,10);
  InitializeComboBox(e->replf,editor[0]->replf);
  XtAddCallback(e->replf,XmNactivateCallback,(XtCallbackProc)Replace,e);
  
  adown=XtVaCreateManagedWidget("DBDown",xmDrawnButtonWidgetClass,rc2,
	XmNtopAttachment,XmATTACH_POSITION,
	XmNtopPosition,1,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,XtParent(e->findf),
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_NONE,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_down,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	XmNleftOffset,2,
	NULL);

  XtAddCallback(adown,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(adown,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)17);
  XtAddEventHandler(adown,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);
  XtAddCallback(adown,XmNactivateCallback,(XtCallbackProc)FindDown,e);

  aup=XtVaCreateManagedWidget("DBUp",xmDrawnButtonWidgetClass,rc2,
	XmNtopAttachment,XmATTACH_POSITION,
	XmNtopPosition,1,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,adown,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_NONE,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_up,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(aup,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(aup,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)18);
  XtAddEventHandler(aup,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);
  XtAddCallback(aup,XmNactivateCallback,(XtCallbackProc)FindUp,e);

  adown=XtVaCreateManagedWidget("DBDown2",xmDrawnButtonWidgetClass,rc2,
	XmNtopAttachment,XmATTACH_POSITION,
	XmNtopPosition,11,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,XtParent(e->replf),
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_NONE,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_down,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	XmNleftOffset,2,
	NULL);

  XtAddEventHandler(adown,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)19);
  XtAddEventHandler(adown,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);
  XtAddCallback(adown,XmNactivateCallback,(XtCallbackProc)Replace,e);
  XtAddCallback(adown,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);

  replall=XtVaCreateManagedWidget("DBDown3",xmDrawnButtonWidgetClass,rc2,
	XmNtopAttachment,XmATTACH_POSITION,
	XmNtopPosition,11,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,adown,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_NONE,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_down2,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddEventHandler(replall,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)20);
  XtAddEventHandler(replall,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);
  XtAddCallback(replall,XmNactivateCallback,(XtCallbackProc)ReplaceAll,e);
  XtAddCallback(replall,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);

  w=XtVaCreateManagedWidget("DBLeft",xmDrawnButtonWidgetClass,rc2,
	XmNtopAttachment,XmATTACH_POSITION,
	XmNtopPosition,1,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,aup,
	XmNleftOffset,10,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_NONE,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_left,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	XmNleftOffset,10,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)ShiftLeft,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)12);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  w=XtVaCreateManagedWidget("DBRight",xmDrawnButtonWidgetClass,rc2,
	XmNtopAttachment,XmATTACH_POSITION,
	XmNtopPosition,1,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_NONE,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_right,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)ShiftRight,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)13);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  caps=XtVaCreateManagedWidget("Caps",xmDrawnButtonWidgetClass,rc2,
  	XmNlabelType,XmPIXMAP,
  	XmNlabelPixmap,_caps,
	XmNtopAttachment,XmATTACH_POSITION,
	XmNtopPosition,1,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNleftOffset,10,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_NONE,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);
  XtAddCallback(caps,XmNactivateCallback,(XtCallbackProc)CapsSelection,e);
  XtAddCallback(caps,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(caps,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)21);
  XtAddEventHandler(caps,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  lows=XtVaCreateManagedWidget("Lows",xmDrawnButtonWidgetClass,rc2,
  	XmNlabelType,XmPIXMAP,
  	XmNlabelPixmap,_lows,
	XmNtopAttachment,XmATTACH_POSITION,
	XmNtopPosition,1,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,caps,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_NONE,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);
  XtAddCallback(lows,XmNactivateCallback,(XtCallbackProc)LowsSelection,e);
  XtAddCallback(lows,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(lows,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)22);
  XtAddEventHandler(lows,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  _goto=XtVaCreateManagedWidget("Goto",xmDrawnButtonWidgetClass,rc2,
	XmNtopAttachment,XmATTACH_POSITION,
	XmNtopPosition,11,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,replall,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_NONE,
	XmNleftOffset,10,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_gotoline,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);
  XtAddCallback(_goto,XmNactivateCallback,(XtCallbackProc)GotoLine,e);
  XtAddCallback(_goto,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(_goto,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)27);
  XtAddEventHandler(_goto,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);
	
  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNtopPosition,10);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNleftWidget,_goto);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM);n++;
  e->gotofield=CreateComboBox(rc2,"gotofield",args,n,10);
  InitializeComboBox(e->gotofield,editor[0]->gotofield);
  XtAddCallback(e->gotofield,XmNactivateCallback,(XtCallbackProc)GotoLine,e);

  w=XtVaCreateManagedWidget("DBSetMarker",xmDrawnButtonWidgetClass,rc2,
	XmNtopAttachment,XmATTACH_POSITION,
	XmNtopPosition,1,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,lows,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_NONE,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_setmarker,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	XmNleftOffset,10,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)SetMarker,e);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)23);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);

  w=XtVaCreateManagedWidget("DBGotoMarker",xmDrawnButtonWidgetClass,rc2,
	XmNtopAttachment,XmATTACH_POSITION,
	XmNtopPosition,1,
	XmNleftAttachment,XmATTACH_WIDGET,
	XmNleftWidget,w,
	XmNrightAttachment,XmATTACH_NONE,
	XmNbottomAttachment,XmATTACH_NONE,
	XmNlabelType,XmPIXMAP,
	XmNlabelPixmap,_gotomarker,
	XmNlabelInsensitivePixmap,_gotomarker2,
	XmNhighlightThickness,1,
	XmNpushButtonEnabled,True,
	NULL);

  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveSmallHelp,(void*)1);
  XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)GotoMarker,e);
  XtAddEventHandler(w,EnterWindowMask,True,(XtEventHandler)SmallHelp,(void*)24);
  XtAddEventHandler(w,LeaveWindowMask,True,(XtEventHandler)RemoveSmallHelp,(void*)0);


  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,rc1);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNbottomWidget,rc2);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNeditMode,XmMULTI_LINE_EDIT);n++;
/*  XtSetArg(args[7],XmNtranslations,XtParseTranslationTable(translations));*/
  e->text=XmCreateScrolledText(mf,"text",args,n);
  XtManageChild(e->text);
 
  e->tmpsource=XtVaCreateWidget("tmpsource",xmTextWidgetClass,mf,NULL);

  XtAddCallback(e->text,XmNvalueChangedCallback,(XtCallbackProc)ValueChanged,e);
  XtAddCallback(e->text,XmNmotionVerifyCallback,(XtCallbackProc)FindRowCol,e);
  XtAddCallback(e->text,XmNmodifyVerifyCallback,(XtCallbackProc)DeleteText,e);

  e->pm=XmVaCreateSimplePopupMenu(e->text/*mf*/,"Popup",(XtCallbackProc)popup_cb,
	XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
	XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
	XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
	XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
	XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
	XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
	XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
	NULL);

  for (x=0;x<fl_size;x++)
  {	
    e->filelist[x]=XtVaCreateManagedWidget("filebutton",
     xmPushButtonGadgetClass,e->filemenu,NULL);
    XtAddCallback(e->filelist[x],XmNactivateCallback,(XtCallbackProc)OpenOldFile,(void*)e);
  }
  atom=XmInternAtom(XtDisplay(top),"WM_DELETE_WINDOW",False);
  XmAddWMProtocolCallback(top,atom,(XtCallbackProc)Quit,e);

  XtVaSetValues(top,XmNiconPixmap,pixmap,NULL);

  NoUndo(e);
  e->shell=top;
  e->ats=NULL;
  e->fd=NULL;
  e->iod=NULL;
  e->saved=1;
  e->fs=NULL;
  e->undosize=0;
  e->changes=0;
  e->lastaction=0;
  e->redosize=0;
  e->le=NULL;
  e->se=NULL;
  e->sd=NULL;
  e->err=NULL;
  e->ato=NULL;
  e->gd=NULL;
  e->filename[0]='\0';
  e->tid2=0;
  e->tid3=0;
  e->tid4=0;
  e->tid5=0;
  e->tid6=0;
  e->tid7=0;
  db_strcpy(e->print_command,"lpr");
  db_strcpy(e->compile_command,"cc -c %s");
  db_strcpy(e->make_command,"make");
  db_strcpy(e->run_command,"");
  e->auto_indent=1;
  e->undolevels=100;
  e->tid=0;
  e->workcount=0;
  e->locked=0;
  e->read_only=0;
  e->abd=NULL;
  e->std=NULL;
  e->oldsource=0;
  e->t.pid=0;
  e->new_window=0;
  e->blockundo=1;
  e->autosave=0;
  e->autosavetimeout=5;
  e->ce_count=0;
  e->compiler_error=NULL;
  WriteTime(e,0);
  LoadSettings(e);
  RemoveMarker(e);
  UpdateEditorBookmarks(e);
  editors++;
  UpdateFileList(NULL);
  UpdateEditorDialog();
EP;
}

void CreateNewEditor(void)
{
  Widget shell;
  
SP("CreateNewEditor");
  shell=XtVaAppCreateShell("jex","Jex",topLevelShellWidgetClass,XtDisplay(top),
  	XmNallowShellResize,True,
  	NULL);
  CreateEditor(shell);
  XtVaSetValues(shell,XmNallowShellResize,False,NULL);
  XtPopup(shell,XtGrabNone);
  SetCurrentWidget(editor[editors-1]->text);
EP;
}

int main(argc,argv)
int argc;
char *argv[];
{
  XtActionsRec actions[2];
  int x,y=0;
  Pixel fg,bg;

SP("main");
  top=XtVaAppInitialize(&app,"Jex",NULL,0,&argc,argv,fallbacks,NULL);
  XtGetApplicationResources(top,&ownres,resources,XtNumber(resources),NULL,0);

  combo1=CreateComboBox(NULL,"FSFilterField",NULL,0,10);
  InitializeComboBox(combo1,NULL);
  combo2=CreateComboBox(NULL,"FSFilterDirField",NULL,0,10);
  InitializeComboBox(combo2,NULL);
  combo3=CreateComboBox(NULL,"FSSelectionField",NULL,0,10);
  InitializeComboBox(combo3,NULL);
  combo4=CreateComboBox(NULL,"GrepPattern",NULL,0,10);
  InitializeComboBox(combo4,NULL);
  combo5=CreateComboBox(NULL,"GrepFiles",NULL,0,10);
  InitializeComboBox(combo5,NULL);
  combo6=CreateComboBox(NULL,"GrepReplaceField",NULL,0,10);
  InitializeComboBox(combo6,NULL);

  actions[0].string="PopupMenu";
  actions[0].proc=(XtActionProc)PopupMenu;
  actions[1].string="delete-line";
  actions[1].proc=(XtActionProc)DeleteLine;
  XtAppAddActions(app,actions,2);

  pixmap=CreatePixmapFromXPM(top,jex_xpm);
 /* pixmap=XCreatePixmapFromBitmapData(XtDisplay(top),
		RootWindowOfScreen(XtScreen(top)),
		jex_bits,jex_width,jex_height,
		BlackPixelOfScreen(XtScreen(top)),
		WhitePixelOfScreen(XtScreen(top)),
		DefaultDepthOfScreen(XtScreen(top)));
*/

  XtVaGetValues(top,XmNforeground,&fg,XmNbackground,&bg,NULL);
  lov=XCreatePixmapFromBitmapData(XtDisplay(top),
		RootWindowOfScreen(XtScreen(top)),
		(char*)lov_bits,lov_width,lov_height,
		BlackPixelOfScreen(XtScreen(top)),bg,
		DefaultDepthOfScreen(XtScreen(top)));

  _new=CreatePixmapFromXPM(top,new_data);
  _open=CreatePixmapFromXPM(top,open_data);
  _save=CreatePixmapFromXPM(top,save_data);
  _save2=CreatePixmapFromXPM(top,save2_data);
  _clear=CreatePixmapFromXPM(top,clear_data);
  _clone=CreatePixmapFromXPM(top,clone_data);
  _compile=CreatePixmapFromXPM(top,compile_data);
  _copy=CreatePixmapFromXPM(top,copy_data);
  _cut=CreatePixmapFromXPM(top,cut_data);
  _grep=CreatePixmapFromXPM(top,grep_data);
  _left=CreatePixmapFromXPM(top,left_data);
  _make=CreatePixmapFromXPM(top,make_data);
  _newwind=CreatePixmapFromXPM(top,newwind_data);
  _paste=CreatePixmapFromXPM(top,paste_data);
  _redo=CreatePixmapFromXPM(top,redo_data);
  _right=CreatePixmapFromXPM(top,right_data);
  _undo=CreatePixmapFromXPM(top,undo_data);
  _undo2=CreatePixmapFromXPM(top,undo2_data);
  _redo2=CreatePixmapFromXPM(top,redo2_data);
  _compile2=CreatePixmapFromXPM(top,compile2_data);
  _make2=CreatePixmapFromXPM(top,make2_data);
  _grep2=CreatePixmapFromXPM(top,grep2_data);
  _up=CreatePixmapFromXPM(top,up_data);
  _down=CreatePixmapFromXPM(top,down_data);
  _caps=CreatePixmapFromXPM(top,caps_data);
  _lows=CreatePixmapFromXPM(top,lows_data);
  _setmarker=CreatePixmapFromXPM(top,setmarker_data);
  _gotomarker=CreatePixmapFromXPM(top,gotomarker_data);
  _gotomarker2=CreatePixmapFromXPM(top,gotomarker2_data);
  _down2=CreatePixmapFromXPM(top,down2_data);
  _run=CreatePixmapFromXPM(top,run_data);
  _run2=CreatePixmapFromXPM(top,run2_data);
  _gotoline=CreatePixmapFromXPM(top,gotoline_data);

  CreateBookmarkDialog();
  StartEditor();
  CreateEditor(top);

  XtRealizeWidget(top);
  SetCurrentWidget(editor[editors-1]->text);
  for (x=1;x<argc;x++)
  {
    if (argv[x][0]!='-' && !y)
    {
      loadfile(editor[0],argv[1],0,2);
/*      db_strcpy(editor[0]->filename,argv[1]);
      SetTitle(editor[0],editor[0]->filename);*/
      y=1;
    }
    else if (argv[x][0]!='-' && y)
    {
      CreateNewEditor();
   /*   db_strcpy(editor[editors-1]->filename,argv[x]);
      SetTitle(editor[editors-1],editor[editors-1]->filename);*/
      loadfile(editor[editors-1],argv[x],0,1);
    }
  }
  UpdateEditorDialog();

  XtAppMainLoop(app);
EP;
  return 0;
}

jex-1.3.7/jexappl.c100644      0      0       36501  6672726721  12242 0ustar  rootroot#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <ctype.h>
#include <sys/stat.h>
#include <Xm/Text.h>
#include <Xm/TextStrSoP.h>
#include <Xm/PushBG.h>
#include "jex.h"
#include "helpstack.h"

#define READSIZE 250000

extern Widget top,bdl,combo1,combo2,combo3,combo4,combo5,combo6;
extern XtAppContext app;
void Terminate();
extern int fl_size;
extern char fl_files[FILELIST][255];
extern OwnRes ownres;
extern List help_topics;
extern HStack *hst;
extern List l;

void SetSave(Editor *e,Boolean enabled)
{
  SP("SetSave");
  XtVaSetValues(e->save,XmNsensitive,enabled,NULL);
  EP;
}

void SetCurrentWidget(Widget w)
{
  Widget tmp;
  
  SP("SetCurrentWidget");
  tmp=w;
  while (!XtIsShell(tmp))
    tmp=XtParent(tmp);
  XmProcessTraversal(tmp,XmTRAVERSE_CURRENT);
  XmProcessTraversal(w,XmTRAVERSE_CURRENT);
  EP;
}

void SetMarker(Widget w,Editor *e,void *cbs)
{
  SP("SetMarker");
  e->marker=XmTextGetInsertionPosition(e->text);
  XtVaSetValues(XtNameToWidget(e->mb,"*editmenu.button_12"),XmNsensitive,True,NULL);
  XtVaSetValues(XtNameToWidget(e->shell,"*DBGotoMarker"),XmNsensitive,True,NULL);
  SetCurrentWidget(e->text);
  EP;
}
 
void GotoMarker(Widget w,Editor *e,void *cbs)
{
  SP("GotoMarker");
  if (e->marker!=-1)
  {
    XmTextSetInsertionPosition(e->text,e->marker);   
    XmTextShowPosition(e->text,e->marker);
  }
  SetCurrentWidget(e->text);
  EP;
}

void RemoveMarker(Editor *e)
{
  SP("RemoveMarker");
  e->marker=-1;
#ifndef LESSTIFF    
  XtVaSetValues(XtNameToWidget(e->mb,"*editmenu.button_12"),XmNsensitive,False,NULL);
  XtVaSetValues(XtNameToWidget(e->shell,"*DBGotoMarker"),XmNsensitive,False,NULL);
#endif
  EP;
}

int CheckEditor(Editor *e)
{
  int x;
  
SP("CheckEditor");
  for (x=0;x<editors;x++)
  {
    if (editor[x]==e)
    {
      EP;
      return 1;
    }
  }
  EP;
  return 0;
}

void UnlinkFile(Editor *e)
{
  char file[255];
  
SP("UnlinkFile");
  WatchCursor(e,1);
  if (e->filename[0])
  {
    sprintf(file,"%s~",e->filename);
    unlink(file);
  }
  WatchCursor(e,0);
EP;
}

void StartEditor(void)
{
  FILE *f;
  int x,y,z,n,w,v,vc;
  char str[255],ini[255],*param,*home,file[255];
  
SP("StartEditor");
/*  signal(SIGQUIT,Terminate);
  signal(SIGILL,Terminate);
  signal(SIGTRAP,Terminate);
  signal(SIGIOT,Terminate);
  signal(SIGFPE,Terminate);
  signal(SIGKILL,Terminate);
  signal(SIGBUS,Terminate);
  signal(SIGSEGV,Terminate);
  signal(SIGTERM,Terminate);
  signal(SIGHUP,Terminate);
  signal(SIGSTOP,SIG_IGN);
  signal(SIGINT,Terminate);
  signal(SIGIO,SIG_IGN);
  signal(SIGPIPE,SIG_IGN);
  signal(SIGUSR1,SIG_IGN);
  signal(SIGUSR2,SIG_IGN);
  signal(SIGPROF,SIG_IGN);
  signal(SIGABRT,Terminate);*/
  DBInit("jex","jex.log",0,Terminate);
  db_debug_mode=0;
  if ((int)ownres.histhome)
  {
    home=getenv("HOME");
    if (home)
      sprintf(file,"%s/.jexhistory",home);
    else
      db_strcpy(file,".jexhistory");
  }
  else
    db_strcpy(file,".jexhistory");
  if ((f=fopen(file,"r"))==NULL)
  {
    EP;
    return;
  }
  x=0;
  y=0;
  z=0;
  w=0;
  v=0;
  vc=0;
  while (fgets(str,255,f))
  {
    str[db_strlen(str)-1]='\0';
    n=sscanf(str,"%s",ini);
    n=2;
    param=&str[db_strlen(ini)+1];
    if (db_strcmp(ini,"file:")==0 && x<FILELIST)
    {
      db_strcpy(fl_files[x],param);
      if (fl_files[x][0])
        x++;
    }
    else if (db_strcmp(ini,"bookmark:")==0)
    {
      AddBookmark(param);
    }
    else if (db_strcmp(ini,"version:")==0)
    {
      CheckVersion(param);
      vc=1;
    }
    else if (n==1 && x<FILELIST)
    {
      db_strcpy(fl_files[x],ini);
      if (fl_files[x][0])
        x++;
    }
  }
  if (!vc)
    ShowVersion();
  fl_size=x;
  fclose(f);    
EP;
}

void StopEditor(void)
{
  FILE *f;
  int x;
  char *home,file[255],*str;
  int count;
  XmStringTable items;
  HelpTopic ht;

SP("StopEditor");
  if (ownres.histhome)
  {
    home=getenv("HOME");
    if (home)
      sprintf(file,"%s/.jexhistory",home);
    else
      db_strcpy(file,".jexhistory");
  }
  else
    db_strcpy(file,".jexhistory");
  if ((f=db_fopen(file,"w+"))==NULL)
  {
    EP;
    return;
  }
  fprintf(f,"version: %d.%d.%d\n",MAJOR_VERSION,MINOR_VERSION,SUB_MINOR_VERSION);
  for (x=0;x<fl_size;x++)
    fprintf(f,"file: %s\n",fl_files[x]);
  CopyComboBoxToFile(combo1,f);
  CopyComboBoxToFile(combo2,f);
  CopyComboBoxToFile(combo3,f);
  CopyComboBoxToFile(combo4,f);
  CopyComboBoxToFile(combo5,f);
  CopyComboBoxToFile(combo6,f);
  CopyComboBoxToFile(editor[0]->findf,f);
  CopyComboBoxToFile(editor[0]->replf,f);
  CopyComboBoxToFile(editor[0]->gotofield,f);
  XtVaGetValues(bdl,XmNitemCount,&count,XmNitems,&items,NULL);
  for (x=0;x<count;x++)
  {
    XmStringGetLtoR(items[x],XmSTRING_DEFAULT_CHARSET,&str);
    fprintf(f,"bookmark: %s\n",str);
    XtFree(str);
  }
  db_fclose(f);   
  DisposeList(l);
  if (GetFirstElement(help_topics,&ht))
  {
    do
    {
      DisposeList(ht.list);
    } while (GetNextElement(help_topics,&ht));
  }
  DisposeList(help_topics);
  DestroyHStack(hst);
EP;
}

void Exit(Editor *e)
{
  int x,y;
  char file[255];
  
SP("Exit");
  db_strcpy(file,e->filename);
  UnlinkFile(e);
  for (x=0;x<editors;x++)
  {
    if (editor[x]->shell==e->shell)
    {
      XtRemoveAllCallbacks(e->text,XmNvalueChangedCallback);
      XtRemoveAllCallbacks(e->text,XmNmotionVerifyCallback);
      XtRemoveAllCallbacks(e->text,XmNmodifyVerifyCallback);
MP;      XtUnmapWidget(e->shell); 
MP;      XtPopdown(e->shell);
      if (e->iod)
/*        XtUnmanageChild(e->iod);*/
MP,	XtPopdown(e->iod);
      if (e->fs)
MP,        XtUnmanageChild(e->fs);
      if (e->ats)
MP,        XtUnmanageChild(e->ats);
      if (e->fd)
MP,        XtUnmanageChild(e->fd);
      if (e->le)
MP,        XtUnmanageChild(e->le);
      if (e->se)
MP,        XtUnmanageChild(e->se);
      if (e->std)
MP,        XtUnmanageChild(e->std);
      if (e->tid)
MP,        XtRemoveTimeOut(e->tid);
      if (e->tid2)
MP,        XtRemoveTimeOut(e->tid2);
      if (e->tid3)
MP,        XtRemoveTimeOut(e->tid3);
      if (e->tid4)
MP,      XtRemoveTimeOut(e->tid4);
      if (e->tid5)
MP,      XtRemoveTimeOut(e->tid5);
      if (e->tid6)
MP,      XtRemoveTimeOut(e->tid6);
      if (e->tid7)
MP,      XtRemoveTimeOut(e->tid7);
      if (e->t.pid)
      {
MP,     RemoveInputs(e,NULL);
MP,     kill(e->t.pid,SIGKILL);
      }
    if (e->oldsource)
    {
      XmTextSetSource(e->text,XmTextGetSource(e->tmpsource),0,0);
      XtDestroyWidget(e->tmpsource);
      e->tmpsource=XtVaCreateWidget("tmpsource",xmTextWidgetClass,XtParent(XtParent(e->text)),NULL);
      e->oldsource=0;
    }
MP; if (e->ce_count)
    {
      for (y=0;y<e->ce_count;y++)
        db_free(e->compiler_error[y]);
      db_free(e->compiler_error);
      e->compiler_error=NULL;
      e->ce_count=0;
    }    
MP,   XtVaSetValues(e->text,XmNvalue,"",NULL);
MP,   NoUndo(e);
/*      XtDestroyWidget(XtParent(XtParent(e->text)));*/
MP,   DisposeList(e->undolist);
MP,   DisposeList(e->redolist);
      if (editors==1)
        StopEditor();
MP,   db_free((char*)editor[x]);
      if (x<editors-1)
MP,     db_memmove(&editor[x],&editor[x+1],(editors-x-1)*sizeof(Editor*));
MP,   editors--;
MP,   UpdateEditorDialog();
      if (file[0])
MP,     UpdateFileList(file);
      break;
    }
  }
  if (!editors)
  {
/*MP,    StopEditor();*/
       DestroyAllComboBoxes();
MP,    exit(0);
  }
EP;
}

void GetFullFileName(char *file)
{
  char cdir[255],name[255],path[255];
  
SP("GetFullFileName");
  if (file && file[0]=='/')
  {
    EP;
    return;
  }
  db_getcwd(cdir,255);
  SplitPath(file,path,name);
  db_chdir(path);
  db_getcwd(path,255);
  if (path[db_strlen(path)-1]=='/')
    sprintf(file,"%s%s",path,name);
  else
    sprintf(file,"%s/%s",path,name);
  db_chdir(cdir);
EP;
}

void DetachEditor(Editor *e,char* file)
{
SP("DetachEditor");
  if (e->oldsource)
  {
    XmTextSetSource(e->text,XmTextGetSource(e->tmpsource),0,0);
    XtDestroyWidget(e->tmpsource);
    e->tmpsource=XtVaCreateWidget("tmpsource",xmTextWidgetClass,XtParent(XtParent(e->text)),NULL);
    e->oldsource=0;
    if (file)
      loadfile(e,file,0,0);
  }
EP;
}

int loadfile(Editor *e,char *fl,int insert,int setname)
{
  char *str,file[255];
  FILE *f;
  int i,x;
  XmTextPosition pos;
  struct stat sbuf;
  
SP("loadfile");
  db_strcpy(file,fl);
  GetFullFileName(file);
  if ((f=db_fopen(file,"r"))==NULL)
  {
    if (setname==2)
    {
      db_strcpy(e->filename,file);
      SetTitle(e,e->filename);
    }
    SetCurrentWidget(e->text);
EP;
    return 1;
  }
  if (db_stat(file,&sbuf)<0)
  {
    if (db_lstat(file,&sbuf)<0)
    {
      if (setname==2)
      {
        db_strcpy(e->filename,file);
        SetTitle(e,e->filename);
      }
      db_fclose(f);
      SetCurrentWidget(e->text);
      EP;
      return 1;
    }
  }
  if ((sbuf.st_mode&S_IFMT)==S_IFDIR)
  {
    db_fclose(f);
    EP;
    SetCurrentWidget(e->text);
    return 2;
  }
  WatchCursor(e,1);
  if (e->filename[0])
    UpdateFileList(e->filename);
  str=(char*)db_malloc(READSIZE+1);
  if (insert)
    pos=XmTextGetInsertionPosition(e->text);
  else
  {
    DetachEditor(e,file);
    XtVaSetValues(e->text,XmNvalue,"",NULL);
    pos=0;
  }    
  if (!insert)
    XtRemoveAllCallbacks(e->text,XmNmodifyVerifyCallback);
  XtUnmanageChild(e->text);
  do
  {
    i=db_fread(str,1,READSIZE,f);
    str[i]='\0';
    XmTextInsert(e->text,pos,str);
    pos+=i;
  } while (i==READSIZE);
  XtManageChild(e->text);
  if (!insert)
    XtAddCallback(e->text,XmNmodifyVerifyCallback,(XtCallbackProc)DeleteText,e);
  db_free(str);
  db_fclose(f);
  UnlinkFile(e);
  if (!insert)
  {
    NoUndo(e);
    XmTextSetInsertionPosition(e->text,0);
    XmTextShowPosition(e->text,0);
    e->saved=1;
/*    XtUnmanageChild(e->save);*/
    SetSave(e,False);
    for (x=0;x<editors;x++)
    {
      if (editor[x]!=e && db_strcmp(editor[x]->filename,file)==0)
      {
        XmTextSetSource(e->tmpsource,XmTextGetSource(e->text),0,0);
        XmTextSetSource(e->text,XmTextGetSource(editor[x]->text),0,0);
        e->oldsource=1;
        editor[x]->oldsource=1;
        break;
      }
    }
  }
  if (setname)
  {
    db_strcpy(e->filename,file);
    SetTitle(e,e->filename);
  }
  WatchCursor(e,0);
  SetCurrentWidget(e->text);
EP;
  return 0;
}

int savefile(Editor *e,char *file,char *str)
{
  FILE *f;
  char save[512];
  
SP("savefile");
  if (e->read_only)
  {
    EP;
    return 0;
  }
  WatchCursor(e,1);
  if ((f=fopen(file,"r"))!=NULL)
  {
    fclose(f);
    sprintf(save,"%s~",file);
    if ((f=fopen(save,"w+"))!=NULL)
    {
      fclose(f);
      sprintf(save,"cp %s %s~",file,file);
      system(save);
    }
  }
  if ((f=db_fopen(file,"w+"))==NULL)
  {
    WatchCursor(e,0);
    EP;
    return 0;
  }
  if (db_fwrite(str,1,db_strlen(str),f)!=db_strlen(str))
  {
    db_fclose(f);
    WatchCursor(e,0);
    EP;
    return 0;
  }
  db_fclose(f);
  db_strcpy(e->filename,file);
  WatchCursor(e,0);
EP;
  return 1;
}

void CopyFile(char *s,char *t)
{
  char str[255];
  
SP("CopyFile");
  sprintf(str,"cp %s %s",s,t);
  system(str);
EP;
}

void NoHighlight(Editor *e,void *id)
{
SP("NoHighlight");
  XmTextSetHighlight(e->text,0,XmTextGetLastPosition(e->text),XmHIGHLIGHT_NORMAL);
  e->tid5=0;
EP;
}

void GotoLine(Widget w,Editor *e,void *cbs)
{
  int line,x,l=2,len,left;
  char *linestr,*str;

SP("GotoLine");
  WatchCursor(e,1);
#ifdef FAST_GET_TEXT_VALUE
  XmTextSource ts;
  ts=XmTextGetSource(e->text);
  str=((XmTextSourceRec*)ts)->data->ptr;
#else
  XtVaGetValues(e->text,XmNvalue,&str,NULL);  
#endif  
  XtVaGetValues(e->gotofield,XmNvalue,&linestr,NULL);
  for (x=0;x<editors;x++)
    UpdateComboBox(editor[x]->gotofield,linestr);
  line=atoi(linestr);
  XtFree(linestr);
#ifdef FAST_GET_TEXT_VALUE
  len=((XmTextSourceRec*)ts)->data->length;
#else
  len=db_strlen(str);
#endif
  if (line==1)
  {
    XmTextShowPosition(e->text,0);
    XmTextSetInsertionPosition(e->text,0);
#ifndef FAST_GET_TEXT_VALUE  
    XtFree(str);
#endif  
    left=0;
    x=left+1;
    if (str[left]!='\n')
    {
      while (x<len && str[x]!='\n')
        x++;
    }
    XmTextSetHighlight(e->text,left,x,XmHIGHLIGHT_SELECTED);
    e->tid5=XtAppAddTimeOut(app,1000,(XtTimerCallbackProc)NoHighlight,e);
    WatchCursor(e,0);
EP;
    return;
  }
  for (x=0;x<len;x++)
  {
    if (str[x]=='\n')
    {
      if (l==line || line==1)
      {
        XmTextShowPosition(e->text,(x==0)?0:(x+1));
        XmTextSetInsertionPosition(e->text,(x==0)?0:(x+1));
        left=(x==0)?0:(x+1);
        x=left+1;
        if (str[left]!='\n')
        {
          while (x<len && str[x]!='\n')
            x++;
        }
        XmTextSetHighlight(e->text,left,x,XmHIGHLIGHT_SELECTED);
        e->tid5=XtAppAddTimeOut(app,1000,(XtTimerCallbackProc)NoHighlight,e);
        break;
      }      
      l++;
    }
  }
#ifndef FAST_GET_TEXT_VALUE  
  XtFree(str);
#endif  
  SetCurrentWidget(e->text);
  WatchCursor(e,0);
EP;
}

void CalcRowCol(Editor *e,void *ti)
{
  int x=0,l=1,c=1,y=0,col=0;
  char cstr[20],*str;
  XmString xstr;
  XmTextPosition f;
 
#ifdef FAST_GET_TEXT_VALUE
  XmTextSource ts;
SP("CalcRowCol");
  if (!CheckEditor(e))
  {
    Log("Reference to Unknown editor");
    return;
  }
  ts=XmTextGetSource(e->text);
  str=((XmTextSourceRec*)ts)->data->ptr;
#else
SP("CalcRowCol");
  if (!CheckEditor(e))
  {
    Log("Reference to Unknown editor");
    return;
  }
  XtVaGetValues(e->text,XmNvalue,&str,NULL);
#endif
  f=XmTextGetInsertionPosition(e->text);
  for (x=0;x<f;x++)
  {
    if (str[x]=='\n')
    {
      l++;
      y=x+1;
    }
  }
/*  for (x=f-1;x>=0 && str[x]!='\n';x--)
    c++;*/
  for (x=y;x<f;x++)
  {
    if (str[x]=='\t')
    {
      c+=8-col%8;
      col=0;
    }
    else
    {
      c++;
      col++;
    }
  }
  sprintf(cstr,"%d:%d",l,c);
  xstr=XmStringCreateLocalized(cstr);
  XtVaSetValues(e->rowcol,XmNlabelString,xstr,NULL);
  XmStringFree(xstr);
#ifndef FAST_GET_TEXT_VALUE
  XtFree(str);
#endif
  e->tid6=0;
EP;
}

void FindRowCol(Widget w,Editor *e,XmTextVerifyCallbackStruct *cbs)
{
SP("FindRowCol");
  if (e->tid6)
    XtRemoveTimeOut(e->tid6);
  e->tid6=XtAppAddTimeOut(app,250,(XtTimerCallbackProc)CalcRowCol,e);
EP;
}
      
void printfile(Editor *e,char *file)
{
  char lpstr[255];
  
SP("printfile");
  WatchCursor(e,1);
  sprintf(lpstr,"%s %s",e->print_command,file);
  system(lpstr);
  WatchCursor(e,0);
EP;
}

void Terminate(int sig)
{
  char *str;
  int x,y;
  
/*  printf("jex: Terminating on signal %d...\n\n",sig);*/
  StopEditor();
  for (x=0;x<editors;x++)
  {
    if (!editor[x]->saved)
    {
      str=XmTextGetString(editor[x]->text);
      if (editor[x]->filename[0]=='\0')
        db_strcpy(editor[x]->filename,tempnam(".","jex"));
      else
        db_strcat(editor[x]->filename,".rescue");
      if (savefile(editor[x],editor[x]->filename,str)!=0)
      {
        printf("A copy of your edit file has been saved to '%s'\n",editor[x]->filename);
        db_strcat(editor[x]->filename,"~");
        unlink(editor[x]->filename);
      }
      else
        printf("Sorry, but I was unable to save a copy of your edit file!\n");
      XtFree(str);
    }
    if (editor[x]->ce_count)
    {
      for (y=0;y<editor[x]->ce_count;y++)
        db_free(editor[x]->compiler_error[y]);
      db_free(editor[x]->compiler_error);
    }    
    NoUndo(editor[x]);
    DisposeList(editor[x]->undolist);
    DisposeList(editor[x]->redolist);
    db_free((char*)editor[x]);
  }
  DestroyAllComboBoxes();
  printf("\nPlease send a copy of the file jex.log to: jbosman@village.uunet.be\n");
  printf("                                       or: jbosma@fercomsys.be\n");
  printf("and describe what you were doing to make jex crash.\n");
/*  exit(sig);*/
}

jex-1.3.7/list.c100644      0      0       27347  6672726720  11561 0ustar  rootroot/* LIST.C
   Author     : Jorgen Bosman.
   Last update: 13-04-1994
*/

#include "list.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "jbdbg.h"

#define debug 0

#if debug==1
#define Debug(l,s) VisualizeList(l,s)
#else
#define Debug(l,s)
#endif

typedef struct ListEl {
		 void *element;
		 struct ListEl *next;
		 struct ListEl *prev;
	       } ListElem;

typedef struct {
		 unsigned el_size;
		 ListElem *first;
		 ListElem *last;
		 ListElem *current;
	       } ListDef;

typedef ListDef *_List;

void VisualizeList(List l,char *str)
{
  ListElem *ptr,*ptr2;
  int x=0;

  printf("\n%s:\n  ",str);
  if (!l || !((_List)l)->first)
    printf("List empty");
  else
  {
    ptr=ptr2=((_List)l)->first;
    printf("F");
    if (ptr==((_List)l)->current)
      printf("C");
    if (ptr==((_List)l)->last)
      printf("L");
    printf("%d",*(int*)ptr->element);
    while (ptr->next)
    {
      x++;
      ptr=ptr->next;
      if (ptr->prev==ptr2)
	printf("<-");
      if (ptr2->next==ptr)
	printf("->");
      if (ptr==((_List)l)->current)
	printf("C");
      if (ptr==((_List)l)->last)
	printf("L");
      printf("%d",*(int*)ptr->element);
      ptr2=ptr;
    }
  }
printf("\n");
}

List CreateList(unsigned el_size)
{
  _List l;

SP("CreateList");
  if ((l=(ListDef *)db_malloc(sizeof(ListDef)))!=NULL)
  {
    l->first=NULL;
    l->last=NULL;
    l->current=NULL;
    l->el_size=el_size;
  }
  Debug(l,"Createlist");
EP;
  return (List)l;
}


int ListEmpty(List list)
{
  Debug(list,"ListEmpty");
  return (list==NULL || ((_List)list)->first==NULL);
}

int AddElement(List l,void *element)
{
SP("AddElement");
  Debug(l,"AddElement start");
  if (!l)
  {
    EP;
    return 0;
  }
  if (NULL==((_List)l)->last)
  {
    if ((((_List)l)->last=(ListElem*)db_malloc(sizeof(ListElem)))==NULL)
    {
      EP;
      return 0;
    }
    ((_List)l)->first=((_List)l)->last;
    ((_List)l)->last->prev=NULL;
  }
  else
  {
    if ((((_List)l)->last->next=(ListElem*)db_malloc(sizeof(ListElem)))==NULL)
    {
      EP;
      return 0;
    }
    ((_List)l)->last->next->prev=((_List)l)->last;
    ((_List)l)->last=((_List)l)->last->next;
  }
  if ((((_List)l)->last->element=db_malloc(((_List)l)->el_size))==NULL)
  {
    EP;
    return 0;
  }
  ((_List)l)->last->element=db_memcpy(((_List)l)->last->element,element,((_List)l)->el_size);
  ((_List)l)->last->next=NULL;
  ((_List)l)->current=((_List)l)->last;
  Debug(l,"AddElement end");
  EP;
  return 1;
}

int AddFirstElement(List l,void *element)
{
SP("AddFirstElement");
  Debug(l,"AddFirstElement start");
  if (!l)
  {
    EP;
    return 0;
  }
  if (!((_List)l)->last) /* List is empty. */
  {
    if ((((_List)l)->last=(ListElem*)db_malloc(sizeof(ListElem)))==NULL)
    {
      EP;
      return 0;
    }
    ((_List)l)->first=((_List)l)->last;
    ((_List)l)->last->prev=NULL;
    ((_List)l)->last->next=NULL;
    ((_List)l)->current=((_List)l)->last;
  }
  else
  {
    if ((((_List)l)->first->prev=(ListElem*)db_malloc(sizeof(ListElem)))==NULL)
    {
      EP;
      return 0;
    }
    ((_List)l)->current=((_List)l)->first->prev;
    ((_List)l)->current->next=((_List)l)->first;
    ((_List)l)->current->prev=NULL;
    ((_List)l)->first=((_List)l)->current;
  }
  if ((((_List)l)->first->element=db_malloc(((_List)l)->el_size))==NULL)
  {
    EP;
    return 0;
  }
  ((_List)l)->first->element=db_memcpy(((_List)l)->first->element,element,((_List)l)->el_size);
  Debug(l,"AddFirstElement end");
  EP;
  return 1;
}

int InsertElement(List list,void *element)
{
  ListElem *l;

SP("InsertElement");
  Debug(list,"InsertElement start");
  if (!list || !((_List)list)->first || !((_List)list)->first->prev)
  {
    EP;
    return AddFirstElement(list,element);
  }
  else if (((_List)list)->current==((_List)list)->last)
  {
    EP;
    return AddElement(list,element);
  }
  else
  {
    if (!(l=(ListElem*)db_malloc(sizeof(ListElem))))
    {
      EP;
      return 0;
    }
    l->prev=((_List)list)->current->prev;
    l->next=((_List)list)->current;
    ((_List)list)->current->prev=l;
    ((_List)list)->current->prev->next=l;
    ((_List)list)->current=l;
    if (!(l->element=db_malloc(((_List)list)->el_size)))
    {
      EP;
      return 0;
    }
    l->element=db_memcpy(l->element,element,((_List)list)->el_size);
  }
  Debug(list,"InsertElement Last");
EP;
  return 1;
}


int GetFirstElement(List list,void *element)
{
SP("GetFirstElement");
  Debug(list,"GetFirstElement start");
  if (!list || !((_List)list)->first)
  {
    EP;
    return 0;
  }
  element=db_memcpy(element,((_List)list)->first->element,((_List)list)->el_size);
  ((_List)list)->current=((_List)list)->first;
  Debug(list,"GetFirstElement end");
  EP;
  return 1;
}

int GetCurrentElement(List list,void *element)
{
SP("GetCurrentElement");
  Debug(list,"GetCurrentElement start");
  if (!list || !((_List)list)->current)
  {
    EP;
    return 0;
  }
  element=db_memcpy(element,((_List)list)->current->element,((_List)list)->el_size);
  Debug(list,"GetCurrentElement end");
  EP;
  return 1;
}

int GetNextElement(List list,void *element)
{
SP("GetNextElement");
  Debug(list,"GetNextElement start");
  if (!list || !((_List)list)->current || !((_List)list)->current->next)
  {
    EP;
    return 0;
  }
  ((_List)list)->current=((_List)list)->current->next;
  element=db_memcpy(element,((_List)list)->current->element,((_List)list)->el_size);
  Debug(list,"GetNextElement end");
  EP;
  return 1;
}

int GetPreviousElement(List list,void *element)
{
SP("GetPreviousElement");
  Debug(list,"GetPreviousElement start");
  if (!list || !((_List)list)->current || !((_List)list)->current->prev)
  {
    EP;
    return 0;
  }
  ((_List)list)->current=((_List)list)->current->prev;
  element=db_memcpy(element,((_List)list)->current->element,((_List)list)->el_size);
  Debug(list,"GetPreviousElement end");
  EP;
  return 1;
}

int GetLastElement(List list,void *element)
{
  SP("GetLastElement");
  Debug(list,"GetLastElement start");
  if (!list || !((_List)list)->last)
  {
    EP;
    return 0;
  }
  element=db_memcpy(element,((_List)list)->last->element,((_List)list)->el_size);
  ((_List)list)->current=((_List)list)->last;
  Debug(list,"GetLastElement end");
EP;
  return 1;
}

int GetNthElement(List list,int n,void *element)
{
  int x=0;  

SP("GetNthElement");
  Debug(list,"GetNthElement start");
  if (!list || !((_List)list)->last)
  {
    EP;
    return 0;
  }
  if (GetFirstElement(list,element))
  {
    do
    {
      if (x++==n)
      {
        EP;
	return 1;
      }
    } while (GetNextElement(list,element));
  }      
  Debug(list,"GetNthElement end");
EP;
  return 0;
}

int DisposeList(List list)
{
  ListElem *ptr,*ptr2;

SP("DisposeList");
  Debug(list,"DisposeList start");
  if (!list)
  {
    EP;
    return 0;
  }
  ptr=((_List)list)->first;
  while (ptr)
  {
    ptr2=ptr;
    ptr=ptr->next;
    db_free((char*)ptr2->element);
    db_free((char*)ptr2);
  }
  db_free((char*)list);
  list=NULL;
  Debug(list,"DisposeList end");
  EP;
  return 0;
}

int ClearList(List list)
{
  ListElem *ptr,*ptr2;

SP("ClearList");
  Debug(list,"ClearList start");
  if (!list)
  {
    EP;
    return 0;
  }
  ptr=((_List)list)->first;
  while (ptr)
  {
    ptr2=ptr;
    ptr=ptr->next;
    db_free((char*)ptr2->element);
    db_free((char*)ptr2);
  }
  ((_List)list)->first=NULL;
  ((_List)list)->last=NULL;
  ((_List)list)->current=NULL;
  Debug(list,"ClearList end");
  EP;
  return 0;
}

int FindElement(List list,void *element,int key_size,void *key)
{
  ListElem *ptr;

SP("FindElement");
  Debug(list,"ClearList start");
  ptr=((_List)list)->first;
  while (db_memcmp(ptr->element,key,key_size)!=0 && ptr->next)
    ptr=ptr->next;
  if (db_memcmp(ptr->element,key,key_size)==0)
  {
    element=db_memcpy(element,ptr->element,((_List)list)->el_size);
    ((_List)list)->current=ptr;
EP;
    return 1;
  }
  Debug(list,"ClearList end");
EP;  
  return 0;
}

int DeleteLastElement(List list)
{
SP("DeleteLastElement");
  Debug(list,"DeleteLastElement start");
  if (!list || !((_List)list)->last)
  {
    EP;
    return 0;
  }
  if (((_List)list)->last->prev)
  {
    ((_List)list)->last=((_List)list)->last->prev;
    db_free((char*)((_List)list)->last->next->element);
    db_free((char*)((_List)list)->last->next);
    ((_List)list)->last->next=NULL;
  }
  else
  {
    ((_List)list)->first=NULL;
    ((_List)list)->current=NULL;
    db_free((char*)((_List)list)->last->element);
    db_free((char*)((_List)list)->last);
    ((_List)list)->last=NULL;
  }
  Debug(list,"DeleteLastElement end");
EP;
  return 1;
}

int DeleteFirstElement(List list)
{
SP("DeleteFirstElement");
  Debug(list,"DeleteFirstElement start");
  if (!list || !((_List)list)->first)
  {
    EP;
    return 0;
  }
  if (((_List)list)->first->next)
  {
    db_free((char*)((_List)list)->first->element);
    ((_List)list)->current=((_List)list)->first->next;
    db_free((char*)((_List)list)->current->prev);
    ((_List)list)->current->prev=NULL;
    ((_List)list)->first=((_List)list)->current;
  }
  else
  {
    ((_List)list)->last=NULL;
    ((_List)list)->current=NULL;
    db_free((char*)((_List)list)->first->element);
    db_free((char*)((_List)list)->first);
    ((_List)list)->first=NULL;
  }
  Debug(list,"DeleteFirstElement end");
EP;
  return 1;
}

int DeleteCurrentElement(List list)
{
  ListElem *ptr;

SP("DeleteCurrentElement");
  Debug(list,"DeleteCurrentElement start");
  if (!list)
  {
    EP;
    return 0;
  }
  ptr=((_List)list)->current;
  if (!ptr)
  {
    EP;
    return 0;
  }
  if (ptr->prev)
    ptr->prev->next=ptr->next;
  else
    ((_List)list)->first=ptr->next;
  if (ptr->next)
  {
    ptr->next->prev=ptr->prev;
    ((_List)list)->current=ptr->next;
  }
  else
    ((_List)list)->last=((_List)list)->current=ptr->prev;
  db_free((char*)ptr->element);
  db_free((char*)ptr);
  Debug(list,"DeleteCurrentElement end");
EP;
  return 1;
}

int DeleteElement(List list,int key_size,void *key)
{
  ListElem *ptr;

SP("DeleteElement");
  Debug(list,"DeleteElement start");
  if (!list)
  {
    EP;
    return 0;
  }
  ptr=((_List)list)->first;
  while (db_memcmp(ptr->element,key,key_size)!=0 && ptr->next)
    ptr=ptr->next;
  if (db_memcmp(ptr->element,key,key_size)==0)
  {
    if (ptr->prev)
      ptr->prev->next=ptr->next;
    else
      ((_List)list)->first=ptr->next;
    if (ptr->next)
    {
      ptr->next->prev=ptr->prev;
      ((_List)list)->current=ptr->next;
    }
    else
      ((_List)list)->last=((_List)list)->current=ptr->prev;
    db_free((char*)ptr->element);
    db_free((char*)ptr);
    Debug(list,"DeleteElement end");
    EP;
    return 1;
  }
  Debug(list,"DeleteElement end");
EP;
  return 0;
}

void ReplaceCurrentElement(List list,void *element)
{
SP("ReplaceCurrentElement");
  Debug(list,"ReplaceCurrentElement start");
  if (list==NULL)
  {
    EP;
    return;
  }
  ((_List)list)->current->element=db_memcpy(((_List)list)->current->element,element,((_List)list)->el_size);
EP;
  Debug(list,"ReplaceCurrentElement end");
}

void SortList(List list,int (*sort_proc)(const void *element1,const void *element2))
{
  char *data,*tmp;
  ListElem *ptr1;
  int n;

SP("SortList");
  Debug(list,"SortList start");
  tmp=data=(char*)db_malloc((n=NumberElements(list))*((_List)list)->el_size);
  ptr1=((_List)list)->first;
  while (ptr1)
  {
    data=(char*)db_memcpy(data,ptr1->element,((_List)list)->el_size);
    data+=((_List)list)->el_size;
    ptr1=ptr1->next;
  }
  ClearList(list);
  data=tmp;
  qsort(data,n,((_List)list)->el_size,sort_proc);
  while (n--)
  {
    AddElement(list,data);
    data+=((_List)list)->el_size;
  }
  db_free((char*)tmp);
  Debug(list,"SortList end");
EP;
}

int NumberElements(List list)
{
  ListElem *ptr;
  int count=0;

SP("NumberElements");
  Debug(list,"NumberElements start");
  if (!list)
  {
    EP;
    return 0;
  }
  ptr=((_List)list)->first;
  while (ptr)
  {
    ptr=ptr->next;
    count++;
  }
  Debug(list,"NumberElements end");
EP;
  return count;
}

jex-1.3.7/loaderror.c100644      0      0        3131  6672726720  12540 0ustar  rootroot#include <Xm/MessageB.h>
#include "jex.h"

extern Widget top;
Widget he=NULL;

void LoadError(Editor *e)
{
SP("LoadError");
  if (e->le==NULL)
  {
    e->le=XmCreateErrorDialog(e->shell,"LoadError",NULL,0);
    XtUnmanageChild(XmMessageBoxGetChild(e->le,XmDIALOG_CANCEL_BUTTON));
    XtUnmanageChild(XmMessageBoxGetChild(e->le,XmDIALOG_HELP_BUTTON));
  }
  XtManageChild(e->le);
  SetCurrentWidget(e->text);
EP;
}

void ShowError(Editor *e,char *errstr)
{
  XmString xstr;

SP("ShowError");
  if (e->err==NULL)
  {
    e->err=XmCreateErrorDialog(e->shell,"ErrorDialog",NULL,0);
    XtUnmanageChild(XmMessageBoxGetChild(e->err,XmDIALOG_CANCEL_BUTTON));
    XtUnmanageChild(XmMessageBoxGetChild(e->err,XmDIALOG_HELP_BUTTON));
  }
  xstr=XmStringCreateLocalized(errstr);
  XtVaSetValues(e->err,XmNmessageString,xstr,NULL);
  XmStringFree(xstr);
  XtManageChild(e->err);
EP;
}

void SaveError(Editor *e)
{
SP("SaveError");
  if (e->se==NULL)
  {
    e->se=XmCreateErrorDialog(e->shell,"SaveError",NULL,0);
    XtUnmanageChild(XmMessageBoxGetChild(e->se,XmDIALOG_CANCEL_BUTTON));
    XtUnmanageChild(XmMessageBoxGetChild(e->se,XmDIALOG_HELP_BUTTON));
  }
  XtManageChild(e->se);
  SetCurrentWidget(e->text);
EP;
}

void HelpError(char *msg)
{
  XmString xstr;
  
SP("HelpError");
  if (he==NULL)
  {
    he=XmCreateErrorDialog(top,"HelpError",NULL,0);
    XtUnmanageChild(XmMessageBoxGetChild(he,XmDIALOG_CANCEL_BUTTON));
    XtUnmanageChild(XmMessageBoxGetChild(he,XmDIALOG_HELP_BUTTON));
  }
  xstr=XmStringCreateLocalized(msg);
  XtVaSetValues(he,XmNmessageString,xstr,NULL);
  XmStringFree(xstr);
  XtManageChild(he);
EP;
}


jex-1.3.7/match.c100644      0      0       40715  6672726720  11674 0ustar  rootroot/*
 EPSHeader

   File: match.c
   Author: J. Kercheval
   Created: Sat, 01/05/1991  22:21:49
*/
/*
 EPSRevision History

   J. Kercheval  Wed, 02/20/1991  22:29:01  Released to Public Domain
   J. Kercheval  Fri, 02/22/1991  15:29:01  fix '\' bugs (two :( of them)
   J. Kercheval  Sun, 03/10/1991  19:31:29  add error return to matche()
   J. Kercheval  Sun, 03/10/1991  20:11:11  add is_valid_pattern code
   J. Kercheval  Sun, 03/10/1991  20:37:11  beef up main()
   J. Kercheval  Tue, 03/12/1991  22:25:10  Released as V1.1 to Public Domain
*/

/*
   Wildcard Pattern Matching
*/


#include "match.h"

int matche_after_star (register char *pattern, register char *text);
int fast_match_after_star (register char *pattern, register char *text);

/*----------------------------------------------------------------------------
*
* Return TRUE if PATTERN has any special wildcard characters
*
----------------------------------------------------------------------------*/

BOOLEAN is_pattern (char *p)
{
    while ( *p ) {
        switch ( *p++ ) {
            case '?':
            case '*':
            case '[':
            case '\\':
                return TRUE;
        }
    }
    return FALSE;
}


/*----------------------------------------------------------------------------
*
* Return TRUE if PATTERN has is a well formed regular expression according
* to the above syntax
*
* error_type is a return code based on the type of pattern error.  Zero is
* returned in error_type if the pattern is a valid one.  error_type return
* values are as follows:
*
*   PATTERN_VALID - pattern is well formed
*   PATTERN_ESC   - pattern has invalid escape ('\' at end of pattern)
*   PATTERN_RANGE - [..] construct has a no end range in a '-' pair (ie [a-])
*   PATTERN_CLOSE - [..] construct has no end bracket (ie [abc-g )
*   PATTERN_EMPTY - [..] construct is empty (ie [])
*
----------------------------------------------------------------------------*/

BOOLEAN is_valid_pattern (char *p, int *error_type)
{
    
    /* init error_type */
    *error_type = PATTERN_VALID;
    
    /* loop through pattern to EOS */
    while( *p ) {

        /* determine pattern type */
        switch( *p ) {

            /* check literal escape, it cannot be at end of pattern */
            case '\\':
                if( !*++p ) {
                    *error_type = PATTERN_ESC;
                    return FALSE;
                }
                p++;
                break;

            /* the [..] construct must be well formed */
            case '[':
                p++;

                /* if the next character is ']' then bad pattern */
                if ( *p == ']' ) {
                    *error_type = PATTERN_EMPTY;
                    return FALSE;
                }
                
                /* if end of pattern here then bad pattern */
                if ( !*p ) {
                    *error_type = PATTERN_CLOSE;
                    return FALSE;
                }

                /* loop to end of [..] construct */
                while( *p != ']' ) {

                    /* check for literal escape */
                    if( *p == '\\' ) {
                        p++;

                        /* if end of pattern here then bad pattern */
                        if ( !*p++ ) {
                            *error_type = PATTERN_ESC;
                            return FALSE;
                        }
                    }
                    else
                        p++;

                    /* if end of pattern here then bad pattern */
                    if ( !*p ) {
                        *error_type = PATTERN_CLOSE;
                        return FALSE;
                    }

                    /* if this a range */
                    if( *p == '-' ) {

                        /* we must have an end of range */
                        if ( !*++p || *p == ']' ) {
                            *error_type = PATTERN_RANGE;
                            return FALSE;
                        }
                        else {

                            /* check for literal escape */
                            if( *p == '\\' )
                                p++;

                            /* if end of pattern here then bad pattern */
                            if ( !*p++ ) {
                                *error_type = PATTERN_ESC;
                                return FALSE;
                            }
                        }
                    }
                }
                break;

            /* all other characters are valid pattern elements */
            case '*':
            case '?':
            default:
                p++;                              /* "normal" character */
                break;
         }
     }

     return TRUE;
}


/*----------------------------------------------------------------------------
*
*  Match the pattern PATTERN against the string TEXT;
*
*  returns MATCH_VALID if pattern matches, or an errorcode as follows
*  otherwise:
*
*            MATCH_PATTERN  - bad pattern
*            MATCH_LITERAL  - match failure on literal mismatch
*            MATCH_RANGE    - match failure on [..] construct
*            MATCH_ABORT    - premature end of text string
*            MATCH_END      - premature end of pattern string
*            MATCH_VALID    - valid match
*
*
*  A match means the entire string TEXT is used up in matching.
*
*  In the pattern string:
*       `*' matches any sequence of characters (zero or more)
*       `?' matches any character
*       [SET] matches any character in the specified set,
*       [!SET] or [^SET] matches any character not in the specified set.
*
*  A set is composed of characters or ranges; a range looks like
*  character hyphen character (as in 0-9 or A-Z).  [0-9a-zA-Z_] is the
*  minimal set of characters allowed in the [..] pattern construct.
*  Other characters are allowed (ie. 8 bit characters) if your system
*  will support them.
*
*  To suppress the special syntactic significance of any of `[]*?!^-\',
*  and match the character exactly, precede it with a `\'.
*
----------------------------------------------------------------------------*/

int matche ( register char *p, register char *t )
{
    register char range_start, range_end;  /* start and end in range */

    BOOLEAN invert;             /* is this [..] or [!..] */
    BOOLEAN member_match;       /* have I matched the [..] construct? */
    BOOLEAN loop;               /* should I terminate? */

    for ( ; *p; p++, t++ ) {

        /* if this is the end of the text then this is the end of the match */
        if (!*t) {
            return ( *p == '*' && *++p == '\0' ) ? MATCH_VALID : MATCH_ABORT;
        }

        /* determine and react to pattern type */
        switch ( *p ) {

            /* single any character match */
            case '?':
                break;

            /* multiple any character match */
            case '*':
                return matche_after_star (p, t);

            /* [..] construct, single member/exclusion character match */
            case '[': {

                /* move to beginning of range */
                p++;

                /* check if this is a member match or exclusion match */
                invert = FALSE;
                if ( *p == '!' || *p == '^') {
                    invert = TRUE;
                    p++;
                }

                /* if closing bracket here or at range start then we have a
                   malformed pattern */
                if ( *p == ']' ) {
                    return MATCH_PATTERN;
                }

                member_match = FALSE;
                loop = TRUE;

                while ( loop ) {

                    /* if end of construct then loop is done */
                    if (*p == ']') {
                        loop = FALSE;
                        continue;
                    }

                    /* matching a '!', '^', '-', '\' or a ']' */
                    if ( *p == '\\' ) {
                        range_start = range_end = *++p;
                    }
                    else {
                        range_start = range_end = *p;
                    }

                    /* if end of pattern then bad pattern (Missing ']') */
                    if (!*p)
                        return MATCH_PATTERN;

                    /* check for range bar */
                    if (*++p == '-') {

                        /* get the range end */
                        range_end = *++p;

                        /* if end of pattern or construct then bad pattern */
                        if (range_end == '\0' || range_end == ']')
                            return MATCH_PATTERN;

                        /* special character range end */
                        if (range_end == '\\') {
                            range_end = *++p;

                            /* if end of text then we have a bad pattern */
                            if (!range_end)
                                return MATCH_PATTERN;
                        }

                        /* move just beyond this range */
                        p++;
                    }

                    /* if the text character is in range then match found.
                       make sure the range letters have the proper
                       relationship to one another before comparison */
                    if ( range_start < range_end  ) {
                        if (*t >= range_start && *t <= range_end) {
                            member_match = TRUE;
                            loop = FALSE;
                        }
                    }
                    else {
                        if (*t >= range_end && *t <= range_start) {
                            member_match = TRUE;
                            loop = FALSE;
                        }
                    }
                }

                /* if there was a match in an exclusion set then no match */
                /* if there was no match in a member set then no match */
                if ((invert && member_match) ||
                   !(invert || member_match))
                    return MATCH_RANGE;

                /* if this is not an exclusion then skip the rest of the [...]
                    construct that already matched. */
                if (member_match) {
                    while (*p != ']') {

                        /* bad pattern (Missing ']') */
                        if (!*p)
                            return MATCH_PATTERN;

                        /* skip exact match */
                        if (*p == '\\') {
                            p++;

                            /* if end of text then we have a bad pattern */
                            if (!*p)
                                return MATCH_PATTERN;
                        }

                        /* move to next pattern char */
                        p++;
                    }
                }

                break;
            }

            /* next character is quoted and must match exactly */
            case '\\':

                /* move pattern pointer to quoted char and fall through */
                p++;

                /* if end of text then we have a bad pattern */
                if (!*p)
                    return MATCH_PATTERN;

            /* must match this character exactly */
            default:
                if (*p != *t)
                    return MATCH_LITERAL;
        }
    }

    /* if end of text not reached then the pattern fails */
    if ( *t )
        return MATCH_END;
    else
        return MATCH_VALID;
}


/*----------------------------------------------------------------------------
*
* recursively call matche() with final segment of PATTERN and of TEXT.
*
----------------------------------------------------------------------------*/

int matche_after_star (register char *p, register char *t)
{
    register int match = 0;
    register nextp;

    /* pass over existing ? and * in pattern */
    while ( *p == '?' || *p == '*' ) {

        /* take one char for each ? and + */
        if ( *p == '?' ) {

            /* if end of text then no match */
            if ( !*t++ ) {
                return MATCH_ABORT;
            }
        }

        /* move to next char in pattern */
        p++;
    }

    /* if end of pattern we have matched regardless of text left */
    if ( !*p ) {
        return MATCH_VALID;
    }

    /* get the next character to match which must be a literal or '[' */
    nextp = *p;
    if ( nextp == '\\' ) {
        nextp = p[1];

        /* if end of text then we have a bad pattern */
        if (!nextp)
            return MATCH_PATTERN;
    }

    /* Continue until we run out of text or definite result seen */
    do {

        /* a precondition for matching is that the next character
           in the pattern match the next character in the text or that
           the next pattern char is the beginning of a range.  Increment
           text pointer as we go here */
        if ( nextp == *t || nextp == '[' ) {
            match = matche(p, t);
        }

        /* if the end of text is reached then no match */
        if ( !*t++ ) match = MATCH_ABORT;

    } while ( match != MATCH_VALID && 
              match != MATCH_ABORT &&
              match != MATCH_PATTERN);

    /* return result */
    return match;
}


/*----------------------------------------------------------------------------
*
* match() is a shell to matche() to return only BOOLEAN values.
*
----------------------------------------------------------------------------*/

BOOLEAN match( char *p, char *t )
{
    int error_type;
    error_type = matche(p,t);
    return (error_type == MATCH_VALID ) ? TRUE : FALSE;
}


#ifdef TEST

    /*
    * This test main expects as first arg the pattern and as second arg
    * the match string.  Output is yaeh or nay on match.  If nay on
    * match then the error code is parsed and written.
    */

    #include <stdio.h>

    int main(int argc, char *argv[])
    {
        int error;
        int is_valid_error;

        if (argc != 3) {
            printf("Usage:  MATCH Pattern Text\n");
        }
        else {
            printf("Pattern: %s\n", argv[1]);
            printf("Text   : %s\n", argv[2]);
            
            if (!is_pattern(argv[1])) {
                printf("    First Argument Is Not A Pattern\n");
            }
            else {
                error = matche(argv[1],argv[2]);
                is_valid_pattern(argv[1],&is_valid_error);

                switch ( error ) {
                    case MATCH_VALID:
                        printf("    Match Successful");
                        if (is_valid_error != PATTERN_VALID)
                            printf(" -- is_valid_pattern() is complaining\n");
                        else
                            printf("\n");
                        break;
                    case MATCH_LITERAL:
                        printf("    Match Failed on Literal\n");
                        break;
                    case MATCH_RANGE:
                        printf("    Match Failed on [..]\n");
                        break;
                    case MATCH_ABORT:
                        printf("    Match Failed on Early Text Termination\n");
                        break;
                    case MATCH_END:
                        printf("    Match Failed on Early Pattern Termination\n");
                        break;
                    case MATCH_PATTERN:
                        switch ( is_valid_error ) {
                            case PATTERN_VALID:
                                printf("    Internal Disagreement On Pattern\n");
                                break;
                            case PATTERN_ESC:
                                printf("    Literal Escape at End of Pattern\n");
                                break;
                            case PATTERN_RANGE:
                                printf("    No End of Range in [..] Construct\n");
                                break;
                            case PATTERN_CLOSE:
                                printf("    [..] Construct is Open\n");
                                break;
                            case PATTERN_EMPTY:
                                printf("    [..] Construct is Empty\n");
                                break;
                            default:
                                printf("    Internal Error in is_valid_pattern()\n");
                        }
                        break;
                    default:
                        printf("    Internal Error in matche()\n");
                        break;
                }
            }

        }
        return(0);
    }

#endif

jex-1.3.7/matchchar.c100644      0      0        3526  6672726720  12511 0ustar  rootroot#include "jex.h"
#include <Xm/Text.h>

extern XtAppContext app;

void SearchChar(Editor *e,char *str,int pos,int direction,char sch,char ech)
{
  int matches=1,len,comment=0,origpos=pos;
  
SP("SearchChar");
  len=db_strlen(str);
  while (pos>=0 && pos<len && matches)
  {
    if (str[pos]==sch && !comment)
      matches++;
    else if (str[pos]==ech && !comment)
      matches--;
    else if (str[pos]=='"' && comment!=2)
    {
      if ((pos && str[pos-1]!='\\') || (pos>1 && str[pos-2]=='\\'))
        comment=comment?0:1;
    }
    else if (str[pos]=='\'' && comment!=1)
    {
      if ((pos && str[pos-1]!='\\') || (pos>1 && str[pos-2]=='\\'))
        comment=comment?0:2;
    }
    pos+=direction;
  }
  if (!matches)
  {
    pos-=direction;
    XmTextShowPosition(e->text,pos);
    XmTextSetInsertionPosition(e->text,pos);
    XmTextSetSelection(e->text,pos,pos,0);
    XmTextSetHighlight(e->text,pos,pos+1,XmHIGHLIGHT_SELECTED);
    XmTextSetHighlight(e->text,origpos-direction,origpos-direction+1,XmHIGHLIGHT_SELECTED);
    e->tid5=XtAppAddTimeOut(app,250,(XtTimerCallbackProc)NoHighlight,e);
  }
EP;
}   

void FindMatchingChar(Widget w,Editor *e,void *cbs)
{
  char sch,ech,*str;
  int direction;
  XmTextPosition pos,right;
  
SP("FindMatchingChar");
  XmTextGetSelectionPosition(e->text,&pos,&right);
  if (pos==right)
    pos=XmTextGetCursorPosition(e->text);
  str=XmTextGetString(e->text);
  if (db_strlen(str)==0)
  {
    XtFree(str);
EP;
    return;
  }
  sch=str[pos];
  switch (str[pos])
  {
    case '(': direction=1;ech=')';break;
    case '{': direction=1;ech='}';break;
    case '[': direction=1;ech=']';break;
    case ')': direction=-1;ech='(';break;
    case '}': direction=-1;ech='{';break;
    case ']': direction=-1;ech='[';break;
    default: XtFree(str);EP;return;
  }
  SearchChar(e,str,pos+direction,direction,sch,ech);
  XtFree(str);
EP;
}  
jex-1.3.7/options.c100644      0      0       42016  6672726720  12267 0ustar  rootroot#include <stdio.h>
#include <stdlib.h>
#include <Xm/MessageB.h>
#include <Xm/Form.h>
#include <Xm/TextF.h>
#include <Xm/LabelG.h>
#include <Xm/ToggleB.h>
#include <Xm/PushBG.h>
#include <Xm/List.h>
#include <Xm/RowColumn.h>
#include "jex.h"

extern Widget top;
extern OwnRes ownres;
extern XtAppContext app;

String auto_indent_on="#override \
Ctrl<Key>Y: delete-line() \n\
<Key>Return: newline-and-indent()";

String auto_indent_off="#override \
Ctrl<Key>Y: delete-line() \n\
<Key>Return: newline()";

void AutoSave(Editor *e,XtIntervalId id)
{
SP("AutoSave");
  if (e->filename[0])
    Save(NULL,e,NULL);
  e->tid4=XtAppAddTimeOut(app,e->autosavetimeout*60000,(XtTimerCallbackProc)AutoSave,e);
EP;
}     

void ToggleAutoSave(Widget w,Editor *e,XmToggleButtonCallbackStruct *cbs)
{
SP("ToggleAutoSave");
  XtVaSetValues(e->asf,XmNsensitive,cbs->set?True:False,NULL);
EP;
}

void ApplySettings(Editor *e)
{
SP("ApplySettings");
  if (e->auto_indent)
    XtOverrideTranslations(e->text,XtParseTranslationTable(auto_indent_on));
  else
    XtOverrideTranslations(e->text,XtParseTranslationTable(auto_indent_off));
  if (e->autosave)
  {
    if (e->sd)
      XtVaSetValues(e->asf,XmNsensitive,True,NULL);
    if (e->tid4)
      XtRemoveTimeOut(e->tid4);
    e->tid4=XtAppAddTimeOut(app,e->autosavetimeout*60000,(XtTimerCallbackProc)AutoSave,e);
  }
  else
  {
    if (e->sd)
      XtVaSetValues(e->asf,XmNsensitive,False,NULL);
    if (e->tid4)
      XtRemoveTimeOut(e->tid4);
  }
EP;
}

void SaveSettings(Editor *e)
{
  FILE *f;
  char filename[255],*home;
  int x;
  
SP("SaveSettings");
  if (ownres.setthome)
  {
    home=getenv("HOME");
    if (home)
      sprintf(filename,"%s/.jexrc",home);
    else
      db_strcpy(filename,".jexrc");
  }
  else
    db_strcpy(filename,".jexrc");
  if ((f=db_fopen(filename,"w+"))==NULL)
  {
    EP;
    return;
  }
  fprintf(f,"autoindent: %d\n",(int)e->auto_indent);
  fprintf(f,"undolevels: %d\n",e->undolevels);
  fprintf(f,"printcommand: %s\n",e->print_command);
  fprintf(f,"compilecommand: %s\n",e->compile_command);
  fprintf(f,"makecommand: %s\n",e->make_command);
  fprintf(f,"runcommand: %s\n",e->run_command);
  for (x=0;x<e->ce_count;x++)
    fprintf(f,"compilererror: %s\n",e->compiler_error[x]);
  fprintf(f,"newwindow: %d\n",(int)e->new_window);
  fprintf(f,"blockundo: %d\n",(int)e->blockundo);
  fprintf(f,"autosave: %d\n",(int)e->autosave);
  fprintf(f,"autosavetimeout: %d\n",(int)e->autosavetimeout);
  db_fclose(f);
EP;
}

void LoadSettings(Editor *e)
{
  FILE *f;
  char filename[255],*home;
  int tmp,x;
  
SP("LoadSettings");
  if (e->ce_count)
  {
    for (x=0;x<e->ce_count;x++)
      db_free(e->compiler_error[x]);
    db_free(e->compiler_error);
    e->compiler_error=NULL;
    e->ce_count=0;
  }    
  if (ownres.setthome)
  {
    home=getenv("HOME");
    if (home)
      sprintf(filename,"%s/.jexrc",home);
    else
      db_strcpy(filename,".jexrc");
  }
  else
    db_strcpy(filename,".jexrc");
  if ((f=fopen(filename,"r"))==NULL)
  {
    if (!e->ce_count)
    {
      e->compiler_error=(char**)db_realloc(e->compiler_error,(e->ce_count+1)*sizeof(char*));
      e->compiler_error[e->ce_count++]=db_strdup("%[^:]:%d");
      e->compiler_error=(char**)db_realloc(e->compiler_error,(e->ce_count+1)*sizeof(char*));
      e->compiler_error[e->ce_count++]=db_strdup("cc: \"%[^\"]\", line %d:");
    }
    ApplySettings(e);
    EP;
    return;
  }
  while (fscanf(f,"%s",filename)==1)
  {
    if (db_strcmp(filename,"autoindent:")==0)
    {
      fscanf(f,"%d",&tmp);
      e->auto_indent=(Boolean)tmp;
    }
    else if (db_strcmp(filename,"newwindow:")==0)
    {
      fscanf(f,"%d",&tmp);
      e->new_window=(Boolean)tmp;
    }
    else if (db_strcmp(filename,"blockundo:")==0)
    {
      fscanf(f,"%d",&tmp);
      e->blockundo=(Boolean)tmp;
    }
    else if (db_strcmp(filename,"autosave:")==0)
    {
      fscanf(f,"%d",&tmp);
      e->autosave=(Boolean)tmp;
    }
    else if (db_strcmp(filename,"autosavetimeout:")==0)
      fscanf(f,"%d",&e->autosavetimeout);
    else if (db_strcmp(filename,"undolevels:")==0)
      fscanf(f,"%d",&e->undolevels);
    else if (db_strcmp(filename,"printcommand:")==0)
    {
      fgets(filename,100,f);
      filename[db_strlen(filename)-1]='\0';
      tmp=0;
      while (filename[tmp]==' ')
        tmp++;
      db_strcpy(e->print_command,&filename[tmp]);
    }
    else if (db_strcmp(filename,"compilecommand:")==0)
    {
      fgets(filename,100,f);
      filename[db_strlen(filename)-1]='\0';
      tmp=0;
      while (filename[tmp]==' ')
        tmp++;
      db_strcpy(e->compile_command,&filename[tmp]);
    }
    else if (db_strcmp(filename,"makecommand:")==0)
    {
      fgets(filename,100,f);
      filename[db_strlen(filename)-1]='\0';
      tmp=0;
      while (filename[tmp]==' ')
        tmp++;
      db_strcpy(e->make_command,&filename[tmp]);
    }
    else if (db_strcmp(filename,"runcommand:")==0)
    {
      fgets(filename,100,f);
      filename[db_strlen(filename)-1]='\0';
      tmp=0;
      while (filename[tmp]==' ')
        tmp++;
      db_strcpy(e->run_command,&filename[tmp]);
    }
    else if (db_strcmp(filename,"compilererror:")==0)
    {
      fgets(filename,100,f);
      filename[db_strlen(filename)-1]='\0';
      tmp=0;
      while (filename[tmp]==' ')
        tmp++;
      e->compiler_error=(char**)db_realloc(e->compiler_error,(e->ce_count+1)*sizeof(char*));
      e->compiler_error[e->ce_count++]=db_strdup(&filename[tmp]);
    }
  }
  if (!e->ce_count)
  {
    e->compiler_error=(char**)db_realloc(e->compiler_error,(e->ce_count+1)*sizeof(char*));
    e->compiler_error[e->ce_count++]=db_strdup("%[^:]:%d");
    e->compiler_error=(char**)db_realloc(e->compiler_error,(e->ce_count+1)*sizeof(char*));
    e->compiler_error[e->ce_count++]=db_strdup("cc: \"%[^\"]\", line %d:");
  }
  fclose(f);
  ApplySettings(e);
EP;
} 
  
void SettingsOK(Widget w,Editor *e,void *cbs)
{
  char *tmpstr;
  XmStringTable items;
  int c,x;
  
SP("SettingsOK");
  XtVaGetValues(e->ai,XmNset,&e->auto_indent,NULL);
  XtVaGetValues(e->nw,XmNset,&e->new_window,NULL);
  XtVaGetValues(e->bu,XmNset,&e->blockundo,NULL);
  XtVaGetValues(e->ast,XmNset,&e->autosave,NULL);
  XtVaGetValues(e->ul,XmNvalue,&tmpstr,NULL);
  e->undolevels=atoi(tmpstr);
  if (e->undolevels<0)
    e->undolevels=0;
  XtFree(tmpstr);
  XtVaGetValues(e->asf,XmNvalue,&tmpstr,NULL);
  e->autosavetimeout=atoi(tmpstr);
  if (e->autosavetimeout<=0)
    e->autosavetimeout=1;
  XtFree(tmpstr);
  XtVaGetValues(e->pc,XmNvalue,&tmpstr,NULL);
  db_strncpy(e->print_command,tmpstr,99);
  XtFree(tmpstr);
  XtVaGetValues(e->cc,XmNvalue,&tmpstr,NULL);
  db_strncpy(e->compile_command,tmpstr,99);
  XtFree(tmpstr);
  XtVaGetValues(e->mc,XmNvalue,&tmpstr,NULL);
  db_strncpy(e->make_command,tmpstr,99);
  XtFree(tmpstr);
  XtVaGetValues(e->runc,XmNvalue,&tmpstr,NULL);
  db_strncpy(e->run_command,tmpstr,99);
  XtFree(tmpstr);
/*  XtVaGetValues(e->ce,XmNvalue,&tmpstr,NULL);
  db_strncpy(e->compiler_error,tmpstr,99);
  XtFree(tmpstr);*/
  if (e->ce_count)
  {
    for (x=0;x<e->ce_count;x++)
      db_free(e->compiler_error[x]);
    db_free(e->compiler_error);
    e->compiler_error=NULL;
    e->ce_count=0;
  }    
  XtVaGetValues(e->ce,XmNitemCount,&c,XmNitems,&items,NULL);
  if (c)
  {
    e->compiler_error=(char**)db_malloc(sizeof(char*)*c);
    e->ce_count=c;
    for (x=0;x<c;x++)
    {
      XmStringGetLtoR(items[x],XmSTRING_DEFAULT_CHARSET,&tmpstr);
      e->compiler_error[x]=db_strdup(tmpstr);
      XtFree(tmpstr);
    }
  }
  ApplySettings(e);
  SaveSettings(e);
  SetCurrentWidget(e->text);
EP;
}

void SettingsCancel(Widget w,Editor *e,void *cbs)
{
  SetCurrentWidget(e->text);
}

void AddCE(Widget w,Editor *e,void *cbs)
{
  char *str="";
  XmString xstr;
  int *pos,count;
  
  SP("AddCE");
#ifndef LESSTIFF    
  XtVaGetValues(XtNameToWidget(e->sd,"*CEField"),XmNvalue,&str,NULL);
#endif
  if (str[0])
  {
    xstr=XmStringCreateLocalized(str);
    if (XmListGetSelectedPos(e->ce,&pos,&count))
    {
      XmListAddItem(e->ce,xstr,pos[0]+1);
      XmListSelectPos(e->ce,pos[0]+1,True);
      XmListSetBottomPos(e->ce,pos[0]+1);
      XmStringFree(xstr);
      XtFree((char*)pos);
    }
    else
    {
      XmListAddItem(e->ce,xstr,0);
      XmListSelectPos(e->ce,0,True);
      XmListSetBottomPos(e->ce,0);
      XmStringFree(xstr);
    }    
  }
  XtFree(str);
  EP;
}

void ModifyCE(Widget w,Editor *e,void *cbs)
{
  char *str="";
  XmString xstr;
  int *pos,count;
  
  SP("ModifyCE");
#ifndef LESSTIFF    
  XtVaGetValues(XtNameToWidget(e->sd,"*CEField"),XmNvalue,&str,NULL);
#endif
  if (str[0])
  {
    if (XmListGetSelectedPos(e->ce,&pos,&count))
    {
      xstr=XmStringCreateLocalized(str);
      XmListReplaceItemsPos(e->ce,&xstr,1,pos[0]);
      XmListSelectPos(e->ce,pos[0],True);
      XmStringFree(xstr);
      XtFree((char*)pos);
    }
  }
  XtFree(str);
  EP;
}

void RemoveCE(Widget w,Editor *e,void *cbs)
{
  int *pos,count;
  
  SP("RemoveCE");
  if (XmListGetSelectedPos(e->ce,&pos,&count))
  {
    XmListDeletePos(e->ce,pos[0]);
    XtVaGetValues(e->ce,XmNitemCount,&count,NULL);
    if (pos[0]>count)
    {
      if (!count)
      {
#ifndef LESSTIFF    
        XtVaSetValues(XtNameToWidget(e->sd,"*CEField"),XmNvalue,"",NULL);
#endif
      }
      else
      {
        XmListSelectPos(e->ce,0,True);
        XmListSetBottomPos(e->ce,0);
      }
    }
    else
    {
      XmListSelectPos(e->ce,pos[0],True);
      XmListSetBottomPos(e->ce,pos[0]);
    }
    XtFree((char*)pos);
  }
  EP;
}

void SelectCE(Widget w,Editor *e,void *cbs)
{
  int count;
  XmStringTable items;
  char *str;
  
  SP("SelectCE");
  XtVaGetValues(e->ce,XmNselectedItemCount,&count,XmNselectedItems,&items,NULL);
  if (count)
  {
    XmStringGetLtoR(items[0],XmSTRING_DEFAULT_CHARSET,&str);
#ifndef LESSTIFF    
    XtVaSetValues(XtNameToWidget(e->sd,"*CEField"),XmNvalue,str,NULL);
#endif
    XtFree(str);
  }
  else
  {
#ifndef LESSTIFF    
    XtVaSetValues(XtNameToWidget(e->sd,"*CEField"),XmNvalue,"",NULL);
#endif
  }    
  EP;
}

void Settings(Editor *e)
{
  char tmpstr[100];
  int x;
  XmString xstr;
  Widget w,rc;
  Arg arg[2];
  
SP("Settings");
  if (e->sd==NULL)
  {
    e->sd=XmCreateMessageDialog(e->shell,"Settings",NULL,0);
    XtAddCallback(e->sd,XmNokCallback,(XtCallbackProc)SettingsOK,e);
    XtAddCallback(e->sd,XmNcancelCallback,(XtCallbackProc)SettingsCancel,e);
    XtAddCallback(e->sd,XmNhelpCallback,(XtCallbackProc)Help,"Settings");
    e->sf=XtVaCreateManagedWidget("settingsform",xmFormWidgetClass,e->sd,
    	XmNfractionBase,2,
    	NULL);
    e->ai=XtVaCreateManagedWidget("AutoIndent",xmToggleButtonWidgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNleftAttachment,XmATTACH_FORM,
	NULL);
    e->nw=XtVaCreateManagedWidget("NewWindow",xmToggleButtonWidgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->ai,
    	XmNleftAttachment,XmATTACH_FORM,
	NULL);
    e->bu=XtVaCreateManagedWidget("BlockUndo",xmToggleButtonWidgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->nw,
    	XmNleftAttachment,XmATTACH_FORM,
	NULL);
    e->ul=XtVaCreateManagedWidget("UndoLevels",xmTextFieldWidgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->bu,
    	XmNleftAttachment,XmATTACH_POSITION,
    	XmNleftPosition,1,
    	XmNrightAttachment,XmATTACH_FORM,
	NULL);
    e->ull=XtVaCreateManagedWidget("UndoLevelLabel",xmLabelGadgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->bu,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,1,
    	XmNbottomAttachment,XmATTACH_OPPOSITE_WIDGET,
    	XmNbottomWidget,e->ul,
	NULL);
    e->pc=XtVaCreateManagedWidget("PrintCommand",xmTextFieldWidgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->ul,
    	XmNleftAttachment,XmATTACH_POSITION,
    	XmNleftPosition,1,
    	XmNrightAttachment,XmATTACH_FORM,
	NULL);
    e->pcl=XtVaCreateManagedWidget("PrintCommLabel",xmLabelGadgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->ull,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,1,
    	XmNbottomAttachment,XmATTACH_OPPOSITE_WIDGET,
    	XmNbottomWidget,e->pc,
	NULL);
    e->cc=XtVaCreateManagedWidget("CompileCommand",xmTextFieldWidgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->pc,
    	XmNleftAttachment,XmATTACH_POSITION,
    	XmNleftPosition,1,
    	XmNrightAttachment,XmATTACH_FORM,
	NULL);
    e->ccl=XtVaCreateManagedWidget("CompileCommLabel",xmLabelGadgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->pcl,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,1,
    	XmNbottomAttachment,XmATTACH_OPPOSITE_WIDGET,
    	XmNbottomWidget,e->cc,
	NULL);
    e->mc=XtVaCreateManagedWidget("MakeCommand",xmTextFieldWidgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->cc,
    	XmNleftAttachment,XmATTACH_POSITION,
    	XmNleftPosition,1,
    	XmNrightAttachment,XmATTACH_FORM,
	NULL);
    e->mcl=XtVaCreateManagedWidget("MakeCommLabel",xmLabelGadgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->ccl,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,1,
    	XmNbottomAttachment,XmATTACH_OPPOSITE_WIDGET,
    	XmNbottomWidget,e->mc,
	NULL);
    e->runc=XtVaCreateManagedWidget("RunCommand",xmTextFieldWidgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->mc,
    	XmNleftAttachment,XmATTACH_POSITION,
    	XmNleftPosition,1,
    	XmNrightAttachment,XmATTACH_FORM,
	NULL);
    e->runcl=XtVaCreateManagedWidget("RunCommLabel",xmLabelGadgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->mcl,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,1,
    	XmNbottomAttachment,XmATTACH_OPPOSITE_WIDGET,
    	XmNbottomWidget,e->runc,
	NULL);
    e->cel=XtVaCreateManagedWidget("CompileErrorLabel",xmLabelGadgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->runcl,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_NONE,
    	XmNbottomAttachment,XmATTACH_NONE,
	NULL);
    rc=XtVaCreateManagedWidget("CERC",xmRowColumnWidgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->cel,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNbottomAttachment,XmATTACH_NONE,
    	XmNorientation,XmVERTICAL,
	NULL);
    w=XtVaCreateManagedWidget("Add",xmPushButtonGadgetClass,rc,NULL);
    XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)AddCE,(void*)e);
    w=XtVaCreateManagedWidget("Modify",xmPushButtonGadgetClass,rc,NULL);
    XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)ModifyCE,(void*)e);
    w=XtVaCreateManagedWidget("Delete",xmPushButtonGadgetClass,rc,NULL);
    XtAddCallback(w,XmNactivateCallback,(XtCallbackProc)RemoveCE,(void*)e);
    XtSetArg(arg[0],XmNlistSizePolicy,XmRESIZE_IF_POSSIBLE);
    e->ce=XmCreateScrolledList(e->sf,"CompileError",arg,1);
    XtManageChild(e->ce);
    XtVaSetValues(XtParent(e->ce),
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->cel,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_WIDGET,
    	XmNrightWidget,rc,
	NULL);
    XtAddCallback(e->ce,XmNbrowseSelectionCallback,(XtCallbackProc)SelectCE,(void*)e);
    w=XtVaCreateManagedWidget("CEField",xmTextFieldWidgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,XtParent(e->ce),
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_OPPOSITE_WIDGET,
    	XmNrightWidget,e->ce,
	NULL);
    e->asf=XtVaCreateManagedWidget("AutoSave",xmTextFieldWidgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,w,
    	XmNleftAttachment,XmATTACH_POSITION,
    	XmNleftPosition,1,
    	XmNrightAttachment,XmATTACH_FORM,
	NULL);
    e->ast=XtVaCreateManagedWidget("AutoSaveToggle",xmToggleButtonWidgetClass,e->sf,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,w,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,1,
    	XmNbottomAttachment,XmATTACH_OPPOSITE_WIDGET,
    	XmNbottomWidget,e->asf,
	NULL);
    XtAddCallback(e->ast,XmNvalueChangedCallback,(XtCallbackProc)ToggleAutoSave,e);
  }
  XtVaSetValues(e->ai,XmNset,e->auto_indent,NULL);
  XtVaSetValues(e->nw,XmNset,e->new_window,NULL);
  XtVaSetValues(e->bu,XmNset,e->blockundo,NULL);
  sprintf(tmpstr,"%d",e->undolevels);
  XtVaSetValues(e->ul,XmNvalue,tmpstr,NULL);
  XtVaSetValues(e->pc,XmNvalue,e->print_command,NULL);
  XtVaSetValues(e->cc,XmNvalue,e->compile_command,NULL);
  XtVaSetValues(e->mc,XmNvalue,e->make_command,NULL);
  XtVaSetValues(e->runc,XmNvalue,e->run_command,NULL);
/*  XtVaSetValues(e->ce,XmNvalue,e->compiler_error,NULL);*/
  XmListDeleteAllItems(e->ce);
  for (x=0;x<e->ce_count;x++)
  {
    xstr=XmStringCreateLocalized(e->compiler_error[x]);
    XmListAddItem(e->ce,xstr,0);
    XmStringFree(xstr);
  }
#ifndef LESSTIFF    
  XtVaSetValues(XtNameToWidget(e->sd,"*CEField"),XmNvalue,"",NULL);
#endif  
  XtVaSetValues(e->ast,XmNset,e->autosave,NULL);
  sprintf(tmpstr,"%d",e->autosavetimeout);
  XtVaSetValues(e->asf,XmNvalue,tmpstr,XmNsensitive,e->autosave,NULL);
  XtManageChild(e->sd);
EP;
}

jex-1.3.7/shift.c100644      0      0        6575  6672726720  11703 0ustar  rootroot#include <Xm/TextStrSoP.h>
#include <Xm/Text.h>
#include "jex.h"

extern Widget text;

void RemoveTabs(char **str)
{
  int col=0,x;
  
SP("RemoveTabs");
  for (x=0;x<strlen(*str);x++)
  {
    if ((*str)[x]=='\n')
      col=0;
    else if ((*str)[x]=='\t')
    {
      *str=XtRealloc(*str,strlen(*str)+8-col%8+1);
      memmove(&(*str)[x+8-col%8],&(*str)[x+1],strlen(&(*str)[x+1])+1);
      memset(&(*str)[x],' ',8-col%8);
      col++;
    }
    else
      col++;
  }
EP;
}

void ShiftRight(Widget w,Editor *e,void *cbs)
{
  char *str;  
  XmTextPosition left,right;
  int len,pos=0,selection=1,nl=1;
  
SP("ShiftRight");
  if (e->read_only)
  {
EP;
    return;
  }
  WatchCursor(e,1);
  XtVaGetValues(e->text,XmNvalue,&str,NULL);
  len=db_strlen(str);
  if (!XmTextGetSelectionPosition(e->text,&left,&right) || left==right)
  {
    left=right=XmTextGetInsertionPosition(e->text);
    selection=0;
  }
  while (left>0 && str[left-1]!='\0' && str[left-1]!='\n')
    left--;
  if ((right && str[right-1]!='\n') || right!=left)
    right--;
  while (right>=0 && right<len && str[right]!='\0' && str[right]!='\n')
    right++;
  if (left>=right)
  {
    XtFree(str);
    WatchCursor(e,0);
EP;
    return;
  }
  XtFree(str);
  XmTextSetSelection(e->text,left,right,0);
  str=XmTextGetSelection(e->text);
  RemoveTabs(&str);
  while (pos<db_strlen(str))
  {
    if (!pos || (pos && str[pos-1]=='\n'))
      nl=1;
    if (nl && str[pos]!=' ' && str[pos]!='\t')
    {
      str=XtRealloc(str,db_strlen(str)+2);
      db_memmove(&str[pos+1],&str[pos],db_strlen(str)-pos+1);
      str[pos]=' ';
      nl=0;
    }
    pos++;
  }
  XmTextReplace(e->text,left,right,str);
  if (selection)
    XmTextSetSelection(e->text,left,left+db_strlen(str),0);
  XtFree(str);
  SetCurrentWidget(e->text);
  WatchCursor(e,0);
EP;
}

void ShiftLeft(Widget w,Editor *e,void *cbs)
{
  char *str;  
  XmTextPosition left,right;
  int len,pos=0,selection=1,nl=0;
  
SP("ShiftLeft");
  if (e->read_only)
  {
    EP;
    return;
  }
  WatchCursor(e,1);
  XtVaGetValues(e->text,XmNvalue,&str,NULL);
  len=db_strlen(str);
  if (!XmTextGetSelectionPosition(e->text,&left,&right) || left==right)
  {
    left=right=XmTextGetInsertionPosition(e->text);
    selection=0;
  }
  while (left>0 && str[left-1]!='\0' && str[left-1]!='\n')
    left--;
  if ((right && str[right-1]!='\n') || right!=left)
    right--;
  while (right>=0 && right<len && str[right]!='\0' && str[right]!='\n')
    right++;
  if (left>=right)
  {
    XtFree(str);
    WatchCursor(e,0);
    EP;
    return;
  }
  XtFree(str);
  XmTextSetSelection(e->text,left,right,0);
  str=XmTextGetSelection(e->text);
  RemoveTabs(&str);
  while (pos<db_strlen(str))
  {
    if ((!pos || (pos && str[pos-1]=='\n')))
      nl=2;
/*    if (nl && str[pos]=='\t')
    {
      str=XtRealloc(str,db_strlen(str)+10);
      db_memmove(&str[pos+8],&str[pos+1],db_strlen(str)-pos+1);
      str[pos]=' ';
      str[pos+1]=' ';
      str[pos+2]=' ';
      str[pos+3]=' ';
      str[pos+4]=' ';
      str[pos+5]=' ';
      str[pos+6]=' ';
      str[pos+7]=' ';
    }*/
    if (nl==2 && str[pos]==' ')
    {
      db_memmove(&str[pos],&str[pos+1],db_strlen(str)-pos);
      nl=1;
    }
    if (nl && str[pos]!=' ' && str[pos]!='\t')
      nl=0;
    pos++;
  }
  XmTextReplace(e->text,left,right,str);
  if (selection)
    XmTextSetSelection(e->text,left,left+db_strlen(str),0);
  XtFree(str);
  SetCurrentWidget(e->text);
  WatchCursor(e,0);
EP;
}

jex-1.3.7/smallhelp.c100644      0      0       11142  6672726720  12551 0ustar  rootroot#include "jex.h"
#include <Xm/RowColumn.h>
#include <X11/cursorfont.h>
XtIntervalId sh_timer=0,sh_timer2=0;
struct {
	 Widget w,menu;
	 int topic,n;
	 XEvent event;
       } sh_topic;
extern XtAppContext app;

void SetLeave(void *n,XtIntervalId tid)
{
  SP("SetLeave");
  XtAddEventHandler(sh_topic.w,LeaveWindowMask,False,(XtEventHandler)RemoveSmallHelp,NULL);
  EP;
}

void ShowSmallHelp(void *n,XtIntervalId tid)
{
  XButtonPressedEvent xbe;
  XmString xstr;
  Position y,y2,h,x,x2,w;
  Widget tmp;
  static Cursor cursor=0;

  SP("ShowSmallHalp");
  sh_topic.n=2;
/*  XtRemoveEventHandler(sh_topic.w,LeaveWindowMask,False,(XtEventHandler)RemoveSmallHelp,NULL);*/
  switch (sh_topic.topic)
  {
    case 1: xstr=XmStringCreateLocalized("New");break;
    case 2: xstr=XmStringCreateLocalized("Open");break;
    case 3: xstr=XmStringCreateLocalized("Save");break;
    case 4: xstr=XmStringCreateLocalized("New Window");break;
    case 5: xstr=XmStringCreateLocalized("Clone");break;
    case 6: xstr=XmStringCreateLocalized("Cut");break;
    case 7: xstr=XmStringCreateLocalized("Copy");break;
    case 8: xstr=XmStringCreateLocalized("Paste");break;
    case 9: xstr=XmStringCreateLocalized("Clear");break;
    case 10: xstr=XmStringCreateLocalized("Undo");break;
    case 11: xstr=XmStringCreateLocalized("Redo");break;
    case 12: xstr=XmStringCreateLocalized("Shift left");break;
    case 13: xstr=XmStringCreateLocalized("Shift right");break;
    case 14: xstr=XmStringCreateLocalized("Compile");break;
    case 15: xstr=XmStringCreateLocalized("Make");break;
    case 16: xstr=XmStringCreateLocalized("Grep");break;
    case 17: xstr=XmStringCreateLocalized("Find downward");break;
    case 18: xstr=XmStringCreateLocalized("Find upward");break;
    case 19: xstr=XmStringCreateLocalized("Replace downward");break;
    case 20: xstr=XmStringCreateLocalized("Replace all");break;
    case 21: xstr=XmStringCreateLocalized("Capitals");break;
    case 22: xstr=XmStringCreateLocalized("Lowers");break;
    case 23: xstr=XmStringCreateLocalized("Set marker");break;
    case 24: xstr=XmStringCreateLocalized("Goto marker");break;
    case 25: xstr=XmStringCreateLocalized("Goto line number");break;
    case 26: xstr=XmStringCreateLocalized("Run");break;
    case 27: xstr=XmStringCreateLocalized("Goto line");break;
    default: xstr=XmStringCreateLocalized("Unknown");break;
  }    
  sh_topic.menu=XmVaCreateSimplePopupMenu(sh_topic.w,"SmallHelpPopup",NULL,
  	XmVaTITLE,xstr,NULL,NULL,NULL,
	NULL);
  if(!cursor)
    cursor = XCreateFontCursor(XtDisplay(sh_topic.menu), XC_top_left_arrow);
  XmSetMenuCursor(XtDisplay(sh_topic.menu),cursor);
  XmStringFree(xstr);
  xbe=*(XButtonPressedEvent*)&sh_topic.event;
  tmp=XtParent(sh_topic.w);
  y2=0;
  x2=0;
  while (!XtIsShell(tmp))
  {
    XtVaGetValues(tmp,XmNx,&x,XmNy,&y,NULL);
    x2+=x;
    y2+=y;
    tmp=XtParent(tmp);
  }
  XtVaGetValues(sh_topic.w,XmNx,&x,XmNy,&y,XmNwidth,&w,XmNheight,&h,NULL);
  xbe.y_root=y2+y+h;
  xbe.x_root=x2+x+w;
  XmMenuPosition(sh_topic.menu,&xbe);
  XtVaSetValues(sh_topic.menu,XmNx,xbe.x_root,XmNy,xbe.y_root,NULL);
  XtManageChild(sh_topic.menu);
/*  XtAppAddTimeOut(app,10,(XtTimerCallbackProc)SetLeave,NULL);*/
  sh_timer=0;
  EP;
}

void DoNothing(void *n,XtIntervalId tid)
{
  SP("DoNothing");
  sh_timer2=0;
  EP;
}

void SmallHelp(Widget w,int n,XEvent *event)
{
  SP("SmallHelp");
  sh_topic.w=w;
  sh_topic.topic=n;
  sh_topic.event=*event;
  sh_topic.n=1;
  if (sh_timer2)
  {
    XtRemoveTimeOut(sh_timer2);
    sh_timer2=XtAppAddTimeOut(app,200,(XtTimerCallbackProc)DoNothing,NULL);
    if (sh_timer)
      XtRemoveTimeOut(sh_timer);
    sh_timer=XtAppAddTimeOut(app,200,(XtTimerCallbackProc)ShowSmallHelp,NULL);
  }
  else if (sh_timer)
  {
    XtRemoveTimeOut(sh_timer);
    sh_timer=XtAppAddTimeOut(app,200,(XtTimerCallbackProc)ShowSmallHelp,NULL);
  }
  else
    sh_timer=XtAppAddTimeOut(app,1000,(XtTimerCallbackProc)ShowSmallHelp,NULL);
  EP;
}

void RemoveSmallHelp(Widget w,int n,void *cbs)
{
  static Cursor cursor=0;
  Widget tmp;
  int x;

  SP("RemoveSmallHelp");
  if (sh_timer)
  {
    XtRemoveTimeOut(sh_timer);
    sh_timer=0;
  }
  sh_topic.n--;
  if ((!sh_topic.n || n) && sh_topic.menu)
  {
    if(!cursor)
      cursor = XCreateFontCursor(XtDisplay(sh_topic.menu), XC_arrow);
    XmSetMenuCursor(XtDisplay(sh_topic.menu),cursor);
    XtUnmanageChild(sh_topic.menu);
    XtDestroyWidget(sh_topic.menu);
    sh_topic.menu=NULL;
    sh_timer2=XtAppAddTimeOut(app,500,(XtTimerCallbackProc)DoNothing,NULL);
  }
  tmp=w;
  while (!XtIsShell(tmp))
    tmp=XtParent(tmp);
  for (x=0;x<editors;x++)
  {
    if (editor[x]->shell==tmp)
      SetCurrentWidget(editor[x]->text);
  }  
  EP;
}

jex-1.3.7/statist.c100644      0      0       11024  6672726720  12262 0ustar  rootroot#include <Xm/Form.h>
#include <Xm/MessageB.h>
#include <Xm/TextF.h>
#include <Xm/LabelG.h>
#include "jex.h"

extern XtAppContext app;

void GetStatistics(Editor *e,XtIntervalId tid)
{
  int len,ln,x;
  char *str,tmp[30];
  
SP("GetStatistics");
  XtVaGetValues(e->text,XmNvalue,&str,NULL);
  len=db_strlen(str);
  ln=1;
  for (x=0;x<len;x++)
  {
    if (str[x]=='\n')
      ln++;
  }
  XtFree(str);
  sprintf(tmp,"%d",ln);
  XtVaSetValues(e->statln,XmNvalue,tmp,NULL);
  sprintf(tmp,"%d",len);
  XtVaSetValues(e->statch,XmNvalue,tmp,NULL);
  sprintf(tmp,"%d",e->changes);
  XtVaSetValues(e->statchan,XmNvalue,tmp,NULL);
  sprintf(tmp,"%d",e->undosize);
  XtVaSetValues(e->statundo,XmNvalue,tmp,NULL);
  sprintf(tmp,"%d",e->redosize);
  XtVaSetValues(e->statredo,XmNvalue,tmp,NULL);
  e->tid3=XtAppAddTimeOut(app,5000,(XtTimerCallbackProc)GetStatistics,(void*)e);
EP;
}

void StatOK(Widget w,Editor *e,void *cbs)
{
SP("StatOK");
  if (e->tid3)
    XtRemoveTimeOut(e->tid3);
  SetCurrentWidget(e->text);
EP;
}

void StatCancel(Widget w,Editor *e,void *cbs)
{
SP("StatCancel");
  SetCurrentWidget(e->text);
EP;
}

void ShowStats(Editor *e)
{
  Widget f,w1;
  
SP("ShowStats");
  WatchCursor(e,1);
  if (e->std==NULL)
  {
    e->std=XmCreateMessageDialog(e->shell,"StatDialog",NULL,0);
    XtUnmanageChild(XmMessageBoxGetChild(e->std,XmDIALOG_CANCEL_BUTTON));
    XtUnmanageChild(XmMessageBoxGetChild(e->std,XmDIALOG_HELP_BUTTON));
    XtAddCallback(e->std,XmNokCallback,(XtCallbackProc)StatOK,(void*)e);
    XtAddCallback(e->std,XmNcancelCallback,(XtCallbackProc)StatCancel,(void*)e);
    f=XtVaCreateManagedWidget("StatForm",xmFormWidgetClass,e->std,
    	XmNfractionBase,2,NULL);
    w1=XtVaCreateManagedWidget("StatLinesLabel",xmLabelGadgetClass,f,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,1,
    	XmNtopOffset,5,
    	NULL);
    e->statln=XtVaCreateManagedWidget("StatLinesField",xmTextFieldWidgetClass,f,
    	XmNtopAttachment,XmATTACH_FORM,
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,w1,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNeditable,False,
    	NULL);
    w1=XtVaCreateManagedWidget("StatCharsLabel",xmLabelGadgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->statln,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNtopOffset,5,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,1,
    	NULL);
    e->statch=XtVaCreateManagedWidget("StatCharsField",xmTextFieldWidgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->statln,
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,w1,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNeditable,False,
    	NULL);
    w1=XtVaCreateManagedWidget("StatChangesLabel",xmLabelGadgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->statch,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNtopOffset,5,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,1,
    	NULL);
    e->statchan=XtVaCreateManagedWidget("StatChangesField",xmTextFieldWidgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->statch,
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,w1,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNeditable,False,
    	NULL);
    w1=XtVaCreateManagedWidget("StatUndoLabel",xmLabelGadgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->statchan,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNtopOffset,5,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,1,
    	NULL);
    e->statundo=XtVaCreateManagedWidget("StatUndoField",xmTextFieldWidgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->statchan,
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,w1,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNeditable,False,
    	NULL);
    w1=XtVaCreateManagedWidget("StatRedoLabel",xmLabelGadgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->statundo,
    	XmNleftAttachment,XmATTACH_FORM,
    	XmNtopOffset,5,
    	XmNrightAttachment,XmATTACH_POSITION,
    	XmNrightPosition,1,
    	NULL);
    e->statredo=XtVaCreateManagedWidget("StatRedoField",xmTextFieldWidgetClass,f,
    	XmNtopAttachment,XmATTACH_WIDGET,
    	XmNtopWidget,e->statundo,
    	XmNleftAttachment,XmATTACH_WIDGET,
    	XmNleftWidget,w1,
    	XmNrightAttachment,XmATTACH_FORM,
    	XmNeditable,False,
    	NULL);
  }
  if (!e->tid3)
    e->tid3=XtAppAddTimeOut(app,5000,(XtTimerCallbackProc)GetStatistics,(void*)e);
  XtManageChild(e->std);
  GetStatistics(e,0);
  WatchCursor(e,0);
EP;
}

jex-1.3.7/undo.c100644      0      0       22751  6672726720  11545 0ustar  rootroot#include <Xm/Text.h>
#include <stdlib.h>
#include "jex.h"

void NoUndo(Editor *e)
{
  Undo_T tundo;
  
SP("NoUndo");
  while (GetFirstElement(e->undolist,&tundo))
  {
    if (tundo.deletesize)
      db_free(tundo.undelete);
    DeleteFirstElement(e->undolist);
  }
  while (GetFirstElement(e->redolist,&tundo))
  {
    if (tundo.deletesize)
      db_free(tundo.undelete);
    DeleteFirstElement(e->redolist);
  }
  e->undosize=0;
  e->changes=0;
  e->redosize=0;
  XtVaSetValues(e->undo,XmNsensitive,False,NULL);
  XtVaSetValues(e->redo,XmNsensitive,False,NULL);
#ifndef LESSTIFF
  XtVaSetValues(XtNameToWidget(e->mb,"*editmenu.button_0"),XmNsensitive,False,NULL);
  XtVaSetValues(XtNameToWidget(e->mb,"*editmenu.button_1"),XmNsensitive,False,NULL);
  XtVaSetValues(XtNameToWidget(e->text,"*Popup.button_4"),XmNsensitive,False,NULL);
  XtVaSetValues(XtNameToWidget(e->text,"*Popup.button_5"),XmNsensitive,False,NULL);
#endif  
EP;
}   

void DeleteText(Widget w,Editor *e,XmTextVerifyCallbackStruct *cbs)
{
  char *buf;
  Undo_T tundo,pu;
  int changed=0;
 
SP("DeleteText");
  if (e->lastaction!=1 && e->undosize>e->undolevels)
  {
    GetFirstElement(e->undolist,&tundo);
    if (tundo.deletesize)
      db_free(tundo.undelete);
    e->undosize--;
    DeleteFirstElement(e->undolist);
  }
  else if (e->lastaction==1 && e->redosize>e->undolevels)
  {
    GetFirstElement(e->redolist,&tundo);
    if (tundo.deletesize)
      db_free(tundo.undelete);
    e->redosize--;
    DeleteFirstElement(e->redolist);
  }
  tundo.insertsize=cbs->text->length;
  tundo.pos=cbs->startPos;
  if (cbs->startPos!=cbs->endPos)
  {
    tundo.deletesize=cbs->endPos-cbs->startPos;
    if (e->marker!=-1)
    {
      if (e->marker>=cbs->endPos)
        e->marker-=tundo.deletesize;
      else if (e->marker>=cbs->startPos && e->marker<cbs->endPos)
        RemoveMarker(e);
    }
    XtVaGetValues(w,XmNvalue,&buf,NULL);
    if ((tundo.undelete=(char*)db_malloc(tundo.deletesize+1))==NULL)
    {
      XtFree(buf);
EP;
      return;
    }
    db_strncpy(tundo.undelete,&buf[cbs->startPos],tundo.deletesize); 
    tundo.undelete[tundo.deletesize]='\0';     
    XtFree(buf); 
  }
  else
  {
    tundo.deletesize=0;
  }
  if (e->marker>=cbs->startPos)
    e->marker+=tundo.insertsize;
  if (e->lastaction==1)
  {
    AddElement(e->redolist,&tundo);
    e->lastaction=0;
    if (!e->redosize)
    {
      XtVaSetValues(e->redo,XmNsensitive,True,NULL);
#ifndef LESSTIFF    
      XtVaSetValues(XtNameToWidget(e->mb,"*editmenu.button_1"),XmNsensitive,True,NULL);
      XtVaSetValues(XtNameToWidget(e->text,"*Popup.button_5"),XmNsensitive,True,NULL);
#endif
    }
    e->redosize++;
  }
  else
  {
    if (e->blockundo)
    {
      if (GetLastElement(e->undolist,&pu))
      {
        if (/*pu.insertsize && !pu.deletesize &&*/ tundo.insertsize && !tundo.deletesize &&
            tundo.pos-pu.insertsize==pu.pos)
        {
          pu.insertsize+=tundo.insertsize;
          ReplaceCurrentElement(e->undolist,&pu);
          changed=1;
        }
        else if (!pu.insertsize && pu.deletesize && !tundo.insertsize && tundo.deletesize &&
            tundo.pos==pu.pos)
        {
          pu.undelete=db_realloc(pu.undelete,pu.deletesize+tundo.deletesize+1);
          db_memcpy(&pu.undelete[pu.deletesize],tundo.undelete,tundo.deletesize+1);
          pu.deletesize+=tundo.deletesize;
          db_free(tundo.undelete);
          ReplaceCurrentElement(e->undolist,&pu);
          changed=1;
        }
        else if (!pu.insertsize && pu.deletesize && !tundo.insertsize && tundo.deletesize &&
            pu.pos-tundo.deletesize==tundo.pos)
        {
          tundo.undelete=db_realloc(tundo.undelete,tundo.deletesize+pu.deletesize+1);
          db_memcpy(&tundo.undelete[tundo.deletesize],pu.undelete,pu.deletesize+1);
          tundo.deletesize+=pu.deletesize;
          db_free(pu.undelete);
          ReplaceCurrentElement(e->undolist,&tundo);
          changed=1;
        }
      }
    }
    if (!changed)
    {
      AddElement(e->undolist,&tundo);
      if (!e->undosize)
      {
        XtVaSetValues(e->undo,XmNsensitive,True,NULL);
#ifndef LESSTIFF    
        XtVaSetValues(XtNameToWidget(e->mb,"*editmenu.button_0"),XmNsensitive,True,NULL);
        XtVaSetValues(XtNameToWidget(e->text,"*Popup.button_4"),XmNsensitive,True,NULL);
#endif
      }
      e->undosize++;
      e->changes++;
    }
    if (!e->lastaction)
    {
      while (GetFirstElement(e->redolist,&tundo))
      {
        if (tundo.deletesize)
          db_free(tundo.undelete);
        DeleteFirstElement(e->redolist);
      }
      e->redosize=0;
      XtVaSetValues(e->redo,XmNsensitive,False,NULL);
#ifndef LESSTIFF    
      XtVaSetValues(XtNameToWidget(e->mb,"*editmenu.button_1"),XmNsensitive,False,NULL);
      XtVaSetValues(XtNameToWidget(e->text,"*Popup.button_5"),XmNsensitive,False,NULL);
#endif
    }
    else
      e->lastaction=0;
  }
EP;
}

void UndoAction(Widget w,Editor *e,void *cbs)
{
  Undo_T tundo;
  int is,ds;
  
SP("UndoAction");
  if (e->read_only)
  {
    SetCurrentWidget(e->text);
EP;  
    return;
  }
  if (!GetLastElement(e->undolist,&tundo))
  {
    SetCurrentWidget(e->text);
EP;
    return;
  }
  WatchCursor(e,1);
  do
  {
    is=tundo.insertsize;
    ds=tundo.deletesize;
    e->lastaction=1;
    e->undosize--;
    e->changes--;
    if (!e->undosize)
    {
      XtVaSetValues(e->undo,XmNsensitive,False,NULL);
#ifndef LESSTIFF    
      XtVaSetValues(XtNameToWidget(e->mb,"*editmenu.button_0"),XmNsensitive,False,NULL);
      XtVaSetValues(XtNameToWidget(e->text,"*Popup.button_4"),XmNsensitive,False,NULL);
#endif
    }
    if (tundo.insertsize && tundo.deletesize)
    {
      XmTextReplace(e->text,tundo.pos,tundo.insertsize+tundo.pos,tundo.undelete);
      db_free(tundo.undelete);
      XmTextSetInsertionPosition(e->text,tundo.pos+tundo.deletesize);
    }
    else if (tundo.insertsize)
    {
      XmTextReplace(e->text,tundo.pos,tundo.pos+tundo.insertsize,"");
      XmTextSetInsertionPosition(e->text,tundo.pos+tundo.insertsize);
    }
    else if (tundo.deletesize)
    {
      XmTextInsert(e->text,tundo.pos,tundo.undelete);
      db_free(tundo.undelete);
      XmTextSetInsertionPosition(e->text,tundo.pos+tundo.deletesize);
    }
    DeleteLastElement(e->undolist);
    if (!GetLastElement(e->undolist,&tundo))
      break;
  } while (e->blockundo && tundo.insertsize==is && tundo.deletesize==ds);
  if (!e->changes)
  {
/*    XtUnmanageChild(e->save);*/
    SetSave(e,False);

    e->saved=1;
  }
  SetCurrentWidget(e->text);
  WatchCursor(e,0);
EP;
}

void RedoAction(Widget w,Editor *e,void *cbs)
{
  Undo_T undo;
  int is,ds;
  
SP("RedoAction");
  if (e->read_only)
  {
    SetCurrentWidget(e->text);
EP;  
    return;
  }
  if (!GetLastElement(e->redolist,&undo))
  {
    SetCurrentWidget(e->text);
EP;  
    return;
  }
  WatchCursor(e,1);
  do
  {
    is=undo.insertsize;
    ds=undo.deletesize;
    e->redosize--;
    if (!e->redosize)
    {
      XtVaSetValues(e->redo,XmNsensitive,False,NULL);
#ifndef LESSTIFF    
      XtVaSetValues(XtNameToWidget(e->mb,"*editmenu.button_1"),XmNsensitive,False,NULL);
      XtVaSetValues(XtNameToWidget(e->text,"*Popup.button_5"),XmNsensitive,False,NULL);
#endif
    }
    e->lastaction=2;
    if (undo.insertsize && undo.deletesize)
    {
      XmTextReplace(e->text,undo.pos,undo.insertsize+undo.pos,undo.undelete);
      db_free(undo.undelete);
      XmTextSetInsertionPosition(e->text,undo.pos+undo.deletesize);
    }
    else if (undo.insertsize)
    {
      XmTextReplace(e->text,undo.pos,undo.pos+undo.insertsize,"");
      XmTextSetInsertionPosition(e->text,undo.pos+undo.insertsize);
    }
    else if (undo.deletesize)
    {
      XmTextInsert(e->text,undo.pos,undo.undelete);
      db_free(undo.undelete);
      XmTextSetInsertionPosition(e->text,undo.pos+undo.deletesize);
    }
    DeleteLastElement(e->redolist);
    if (!GetLastElement(e->redolist,&undo))
      break;
  } while (e->blockundo && is==undo.insertsize && ds==undo.deletesize);
  SetCurrentWidget(e->text);
  WatchCursor(e,0);
EP;
}

void RepeatAction(Widget w,Editor *e,void *cbs)
{
  Undo_T tundo;
  int is,ds,tmp;
  char *str;
  XmTextPosition pos,curpos;
  
SP("RepeatAction");
  if (e->read_only)
  {
    SetCurrentWidget(e->text);
EP;  
    return;
  }
  if (!GetLastElement(e->undolist,&tundo))
  {
    SetCurrentWidget(e->text);
EP;
    return;
  }
  WatchCursor(e,1);
  is=tundo.insertsize;
  ds=tundo.deletesize;
  curpos=XmTextGetInsertionPosition(e->text);
  if (tundo.insertsize && tundo.deletesize)
  {
    XmTextSetSelection(e->text,tundo.pos,tundo.insertsize+tundo.pos,0);
    str=XmTextGetSelection(e->text);
    if (XmTextFindString(e->text,curpos,tundo.undelete,XmTEXT_FORWARD,&pos))
    {    
      XmTextReplace(e->text,pos,tundo.deletesize+pos,str);
      XmTextSetSelection(e->text,0,0,0);
      XmTextSetInsertionPosition(e->text,pos+tundo.insertsize);
    }
    else
    {
      XmTextSetSelection(e->text,0,0,0);
      XmTextSetInsertionPosition(e->text,curpos);
    }
    XtFree(str);
  }
  else if (tundo.deletesize)
  {
    if (XmTextFindString(e->text,curpos,tundo.undelete,XmTEXT_FORWARD,&pos))
    {    
      XmTextReplace(e->text,pos,tundo.deletesize+pos,"");
      XmTextSetInsertionPosition(e->text,pos);
    }
  }
  else if (tundo.insertsize)
  {
    XmTextSetSelection(e->text,tundo.pos,tundo.insertsize+tundo.pos,0);
    str=XmTextGetSelection(e->text);
    tmp=e->blockundo;
    e->blockundo=0;
    XmTextInsert(e->text,curpos,str);
    e->blockundo=tmp;
    XmTextSetSelection(e->text,0,0,0);
    XmTextSetInsertionPosition(e->text,curpos+strlen(str));
    XtFree(str);
  }
  SetCurrentWidget(e->text);
  WatchCursor(e,0);
EP;
}

jex-1.3.7/version.c100644      0      0        2402  6672726722  12236 0ustar  rootroot#include <Xm/MessageB.h>
#include "jex.h"
#include "list.h"

extern Widget top;
extern XtAppContext app;

void ReallyShowVersion(void)
{
  Widget w;
  XmString xstr;
  char str[100];
  
SP("ReallyShowVersion");
  w=XmCreateInformationDialog(top,"VersionDialog",NULL,0);
  XtUnmanageChild(XmMessageBoxGetChild(w,XmDIALOG_CANCEL_BUTTON));
  XtUnmanageChild(XmMessageBoxGetChild(w,XmDIALOG_HELP_BUTTON));
  sprintf(str,"You are now using version %d.%d.%d of jex, please look at the help to see what's new.",MAJOR_VERSION,MINOR_VERSION,SUB_MINOR_VERSION);
  xstr=XmStringCreateLocalized(str);
  XtVaSetValues(w,XmNmessageString,xstr,NULL);
  XmStringFree(xstr);
  XtManageChild(w);
EP;
}

void ShowVersion(void)
{
SP("ShowVersion");
  XtAppAddTimeOut(app,500,(XtTimerCallbackProc)ReallyShowVersion,NULL);
EP;
}

void CheckVersion(char *version)
{
  int major,minor,sub_minor;
  
  SP("ShowVersion");
  if (version)
  {
    if (sscanf(version,"%d.%d.%d",&major,&minor,&sub_minor)==3)
    {
      if (major<MAJOR_VERSION)
        ShowVersion();
      else if (major==MAJOR_VERSION && minor<MINOR_VERSION)
        ShowVersion();
      else if (major==MAJOR_VERSION && minor==MINOR_VERSION && sub_minor<SUB_MINOR_VERSION)
        ShowVersion();
    }
  }
  else
    ShowVersion();
  EP;
}

jex-1.3.7/watchcur.c100644      0      0        3165  6672726720  12376 0ustar  rootroot#include <X11/cursorfont.h>
#include "jex.h"
 
extern Widget top;

void WatchCursor(Editor *e,int turn_on)
{
    static Cursor cursor=0;
    XSetWindowAttributes attrs;
    Display *disp;

SP("WatchCursor");
    disp=XtDisplay(top);
    /* "locked" keeps track if we've already called the function.
       This allows recursion and is necessary for most situations;
    */
    turn_on ? e->locked++ : e->locked--;
    if (e->locked<0)
      e->locked=0;
    if(e->locked > 1 || ( e->locked ==1 && turn_on == False ))
    {
EP;    
                return;         /* already locked and we're not unlocking */
    }

    if(!cursor)         /* if not initialized do it */
        cursor = XCreateFontCursor(disp, XC_watch);
    /* if "turn_on" is true, then turn on watch cursor, otherwise, return
       the shell's cursor to normal
    */
    attrs.cursor = turn_on ? cursor : None;

    XChangeWindowAttributes(disp,XtWindow(top),CWCursor,&attrs);
    if (e->fd)
      XChangeWindowAttributes(disp,XtWindow(e->fd),CWCursor,&attrs);
    if (e->iod)
    {
      if (XtWindowOfObject(e->iod))
        XChangeWindowAttributes(disp,XtWindowOfObject(e->iod),CWCursor,&attrs);
      else if (XtWindow(e->iod))
        XChangeWindowAttributes(disp,XtWindow(e->iod),CWCursor,&attrs);
    }
    if (e->shell)
      XChangeWindowAttributes(disp,XtWindow(e->shell),CWCursor,&attrs);
    if (e->sd)
      XChangeWindowAttributes(disp,XtWindow(e->sd),CWCursor,&attrs);
    if (e->abd)
      XChangeWindowAttributes(disp,XtWindow(e->abd),CWCursor,&attrs);
    if (e->gd)
      XChangeWindowAttributes(disp,XtWindow(e->gd),CWCursor,&attrs);

    XFlush(disp);
EP;
} 

jex-1.3.7/xpm.c100644      0      0        3136  6672726720  11360 0ustar  rootroot#include <Xm/Xm.h>
#include <stdio.h>
#include "xpm.h"
#include "jbdbg.h"

Pixmap CreatePixmapFromXPM(Widget top,char **data)
{
  XGCValues gcv;
  GC gc;
  Pixmap pixmap=0;
  XColor xc[256];
  int width,height,colors,chars;
  char c_char;
  char color[20];
  int x,y;
  Colormap cm;
  unsigned long mask[20],pixels[20];
  Pixel bg;
  Display *display;
  Drawable d;
  Screen *s;
  
  SP("CreatePixmapFromXPM");
  display=XtDisplay(top);
  s=XtScreen(top);
  d=XRootWindowOfScreen(s);
  
  sscanf(data[0],"%d %d %d %d",&width,&height,&colors,&chars);
  if (chars>1)
  {
    printf("Too many chars/pixel in xpm\n");
    EP;
    return pixmap;
  }
  if (colors>255)
  {
    printf("Too many colors in xpm\n");
    EP;
    return pixmap;
  }
  XtVaGetValues(top,XmNbackground,&bg,NULL);
  gcv.foreground=WhitePixelOfScreen(s);
  gcv.background=bg;
  gcv.line_style=LineSolid;
  gc=XCreateGC(display,d,GCLineStyle|GCForeground|GCBackground,&gcv);
  pixmap=XCreatePixmap(display,d,width,height,DefaultDepthOfScreen(s));
  cm=DefaultColormapOfScreen(s);
  mask[0]=1;
  mask[1]=0;
  pixels[0]=1;
  pixels[1]=0;
  for (x=0;x<colors;x++)  
  {
    sscanf(data[1+x],"%c c %s",&c_char,color);
    if (!strcmp(color,"None"))
      xc[(int)c_char].pixel=bg;
    else
    {
      XParseColor(display,cm,color,&xc[(int)c_char]);
      if ((XAllocColor(display,cm,&xc[(int)c_char]))==0)
        printf("Error allocating color\n");
    }
  }
  for (y=0;y<height;y++)
  {
    for (x=0;x<width;x++)
    {
      XSetForeground(display,gc,xc[(int)data[1+colors+y][x]].pixel);
      XDrawPoint(display,pixmap,gc,x,y);
    }
  }
  EP;
  return pixmap;
}
jex-1.3.7/combo.h100644      0      0        1202  6672726722  11652 0ustar  rootroot#include <Xm/Xm.h>

typedef struct {
		 char *item;
		 Widget button;
               } ComboButton;

typedef struct {
		 Widget text,form,button,popup;
		 ComboButton *items;
		 int itemcount,maxitems;
		 void *client_data;
		 XtCallbackProc function;
               } ComboBox;

Widget CreateComboBox(Widget parent,String name,ArgList arglist,Cardinal argcount,int maxitems);
void UpdateComboBox(Widget w,char *str);
void DestroyAllComboBoxes(void);
int GetComboBox(Widget w,ComboBox *c);
void InitializeComboBox(Widget w,Widget refl);
void CopyComboBoxToFile(Widget w,FILE *f);
void ComboBoxAddCallback(Widget w,XtCallbackProc f,void *d);

jex-1.3.7/fallbacks.h100644      0      0       30376  6672726720  12531 0ustar  rootroot#include <Xm/Xm.h>

String fallbacks[]={
"*fontList: 6x13",
"*highlightColor: black",
"*settings_in_home_dir: False",
"*history_in_home_dir: False",
/*"*background: #4682b4",*/
/*"*foreground: White",*/
"*background: #aaaaaa",
"*foreground: Black",
"*text.rows: 25",
"*text.columns: 80",
/*"*text.background: #36648b",*/
"*text.background: #666666",
"*text.foreground: White",
"*Goto.labelString: Goto line",
"*gotofield.columns: 12",
"*menubar.button_0.labelString: File",
"*menubar.button_0.mnemonic: F",
"*menubar.button_1.labelString: Edit",
"*menubar.button_1.mnemonic: E",
"*menubar.button_2.labelString: Options",
"*menubar.button_2.mnemonic: O",
"*menubar.button_3.labelString: Bookmarks",
"*menubar.button_3.mnemonic: B",
"*menubar.button_4.labelString: Tools",
"*menubar.button_4.mnemonic: T",
"*menubar.button_5.labelString: View",
"*menubar.button_5.mnemonic: V",
"*menubar.button_7.labelString: Help",
"*menubar.button_7.mnemonic: H",
"*filemenu.button_0.labelString: New Window",
"*filemenu.button_0.mnemonic: W",
"*filemenu.button_0.accelerator: Alt<Key>W",
"*filemenu.button_0.acceleratorText: Alt-W",
"*filemenu.button_1.labelString: Clone",
"*filemenu.button_1.mnemonic: o",
"*filemenu.button_2.labelString: New",
"*filemenu.button_2.mnemonic: N",
"*filemenu.button_2.accelerator: Alt<Key>N",
"*filemenu.button_2.acceleratorText: Alt-N",
"*filemenu.button_3.labelString: Load ...",
"*filemenu.button_3.mnemonic: L",
"*filemenu.button_3.accelerator: Alt<Key>L",
"*filemenu.button_3.acceleratorText: Alt-L",
"*filemenu.button_4.labelString: Save",
"*filemenu.button_4.mnemonic: S",
"*filemenu.button_4.accelerator: Alt<Key>S",
"*filemenu.button_4.acceleratorText: Alt-S",
"*filemenu.button_5.labelString: Save As ...",
"*filemenu.button_5.mnemonic: A",
"*filemenu.button_5.accelerator: Alt<Key>A",
"*filemenu.button_5.acceleratorText: Alt-A",
"*filemenu.button_6.labelString: Reload",
"*filemenu.button_6.mnemonic: e",
"*filemenu.button_7.labelString: Revert",
"*filemenu.button_7.mnemonic: R",
"*filemenu.button_8.labelString: Insert ...",
"*filemenu.button_8.mnemonic: I",
"*filemenu.button_9.labelString: Print",
"*filemenu.button_9.mnemonic: P",
"*filemenu.button_10.labelString: Close",
"*filemenu.button_10.mnemonic: X",
"*filemenu.button_10.accelerator: Alt<Key>X",
"*filemenu.button_10.acceleratorText: Alt-X",
"*editmenu.button_0.labelString: Undo",
"*editmenu.button_0.mnemonic: U",
"*editmenu.button_0.accelerator: Ctrl<Key>U",
"*editmenu.button_0.acceleratorText: Ctrl-U",
"*editmenu.button_1.labelString: Redo",
"*editmenu.button_1.mnemonic: R",
"*editmenu.button_1.accelerator: Ctrl<Key>R",
"*editmenu.button_1.acceleratorText: Ctrl-R",
"*editmenu.button_2.labelString: Repeat",
"*editmenu.button_2.mnemonic: p",
"*editmenu.button_2.accelerator: Ctrl<Key>P",
"*editmenu.button_2.acceleratorText: Ctrl-P",
"*editmenu.button_3.labelString: Copy",
"*editmenu.button_3.mnemonic: C",
"*editmenu.button_3.accelerator: Ctrl<Key>C",
"*editmenu.button_3.acceleratorText: Ctrl-C",
"*editmenu.button_4.labelString: Cut",
"*editmenu.button_4.mnemonic: t",
"*editmenu.button_4.accelerator: Ctrl<Key>X",
"*editmenu.button_4.acceleratorText: Ctrl-X",
"*editmenu.button_5.labelString: Paste",
"*editmenu.button_5.mnemonic: P",
"*editmenu.button_5.accelerator: Ctrl<Key>V",
"*editmenu.button_5.acceleratorText: Ctrl-V",
"*editmenu.button_6.labelString: Clear",
"*editmenu.button_6.mnemonic: l",
"*editmenu.button_6.accelerator: Ctrl<Key>L",
"*editmenu.button_6.acceleratorText: Ctrl-L",
"*editmenu.button_7.labelString: Capitals",
"*editmenu.button_7.mnemonic: a",
"*editmenu.button_7.accelerator: Ctrl<Key>A",
"*editmenu.button_7.acceleratorText: Ctrl-A",
"*editmenu.button_8.labelString: Lowers",
"*editmenu.button_8.mnemonic: o",
"*editmenu.button_8.accelerator: Ctrl<Key>O",
"*editmenu.button_8.acceleratorText: Ctrl-O",
"*editmenu.button_9.labelString: Shift Left",
"*editmenu.button_9.mnemonic: S",
"*editmenu.button_9.accelerator: Ctrl<Key>osfLeft",
"*editmenu.button_9.acceleratorText: Ctrl-Left",
"*editmenu.button_10.labelString: Shift Right",
"*editmenu.button_10.mnemonic: h",
"*editmenu.button_10.accelerator: Ctrl<Key>osfRight",
"*editmenu.button_10.acceleratorText: Ctrl-Right",
"*editmenu.button_11.labelString: Match char",
"*editmenu.button_11.mnemonic: M",
"*editmenu.button_11.accelerator: Ctrl<Key>M",
"*editmenu.button_11.acceleratorText: Ctrl-M",
"*editmenu.button_12.labelString: Set marker",
"*editmenu.button_12.mnemonic: S",
"*editmenu.button_12.accelerator: Ctrl<Key>S",
"*editmenu.button_12.acceleratorText: Ctrl-S",
"*editmenu.button_13.labelString: Goto marker",
"*editmenu.button_13.mnemonic: G",
"*editmenu.button_13.accelerator: Ctrl<Key>G",
"*editmenu.button_13.acceleratorText: Ctrl-G",
"*optionmenu.button_0.labelString: Settings ...",
"*optionmenu.button_0.mnemonic: S",
"*optionmenu.button_1.labelString: Read only",
"*optionmenu.button_1.mnemonic: R",
"*bookmarkmenu.button_0.labelString: Add Bookmark",
"*bookmarkmenu.button_0.mnemonic: A",
"*bookmarkmenu.button_1.labelString: Bookmarks ...",
"*bookmarkmenu.button_1.mnemonic: B",
"*toolsmenu.button_0.labelString: Compile",
"*toolsmenu.button_0.mnemonic: C",
"*toolsmenu.button_0.accelerator: <Key>F8",
"*toolsmenu.button_0.acceleratorText: F8",
"*toolsmenu.button_1.labelString: Make",
"*toolsmenu.button_1.mnemonic: M",
"*toolsmenu.button_1.accelerator: <Key>F9",
"*toolsmenu.button_1.acceleratorText: F9",
"*toolsmenu.button_2.labelString: Run",
"*toolsmenu.button_2.mnemonic: R",
"*toolsmenu.button_2.accelerator: <Key>F6",
"*toolsmenu.button_2.acceleratorText: F6",
"*toolsmenu.button_3.labelString: Grep ...",
"*toolsmenu.button_3.mnemonic: G",
"*toolsmenu.button_3.accelerator: <Key>F7",
"*toolsmenu.button_3.acceleratorText: F7",
"*viewmenu.button_0.labelString: Editors ...",
"*viewmenu.button_0.mnemonic: E",
"*viewmenu.button_1.labelString: Output window ...",
"*viewmenu.button_1.mnemonic: O",
"*viewmenu.button_2.labelString: Statistics ...",
"*viewmenu.button_2.mnemonic: S",
"*helpmenu.button_0.labelString: General help ...",
"*helpmenu.button_0.mnemonic: G",
"*helpmenu.button_1.labelString: Get the Latest version",
"*helpmenu.button_1.mnemonic: L",
"*helpmenu.button_2.labelString: About ...",
"*helpmenu.button_2.mnemonic: A",
"*Save.labelString: *",
"*AskToSave.messageString: Do you want to save the file?",
"*AskToSave.okLabelString: Yes",
"*AskToSave.cancelLabelString: No",
"*AskToSave.helpLabelString: Cancel",
"*AskToSave.dialogTitle: Save?",
"*AskToOverwrite.messageString: Do you want to overwrite the existing file?",
"*AskToOverwrite.okLabelString: Yes",
"*AskToOverwrite.cancelLabelString: No",
"*AskToOverwrite.helpLabelString: Cancel",
"*AskToOverwrite.dialogTitle: Overwrite?",
"*LoadError.messageString: Can't open file!",
"*LoadError.background: Red",
"*LoadError.foreground: White",
"*LoadError.textFontList: *hel*-b*-r-*-14-*",
"*LoadError.buttonFontList: *hel*-b*-r-*-14-*",
"*LoadError.labelFontList: *hel*-b*-r-*-14-*",
"*LoadError.dialogTitle: Load error",
"*ErrorDialog.textFontList: *hel*-b*-r-*-14-*",
"*ErrorDialog.buttonFontList: *hel*-b*-r-*-14-*",
"*ErrorDialog.labelFontList: *hel*-b*-r-*-14-*",
"*ErrorDialog.dialogTitle: Error",
"*VersionDialog.textFontList: *hel*-b*-r-*-14-*",
"*VersionDialog.buttonFontList: *hel*-b*-r-*-14-*",
"*VersionDialog.labelFontList: *hel*-b*-r-*-14-*",
"*VersionDialog.dialogTitle: Information",
"*SaveError.messageString: Can't save file!",
"*SaveError.background: Red",
"*SaveError.foreground: White",
"*SaveError.textFontList: *hel*-b*-r-*-14-*",
"*SaveError.buttonFontList: *hel*-b*-r-*-14-*",
"*SaveError.labelFontList: *hel*-b*-r-*-14-*",
"*SaveError.dialogTitle: Save error",
"*SaveAs.dialogTitle: Save As",
"*Load.dialogTitle: Load",
"*deleteResponse: XmDO_NOTHING",
"*XmTextField.translations: #override \
<Key>BackSpace: delete-previous-character()",
"*XmText.translations: #override \
<Key>Return: newline-and-indent() \n\
<Key>BackSpace: delete-previous-character()",
"*Popup.button_0.labelString: Copy",
"*Popup.button_1.labelString: Cut",
"*Popup.button_2.labelString: Paste",
"*Popup.button_3.labelString: Clear",
"*Popup.button_4.labelString: Undo",
"*Popup.button_5.labelString: Redo",
"*Popup.button_6.labelString: Goto",
"*FSFilterDirLabel.labelString: Directory",
"*FSFilter.labelString: Filter",
"*FSDirLabel.labelString: Directories",
"*FSFileLabel.labelString: Files",
"*FSSelection.labelString: Selection",
"*FSDirList.visibleItemCount: 10",
"*FSFileList.visibleItemCount: 10",
"*FSForm.horizontalSpacing: 20",
"*FSSize.labelString: 0 bytes",
"*FSFilterField.columns: 5",
"*text.translations: #override \
<Btn3Down>: PopupMenu()",
"*Settings.dialogTitle: Settings",
"*selectColor: Yellow",
"*WordWrap.labelString: Word Wrap",
"*AutoIndent.labelString: Auto Indent",
"*UndoLevelLabel.labelString: Undo Levels: ",
"*UndoLevelLabel.alignment: XmALIGNMENT_BEGINNING",
"*PrintCommLabel.labelString: Print Command: ",
"*PrintCommLabel.alignment: XmALIGNMENT_BEGINNING",
"*CompileCommLabel.labelString: Compile Command: ",
"*CompileCommLabel.alignment: XmALIGNMENT_BEGINNING",
"*MakeCommLabel.labelString: Make Command: ",
"*MakeCommLabel.alignment: XmALIGNMENT_BEGINNING",
"*RunCommLabel.labelString: Run Command: ",
"*RunCommLabel.alignment: XmALIGNMENT_BEGINNING",
"*CompileErrorLabel.labelString: Output window parse strings: ",
"*CompileErrorLabel.alignment: XmALIGNMENT_BEGINNING",
"*CompileError.visibleItemCount: 5",
"*NewWindow.labelString: Open files from file/bookmark menu in a new window",
"*IODialog.title: Output window",
"*IODialog.iconName: Output",
"*IODialog.height: 350",
"*IODialog.width: 500",
"*IODialogText.labelString: Output",
"*IO_OK.labelString: Close",
"*IO_Stop.labelString: Stop",
"*IO_Goto.labelString: Goto",
"*IO_Help.labelString: Help",
"*EditorsDialog.dialogTitle: Editors",
"*EditorsDialog.iconName: Editors",
"*EditorsDialog.width: 400",
"*EditorsDialog.height: 200",
"*EditorsDialog.okLabelString: Close",
"*EditorsDialog.cancelLabelString: Goto",
"*About.dialogTitle: About",
"*About.okLabelString: Close",
"*About.buttonFontList: -*-courier-*-r-*--12-*",
"*text.blinkRate: 0",
"*about1.fontList: -*-courier-bold-o-*--24-*",
"*about1.alignment: ALIGNMENT_CENTER",
"*about2.fontList: -*-courier-*-r-*--14-*",
"*about2.alignment: ALIGNMENT_CENTER",
"*about3.fontList: -*-courier-*-r-*--14-*",
"*about3.alignment: ALIGNMENT_CENTER",
"*about4.fontList: -*-courier-*-r-*--18-*",
"*about4.alignment: ALIGNMENT_CENTER",
"*about5.fontList: -*-courier-*-r-*--12-*",
"*about5.alignment: ALIGNMENT_CENTER",
"*grep.labelString: grep",
"*GrepDialog.dialogTitle: Grep",
"*GrepPatLabel.labelString: Search for:",
"*GrepFileLabel.labelString: Search in:",
"*GrepFiles.value: *.c *.h",
"*GrepSubDirs.labelString: Search subdirectories",
"*GrepSubDirs.set: True",
"*GrepCase.labelString: Case sensitive",
"*GrepCase.set: False",
"*GrepReplace.set: False",
"*GrepReplace.labelString: Do replace",
"*GrepReplaceLabel.labelString: Replace by",
"*GrepReplaceField.sensitive: False",
"*NotFound.dialogTitle: Find",
"*grep.fontList: *hel*-b*-r-*-10-*",
"*compile.fontList: *hel*-b*-r-*-10-*",
"*make.fontList: *hel*-b*-r-*-10-*",
"*BookmarkDialog.dialogTitle: Bookmark",
"*BookmarkDialog.iconName: Bookmark",
"*BookmarkDialog.width: 400",
"*BookmarkDialog.height: 250",
"*BookmarkDialog.okLabelString: Close",
"*BookmarkDialog.cancelLabelString: Goto",
"*BookmarkDialog.helpLabelString: Delete",
"*BlockUndo.labelString: Block undo",
"*StatLinesLabel.labelString: lines:",
"*StatCharsLabel.labelString: characters:",
"*StatChangesLabel.labelString: changes since file was opened:",
"*StatUndoLabel.labelString: possible undo's:",
"*StatRedoLabel.labelString: possible redo's:",
"*StatLinesLabel.alignment: XmALIGNMENT_BEGINNING",
"*StatCharsLabel.alignment: XmALIGNMENT_BEGINNING",
"*StatChangesLabel.alignment: XmALIGNMENT_BEGINNING",
"*StatUndoLabel.alignment: XmALIGNMENT_BEGINNING",
"*StatRedoLabel.alignment: XmALIGNMENT_BEGINNING",
"*StatDialog.dialogTitle: Statistics",
"*StatDialog.okLabelString: Close",
"*AutoSave.value: 5",
"*AutoSaveToggle.labelString: Autosave every x minutes:",
"*AutoSaveToggle.set: False",
"*Help.dialogTitle: Help",
"*Help.okLabelString: Close",
"*Help.cancelLabelString: Back",
"*Help.helpLabelString: Index",
"*help_text.rows: 20",
"*help_text.columns: 80",
"*help_text.wordwrap: False",
"*help_topics.visibleItemCount: 20",
"*HelpError.dialogTitle: Help Error",
"*SmallHelpPopup*background: yellow2",
"*SmallHelpPopup.foreground: Black",
"*IOInputLabel.labelString: Input:",
NULL
};

jex-1.3.7/help.h100644      0      0        1342  6672726720  11506 0ustar  rootroot#ifndef _HELP_H_
#define _HELP_H_

#include "list.h"
#include <Xm/Xm.h>

typedef enum { NORMAL_TEXT, LINK_TEXT } TextType;
typedef struct {
		 TextType type;
		 int start,end;
	 	 char link[40];
	       } HelpText;

typedef struct {
		 char topic[40];
		 char topic_text[80];
	 	 List list;
	       } HelpTopic;

void Help(Widget widget,char *c,void *d);
/* Displays the help dialog of the topic c. */

List CompileHelp(void);
/* Compiles the help file. */

void Index(Widget w,void *data,void *cbs);
/* Displays an index of help topics. */

void DisplayTopic(Widget w,char *topic,char *file,List l);
/* Displays a new topic from the help file in the help dialog.
   l contains the hyperlinks list. */

void HelpError(char *msg);

#endif
jex-1.3.7/helpstack.h100644      0      0        1033  6672726720  12531 0ustar  rootroot#ifndef _HELPSTACK_H_
#define _HELPSTACK_H_

typedef struct  {
		  char data[40];
		} HStackElem;

typedef struct HStackElement {
	HStackElem s;
	struct HStackElement *prev;
       } HStackElement;	 
		 

typedef struct {
		int nelems;
		HStackElement *last;
  	       } HStack;

HStack *CreateHStack(void);
void DestroyHStack(HStack *hst);
int Push(HStack *hst,HStackElem data);
int Pop(HStack *hst,HStackElem *data);
int HStackN(HStack *hst,int offset,HStackElem *data);
int StackSize(HStack *hst);
void StackClear(HStack *hst);

#endif
jex-1.3.7/jex.h100644      0      0       15642  6672726717  11402 0ustar  rootroot#include "jbdbg.h"

#include <stdio.h>
#include <Xm/Xm.h>
#include "list.h"
#include "help.h"
#include "combo.h"

#define MAXEDITORS 100
#define BUFSIZE 255
#define FILELIST 10
#define MAJOR_VERSION 1
#define MINOR_VERSION 3
#define SUB_MINOR_VERSION 7
#define MAXBOOKMARKBUTTONS 20

typedef struct{
		int pid;
                int fd[2],fd2[2],fd3[2];/* Pipes, and process id */
                XtInputId id,id2;       /* File pointer input descriptors */
                char name[100];		/* Executed command */
              } ExecType;

typedef struct {
		 char *undelete;
		 XmTextPosition pos;
		 int insertsize,deletesize;
	       } Undo_T;
	       
typedef struct {
		 Boolean histhome;
		 Boolean setthome;
               } OwnRes;
              
typedef struct {
		 char filename[255];
		 char buf[BUFSIZE];
		 char choice[255];
		 int x,marker;
		 Widget shell,text,undo,redo,rowcol,save,findf,ato;
		 Widget replf,gotofield,pm,mb,compile,make;
		 Widget ats,tmpsource,bookm[MAXBOOKMARKBUTTONS];
		 Widget filelist[FILELIST],bookmarkmenu;
		 Widget fd,grep,gd,gpat,gfiles,gsubd;
		 Widget iod,io_win,iodtext;
		 int saved,oldsource,same_line;
		 Widget fs,clock,filemenu;
		 Widget form,dirfilter_field,filter_field,dir_field;
		 Widget filefield,selection,sel_field,dirlabel;
		 Widget filelabel,abd,fssize;
		 int undosize,lastaction,redosize,blockundo,changes,ce_count;
		 List undolist;
		 List redolist;
		 Widget le,se,bu,casesens;
		 Widget sd,sf,ai,ull,ul,pcl,pc,cc,ccl,mc,mcl,ce,cel,nw;
		 void *f,*func,*func2;
		 ExecType t;
                 char print_command[100],compile_command[100],grepped;
                 char make_command[100],run_command[100],**compiler_error;
		 Boolean auto_indent,new_window,autosave;
                 int undolevels,workcount,autosavetimeout;
                 XtIntervalId tid,tid2,tid3,tid4,tid5,tid6,tid7,tid8;
                 int locked,read_only;
                 Widget std,statln,statch,statchan,statundo,statredo;
                 Widget nw2,asf,ast,err,run,runcl,runc,owi;
              } Editor;


extern int editors;
extern Editor *editor[MAXEDITORS];

void file_cb();
void edit_cb();
void popup_cb(Widget w,int item,XmAnyCallbackStruct *cbs);
void option_cb();
void bookmark_cb();
void tools_cb();
void view_cb();
void help_cb();
void Save(Widget w,Editor *e,void *cbs);
void AskToSave(Editor *e,void *f);
void ValueChanged(Widget w,Editor *e,void *cbs);
void Grep(Widget w,Editor *e,void *cbs);
void New(Editor *e);
void SaveAs(Editor *e);
void Load(Editor *e);
void Revert(Editor *e);
void Insert(Editor *e);
void Print(Editor *e);
void FindRowCol(Widget w,Editor *e,XmTextVerifyCallbackStruct *cbs);
void FindUp(Widget w,Editor *e,void *cbs);
void FindDown(Widget w,Editor *e,void *cbs);
void Replace(Widget w,Editor *e,void *cbs);
void ReplaceAll(Widget w,Editor *e,void *cbs);
void CutText(Widget w,Editor *e,void *cbs);
void CopyText(Widget w,Editor *e,void *cbs);
void PasteText(Widget w,Editor *e,void *cbs);
void ClearSelection(Widget w,Editor *e,void *cbs);
void DeleteText(Widget w,Editor *e,XmTextVerifyCallbackStruct *cbs);
void UndoAction(Widget w,Editor *e,void *cbs);
void RedoAction(Widget w,Editor *e,void *cbs);
void RepeatAction(Widget w,Editor *e,void *cbs);
void GotoLine(Widget w,Editor *e,void *cbs);
void Quit(Widget w,Editor *e,void *cbs);
void PopupMenu(Widget w,XButtonPressedEvent *event,String *args,int *num_args);
void CreateFileSelectionDialog(Editor *e,char *title,void *f,void *f2);
void CapsSelection(Widget w,Editor *e,void *cbs);
void LowsSelection(Widget w,Editor *e,void *cbs);
void ShiftRight(Widget w,Editor *e,void *cbs);
void ShiftLeft(Widget w,Editor *e,void *cbs);
void Compile(Widget w,Editor *e,void *cbs);
void Make(Widget w,Editor *e,void *cbs);
void UnlinkFile(Editor *e);
void StartEditor(void);
void NoUndo(Editor *e);
void Exit(Editor *e);
void InsertFile(Editor *e,char *str);
int loadfile(Editor *e,char *file,int insert,int setname);
int savefile(Editor *e,char *file,char *str);
void CopyFile(char *s,char *t);
int FindTextString(Editor *e,char *str,int start_over,int set_pos);
int FindReverseTextString(Editor *e,char *str,int start_over);
void ReplaceText(Editor *e,char *str);
void printfile(Editor *e,char *file);
void Terminate(int sig);
void GotoError(Widget w,Editor *e,void *cbs);
void LoadSettings(Editor *e);
void SetTitle(Editor *e,char *str);
void CreateNewEditor(void);
void Settings(Editor *e);
void SplitPath(char *path,char *dir,char *file);
void SaveError(Editor *e);
void LoadError(Editor *e);
void Function(void (*f)(),Editor *e);
void CreateEditorDialog(void);
void ShowEditorDialog(void);
void UpdateEditorDialog(void);
void CreateOutputWindow(Editor *e);
void WatchCursor(Editor *e,int turn_on);
void ShowAboutDialog(Editor *e);
void ExecProg(Editor *e,char *_prog);
void CreateOutputWindow(Editor *e);
void SplitUp(char *str,char *list[]);
void wprintf(Widget window,...);
void SetLabel(Editor *e,...);
void DoGrep(char *pat,char *replace);
void SetWorkingLabel(Editor *e,void *t);
void InputCallback1(Editor *e,int f,XtInputId l);
void InputCallback2(Editor *e,int f,XtInputId l);
void ChildSignal(int sig);
void UpdateFileList(char *file);
void UpdateFindList(char *file);
void UpdateReplList(char *file);
void UpdateGrepList(char *file);
void UpdateGrepFileList(char *file);
void OpenOldFile(Widget w,Editor *e,void *cbs);
void RemoveInputs(Editor *e,void *tid);
void ShowFindMenu(Widget w,Editor *e,XmPushButtonCallbackStruct *cbs);
void ShowReplaceMenu(Widget w,Editor *e,XmPushButtonCallbackStruct *cbs);
void ShowGrepMenu(Widget w,Editor *e,XmPushButtonCallbackStruct *cbs);
void ShowGrepFileMenu(Widget w,Editor *e,XmPushButtonCallbackStruct *cbs);
void SelectFindString(Widget w,Editor *e,void *cbs);
void SelectReplString(Widget w,Editor *e,void *cbs);
void SelectGrepString(Widget w,Editor *e,void *cbs);
void SelectGrepFileString(Widget w,Editor *e,void *cbs);
void GetFullFileName(char *file);
void ShowBookmarkDialog(void);
void AddBookmark(char *str);
void CreateBookmarkDialog(void);
void ShowStats(Editor *e);
void DeleteLine(Widget w,XAnyEvent *event,String *args,int *num_args);
void NoHighlight(Editor *e,void *id);
void FindMatchingChar(Widget w,Editor *e,void *cbs);
void Reload(Editor *e);
void DetachEditor(Editor *e,char *file);
void SetMarker(Widget w,Editor *e,void *cbs);
void GotoMarker(Widget w,Editor *e,void *cbs);
void RemoveMarker(Editor *e);
void SetCurrentWidget(Widget w);
void DoNew(Widget *w,Editor *e,void *cbs);
void DoOpen(Widget *w,Editor *e,void *cbs);
void SetSave(Editor *e,Boolean enabled);
void SmallHelp(Widget w,int n,XEvent *event);
void RemoveSmallHelp(Widget w,int n,void *cbs);
void DoNewWindow(Widget *w,void *e,void *cbs);
void DoClone(Widget *w,Editor *e,void *cbs);
void LatestVersion(void);
void HelpError(char *msg);
int FindHelpFile(char *helpfile,char *file);
void Run(Widget w,Editor *e,void *cbs);
void ShowError(Editor *e,char *errstr);
void CheckVersion(char *version);
void ShowVersion(void);
void LoadOldFile(Editor *e);
void UpdateEditorBookmarks(Editor *e);

jex-1.3.7/list.h100644      0      0        4377  6672726720  11544 0ustar  rootroot/* LIST.H
   Author     : Jorgen Bosman.
   Last Update: 13-04-1994
*/

#ifndef _LIST_H_
#define _LIST_H_

typedef void *List;

List CreateList(unsigned el_size);
/* Creates new definition list.
   Must be called before any other function. */

int AddElement(List list,void *element);
/* Adds an element to back of the list. */

int AddFirstElement(List list,void *element);
/* Adds an element to the front of the list. */

int InsertElement(List list,void *element);
/* Insert the element in the current position. */

int GetFirstElement(List list,void *element);

int GetElement(List list,void *element);

int GetNextElement(List list,void *element);

int GetPreviousElement(List list,void *element);

int GetLastElement(List list,void *element);

int GetNthElement(List list,int n,void *element);
/* Gets the n-th element from the list starting from 0.
   If the list is smaller than n, element contains the last element and 0 is
   returned, otherwise 0 is returned. */

int FindElement(List list,void *element,int key_size,void *key);
/* Finds element in list using key and the size of the key,
   the key must be at the beginning of the element record. */

int DeleteLastElement(List list);
/* Deletes last element from list. */

int DeleteFirstElement(List list);
/* Deletes first element from list. */

int DeleteCurrentElement(List l);
/* Deletes current element from list. */

int DeleteElement(List list,int key_size,void *key);
/* Deletes element in list using key and the size of the key,
   the key must be at the beginning of the element record. */

int ListEmpty(List list);
/* Checks if list is empty. */

int DisposeList(List list);
/* Disposes list. */

int ClearList(List list);
/* Clears list. */

void ReplaceCurrentElement(List list,void *element);
/* Replaces current element by element. */

void SortList(List list,int (*sort_proc)(const void *element1,const void *element2));
/* Sorts list using compare function sort_proc(), it must return 1
   if element1 > element2, 0 otherwise. */

int NumberElements(List l);
/* Returns number of elements in list. */

void VisualizeList(List l,char *str);
/* Makes list visual on screen, it displays each element as integer.
   Str is printed before the list.
   Symbols: F: first element, C: current element, L:last element */

#endif

jex-1.3.7/match.h100644      0      0        7574  6672726720  11667 0ustar  rootroot/*
 EPSHeader

   File: match.h
   Author: J. Kercheval
   Created: Sat, 01/05/1991  22:27:18
*/
/*
 EPSRevision History

   J. Kercheval  Wed, 02/20/1991  22:28:37  Released to Public Domain
   J. Kercheval  Sun, 03/10/1991  18:02:56  add is_valid_pattern
   J. Kercheval  Sun, 03/10/1991  18:25:48  add error_type in is_valid_pattern
   J. Kercheval  Sun, 03/10/1991  18:47:47  error return from matche()
   J. Kercheval  Tue, 03/12/1991  22:24:49  Released as V1.1 to Public Domain
*/

/*
   Wildcard Pattern Matching
*/

#ifndef BOOLEAN
# define BOOLEAN int
# define TRUE 1
# define FALSE 0
#endif

/* match defines */
#define MATCH_PATTERN  6    /* 
Results 1 - 1
Help - FTP Sites List - Software Dir.
Searching half a billion files worldwide
© 1997-2009 MARUHN Internet Solutions