VirtualBox

source: kBuild/trunk/VSlickMacros/kdev.e@ 2685

最後變更 在這個檔案從2685是 2685,由 bird 提交於 12 年 前

kdev.e: Added calc command and attached it to C-S-C.

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 109.3 KB
 
1/* $Id: kdev.e 2685 2013-07-04 19:50:01Z bird $ -*- tab-width: 4 c-indent-level: 4 -*- */
2/** @file
3 * Visual SlickEdit Documentation Macros.
4 */
5
6/*
7 * Copyright (c) 1999-2010 knut st. osmundsen <[email protected]>
8 *
9 * This file is part of kBuild.
10 *
11 * kBuild is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * kBuild is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with kBuild. If not, see <http://www.gnu.org/licenses/>
23 *
24 */
25
26/***
27 *
28 * This define the following keys:
29 *---------------------------------
30 * Ctrl+Shift+C: Class description box.
31 * Ctrl+Shift+F: Function/method description box.
32 * Ctrl+Shift+M: Module(file) description box
33 * Ctrl+Shift+O: One-liner (comment)
34 *
35 * Ctrl+Shift+G: Global box
36 * Ctrl+Shift+H: Header box
37 * Ctrl+Shift+E: Exported Symbols
38 * Ctrl+Shift+I: Internal function box
39 * Ctrl+Shift+K: Const/macro box
40 * Ctrl+Shift+S: Struct/Typedef box
41 *
42 * Ctrl+Shift+A: Signature+Date marker
43 * Ctrl+Shift+P: Mark line as change by me
44 *
45 * Ctrl+Shift+T: Update project tagfile.
46 * Ctrl+Shift+L: Load document variables.
47 *
48 * Ctrl+Shift+B: KLOGENTRYX(..)
49 * Ctrl+Shift+E: KLOGEXIT(..)
50 * Ctrl+Shift+N: Do kLog stuff for the current file. No questions.
51 * Ctrl+Shift+Q: Do kLog stuff for the current file. Ask a lot of questions.
52 *
53 * Remember to set the correct sOdin32UserName, sOdin32UserEmail and sOdin32UserInitials
54 * before compiling and loading the macros into Visual SlickEdit.
55 *
56 * These macros are compatible with both 3.0(c) and 4.0(b).
57 *
58 */
59defeventtab default_keys
60def 'C-S-A' = k_signature
61//def 'C-S-C' = k_javadoc_classbox
62def 'C-S-C' = k_calc
63def 'C-S-E' = k_box_exported
64def 'C-S-F' = k_javadoc_funcbox
65def 'C-S-G' = k_box_globals
66def 'C-S-H' = k_box_headers
67def 'C-S-I' = k_box_intfuncs
68def 'C-S-K' = k_box_consts
69def 'C-S-M' = k_javadoc_moduleheader
70def 'C-S-O' = k_oneliner
71def 'C-S-P' = k_mark_modified_line
72def 'C-S-S' = k_box_structs
73def 'C-S-T' = k_rebuild_tagfile
74def 'C-S-L' = k_style_load
75
76//optional stuff
77//def 'C-S-Q' = klib_klog_file_ask
78//def 'C-S-N' = klib_klog_file_no_ask
79//def 'C-S-1' = klib_klogentry
80//def 'C-S-3' = klib_klogexit
81
82
83//MARKER. Editor searches for this line!
84#pragma option(redeclvars, on)
85#include 'slick.sh'
86#ifndef VS_TAGDETAIL_context_args
87/* newer vslick version. */
88#include 'tagsdb.sh'
89//#pragma option(strict,on)
90/*#else: Version 4.0 (OS/2) */
91#endif
92
93/* Remeber to change these! */
94static _str skUserInitials = "bird";
95static _str skUserName = "knut st. osmundsen";
96static _str skUserEmail = "[email protected]";
97
98
99/*******************************************************************************
100* Global Variables *
101*******************************************************************************/
102static _str skCodeStyle = 'Opt2Ind4'; /* coding style scheme. */
103static _str skDocStyle = 'javadoc';/* options: javadoc, */
104static _str skLicense = 'GPLv3'; /* options: GPL, LGPL, Odin32, Confidential, ++ */
105static _str skCompany = ''; /* empty or company name for copyright */
106static _str skProgram = ''; /* Current program name - used by [L]GPL */
107static _str skChange = ''; /* Current change identifier. */
108
109static int ikStyleWidth = 80; /* The page width of the style. */
110static boolean fkStyleFullHeaders = false; /* false: omit some tags. */
111static int ikStyleOneliner = 41; /* The oneline comment column. */
112static int ikStyleModifyMarkColumn = 105;
113static boolean fkStyleBoxTag = false; /* true: Include tag in k_box_start. */
114
115/*******************************************************************************
116* Internal Functions *
117*******************************************************************************/
118/**
119 * Gets iso date.
120 * @returns ISO formatted date.
121 */
122static _str k_date()
123{
124 int i,j;
125 _str date;
126
127 date = _date('U');
128 i = pos("/", date);
129 j = pos("/", date, i+1);
130 _str month = substr(date, 1, i-1);
131 if (length(month) == 1) month = '0'month;
132 _str day = substr(date, i+1, j-i-1);
133 if (length(day) == 1) day = '0'day;
134 _str year = substr(date, j+1);
135 return year"-"month"-"day;
136}
137
138
139/**
140 * Get the current year.
141 * @returns Current year string.
142 */
143static _str k_year()
144{
145 _str date = _date('U');
146 return substr(date, pos("/",date, pos("/",date)+1)+1, 4);
147}
148
149
150/**
151 * Aligns a value up to a given alignment.
152 */
153static int k_alignup(int iValue, iAlign)
154{
155 if (iAlign <= 0)
156 {
157 message('k_alignup: iValue='iValue ' iAlign='iAlign);
158 iAlign = 4;
159 }
160 return ((iValue intdiv iAlign) + 1) * iAlign;
161}
162
163
164/**
165 * Reads the comment setup for this lexer/extension .
166 *
167 * @returns Success indicator.
168 * @param sLeft Left comment. (output)
169 * @param sRight Right comment. (output)
170 * @param iColumn Comment mark column. (1-based) (output)
171 * @param sExt The extension to lookup defaults to the current one.
172 * @param sLexer The lexer to lookup defaults to the current one.
173 * @remark This should be exported from box.e, but unfortunately it isn't.
174 */
175static boolean k_commentconfig(_str &sLeft, _str &sRight, int &iColumn, _str sExt = p_extension, _str sLexer = p_lexer_name)
176{
177 /* init returns */
178 sLeft = sRight = '';
179 iColumn = 0;
180
181 /*
182 * Get comment setup from the lexer.
183 */
184 _str sLine = '';
185 if (sLexer)
186 {
187 /* multiline */
188#if __VERSION__>=14.0
189 _str aComments[];
190 GetComments(aComments, "mlcomment", sLexer)
191 for (i = 0; i < aComments._length(); i++)
192 if (!pos("documentation", aComments[i]) > 0)
193 {
194 sLine = aComments[i];
195 break;
196 }
197 if (sLine != '')
198#else
199 rc = _ini_get_value(slick_path_search("user.vlx"), sLexer, 'mlcomment', sLine);
200 if (rc)
201 rc = _ini_get_value(slick_path_search("vslick.vlx"), sLexer, 'mlcomment', sLine);
202 if (!rc)
203#endif
204 {
205 sLeft = strip(word(sLine, 1));
206 sRight = strip(word(sLine, 2));
207 if (sLeft != '' && sRight != '')
208 return true;
209 }
210
211 /* failed, try single line. */
212#if __VERSION__>=14.0
213 GetComments(aComments, "linecomment", sLexer)
214 for (i = 0; i < aComments._length(); i++)
215 if (!pos("documentation", aComments[i]) > 0)
216 {
217 sLine = aComments[i];
218 break;
219 }
220 if (sLine != '')
221#else
222 rc = _ini_get_value(slick_path_search("user.vlx"), sLexer, 'linecomment', sLine);
223 if (rc)
224 rc = _ini_get_value(slick_path_search("vslick.vlx"), sLexer, 'linecomment', sLine);
225 if (!rc)
226#endif
227 {
228 sLeft = strip(word(sLine, 1));
229 sRight = '';
230 iColumn = 0;
231 _str sTmp = word(sLine, 2);
232 if (isnumber(sTmp))
233 iColumn = (int)sTmp;
234 if (sLeft != '')
235 return true;
236 }
237 }
238
239 /*
240 * Read the nonboxchars and determin user or default box.ini.
241 */
242 _str sFile = slick_path_search("ubox.ini");
243 boolean frc = _ini_get_value(sFile, sExt, 'nonboxchars', sLine);
244 if (frc)
245 {
246 sFile = slick_path_search("box.ini");
247 frc = _ini_get_value(sFile, sExt, 'nonboxchars', sLine);
248 }
249
250 if (!frc)
251 { /*
252 * Found extension.
253 */
254 sLeft = strip(eq_name2value('left',sLine));
255 if (sLeft == '\e') sLeft = '';
256 sRight = strip(eq_name2value('right',sLine));
257 if (sRight == '\e') sRight = '';
258
259 /* Read comment column too */
260 frc = _ini_get_value(sFile, sExt, 'comment_col', sLine);
261 if (frc)
262 {
263 iColumn = eq_name2value('comment_col', sLine);
264 if (iColumn == '\e') iColumn = 0;
265 }
266 else
267 iColumn = 0;
268 return true;
269 }
270
271 /* failure */
272 sLeft = sRight = '';
273 iColumn = 0;
274
275 return false;
276}
277
278
279/**
280 * Checks if current file only support line comments.
281 * @returns True / False.
282 * @remark Use builtin extension stuff!
283 */
284static boolean k_line_comment()
285{
286 _str sRight = '';
287 _str sLeft = '';
288 int iColumn;
289 boolean fLineComment = false;
290 if (k_commentconfig(sLeft, sRight, iColumn))
291 fLineComment = (sRight == '' || iColumn > 0);
292 return fLineComment;
293}
294
295
296
297#define KIC_CURSOR_BEFORE 1
298#define KIC_CURSOR_AFTER 2
299#define KIC_CURSOR_AT_END 3
300
301/**
302 * Insert a comment at current or best fitting position in the text.
303 * @param sStr The comment to insert.
304 * @param iCursor Where to put the cursor.
305 * @param iPosition Where to start the comment.
306 * Doesn't apply to column based source.
307 * -1 means at cursor position. (default)
308 * >0 means at end of line, but not before this column (1-based).
309 * This also implies a min of one space to EOL.
310 */
311void k_insert_comment(_str sStr, int iCursor, int iPosition = -1)
312{
313 _str sLeft;
314 _str sRight;
315 int iColumn;
316 if (!k_commentconfig(sLeft, sRight, iColumn))
317 {
318 sLeft = '/*'; sRight = '*/'; iColumn = 0;
319 }
320
321 int iCol = 0;
322 if (iColumn <= 0)
323 { /*
324 * not column based source
325 */
326
327 /* position us first */
328 if (iPosition > 0)
329 {
330 end_line();
331 do {
332 _insert_text(" ");
333 } while (p_col < iPosition);
334 }
335
336 /* insert comment saving the position for _BEFORE. */
337 iCol = p_col;
338 _insert_text(sLeft:+' ':+sStr);
339 if (iCursor == KIC_CURSOR_AT_END)
340 iCol = p_col;
341 /* right comment delimiter? */
342 if (sRight != '')
343 _insert_text(' ':+sRight);
344 }
345 else
346 {
347 if (p_col >= iColumn)
348 _insert_text("\n");
349 do { _insert_text(" "); } while (p_col < iColumn);
350 if (iCursor == KIC_CURSOR_BEFORE)
351 iCol = p_col;
352 _insert_text(sLeft:+' ':+sStr);
353 if (iCursor == KIC_CURSOR_AT_END)
354 iCol = p_col;
355 }
356
357 /* set cursor. */
358 if (iCursor != KIC_CURSOR_AFTER)
359 p_col = iCol;
360}
361
362
363/**
364 * Gets the comment prefix or postfix.
365 * @returns Comment prefix or postfix.
366 * @param fRight If clear left comment string - default.
367 * If set right comment string.
368 */
369static _str k_comment(boolean fRight = false)
370{
371 _str sLeft, sRight;
372 int iColumn;
373 _str sComment = '/*';
374 if (k_commentconfig(sLeft, sRight, iColumn))
375 sComment = (!fRight || iColumn > 0 ? sLeft : sRight);
376
377 return strip(sComment);
378}
379
380
381/*******************************************************************************
382* BOXES *
383*******************************************************************************/
384
385/**
386 * Inserts the first line in a box.
387 * @param sTag Not used - box tag.
388 */
389static void k_box_start(sTag)
390{
391 _str sLeft, sRight;
392 int iColumn;
393 if (!k_commentconfig(sLeft, sRight, iColumn))
394 return;
395 _begin_line();
396 if (iColumn >= 0)
397 while (p_col < iColumn)
398 _insert_text(" ");
399
400 _str sText = sLeft;
401 if (sTag != '' && fkStyleBoxTag)
402 {
403 if (substr(sText, length(sText)) != '*')
404 sText = sText:+'*';
405 sText = sText:+sTag;
406 }
407
408 int i;
409 for (i = length(sText); i <= ikStyleWidth - p_col; i++)
410 sText = sText:+'*';
411 sText = sText:+"\n";
412
413 _insert_text(sText);
414}
415
416
417/**
418 * Places a string, sStr, into a line started and ended by '*'.
419 * @param sStr Text to have between the '*'s.
420 */
421static void k_box_line(_str sStr)
422{
423 _str sLeft, sRight;
424 int iColumn;
425 if (!k_commentconfig(sLeft, sRight, iColumn))
426 return;
427 if (iColumn >= 0)
428 while (p_col < iColumn)
429 _insert_text(" ");
430
431 _str sText = '';
432 if (k_line_comment())
433 sText = sLeft;
434 if (sText == '' || substr(sText, length(sText)) != '*')
435 sText = sText:+'*';
436
437 sText = sText:+' ';
438 int i;
439 for (i = length(sText); i < p_SyntaxIndent; i++)
440 sText = sText:+' ';
441
442 sText = sText:+sStr;
443
444 for (i = length(sText) + 1; i <= ikStyleWidth - p_col; i++)
445 sText = sText:+' ';
446 sText = sText:+"*\n";
447
448 _insert_text(sText);
449}
450
451
452/**
453 * Inserts the last line in a box.
454 */
455static void k_box_end()
456{
457 _str sLeft, sRight;
458 int iColumn, i;
459 if (!k_commentconfig(sLeft, sRight, iColumn))
460 return;
461 if (iColumn >= 0)
462 while (p_col < iColumn)
463 _insert_text(" ");
464
465 _str sText = '';
466 if (k_line_comment())
467 sText = sLeft;
468 for (i = length(sText) + length(sRight); i <= ikStyleWidth - p_col; i++)
469 sText = sText:+'*';
470 sText = sText:+sRight:+"\n";
471
472 _insert_text(sText);
473}
474
475
476
477/*******************************************************************************
478* FUNCTION AND CODE PARSERS *
479*******************************************************************************/
480/**
481 * Moves cursor to nearest function start.
482 * @returns 0 if ok.
483 * -1 on failure.
484 */
485static int k_func_goto_nearest_function()
486{
487 boolean fFix = false; /* cursor at function fix. (last function) */
488 int cur_line = p_line;
489 int prev_line = -1;
490 int next_line = -1;
491 typeless org_pos;
492 _save_pos2(org_pos);
493
494 if (!next_proc(1))
495 {
496 next_line = p_line;
497 if (!prev_proc(1) && p_line == cur_line)
498 {
499 _restore_pos2(org_pos);
500 return 0;
501 }
502 _restore_pos2(org_pos);
503 _save_pos2(org_pos);
504 }
505 else
506 {
507 p_col++; /* fixes problem with single function files. */
508 fFix = true;
509 }
510
511 if (!prev_proc(1))
512 {
513 prev_line = p_line;
514 if (!next_proc(1) && p_line == cur_line)
515 {
516 _restore_pos2(org_pos);
517 return 0;
518 }
519 _restore_pos2(org_pos);
520 _save_pos2(org_pos);
521 }
522
523
524 if (prev_line != -1 && (next_line == -1 || cur_line - prev_line <= next_line - cur_line))
525 {
526 if (fFix)
527 p_col++;
528 prev_proc(1);
529 return 0;
530 }
531
532 if (next_line != -1 && (prev_line == -1 || cur_line - prev_line > next_line - cur_line))
533 {
534 next_proc();
535 return 0;
536 }
537
538 _restore_pos2(org_pos);
539 return -1;
540}
541
542
543/**
544 * Check if nearest function is a prototype.
545 * @returns True if function prototype.
546 * False if not function prototype.
547 */
548static boolean k_func_prototype()
549{
550 /*
551 * Check if this is a real function implementation.
552 */
553 typeless procpos;
554 _save_pos2(procpos);
555 if (!k_func_goto_nearest_function())
556 {
557 int proc_line = p_line;
558
559 if (!k_func_searchcode("{"))
560 {
561 prev_proc();
562 if (p_line != proc_line)
563 {
564 _restore_pos2(procpos);
565 return true;
566 }
567 }
568 }
569 _restore_pos2(procpos);
570
571 return false;
572}
573
574
575/**
576 * Gets the name fo the current function.
577 * @returns The current function name.
578 */
579static _str k_func_getfunction_name()
580{
581 _str sFunctionName = current_proc();
582 if (!sFunctionName)
583 sFunctionName = "";
584 //say 'functionanme='sFunctionName;
585 return sFunctionName;
586}
587
588
589/**
590 * Goes to the neares function and gets its parameters.
591 * @remark Should be reimplemented to use tags (if someone can figure out how to query that stuff).
592 */
593static _str k_func_getparams()
594{
595 typeless org_pos;
596 _save_pos2(org_pos);
597
598 /*
599 * Try use the tags first.
600 */
601 _UpdateContext(true);
602 int context_id = tag_current_context();
603 if (context_id <= 0)
604 {
605 k_func_goto_nearest_function();
606 context_id = tag_current_context();
607 }
608 if (context_id > 0)
609 {
610 _str args = '';
611 _str type = '';
612 tag_get_detail2(VS_TAGDETAIL_context_args, context_id, args);
613 tag_get_detail2(VS_TAGDETAIL_context_type, context_id, type);
614 if (tag_tree_type_is_func(type))
615 return args
616 //caption = tag_tree_make_caption_fast(VS_TAGMATCH_context,context_id,true,true,false);
617 }
618
619 /*
620 * Go to nearest function.
621 */
622 if ( !k_func_goto_nearest_function()
623 && !k_func_searchcode("(") /* makes some assumptions. */
624 )
625 {
626 /*
627 * Get parameters.
628 */
629 typeless posStart;
630 _save_pos2(posStart);
631 long offStart = _QROffset();
632 if (!find_matching_paren())
633 {
634 long offEnd = _QROffset();
635 _restore_pos2(posStart);
636 p_col++;
637 _str sParamsRaw = strip(get_text((int)(offEnd - offStart - 1)));
638
639
640 /*
641 * Remove new lines and double spaces within params.
642 */
643 _str sParams = "";
644
645 int i;
646 _str chPrev;
647 for (i = 1, chPrev = ' '; i <= length(sParamsRaw); i++)
648 {
649 _str ch = substr(sParamsRaw, i, 1);
650
651 /*
652 * Do fixups.
653 */
654 if (ch == " " && chPrev == " ")
655 continue;
656
657 if ((ch :== "\n") || (ch :== "\r") || (ch :== "\t"))
658 {
659 if (chPrev == ' ')
660 continue;
661 ch = ' ';
662 }
663
664 if (ch == ',' && chPrev == ' ')
665 {
666 sParams = substr(sParams, 1, length(sParams) - 1);
667 }
668
669 if (ch == '*')
670 {
671 if (chPrev != ' ')
672 sParams = sParams :+ ' * ';
673 else
674 sParams = sParams :+ '* ';
675 chPrev = ' ';
676 }
677 else
678 {
679 sParams = sParams :+ ch;
680 chPrev = ch;
681 }
682
683 } /* for */
684
685 sParams = strip(sParams);
686 if (sParams == 'void' || sParams == 'VOID')
687 sParams = "";
688 _restore_pos2(org_pos);
689 return sParams;
690 }
691 else
692 message("find_matchin_paren failed");
693 }
694
695 _restore_pos2(org_pos);
696 return false;
697}
698
699
700
701/**
702 * Enumerates the parameters to the function.
703 * @param sParams Parameter string from k_func_getparams.
704 * @param iParam The index (0-based) of the parameter to get.
705 * @param sType Type. (output)
706 * @param sName Name. (output)
707 * @param sDefault Default value. (output)
708 * @remark Doesn't perhaps handle function pointers very well (I think)?
709 * @remark Should be reimplemented to use tags (if someone can figure out how to query that stuff).
710 */
711static int k_func_enumparams(_str sParams, int iParam, _str &sType, _str &sName, _str &sDefault)
712{
713 int i;
714 int iParLevel;
715 int iCurParam;
716 int iStartParam;
717
718 sType = sName = sDefault = "";
719
720 /* no use working on empty string! */
721 if (length(sParams) == 0)
722 return -1;
723
724 /* find the parameter in question */
725 for (iStartParam = i = 1, iParLevel = iCurParam = 0; i <= length(sParams); i++)
726 {
727 _str ch = substr(sParams, i, 1);
728 if (ch == ',' && iParLevel == 0)
729 {
730 /* is it this parameter ? */
731 if (iParam == iCurParam)
732 break;
733
734 iCurParam++;
735 iStartParam = i + 1;
736 }
737 else if (ch == '(')
738 iParLevel++;
739 else if (ch == ')')
740 iParLevel--;
741 }
742
743 /* did we find the parameter? */
744 if (iParam == iCurParam)
745 { /* (yeah, we did!) */
746 _str sArg = strip(substr(sParams, iStartParam, i - iStartParam));
747 /* remove M$ stuff */
748 sArg = stranslate(sArg, "", "IN", "E");
749 sArg = stranslate(sArg, "", "OUT", "E");
750 sArg = stranslate(sArg, "", "OPTIONAL", "E");
751 sArg = strip(sArg);
752
753 /* lazy approach, which doens't support function types */
754
755 if (pos('=', sParams) > 0) /* default */
756 {
757 sDefault = strip(substr(sParams, pos('=', sParams) + 1));
758 sArg = strip(substr(sArg, 1, pos('=', sParams) - 1));
759 }
760
761 for (i = length(sArg); i > 1; i--)
762 {
763 _str ch = substr(sArg, i, 1);
764 if ( !(ch >= 'a' && ch <= 'z')
765 && !(ch >= 'A' && ch <= 'Z')
766 && !(ch >= '0' && ch <= '9')
767 && ch != '_' && ch != '$')
768 break;
769 }
770 if (sArg == "...")
771 i = 0;
772 sName = strip(substr(sArg, i + 1));
773 sType = strip(substr(sArg, 1, i));
774
775 return 0;
776 }
777
778 return -1;
779}
780
781
782/**
783 * Counts the parameters to the function.
784 * @param sParams Parameter string from k_func_getparams.
785 * @remark Should be reimplemented to use tags (if someone can figure out how to query that stuff).
786 */
787static int k_func_countparams(_str sParams)
788{
789 int i;
790 int iParLevel;
791 int iCurParam;
792 _str sType = "", sName = "", sDefault = "";
793
794 /* check for 0 parameters */
795 if (length(sParams) == 0)
796 return 0;
797
798 /* find the parameter in question */
799 for (i = 1, iParLevel = iCurParam = 0; i <= length(sParams); i++)
800 {
801 _str ch = substr(sParams, i, 1);
802 if (ch == ',' && iParLevel == 0)
803 {
804 iCurParam++;
805 }
806 else if (ch == '(')
807 iParLevel++;
808 else if (ch == ')')
809 iParLevel--;
810 }
811
812 return iCurParam + 1;
813}
814
815
816/**
817 * Gets the return type.
818 */
819static _str k_func_getreturntype(boolean fPureType = false)
820{
821 typeless org_pos;
822 _save_pos2(org_pos);
823
824 /*
825 * Go to nearest function.
826 */
827 if (!k_func_goto_nearest_function())
828 {
829 /*
830 * Return type is from function start to function name...
831 */
832 typeless posStart;
833 _save_pos2(posStart);
834 long offStart = _QROffset();
835
836 if (!k_func_searchcode("(")) /* makes some assumptions. */
837 {
838 prev_word();
839 long offEnd = _QROffset();
840 _restore_pos2(posStart);
841 _str sTypeRaw = strip(get_text((int)(offEnd - offStart)));
842
843 //say 'sTypeRaw='sTypeRaw;
844 /*
845 * Remove static, inline, _Optlink, stdcall, EXPENTRY etc.
846 */
847 if (fPureType)
848 {
849 sTypeRaw = stranslate(sTypeRaw, "", "__static__", "I");
850 sTypeRaw = stranslate(sTypeRaw, "", "__static", "I");
851 sTypeRaw = stranslate(sTypeRaw, "", "static__", "I");
852 sTypeRaw = stranslate(sTypeRaw, "", "static", "I");
853 sTypeRaw = stranslate(sTypeRaw, "", "__inline__", "I");
854 sTypeRaw = stranslate(sTypeRaw, "", "__inline", "I");
855 sTypeRaw = stranslate(sTypeRaw, "", "inline__", "I");
856 sTypeRaw = stranslate(sTypeRaw, "", "inline", "I");
857 sTypeRaw = stranslate(sTypeRaw, "", "EXPENTRY", "I");
858 sTypeRaw = stranslate(sTypeRaw, "", "_Optlink", "I");
859 sTypeRaw = stranslate(sTypeRaw, "", "__stdcall", "I");
860 sTypeRaw = stranslate(sTypeRaw, "", "__cdecl", "I");
861 sTypeRaw = stranslate(sTypeRaw, "", "_cdecl", "I");
862 sTypeRaw = stranslate(sTypeRaw, "", "cdecl", "I");
863 sTypeRaw = stranslate(sTypeRaw, "", "__PASCAL", "I");
864 sTypeRaw = stranslate(sTypeRaw, "", "_PASCAL", "I");
865 sTypeRaw = stranslate(sTypeRaw, "", "PASCAL", "I");
866 sTypeRaw = stranslate(sTypeRaw, "", "__Far32__", "I");
867 sTypeRaw = stranslate(sTypeRaw, "", "__Far32", "I");
868 sTypeRaw = stranslate(sTypeRaw, "", "Far32__", "I");
869 sTypeRaw = stranslate(sTypeRaw, "", "_Far32_", "I");
870 sTypeRaw = stranslate(sTypeRaw, "", "_Far32", "I");
871 sTypeRaw = stranslate(sTypeRaw, "", "Far32_", "I");
872 sTypeRaw = stranslate(sTypeRaw, "", "Far32", "I");
873 sTypeRaw = stranslate(sTypeRaw, "", "__far", "I");
874 sTypeRaw = stranslate(sTypeRaw, "", "_far", "I");
875 sTypeRaw = stranslate(sTypeRaw, "", "far", "I");
876 sTypeRaw = stranslate(sTypeRaw, "", "__near", "I");
877 sTypeRaw = stranslate(sTypeRaw, "", "_near", "I");
878 sTypeRaw = stranslate(sTypeRaw, "", "near", "I");
879 sTypeRaw = stranslate(sTypeRaw, "", "__loadds__", "I");
880 sTypeRaw = stranslate(sTypeRaw, "", "__loadds", "I");
881 sTypeRaw = stranslate(sTypeRaw, "", "loadds__", "I");
882 sTypeRaw = stranslate(sTypeRaw, "", "_loadds_", "I");
883 sTypeRaw = stranslate(sTypeRaw, "", "_loadds", "I");
884 sTypeRaw = stranslate(sTypeRaw, "", "loadds_", "I");
885 sTypeRaw = stranslate(sTypeRaw, "", "loadds", "I");
886 sTypeRaw = stranslate(sTypeRaw, "", "__loades__", "I");
887 sTypeRaw = stranslate(sTypeRaw, "", "__loades", "I");
888 sTypeRaw = stranslate(sTypeRaw, "", "loades__", "I");
889 sTypeRaw = stranslate(sTypeRaw, "", "_loades_", "I");
890 sTypeRaw = stranslate(sTypeRaw, "", "_loades", "I");
891 sTypeRaw = stranslate(sTypeRaw, "", "loades_", "I");
892 sTypeRaw = stranslate(sTypeRaw, "", "loades", "I");
893 sTypeRaw = stranslate(sTypeRaw, "", "WIN32API", "I");
894 sTypeRaw = stranslate(sTypeRaw, "", "WINAPI", "I");
895 sTypeRaw = stranslate(sTypeRaw, "", "LDRCALL", "I");
896 sTypeRaw = stranslate(sTypeRaw, "", "KRNLCALL", "I");
897 sTypeRaw = stranslate(sTypeRaw, "", "__operator__", "I"); /* operator fix */
898 sTypeRaw = stranslate(sTypeRaw, "", "__operator", "I"); /* operator fix */
899 sTypeRaw = stranslate(sTypeRaw, "", "operator__", "I"); /* operator fix */
900 sTypeRaw = stranslate(sTypeRaw, "", "operator", "I"); /* operator fix */
901 sTypeRaw = stranslate(sTypeRaw, "", "IN", "E");
902 sTypeRaw = stranslate(sTypeRaw, "", "OUT", "E");
903 sTypeRaw = stranslate(sTypeRaw, "", "OPTIONAL", "E");
904 }
905
906 /*
907 * Remove new lines and double spaces within params.
908 */
909 _str sType = "";
910
911 int i;
912 _str chPrev;
913 for (i = 1, chPrev = ' '; i <= length(sTypeRaw); i++)
914 {
915 _str ch = substr(sTypeRaw, i, 1);
916
917 /*
918 * Do fixups.
919 */
920 if (ch == " " && chPrev == " ")
921 continue;
922
923 if ((ch :== "\n") || (ch :== "\r") || (ch :== "\t"))
924 {
925 if (chPrev == ' ')
926 continue;
927 ch = ' ';
928 }
929
930 if (ch == ',' && chPrev == ' ')
931 {
932 sType = substr(sType, 1, length(sType) - 1);
933 }
934
935 if (ch == '*')
936 {
937 if (chPrev != ' ')
938 sType = sType :+ ' * ';
939 else
940 sType = sType :+ '* ';
941 chPrev = ' ';
942 }
943 else
944 {
945 sType = sType :+ ch;
946 chPrev = ch;
947 }
948
949 } /* for */
950
951 sType = strip(sType);
952
953 _restore_pos2(org_pos);
954 return sType;
955 }
956 else
957 message('k_func_getreturntype: can''t find ''(''.');
958 }
959
960 _restore_pos2(org_pos);
961 return false;
962}
963
964
965/**
966 * Search for some piece of code.
967 */
968static int k_func_searchcode(_str sSearchString, _str sOptions = "E+")
969{
970 int rc;
971 rc = search(sSearchString, sOptions);
972 while (!rc && !k_func_in_code())
973 {
974 p_col++;
975 rc = search(sSearchString, sOptions);
976 }
977 return rc;
978}
979
980
981/**
982 * Checks if cursor is in code or in comment.
983 * @return True if cursor in code.
984 */
985static boolean k_func_in_code()
986{
987 typeless searchsave;
988 _save_pos2(searchsave);
989 boolean fRc = !_in_comment();
990 _restore_pos2(searchsave);
991 return fRc;
992}
993
994
995/*
996 * Gets the next piece of code.
997 */
998static _str k_func_get_next_code_text()
999{
1000 typeless searchsave;
1001 _save_pos2(searchsave);
1002 _str ch = k_func_get_next_code_text2();
1003 _restore_pos2(searchsave);
1004 return ch;
1005}
1006
1007
1008/**
1009 * Checks if there is more code on the line.
1010 */
1011static boolean k_func_more_code_on_line()
1012{
1013 boolean fRc;
1014 int curline = p_line;
1015 typeless searchsave;
1016 _save_pos2(searchsave);
1017 k_func_get_next_code_text2();
1018 fRc = curline == p_line;
1019 _restore_pos2(searchsave);
1020
1021 return fRc;
1022}
1023
1024
1025/**
1026 * Gets the next piece of code.
1027 * Doesn't preserver cursor position.
1028 */
1029static _str k_func_get_next_code_text2()
1030{
1031 _str ch;
1032 do
1033 {
1034 int curcol = ++p_col;
1035 end_line();
1036 if (p_col <= curcol)
1037 {
1038 p_line++;
1039 p_col = 1;
1040 }
1041 else
1042 p_col = curcol;
1043
1044 ch = get_text();
1045 //say ch ' ('_asc(ch)')';
1046 while (ch == "#") /* preprocessor stuff */
1047 {
1048 p_col = 1;
1049 p_line++;
1050 ch = get_text();
1051 //say ch ' ('_asc(ch)')';
1052 continue;
1053 }
1054 } while (ch :== ' ' || ch :== "\t" || ch :== "\n" || ch :== "\r" || !k_func_in_code());
1055
1056 return ch;
1057}
1058
1059
1060
1061
1062/*******************************************************************************
1063* JAVA DOC STYLED WORKERS *
1064*******************************************************************************/
1065
1066/** starts a javadoc documentation box. */
1067static void k_javadoc_box_start(_str sStr = '', boolean fDouble = true)
1068{
1069 _str sLeft, sRight;
1070 int iColumn;
1071 if (!k_commentconfig(sLeft, sRight, iColumn))
1072 return;
1073 _begin_line();
1074 if (iColumn >= 0)
1075 while (p_col < iColumn)
1076 _insert_text(" ");
1077
1078 _str sText = sLeft;
1079 if (fDouble)
1080 sText = sLeft:+substr(sLeft, length(sLeft), 1);
1081 if (sStr != '')
1082 sText = sText:+' ':+sStr;
1083 sText = sText:+"\n";
1084
1085 _insert_text(sText);
1086}
1087
1088/** inserts a new line in a javadoc documentation box. */
1089static void k_javadoc_box_line(_str sStr = '', int iPadd = 0, _str sStr2 = '', int iPadd2 = 0, _str sStr3 = '')
1090{
1091 _str sLeft, sRight;
1092 int iColumn;
1093 if (!k_commentconfig(sLeft, sRight, iColumn))
1094 return;
1095 if (iColumn >= 0)
1096 while (p_col < iColumn)
1097 _insert_text(" ");
1098
1099 _str sText;
1100 if (k_line_comment())
1101 sText = sLeft;
1102 else
1103 {
1104 sText = sLeft;
1105 sText = ' ':+substr(sLeft, length(sLeft));
1106 }
1107
1108 if (sStr != '')
1109 sText = sText:+' ':+sStr;
1110 if (iPadd > 0)
1111 {
1112 int i;
1113 for (i = length(sText); i < iPadd; i++)
1114 sText = sText:+' ';
1115
1116 if (sStr2 != '')
1117 sText = sText:+sStr2;
1118
1119 if (iPadd2 > 0)
1120 {
1121 for (i = length(sText); i < iPadd2; i++)
1122 sText = sText:+' ';
1123
1124 if (sStr3 != '')
1125 sText = sText:+sStr3;
1126 }
1127 }
1128 sText = sText:+"\n";
1129
1130 _insert_text(sText);
1131}
1132
1133/** ends a javadoc documentation box. */
1134static void k_javadoc_box_end()
1135{
1136 _str sLeft, sRight;
1137 int iColumn;
1138 if (!k_commentconfig(sLeft, sRight, iColumn))
1139 return;
1140 if (iColumn >= 0)
1141 while (p_col < iColumn)
1142 _insert_text(" ");
1143
1144 _str sText;
1145 if (k_line_comment())
1146 sText = sLeft;
1147 else
1148 {
1149 sText = sRight;
1150 /*if (substr(sText, 1, 1) != '*')
1151 sText = '*':+sText;*/
1152 sText = ' ':+sText;
1153 }
1154 sText = sText:+"\n";
1155
1156 _insert_text(sText);
1157}
1158
1159
1160/**
1161 * Write a Javadoc styled classbox.
1162 */
1163void k_javadoc_classbox()
1164{
1165 int iCursorLine;
1166 int iPadd = k_alignup(12, p_SyntaxIndent);
1167
1168 k_javadoc_box_start();
1169 iCursorLine = p_RLine;
1170 k_javadoc_box_line(' ');
1171
1172 if (fkStyleFullHeaders)
1173 {
1174 k_javadoc_box_line('@shortdesc', iPadd);
1175 k_javadoc_box_line('@dstruct', iPadd);
1176 k_javadoc_box_line('@version', iPadd);
1177 k_javadoc_box_line('@verdesc', iPadd);
1178 }
1179 k_javadoc_box_line('@author', iPadd, skUserName ' <' skUserEmail '>');
1180 k_javadoc_box_line('@approval', iPadd);
1181 k_javadoc_box_end();
1182
1183 up(p_RLine - iCursorLine);
1184 end_line();
1185 keyin(' ');
1186}
1187
1188
1189/**
1190 * Javadoc - functionbox(/header).
1191 */
1192void k_javadoc_funcbox()
1193{
1194 int cArgs = 1;
1195 _str sArgs = "";
1196 int iCursorLine;
1197 int iPadd = k_alignup(11, p_SyntaxIndent);
1198
1199 /* look for parameters */
1200 boolean fFoundFn = !k_func_goto_nearest_function();
1201 if (fFoundFn)
1202 {
1203 sArgs = k_func_getparams();
1204 cArgs = k_func_countparams(sArgs);
1205 }
1206
1207 k_javadoc_box_start();
1208 iCursorLine = p_RLine;
1209 k_javadoc_box_line(' ');
1210 if (file_eq(p_extension, 'asm'))
1211 k_javadoc_box_line('@cproto', iPadd);
1212 k_javadoc_box_line('@returns', iPadd);
1213 if (fFoundFn)
1214 {
1215 /*
1216 * Determin parameter description indent.
1217 */
1218 int iPadd2 = 0;
1219 int i;
1220 for (i = 0; i < cArgs; i++)
1221 {
1222 _str sName, sType, sDefault;
1223 if ( !k_func_enumparams(sArgs, i, sType, sName, sDefault)
1224 && iPadd2 < length(sName))
1225 iPadd2 = length(sName);
1226 }
1227 iPadd2 = k_alignup((iPadd + iPadd2), p_SyntaxIndent);
1228 if (iPadd2 < 28)
1229 iPadd2 = k_alignup(28, p_SyntaxIndent);
1230
1231 /*
1232 * Insert parameter.
1233 */
1234 for (i = 0; i < cArgs; i++)
1235 {
1236 _str sName, sType, sDefault;
1237 if (!k_func_enumparams(sArgs, i, sType, sName, sDefault))
1238 {
1239 _str sStr3 = '.';
1240 if (sDefault != "")
1241 sStr3 = '(default='sDefault')';
1242 k_javadoc_box_line('@param', iPadd, sName, iPadd2, sStr3);
1243 }
1244 else
1245 k_javadoc_box_line('@param', iPadd);
1246 }
1247 }
1248 else
1249 k_javadoc_box_line('@param', iPadd);
1250
1251 if (file_eq(p_extension, 'asm'))
1252 k_javadoc_box_line('@uses', iPadd);
1253 if (fkStyleFullHeaders)
1254 {
1255 k_javadoc_box_line('@equiv', iPadd);
1256 k_javadoc_box_line('@time', iPadd);
1257 k_javadoc_box_line('@sketch', iPadd);
1258 k_javadoc_box_line('@status', iPadd);
1259 k_javadoc_box_line('@author', iPadd, skUserName ' <' skUserEmail '>');
1260 k_javadoc_box_line('@remark', iPadd);
1261 }
1262 k_javadoc_box_end();
1263
1264 up(p_RLine - iCursorLine);
1265 end_line();
1266 keyin(' ');
1267}
1268
1269
1270/**
1271 * Javadoc module header.
1272 */
1273void k_javadoc_moduleheader()
1274{
1275 int iCursorLine;
1276 int fSplit = 0;
1277
1278 _insert_text("\n");
1279 up();
1280 _begin_line();
1281 k_insert_comment('$':+'I':+'d: $', KIC_CURSOR_AT_END, -1);
1282 _end_line();
1283 _insert_text("\n");
1284
1285 k_javadoc_box_start('@file');
1286 fSplit = 1;
1287 iCursorLine = p_RLine;
1288 k_javadoc_box_line();
1289 k_javadoc_box_end();
1290 _insert_text("\n");
1291 _insert_text(k_comment() "\n");
1292
1293 if (skLicense == 'Confidential')
1294 {
1295 k_javadoc_box_line(skCompany ' confidential');
1296 k_javadoc_box_line();
1297 }
1298
1299 if (skCompany != '')
1300 {
1301 if (skLicense != 'Confidential')
1302 k_javadoc_box_line('Copyright (C) ' k_year() ' ' skCompany);
1303 else
1304 {
1305 k_javadoc_box_line('Copyright (c) ' k_year() ' ' skCompany);
1306 k_javadoc_box_line();
1307 k_javadoc_box_line('Author: ' skUserName' <' skUserEmail '>');
1308 }
1309 }
1310 else
1311 k_javadoc_box_line('Copyright (c) ' k_year() ' 'skUserName' <' skUserEmail '>');
1312 k_javadoc_box_line();
1313 _str sProg = skProgram;
1314 switch (skLicense)
1315 {
1316 case 'Odin32':
1317 k_javadoc_box_line('Project Odin Software License can be found in LICENSE.TXT.');
1318 break;
1319
1320 case 'GPL':
1321 if (!fSplit)
1322 k_javadoc_box_line();
1323 if (sProg == '')
1324 sProg = 'This program';
1325 else
1326 {
1327 k_javadoc_box_line('This file is part of ' sProg '.');
1328 k_javadoc_box_line();
1329 }
1330 k_javadoc_box_line(sProg ' is free software; you can redistribute it and/or modify');
1331 k_javadoc_box_line('it under the terms of the GNU General Public License as published by');
1332 k_javadoc_box_line('the Free Software Foundation; either version 2 of the License, or');
1333 k_javadoc_box_line('(at your option) any later version.');
1334 k_javadoc_box_line();
1335 k_javadoc_box_line(sProg ' is distributed in the hope that it will be useful,');
1336 k_javadoc_box_line('but WITHOUT ANY WARRANTY; without even the implied warranty of');
1337 k_javadoc_box_line('MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the');
1338 k_javadoc_box_line('GNU General Public License for more details.');
1339 k_javadoc_box_line();
1340 k_javadoc_box_line('You should have received a copy of the GNU General Public License');
1341 k_javadoc_box_line('along with ' sProg '; if not, write to the Free Software');
1342 k_javadoc_box_line('Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA');
1343 break;
1344
1345 case 'LGPL':
1346 if (!fSplit)
1347 k_javadoc_box_line();
1348 if (sProg == '')
1349 sProg = 'This library';
1350 else
1351 {
1352 k_javadoc_box_line('This file is part of ' sProg '.');
1353 k_javadoc_box_line();
1354 }
1355 k_javadoc_box_line(sProg ' is free software; you can redistribute it and/or');
1356 k_javadoc_box_line('modify it under the terms of the GNU Lesser General Public');
1357 k_javadoc_box_line('License as published by the Free Software Foundation; either');
1358 k_javadoc_box_line('version 2.1 of the License, or (at your option) any later version.');
1359 k_javadoc_box_line();
1360 k_javadoc_box_line(sProg ' is distributed in the hope that it will be useful,');
1361 k_javadoc_box_line('but WITHOUT ANY WARRANTY; without even the implied warranty of');
1362 k_javadoc_box_line('MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU');
1363 k_javadoc_box_line('Lesser General Public License for more details.');
1364 k_javadoc_box_line();
1365 k_javadoc_box_line('You should have received a copy of the GNU Lesser General Public');
1366 k_javadoc_box_line('License along with ' sProg '; if not, write to the Free Software');
1367 k_javadoc_box_line('Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA');
1368 break;
1369
1370 case 'GPLv3':
1371 if (!fSplit)
1372 k_javadoc_box_line();
1373 if (sProg == '')
1374 sProg = 'This program';
1375 else
1376 {
1377 k_javadoc_box_line('This file is part of ' sProg '.');
1378 k_javadoc_box_line();
1379 }
1380 k_javadoc_box_line(sProg ' is free software; you can redistribute it and/or modify');
1381 k_javadoc_box_line('it under the terms of the GNU General Public License as published by');
1382 k_javadoc_box_line('the Free Software Foundation; either version 3 of the License, or');
1383 k_javadoc_box_line('(at your option) any later version.');
1384 k_javadoc_box_line();
1385 k_javadoc_box_line(sProg ' is distributed in the hope that it will be useful,');
1386 k_javadoc_box_line('but WITHOUT ANY WARRANTY; without even the implied warranty of');
1387 k_javadoc_box_line('MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the');
1388 k_javadoc_box_line('GNU General Public License for more details.');
1389 k_javadoc_box_line();
1390 k_javadoc_box_line('You should have received a copy of the GNU General Public License');
1391 k_javadoc_box_line('along with ' sProg '. If not, see <http://www.gnu.org/licenses/>');
1392 break;
1393
1394 case 'LGPLv3':
1395 if (!fSplit)
1396 k_javadoc_box_line();
1397 if (sProg == '')
1398 sProg = 'This program';
1399 else
1400 {
1401 k_javadoc_box_line('This file is part of ' sProg '.');
1402 k_javadoc_box_line();
1403 }
1404 k_javadoc_box_line(sProg ' is free software; you can redistribute it and/or');
1405 k_javadoc_box_line('modify it under the terms of the GNU Lesser General Public');
1406 k_javadoc_box_line('License as published by the Free Software Foundation; either');
1407 k_javadoc_box_line('version 3 of the License, or (at your option) any later version.');
1408 k_javadoc_box_line();
1409 k_javadoc_box_line(sProg ' is distributed in the hope that it will be useful,');
1410 k_javadoc_box_line('but WITHOUT ANY WARRANTY; without even the implied warranty of');
1411 k_javadoc_box_line('MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the');
1412 k_javadoc_box_line('GNU Lesser General Public License for more details.');
1413 k_javadoc_box_line();
1414 k_javadoc_box_line('You should have received a copy of the GNU Lesser General Public License');
1415 k_javadoc_box_line('along with ' sProg '. If not, see <http://www.gnu.org/licenses/>');
1416 break;
1417
1418 case 'Confidential':
1419 k_javadoc_box_line('All Rights Reserved');
1420 break;
1421
1422 case 'ConfidentialNoAuthor':
1423 k_javadoc_box_line(skCompany ' confidential');
1424 k_javadoc_box_line('All Rights Reserved');
1425 break;
1426
1427 case 'VirtualBox':
1428 k_javadoc_box_line('This file is part of VirtualBox Open Source Edition (OSE), as')
1429 k_javadoc_box_line('available from http://www.alldomusa.eu.org. This file is free software;')
1430 k_javadoc_box_line('you can redistribute it and/or modify it under the terms of the GNU')
1431 k_javadoc_box_line('General Public License (GPL) as published by the Free Software')
1432 k_javadoc_box_line('Foundation, in version 2 as it comes in the "COPYING" file of the')
1433 k_javadoc_box_line('VirtualBox OSE distribution. VirtualBox OSE is distributed in the')
1434 k_javadoc_box_line('hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.')
1435 k_javadoc_box_line('')
1436 k_javadoc_box_line('Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa')
1437 k_javadoc_box_line('Clara, CA 95054 USA or visit http://www.sun.com if you need')
1438 k_javadoc_box_line('additional information or have any questions.')
1439 break;
1440
1441 case 'VirtualBoxGPLAndCDDL':
1442 k_javadoc_box_line('This file is part of VirtualBox Open Source Edition (OSE), as')
1443 k_javadoc_box_line('available from http://www.alldomusa.eu.org. This file is free software;')
1444 k_javadoc_box_line('you can redistribute it and/or modify it under the terms of the GNU')
1445 k_javadoc_box_line('General Public License (GPL) as published by the Free Software')
1446 k_javadoc_box_line('Foundation, in version 2 as it comes in the "COPYING" file of the')
1447 k_javadoc_box_line('VirtualBox OSE distribution. VirtualBox OSE is distributed in the')
1448 k_javadoc_box_line('hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.')
1449 k_javadoc_box_line('')
1450 k_javadoc_box_line('The contents of this file may alternatively be used under the terms')
1451 k_javadoc_box_line('of the Common Development and Distribution License Version 1.0')
1452 k_javadoc_box_line('(CDDL) only, as it comes in the "COPYING.CDDL" file of the')
1453 k_javadoc_box_line('VirtualBox OSE distribution, in which case the provisions of the')
1454 k_javadoc_box_line('CDDL are applicable instead of those of the GPL.')
1455 k_javadoc_box_line('')
1456 k_javadoc_box_line('You may elect to license modified versions of this file under the')
1457 k_javadoc_box_line('terms and conditions of either the GPL or the CDDL or both.')
1458 k_javadoc_box_line('')
1459 k_javadoc_box_line('Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa')
1460 k_javadoc_box_line('Clara, CA 95054 USA or visit http://www.sun.com if you need')
1461 k_javadoc_box_line('additional information or have any questions.')
1462 break;
1463
1464 default:
1465
1466 }
1467 k_javadoc_box_line();
1468 k_javadoc_box_end();
1469
1470 up(p_RLine - iCursorLine);
1471 end_line();
1472 keyin(' ');
1473}
1474
1475
1476
1477
1478
1479
1480
1481/*******************************************************************************
1482* Keyboard Shortcuts *
1483*******************************************************************************/
1484/** Makes global box. */
1485void k_box_globals()
1486{
1487 k_box_start('Global');
1488 k_box_line('Global Variables');
1489 k_box_end();
1490}
1491
1492/** Makes header box. */
1493void k_box_headers()
1494{
1495 k_box_start("Header");
1496 k_box_line("Header Files");
1497 k_box_end();
1498}
1499
1500/** Makes internal function box. */
1501void k_box_intfuncs()
1502{
1503 k_box_start("IntFunc");
1504 k_box_line("Internal Functions");
1505 k_box_end();
1506}
1507
1508/** Makes def/const box. */
1509void k_box_consts()
1510{
1511 k_box_start("Const");
1512 k_box_line("Defined Constants And Macros");
1513 k_box_end();
1514}
1515
1516/** Structure box */
1517void k_box_structs()
1518{
1519 k_box_start("Struct");
1520 k_box_line("Structures and Typedefs");
1521 k_box_end();
1522}
1523
1524/** Makes exported symbols box. */
1525void k_box_exported()
1526{
1527 k_box_start('Exported');
1528 k_box_line('Exported Symbols');
1529 k_box_end();
1530}
1531
1532
1533
1534/** oneliner comment */
1535void k_oneliner()
1536{
1537 _str sLeft, sRight;
1538 int iColumn;
1539 if ( k_commentconfig(sLeft, sRight, iColumn)
1540 && iColumn > 0)
1541 { /* column based needs some tricky repositioning. */
1542 _end_line();
1543 if (p_col > iColumn)
1544 {
1545 _begin_line();
1546 _insert_text("\n\r");
1547 up();
1548 }
1549 }
1550 k_insert_comment("", KIC_CURSOR_AT_END, ikStyleOneliner);
1551}
1552
1553/** mark line as modified. */
1554void k_mark_modified_line()
1555{
1556 /* not supported for column based sources */
1557 _str sLeft, sRight;
1558 int iColumn;
1559 if ( !k_commentconfig(sLeft, sRight, iColumn)
1560 || iColumn > 0)
1561 return;
1562 _str sStr;
1563 if (skChange != '')
1564 sStr = skChange ' (' skUserInitials ')';
1565 else
1566 sStr = skUserInitials;
1567 k_insert_comment(sStr, KIC_CURSOR_BEFORE, ikStyleModifyMarkColumn);
1568 down();
1569}
1570
1571
1572/**
1573 * Inserts a signature. Form: "//Initials ISO-date:"
1574 * @remark defeventtab
1575 */
1576void k_signature()
1577{
1578 /* kso I5-10000 2002-09-10: */
1579 _str sSig;
1580 if (skChange != '')
1581 sSig = skUserInitials ' ' skChange ' ' k_date() ': ';
1582 else
1583 sSig = skUserInitials ' ' k_date() ': ';
1584 k_insert_comment(sSig, KIC_CURSOR_AT_END);
1585}
1586
1587
1588/*******************************************************************************
1589* kLIB Logging *
1590*******************************************************************************/
1591/**
1592 * Hot-Key: Inserts a KLOGENTRY statement at start of nearest function.
1593 */
1594void klib_klogentry()
1595{
1596 typeless org_pos;
1597 _save_pos2(org_pos);
1598
1599 /*
1600 * Go to nearest function.
1601 */
1602 if (!k_func_goto_nearest_function())
1603 {
1604 /*
1605 * Get parameters.
1606 */
1607 _str sParams = k_func_getparams();
1608 if (sParams)
1609 {
1610 _str sRetType = k_func_getreturntype(true);
1611 if (!sRetType || sRetType == "")
1612 sRetType = "void"; /* paranoia! */
1613
1614 /*
1615 * Insert text.
1616 */
1617 if (!k_func_searchcode("{"))
1618 {
1619 p_col++;
1620 int cArgs = k_func_countparams(sParams);
1621 if (cArgs > 0)
1622 {
1623 _str sArgs = "";
1624 int i;
1625 for (i = 0; i < cArgs; i++)
1626 {
1627 _str sType, sName, sDefault;
1628 if (!k_func_enumparams(sParams, i, sType, sName, sDefault))
1629 sArgs = sArgs', 'sName;
1630 }
1631
1632 _insert_text("\n KLOGENTRY"cArgs"(\""sRetType"\",\""sParams"\""sArgs");"); /* todo tab size.. or smart indent */
1633 }
1634 else
1635 _insert_text("\n KLOGENTRY0(\""sRetType"\");"); /* todo tab size.. or smart indent */
1636
1637 /*
1638 * Check if the next word is KLOGENTRY.
1639 */
1640 next_word();
1641 if (def_next_word_style == 'E')
1642 prev_word();
1643 int iIgnorePos = 0;
1644 if (substr(cur_word(iIgnorePos), 1, 9) == "KLOGENTRY")
1645 delete_line();
1646
1647 }
1648 else
1649 message("didn't find {");
1650 }
1651 else
1652 message("k_func_getparams failed, sParams=" sParams);
1653 return;
1654 }
1655
1656 _restore_pos2(org_pos);
1657}
1658
1659
1660/**
1661 * Hot-Key: Inserts a KLOGEXIT statement at cursor location.
1662 */
1663void klib_klogexit()
1664{
1665 typeless org_pos;
1666 _save_pos2(org_pos);
1667
1668 /*
1669 * Go to nearest function.
1670 */
1671 if (!prev_proc())
1672 {
1673 /*
1674 * Get parameters.
1675 */
1676 _str sType = k_func_getreturntype(true);
1677 _restore_pos2(org_pos);
1678 if (sType)
1679 {
1680 boolean fReturn = true; /* true if an return statment is following the KLOGEXIT statement. */
1681
1682 /*
1683 * Insert text.
1684 */
1685 int cur_col = p_col;
1686 if (sType == 'void' || sType == 'VOID')
1687 { /* procedure */
1688 int iIgnorePos;
1689 fReturn = cur_word(iIgnorePos) == 'return';
1690 if (!fReturn)
1691 {
1692 while (p_col <= p_SyntaxIndent)
1693 keyin(" ");
1694 }
1695
1696 _insert_text("KLOGEXITVOID();\n");
1697
1698 if (fReturn)
1699 {
1700 int i;
1701 for (i = 1; i < cur_col; i++)
1702 _insert_text(" ");
1703 }
1704 search(")","E-");
1705 }
1706 else
1707 { /* function */
1708 _insert_text("KLOGEXIT();\n");
1709 int i;
1710 for (i = 1; i < cur_col; i++)
1711 _insert_text(" ");
1712 search(")","E-");
1713
1714 /*
1715 * Insert value if possible.
1716 */
1717 typeless valuepos;
1718 _save_pos2(valuepos);
1719 next_word();
1720 if (def_next_word_style == 'E')
1721 prev_word();
1722 int iIgnorePos;
1723 if (cur_word(iIgnorePos) == 'return')
1724 {
1725 p_col += length('return');
1726 typeless posStart;
1727 _save_pos2(posStart);
1728 long offStart = _QROffset();
1729 if (!k_func_searchcode(";", "E+"))
1730 {
1731 long offEnd = _QROffset();
1732 _restore_pos2(posStart);
1733 _str sValue = strip(get_text((int)(offEnd - offStart)));
1734 //say 'sValue = 'sValue;
1735 _restore_pos2(valuepos);
1736 _save_pos2(valuepos);
1737 _insert_text(sValue);
1738 }
1739 }
1740 _restore_pos2(valuepos);
1741 }
1742
1743 /*
1744 * Remove old KLOGEXIT statement on previous line if any.
1745 */
1746 typeless valuepos;
1747 _save_pos2(valuepos);
1748 int newexitline = p_line;
1749 p_line--; p_col = 1;
1750 next_word();
1751 if (def_next_word_style == 'E')
1752 prev_word();
1753 int iIgnorePos;
1754 if (p_line == newexitline - 1 && substr(cur_word(iIgnorePos), 1, 8) == 'KLOGEXIT')
1755 delete_line();
1756 _restore_pos2(valuepos);
1757
1758 /*
1759 * Check for missing '{...}'.
1760 */
1761 if (fReturn)
1762 {
1763 boolean fFound = false;
1764 _save_pos2(valuepos);
1765 p_col--; find_matching_paren(); p_col += 2;
1766 k_func_searchcode(';', 'E+'); /* places us at the ';' of the return. (hopefully) */
1767
1768 _str ch = k_func_get_next_code_text();
1769 if (ch != '}')
1770 {
1771 _restore_pos2(valuepos);
1772 _save_pos2(valuepos);
1773 p_col--; find_matching_paren(); p_col += 2;
1774 k_func_searchcode(';', 'E+'); /* places us at the ';' of the return. (hopefully) */
1775 p_col++;
1776 if (k_func_more_code_on_line())
1777 _insert_text(' }');
1778 else
1779 {
1780 typeless returnget;
1781 _save_pos2(returnget);
1782 k_func_searchcode("return", "E-");
1783 int return_col = p_col;
1784 _restore_pos2(returnget);
1785
1786 end_line();
1787 _insert_text("\n");
1788 while (p_col < return_col - p_SyntaxIndent)
1789 _insert_text(' ');
1790 _insert_text('}');
1791 }
1792
1793 _restore_pos2(valuepos);
1794 _save_pos2(valuepos);
1795 prev_word();
1796 p_col -= p_SyntaxIndent;
1797 int codecol = p_col;
1798 _insert_text("{\n");
1799 while (p_col < codecol)
1800 _insert_text(' ');
1801 }
1802
1803 _restore_pos2(valuepos);
1804 }
1805 }
1806 else
1807 message("k_func_getreturntype failed, sType=" sType);
1808 return;
1809 }
1810
1811 _restore_pos2(org_pos);
1812}
1813
1814
1815/**
1816 * Processes a file - ask user all the time.
1817 */
1818void klib_klog_file_ask()
1819{
1820 klib_klog_file_int(true);
1821}
1822
1823
1824/**
1825 * Processes a file - no questions.
1826 */
1827void klib_klog_file_no_ask()
1828{
1829 klib_klog_file_int(false);
1830}
1831
1832
1833
1834/**
1835 * Processes a file.
1836 */
1837static void klib_klog_file_int(boolean fAsk)
1838{
1839 show_all();
1840 bottom();
1841 _refresh_scroll();
1842
1843 /* ask question so we can get to the right position somehow.. */
1844 if (fAsk && _message_box("kLog process this file?", "Visual SlickEdit", MB_YESNO | MB_ICONQUESTION) != IDYES)
1845 return;
1846
1847 /*
1848 * Entries.
1849 */
1850 while (!prev_proc())
1851 {
1852 //say 'entry main loop: ' k_func_getfunction_name();
1853
1854 /*
1855 * Skip prototypes.
1856 */
1857 if (k_func_prototype())
1858 continue;
1859
1860 /*
1861 * Ask user.
1862 */
1863 center_line();
1864 _refresh_scroll();
1865 _str sFunction = k_func_getfunction_name();
1866 rc = fAsk ? _message_box("Process this function ("sFunction")?", "Visual SlickEdit", MB_YESNOCANCEL | MB_ICONQUESTION) : IDYES;
1867 if (rc == IDYES)
1868 {
1869 typeless procpos;
1870 _save_pos2(procpos);
1871 klib_klogentry();
1872 _restore_pos2(procpos);
1873 }
1874 else if (rc == IDNO)
1875 continue;
1876 else
1877 break;
1878 }
1879
1880 /*
1881 * Exits.
1882 */
1883 bottom(); _refresh_scroll();
1884 boolean fUserCancel = false;
1885 while (!prev_proc() && !fUserCancel)
1886 {
1887 typeless procpos;
1888 _save_pos2(procpos);
1889 _str sCurFunction = k_func_getfunction_name();
1890 //say 'exit main loop: ' sCurFunction
1891
1892 /*
1893 * Skip prototypes.
1894 */
1895 if (k_func_prototype())
1896 continue;
1897
1898 /*
1899 * Select procedure.
1900 */
1901 while ( !k_func_searchcode("return", "WE<+")
1902 && k_func_getfunction_name() == sCurFunction)
1903 {
1904 //say 'exit sub loop: ' p_line
1905 /*
1906 * Ask User.
1907 */
1908 center_line();
1909 _refresh_scroll();
1910 _str sFunction = k_func_getfunction_name();
1911 rc = fAsk ? _message_box("Process this exit from "sFunction"?", "Visual SlickEdit", MB_YESNOCANCEL | MB_ICONQUESTION) : IDYES;
1912 deselect();
1913 if (rc == IDYES)
1914 {
1915 typeless returnpos;
1916 _save_pos2(returnpos);
1917 klib_klogexit();
1918 _restore_pos2(returnpos);
1919 p_line++;
1920 }
1921 else if (rc != IDNO)
1922 {
1923 fUserCancel = true;
1924 break;
1925 }
1926 p_line++; /* just so we won't hit it again. */
1927 }
1928
1929 /*
1930 * If void function we'll have to check if there is and return; prior to the ending '}'.
1931 */
1932 _restore_pos2(procpos);
1933 _save_pos2(procpos);
1934 _str sType = k_func_getreturntype(true);
1935 if (!fUserCancel && sType && (sType == 'void' || sType == 'VOID'))
1936 {
1937 if ( !k_func_searchcode("{", "E+")
1938 && !find_matching_paren())
1939 {
1940 typeless funcend;
1941 _save_pos2(funcend);
1942 prev_word();
1943 int iIgnorePos;
1944 if (cur_word(iIgnorePos) != "return")
1945 {
1946 /*
1947 * Ask User.
1948 */
1949 _restore_pos2(funcend);
1950 center_line();
1951 _refresh_scroll();
1952 _str sFunction = k_func_getfunction_name();
1953 rc = fAsk ? _message_box("Process this exit from "sFunction"?", "Visual SlickEdit", MB_YESNOCANCEL | MB_ICONQUESTION) : IDYES;
1954 deselect();
1955 if (rc == IDYES)
1956 {
1957 typeless returnpos;
1958 _save_pos2(returnpos);
1959 klib_klogexit();
1960 _restore_pos2(returnpos);
1961 }
1962 }
1963 }
1964 }
1965
1966 /*
1967 * Next proc.
1968 */
1969 _restore_pos2(procpos);
1970 }
1971}
1972
1973/** @todo move to kkeys.e */
1974_command void k_rebuild_tagfile()
1975{
1976#if 1 /*__VERSION__ < 14.0*/
1977 if (file_match('-p 'maybe_quote_filename(strip_filename(_project_name,'e'):+TAG_FILE_EXT),1) != "")
1978 _project_update_files_retag(false, false, false, false);
1979 else
1980 _project_update_files_retag(true, false, false, true);
1981#else
1982 _str sArgs = "-refs=on";
1983 if (file_match('-p 'maybe_quote_filename(strip_filename(_project_name,'e'):+TAG_FILE_EXT),1) != "")
1984 sArgs = sArgs :+ " -retag";
1985 sArgs = sArgs :+ " " :+ _workspace_filename;
1986 build_workspace_tagfiles(sArgs);
1987#endif
1988}
1989
1990
1991/*******************************************************************************
1992* Styles *
1993*******************************************************************************/
1994static _str StyleLanguages[] =
1995{
1996 "c",
1997 "e",
1998 "java"
1999};
2000
2001struct StyleScheme
2002{
2003 _str name;
2004 _str settings[];
2005};
2006
2007static StyleScheme StyleSchemes[] =
2008{
2009 {
2010 "Opt2Ind4",
2011 {
2012 "orig_tabsize=4",
2013 "syntax_indent=4",
2014 "tabsize=4",
2015 "align_on_equal=1",
2016 "pad_condition_state=1",
2017 "indent_with_tabs=0",
2018 "nospace_before_paren=0",
2019 "indent_comments=1",
2020 "indent_case=1",
2021 "statement_comment_col=0",
2022 "disable_bestyle=0",
2023 "decl_comment_col=0",
2024 "bestyle_on_functions=0",
2025 "use_relative_indent=1",
2026 "nospace_before_brace=0",
2027 "indent_fl=1",
2028 "statement_comment_state=2",
2029 "indent_pp=1",
2030 "be_style=1",
2031 "parens_on_return=0",
2032 "eat_blank_lines=0",
2033 "brace_indent=0",
2034 "eat_pp_space=1",
2035 "align_on_parens=1",
2036 "continuation_indent=0",
2037 "cuddle_else=0",
2038 "nopad_condition=1",
2039 "pad_condition=0",
2040 "indent_col1_comments=0"
2041 }
2042 }
2043 ,
2044 {
2045 "Opt2Ind3",
2046 {
2047 "orig_tabsize=3",
2048 "syntax_indent=3",
2049 "tabsize=3",
2050 "align_on_equal=1",
2051 "pad_condition_state=1",
2052 "indent_with_tabs=0",
2053 "nospace_before_paren=0",
2054 "indent_comments=1",
2055 "indent_case=1",
2056 "statement_comment_col=0",
2057 "disable_bestyle=0",
2058 "decl_comment_col=0",
2059 "bestyle_on_functions=0",
2060 "use_relative_indent=1",
2061 "nospace_before_brace=0",
2062 "indent_fl=1",
2063 "statement_comment_state=2",
2064 "indent_pp=1",
2065 "be_style=1",
2066 "parens_on_return=0",
2067 "eat_blank_lines=0",
2068 "brace_indent=0",
2069 "eat_pp_space=1",
2070 "align_on_parens=1",
2071 "continuation_indent=0",
2072 "cuddle_else=0",
2073 "nopad_condition=1",
2074 "pad_condition=0",
2075 "indent_col1_comments=0"
2076 }
2077 }
2078 ,
2079 {
2080 "Opt2Ind8",
2081 {
2082 "orig_tabsize=8",
2083 "syntax_indent=8",
2084 "tabsize=8",
2085 "align_on_equal=1",
2086 "pad_condition_state=1",
2087 "indent_with_tabs=0",
2088 "nospace_before_paren=0",
2089 "indent_comments=1",
2090 "indent_case=1",
2091 "statement_comment_col=0",
2092 "disable_bestyle=0",
2093 "decl_comment_col=0",
2094 "bestyle_on_functions=0",
2095 "use_relative_indent=1",
2096 "nospace_before_brace=0",
2097 "indent_fl=1",
2098 "statement_comment_state=2",
2099 "indent_pp=1",
2100 "be_style=1",
2101 "parens_on_return=0",
2102 "eat_blank_lines=0",
2103 "brace_indent=0",
2104 "eat_pp_space=1",
2105 "align_on_parens=1",
2106 "continuation_indent=0",
2107 "cuddle_else=0",
2108 "nopad_condition=1",
2109 "pad_condition=0",
2110 "indent_col1_comments=0"
2111 }
2112 }
2113 ,
2114 {
2115 "Opt3Ind4",
2116 {
2117 "orig_tabsize=4",
2118 "syntax_indent=4",
2119 "tabsize=4",
2120 "align_on_equal=1",
2121 "pad_condition_state=1",
2122 "indent_with_tabs=0",
2123 "nospace_before_paren=0",
2124 "indent_comments=1",
2125 "indent_case=1",
2126 "statement_comment_col=0",
2127 "disable_bestyle=0",
2128 "decl_comment_col=0",
2129 "bestyle_on_functions=0",
2130 "use_relative_indent=1",
2131 "nospace_before_brace=0",
2132 "indent_fl=1",
2133 "statement_comment_state=2",
2134 "indent_pp=1",
2135 "be_style=2",
2136 "parens_on_return=0",
2137 "eat_blank_lines=0",
2138 "brace_indent=0",
2139 "eat_pp_space=1",
2140 "align_on_parens=1",
2141 "continuation_indent=0",
2142 "cuddle_else=0",
2143 "nopad_condition=1",
2144 "pad_condition=0",
2145 "indent_col1_comments=0"
2146 }
2147 }
2148 ,
2149 {
2150 "Opt3Ind3",
2151 {
2152 "orig_tabsize=3",
2153 "syntax_indent=3",
2154 "tabsize=3",
2155 "align_on_equal=1",
2156 "pad_condition_state=1",
2157 "indent_with_tabs=0",
2158 "nospace_before_paren=0",
2159 "indent_comments=1",
2160 "indent_case=1",
2161 "statement_comment_col=0",
2162 "disable_bestyle=0",
2163 "decl_comment_col=0",
2164 "bestyle_on_functions=0",
2165 "use_relative_indent=1",
2166 "nospace_before_brace=0",
2167 "indent_fl=1",
2168 "statement_comment_state=2",
2169 "indent_pp=1",
2170 "be_style=2",
2171 "parens_on_return=0",
2172 "eat_blank_lines=0",
2173 "brace_indent=0",
2174 "eat_pp_space=1",
2175 "align_on_parens=1",
2176 "continuation_indent=0",
2177 "cuddle_else=0",
2178 "nopad_condition=1",
2179 "pad_condition=0",
2180 "indent_col1_comments=0"
2181 }
2182 }
2183};
2184
2185
2186static void k_styles_create()
2187{
2188 /*
2189 * Find user format ini file.
2190 */
2191 _str userini = maybe_quote_filename(_config_path():+'uformat.ini');
2192 if (file_match('-p 'userini, 1) == '')
2193 {
2194 _str ini = maybe_quote_filename(slick_path_search('uformat.ini'));
2195 if (ini != '') userini = ini;
2196 }
2197
2198
2199 /*
2200 * Remove any old schemes.
2201 */
2202 int i,j,tv;
2203 for (i = 0; i < StyleSchemes._length(); i++)
2204 for (j = 0; j < StyleLanguages._length(); j++)
2205 {
2206 _str sectionname = StyleLanguages[j]:+'-scheme-':+StyleSchemes[i].name;
2207 if (!_ini_get_section(userini, sectionname, tv))
2208 {
2209 _ini_delete_section(userini, sectionname);
2210 _delete_temp_view(tv);
2211 //message("delete old scheme");
2212 }
2213 }
2214
2215 /*
2216 * Create the new schemes.
2217 */
2218 for (i = 0; i < StyleSchemes._length(); i++)
2219 {
2220 for (j = 0; j < StyleLanguages._length(); j++)
2221 {
2222 _str sectionname = StyleLanguages[j]:+'-scheme-':+StyleSchemes[i].name;
2223 int temp_view_id, k;
2224 _str orig_view_id = _create_temp_view(temp_view_id);
2225 activate_view(temp_view_id);
2226 for (k = 0; k < StyleSchemes[i].settings._length(); k++)
2227 insert_line(StyleSchemes[i].settings[k]);
2228
2229 /* Insert the scheme section. */
2230 _ini_replace_section(userini, sectionname, temp_view_id);
2231 //message(userini)
2232 //bogus id - activate_view(orig_view_id);
2233 }
2234 }
2235
2236 //last_scheme = last scheme name!!!
2237}
2238
2239
2240/*
2241 * Sets the last used beutify scheme.
2242 */
2243static k_styles_set(_str scheme)
2244{
2245
2246 /*
2247 * Find user format ini file.
2248 */
2249 _str userini = maybe_quote_filename(_config_path():+'uformat.ini');
2250 if (file_match('-p 'userini, 1) == '')
2251 {
2252 _str ini = maybe_quote_filename(slick_path_search('uformat.ini'));
2253 if (ini != '') userini = ini;
2254 }
2255
2256 /*
2257 * Set the scheme for each language.
2258 */
2259 int j;
2260 for (j = 0; j < StyleLanguages._length(); j++)
2261 {
2262 _ini_set_value(userini,
2263 StyleLanguages[j]:+'-scheme-Default',
2264 'last_scheme',
2265 scheme);
2266 }
2267}
2268
2269
2270static _str defoptions[] =
2271{
2272 "def-options-sas",
2273 "def-options-js",
2274 "def-options-bat",
2275 "def-options-c",
2276 "def-options-pas",
2277 "def-options-e",
2278 "def-options-java",
2279 "def-options-bourneshell",
2280 "def-options-csh",
2281 "def-options-vlx",
2282 "def-options-plsql",
2283 "def-options-sqlserver",
2284 "def-options-cmd"
2285};
2286
2287static _str defsetups[] =
2288{
2289 "def-setup-sas",
2290 "def-setup-js",
2291 "def-setup-bat",
2292 "def-setup-fundamental",
2293 "def-setup-process",
2294 "def-setup-c",
2295 "def-setup-pas",
2296 "def-setup-e",
2297 "def-setup-asm",
2298 "def-setup-java",
2299 "def-setup-html",
2300 "def-setup-bourneshell",
2301 "def-setup-csh",
2302 "def-setup-vlx",
2303 "def-setup-fileman",
2304 "def-setup-plsql",
2305 "def-setup-sqlserver",
2306 "def-setup-s",
2307 "def-setup-cmd"
2308};
2309
2310static _str defsetupstab8[] =
2311{
2312 "def-setup-c"
2313};
2314
2315
2316static void k_styles_setindent(int indent, int iBraceStyle, boolean iWithTabs = false)
2317{
2318 if (iBraceStyle < 1 || iBraceStyle > 3)
2319 {
2320 message('k_styles_setindent: iBraceStyle is bad (=' :+ iBraceStyle :+ ')');
2321 iBraceStyle = 2;
2322 }
2323
2324 /*
2325 * def-options for extentions known to have that info.
2326 */
2327 int i;
2328 for (i = 0; i < defoptions._length(); i++)
2329 {
2330 int idx = find_index(defoptions[i], MISC_TYPE);
2331 if (!idx)
2332 continue;
2333
2334 parse name_info(idx) with syntax_indent o2 o3 o4 flags indent_fl o7 indent_case rest;
2335
2336 /* Begin/end style */
2337 flags = flags & ~(1|2);
2338 flags = flags | (iBraceStyle - 1); /* Set style (0-based) */
2339 flags = flags & ~(16); /* no scape before parent.*/
2340 indent_fl = 1; /* Indent first level */
2341 indent_case = 1; /* Indent case from switch */
2342
2343 sNewOptions = indent' 'o2' 'o3' 'o4' 'flags' 'indent_fl' 'o7' 'indent_case' 'rest;
2344 set_name_info(idx, sNewOptions);
2345 _config_modify |= CFGMODIFY_DEFDATA;
2346 }
2347
2348 /*
2349 * def-setup for known extentions.
2350 */
2351 for (i = 0; i < defsetups._length(); i++)
2352 {
2353 idx = find_index(defsetups[i], MISC_TYPE);
2354 if (!idx)
2355 continue;
2356 sExt = substr(defsetups[i], length('def-setup-') + 1);
2357 sSetup = name_info(idx);
2358
2359 /*
2360 parse sSetup with 'MN=' mode_name ','\
2361 'TABS=' tabs ',' 'MA=' margins ',' 'KEYTAB=' keytab_name ','\
2362 'WW='word_wrap_style ',' 'IWT='indent_with_tabs ','\
2363 'ST='show_tabs ',' 'IN='indent_style ','\
2364 'WC='word_chars',' 'LN='lexer_name',' 'CF='color_flags','\
2365 'LNL='line_numbers_len','rest;
2366
2367 indent_with_tabs = 0; /* Indent with tabs */
2368
2369 /* Make sure all the values are legal */
2370 _ext_init_values(ext, lexer_name, color_flags);
2371 if (!isinteger(line_numbers_len)) line_numbers_len = 0;
2372 if (word_chars == '') word_chars = 'A-Za-z0-9_$';
2373 if (word_wrap_style == '') word_wrap_style = 3;
2374 if (show_tabs == '') show_tabs = 0;
2375 if (indent_style == '') indent_style = INDENT_SMART;
2376
2377 /* Set new indent */
2378 tabs = '+'indent;
2379 */
2380
2381 sNewSetup = sSetup;
2382
2383 /* Set new indent */
2384 if (pos('TABS=', sNewSetup) > 0)
2385 {
2386 /*
2387 * If either in defoptions or defsetupstab8 use default tab of 8
2388 * For those supporting separate syntax indent using the normal tabsize
2389 * helps us a lot when reading it...
2390 */
2391 fTab8 = false;
2392 for (j = 0; !fTab8 && j < defsetupstab8._length(); j++)
2393 if (substr(defsetupstab8[j], lastpos('-', defsetupstab8[j]) + 1) == sExt)
2394 fTab8 = true;
2395 for (j = 0; !fTab8 && j < defoptions._length(); j++)
2396 if (substr(defoptions[j], lastpos('-', defoptions[j]) + 1) == sExt)
2397 fTab8 = true;
2398
2399 parse sNewSetup with sPre 'TABS=' sValue ',' sPost;
2400 if (fTab8)
2401 sNewSetup = sPre 'TABS=+8,' sPost
2402 else
2403 sNewSetup = sPre 'TABS=+' indent ',' sPost
2404 }
2405
2406 /* Set indent with tabs flag. */
2407 if (pos('IWT=', sNewSetup) > 0)
2408 {
2409 parse sNewSetup with sPre 'IWT=' sValue ',' sPost;
2410 if (iWithTabs)
2411 sNewSetup = sPre 'IWT=1,' sPost
2412 else
2413 sNewSetup = sPre 'IWT=0,' sPost
2414 }
2415
2416 /* Do the real changes */
2417 set_name_info(idx, sNewSetup);
2418 _config_modify |= CFGMODIFY_DEFDATA;
2419 _update_buffers(sExt);
2420 }
2421}
2422
2423
2424/**
2425 * Takes necessary steps to convert a string to integer.
2426 */
2427static int k_style_emacs_var_integer(_str sVal)
2428{
2429 int i = (int)sVal;
2430 //say 'k_style_emacs_var_integer('sVal') -> 'i;
2431 return (int)sVal;
2432}
2433
2434
2435/**
2436 * Sets a Emacs style variable.
2437 */
2438static int k_style_emacs_var(_str sVar, _str sVal)
2439{
2440 /* check input. */
2441 if (sVar == '' || sVal == '')
2442 return -1;
2443 //say 'k_style_emacs_var: 'sVar'='sVal;
2444
2445 /*
2446 * Unpack the mode style parameters.
2447 */
2448 _str sStyle = name_info(_edit_window().p_index);
2449 _str sStyleName = p_mode_name;
2450 typeless iIndentAmount, fExpansion, iMinAbbrivation, fIndentAfterOpenParen, iBeginEndStyle, fIndent1stLevel, iMainStyle, iSwitchStyle,
2451 sRest, sRes0, sRes1;
2452 if (sStyleName == 'Slick-C')
2453 {
2454 parse sStyle with iMinAbbrivation sRes0 iBeginEndStyle fIndent1stLevel sRes1 iSwitchStyle sRest;
2455 iIndentAmount = p_SyntaxIndent;
2456 }
2457 else /* C */
2458 parse sStyle with iIndentAmount fExpansion iMinAbbrivation fIndentAfterOpenParen iBeginEndStyle fIndent1stLevel iMainStyle iSwitchStyle sRest;
2459
2460
2461 /*
2462 * Process the variable.
2463 */
2464 switch (sVar)
2465 {
2466 case 'mode':
2467 case 'Mode':
2468 {
2469 switch (sVal)
2470 {
2471 case 'c':
2472 case 'C':
2473 case 'c++':
2474 case 'C++':
2475 case 'cpp':
2476 case 'CPP':
2477 case 'cxx':
2478 case 'CXX':
2479 p_extension = 'c';
2480 p_mode_name = 'C';
2481 break;
2482
2483 case 'e':
2484 case 'slick-c':
2485 case 'Slick-c':
2486 case 'Slick-C':
2487 p_extension = 'e';
2488 p_mode_name = 'Slick-C';
2489 break;
2490
2491 default:
2492 message('emacs mode "'sVal'" is not known to us');
2493 return -3;
2494 }
2495 break;
2496 }
2497/* relevant emacs code:
2498(defconst c-style-alist
2499 '(("gnu"
2500 (c-basic-offset . 2)
2501 (c-comment-only-line-offset . (0 . 0))
2502 (c-offsets-alist . ((statement-block-intro . +)
2503 (knr-argdecl-intro . 5)
2504 (substatement-open . +)
2505 (label . 0)
2506 (statement-case-open . +)
2507 (statement-cont . +)
2508 (arglist-intro . c-lineup-arglist-intro-after-paren)
2509 (arglist-close . c-lineup-arglist)
2510 (inline-open . 0)
2511 (brace-list-open . +)
2512 ))
2513 (c-special-indent-hook . c-gnu-impose-minimum)
2514 (c-block-comment-prefix . "")
2515 )
2516 ("k&r"
2517 (c-basic-offset . 5)
2518 (c-comment-only-line-offset . 0)
2519 (c-offsets-alist . ((statement-block-intro . +)
2520 (knr-argdecl-intro . 0)
2521 (substatement-open . 0)
2522 (label . 0)
2523 (statement-cont . +)
2524 ))
2525 )
2526 ("bsd"
2527 (c-basic-offset . 8)
2528 (c-comment-only-line-offset . 0)
2529 (c-offsets-alist . ((statement-block-intro . +)
2530 (knr-argdecl-intro . +)
2531 (substatement-open . 0)
2532 (label . 0)
2533 (statement-cont . +)
2534 (inline-open . 0)
2535 (inexpr-class . 0)
2536 ))
2537 )
2538 ("stroustrup"
2539 (c-basic-offset . 4)
2540 (c-comment-only-line-offset . 0)
2541 (c-offsets-alist . ((statement-block-intro . +)
2542 (substatement-open . 0)
2543 (label . 0)
2544 (statement-cont . +)
2545 ))
2546 )
2547 ("whitesmith"
2548 (c-basic-offset . 4)
2549 (c-comment-only-line-offset . 0)
2550 (c-offsets-alist . ((knr-argdecl-intro . +)
2551 (label . 0)
2552 (statement-cont . +)
2553 (substatement-open . +)
2554 (block-open . +)
2555 (statement-block-intro . c-lineup-whitesmith-in-block)
2556 (block-close . c-lineup-whitesmith-in-block)
2557 (inline-open . +)
2558 (defun-open . +)
2559 (defun-block-intro . c-lineup-whitesmith-in-block)
2560 (defun-close . c-lineup-whitesmith-in-block)
2561 (brace-list-open . +)
2562 (brace-list-intro . c-lineup-whitesmith-in-block)
2563 (brace-entry-open . c-indent-multi-line-block)
2564 (brace-list-close . c-lineup-whitesmith-in-block)
2565 (class-open . +)
2566 (inclass . c-lineup-whitesmith-in-block)
2567 (class-close . +)
2568 (inexpr-class . 0)
2569 (extern-lang-open . +)
2570 (inextern-lang . c-lineup-whitesmith-in-block)
2571 (extern-lang-close . +)
2572 (namespace-open . +)
2573 (innamespace . c-lineup-whitesmith-in-block)
2574 (namespace-close . +)
2575 ))
2576 )
2577 ("ellemtel"
2578 (c-basic-offset . 3)
2579 (c-comment-only-line-offset . 0)
2580 (c-hanging-braces-alist . ((substatement-open before after)))
2581 (c-offsets-alist . ((topmost-intro . 0)
2582 (topmost-intro-cont . 0)
2583 (substatement . +)
2584 (substatement-open . 0)
2585 (case-label . +)
2586 (access-label . -)
2587 (inclass . ++)
2588 (inline-open . 0)
2589 ))
2590 )
2591 ("linux"
2592 (c-basic-offset . 8)
2593 (c-comment-only-line-offset . 0)
2594 (c-hanging-braces-alist . ((brace-list-open)
2595 (brace-entry-open)
2596 (substatement-open after)
2597 (block-close . c-snug-do-while)))
2598 (c-cleanup-list . (brace-else-brace))
2599 (c-offsets-alist . ((statement-block-intro . +)
2600 (knr-argdecl-intro . 0)
2601 (substatement-open . 0)
2602 (label . 0)
2603 (statement-cont . +)
2604 ))
2605 )
2606 ("python"
2607 (indent-tabs-mode . t)
2608 (fill-column . 78)
2609 (c-basic-offset . 8)
2610 (c-offsets-alist . ((substatement-open . 0)
2611 (inextern-lang . 0)
2612 (arglist-intro . +)
2613 (knr-argdecl-intro . +)
2614 ))
2615 (c-hanging-braces-alist . ((brace-list-open)
2616 (brace-list-intro)
2617 (brace-list-close)
2618 (brace-entry-open)
2619 (substatement-open after)
2620 (block-close . c-snug-do-while)
2621 ))
2622 (c-block-comment-prefix . "")
2623 )
2624 ("java"
2625 (c-basic-offset . 4)
2626 (c-comment-only-line-offset . (0 . 0))
2627 ;; the following preserves Javadoc starter lines
2628 (c-offsets-alist . ((inline-open . 0)
2629 (topmost-intro-cont . +)
2630 (statement-block-intro . +)
2631 (knr-argdecl-intro . 5)
2632 (substatement-open . +)
2633 (label . +)
2634 (statement-case-open . +)
2635 (statement-cont . +)
2636 (arglist-intro . c-lineup-arglist-intro-after-paren)
2637 (arglist-close . c-lineup-arglist)
2638 (access-label . 0)
2639 (inher-cont . c-lineup-java-inher)
2640 (func-decl-cont . c-lineup-java-throws)
2641 ))
2642 )
2643 )
2644*/
2645
2646 case 'c-file-style':
2647 case 'c-indentation-style':
2648 switch (sVal)
2649 {
2650 case 'bsd':
2651 case '"bsd"':
2652 case 'BSD':
2653 iBeginEndStyle = 1 | (iBeginEndStyle & ~3);
2654 p_indent_with_tabs = true;
2655 iIndentAmount = 8;
2656 p_SyntaxIndent = 8;
2657 p_tabs = "+8";
2658 //say 'bsd';
2659 break;
2660
2661 case 'k&r':
2662 case '"k&r"':
2663 case 'K&R':
2664 iBeginEndStyle = 0 | (iBeginEndStyle & ~3);
2665 p_indent_with_tabs = false;
2666 iIndentAmount = 4;
2667 p_SyntaxIndent = 4;
2668 p_tabs = "+4";
2669 //say 'k&r';
2670 break;
2671
2672 case 'linux-c':
2673 case '"linux-c"':
2674 iBeginEndStyle = 0 | (iBeginEndStyle & ~3);
2675 p_indent_with_tabs = true;
2676 iIndentAmount = 4;
2677 p_SyntaxIndent = 4;
2678 p_tabs = "+4";
2679 //say 'linux-c';
2680 break;
2681
2682 case 'yet-to-be-found':
2683 iBeginEndStyle = 2 | (iBeginEndStyle & ~3);
2684 p_indent_with_tabs = false;
2685 iIndentAmount = 4;
2686 p_SyntaxIndent = 4;
2687 p_tabs = "+4";
2688 //say 'todo';
2689 break;
2690
2691 default:
2692 message('emacs "'sVar'" value "'sVal'" is not known to us.');
2693 return -3;
2694 }
2695 break;
2696
2697 case 'c-label-offset':
2698 {
2699 int i = k_style_emacs_var_integer(sVal);
2700 if (i >= -16 && i <= 16)
2701 {
2702 if (i == -p_SyntaxIndent)
2703 iSwitchStyle = 0;
2704 else
2705 iSwitchStyle = 1;
2706 }
2707 break;
2708 }
2709
2710
2711 case 'indent-tabs-mode':
2712 p_indent_with_tabs = sVal == 't';
2713 break;
2714
2715 case 'c-indent-level':
2716 case 'c-basic-offset':
2717 {
2718 int i = k_style_emacs_var_integer(sVal);
2719 if (i > 0 && i <= 16)
2720 {
2721 iIndentAmount = i;
2722 p_SyntaxIndent = i;
2723 }
2724 else
2725 {
2726 message('emacs "'sVar'" value "'sVal'" is out of range.');
2727 return -4;
2728 }
2729 break;
2730 }
2731
2732 case 'tab-width':
2733 {
2734 int i = k_style_emacs_var_integer(sVal);
2735 if (i > 0 && i <= 16)
2736 p_tabs = '+'i;
2737 else
2738 {
2739 message('emacs "'sVar'" value "'sVal'" is out of range.');
2740 return -4;
2741 }
2742 break;
2743 }
2744
2745 case 'nuke-trailing-whitespace-p':
2746 {
2747#if 0
2748 _str sName = 'def-koptions-'p_buf_id;
2749 int idx = insert_name(sName, MISC_TYPE, "kstyledoc");
2750 if (!idx)
2751 idx = find_index(sName, MISC_TYPE);
2752 if (idx)
2753 {
2754 if (sVal == 't')
2755 set_name_info(idx, "saveoptions: +S");
2756 else
2757 set_name_info(idx, "saveoptions: -S");
2758 say 'sVal=' sVal;
2759 }
2760#endif
2761 break;
2762 }
2763
2764 default:
2765 message('emacs variable "'sVar'" (value "'sVal'") is unknown to us.');
2766 return -5;
2767 }
2768
2769 /*
2770 * Update the style?
2771 */
2772 _str sNewStyle = "";
2773 if (sStyleName == 'Slick-C')
2774 sNewStyle = iMinAbbrivation' 'sRes0' 'iBeginEndStyle' 'fIndent1stLevel' 'sRes1' 'iSwitchStyle' 'sRest;
2775 else
2776 sNewStyle = iIndentAmount' 'fExpansion' 'iMinAbbrivation' 'fIndentAfterOpenParen' 'iBeginEndStyle' 'fIndent1stLevel' 'iMainStyle' 'iSwitchStyle' 'sRest;
2777 if ( sNewStyle != ""
2778 && sNewStyle != sStyle
2779 && sStyleName == p_mode_name)
2780 {
2781 _str sName = name_name(_edit_window().p_index)
2782 //say ' sStyle='sStyle' p_mode_name='p_mode_name;
2783 //say 'sNewStyle='sNewStyle' sName='sName;
2784 if (pos('kstyledoc-', sName) <= 0)
2785 {
2786 sName = 'def-kstyledoc-'p_buf_id;
2787 int idx = insert_name(sName, MISC_TYPE, "kstyledoc");
2788 if (!idx)
2789 idx = find_index(sName, MISC_TYPE);
2790 if (idx)
2791 {
2792 if (!set_name_info(idx, sNewStyle))
2793 _edit_window().p_index = idx;
2794 }
2795 //say sName'='idx;
2796 }
2797 else
2798 set_name_info(_edit_window().p_index, sNewStyle);
2799 }
2800
2801 return 0;
2802}
2803
2804
2805/**
2806 * Parses a string with emacs variables.
2807 *
2808 * The variables are separated by new line. Junk at
2809 * the start and end of the line is ignored.
2810 */
2811static int k_style_emac_vars(_str sVars)
2812{
2813 /* process them line by line */
2814 int iLine = 0;
2815 while (sVars != '' && iLine++ < 20)
2816 {
2817 int iNext, iEnd;
2818 iEnd = iNext = pos("\n", sVars);
2819 if (iEnd <= 0)
2820 iEnd = iNext = length(sVars);
2821 else
2822 iEnd--;
2823 iNext++;
2824
2825 sLine = strip(substr(sVars, 1, iEnd), 'B', " \t\n\r");
2826 sVars = strip(substr(sVars, iNext), 'L', " \t\n\r");
2827 //say 'iLine='iLine' sVars='sVars'<eol>';
2828 //say 'iLine='iLine' sLine='sLine'<eol>';
2829 if (sLine != '')
2830 {
2831 rc = pos('[^a-zA-Z0-9-_]*([a-zA-Z0-9-_]+)[ \t]*:[ \t]*([^ \t]*)', sLine, 1, 'U');
2832 //say '0={'pos('S0')','pos('0')',"'substr(sLine,pos('S0'),pos('0'))'"'
2833 //say '1={'pos('S1')','pos('1')',"'substr(sLine,pos('S1'),pos('1'))'"'
2834 //say '2={'pos('S2')','pos('2')',"'substr(sLine,pos('S2'),pos('2'))'"'
2835 //say '3={'pos('S3')','pos('3')',"'substr(sLine,pos('S3'),pos('3'))'"'
2836 //say '4={'pos('S4')','pos('4')',"'substr(sLine,pos('S4'),pos('4'))'"'
2837 if (rc > 0)
2838 k_style_emacs_var(substr(sLine,pos('S1'),pos('1')),
2839 substr(sLine,pos('S2'),pos('2')));
2840 }
2841 }
2842 return 0;
2843}
2844
2845/**
2846 * Searches for Emacs style specification for the current document.
2847 */
2848void k_style_load()
2849{
2850 /* save the position before we start looking around the file. */
2851 typeless saved_pos;
2852 _save_pos2(saved_pos);
2853
2854 int rc;
2855
2856 /* Check first line. */
2857 top_of_buffer();
2858 _str sLine;
2859 get_line(sLine);
2860 strip(sLine);
2861 if (pos('-*-[ \t]+(.*:.*)[ \t]+-*-', sLine, 1, 'U'))
2862 {
2863 _str sVars;
2864 sVars = substr(sLine, pos('S1'), pos('1'));
2865 sVars = translate(sVars, "\n", ";");
2866 k_style_emac_vars(sVars);
2867 }
2868
2869 /* Look for the "Local Variables:" stuff from the end of the file. */
2870 bottom_of_buffer();
2871 rc = search('Local Variables:[ \t]*\n\om(.*)\ol\n.*End:.*\n', '-EU');
2872 if (!rc)
2873 {
2874 /* copy the variables out to a buffer. */
2875 _str sVars;
2876 sVars = get_text(match_length("1"), match_length("S1"));
2877 k_style_emac_vars(sVars);
2878 }
2879
2880 _restore_pos2(saved_pos);
2881}
2882
2883
2884/**
2885 * Callback function for the event of a new buffer.
2886 *
2887 * This is used to make sure there are no left over per buffer options
2888 * hanging around.
2889 */
2890void _buffer_add_kdev(int buf_id)
2891{
2892 _str sName = 'def-koptions-'buf_id;
2893 int idx = find_index(sName, MISC_TYPE);
2894 if (idx)
2895 delete_name(idx);
2896 //message("_buffer_add_kdev: " idx " name=" sName);
2897
2898 sName = 'def-kstyledoc-'buf_id;
2899 idx = find_index(sName, MISC_TYPE);
2900 if (idx)
2901 delete_name(idx);
2902
2903 //k_style_load();
2904}
2905
2906
2907/**
2908 * Callback function for the event of quitting a buffer.
2909 *
2910 * This is used to make sure there are no left over per buffer options
2911 * hanging around.
2912 */
2913void _cbquit2_kdev(int buf_id)
2914{
2915 _str sName = 'def-koptions-'buf_id;
2916 int idx = find_index(sName, MISC_TYPE);
2917 if (idx)
2918 delete_name(idx);
2919 //message("_cbquit2_kdev: " idx " " sName);
2920
2921 sName = 'def-kstyledoc-'buf_id;
2922 idx = find_index(sName, MISC_TYPE);
2923 if (idx)
2924 delete_name(idx);
2925}
2926
2927
2928/**
2929 * Called to get save options for the current buffer.
2930 *
2931 * This requires a modified loadsave.e!
2932 */
2933_str _buffer_save_kdev(int buf_id)
2934{
2935 _str sRet = ""
2936 _str sName = 'def-koptions-'buf_id;
2937 int idx = find_index(sName, MISC_TYPE);
2938 if (idx)
2939 {
2940 _str sOptions = strip(name_info(idx));
2941 if (sOptions != "")
2942 parse sOptions with . "saveoptions:" sRet .
2943 message("_buffer_save_kdev: " idx " " sName " " sOptions);
2944 }
2945 return sRet;
2946}
2947
2948
2949/**
2950 * Command similar to the add() command in math.e, only this
2951 * produces hex and doesn't do the multi line stuff.
2952 */
2953_command int k_calc()
2954{
2955 _str sLine;
2956 filter_init();
2957 typeless rc = filter_get_string(sLine);
2958 if (rc == 0)
2959 {
2960 _str sResultHex;
2961 rc = eval_exp(sResultHex, sLine, 16);
2962 if (rc == 0)
2963 {
2964 _str sResultDec;
2965 rc = eval_exp(sResultDec, sLine, 10);
2966 if (rc == 0)
2967 {
2968 _end_select();
2969 _insert_text(' = ' :+ sResultHex :+ ' (' :+ sResultDec :+ ')');
2970 return 0;
2971 }
2972 }
2973 }
2974
2975 if (isinteger(rc))
2976 message(get_message(rc));
2977 else
2978 message(rc);
2979 return 1;
2980}
2981
2982
2983
2984/*******************************************************************************
2985* Menu and Menu commands *
2986*******************************************************************************/
2987static int iTimer = 0;
2988static int mhkDev = 0;
2989static int mhCode = 0;
2990static int mhDoc = 0;
2991static int mhLic = 0;
2992static int mhPre = 0;
2993
2994/*
2995 * Creates the kDev menu.
2996 */
2997static k_menu_create()
2998{
2999 if (arg(1) == 'timer')
3000 _kill_timer(iTimer);
3001 menu_handle = _mdi.p_menu_handle;
3002 menu_index = find_index(_cur_mdi_menu,oi2type(OI_MENU));
3003
3004 /*
3005 * Remove any old menu.
3006 */
3007 mhDelete = iPos = 0;
3008 index = _menu_find(menu_handle, "kDev", mhDelete, iPos, 'C');
3009 //message("index="index " mhDelete="mhDelete " iPos="iPos);
3010 if (index == 0)
3011 _menu_delete(mhDelete, iPos);
3012
3013
3014 /*
3015 * Insert the "kDev" menu.
3016 */
3017 mhkDev = _menu_insert(menu_handle, 9, MF_SUBMENU, "&kDev", "", "kDev");
3018 mhCode=_menu_insert(mhkDev, -1, MF_ENABLED | MF_SUBMENU, "Coding &Style", "", "coding");
3019 rc = _menu_insert(mhCode, -1, MF_ENABLED | MF_UNCHECKED, "Braces 2, Syntax Indent 4 (knut)", "k_menu_style Opt2Ind4", "Opt2Ind4");
3020 rc = _menu_insert(mhCode, -1, MF_ENABLED | MF_UNCHECKED, "Braces 2, Syntax Indent 3", "k_menu_style Opt2Ind3", "Opt2Ind3");
3021 rc = _menu_insert(mhCode, -1, MF_ENABLED | MF_UNCHECKED, "Braces 2, Syntax Indent 8", "k_menu_style Opt2Ind8", "Opt2Ind8");
3022 rc = _menu_insert(mhCode, -1, MF_ENABLED | MF_UNCHECKED, "Braces 3, Syntax Indent 4 (giws)", "k_menu_style Opt3Ind4", "Opt3Ind4");
3023 rc = _menu_insert(mhCode, -1, MF_ENABLED | MF_UNCHECKED, "Braces 3, Syntax Indent 3 (giws)", "k_menu_style Opt3Ind3", "Opt3Ind3");
3024
3025 mhDoc= _menu_insert(mhkDev, -1, MF_ENABLED | MF_SUBMENU, "&Documentation", "", "doc");
3026 mhDSJ= _menu_insert(mhDoc, -1, MF_ENABLED | MF_UNCHECKED, "&Javadoc Style", "k_menu_doc_style javadoc", "javadoc");
3027 mhDSL= _menu_insert(mhDoc, -1, MF_GRAYED | MF_UNCHECKED, "&Linux Kernel Style", "k_menu_doc_style linux", "linux");
3028
3029 mhLic= _menu_insert(mhkDev, -1, MF_ENABLED | MF_SUBMENU, "&License", "", "License");
3030 rc = _menu_insert(mhLic, -1, MF_ENABLED | MF_UNCHECKED, "&Odin32", "k_menu_license Odin32", "Odin32");
3031 rc = _menu_insert(mhLic, -1, MF_ENABLED | MF_UNCHECKED, "&GPL", "k_menu_license GPL", "GPL");
3032 rc = _menu_insert(mhLic, -1, MF_ENABLED | MF_UNCHECKED, "&LGPL", "k_menu_license LGPL", "LGPL");
3033 rc = _menu_insert(mhLic, -1, MF_ENABLED | MF_UNCHECKED, "&GPLv3", "k_menu_license GPLv3", "GPLv3");
3034 rc = _menu_insert(mhLic, -1, MF_ENABLED | MF_UNCHECKED, "&LGPLv3", "k_menu_license LGPLv3", "LGPLv3");
3035 rc = _menu_insert(mhLic, -1, MF_ENABLED | MF_UNCHECKED, "&VirtualBox", "k_menu_license VirtualBox", "VirtualBox");
3036 rc = _menu_insert(mhLic, -1, MF_ENABLED | MF_UNCHECKED, "&VirtualBox GPL And CDDL","k_menu_license VirtualBoxGPLAndCDDL", "VirtualBoxGPLAndCDDL");
3037 rc = _menu_insert(mhLic, -1, MF_ENABLED | MF_UNCHECKED, "&Confidential", "k_menu_license Confidential", "Confidential");
3038 rc = _menu_insert(mhLic, -1, MF_ENABLED | MF_UNCHECKED, "&Confidential No Author", "k_menu_license ConfidentialNoAuthor", "ConfidentialNoAuthor");
3039
3040 rc = _menu_insert(mhkDev, -1, MF_ENABLED, "-", "", "dash vars");
3041 rc = _menu_insert(mhkDev, -1, MF_ENABLED, skChange == '' ? '&Change...' : '&Change (' skChange ')...', "k_menu_change", "");
3042 rc = _menu_insert(mhkDev, -1, MF_ENABLED, skProgram == '' ? '&Program...' : '&Program (' skProgram ')...', "k_menu_program", "");
3043 rc = _menu_insert(mhkDev, -1, MF_ENABLED, skCompany == '' ? 'Co&mpany...' : 'Co&mpany (' skCompany ')...', "k_menu_company", "");
3044 rc = _menu_insert(mhkDev, -1, MF_ENABLED, '&User Name (' skUserName ')...', "k_menu_user_name", "username");
3045 rc = _menu_insert(mhkDev, -1, MF_ENABLED, 'User &e-mail (' skUserEmail ')...', "k_menu_user_email", "useremail");
3046 rc = _menu_insert(mhkDev, -1, MF_ENABLED, 'User &Initials (' skUserInitials ')...', "k_menu_user_initials", "userinitials");
3047 rc = _menu_insert(mhkDev, -1, MF_ENABLED, "-", "", "dash preset");
3048 mhPre= _menu_insert(mhkDev, -1, MF_SUBMENU, "P&resets", "", "");
3049 rc = _menu_insert(mhPre, -1, MF_ENABLED, "The Bird", "k_menu_preset javadoc, GPL, Opt2Ind4", "bird");
3050 rc = _menu_insert(mhPre, -1, MF_ENABLED, "kLIBC", "k_menu_preset javadoc, GPL, Opt2Ind4,, kLIBC", "kLIBC");
3051 rc = _menu_insert(mhPre, -1, MF_ENABLED, "kBuild", "k_menu_preset javadoc, GPLv3, Opt2Ind4,, kBuild", "kBuild");
3052 rc = _menu_insert(mhPre, -1, MF_ENABLED, "kStuff", "k_menu_preset javadoc, GPL, Opt2Ind4,, kStuff", "kStuff");
3053 rc = _menu_insert(mhPre, -1, MF_ENABLED, "sun", "k_menu_preset javadoc, ConfidentialNoAuthor, Opt2Ind4, sun", "sun");
3054 rc = _menu_insert(mhPre, -1, MF_ENABLED, "VirtualBox", "k_menu_preset javadoc, VirtualBox, Opt2Ind4, sun", "VirtualBox");
3055
3056 k_menu_doc_style();
3057 k_menu_license();
3058 k_menu_style();
3059}
3060
3061
3062/**
3063 * Change change Id.
3064 */
3065_command k_menu_change()
3066{
3067 sRc = show("-modal k_form_simple_input", "Change ID", skChange);
3068 if (sRc != "\r")
3069 {
3070 skChange = sRc;
3071 k_menu_create();
3072 }
3073}
3074
3075
3076/**
3077 * Change program name.
3078 */
3079_command k_menu_program()
3080{
3081 sRc = show("-modal k_form_simple_input", "Program", skProgram);
3082 if (sRc != "\r")
3083 {
3084 skProgram = sRc;
3085 k_menu_create();
3086 }
3087}
3088
3089
3090/**
3091 * Change company.
3092 */
3093_command k_menu_company()
3094{
3095 if (skCompany == '')
3096 sRc = show("-modal k_form_simple_input", "Company", 'innotek GmbH');
3097 else
3098 sRc = show("-modal k_form_simple_input", "Company", skCompany);
3099 if (sRc != "\r")
3100 {
3101 skCompany = sRc;
3102 k_menu_create();
3103 }
3104}
3105
3106
3107/**
3108 * Change user name.
3109 */
3110_command k_menu_user_name()
3111{
3112 sRc = show("-modal k_form_simple_input", "User Name", skUserName);
3113 if (sRc != "\r" && sRc != '')
3114 {
3115 skUserName = sRc;
3116 k_menu_create();
3117 }
3118}
3119
3120
3121/**
3122 * Change user email.
3123 */
3124_command k_menu_user_email()
3125{
3126 sRc = show("-modal k_form_simple_input", "User e-mail", skUserEmail);
3127 if (sRc != "\r" && sRc != '')
3128 {
3129 skUserEmail = sRc;
3130 k_menu_create();
3131 }
3132}
3133
3134
3135/**
3136 * Change user initials.
3137 */
3138_command k_menu_user_initials()
3139{
3140 sRc = show("-modal k_form_simple_input", "User e-mail", skUserInitials);
3141 if (sRc != "\r" && sRc != '')
3142 {
3143 skUserInitials = sRc;
3144 k_menu_create();
3145 }
3146}
3147
3148
3149
3150/**
3151 * Checks the correct menu item.
3152 */
3153_command void k_menu_doc_style(_str sNewDocStyle = '')
3154{
3155 //say 'sNewDocStyle='sNewDocStyle;
3156 if (sNewDocStyle != '')
3157 skDocStyle = sNewDocStyle
3158 _menu_set_state(mhDoc, "javadoc", MF_UNCHECKED);
3159 _menu_set_state(mhDoc, "linux", MF_UNCHECKED | MF_GRAYED);
3160
3161 _menu_set_state(mhDoc, skDocStyle, MF_CHECKED);
3162}
3163
3164
3165/**
3166 * Checks the correct menu item.
3167 */
3168_command void k_menu_license(_str sNewLicense = '')
3169{
3170 //say 'sNewLicense='sNewLicense;
3171 if (sNewLicense != '')
3172 skLicense = sNewLicense
3173 _menu_set_state(mhLic, "Odin32", MF_UNCHECKED);
3174 _menu_set_state(mhLic, "GPL", MF_UNCHECKED);
3175 _menu_set_state(mhLic, "LGPL", MF_UNCHECKED);
3176 _menu_set_state(mhLic, "GPLv3", MF_UNCHECKED);
3177 _menu_set_state(mhLic, "LGPLv3", MF_UNCHECKED);
3178 _menu_set_state(mhLic, "VirtualBox", MF_UNCHECKED);
3179 _menu_set_state(mhLic, "VirtualBoxGPLAndCDDL", MF_UNCHECKED);
3180 _menu_set_state(mhLic, "Confidential", MF_UNCHECKED);
3181 _menu_set_state(mhLic, "ConfidentialNoAuthor", MF_UNCHECKED);
3182
3183 _menu_set_state(mhLic, skLicense, MF_CHECKED);
3184}
3185
3186
3187/**
3188 * Check the correct style menu item.
3189 */
3190_command void k_menu_style(_str sNewStyle = '')
3191{
3192 //say 'sNewStyle='sNewStyle;
3193 _menu_set_state(mhCode, "Opt1Ind4", MF_UNCHECKED);
3194 _menu_set_state(mhCode, "Opt1Ind3", MF_UNCHECKED);
3195 _menu_set_state(mhCode, "Opt1Ind8", MF_UNCHECKED);
3196 _menu_set_state(mhCode, "Opt2Ind4", MF_UNCHECKED);
3197 _menu_set_state(mhCode, "Opt2Ind3", MF_UNCHECKED);
3198 _menu_set_state(mhCode, "Opt2Ind8", MF_UNCHECKED);
3199 _menu_set_state(mhCode, "Opt3Ind4", MF_UNCHECKED);
3200 _menu_set_state(mhCode, "Opt3Ind3", MF_UNCHECKED);
3201 _menu_set_state(mhCode, "Opt3Ind8", MF_UNCHECKED);
3202
3203 if (sNewStyle != '')
3204 {
3205 int iIndent = (int)substr(sNewStyle, 8, 1);
3206 int iBraceStyle = (int)substr(sNewStyle, 4, 1);
3207 skCodeStyle = sNewStyle;
3208 k_styles_setindent(iIndent, iBraceStyle);
3209 k_styles_set(sNewStyle);
3210 }
3211
3212 _menu_set_state(mhCode, skCodeStyle, MF_CHECKED);
3213}
3214
3215
3216/**
3217 * Load a 'preset'.
3218 */
3219_command void k_menu_preset(_str sArgs = '')
3220{
3221 parse sArgs with sNewDocStyle ',' sNewLicense ',' sNewStyle ',' sNewCompany ',' sNewProgram ',' sNewChange
3222 sNewDocStyle= strip(sNewDocStyle);
3223 sNewLicense = strip(sNewLicense);
3224 sNewStyle = strip(sNewStyle);
3225 sNewCompany = strip(sNewCompany);
3226 if (sNewCompany == 'sun')
3227 sNewCompany = 'Sun Microsystems, Inc.'
3228 sNewProgram = strip(sNewProgram);
3229 sNewChange = strip(sNewChange);
3230
3231 //say 'k_menu_preset('sNewDocStyle',' sNewLicense',' sNewStyle',' sNewCompany',' sNewProgram')';
3232 k_menu_doc_style(sNewDocStyle);
3233 k_menu_license(sNewLicense);
3234 k_menu_style(sNewStyle);
3235 skCompany = sNewCompany;
3236 skProgram = sNewProgram;
3237 skChange = sNewChange;
3238 k_menu_create();
3239}
3240
3241
3242
3243/* future ones..
3244_command k_menu_setcolor()
3245{
3246 createMyColorSchemeAndUseIt();
3247}
3248
3249
3250_command k_menu_setkeys()
3251{
3252 rc = load("d:/knut/VSlickMacros/BoxerDef.e");
3253}
3254
3255_command k_menu_settings()
3256{
3257 mySettings();
3258}
3259*/
3260
3261
3262/*******************************************************************************
3263* Dialogs *
3264*******************************************************************************/
3265_form k_form_simple_input {
3266 p_backcolor=0x80000005
3267 p_border_style=BDS_DIALOG_BOX
3268 p_caption='Simple Input'
3269 p_clip_controls=FALSE
3270 p_forecolor=0x80000008
3271 p_height=1120
3272 p_width=5020
3273 p_x=6660
3274 p_y=6680
3275 _text_box entText {
3276 p_auto_size=TRUE
3277 p_backcolor=0x80000005
3278 p_border_style=BDS_FIXED_SINGLE
3279 p_completion=NONE_ARG
3280 p_font_bold=FALSE
3281 p_font_italic=FALSE
3282 p_font_name='MS Sans Serif'
3283 p_font_size=8
3284 p_font_underline=FALSE
3285 p_forecolor=0x80000008
3286 p_height=270
3287 p_tab_index=1
3288 p_tab_stop=TRUE
3289 p_text='text'
3290 p_width=3180
3291 p_x=1680
3292 p_y=240
3293 p_eventtab2=_ul2_textbox
3294 }
3295 _label lblLabel {
3296 p_alignment=AL_VCENTERRIGHT
3297 p_auto_size=FALSE
3298 p_backcolor=0x80000005
3299 p_border_style=BDS_NONE
3300 p_caption='Label'
3301 p_font_bold=FALSE
3302 p_font_italic=FALSE
3303 p_font_name='MS Sans Serif'
3304 p_font_size=8
3305 p_font_underline=FALSE
3306 p_forecolor=0x80000008
3307 p_height=240
3308 p_tab_index=2
3309 p_width=1380
3310 p_word_wrap=FALSE
3311 p_x=180
3312 p_y=240
3313 }
3314 _command_button btnOK {
3315 p_cancel=FALSE
3316 p_caption='&OK'
3317 p_default=TRUE
3318 p_font_bold=FALSE
3319 p_font_italic=FALSE
3320 p_font_name='MS Sans Serif'
3321 p_font_size=8
3322 p_font_underline=FALSE
3323 p_height=360
3324 p_tab_index=3
3325 p_tab_stop=TRUE
3326 p_width=1020
3327 p_x=180
3328 p_y=660
3329 }
3330 _command_button btnCancel {
3331 p_cancel=TRUE
3332 p_caption='Cancel'
3333 p_default=FALSE
3334 p_font_bold=FALSE
3335 p_font_italic=FALSE
3336 p_font_name='MS Sans Serif'
3337 p_font_size=8
3338 p_font_underline=FALSE
3339 p_height=360
3340 p_tab_index=4
3341 p_tab_stop=TRUE
3342 p_width=840
3343 p_x=1380
3344 p_y=660
3345 }
3346}
3347
3348defeventtab k_form_simple_input
3349btnOK.on_create(_str sLabel = '', _str sText = '')
3350{
3351 p_active_form.p_caption = sLabel;
3352 lblLabel.p_caption = sLabel;
3353 entText.p_text = sText;
3354}
3355
3356btnOK.lbutton_up()
3357{
3358 sText = entText.p_text;
3359 p_active_form._delete_window(sText);
3360}
3361btnCancel.lbutton_up()
3362{
3363 sText = entText.p_text;
3364 p_active_form._delete_window("\r");
3365}
3366
3367static _str aCLikeIncs[] =
3368{
3369 "c", "ansic", "java", "rul", "vera", "cs", "js", "as", "idl", "asm", "s", "imakefile", "rc", "lex", "yacc", "antlr"
3370};
3371
3372static _str aMyLangIds[] =
3373{
3374 "applescript",
3375 "ansic",
3376 "antlr",
3377 "as",
3378 "asm",
3379 "c",
3380 "cs",
3381 "csh",
3382 "css",
3383 "conf",
3384 "d",
3385 "docbook",
3386 "dtd",
3387 "e",
3388 "html",
3389 "idl",
3390 "imakefile",
3391 "ini",
3392 "java",
3393 "js",
3394 "lex",
3395 "mak",
3396 "masm",
3397 "pas",
3398 "phpscript",
3399 "powershell",
3400 "py",
3401 "rexx",
3402 "rc",
3403 "rul",
3404 "tcl",
3405 "s",
3406 "unixasm",
3407 "vbs",
3408 "xhtml",
3409 "xml",
3410 "xmldoc",
3411 "xsd",
3412 "yacc"
3413};
3414
3415#if __VERSION__ >= 17.0
3416# require "se/lang/api/LanguageSettings.e"
3417using se.lang.api.LanguageSettings;
3418#endif
3419
3420#if __VERSION__ >= 16.0
3421int def_auto_unsurround_block;
3422#endif
3423
3424/**
3425 * Loads the standard bird settings.
3426 */
3427_command void kdev_load_settings()
3428{
3429 typeless nt1;
3430 typeless nt2;
3431 typeless nt3;
3432 typeless nt4;
3433 typeless nt5;
3434 typeless nt6;
3435 typeless i7;
3436 _str sRest;
3437 _str sTmp;
3438
3439 /*
3440 * Generl stuff.
3441 */
3442 _default_option('A', '0'); /* ALT menu */
3443 def_alt_menu = 0;
3444 _default_option('R', '130'); /* Vertical line in column 130. */
3445 def_mfsearch_init_flags = 2 | 4; /* MFSEARCH_INIT_CURWORD | MFSEARCH_INIT_SELECTION */
3446 def_line_insert = 'B'; /* insert before */
3447 def_file_types='All Files (*),' /** @todo make this prettier */
3448 'C/C++ Files (*.c;*.cc;*.cpp;*.cp;*.cxx;*.c++;*.h;*.hh;*.hpp;*.hxx;*.inl;*.xpm),'
3449 'Assembler (*.s;*.asm;*.mac;*.S),'
3450 'Makefiles (*;*.mak;*.kmk)'
3451 'C# Files (*.cs),'
3452 'Ch Files (*.ch;*.chf;*.chs;*.cpp;*.h),'
3453 'D Files (*.d),'
3454 'Java Files (*.java),'
3455 'HTML Files (*.htm;*.html;*.shtml;*.asp;*.jsp;*.php;*.php3;*.rhtml;*.css),'
3456 'CFML Files (*.cfm;*.cfml;*.cfc),'
3457 'XML Files (*.xml;*.dtd;*.xsd;*.xmldoc;*.xsl;*.xslt;*.ent;*.tld;*.xhtml;*.build;*.plist),'
3458 'XML/SGML DTD Files (*.xsd;*.dtd),'
3459 'XML/JSP TagLib Files (*.tld;*.xml),'
3460 'Objective-C (*.m;*.mm;*.h),'
3461 'IDL Files (*.idl),'
3462 'Ada Files (*.ada;*.adb;*.ads),'
3463 'Applescript Files (*.applescript),'
3464 'Basic Files (*.vb;*.vbs;*.bas;*.frm),'
3465 'Cobol Files (*.cob;*.cbl;*.ocb),'
3466 'JCL Files (*.jcl),'
3467 'JavaScript (*.js;*.ds),'
3468 'ActionScript (*.as),'
3469 'Pascal Files (*.pas;*.dpr),'
3470 'Fortran Files (*.for;*.f),'
3471 'PL/I Files (*.pl1),'
3472 'InstallScript (*.rul),'
3473 'Perl Files (*.pl;*.pm;*.perl;*.plx),'
3474 'Python Files (*.py),'
3475 'Ruby Files (*.rb;*.rby),'
3476 'Java Properties (*.properties),'
3477 'Lua Files (*.lua),'
3478 'Tcl Files (*.tcl;*.tlib;*.itk;*.itcl;*.exp),'
3479 'PV-WAVE (*.pro),'
3480 'Slick-C (*.e;*.sh),'
3481 'SQL Files (*.sql;*.pgsql),'
3482 'SAS Files (*.sas),'
3483 'Text Files (*.txt),'
3484 'Verilog Files (*.v),'
3485 'VHDL Files (*.vhd),'
3486 'SystemVerilog Files (*.sv;*.svh;*.svi),'
3487 'Vera Files (*.vr;*.vrh),'
3488 'Erlang Files (*.erl;*.hrl),'
3489 ;
3490
3491 def_updown_col=0; /* cursor movement */
3492 def_cursorwrap=0; /* ditto. */
3493 def_click_past_end=1; /* ditto */
3494 def_start_on_first=1; /* vs A B C; view A. */
3495 def_vc_system='Subversion' /* svn is default version control */
3496#if __VERSION__ >= 16.0
3497 def_auto_unsurround_block=0; /* Delete line, not block. */
3498#endif
3499 _config_modify_flags(CFGMODIFY_DEFDATA);
3500
3501 /* Make it grok: # include <stuff.h> */
3502 for (i = 0; i < aCLikeIncs._length(); i++)
3503 replace_def_data("def-":+aCLikeIncs[i]:+"-include",
3504 '^[ \t]*(\#[ \t]*include|include|\#[ \t]*line)[ \t]#({#1:i}[ \t]#|)(<{#0[~>]#}>|"{#0[~"]#}")');
3505 replace_def_data("def-m-include", '^[ \t]*(\#[ \t]*include|\#[ \t]*import|include|\#[ \t]*line)[ \t]#({#1:i}[ \t]#|)(<{#0[~>]#}>|"{#0[~"]#}")');
3506 replace_def_data("def-e-include", '^[ \t]*(\#[ \t]*include|\#[ \t]*import|\#[ \t]*require|include)[ \t]#(''{#0[~'']#}''|"{#0[~"]#}")');
3507
3508 /* Replace the default unicode proportional font with the fixed oned. */
3509 _str sCodeFont = _default_font(CFG_SBCS_DBCS_SOURCE_WINDOW);
3510 _str sUnicodeFont = _default_font(CFG_UNICODE_SOURCE_WINDOW);
3511 if (pos("Default Unicode", sUnicodeFont) > 0 && length(sCodeFont) > 5)
3512 _default_font(CFG_UNICODE_SOURCE_WINDOW,sCodeFont);
3513 if (machine()=='INTELSOLARIS' || machine()=='SPARCSOLARIS')
3514 {
3515 _default_font(CFG_MENU,'DejaVu Sans,10,0,0,');
3516 _default_font(CFG_DIALOG,'DejaVu Sans,10,0,,');
3517 _ConfigEnvVar('VSLICKDIALOGFONT','DejaVu Sans,10,0,,');
3518 }
3519
3520 /* Not so important. */
3521 int fSearch = 0x400400; /* VSSEARCHFLAG_WRAP | VSSEARCHFLAG_PROMPT_WRAP */;
3522 _default_option('S', (_str)fSearch);
3523
3524
3525#if __VERSION__ >= 17.0
3526 /*
3527 * Language settings via API.
3528 */
3529 int fNewAff = AFF_BEGIN_END_STYLE \
3530 | AFF_INDENT_WITH_TABS \
3531 | AFF_SYNTAX_INDENT \
3532 /*| AFF_TABS*/ \
3533 | AFF_NO_SPACE_BEFORE_PAREN \
3534 | AFF_PAD_PARENS \
3535 | AFF_INDENT_CASE \
3536 | AFF_KEYWORD_CASING \
3537 | AFF_TAG_CASING \
3538 | AFF_ATTRIBUTE_CASING \
3539 | AFF_VALUE_CASING \
3540 /*| AFF_HEX_VALUE_CASING*/;
3541 def_adaptive_formatting_flags = ~fNewAff;
3542 replace_def_data("def-adaptive-formatting-flags", def_adaptive_formatting_flags);
3543 _str sLangId;
3544 foreach (sLangId in aMyLangIds)
3545 {
3546 LanguageSettings.setIndentCaseFromSwitch(sLangId, true);
3547 LanguageSettings.setBeginEndStyle(sLangId, BES_BEGIN_END_STYLE_2);
3548 LanguageSettings.setIndentWithTabs(sLangId, false);
3549 LanguageSettings.setUseAdaptiveFormatting(sLangId, true);
3550 LanguageSettings.setAdaptiveFormattingFlags(sLangId, ~fNewAff);
3551 LanguageSettings.setSaveStripTrailingSpaces(sLangId, STSO_STRIP_MODIFIED);
3552 LanguageSettings.setTabs(sLangId, "8+");
3553 LanguageSettings.setSyntaxIndent(sLangId, 4);
3554
3555 /* C/C++ setup, wrap at column 80 not 64. */
3556 sTmp = LanguageSettings.getCommentWrapOptions(sLangId);
3557 if (length(sTmp) > 10)
3558 {
3559 typeless ntBlockCommentWrap, ntDocCommentWrap, ntFixedWidth;
3560 parse sTmp with ntBlockCommentWrap ntDocCommentWrap nt3 nt4 nt5 ntFixedWidth sRest;
3561 if ((int)ntFixedWidth < 80)
3562 LanguageSettings.setCommentWrapOptions('c', ntBlockCommentWrap:+' ':+ntDocCommentWrap:+' ':+nt3:+' ':+nt4:+' ':+nt5:+' 80 ':+sRest);
3563 //replace_def_data("def-comment-wrap-c",'0 1 0 1 1 64 0 0 80 0 80 0 80 0 0 1 '); - default
3564 //replace_def_data("def-comment-wrap-c",'0 1 0 1 1 80 0 0 80 0 80 0 80 0 0 0 '); - disabled
3565 //replace_def_data("def-comment-wrap-c",'1 1 0 1 1 80 0 0 80 0 80 0 80 0 0 1 '); - enable block comment wrap.
3566 }
3567
3568 /* set the encoding to UTF-8 without any friggin useless signatures. */
3569 idxExt = name_match('def-lang-for-ext-', 1, MISC_TYPE);
3570 while (idxExt > 0)
3571 {
3572 if (name_info(idxExt) == sLangId)
3573 {
3574 parse name_name(idxExt) with 'def-lang-for-ext-' auto sExt;
3575 sVarName = 'def-encoding-' :+ sExt;
3576 idxExtEncoding = find_index(sVarName, MISC_TYPE);
3577 if (idxExtEncoding != 0)
3578 delete_name(idxExtEncoding);
3579 }
3580 idxExt = name_match('def-lang-for-ext-', 0, MISC_TYPE);
3581 }
3582 replace_def_data('def-encoding-' :+ sLangId, '+futf8 ');
3583 }
3584 LanguageSettings.setIndentWithTabs('mak', true);
3585 LanguageSettings.setLexerName('mak', 'kmk');
3586 LanguageSettings.setSyntaxIndent('mak', 8);
3587
3588 LanguageSettings.setBeautifierProfileName('c', "bird's Style");
3589 LanguageSettings.setBeautifierProfileName('m', "bird's Objective-C Style");
3590
3591 /* Fix .asm and add .mac, .kmk, .cmd, and .pgsql. */
3592 replace_def_data("def-lang-for-ext-asm", 'masm');
3593 replace_def_data("def-lang-for-ext-mac", 'masm');
3594 replace_def_data("def-lang-for-ext-kmk", 'mak');
3595 replace_def_data("def-lang-for-ext-cmd", 'bat');
3596 replace_def_data("def-lang-for-ext-pgsql", 'plsql');
3597
3598 /*
3599 * Change the codehelp default.
3600 */
3601 int fOldCodeHelp = def_codehelp_flags;
3602 int fNewCodeHelp = fOldCodeHelp \
3603 | VSCODEHELPFLAG_AUTO_FUNCTION_HELP \
3604 | VSCODEHELPFLAG_AUTO_LIST_MEMBERS \
3605 | VSCODEHELPFLAG_SPACE_INSERTS_SPACE \
3606 | VSCODEHELPFLAG_INSERT_OPEN_PAREN \
3607 | VSCODEHELPFLAG_DISPLAY_MEMBER_COMMENTS \
3608 | VSCODEHELPFLAG_DISPLAY_FUNCTION_COMMENTS \
3609 | VSCODEHELPFLAG_REPLACE_IDENTIFIER \
3610 | VSCODEHELPFLAG_PRESERVE_IDENTIFIER \
3611 | VSCODEHELPFLAG_AUTO_PARAMETER_COMPLETION \
3612 | VSCODEHELPFLAG_AUTO_LIST_PARAMS \
3613 | VSCODEHELPFLAG_PARAMETER_TYPE_MATCHING \
3614 | VSCODEHELPFLAG_NO_SPACE_AFTER_PAREN \
3615 | VSCODEHELPFLAG_RESERVED_ON \
3616 | VSCODEHELPFLAG_MOUSE_OVER_INFO \
3617 | VSCODEHELPFLAG_AUTO_LIST_VALUES \
3618 | VSCODEHELPFLAG_FIND_TAG_PREFERS_DEFINITION \
3619 | VSCODEHELPFLAG_FIND_TAG_PREFERS_ALTERNATE \
3620 | VSCODEHELPFLAG_HIGHLIGHT_TAGS \
3621 ;
3622 fNewCodeHelp &= ~( VSCODEHELPFLAG_SPACE_COMPLETION \
3623 | VSCODEHELPFLAG_AUTO_SYNTAX_HELP \
3624 | VSCODEHELPFLAG_NO_SPACE_AFTER_COMMA \
3625 | VSCODEHELPFLAG_STRICT_LIST_SELECT \
3626 | VSCODEHELPFLAG_AUTO_LIST_VALUES \
3627 );
3628 def_codehelp_flags = fNewCodeHelp;
3629 foreach (sLangId in aMyLangIds)
3630 {
3631 _str sVarName = 'def-codehelp-' :+ sLangId;
3632 int idxVar = find_index(sVarName, MISC_TYPE);
3633 if (idxVar != 0)
3634 replace_def_data(sVarName, fNewCodeHelp);
3635 }
3636#endif
3637
3638 /** @todo
3639 * - def_save_options
3640 * - Auto restore clipboards
3641 * */
3642
3643 message("Please restart SlickEdit.")
3644}
3645
3646/**
3647 * Module initiation.
3648 */
3649definit()
3650{
3651 /* do cleanup. */
3652 for (i = 0; i < 999; i++)
3653 {
3654 index = name_match("def-koptions-", 1 /*find_first*/, MISC_TYPE);
3655 if (!index)
3656 break;
3657 delete_name(index);
3658 }
3659
3660 /* do init */
3661 k_styles_create();
3662 k_menu_create();
3663 iTimer = _set_timer(1000, k_menu_create, "timer");
3664 /* createMyColorSchemeAndUseIt();*/
3665}
3666
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette