View | Details | Raw Unified | Return to bug 156008 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/cdt/make/internal/core/scannerconfig/util/CCommandDSC.java (-1 / +42 lines)
Lines 14-19 Link Here
14
import java.util.Iterator;
14
import java.util.Iterator;
15
import java.util.List;
15
import java.util.List;
16
16
17
import org.eclipse.core.resources.IProject;
17
import org.w3c.dom.Document;
18
import org.w3c.dom.Document;
18
import org.w3c.dom.Element;
19
import org.w3c.dom.Element;
19
import org.w3c.dom.NodeList;
20
import org.w3c.dom.NodeList;
Lines 129-134 Link Here
129
	}
130
	}
130
	
131
	
131
	/**
132
	/**
133
	 * Returns the compiler command
134
	 * @return
135
	 */
136
	public String getCompilerName() {
137
		String compiler = new String();
138
		for (Iterator i = compilerCommand.iterator(); i.hasNext(); ) {
139
			KVStringPair optionPair = (KVStringPair)i.next();
140
            if (optionPair.getKey().equals(SCDOptionsEnum.COMMAND.toString())) {
141
            	compiler = optionPair.getValue();
142
            	break;
143
            }
144
		}
145
		return compiler.trim();
146
	}
147
	
148
	/**
132
	 * @return list of strings
149
	 * @return list of strings
133
	 */
150
	 */
134
	public List getImacrosFile() {
151
	public List getImacrosFile() {
Lines 308-312 Link Here
308
            setDiscovered(true);
325
            setDiscovered(true);
309
        }
326
        }
310
    }
327
    }
311
328
    
329
    public void resolveOptions(IProject project) {
330
    	ArrayList symbols = new ArrayList();
331
    	ArrayList includes = new ArrayList();
332
    	ArrayList quoteincludes = new ArrayList();
333
		for (Iterator options = compilerCommand.iterator(); options.hasNext(); ) {
334
			KVStringPair optionPair = (KVStringPair)options.next();
335
			String key = optionPair.getKey();
336
			String value = optionPair.getValue();
337
			if (key.equals(SCDOptionsEnum.INCLUDE.toString())) {
338
				includes.add(value);
339
			}
340
			else if (key.equals(SCDOptionsEnum.IDASH.toString())) {
341
				quoteincludes.add(value);
342
			}
343
			else if (key.equals(SCDOptionsEnum.DEFINE.toString())) {
344
				symbols.add(value);
345
			}
346
		}
347
		setIncludes(CygpathTranslator.translateIncludePaths(project, includes));
348
		setQuoteIncludes(CygpathTranslator.translateIncludePaths(project, quoteincludes));		                
349
		setSymbols(symbols);
350
        
351
		setDiscovered(true);    	
352
    }
312
}
353
}
(-)src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerFileSICollector.java (-16 / +24 lines)
Lines 39-44 Link Here
39
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerConfigUtil;
39
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerConfigUtil;
40
import org.eclipse.cdt.make.internal.core.scannerconfig.util.CCommandDSC;
40
import org.eclipse.cdt.make.internal.core.scannerconfig.util.CCommandDSC;
41
import org.eclipse.cdt.make.internal.core.scannerconfig.util.CygpathTranslator;
41
import org.eclipse.cdt.make.internal.core.scannerconfig.util.CygpathTranslator;
42
import org.eclipse.cdt.make.internal.core.scannerconfig.util.KVStringPair;
42
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
43
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
43
import org.eclipse.core.resources.IFile;
44
import org.eclipse.core.resources.IFile;
44
import org.eclipse.core.resources.IProject;
45
import org.eclipse.core.resources.IProject;
Lines 229-237 Link Here
229
            addScannerInfo(((Integer)resource), scannerInfo);
230
            addScannerInfo(((Integer)resource), scannerInfo);
230
            return;
231
            return;
231
        }
232
        }
232
        else if (!(resource instanceof IFile)) {
233
// GSA allow per project settings
233
            errorMessage = "resource is not an IFile";//$NON-NLS-1$
234
//        else if (!(resource instanceof IFile)) {
234
        }
235
//            errorMessage = "resource is not an IFile";//$NON-NLS-1$
236
//        }
235
        else if (((IFile) resource).getProject() == null) {
237
        else if (((IFile) resource).getProject() == null) {
236
            errorMessage = "project is null";//$NON-NLS-1$
238
            errorMessage = "project is null";//$NON-NLS-1$
237
        }
239
        }
Lines 242-260 Link Here
242
            TraceUtil.outputError("PerFileSICollector.contributeToScannerConfig : ", errorMessage); //$NON-NLS-1$
244
            TraceUtil.outputError("PerFileSICollector.contributeToScannerConfig : ", errorMessage); //$NON-NLS-1$
243
            return;
245
            return;
244
        }
246
        }
245
        IFile file = (IFile) resource;
247
        if (resource instanceof IFile) {
246
       
248
	        IFile file = (IFile) resource;
247
        for (Iterator i = scannerInfo.keySet().iterator(); i.hasNext(); ) {
249
	       
248
            ScannerInfoTypes type = (ScannerInfoTypes) i.next();
250
	        for (Iterator i = scannerInfo.keySet().iterator(); i.hasNext(); ) {
249
            if (type.equals(ScannerInfoTypes.COMPILER_COMMAND)) {
251
	            ScannerInfoTypes type = (ScannerInfoTypes) i.next();
250
                List commands = (List) scannerInfo.get(type);
252
	            if (type.equals(ScannerInfoTypes.COMPILER_COMMAND)) {
251
                for (Iterator j = commands.iterator(); j.hasNext(); ) {
253
	                List commands = (List) scannerInfo.get(type);
252
                    addCompilerCommand(file, (CCommandDSC) j.next());
254
	                for (Iterator j = commands.iterator(); j.hasNext(); ) {
253
                }
255
	                    addCompilerCommand(file, (CCommandDSC) j.next());
254
            }
256
	                }
255
            else {
257
	            }
256
                addScannerInfo(type, (List) scannerInfo.get(type));
258
	            else {
257
            }
259
	                addScannerInfo(type, (List) scannerInfo.get(type));
260
	            }
261
	        }
258
        }
262
        }
259
    }
263
    }
260
264
Lines 336-341 Link Here
336
		        if (fileSet == null) {
340
		        if (fileSet == null) {
337
		            fileSet = new HashSet();
341
		            fileSet = new HashSet();
338
		            sid.commandIdToFilesMap.put(commandId, fileSet);
342
		            sid.commandIdToFilesMap.put(commandId, fileSet);
343
		            CCommandDSC cmd = (CCommandDSC) sid.commandIdCommandMap.get(commandId);
344
		            if (cmd != null) {
345
		            	cmd.resolveOptions(project);
346
		            }
339
		        }
347
		        }
340
		        if (fileSet.add(file)) {
348
		        if (fileSet.add(file)) {
341
		            // update fileToCommandIdsMap
349
		            // update fileToCommandIdsMap
(-)src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParser.java (-42 / +172 lines)
Lines 41-46 Link Here
41
    private String[] compilerInvocation;
41
    private String[] compilerInvocation;
42
    private GCCPerFileBOPConsoleParserUtility fUtil;
42
    private GCCPerFileBOPConsoleParserUtility fUtil;
43
    
43
    
44
    /* (non-Javadoc)
45
     * @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser#startup(org.eclipse.core.resources.IProject, org.eclipse.core.runtime.IPath, org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector, org.eclipse.cdt.core.IMarkerGenerator)
46
     */
44
    public void startup(IProject project, IPath workingDirectory, IScannerInfoCollector collector, IMarkerGenerator markerGenerator) {
47
    public void startup(IProject project, IPath workingDirectory, IScannerInfoCollector collector, IMarkerGenerator markerGenerator) {
45
        fUtil = (project != null && workingDirectory != null && markerGenerator != null) ?
48
        fUtil = (project != null && workingDirectory != null && markerGenerator != null) ?
46
                new GCCPerFileBOPConsoleParserUtility(project, workingDirectory, markerGenerator) : null;
49
                new GCCPerFileBOPConsoleParserUtility(project, workingDirectory, markerGenerator) : null;
Lines 50-59 Link Here
50
        compilerInvocation = getCompilerCommands();
53
        compilerInvocation = getCompilerCommands();
51
    }
54
    }
52
55
56
    /* (non-Javadoc)
57
     * @see org.eclipse.cdt.make.internal.core.scannerconfig.gnu.AbstractGCCBOPConsoleParser#getUtility()
58
     */
53
    protected AbstractGCCBOPConsoleParserUtility getUtility() {
59
    protected AbstractGCCBOPConsoleParserUtility getUtility() {
54
        return fUtil;
60
        return fUtil;
55
    }
61
    }
56
62
63
    /* (non-Javadoc)
64
     * @see org.eclipse.cdt.make.internal.core.scannerconfig.gnu.AbstractGCCBOPConsoleParser#processSingleLine(java.lang.String)
65
     */
57
    protected boolean processSingleLine(String line) {
66
    protected boolean processSingleLine(String line) {
58
        boolean rc = false;
67
        boolean rc = false;
59
        // GCC C/C++ compiler invocation 
68
        // GCC C/C++ compiler invocation 
Lines 66-151 Link Here
66
        if (compilerInvocationIndex == -1)
75
        if (compilerInvocationIndex == -1)
67
            return rc;
76
            return rc;
68
77
69
        // Search for the compiler invocation command
78
        // split and unquote all segments; supports build command such as 
70
        
79
        // sh -c 'gcc -g -O0 -I"includemath" -I "include abc" -Iincludeprint -c impl/testmath.c'
71
        // expecting that compiler invocation is the first token in the line
80
        ArrayList split = splitLine(line, compilerInvocationIndex);
72
        String[] split = line.split("\\s+"); //$NON-NLS-1$
81
73
        boolean found = false;
82
        // get the position of the compiler command in the build command
74
        for (int i = 0; i < split.length; ++i) {
83
        for (compilerInvocationIndex=0; compilerInvocationIndex<split.size(); compilerInvocationIndex++) {
75
	        String command = split[i];
84
	        String command = (String)split.get(compilerInvocationIndex);
76
	        // verify that it is compiler invocation
85
	        // verify that it is compiler invocation
86
	        int cii2 = -1;
77
	        for (int cii = 0; cii < compilerInvocation.length; ++cii) {
87
	        for (int cii = 0; cii < compilerInvocation.length; ++cii) {
78
	            if (command.indexOf(compilerInvocation[cii]) >= 0) {
88
	        	cii2 = command.indexOf(compilerInvocation[cii]);
79
	            	found = true;
89
	        	if (cii2 >= 0)
80
	            	if (i > 0) {
90
	                break;
81
	            		// strip off anything before the compiler command
82
		            	String[] old = split;
83
		            	split = new String[old.length - i];
84
		            	System.arraycopy(old, i, split, 0, split.length);
85
	            	}
86
	            	break;
87
	            }
88
	        }
91
	        }
89
	        if (found)
92
        	if (cii2 >= 0)
90
	        	break;
93
                break;
91
        }
94
        }    
92
        if (!found) {
95
	    if (compilerInvocationIndex >= split.size()) {
93
            TraceUtil.outputTrace("Error identifying compiler command", line, TraceUtil.EOL); //$NON-NLS-1$
96
            TraceUtil.outputTrace("Error identifying compiler command", line, TraceUtil.EOL); //$NON-NLS-1$
94
            return rc;
97
            return rc;
95
        }
98
        }
96
        
97
        // find a file name
99
        // find a file name
98
        int extensionsIndex = -1;
100
        int extensionsIndex = -1;
99
        found = false;
101
        boolean found = false;
100
        String filePath = null;
102
        String filePath = null;
101
        for (int i = 1; i < split.length; ++i) {
103
        for (int i = compilerInvocationIndex+1; i < split.size(); ++i) {
102
            int k = split[i].lastIndexOf('.');
104
        	String segment = (String)split.get(i);
103
            if (k != -1 && (split[i].length() - k < 5)) {
105
            int k = segment.lastIndexOf('.');
104
                String fileExtension = split[i].substring(k);
106
            if (k != -1 && (segment.length() - k < 5)) {
107
                String fileExtension = segment.substring(k);
105
                extensionsIndex = FILE_EXTENSIONS_LIST.indexOf(fileExtension);
108
                extensionsIndex = FILE_EXTENSIONS_LIST.indexOf(fileExtension);
106
                if (extensionsIndex != -1) {
109
                if (extensionsIndex != -1) {
107
                    filePath = split[i];
110
                    filePath = segment;
108
                    found = true;
111
                    found = true;
109
                    break;
112
                    break;
110
                }
113
                }
111
            }
114
            }
112
        }
115
        }
113
116
//              for (int j = 0; j < FILE_EXTENSIONS.length; ++j) {
117
//                  if (split[i].endsWith(FILE_EXTENSIONS[j])) {
118
//                      filePath = split[i];
119
//                      extensionsIndex = j;
120
//                      found = true;
121
//                      break;
122
//                  }
123
//              }
124
//              if (found) break;
114
        if (!found) {
125
        if (!found) {
115
            TraceUtil.outputTrace("Error identifying file name :1", line, TraceUtil.EOL); //$NON-NLS-1$
126
            TraceUtil.outputTrace("Error identifying file name :1", line, TraceUtil.EOL); //$NON-NLS-1$
116
            return rc;
127
            return rc;
117
        }
128
        }
118
        
119
        // sanity check
129
        // sanity check
120
        if (filePath.indexOf(FILE_EXTENSIONS[extensionsIndex]) == -1) {
130
        if (filePath.indexOf(FILE_EXTENSIONS[extensionsIndex]) == -1) {
121
            TraceUtil.outputTrace("Error identifying file name :2", line, TraceUtil.EOL); //$NON-NLS-1$
131
            TraceUtil.outputTrace("Error identifying file name :2", line, TraceUtil.EOL); //$NON-NLS-1$
122
            return rc;
132
            return rc;
123
        }
133
        }
124
        
125
        if (fUtil != null) {
134
        if (fUtil != null) {
126
            IPath pFilePath = fUtil.getAbsolutePath(filePath);
135
            IPath pFilePath = fUtil.getAbsolutePath(filePath);
127
            String shortFileName = pFilePath.removeFileExtension().lastSegment();
136
            String shortFileName = pFilePath.removeFileExtension().lastSegment();
128
137
129
            // generalize occurances of the file name
138
            // generalize occurances of the file name
130
            StringBuffer genericLine = new StringBuffer();
139
            for (int i = 0; i < split.size(); i++) {
131
            for (int i = 0; i < split.length; i++) {
140
				String token = (String)split.get(i);
132
				String token = split[i];
141
				if (token.equals("-include")) { //$NON-NLS-1$
133
				if (token.equals("-include") || token.equals("-imacros")) { //$NON-NLS-1$ //$NON-NLS-2$
142
					++i;
143
				}
144
				else if (token.equals("-imacros")) { //$NON-NLS-1$
134
					++i;
145
					++i;
135
					genericLine.append(token);
136
					genericLine.append(' ');
137
				}
146
				}
138
				else if (token.equals(filePath)) {
147
				else if (token.equals(filePath)) {
139
					split[i] = "LONG_NAME"; //$NON-NLS-1$
148
					split.set(i, "LONG_NAME"); //$NON-NLS-1$
140
				}
149
				}
141
				else if (token.startsWith(shortFileName)) {
150
				else if (token.startsWith(shortFileName)) {
142
					split[i] = token.replaceFirst(shortFileName, "SHORT_NAME"); //$NON-NLS-1$
151
					split.set(i, token.replaceFirst(shortFileName, "SHORT_NAME")); //$NON-NLS-1$
143
				}
152
				}
144
				genericLine.append(split[i]);
145
				genericLine.append(' ');
146
			}
153
			}
147
            
154
            
148
            CCommandDSC cmd = fUtil.getNewCCommandDSC(genericLine.toString(), extensionsIndex > 0);
155
            CCommandDSC cmd = fUtil.getNewCCommandDSC((String[])split.toArray(new String[split.size()]), extensionsIndex > 0);
149
            IPath baseDirectory = fUtil.getBaseDirectory();
156
            IPath baseDirectory = fUtil.getBaseDirectory();
150
            if (baseDirectory.isPrefixOf(pFilePath)) {
157
            if (baseDirectory.isPrefixOf(pFilePath)) {
151
	            List cmdList = new ArrayList();
158
	            List cmdList = new ArrayList();
Lines 173-176 Link Here
173
        return rc;
180
        return rc;
174
    }
181
    }
175
182
183
    /**
184
     * Splits and unquotes all compiler command segments; supports build command such as 
185
     *    sh -c 'gcc -g -O0 -I"includemath" -I "include abc" -Iincludeprint -c impl/testmath.c'
186
     */
187
    private ArrayList<String> splitLine(String line, int compilerInvocationIndex) {
188
        ArrayList<String> split = new ArrayList<String>();
189
        boolean bSingleQuotes = false;
190
        boolean bIgnoreSingleQuotes = false;
191
        boolean bDoubleQuotes = false;
192
        boolean bIgnoreDoubleQuotes = false;
193
        char[] chars = line.toCharArray();
194
        int charPos = 0;
195
        int length = line.length();
196
        boolean quit = false;
197
        boolean acceptExtraSingleQuote = false;
198
        boolean acceptExtraDoubleQuote = false;
199
200
        // eat whitespace
201
        while (charPos < length) {
202
        	char ch = chars[charPos];
203
        	if (!Character.isWhitespace(ch)) {
204
        		break;
205
        	}
206
        	charPos++;
207
        }
208
        // read token
209
        while (charPos<length && !quit) {
210
	        int startPos = -1;
211
	        int endPos = -1;
212
	        while (charPos<length && !quit) {
213
	        	char ch = chars[charPos];
214
	        	if (ch == '\'') {
215
	        		// ignore quotes before the actual compiler command (the command itself including its options
216
	        		// could be within quotes--in this case we nevertheless want to split the compiler command into segments)
217
	        		if (charPos <= compilerInvocationIndex) {
218
	        			bIgnoreSingleQuotes = !bIgnoreSingleQuotes;
219
	        		}
220
	        		else {
221
	        			if (bIgnoreSingleQuotes) {
222
	        				bIgnoreSingleQuotes = false;
223
	    	        		if (startPos >= 0) {
224
	    	        			endPos = charPos;  // end of a token
225
	    	        		}
226
    	        			quit = true;  // quit after closed quote containing the actual compiler command
227
	        			}
228
	        			else {
229
	        				bSingleQuotes = !bSingleQuotes;
230
	        			}
231
	        		}
232
// do split token here: allow -DMYKEY='MYVALUE' or-DMYKEY=\'MYVALUE\' 
233
	        		if (startPos >= 0) {
234
	        			char prevch = charPos > 0 ? chars[charPos-1] : '\0';
235
	        			if (acceptExtraSingleQuote) {
236
	        				acceptExtraSingleQuote = false;
237
	        			}
238
	        			else if (prevch != '=' && prevch != '\\') {
239
	        				endPos = charPos;  // end of a token
240
	        			}
241
	        			else {
242
	        				acceptExtraSingleQuote = true;
243
	        			}
244
	        		}
245
	        	}
246
	        	else if (ch == '"') {
247
	        		// ignore quotes before the actual compiler command (the command itself including its options
248
	        		// could be within quotes--in this case we nevertheless want to split the compiler command into segments)
249
	        		if (charPos <= compilerInvocationIndex) {
250
	        			bIgnoreDoubleQuotes = !bIgnoreDoubleQuotes;
251
	        		}
252
	        		else {
253
	        			if (bIgnoreDoubleQuotes) {
254
	        				bIgnoreDoubleQuotes = false;
255
	    	        		if (startPos >= 0) {
256
	    	        			endPos = charPos;  // end of a token
257
	    	        		}
258
    	        			quit = true;  // quit after closed quote containing the actual compiler command
259
	        			}
260
	        			else {
261
	    	        		bDoubleQuotes = !bDoubleQuotes;
262
	        			}
263
	        		}
264
// do split token here: allow -DMYKEY="MYVALUE" or-DMYKEY=\"MYVALUE\" 
265
	        		if (startPos >= 0) {
266
	        			char prevch = charPos > 0 ? chars[charPos-1] : '\0';
267
	        			if (acceptExtraDoubleQuote) {
268
	        				acceptExtraDoubleQuote = false;
269
	        			}
270
	        			else if (prevch != '=' && prevch != '\\') {
271
	        				endPos = charPos;  // end of a token
272
	        			}
273
	        			else {
274
	        				acceptExtraDoubleQuote = true;
275
	        			}
276
	        		}
277
	        	}
278
	        	else if (Character.isWhitespace(ch) || ch == ';') {
279
	        		if (startPos < 0 && (bSingleQuotes || bDoubleQuotes)) {
280
	        			startPos = charPos;
281
	        		}
282
	        		else if (startPos >= 0 && !bSingleQuotes && !bDoubleQuotes) {
283
	        			endPos = charPos;  // end of a token
284
	        		}
285
	        	}
286
	        	else {  // a valid character, starts or continues a token
287
	        		if (startPos < 0) {
288
	        			startPos = charPos;
289
	        		}
290
	        		if (charPos == length-1) {
291
	        			endPos = charPos+1;   // end of token
292
	        		}
293
	        	}
294
	        	charPos++;
295
	        	// a complete token has been found
296
	        	if (startPos >= 0 && endPos > startPos) {
297
	        		break;
298
	        	}
299
	        }
300
	    	if (startPos >= 0 && endPos >= 0 && startPos >= compilerInvocationIndex) {
301
	    		split.add(line.substring(startPos, endPos));
302
	    	}
303
        }
304
        return split;
305
    }
176
}
306
}
(-)src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/AbstractGCCBOPConsoleParser.java (-2 / +13 lines)
Lines 83-91 Link Here
83
     */
83
     */
84
    public boolean processLine(String line) {
84
    public boolean processLine(String line) {
85
        boolean rc = false;
85
        boolean rc = false;
86
        int lineBreakPos = line.length()-1;
87
        char[] lineChars = line.toCharArray();
88
        while(lineBreakPos >= 0 && Character.isWhitespace(lineChars[lineBreakPos])) {
89
        	lineBreakPos--;
90
        }
91
        if (lineBreakPos >= 0) {
92
        	if (lineChars[lineBreakPos] != '\\'
93
        	    || (lineBreakPos > 0 && lineChars[lineBreakPos-1] == '\\')) {
94
        		lineBreakPos = -1;
95
        	}
96
        }
86
        // check for multiline commands (ends with '\')
97
        // check for multiline commands (ends with '\')
87
        if (line.endsWith("\\")) { //$NON-NLS-1$
98
        if (lineBreakPos >= 0) {
88
            sMultiline += line.substring(0, line.length()-1);// + " "; 
99
       		sMultiline += line.substring(0, lineBreakPos);
89
            bMultiline = true;
100
            bMultiline = true;
90
            return rc;
101
            return rc;
91
        }
102
        }
(-)src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParserUtility.java (-3 / +3 lines)
Lines 111-117 Link Here
111
            return;
111
            return;
112
        compiledFileList.add(longFileName);
112
        compiledFileList.add(longFileName);
113
113
114
        CCommandDSC command = getNewCCommandDSC(genericLine, false); // assume .c file type
114
        String[] tokens = genericLine.split("\\s+"); //$NON-NLS-1$
115
        CCommandDSC command = getNewCCommandDSC(tokens, false); // assume .c file type
115
        int index = commandsList2.indexOf(command);
116
        int index = commandsList2.indexOf(command);
116
        if (index == -1) {
117
        if (index == -1) {
117
            commandsList2.add(command);
118
            commandsList2.add(command);
Lines 130-138 Link Here
130
     * @param cppFileType
131
     * @param cppFileType
131
     * @return CCommandDSC compile command description 
132
     * @return CCommandDSC compile command description 
132
     */
133
     */
133
    public CCommandDSC getNewCCommandDSC(String genericLine, boolean cppFileType) {
134
    public CCommandDSC getNewCCommandDSC(String[] tokens, boolean cppFileType) {
134
        CCommandDSC command = new CCommandDSC(cppFileType);
135
        CCommandDSC command = new CCommandDSC(cppFileType);
135
        String[] tokens = genericLine.split("\\s+"); //$NON-NLS-1$
136
        command.addSCOption(new KVStringPair(SCDOptionsEnum.COMMAND.toString(), tokens[0]));
136
        command.addSCOption(new KVStringPair(SCDOptionsEnum.COMMAND.toString(), tokens[0]));
137
        for (int i = 1; i < tokens.length; ++i) {
137
        for (int i = 1; i < tokens.length; ++i) {
138
        	String token = tokens[i];
138
        	String token = tokens[i];

Return to bug 156008