about summary refs log tree commit diff stats
path: root/util.c
Commit message (Expand)AuthorAgeFilesLines
* removed erealloc (not used) 3.1Anselm R. Garbe2007-01-161-9/+0
* correctionsarg@mig292007-01-021-1/+1
* next version will contain updated copyright noticearg@mig292007-01-021-1/+1
* code polishing, removed unnecessary newlinesAnselm R. Garbe2006-10-061-3/+2
* reviewed util.carg@mmvi2006-09-201-1/+2
* removed a bunch of lines through making function signatures more consistent w...Anselm R. Garbe2006-09-121-8/+4
* added a comment to spawn 1.1Anselm R. Garbe2006-08-281-0/+1
* eliminated sentinel warningAnselm R. Garbe2006-08-231-1/+1
* removed badmalloc (thx for the pointer to Uriel)Anselm R. Garbe2006-08-221-10/+2
* small renamings of two static functionsAnselm R.Garbe2006-08-211-3/+3
* implemented restack behavior (floats are on top in tiled mode)Anselm R.Garbe2006-08-141-0/+9
* applied grabbing-- and shell_minimalarg@10ksloc.org2006-08-071-1/+1
* using execl now, argv changed, using cmd and const char defs directly in the ...arg@10ksloc.org2006-08-041-4/+7
* small stylistic fixarg@10ksloc.org2006-08-041-1/+2
* made fullscreen apps working fine in floating mode (there is no sane way to m...arg@10ksloc.org2006-08-021-1/+0
* some cleanups/fixes inspired by Jukka Salmi's feedbackarg@10ksloc.org2006-07-211-4/+2
* cleaned up codearg@10ksloc.org2006-07-201-0/+3
* using EXIT_stuff in exit() nowAnselm R. Garbe2006-07-181-3/+3
* ordered variables in structs and source files alphabeticallyAnselm R. Garbe2006-07-171-2/+2
* proceeded with cleaning up, sorting functions, etcAnselm R. Garbe2006-07-151-11/+13
* rearranged several stuffAnselm R. Garbe2006-07-151-1/+1
* removed a bunch of lines through swap removalAnselm R. Garbe2006-07-141-8/+0
* searching for a better way to discard enter notifiesAnselm R. Garbe2006-07-141-28/+0
* implemented tagging a clientAnselm R. Garbe2006-07-131-1/+2
* changed default colorsAnselm R. Garbe2006-07-131-1/+1
* added logo+descriptionAnselm R. Garbe2006-07-131-1/+1
* new stuff (some warning elimination)Anselm R. Garbe2006-07-131-2/+2
* removed unnecessary crapAnselm R. Garbe2006-07-131-49/+2
* new stuff, fixed several issuesAnselm R. Garbe2006-07-121-2/+3
* several changes, new stuffAnselm R. Garbe2006-07-111-1/+1
* removed unnecessary sel stuffAnselm R. Garbe2006-07-111-38/+0
* added bar event timerAnselm R. Garbe2006-07-111-17/+8
* added gridsel to gridwmAnselm R. Garbe2006-07-111-0/+38
* fixed several stuff (gridwm gets better and better)Anselm R. Garbe2006-07-111-6/+7
* implemented pipe_spawnAnselm R. Garbe2006-07-111-4/+52
* added several other stuffAnselm R. Garbe2006-07-101-0/+23
* several new changes, made gridmenu workingAnselm R. Garbe2006-07-101-0/+59
* added new stuffAnselm R. Garbe2006-07-101-0/+18
fe ^
178275f49 ^

f6c8f97fe ^

69b32637b ^
f6df2d995 ^
f6c8f97fe ^

69b32637b ^
a480bebfc ^


178275f49 ^
089506498 ^
178275f49 ^

4790b6d63 ^

178275f49 ^




027a11d7c ^





69b32637b ^


342e50e26 ^
69b32637b ^
342e50e26 ^
69b32637b ^
342e50e26 ^
69b32637b ^
86556ebfd ^
69b32637b ^





178275f49 ^

69b32637b ^
342e50e26 ^
1b7d8246c ^
73c306258 ^
1b7d8246c ^
342e50e26 ^
4c4f6541d ^
86556ebfd ^

1b7d8246c ^
342e50e26 ^
1b7d8246c ^
342e50e26 ^
69b32637b ^
342e50e26 ^
69b32637b ^
342e50e26 ^
e2267ef5c ^
54bd728c1 ^
342e50e26 ^
e2267ef5c ^
54bd728c1 ^
342e50e26 ^
5e82ffc8d ^


0867c62de ^
342e50e26 ^
0867c62de ^

342e50e26 ^
8882b062e ^

f04d21f27 ^
342e50e26 ^
c70726721 ^





69b32637b ^
86556ebfd ^
342e50e26 ^
86556ebfd ^
6acffcd28 ^

b92fcacb9 ^
40ec7be45 ^
826c1e2d7 ^
342e50e26 ^
69b32637b ^
342e50e26 ^

77f836b40 ^

69b32637b ^
342e50e26 ^
69b32637b ^
9e6fb3f69 ^
69b32637b ^
86556ebfd ^
69b32637b ^
ed0cb7b85 ^
826c1e2d7 ^
69b32637b ^

342e50e26 ^
d80f16338 ^

342e50e26 ^

6acffcd28 ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200












                                                                           
                                                  
                                                                      
                                                                          

                                                      
                                             







                                                      
                                                                  
                                                 
                                           
                                       

                               
                         









                                                              
                                             

                                                              
                     

              
                   

                                             


                                       











                                                                               
 
                                                   

                                             





                                                 

                                                

                                                 

                                                
                               
                                                                 

                                             
 


                                                
                
                                                         

                                             

                                           




                                              





                                         


                          
                                                                
             
                                                           
                
                                                              
                     
                                                     





                                                                       

                                                                      
                    
                                
                           
                                             
                   
                            
                

                                                                      
          
                                                       
                     
                               
                    
                              
                
                                                                          
                  
                                                                  
                          
                     
                                                                     
                          


                                                   
                         
                                         

                             
                                   

                                     
                   
                                           





                                  
 
                                                               
                                                        
                                               

                                       
 
                                         
                         
                                            
 

                                         

                               
 
                                    
 
                                      
                             
                                                        
 
                                                                                
                                                                  

                                                                    
                             

                                     

                                        
                                   
#
#
#           The Nim Compiler
#        (c) Copyright 2015 Andreas Rumpf
#
#    See the file "copying.txt", included in this
#    distribution, for details about the copyright.
#

## Implements the new configuration system for Nim. Uses Nim as a scripting
## language.

import
  ast, modules, idents, passes, passaux, condsyms,
  options, nimconf, sem, semdata, llstream, vm, vmdef, commands, msgs,
  os, times, osproc, wordrecg, strtabs, modulegraphs, lineinfos, pathutils

# we support 'cmpIgnoreStyle' natively for efficiency:
from strutils import cmpIgnoreStyle, contains

proc listDirs(a: VmArgs, filter: set[PathComponent]) =
  let dir = getString(a, 0)
  var result: seq[string] = @[]
  for kind, path in walkDir(dir):
    if kind in filter: result.add path
  setResult(a, result)

proc setupVM*(module: PSym; cache: IdentCache; scriptName: string;
              graph: ModuleGraph): PEvalContext =
  # For Nimble we need to export 'setupVM'.
  result = newCtx(module, cache, graph)
  result.mode = emRepl
  registerAdditionalOps(result)
  let conf = graph.config

  # captured vars:
  var errorMsg: string
  var vthisDir = scriptName.splitFile.dir

  template cbconf(name, body) {.dirty.} =
    result.registerCallback "stdlib.system." & astToStr(name),
      proc (a: VmArgs) =
        body

  template cbexc(name, exc, body) {.dirty.} =
    result.registerCallback "stdlib.system." & astToStr(name),
      proc (a: VmArgs) =
        errorMsg = ""
        try:
          body
        except exc:
          errorMsg = getCurrentExceptionMsg()

  template cbos(name, body) {.dirty.} =
    cbexc(name, OSError, body)

  # Idea: Treat link to file as a file, but ignore link to directory to prevent
  # endless recursions out of the box.
  cbos listFiles:
    listDirs(a, {pcFile, pcLinkToFile})
  cbos listDirs:
    listDirs(a, {pcDir})
  cbos removeDir:
    os.removeDir getString(a, 0)
  cbos removeFile:
    os.removeFile getString(a, 0)
  cbos createDir:
    os.createDir getString(a, 0)

  result.registerCallback "stdlib.system.getError",
    proc (a: VmArgs) = setResult(a, errorMsg)

  cbos setCurrentDir:
    os.setCurrentDir getString(a, 0)
  cbos getCurrentDir:
    setResult(a, os.getCurrentDir())
  cbos moveFile:
    os.moveFile(getString(a, 0), getString(a, 1))
  cbos moveDir:
    os.moveDir(getString(a, 0), getString(a, 1))
  cbos copyFile:
    os.copyFile(getString(a, 0), getString(a, 1))
  cbos copyDir:
    os.copyDir(getString(a, 0), getString(a, 1))
  cbos getLastModificationTime:
    setResult(a, getLastModificationTime(getString(a, 0)).toUnix)
  cbos findExe:
    setResult(a, os.findExe(getString(a, 0)))

  cbos rawExec:
    setResult(a, osproc.execCmd getString(a, 0))

  cbconf getEnv:
    setResult(a, os.getEnv(a.getString 0, a.getString 1))
  cbconf existsEnv:
    setResult(a, os.existsEnv(a.getString 0))
  cbconf putEnv:
    os.putEnv(a.getString 0, a.getString 1)
  cbconf dirExists:
    setResult(a, os.dirExists(a.getString 0))
  cbconf fileExists:
    setResult(a, os.fileExists(a.getString 0))

  cbconf projectName:
    setResult(a, conf.projectName)
  cbconf projectDir:
    setResult(a, conf.projectPath.string)
  cbconf projectPath:
    setResult(a, conf.projectFull.string)
  cbconf thisDir:
    setResult(a, vthisDir)
  cbconf put:
    options.setConfigVar(conf, getString(a, 0), getString(a, 1))
  cbconf get:
    setResult(a, options.getConfigVar(conf, a.getString 0))
  cbconf exists:
    setResult(a, options.existsConfigVar(conf, a.getString 0))
  cbconf nimcacheDir:
    setResult(a, options.getNimcacheDir(conf).string)
  cbconf paramStr:
    setResult(a, os.paramStr(int a.getInt 0))
  cbconf paramCount:
    setResult(a, os.paramCount())
  cbconf cmpIgnoreStyle:
    setResult(a, strutils.cmpIgnoreStyle(a.getString 0, a.getString 1))
  cbconf cmpIgnoreCase:
    setResult(a, strutils.cmpIgnoreCase(a.getString 0, a.getString 1))
  cbconf setCommand:
    conf.command = a.getString 0
    let arg = a.getString 1
    incl(conf.globalOptions, optWasNimscript)
    if arg.len > 0:
      conf.projectName = arg
      let path =
        if conf.projectName.isAbsolute: AbsoluteFile(conf.projectName)
        else: conf.projectPath / RelativeFile(conf.projectName)
      try:
        conf.projectFull = canonicalizePath(conf, path)
      except OSError:
        conf.projectFull = path
  cbconf getCommand:
    setResult(a, conf.command)
  cbconf switch:
    processSwitch(a.getString 0, a.getString 1, passPP, module.info, conf)
  cbconf hintImpl:
    processSpecificNote(a.getString 0, wHint, passPP, module.info,
      a.getString 1, conf)
  cbconf warningImpl:
    processSpecificNote(a.getString 0, wWarning, passPP, module.info,
      a.getString 1, conf)
  cbconf patchFile:
    let key = a.getString(0) & "_" & a.getString(1)
    var val = a.getString(2).addFileExt(NimExt)
    if {'$', '~'} in val:
      val = pathSubs(conf, val, vthisDir)
    elif not isAbsolute(val):
      val = vthisDir / val
    conf.moduleOverrides[key] = val
  cbconf selfExe:
    setResult(a, os.getAppFilename())
  cbconf cppDefine:
    options.cppDefine(conf, a.getString(0))
  cbexc stdinReadLine, EOFError:
    setResult(a, "")
    setResult(a, stdin.readLine())
  cbexc stdinReadAll, EOFError:
    setResult(a, "")
    setResult(a, stdin.readAll())

proc runNimScript*(cache: IdentCache; scriptName: AbsoluteFile;
                   freshDefines=true; conf: ConfigRef) =
  rawMessage(conf, hintConf, scriptName.string)
  let oldSymbolFiles = conf.symbolFiles
  conf.symbolFiles = disabledSf

  let graph = newModuleGraph(cache, conf)
  connectCallbacks(graph)
  if freshDefines: initDefines(conf.symbols)

  defineSymbol(conf.symbols, "nimscript")
  defineSymbol(conf.symbols, "nimconfig")
  registerPass(graph, semPass)
  registerPass(graph, evalPass)

  conf.searchPaths.add(conf.libpath)

  var m = graph.makeModule(scriptName)
  incl(m.flags, sfMainModule)
  graph.vm = setupVM(m, cache, scriptName.string, graph)

  graph.compileSystemModule() # TODO: see why this unsets hintConf in conf.notes
  discard graph.processModule(m, llStreamOpen(scriptName, fmRead))

  # ensure we load 'system.nim' again for the real non-config stuff!
  resetSystemArtifacts(graph)
  # do not remove the defined symbols
  #initDefines()
  undefSymbol(conf.symbols, "nimscript")
  undefSymbol(conf.symbols, "nimconfig")
  conf.symbolFiles = oldSymbolFiles