NEURON
hel2mos.cpp
Go to the documentation of this file.
1 #ifdef WIN32
2 #include <windows.h>
3 #endif
4 #include <stdio.h>
5 #include <string.h>
6 #include <stdlib.h>
7 #include <OS/string.h>
8 #include <OS/file.h>
9 #include <InterViews/regexp.h>
10 #include "nrnbbs.h"
11 
12 #ifdef WIN32
13 #include "../winio/debug.h"
14 static void setneuronhome(const char*);
15 #endif
16 
17 extern "C" {
18 void HandleOutput(const char* buf) {
19 }
20 }
21 
22 extern const char* neuronhome();
23 
24 void start();
25 void stop();
26 void send(const char* url);
27 
28 static bool quit_;
29 
30 static void quit(const char* msg) {
31 //printf("hel2mos quit |%s|\n", msg);
32 //DebugMessage("hel2mos quit |%s|\n", msg);
33  if (strcmp(msg, "neuron closed") == 0) {
34  quit_ = true;
35  }
36 }
37 
38 static void help(const char*);
39 static CopyString* shelp;
40 
41 
42 int main(int argc, const char** argv){
43 #ifdef WIN32
44  setneuronhome(argv[0]);
45 #endif
46  if (!neuronhome()) {
47 // printf("no NEURONHOME\n");
48 MessageBox(NULL, "no NEURONHOME environment variable", "OCHELP", MB_OK);
49  return 1;
50  }
51 // printf("started hel2mos\n");
52 
53  char buf[256];
54  sprintf(buf, "%s/lib/helpdict", neuronhome());
55  String sf(buf);
56  InputFile* f = InputFile::open(sf);
57  if (f == nil) {
58 sprintf(buf, "Can't open %s\n", sf.string());
59  MessageBox (NULL, buf, "OCHELP", MB_OK);
60  return 1;
61  }
62  const char* st;
63  int flen = f->read(st);
64  shelp = new CopyString(st, flen);
65  f->close();
66 
68  nrnbbs_post("ochelp running");
69  start();
70  nrnbbs_notify("ochelp", help);
71 #ifdef WIN32
72  nrnbbs_notify("neuron closed", help);
73 #else
74  nrnbbs_notify("neuron closed", quit);
75 #endif
76  help("");
78  nrnbbs_take("ochelp running");
79  stop();
81  return 0;
82 }
83 
84 static bool find(const char* key, char* val) {
85  static char buf[256];
86  sprintf(buf, "^%s ", key);
87 DebugMessage("|%s|\n", buf);
88  Regexp r1(buf);
89  int i = r1.Search(shelp->string(), shelp->length(), 0, shelp->length());
90 DebugMessage("i=%d\n", i);
91  if (i < 0) {
92  return false;
93  }
94  Regexp r2("neuron/");
95  i = r2.Search(shelp->string(), shelp->length(), i, shelp->length());
96 //printf("i=%d\n", i);
97  int j = shelp->search(i, '\n');
98 //printf("j=%d\n", j);
99  strncpy(val, shelp->string() + i, j-i);
100  val[j-i] = '\0';
101  return true;
102 }
103 
104 static void help(const char* msg) {
105 //DebugMessage("hel2mos help |%s|\n", msg);
106  if (strcmp(msg, "neuron closed") == 0) {
107  quit_ = true;
108  }
109  char buf[256];
110  while(nrnbbs_take_string("ochelp", buf)) {
111  if (buf[0] == '?') {
112 //DebugMessage("took ochelp: %s\n", buf);
113  }else{
114  if (find(buf, buf)) {
115 // printf("%s\n", buf);
116  }else{
117  sprintf(buf, "contents.html");
118  }
119 #ifdef WIN32
120 // DebugMessage("buf=|%s|\n", buf);
121  char buf1[256],buf2[256];
122  strcpy(buf2,buf);
123  strcpy(buf1, neuronhome());
124  for (char* cp = buf1; *cp; ++cp) {
125  if (*cp == ':') {
126  *cp = '|';
127  }
128  if (*cp == '\\') {
129  *cp = '/';
130  }
131  }
132  sprintf(buf, "file:///%s/html/help/%s", buf1, buf2);
133 #endif
134  send(buf);
135  }
136  }
137 }
138 
139 const char* neuronhome() {
140  const char* n = getenv("NEURONHOME");
141  if (n) {
142  return n;
143  }
144  return nil;
145 }
146 
147 #if defined(WIN32)
148 static void setneuronhome(const char* p) {
149  // if the program lives in .../bin/mos2nrn.exe
150  // and .../lib exists then use ... as the
151  // NEURONHOME
152 // printf("p=|%s|\n", p);
153  char buf[256];
154  if (p[0] == '"') {
155  strcpy(buf, p+1);
156  }else{
157  strcpy(buf, p);
158  }
159  int i, j;
160  for (i=strlen(buf); i >= 0 && buf[i] != '\\'; --i) {;}
161  buf[i] = '\0'; // /neuron.exe gone
162  //printf("setneuronhome |%s|\n", buf);
163  for (j=strlen(buf); j >= 0 && buf[j] != '\\'; --j) {;}
164  buf[j] = '\0'; // /bin gone
165  // but make sure it was bin Bin or BIN -- damn you bill gates
166  //printf("i=%d j=%d buf=|%s|\n",i, j, buf);
167  if (i == j+4
168  &&(buf[--i] == 'n' || buf[i] == 'N')
169  &&(buf[--i] == 'i' || buf[i] == 'I')
170  &&(buf[--i] == 'b' || buf[i] == 'B')
171  ) {
172  static char buf1[256];
173  // check for nrn.def or nrn.defaults
174  // if it exists assume valid installation
175  FILE* f;
176  sprintf(buf1, "%s/lib/nrn.def", buf);
177  if ((f = fopen(buf1, "r")) == (FILE*)0) {
178  sprintf(buf1, "%s/lib/nrn.defaults", buf);
179  if ((f = fopen(buf1, "r")) == (FILE*)0) {
180  sprintf(buf1, "%s not valid neuronhome\n", buf);
181  MessageBox(NULL, buf1, "mos2nrn", MB_OK);
182  return;
183  }
184  }
185  fclose(f);
186  sprintf(buf1, "NEURONHOME=%s", buf);
187  putenv(buf1); // arg must be global
188  }
189 }
190 
191 char* nrnhome;
192 
193 #else
194 
195 #include <unistd.h>
196 #include <signal.h>
197 #ifndef SVR4
198 #ifndef SIG_PF
199 #define SIG_PF void (*)(...)
200 #endif
201 #endif
202 
203 static int mosaic_pid_; /* no longer used. 0 is fine */
204 
205 void start() {
206  signal(SIGHUP, (SIG_PF)quit);
207 }
208 
209 void stop() {
210 }
211 
212 void send(const char* url) {
213  char buf1[512];
214  int start = 0;
215  while(url[start] == ' ') {
216  ++start;
217  }
218  sprintf(buf1, "%s/bin/hel2mos1.sh \"%s\"", neuronhome(), url+start);
219 //printf("sending |%s|\n", buf1);
220  signal(SIGCHLD, SIG_IGN);
221  system(buf1);
222  signal(SIGCHLD, (SIG_PF)quit);
223 }
224 
225 #endif
void nrnbbs_post(const char *)
Definition: ivocmac.cpp:36
char * nrnhome
Definition: mos2nrn.cpp:10
virtual int search(int start, u_char) const
Definition: string.cpp:227
void nrnbbs_notify(const char *, NrnBBSCallback)
Definition: ivocmac.cpp:48
static CopyString * shelp
Definition: hel2mos.cpp:39
size_t p
int length() const
Definition: string.h:140
Definition: file.h:56
sprintf(buf," if (secondorder) {\ " int _i;\" " for(_i=0;_i< %d;++_i) {\" " _p[_slist%d[_i]]+=dt *_p[_dlist%d[_i]];\" " }}\", numeqn, listnum, listnum)
bool nrnbbs_take_string(const char *, char *)
Definition: ivocmac.cpp:42
int system(const char *s)
Definition: mswinprt.cpp:281
void start()
Definition: hel2mos.cpp:205
bool nrnbbs_connect()
Definition: ivocmac.cpp:32
static InputFile * open(const String &name)
Definition: file.cpp:219
const char * string() const
Definition: string.h:139
#define putenv
Definition: mwprefix.h:37
static void quit(const char *msg)
Definition: hel2mos.cpp:30
void HandleOutput(const char *buf)
Definition: hel2mos.cpp:18
int const size_t const size_t n
Definition: nrngsl.h:12
#define SIG_PF
Definition: hel2mos.cpp:199
int val
Definition: dll.cpp:167
void stop()
Definition: hel2mos.cpp:209
#define CopyString
Definition: _defines.h:2
static void help(const char *)
Definition: hel2mos.cpp:104
static bool quit_
Definition: hel2mos.cpp:28
#define key
Definition: spt2queue.cpp:20
char * getenv(const char *s)
Definition: macprt.cpp:67
size_t j
void nrnbbs_wait(bool *pflag=(bool *) 0)
Definition: ivocmac.cpp:50
#define nil
Definition: enter-scope.h:36
bool nrnbbs_take(const char *)
Definition: ivocmac.cpp:40
void send(const char *url)
Definition: hel2mos.cpp:212
static int mosaic_pid_
Definition: hel2mos.cpp:203
Definition: regexp.h:61
void nrnbbs_disconnect()
Definition: ivocmac.cpp:33
#define i
Definition: md1redef.h:12
virtual int read(const char *&start)
Definition: file.cpp:245
Definition: string.h:34
char buf[512]
Definition: init.cpp:13
int main(int argc, const char **argv)
Definition: hel2mos.cpp:42
void setneuronhome(const char *)
Definition: ivocmain.cpp:196
static int argc
Definition: inithoc.cpp:53
int Search(const char *text, int length, int index, int range)
Definition: regexp.cpp:111
static bool find(const char *key, char *val)
Definition: hel2mos.cpp:84
FILE * fopen()
virtual void close()
Definition: file.cpp:178
const char * neuronhome()
Definition: hel2mos.cpp:139
return NULL
Definition: cabcode.cpp:461
static char ** argv
Definition: inithoc.cpp:54