diff options
Diffstat (limited to 'temp/mfile')
-rw-r--r-- | temp/mfile/README | 174 | ||||
-rw-r--r-- | temp/mfile/help.html | 165 | ||||
-rw-r--r-- | temp/mfile/htmlview.tcl | 606 | ||||
-rw-r--r-- | temp/mfile/htmlview.xbm | 14 | ||||
-rw-r--r-- | temp/mfile/makefile_template | 223 | ||||
-rwxr-xr-x | temp/mfile/mfile.tcl | 1601 | ||||
-rw-r--r-- | temp/mfile/mfile.xbm | 14 |
7 files changed, 2797 insertions, 0 deletions
diff --git a/temp/mfile/README b/temp/mfile/README new file mode 100644 index 0000000..fa7db2e --- /dev/null +++ b/temp/mfile/README @@ -0,0 +1,174 @@ +Mfile - a simple Makefile generator for AVR-GCC +================================================ + +[See below for installation instructions] + +General +------- + +The main purpose of this small application is to provide people an +easy way to setup their project's Makefiles for »relatively standard« +projects, so one could start using AVR-GCC without first studying the +AVR's datasheet, plus the avr-libc documentation (really +recommended!), /plus/ the »GNU make« user manual. + +It cannot really release the potential programmer from eventually +studying the »GNU make« manual, but it can help to delay this part a +few months. + +This generator works by using a Makefile template (the one that +currently ships with WinAVR), load it into an editor buffer so the +user can view the file and the changes, and then use a menu-driven +approach to customize that buffer. Eventually, at the user's +discretion, this editor buffer can be saved into a Makefile. +(Optionally, the user can also edit the buffer directly, so it acts as +a simple text editor.) + +While the Programmer's Notepad 2 (PN2) editor that ships with WinAVR +intends to eventually implement this functionality some day, there are +two reasons for this little project: + +. Act as a stop-gap measure so users will get something they can use + right now, without waiting any longer. + +. Since this tool is written in Tcl/Tk, it is also portable to Unix + systems, so Unix users (who'd never benefit from PN2) might use it. + +I do explicitly /not/ intend to make this tool the all-singing +all-dancing scriptable Makefile generator that can emit any Makefile +for any processor and compiler on earth. I really do not want to +spend that many more hours into it, it was intented to be a quick and +(hopefully not so) dirty tool that gets finished within a couple of +evenings, and won't cost me another dozen of hours per months for +supporting it, adding new features etc. If you feel this is worth +porting somewhere else (like for the MSP430-GCC that is probably +fairly close to AVR-GCC in terms of typical use), please pick it up, +extend it, and maintain it separately. As always, I appreciate +feedback, but reserve the right to ignore anything that tries to +extend this tool above the outlined original purpose. + +Note that the Makefile template as shipped requires GNU make for +various things (automagic dependency generation, some inference rules +are written in gmake syntax as well). However, as Mfile only relies +on a few macro names in the template, it should be relatively easy to +modify the template for other »make« dialects. The template (or input +file upon »File -> Open«) will be parsed when reading it, and only +those features actually present will be displayed in the »Makefile« +menu. So if e. g. people don't want to include AVRdude features, they +can delete all related lines from the template. Also if someone (like +Unix users, in particular those not using GNU make) want to modify the +way the dependencies are generated (e. g. by using the traditional +»make depend« approach), this should be completely unrelated. + + +Prerequisites +------------- + +Requires the Tcl and Tk toolkits in recent versions (no exact version +known, probably any 8.x version is OK). Current WinAVR (20030913) +contains these tools. + +As an alternative to the standard Tk wish interpreter, the tix +toolkit's tixwish interpreter can be used. Under Unix systems, the +look & feel is then closer to what Tk wish looks like under Windows. + + +Installation on Windows +----------------------- + +[Users of WinAVR 20040404 and beyond do get Mfile pre-installed. See +below for upgrade instructions.] + +Extract the archive into a subdirectory of its own, e. g. + +c:\WinAVR\mfile + +Double-click on the icon for »mfile.tcl« in your file browser +(explorer), and tell it to use c:\WinAVR\bin\wish84.exe to run this +file. (Adjust appropriately if you installed WinAVR in another +directory.) + +Since Windows always changes to the directory of the application +before starting it, all template and auxiliary files should be found +easily there without editing mfile.tcl. Note however that this +directory will also become the default directory where »Makefile« will +be stored, unless you change a different location with »Save As...« + +As another option, the following has been contributed by Eric Weddington +on how to properly create a shortcut on the desktop: + +1. Extract the mfile.zip archive into your WinAVR +installation directory. This will automatically create a +subdirectory \mfile with all the needed files in this +subdirectory. + +2. Create a Shortcut on your Desktop. + +3. For the location of the item, select the program +wish84.exe which is located in \bin subdirectory of your +WinAVR installation directory. Add a space and then type +the absolute pathname of the program, mfile.tcl, which is +located in the mfile subdirectory of your WinAVR +installation directory. + +For example, if your WinAVR installation directory is at +C:\WinAVR, then the item will look like: +C:\WinAVR\bin\wish84.exe C:\WinAVR\mfile\mfile.tcl + +4. The name of the Shortcut should be: MFile + +5. When finished, you will have to go back and properly +select the Start Directory. Right-click the shortcut icon +on your Deskopt and select Properties. In the Start In edit +box, put in the mfile subdirectory of your WinAVR +installation directory. NOTE! This is essential if MFile is +to execute correctly as there are additional files that it +needs to find. + +For example, if your WinAVR installation directory is at +C:\WinAVR, then the Start directory will be: +C:\WinAVR\mfile + +Installation on Unix +-------------------- + +Extract the archive into an arbitrary subdirectory, like + +/usr/local/share/mfile + +If a different directory is chosen, edit the setting of »prefix« on +top of mfile.tcl to match the installation directory, or alternatively +use the environment variable MFILE_HOME to override the default +setting. + +If you'd like to use a different interpreter than +/usr/local/bin/tixwish, edit the #! setting in the first line. The +standard Tk wish interpreter is supported as well as the tix toolkit +one. + +If you prefer, create a symbolic link for convenience (so the +application can be found along your default $PATH setting), like + +ln -s /usr/local/share/mfile/mfile.tcl /usr/local/bin/mfile + +Remember to edit the file makefile_template to suite your needs (e. g. +default settings, adaptation to non-GNU make utilities). + + +Upgrading an Mfile installation on WinAVR +----------------------------------------- + +Starting with WinAVR 20040404, the WinAVR collection is shipping Mfile +pre-installed. (After all, the WinAVR users have once been the +primary reason to develop Mfile at all.) + +In order to upgrade the Mfile files supplied with WinAVR, extract the +archive into some directory, and copy all the files into + +<winavr directory>\mfile + +That ought to be all that is to be done. + +---------------------------------------------------------------------- +Dresden, F. R. Germany, $Date: 2004/07/15 20:51:08 $ +Joerg Wunsch <j.gnu@uriah.heep.sax.de> diff --git a/temp/mfile/help.html b/temp/mfile/help.html new file mode 100644 index 0000000..f0398bb --- /dev/null +++ b/temp/mfile/help.html @@ -0,0 +1,165 @@ +<!-- Help text for mfile.tcl --> +<!---------------------------------------------------------------------------> +<!-- "THE BEER-WARE LICENSE" (Revision 42) (by Poul-Henning Kamp): --> +<!-- Joerg Wunsch wrote this file. As long as you retain this notice you --> +<!-- can do whatever you want with this stuff. If we meet some day, and --> +<!-- you think this stuff is worth it, you can buy me a beer in return. --> +<!---------------------------------------------------------------------------> +<!-- $Id: help.html,v 1.15 2004/07/15 20:51:08 j Exp $ --> +<html> +<head><title>Mfile help</title></head> +<body> +<h1>Simple Makefile generator for AVR-GCC</h1> +<p>Copyright © 2003, 2004 Jörg Wunsch</p> + +<hr> +<p>This simple Makefile generator is meant as an aid to quickly +customize the WinAVR Makefile template, producing a file called +<tt>Makefile</tt> in the current directory as result.</p> + +<p>The application consists of a (scrollable) text editor widget, and +a menu bar.</p> + +<p>The <b>File</b> menu has only two entries:</p> + +<ul> + <li><b>Save</b> writes the contents of the text editor widget to a + file called <tt>Makefile</tt>. Should any file by that name + already exist, it will be renamed. Under Unix, a tilde will be + appended to the old name, all other platforms append a <tt>.bak</tt> + suffix. + <li><b>Save As</b> opens a filename selection dialog, and allows + the user to select a file to save to. After selecting the file + name, it behaves identical to <b>Save</b>. + <li><b>Open</b> opens a filename selection dialog, requesting an + existing file to be opened by the user. This file will be loaded + into the editor buffer, and the <b>Makefile</b> menu will be + updated accordingly. + <li><b>Exit</b> will quit the application. No checks whatsoever + are done to ensure the user has saved his editing work before. +</ul> + +<p>The <b>Makefile</b> menu allows customization of the generated +Makefile. Note that the various menu items described below will only +be present if the corresponding feature is present in the parsed +template or input file. This menu is divided into three areas:</p> + +<ul> +<li><b>Code generation options</b> +<ul> + <li>The entry <b>Main file name</b> opens a popup window that asks + for the basic name of this + project. This will become the base name for all major output files + (ELF file, MCU output file, several auxiliary files). By default, it + will also serve as the name of the primary C source file, with a + <tt>.c</tt> suffix appended. The popup will be closed by pressing + <i><Enter></i> in the entry field. + <li>The entries <b>MCU type</b>, <b>Output format</b>, + <b>Optimization level</b>, + and <b>C standard level</b> select possible values out of a + predefined list. When selecting one of these options, the + respective Makefile macro will be modified accordingly, and the + widget will be adjusted so the new values can be seen + immediately. + <li>The entry <b>printf() options</b> works similar, only it does + not modify a Makefile macro of its own but edits the PRINTF_LIB + macro instead. Note that setting this away from + <i>none/standard</i> will cause the generated application to + always include the code for vfprintf() (which is huge), + regardless of whether the application actually uses any member + of the printf() family. See the avr-libc documentation for the + meaning of the different options. + <li>Likewise, changing the <b>scanf() options</b> changes the + macro SCANF_LIB, in the same manner. Note that the + <tt>scanf()</tt> format %[ (string match out of a set of + characters) will only be present in the floating point version + since it requires a lot of code, as well as using + <tt>malloc()</tt> (which is otherwise only required for the + floating point version). + <li>The entry <b>C/C++ source file(s)</b> opens a popup that asks + for a list of C (or C++) source files. C source files get the + suffix <tt>.c</tt> (lower-case letter c), C++ source files get + either of <tt>.C</tt> (capital c), <tt>.cxx</tt>, or <tt>.cc</tt>. + Multiple file names shall be seperated by spaces. A checkbox + indicates whether the primary C source file name derived from + the <b>Main file name</b> setting should be included or not. + The popup will be closed by pressing <i><Enter></i> in the entry + field. + <li>The entry <b>Assembler source file(s)</b> works similar + except there are no default assembler sources to be included. + Note that assembler source files get the suffix <tt>.S</tt> + (capital letter s) which means they are being pre-processed by + the C preprocessor, so <tt>#include</tt> etc. will work. A + lower-case letter <tt>.s</tt> suffix is considered to be a + temporary compiler output file, and should not be used here. + <li>Using <b>External RAM options</b>, several possible variants + to use external RAM can be selected. This is internally handled + by editing the EXTMEMOPTS macro which eventually gets added to + the LDFLAGS during linking. The options are to either use + external RAM for both, variables (i. e. sections .data and .bss) + as well as for the heap (dynamic memory for <tt>malloc()</tt>), + or to leave variables in internal memory and use the external + RAM only for the heap. In both cases, the stack will always + remain in internal memory; this is the fastest way, and some + AVR MCUs have hardware bugs so they would not work when the + stack is located in external RAM. It can be selected whether + the external RAM should start at the lowest possible memory + location (right behind the internal RAM), or at a different + memory address. Several common memory sizes can be chosen from. + Obviously, these options are only accessible for MCU types that + do have an external memory interface. + <li>The entry <b>Debug format</b> selects one out of the following + options: + <ul> + <li><b>ELF/stabs</b> ELF object files with stabs debugging + information are currently the native way to debug under Unix + and/or GDB. This includes any GDB frontend, like Insight or + DDD. + <li><b>AVR-COFF</b> Selecting this format will internally also + generate an ELF/stabs file, but change the Makefile to + subsequently convert the ELF file into a COFF file that adheres + to the originally Atmel AVR COFF file format specification. + This file format is understood by AVR Studio up to 3.x, and + VMLAB up to 3.9. + <li><b>AVR-ext-COFF</b> The conversion from internal ELF to + COFF will be tuned to produce a file according to the later + AVR "extended" COFF specification by Atmel, understood by AVR + Studio 4.07 and above, and VMLAB 3.10 and above. + <li><b>ELF/DWARF-2</b> Create an ELF standard object file with + DWARF-2 debug information. This is the proposed standard debug + format for ELF. It is currently Beta, the GNU tools are slowly + changing towards that standard (though it is not yet known + whether AVR-GDB will already fully understand the format yet), + and Atmel has released a beta ELF/DWARF-2 parser for their AVR + Studio. + </ul> +</ul> +<li><b>AVRdude options</b> +<ul> + <li>The entry <b>Programmer</b> allows the selection of + the programming hardware (parallel port "dongle", or serially + connected hardware). + <li>The entry <b>Port</b> selects the serial or parallel + port AVRdude is going to talk across. This menu item might + be missing on some operating systems where no default ports + are known. +</ul> +<li><b>Miscellaneous</b> +<ul> + <li>By default, the editor widget is read-only, and can only be + modified by the menu entries mentioned above. By checking the + <b>Enable Editing of Makefile</b> checkbox, this restriction can be lifted, + and the widget can be used as a simple standard text editor for + the generated Makefile. Note that the menu operations mentioned + above are not guaranteed to work on arbitrary input texts since + they search for certain patterns in order to implement their + functionality, so manual editing should always be used as a last + step before eventually saving the generated Makefile. +</ul> +</ul> + +</body> +<address><hr> +Jörg Wunsch · <j.gnu@uriah.heep.sax.de> · +$Date: 2004/07/15 20:51:08 $</address> +</html> diff --git a/temp/mfile/htmlview.tcl b/temp/mfile/htmlview.tcl new file mode 100644 index 0000000..f0b3418 --- /dev/null +++ b/temp/mfile/htmlview.tcl @@ -0,0 +1,606 @@ +# ---------------------------------------------------------------------------- +# "THE BEER-WARE LICENSE" (Revision 42) (by Poul-Henning Kamp): +# Joerg Wunsch <j.gnu@uriah.heep.sax.de> wrote this file. As long as you +# retain this notice you can do whatever you want with this stuff. If we meet +# some day, and you think this stuff is worth it, you can buy me a beer +# in return. +# ---------------------------------------------------------------------------- +# +# $Id: htmlview.tcl,v 1.7 2004/07/15 20:50:48 j Exp $ +# +# This implements a simple HTML viewer that is just suitable to browse through +# a document generated by latex2html +# + +proc htmlview {file} { + global htmlposx htmlposy + global tcl_platform + global helpicon + global tcl_platform + global bgcolor + + if {$file == ""} { + return + } + + set subtag "" + # determine requested subtag (if any) + if {[regexp "^(\[^\#\]*)\#(.*)" $file dummy match subtag]} { + set file $match + } + + set f "" + catch {set f [open $file]} + if {$f == ""} { + return + } + + set dirname [file dirname $file] + + set ok 0 + while {!$ok} { + set w ".htmlview[expr {int(rand()*30000)}]" + if {![winfo exists $w]} { + set ok 1 + } + } + toplevel $w + if {[info exists htmlposx]} { + set htmlposx [expr $htmlposx + 10] + set htmlposy [expr $htmlposy + 10] + } else { + set htmlposx [expr [winfo x .] + 80] + set htmlposy [expr [winfo y .] + 50] + } + wm geometry $w "+$htmlposx+$htmlposy" + wm positionfrom $w user + + frame $w.f0 + text $w.f0.t1 -wrap word -yscrollcommand "$w.f0.sb1 set" \ + -font {Helvetica -12} -cursor {top_left_arrow} + scrollbar $w.f0.sb1 -command "$w.f0.t1 yview" + frame $w.f1 + button $w.f1.bok -text {Close} -command "destroy $w" + #button $w.f1.closeall -text {Hilfe beenden} -command {destroyhtmlwins} + pack $w.f0.t1 -side left -expand 1 -fill both + pack $w.f0.sb1 -side right -expand 0 -fill y + pack $w.f0 -side top -expand 1 -fill both + pack $w.f1.bok -side left + #pack $w.f1.closeall -side right + pack $w.f1 -side top + + update + set x [winfo width $w] + set y [winfo height $w] + wm minsize $w $x $y + + bind $w <Key-Prior> "$w.f0.t1 yview scroll -10 units" + bind $w <Key-Next> "$w.f0.t1 yview scroll 10 units" + bind $w <Key-space> "$w.f0.t1 yview scroll 10 units" + focus $w + + set bgcolor [$w.f0.t1 cget -background] + + if {$tcl_platform(platform) == "unix" && [file exists $helpicon]} { + wm iconbitmap $w @$helpicon + } + + set buf ""; set head ""; set tail "" + set title "" + set list ""; set lcount {1}; set ullevel 0 + set bold 0; set italic 0; set titlemode 0 + set tagno 0; set attribs {}; set attrib ""; set justify "left" + set paraopen 0 + set lmargin 0; set rmargin 0 + set hrno 0; set bulletno 0; set imgno 0 + set newlineput 0; set anchorhasmodifiedfont 0; set inheadline 0 + + while {1} { + # if $buf starts with a "<", it means we've got an unfinished yet + # tag in there, so we need to read more until the tag is finished + # and can be handled in full + if {$buf == "" || [string index $buf 0] == "<"} { + if {[gets $f lbuf] == -1} { + break + } + if {$lbuf == "" && !$inheadline} { + # single newline only, marks a paragraph break + set lbuf "<p>" + } + regsub -all {[\t ]+} $lbuf { } lbuf + if {[string index $lbuf end] != " "} { + set lbuf "$lbuf " + } + set buf "$buf$lbuf" + } + if {[set idx [string first "<" $buf]] != -1} { + set head [string range $buf 0 [expr $idx - 1]] + set tail [string range $buf $idx end] + } else { + set head $buf + set tail "" + } + if {[string length $head]} { + set head [untangletext $head] + if {$titlemode} { + set title "$title$head" + } else { + if {$attrib != ""} { + $w.f0.t1 insert end $head $attrib + } else { + $w.f0.t1 insert end $head + } + } + set head "" + } + if {[string length $tail]} { + if {[set idx [string first ">" $tail]] != -1} { + set tag [string range $tail 0 $idx] + set buf [string range $tail [expr $idx + 1] end] + set tag [string range $tag 1 end-1] + set tagname $tag + set remainder "" + regexp {^(/?[A-Za-z0-9]+) *(.*)} $tag dummy tagname remainder + set tagname [string tolower $tagname] + switch $tagname { + "br" { + $w.f0.t1 insert end "\n" + } + "p" { + if {$paraopen && $attrib != ""} { + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + } + set align "" + while {1} { + set x [parsetag $remainder] + set name [string tolower [lindex $x 0]] + set val [lindex $x 1] + set remainder [lindex $x 2] + + if {$name == ""} { + break + } + if {$name == "align"} { + set align [string tolower $val] + } + } + if {$align != ""} { + set justify "left" + switch $align { + "center" { set justify "center" } + "right" { set justify "right" } + } + incr tagno + lappend attribs $attrib + set attrib "attrib$tagno" + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -font {Helvetica -12 bold} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + } + $w.f0.t1 insert end "\n" + set paraopen 1 + } + "/p" { + set paraopen 0 + if {$attrib != ""} { + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + } + } + "title" { + set titlemode 1 + set title "" + } + "/title" { + set titlemode 0 + wm title $w $title + } + "b" { + incr tagno + lappend attribs $attrib + set attrib "attrib$tagno" + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -font {Helvetica -12 bold} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + } + "/b" { + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + } + "strong" { + incr tagno + lappend attribs $attrib + set attrib "attrib$tagno" + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -font {Helvetica -12 bold} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + } + "/strong" { + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + } + "i" { + incr tagno + lappend attribs $attrib + set attrib "attrib$tagno" + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -font {Helvetica -12 italic} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + } + "/i" { + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + } + "em" { + incr tagno + lappend attribs $attrib + set attrib "attrib$tagno" + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -font {Helvetica -12 italic} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + } + "/em" { + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + } + "tt" { + incr tagno + lappend attribs $attrib + set attrib "attrib$tagno" + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -font {Courier -12} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + } + "/tt" { + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + } + "h1" { + incr inheadline + incr tagno + lappend attribs $attrib + set attrib "attrib$tagno" + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -font {Times -18 bold} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + } + "/h1" { + set inheadline [expr $inheadline - 1] + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + $w.f0.t1 insert end "\n\n" + } + "h2" { + incr inheadline + incr tagno + lappend attribs $attrib + set attrib "attrib$tagno" + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -font {Times -16 bold} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + } + "/h2" { + set inheadline [expr $inheadline - 1] + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + $w.f0.t1 insert end "\n\n" + } + "h3" { + incr inheadline + incr tagno + lappend attribs $attrib + set attrib "attrib$tagno" + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -font {Times -14 bold} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + } + "/h3" { + set inheadline [expr $inheadline - 1] + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + $w.f0.t1 insert end "\n\n" + } + "h4" { + incr inheadline + incr tagno + lappend attribs $attrib + set attrib "attrib$tagno" + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -font {Times -12 bold} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + } + "/h4" { + set inheadline [expr $inheadline - 1] + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + $w.f0.t1 insert end "\n\n" + } + "a" { + set target "" + while {1} { + set x [parsetag $remainder] + set name [string tolower [lindex $x 0]] + set val [lindex $x 1] + set remainder [lindex $x 2] + + if {$name == ""} { + break + } + if {$name == "href"} { + set target $val + } + if {$name == "name" && $subtag == $val} { + # subtag was requested, notice it + set see [$w.f0.t1 index end] + } + } + if {$target != "" && ![regexp {^(http:|ftp:)} $target]} { + switch $tcl_platform(platform) { + "windows" { + if {![regexp {^([A-Za-z]:)?[\\/]} $target]} { + # relative pathname + set target "$dirname/$target" + } + } + "unix" { + if {![regexp {^/} $val]} { + # relative unix pathname + set target "$dirname/$target" + } + } + } + set anchorhasmodifiedfont 1 + incr tagno + lappend attribs $attrib + set attrib "attrib$tagno" + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -foreground {blue} + $w.f0.t1 tag configure $attrib -font {Helvetica -12 bold} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + $w.f0.t1 tag bind $attrib <ButtonPress> "htmlview $target" + } + } + "/a" { + if {$anchorhasmodifiedfont} { + set anchorhasmodifiedfont 0 + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + } + } + "ul" { + set list "ul" + incr ullevel + incr tagno + lappend attribs $attrib + set attrib "attrib$tagno" + set lmargin [expr 40 * $ullevel - 10] + set rmargin [expr 40 * $ullevel] + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -font {Helvetica -12} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + } + "/ul" { + set ullevel [expr $ullevel - 1] + if {$ullevel == 0} { + set list "" + set lmargin 0 + set rmargin 0 + } else { + set lmargin [expr 40 * $ullevel - 10] + set rmargin [expr 40 * $ullevel] + } + set attrib [lindex $attribs end] + set attribs [lrange $attribs 0 end-1] + $w.f0.t1 tag add $attrib end + $w.f0.t1 tag configure $attrib -font {Helvetica -12} + $w.f0.t1 tag configure $attrib -lmargin1 $lmargin -lmargin2 $lmargin \ + -rmargin $rmargin -justify $justify + $w.f0.t1 insert end "\n" + } + "li" { + switch $list { + "ul" { + incr bulletno + canvas $w.bullet$bulletno \ + -width [expr 40 * $ullevel - 15] -height 6 \ + -background $bgcolor -highlightthickness 0 \ + -border 0 + if {$ullevel == 1} { + $w.bullet$bulletno create oval 11 1 14 4 + } else { + $w.bullet$bulletno create rectangle \ + [expr 40 * $ullevel - 29] 1 [expr 40 * $ullevel - 26] 4 + } + $w.f0.t1 insert end "\n" $attrib + $w.f0.t1 window create end -align baseline \ + -window $w.bullet$bulletno + } + } + } + "address" { + set attrib "" + set attribs {} + $w.f0.t1 insert end "\n" + } + "hr" { + update + incr hrno + makehr $w.hr$hrno [expr [winfo width $w.f0.t1] - 10] + $w.f0.t1 insert end "\n" $attrib + $w.f0.t1 window create end -window $w.hr$hrno + } + "img" { + set iwidth 0 + set iheight 0 + set ialign "bottom" + set isrc "" + while {1} { + set x [parsetag $remainder] + set name [string tolower [lindex $x 0]] + set val [lindex $x 1] + set remainder [lindex $x 2] + + if {$name == ""} { + break + } + switch $name { + "width" { set iwidth $val } + "height" { set iheight $val } + "src" { + switch $tcl_platform(platform) { + "windows" { + if {[regexp {^([A-Za-z]:)?[\\/]} $val]} { + # absolute pathname + set isrc $val + } else { + set isrc "$dirname/$val" + } + } + "unix" { + if {[regexp {^/} $val]} { + # absolute unix pathname + set isrc $val + } else { + set isrc "$dirname/$val" + } + } + } + } + "align" { set ialign [string tolower $val] } + } + } + if {$isrc != "" && [file exists $isrc]} { + incr imgno + image create photo htmlview$imgno \ + -width $iwidth -height $iheight \ + -file $isrc + set imgidx [$w.f0.t1 image create end -image htmlview$imgno] + $w.f0.t1 tag add $attrib $imgidx + $w.f0.t1 tag add $attrib end + } + } + } + } else { + # unfinished tag, return to $buf + set buf $tail + } + } else { + set buf "" + } + } + close $f + # prevent users from editing the text widget's contents + $w.f0.t1 configure -state disabled + if {[info exists see]} { + # we have a subtag to display + $w.f0.t1 see $see + } +} + +# parse $str, obtain first name=value pair, return remainder as well +proc parsetag {str} { + # first check for quoted value + if {[regexp {^([A-Za-z0-9_]+) *= *"([^\"]+)" *(.*)} $str dummy name val rem]} { + return [list $name $val $rem] + } + # else check for argument that must not contain a space + if {[regexp {^([A-Za-z0-9_]+) *= *([^ ]+) *(.*)} $str dummy name val rem]} { + return [list $name $val $rem] + } + # else we fail + return [list "" "" ""] +} + +# proc destroyhtmlwins {} { +# global htmlposx htmlposy + +# foreach win [winfo children .] { +# if {[string match {.htmlview[0-9]*} $win]} { +# destroy $win +# } +# } + +# foreach img [image names] { +# if {[string match {htmlview[0-9]+} $img]} { +# image delete $img +# } +# } + +# set htmlposx [expr [winfo x .] + 80] +# set htmlposy [expr [winfo y .] + 50] +# } + +proc makehr {c w} { + global bgcolor + + canvas $c -width $w -height 6 -background $bgcolor \ + -highlightthickness 0 + $c create line 2 2 [expr $w - 2] 2 -width 1 -fill "\#202020" + $c create line 2 2 2 4 -width 1 -fill "\#202020" + $c create line 3 4 [expr $w - 1] 4 -width 1 -fill "\#ffffff" + $c create line [expr $w - 2] 4 [expr $w - 2] 2 -width 1 -fill "\#ffffff" +} + +proc untangletext {t} { + + set result "" + set ok 1 + + while {$ok} { + if {[regexp {^([^&]*)&([^;]+);(.*)} $t dummy left marked right]} { + set result "$result$left" + set t $right + switch -glob $marked { + "Auml" { set result "${result}Ä" } + "Ouml" { set result "${result}Ö" } + "Uuml" { set result "${result}Ü" } + "auml" { set result "${result}ä" } + "ouml" { set result "${result}ö" } + "uuml" { set result "${result}ü" } + "szlig" { set result "${result}ß" } + "nbsp" { set result "${result} " } + "amp" { set result "${result}&" } + "lt" { set result "${result}<" } + "gt" { set result "${result}>" } + "\#[0-9]*" { + regexp {^.(.*)} $marked dummy c + set c [subst "\\[format {%o} $c]"] + set result ${result}$c + } + "*" { + # puts stderr "Warning: unknown html mark $marked" + } + } + } else { + set result "$result$t" + set ok 0 + } + } + + return $result +} diff --git a/temp/mfile/htmlview.xbm b/temp/mfile/htmlview.xbm new file mode 100644 index 0000000..667414f --- /dev/null +++ b/temp/mfile/htmlview.xbm @@ -0,0 +1,14 @@ +#define htmlview_width 32 +#define htmlview_height 32 +static unsigned char htmlview_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0x00, 0x60, + 0xc6, 0x00, 0x02, 0x60, 0xc6, 0x00, 0x06, 0x60, 0xc6, 0x00, 0x06, 0x60, + 0xc6, 0x00, 0x06, 0x60, 0xc6, 0x00, 0x06, 0x60, 0xc6, 0x00, 0x06, 0x60, + 0xc6, 0x00, 0x06, 0x60, 0xfe, 0x1c, 0xc6, 0x63, 0xfe, 0x36, 0xc6, 0x67, + 0xc6, 0x66, 0xc6, 0x66, 0xc6, 0x7e, 0xc6, 0x66, 0xc6, 0x7e, 0xc6, 0x66, + 0xc6, 0x06, 0xc6, 0x66, 0xc6, 0x0e, 0xc6, 0x06, 0xc6, 0x3c, 0xce, 0x67, + 0xc6, 0x78, 0xcc, 0x63, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; diff --git a/temp/mfile/makefile_template b/temp/mfile/makefile_template new file mode 100644 index 0000000..b7bc0f6 --- /dev/null +++ b/temp/mfile/makefile_template @@ -0,0 +1,223 @@ +# Hey Emacs, this is a -*- makefile -*- + +# AVR-GCC Makefile template, derived from the WinAVR template (which +# is public domain), believed to be neutral to any flavor of "make" +# (GNU make, BSD make, SysV make) + + +MCU = atmega128 +FORMAT = ihex +TARGET = main +SRC = $(TARGET).c +ASRC = +OPT = s + +# Name of this Makefile (used for "make depend"). +MAKEFILE = Makefile + +# Debugging format. +# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. +# AVR (extended) COFF requires stabs, plus an avr-objcopy run. +DEBUG = stabs + +# Compiler flag to set the C Standard level. +# c89 - "ANSI" C +# gnu89 - c89 plus GCC extensions +# c99 - ISO C99 standard (not yet fully implemented) +# gnu99 - c99 plus GCC extensions +CSTANDARD = -std=gnu99 + +# Place -D or -U options here +CDEFS = + +# Place -I options here +CINCS = + + +CDEBUG = -g$(DEBUG) +CWARN = -Wall -Wstrict-prototypes +CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +#CEXTRA = -Wa,-adhlns=$(<:.c=.lst) +CFLAGS = $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA) + + +#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs + + +#Additional libraries. + +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +PRINTF_LIB = + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +SCANF_LIB = + +MATH_LIB = -lm + +# External memory options + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + +#LDMAP = $(LDFLAGS) -Wl,-Map=$(TARGET).map,--cref +LDFLAGS = $(EXTMEMOPTS) $(LDMAP) $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) + + +# Programming support using avrdude. Settings and variables. + +AVRDUDE_PROGRAMMER = stk200 +AVRDUDE_PORT = /dev/lp0 + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_BASIC = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS = $(AVRDUDE_BASIC) $(AVRDUDE_NO_VERIFY) $(AVRDUDE_VERBOSE) $(AVRDUDE_ERASE_COUNTER) + + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +MV = mv -f + +# Define all object files. +OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) + +# Define all listing files. +LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + +# Default target. +all: build + +build: elf hex eep + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ +--change-section-address .data-0x800000 \ +--change-section-address .bss-0x800000 \ +--change-section-address .noinit-0x800000 \ +--change-section-address .eeprom-0x810000 + + +coff: $(TARGET).elf + $(COFFCONVERT) -O coff-avr $(TARGET).elf $(TARGET).cof + + +extcoff: $(TARGET).elf + $(COFFCONVERT) -O coff-ext-avr $(TARGET).elf $(TARGET).cof + + +.SUFFIXES: .elf .hex .eep .lss .sym + +.elf.hex: + $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +.elf.eep: + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +.elf.lss: + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +.elf.sym: + $(NM) -n $< > $@ + + + +# Link: create ELF output file from object files. +$(TARGET).elf: $(OBJ) + $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +.c.o: + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +.c.s: + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +.S.o: + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + + +# Target: clean project. +clean: + $(REMOVE) $(TARGET).hex $(TARGET).eep $(TARGET).cof $(TARGET).elf \ + $(TARGET).map $(TARGET).sym $(TARGET).lss \ + $(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) + +depend: + if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \ + then \ + sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \ + $(MAKEFILE).$$$$ && \ + $(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \ + fi + echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \ + >> $(MAKEFILE); \ + $(CC) -M -mmcu=$(MCU) $(CDEFS) $(CINCS) $(SRC) $(ASRC) >> $(MAKEFILE) + +.PHONY: all build elf hex eep lss sym program coff extcoff clean depend diff --git a/temp/mfile/mfile.tcl b/temp/mfile/mfile.tcl new file mode 100755 index 0000000..c25a3dc --- /dev/null +++ b/temp/mfile/mfile.tcl @@ -0,0 +1,1601 @@ +#!/usr/local/bin/tixwish +# ---------------------------------------------------------------------------- +# "THE BEER-WARE LICENSE" (Revision 42) (by Poul-Henning Kamp): +# Joerg Wunsch <j.gnu@uriah.heep.sax.de> wrote this file. As long as you +# retain this notice you can do whatever you want with this stuff. If we meet +# some day, and you think this stuff is worth it, you can buy me a beer +# in return. +# ---------------------------------------------------------------------------- +# +# Simple Makefile generator for AVR-GCC +# +# $Id: mfile.tcl,v 1.46 2006/01/19 13:20:51 j Exp $ + +# Full path name where various files will be found + +if {[info exists env(MFILE_HOME)]} { + set prefix $env(MFILE_HOME) +} else { + if {$tcl_platform(platform) == "unix"} { + set prefix "/usr/local/share/mfile" + } else { + set prefix "." + } +} + +set templatename "$prefix/makefile_template" +set helpfile "$prefix/help.html" +set mainicon "$prefix/mfile.xbm" +set helpicon "$prefix/htmlview.xbm" + +global helpfile mainicon helpicon + +# color to highlight changed items with +global highlight +set highlight "\#ffff80" + +# +# end of configurable section +# + +global devicelist +set devicelist \ + { {at90can32 0x800900}\ + {at90can64 0x801100} \ + {at90can128 0x801100} \ + at90s1200 \ + at90s2313 \ + at90s2323 \ + at90s2333 \ + at90s2343 \ + {at90s4414 0x800160} \ + at90s4433 \ + at90s4434 \ + {at90s8515 0x800260} \ + at90s8535 \ + {atmega103 0x801000} \ + {atmega128 0x801100} \ + {atmega1280 0x802200} \ + {atmega1281 0x802200} \ + atmega16 \ + {atmega161 0x800460} \ + {atmega162 0x800500} \ + atmega163 \ + atmega164 \ + atmega165 \ + atmega168 \ + atmega169 \ + atmega32 \ + atmega323 \ + atmega324 \ + atmega325 \ + atmega3250 \ + atmega329 \ + atmega3290 \ + atmega48 \ + {atmega64 0x801100} \ + {atmega640 0x802200} \ + atmega644 \ + atmega645 \ + atmega6450 \ + atmega649 \ + atmega6490 \ + atmega8 \ + {atmega8515 0x800260} \ + atmega8535 \ + atmega88 + attiny11 \ + attiny12 \ + attiny13 \ + attiny15 \ + attiny22 \ + attiny2313 \ + attiny24 \ + attiny25 \ + attiny26 \ + attiny261 \ + attiny28 \ + attiny44 \ + attiny45 \ + attiny461 \ + attiny84 \ + attiny85 \ + attiny861 \ + at94K \ + at76c711 \ + at43usb320 \ + at43usb355 \ + at86rf401} + +global makefile + +global filename +set filename "Makefile" +global basename +set basename $filename + +global backupsuffix +if {$tcl_platform(platform) == "unix"} { + set backupsuffix "~" +} else { + set backupsuffix ".bak" +} + +global extmemparts +foreach m $devicelist { + if {[llength $m] > 1} { + set extmemparts([lindex $m 0]) [lindex $m 1] + } +} + +global extmemmax memoffset +set extmemmax [expr 0x80ffff] +set memoffset [expr 0x800000] + +proc parsetemplate {fname} { + global makefile + + set fh [open $fname] + set template [read $fh] + close $fh + + global mainfile mcutype oformat optlevel stdlevel src mainfilesrc + global asrc printfopts scanfopts deftarget avrdudeprog avrdudeport + global dformat + global extmemsize extmemstart extmemopts + global extmemmax extmemparts memoffset + + foreach v { mainfile mcutype oformat optlevel stdlevel src \ + mainfilesrc asrc printfopts scanfopts deftarget \ + avrdudeprog avrdudeport dformat \ + extmemsize extmemstart extmemopts} { + if {[info exists $v]} { + unset $v + } + } + + # Now parse what we've got, and allocate our + # internal variables + if {[regexp {(?n)^MCU\s*=\s*(\S+)} $template dummy x]} { + set mcutype $x + } + + if {[regexp {(?n)^TARGET\s*=\s*(\S+)} $template dummy x]} { + set mainfile $x + } + + if {[regexp {(?n)^FORMAT\s*=\s*(\S+)} $template dummy x]} { + set oformat $x + } + + if {[regexp {(?n)^OPT\s*=\s*(\S+)} $template dummy x]} { + set optlevel $x + } + + if {[regexp {(?n)^DEBUG\s*=\s*(\S+)} $template dummy x]} { + set dformat $x + } + + if {[regexp {(?n)^CSTANDARD\s*=\s*-std=(\S+)} $template dummy x]} { + set stdlevel $x + } + + if {[regexp {(?n)^SRC\s*=\s*(.*)$} $template dummy x]} { + if {[regexp {(.*)\$[(]TARGET[)].c(.*)} $x dummy y z]} { + # replace multiple consecutive spaces by just one + regsub -all {\s+} "$y$z" " " y + set src $y + # mainfilesrc == 1 means include $(TARGET).c into SRC + set mainfilesrc 1 + } else { + set src $x + # mainfilesrc == 0 means do not include $(TARGET).c into SRC + set mainfilesrc 0 + } + } + + if {[regexp {(?n)^ASRC\s*=\s*(\S+)} $template dummy x]} { + set asrc "" + } + + if {[regexp {(?n)^PRINTF_LIB\s*=\s*(\S+)} $template dummy x]} { + if {$x == {$(PRINTF_LIB_MIN)}} { + set printfopts "min" + } elseif {$x == {$(PRINTF_LIB_FLOAT)}} { + set printfopts "flt" + } else { + set printfopts "none" + } + } + + if {[regexp {(?n)^SCANF_LIB\s*=\s*(\S+)} $template dummy x]} { + if {$x == {$(SCANF_LIB_MIN)}} { + set scanfopts "min" + } elseif {$x == {$(SCANF_LIB_FLOAT)}} { + set scanfopts "flt" + } else { + set scanfopts "none" + } + } + + if {[regexp {(?n)^EXTMEMOPTS\s*=(.*)$} $template dummy x]} { + if {[regexp -- {--section-start[,=]\.data=([0-9a-fA-Fx]+).*__heap_end=([0-9a-fA-Fx]+)} \ + $x dummy y1 y2]} { + # variables & heap are in external RAM + set extmemopts "vars" + } elseif {[regexp \ + {__heap_start=([0-9a-fA-Fx]+).*__heap_end=([0-9a-fA-Fx]+)} \ + $x dummy y1 y2]} { + # only heap in external RAM + set extmemopts "heap" + } else { + set extmemopts "none" + if {$x != ""} { + complain "Unknown EXTMEMOPTS $x, ignored" + } + } + if {$extmemopts != "none"} { + set extmemstart [expr $y1] + if {[expr $y2 == $extmemmax]} { + set extmemsize [expr $extmemmax + 1] + } else { + set extmemsize [expr $y2 - $y1 + 1] + } + if {[info exists mcutype]} { + if {[info exists extmemparts($mcutype)]} { + if {[expr $extmemparts($mcutype) == $y1]} { + # extmemstart == 0 means "lowest possible value" + set extmemstart 0 + } + } + } + } + } + + if {[regexp {(?n)^build:\s*(.*)$} $template dummy x]} { + if {[regexp {\sextcoff\s*$} $x]} { + set deftarget "extcoff" + } elseif {[regexp {\scoff\s*$} $x]} { + set deftarget "coff" + } else { + set deftarget "none" + } + } + + if {[regexp {(?n)^AVRDUDE_PROGRAMMER\s*=\s*(\S+)} $template dummy x]} { + set avrdudeprog $x + } + + if {[regexp {(?n)^AVRDUDE_PORT\s*=\s*(\S+)} $template dummy x]} { + set avrdudeport $x + } + + set makefile $template +} + +proc makemfilemenu {} { + global tcl_platform + global devicelist xram + global mainfile mcutype oformat optlevel stdlevel src mainfilesrc + global asrc printfopts scanfopts deftarget avrdudeprog avrdudeport + global dformat debugidx + global extmemsize extmemstart extmemopts + global extmemmax extmemparts extmemmentry memoffset + + .f1.f1.mb2.m1 delete 0 last + foreach w [winfo children .f1.f1.mb2.m1] { + destroy $w + } + + .f1.f1.mb2.m1 add command -label {Code generation} -state disabled + if {[info exists mainfile]} { + .f1.f1.mb2.m1 add command -command {setmainfile} \ + -label "Main file name..." -underline 0 + } + if {[info exists mcutype]} { + .f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c1 \ + -label "MCU type" \ + -underline 2 + } + if {[info exists oformat]} { + .f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c2 \ + -label "Output format" \ + -underline 7 + } + if {[info exists optlevel]} { + .f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c3 \ + -label "Optimization level" \ + -underline 0 + } + if {[info exists dformat]} { + .f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c30 \ + -label "Debug format" \ + -underline 0 + } + if {[info exists stdlevel]} { + .f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c31 \ + -label "C standard level" \ + -underline 2 + } + if {[info exists src]} { + .f1.f1.mb2.m1 add command -command {asksrc} \ + -label "C/C++ source file(s)..." -underline 0 + } + if {[info exists asrc]} { + .f1.f1.mb2.m1 add command -command {setasrc} \ + -label "Assembler source file(s)..." -underline 0 + } + if {[info exists printfopts]} { + .f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c4 \ + -label "printf() options" \ + -underline 0 + } + if {[info exists scanfopts]} { + .f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c41 \ + -label "scanf() options" \ + -underline 3 + } + if {[info exists extmemopts]} { + .f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c42 \ + -label "External RAM options" \ + -underline 1 -state disabled + set extmemmentry [.f1.f1.mb2.m1 index end] + if {[info exists mcutype]} { + if {[info exists extmemparts($mcutype)]} { + .f1.f1.mb2.m1 entryconfigure $extmemmentry \ + -state normal + } + } + } + if {[info exists deftarget] && ! [info exists dformat]} { + .f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c5 \ + -label "Default \"make\" target" \ + -underline 15 + } + + .f1.f1.mb2.m1 add separator + .f1.f1.mb2.m1 add command -label {AVRdude} -state disabled + + switch $tcl_platform(platform) { + "windows" { + set portlist {usb com1 com2 com3 com4 lpt1 lpt2 lpt3} + } + "unix" { + switch $tcl_platform(os) { + "Linux" { + set portlist {usb /dev/ttyS0 /dev/ttyS1 /dev/ttyS2 /dev/ttyS3 \ + /dev/parport0 /dev/parport1 /dev/parport2} + } + "FreeBSD" { + set portlist {usb dev/cuaa0 /dev/cuaa1 /dev/cuaa2 /dev/cuaa3 \ + /dev/ppi0 /dev/ppi1 /dev/ppi2} + } + "Solaris" { + set portlist {usb /dev/term/a /dev/term/b /dev/printers/0} + } + } + } + } + + if {[info exists avrdudeprog]} { + .f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c6 \ + -label {Programmer} \ + -underline 3 + } + if {[info exists portlist] && [info exists avrdudeport]} { + .f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c7 \ + -label {Port} \ + -underline 2 + } + + .f1.f1.mb2.m1 add separator + .f1.f1.mb2.m1 add command -label {Miscellaneous} -state disabled + .f1.f1.mb2.m1 add checkbutton -variable editwidget \ + -label "Enable Editing of Makefile" \ + -command changeeditable \ + -onvalue normal -offvalue disabled + + .f1.f1.mb2 configure -menu .f1.f1.mb2.m1 + + if {[info exists mcutype]} { + menu .f1.f1.mb2.m1.c1 -tearoff 0 + .f1.f1.mb2.m1.c1 add cascade -menu .f1.f1.mb2.m1.c1.at90 \ + -label "AT90" -underline 2 + .f1.f1.mb2.m1.c1 add cascade -menu .f1.f1.mb2.m1.c1.atmega \ + -label "ATmega" -underline 2 + .f1.f1.mb2.m1.c1 add cascade -menu .f1.f1.mb2.m1.c1.attiny \ + -label "ATtiny" -underline 2 + .f1.f1.mb2.m1.c1 add cascade -menu .f1.f1.mb2.m1.c1.other \ + -label "Other" -underline 0 + + menu .f1.f1.mb2.m1.c1.at90 -tearoff 0 + menu .f1.f1.mb2.m1.c1.atmega -tearoff 0 + menu .f1.f1.mb2.m1.c1.attiny -tearoff 0 + menu .f1.f1.mb2.m1.c1.other -tearoff 0 + + foreach m $devicelist { + set mcu [lindex $m 0] + if {[llength $mcu] > 1} { + set xram($mcu) [lindex $m 1] + } + switch -glob $mcu { + "at90*" { + .f1.f1.mb2.m1.c1.at90 add radiobutton -variable mcutype \ + -label $mcu -command setmcu + } + "atmega*" { + .f1.f1.mb2.m1.c1.atmega add radiobutton -variable mcutype \ + -label $mcu -command setmcu + } + "attiny*" { + .f1.f1.mb2.m1.c1.attiny add radiobutton -variable mcutype \ + -label $mcu -command setmcu + } + "*" { + .f1.f1.mb2.m1.c1.other add radiobutton -variable mcutype \ + -label $mcu -command setmcu + } + } + } + } + + if {[info exists oformat]} { + menu .f1.f1.mb2.m1.c2 -tearoff 0 + + foreach f {srec ihex binary} { + .f1.f1.mb2.m1.c2 add radiobutton -variable oformat \ + -label $f -command setoformat + } + } + + if {[info exists optlevel]} { + menu .f1.f1.mb2.m1.c3 -tearoff 0 + + foreach f {0 1 s 2 3} { + .f1.f1.mb2.m1.c3 add radiobutton -variable optlevel \ + -label $f -command setoptlevel + } + } + + if {[info exists dformat]} { + menu .f1.f1.mb2.m1.c30 -tearoff 0 + + if {[info exists deftarget]} { + # We've got both, DEBUG and the default target selection. + # Join them into a single menu entry. + if {$dformat == "dwarf-2"} { + set debugidx 3 + } elseif {$deftarget == "none"} { + set debugidx 0 + } elseif {$deftarget == "coff"} { + set debugidx 1 + } elseif {$deftarget == "extcoff"} { + set debugidx 2 + } else { + set debugidx 0 + } + # Note that the order of the setdeftarget and setdformat + # calls below determines which of the edited fields will + # be displayed highlighted to the user. The last one + # wins. Thus, we highlight the stabs vs. dwarf-2 decision + # for the ELF formats, or the default build target for the + # COFF formats. + .f1.f1.mb2.m1.c30 add radiobutton \ + -variable debugidx -value 0 \ + -label "ELF/stabs (GDB/Insight)" \ + -command {set dformat "stabs"; set deftarget "none"; \ + setdeftarget; setdformat } + .f1.f1.mb2.m1.c30 add radiobutton \ + -variable debugidx -value 1 \ + -label "AVR-COFF (AVR Studio 3.x, VMLAB < 3.10)" \ + -command {set dformat "stabs"; set deftarget "coff"; \ + setdformat; setdeftarget } + .f1.f1.mb2.m1.c30 add radiobutton \ + -variable debugidx -value 2 \ + -label "AVR-ext-COFF (AVR Studio 4.07+, VMLAB 3.10+)" \ + -command {set dformat "stabs"; set deftarget "extcoff"; \ + setdformat; setdeftarget } + .f1.f1.mb2.m1.c30 add radiobutton \ + -variable debugidx -value 3 \ + -label {ELF/DWARF-2 (AVR Studio ELF, GDB [experimental])} \ + -command {set dformat "dwarf-2"; set deftarget "none"; \ + setdeftarget; setdformat } + } else { + foreach f {stabs dwarf-2} { + .f1.f1.mb2.m1.c30 add radiobutton -variable dformat \ + -label $f -command setdformat + } + } + } + + if {[info exists stdlevel]} { + menu .f1.f1.mb2.m1.c31 -tearoff 0 + + foreach f {c89 gnu89 c99 gnu99} { + .f1.f1.mb2.m1.c31 add radiobutton -variable stdlevel \ + -label $f -command setstdlevel + } + } + + if {[info exists printfopts]} { + menu .f1.f1.mb2.m1.c4 -tearoff 0 + + .f1.f1.mb2.m1.c4 add radiobutton -variable printfopts \ + -label "none/standard" -underline 0 -value "none" -command setprintfopts + .f1.f1.mb2.m1.c4 add radiobutton -variable printfopts \ + -label "minimalistic" -underline 0 -value "min" -command setprintfopts + .f1.f1.mb2.m1.c4 add radiobutton -variable printfopts \ + -label "floating point" -underline 0 -value "flt" -command setprintfopts + } + + if {[info exists scanfopts]} { + menu .f1.f1.mb2.m1.c41 -tearoff 0 + + .f1.f1.mb2.m1.c41 add radiobutton -variable scanfopts \ + -label "none/standard" -underline 0 -value "none" -command setscanfopts + .f1.f1.mb2.m1.c41 add radiobutton -variable scanfopts \ + -label "minimalistic" -underline 0 -value "min" -command setscanfopts + .f1.f1.mb2.m1.c41 add radiobutton -variable scanfopts \ + -label "floating point + %\[" -underline 0 -value "flt" -command setscanfopts + } + + if {[info exists extmemopts]} { + menu .f1.f1.mb2.m1.c42 -tearoff 0 + + .f1.f1.mb2.m1.c42 add radiobutton -variable extmemopts \ + -label "none" -underline 0 -value "none" -command setextmemopts + .f1.f1.mb2.m1.c42 add radiobutton -variable extmemopts \ + -label "variables & heap" -underline 0 -value "vars" -command setextmemopts + .f1.f1.mb2.m1.c42 add radiobutton -variable extmemopts \ + -label "heap only" -underline 0 -value "heap" -command setextmemopts + .f1.f1.mb2.m1.c42 add cascade -menu .f1.f1.mb2.m1.c42.c1 \ + -label "Ext. memory start" -underline 5 + .f1.f1.mb2.m1.c42 add cascade -menu .f1.f1.mb2.m1.c42.c2 \ + -label "Ext. memory size" -underline 14 + + menu .f1.f1.mb2.m1.c42.c1 -tearoff 0 + foreach m {0 1024 2048 4096 8192 16384 32768} { + if {$m == 0} { + set s "lowest possible" + set v 0 + } else { + set s [format {%d KB} [expr $m / 1024]] + set v [expr $m + $memoffset] + } + .f1.f1.mb2.m1.c42.c1 add radiobutton -variable extmemstart \ + -label $s -value $v \ + -command setextmemopts + } + + menu .f1.f1.mb2.m1.c42.c2 -tearoff 0 + foreach m {1024 2048 4096 8192 16384 32768 65536} { + set s [format {%d KB} [expr $m / 1024]] + .f1.f1.mb2.m1.c42.c2 add radiobutton -variable extmemsize \ + -label $s -value [expr $m] \ + -command setextmemopts + } + } + + if {[info exists deftarget] && ! [info exists dformat]} { + menu .f1.f1.mb2.m1.c5 -tearoff 0 + + .f1.f1.mb2.m1.c5 add radiobutton -variable deftarget \ + -label "standard (ELF + ihex/srec/binary)" -underline 0 \ + -value "none" -command setdeftarget + .f1.f1.mb2.m1.c5 add radiobutton -variable deftarget \ + -label "AVR \"Extended\" COFF (AVR Studio 4.07+, VMLAB 3.10+)" -underline 6 \ + -value "extcoff" -command setdeftarget + .f1.f1.mb2.m1.c5 add radiobutton -variable deftarget -underline 4 \ + -label "AVR COFF (AVR Studio 3.x, VMLAB < 3.10)" \ + -value "coff" -command setdeftarget + } + + if {[info exists avrdudeprog]} { + menu .f1.f1.mb2.m1.c6 -tearoff 0 + + foreach p [lsort {dasa3 dasa ponyser dapa xil futurlec \ + abcmini picoweb sp12 alf bascom dt006 \ + pony-stk200 stk200 pavr jtag2 jtag2fast \ + jtag2slow jtagmkII jtagmkI avr911 avr109 \ + butterfly avr910 stk500v2 stk500 avrisp2 \ + avrispv2 avrisp bsd }] { + .f1.f1.mb2.m1.c6 add radiobutton -variable avrdudeprog \ + -label $p -command setavrdudeprog + } + } + + if {[info exists portlist] && [info exists avrdudeport]} { + menu .f1.f1.mb2.m1.c7 -tearoff 0 + + foreach p $portlist { + .f1.f1.mb2.m1.c7 add radiobutton -variable avrdudeport \ + -label $p -command setavrdudeport + } + } + +} + +proc writefile {fname} { + global backupsuffix makefile modified + + if {[file exists $fname]} { + file rename -force $fname "$fname$backupsuffix" + } + set makefile [.f1.f2.f1.t1 get 1.0 end] + set f [open $fname "w"] + puts $f $makefile + close $f + set modified 0 +} + +proc about {} { + toplevel .about + + set x [winfo pointerx .] + set y [winfo pointery .] + if {$x != -1 && $y != -1} { + wm geometry .about "+[expr $x - 250]+[expr $y - 100]" + } + wm title .about {About Mfile} + wm resizable .about 0 0 + + frame .about.f1 + message .about.f1.m1 \ + -relief sunken \ + -width 500 \ + -text \ +{Mfile - Simple Makefile generator for AVR-GCC + +Copyright © 2003,2004 Jörg Wunsch + +$Revision: 1.46 $ $Date: 2006/01/19 13:20:51 $ + +"THE BEER-WARE LICENSE" (Revision 42) (by Poul-Henning Kamp): +Joerg Wunsch <j.gnu@uriah.heep.sax.de> wrote this file. As long as you +retain this notice you can do whatever you want with this stuff. If we meet +some day, and you think this stuff is worth it, you can buy me a beer +in return.} + button .about.f1.ok -command {destroy .about} -text {OK} + + pack configure .about.f1.m1 -side top + pack configure .about.f1.ok -side bottom + pack configure .about.f1 + + tkwait window .about +} + +proc setmcu {} { + global mcutype + global editwidget + global highlight modified + global extmemmentry extmemparts extmemstart extmemopts + + set r1 [.f1.f2.f1.t1 search -regexp "^MCU = " 1.0] + if {$r1 == ""} { + complain "Oops, MCU not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, MCU not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + .f1.f2.f1.t1 insert $r2 "MCU = $mcutype" + .f1.f2.f1.t1 configure -state $editwidget + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, MCU not found" + return + } + + if {[info exists extmemopts]} { + if {[info exists extmemparts($mcutype)]} { + .f1.f1.mb2.m1 entryconfigure $extmemmentry -state normal + if {$extmemstart == ""} { + set extmemstart 0 + } + if {$extmemstart == 0 || \ + [expr $extmemparts($mcutype) == $extmemstart]} { + # extmemstart == 0 means "lowest possible value" + set extmemstart 0 + setextmemopts + } + } else { + .f1.f1.mb2.m1 entryconfigure $extmemmentry -state disabled + } + } + + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight + .f1.f2.f1.t1 see $r1 +} + +proc setoformat {} { + global oformat + global editwidget + global highlight modified + + set r1 [.f1.f2.f1.t1 search -regexp "^FORMAT = " 1.0] + if {$r1 == ""} { + complain "Oops, FORMAT not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, FORMAT not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + .f1.f2.f1.t1 insert $r2 "FORMAT = $oformat" + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, FORMAT not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc setoptlevel {} { + global optlevel + global editwidget + global highlight modified + + set r1 [.f1.f2.f1.t1 search -regexp "^OPT = " 1.0] + if {$r1 == ""} { + complain "Oops, OPT not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, OPT not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + .f1.f2.f1.t1 insert $r2 "OPT = $optlevel" + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, OPT not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc setdformat {} { + global dformat + global editwidget + global highlight modified + + set r1 [.f1.f2.f1.t1 search -regexp "^DEBUG = " 1.0] + if {$r1 == ""} { + complain "Oops, DEBUG not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, DEBUG not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + .f1.f2.f1.t1 insert $r2 "DEBUG = $dformat" + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, DEBUG not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc setstdlevel {} { + global stdlevel + global editwidget + global highlight modified + + set r1 [.f1.f2.f1.t1 search -regexp "^CSTANDARD = " 1.0] + if {$r1 == ""} { + complain "Oops, CSTANDARD not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, CSTANDARD not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + .f1.f2.f1.t1 insert $r2 "CSTANDARD = -std=$stdlevel" + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, CSTANDARD not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc setdeftarget {} { + global deftarget + global editwidget + global highlight modified + + set r1 [.f1.f2.f1.t1 search -regexp "^build:" 1.0] + if {$r1 == ""} { + complain "Oops, default target not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, default target not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + set line [.f1.f2.f1.t1 get $r1 $r2] + if {[regexp {^(.*) (ext)?coff} $line dummy d]} { + set line $d + } else { + regsub {^(.*)} $line {\1} line + } + switch $deftarget { + "coff" { + set line "$line coff" + } + "extcoff" { + set line "$line extcoff" + } + "none" { + set line "$line" + } + } + .f1.f2.f1.t1 delete $r1 $r2 + .f1.f2.f1.t1 insert $r2 "$line" + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, default target not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc setprintfopts {} { + global printfopts + global editwidget + global highlight modified + + set r1 [.f1.f2.f1.t1 search -regexp "^PRINTF_LIB = " 1.0] + if {$r1 == ""} { + complain "Oops, PRINTF_LIB not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, PRINTF_LIB not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + switch $printfopts { + "none" { + set line "PRINTF_LIB = " + } + "min" { + set line "PRINTF_LIB = \$(PRINTF_LIB_MIN)" + } + "flt" { + set line "PRINTF_LIB = \$(PRINTF_LIB_FLOAT)" + } + } + .f1.f2.f1.t1 insert $r2 "$line" + + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, PRINTF_LIB not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc setscanfopts {} { + global scanfopts + global editwidget + global highlight modified + + set r1 [.f1.f2.f1.t1 search -regexp "^SCANF_LIB = " 1.0] + if {$r1 == ""} { + complain "Oops, SCANF_LIB not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, SCANF_LIB not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + switch $scanfopts { + "none" { + set line "SCANF_LIB = " + } + "min" { + set line "SCANF_LIB = \$(SCANF_LIB_MIN)" + } + "flt" { + set line "SCANF_LIB = \$(SCANF_LIB_FLOAT)" + } + } + .f1.f2.f1.t1 insert $r2 "$line" + + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, SCANF_LIB not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc setextmemopts {} { + global extmemsize extmemstart extmemopts + global extmemmax extmemparts extmemmentry memoffset + global mcutype + global editwidget + global highlight modified + + set r1 [.f1.f2.f1.t1 search -regexp "^EXTMEMOPTS *=" 1.0] + if {$r1 == ""} { + complain "Oops, EXTMEMOPTS not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, EXTMEMOPTS not found" + return + } + if {$extmemopts != "none"} { + if {![info exists extmemsize]} { + set extmemsize [expr $extmemmax + 1 - $memoffset] + } elseif {$extmemsize == 0 || $extmemsize == ""} { + set extmemsize [expr $extmemmax + 1 - $memoffset] + } + if {![info exists extmemstart]} { + set extmemstart 0 + } elseif {$extmemstart == 0 || $extmemstart == ""} { + set extmemstart 0 + } + if {[expr $extmemstart] == 0} { + set m $extmemparts($mcutype) + } else { + set m [expr $extmemstart] + } + set xstart [format {0x%x} [expr $m]] + if {[expr $memoffset + $extmemsize] == [expr $extmemmax + 1]} { + set xend [format {0x%x} [expr $extmemmax]] + } else { + set xend [format {0x%x} [expr $m + $extmemsize - 1]] + } + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + switch $extmemopts { + "none" { + set line "EXTMEMOPTS = " + } + "vars" { + set line "EXTMEMOPTS = -Wl,--section-start,.data=$xstart,--defsym=__heap_end=$xend" + } + "heap" { + set line "EXTMEMOPTS = -Wl,--defsym=__heap_start=$xstart,--defsym=__heap_end=$xend" + } + } + .f1.f2.f1.t1 insert $r2 "$line" + + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, EXTMEMOPTS not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc setmainfile {} { + global mainfile + global editwidget + global highlight modified + + set mainfile [ask $mainfile "Main file"] + + set r1 [.f1.f2.f1.t1 search -regexp "^TARGET = " 1.0] + if {$r1 == ""} { + complain "Oops, TARGET not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, TARGET not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + .f1.f2.f1.t1 insert $r2 "TARGET = $mainfile" + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, TARGET not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc setmakefile {} { + global basename + global editwidget + global highlight modified + + set r1 [.f1.f2.f1.t1 search -regexp "^MAKEFILE\\s*=" 1.0] + if {$r1 == ""} { + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, MAKEFILE not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + .f1.f2.f1.t1 insert $r2 "MAKEFILE = $basename" + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, MAKEFILE not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc setasrc {} { + global asrc + global editwidget + global highlight modified + + set asrc [ask $asrc "Assembler source file(s)"] + + set r1 [.f1.f2.f1.t1 search -regexp "^ASRC = " 1.0] + if {$r1 == ""} { + complain "Oops, ASRC not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, ASRC not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + .f1.f2.f1.t1 insert $r2 "ASRC = $asrc" + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, ASRC not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc setavrdudeprog {} { + global avrdudeprog + global editwidget + global highlight modified + + set r1 [.f1.f2.f1.t1 search -regexp "^AVRDUDE_PROGRAMMER = " 1.0] + if {$r1 == ""} { + complain "Oops, AVRDUDE_PROGRAMMER not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, AVRDUDE_PROGRAMMER not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + .f1.f2.f1.t1 insert $r2 "AVRDUDE_PROGRAMMER = $avrdudeprog" + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, AVRDUDE_PROGRAMMER not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc setavrdudeport {} { + global avrdudeport + global editwidget + global highlight modified + + set r1 [.f1.f2.f1.t1 search -regexp "^AVRDUDE_PORT = " 1.0] + if {$r1 == ""} { + complain "Oops, AVRDUDE_PORT not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, AVRDUDE_PORT not found" + return + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + .f1.f2.f1.t1 insert $r2 "AVRDUDE_PORT = $avrdudeport" + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, AVRDUDE_PORT not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc complain {text} { + if {[winfo exists .complain]} { + return + } + toplevel .complain + set x [winfo pointerx .] + set y [winfo pointery .] + if {$x != -1 && $y != -1} { + wm geometry .complain "+$x+$y" + } + wm title .complain {Error} + wm resizable .complain 0 0 + + message .complain.m1 -text $text + button .complain.ok -text {OK} -command {destroy .complain} + + pack .complain.m1 + pack .complain.ok + + tkwait window .complain +} + +proc ask {val text} { + global askval + + if {[winfo exists .ask]} { + return + } + + toplevel .ask + set x [winfo pointerx .] + set y [winfo pointery .] + if {$x != -1 && $y != -1} { + wm geometry .ask "+$x+$y" + } + wm title .ask $text + wm resizable .ask 0 0 + + set askval $val + + frame .ask.f1 + label .ask.f1.l1 -text "$text:" + entry .ask.f1.e1 -width 20 -relief sunken -textvariable askval + + frame .ask.f2 + button .ask.f2.b1 -text {OK} -command {destroy .ask} + + pack configure .ask.f1.l1 -side left + pack configure .ask.f1.e1 -side left + pack configure .ask.f1 + pack configure .ask.f2.b1 -side top + pack configure .ask.f2 + + bind .ask.f1.e1 <Key-Return> {destroy .ask} + + tkwait window .ask + + return $askval +} + +proc asksrc {} { + global src mainfilesrc mainfile + global editwidget + global highlight modified + + if {[winfo exists .ask]} { + return + } + + toplevel .ask + set x [winfo pointerx .] + set y [winfo pointery .] + if {$x != -1 && $y != -1} { + wm geometry .ask "+$x+$y" + } + wm title .ask {Source files} + wm resizable .ask 1 0 + + frame .ask.f1 + frame .ask.f1.f1 + label .ask.f1.f1.l1 -text "C/C++ source file(s):" + entry .ask.f1.f1.e1 -width 20 -relief sunken -textvariable src + button .ask.f1.f1.b1 -text "Choose file..." \ + -command { + global src + set x [tk_getOpenFile -filetypes { + {{C source files} {.c}} + {{C++ source files} {.C .cc .cxx}} + {{All files} *} + }] + if {$x != ""} { + set rootname [lindex [file split [pwd]] 0] + if {[string range $x 0 [expr [string length $rootname] - 1]] \ + == $rootname} { + # Try finding common path name components to the + # current working directory. If found, eliminate + # them. + set y [pwd] + set prefix "." + while {[expr [string first $y $x] == -1]} { + set y [file dirname $y] + if {$prefix == "."} { + set prefix ".." + } else { + set prefix "../${prefix}" + } + } + if {$y != $rootname} { + # If more than the root directory name + # remained, replace it. + set commonlen [string length $y] + set x [string range $x $commonlen end] + set x "${prefix}${x}" + } + } + set src "$src $x" + } + focus .ask + wm deiconify .ask + if {[string length $src]} { + # let the entry widget auto-size + .ask.f1.f1.e1 configure -width 0 + } + } + frame .ask.f1.f2 + checkbutton .ask.f1.f2.cb1 -variable mainfilesrc + label .ask.f1.f2.l1 -text "Include ${mainfile}.c" + button .ask.f1.f2.b1 -text {OK} -command {destroy .ask} + + pack configure .ask.f1.f1.l1 -side left + pack configure .ask.f1.f1.e1 -side left -expand y -fill x + pack configure .ask.f1.f1.b1 -side left + pack configure .ask.f1.f1 -side top -anchor nw -expand y -fill x + pack configure .ask.f1.f2.cb1 -side left + pack configure .ask.f1.f2.l1 -side left + pack configure .ask.f1.f2.b1 -side right + pack configure .ask.f1.f2 -side top -anchor nw -expand y -fill x + pack configure .ask.f1 -expand y -fill x + + bind .ask.f1.f1.e1 <Key-Return> {destroy .ask} + focus .ask + + tkwait window .ask + + set r1 [.f1.f2.f1.t1 search -regexp "^SRC = " 1.0] + if {$r1 == ""} { + complain "Oops, SRC not found" + return + } + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, SRC not found" + return + } + + if {$mainfilesrc != 0} { + set s "\$(TARGET).c $src" + } else { + set s "$src" + } + set modified 1 + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete $r1 $r2 + .f1.f2.f1.t1 insert $r2 "SRC = $s" + .f1.f2.f1.t1 configure -state $editwidget + .f1.f2.f1.t1 see $r1 + set r2 [.f1.f2.f1.t1 search -regexp {$} $r1] + if {$r2 == ""} { + complain "Oops, SRC not found" + return + } + .f1.f2.f1.t1 tag delete highlight + .f1.f2.f1.t1 tag add highlight $r1 $r2 + .f1.f2.f1.t1 tag configure highlight -background $highlight +} + +proc changeeditable {} { + global editwidget modified + + if {$editwidget == "normal"} { + set modified 1 + } + .f1.f2.f1.t1 configure -state $editwidget +} + +proc openfile {} { + global filename basename + global modified + global asksavereply + global makefile editwidget + + if {$modified} { + if {[winfo exists .asksave]} { + return + } + toplevel .asksave + message .asksave.l1 -width 400 \ + -text "The current buffer has been modified.\n\nDiscard changes?" + frame .asksave.f1 + button .asksave.f1.ok -text {Yes} -command { + global asksavereply + set asksavereply 1 + destroy .asksave + } + button .asksave.f1.cancel -text {No} -command { + global asksavereply + set asksavereply 0 + destroy .asksave + } + + pack configure .asksave.l1 -side top + pack configure .asksave.f1.ok -side left + pack configure .asksave.f1.cancel -side left + pack configure .asksave.f1 -side top + + set x [winfo pointerx .] + set y [winfo pointery .] + if {$x != -1 && $y != -1} { + wm geometry .asksave "+$x+$y" + } + + tkwait window .asksave + + if {$asksavereply == 0} { + return + } + + set modified 0 + } + + set fn [tk_getOpenFile -initialfile $filename] + if {[string length $fn] > 0} { + parsetemplate $fn + makemfilemenu + + set filename $fn + catch "regsub {^.*/} $fn {} basename" + wm title . $basename + + .f1.f2.f1.t1 configure -state normal + .f1.f2.f1.t1 delete 1.0 end + .f1.f2.f1.t1 insert end $makefile + .f1.f2.f1.t1 configure -state $editwidget + + setmakefile + } +} + +proc saveas {} { + global filename basename + set fn [tk_getSaveFile -initialfile $filename] + if {[string length $fn] > 0} { + set filename $fn + catch "regsub {^.*/} $fn {} basename" + wm title . $basename + setmakefile + writefile $fn + } +} + +proc quit {force} { + global modified filename + + if {$modified} { + if {$force} { + # called from WM_SAVE_YOURSELF handler only -- no time + # to ask the luser back + wm protocol . WM_SAVE_YOURSELF {} + set modified 0 + writefile "${filename}.saved" + exit 0 + } + + if {[winfo exists .askquit]} { + return + } + toplevel .askquit + message .askquit.l1 -width 400 \ + -text "The current buffer has been modified.\n\nExit anyway?" + frame .askquit.f1 + button .askquit.f1.ok -text {Yes} -command { + wm protocol . WM_DELETE_WINDOW {} + wm protocol . WM_SAVE_YOURSELF {} + exit 0 + } + button .askquit.f1.cancel -text {No} -command {destroy .askquit} + + pack configure .askquit.l1 -side top + pack configure .askquit.f1.ok -side left + pack configure .askquit.f1.cancel -side left + pack configure .askquit.f1 -side top + + set x [winfo pointerx .] + set y [winfo pointery .] + if {$x != -1 && $y != -1} { + wm geometry .askquit "+$x+$y" + } + + tkwait window .askquit + } else { + exit 0 + } +} + +source "$prefix/htmlview.tcl" + +parsetemplate $templatename + +global editwidget +set editwidget disabled + +global modified +set modified 0 + +frame .f1 + +frame .f1.f1 + +# "File" menu +menubutton .f1.f1.mb1 -text File -underline 0 + +menu .f1.f1.mb1.m1 -tearoff 1 +.f1.f1.mb1.m1 add command -command {writefile $filename} \ + -label Save -underline 0 +.f1.f1.mb1.m1 add command -command {saveas} \ + -label {Save As...} -underline 5 +.f1.f1.mb1.m1 add command -command {openfile} \ + -label {Open...} -underline 0 +.f1.f1.mb1.m1 add separator +.f1.f1.mb1.m1 add command -command {quit 0} -label Exit -underline 1 + +.f1.f1.mb1 configure -menu .f1.f1.mb1.m1 + +# "Help" menu +menubutton .f1.f1.mbH -text Help -underline 0 + +menu .f1.f1.mbH.m1 -tearoff 1 +.f1.f1.mbH.m1 add command -command {htmlview $helpfile} \ + -label "Help..." -underline 0 +.f1.f1.mbH.m1 add separator +.f1.f1.mbH.m1 add command -command {about} -label "About..." -underline 0 + +.f1.f1.mbH configure -menu .f1.f1.mbH.m1 + +# "Makefile" menu +menubutton .f1.f1.mb2 -text Makefile -underline 0 +menu .f1.f1.mb2.m1 -tearoff 1 -disabledforeground blue3 +makemfilemenu + +frame .f1.f2 +frame .f1.f2.f1 +text .f1.f2.f1.t1 -height 25 -width 80 -wrap none \ + -yscrollcommand {.f1.f2.f1.s1 set} \ + -xscrollcommand {.f1.f2.s2 set} \ + -state $editwidget +scrollbar .f1.f2.f1.s1 -command {.f1.f2.f1.t1 yview} +scrollbar .f1.f2.s2 -orient horizontal -command {.f1.f2.f1.t1 xview} + +pack configure .f1.f1.mbH -side right +pack configure .f1.f1.mb1 -side left +pack configure .f1.f1.mb2 -side left +pack configure .f1.f1 -fill x -side top -anchor nw + +pack configure .f1.f2.f1.t1 -side left -expand y -fill both -anchor nw +pack configure .f1.f2.f1.s1 -side left -fill y -anchor nw +pack configure .f1.f2.f1 -side top -expand y -fill both -anchor nw +pack configure .f1.f2.s2 -side left -expand y -fill x -anchor nw +pack configure .f1.f2 -side top -expand y -fill both -anchor nw + +pack configure .f1 -side left -expand y -fill both -anchor nw + +update +set x [winfo width .] +set y [winfo height .] +wm minsize . $x $y + +# XBM icons look fairly stupid on Windows since the background will +# be rendered in black. Rather keep the standar Tk icon there. +if {$tcl_platform(platform) == "unix" && [file exists $mainicon]} { + wm iconbitmap . @$mainicon +} + +.f1.f2.f1.t1 configure -state normal +.f1.f2.f1.t1 insert end $makefile +.f1.f2.f1.t1 configure -state $editwidget + +bind . <Key-F1> {htmlview $helpfile} + +# When the text widget is in normal state, <Key-Prior> and <Key-Next> +# already work as expected, but they don't when it is in disabled +# state (since the widget doesn't get any focus then) so we override +# it globally here. While we are at it, bind <Key-Home> and <Key-End> +# as well. + +bind . <Key-Prior> ".f1.f2.f1.t1 yview scroll -10 units" +bind . <Key-Next> ".f1.f2.f1.t1 yview scroll 10 units" +bind . <Key-Home> ".f1.f2.f1.t1 yview moveto 0" +bind . <Key-End> ".f1.f2.f1.t1 yview moveto 1" + +wm protocol . WM_DELETE_WINDOW {quit 0} +wm protocol . WM_SAVE_YOURSELF {quit 1} diff --git a/temp/mfile/mfile.xbm b/temp/mfile/mfile.xbm new file mode 100644 index 0000000..7176f7f --- /dev/null +++ b/temp/mfile/mfile.xbm @@ -0,0 +1,14 @@ +#define mfile_width 32 +#define mfile_height 32 +static unsigned char mfile_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, + 0xc0, 0x03, 0xfc, 0x0f, 0xf0, 0x87, 0xff, 0x0f, 0xf8, 0xc7, 0xff, 0x00, + 0x3c, 0xee, 0x03, 0x00, 0x1c, 0xfc, 0x00, 0x00, 0x0c, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x7c, 0x00, 0x00, 0x1c, 0xfc, 0x00, 0x00, + 0x3c, 0xee, 0x03, 0x00, 0xf8, 0xc7, 0xff, 0x00, 0xf0, 0x87, 0xff, 0x0f, + 0xc0, 0x03, 0xfc, 0x0f, 0x00, 0x00, 0xc3, 0x03, 0x00, 0x00, 0x03, 0x00, + 0xda, 0x38, 0x9b, 0x03, 0xb6, 0x65, 0xcf, 0x06, 0xb6, 0x79, 0xc7, 0x07, + 0xb6, 0x6d, 0xcf, 0x00, 0xb6, 0x6d, 0xdb, 0x06, 0xb6, 0xd9, 0xb3, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; |