anet-checkins Mailing List for ANet (Page 2)
Status: Abandoned
Brought to you by:
benad
You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(6) |
Nov
(17) |
Dec
(29) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
(29) |
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Benoit N. <be...@us...> - 2002-01-01 22:55:56
|
Update of /cvsroot/anet/Documentation In directory usw-pr-cvs1:/tmp/cvs-serv12479 Modified Files: Doxyfile Log Message: Starting user documentation. Index: Doxyfile =================================================================== RCS file: /cvsroot/anet/Documentation/Doxyfile,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Doxyfile 2001/12/18 01:16:29 1.2 --- Doxyfile 2002/01/01 22:55:53 1.3 *************** *** 316,320 **** # certain files from those directories. ! EXCLUDE_PATTERNS = sample.c IMC.c StubModule.c ModuleLoader.c # The EXAMPLE_PATH tag can be used to specify one or more files or --- 316,320 ---- # certain files from those directories. ! EXCLUDE_PATTERNS = sample.c StubModule.c # The EXAMPLE_PATH tag can be used to specify one or more files or |
From: Benoit N. <be...@us...> - 2002-01-01 22:54:50
|
Update of /cvsroot/anet/Documentation/user/text In directory usw-pr-cvs1:/tmp/cvs-serv12216/text Log Message: Directory /cvsroot/anet/Documentation/user/text added to the repository |
From: Benoit N. <be...@us...> - 2002-01-01 22:54:40
|
Update of /cvsroot/anet/Documentation/user/latex In directory usw-pr-cvs1:/tmp/cvs-serv12188/latex Log Message: Directory /cvsroot/anet/Documentation/user/latex added to the repository |
From: Benoit N. <be...@us...> - 2002-01-01 22:54:25
|
Update of /cvsroot/anet/Documentation/user In directory usw-pr-cvs1:/tmp/cvs-serv12122/user Log Message: Directory /cvsroot/anet/Documentation/user added to the repository |
From: Christopher J. <cwj...@us...> - 2002-01-01 18:46:13
|
Update of /cvsroot/anet/Documentation/design/latex In directory usw-pr-cvs1:/tmp/cvs-serv31623 Modified Files: anetdesign.tex Log Message: Added Section 2. The document went throught a lot of changes. I use article now, I don't like the chapter headings from the report document class. We'll see how things go. There's still a lot of things I need to touch up. I think I want to add the introduction to anet stuff inside the document because some of the cross references won't make sens otherwise. Index: anetdesign.tex =================================================================== RCS file: /cvsroot/anet/Documentation/design/latex/anetdesign.tex,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** anetdesign.tex 2001/12/29 00:40:29 1.1 --- anetdesign.tex 2002/01/01 18:46:10 1.2 *************** *** 21,28 **** %=====================================================================% ! \documentclass[letterpaper]{report} \usepackage{latexsym} % Use special symbols. \usepackage{makeidx} % Make an index. ! \usepackage{url} \usepackage{appendix} %\usepackage{fancyhdr} %\usepackage{pandora} % use the pandora fonts, they seem more modern --- 21,29 ---- %=====================================================================% ! \documentclass[letterpaper]{article} \usepackage{latexsym} % Use special symbols. \usepackage{makeidx} % Make an index. ! \usepackage{url} ! \usepackage{appendix} %\usepackage{fancyhdr} %\usepackage{pandora} % use the pandora fonts, they seem more modern *************** *** 41,44 **** --- 42,46 ---- \parskip 1.5ex plus 1ex minus 0.5ex %\parindent 0em + % Let Latex write the pages headings. \pagestyle{headings} *************** *** 55,58 **** --- 57,71 ---- \newcommand{\la}{\mathopen{<}} \newcommand{\ra}{\mathopen{>}} + %environment used for the DTD's + \newsavebox{\fmbox} + \newenvironment{fmpage}[1] + {\begin{lrbox}{\fmbox}\begin{minipage}{#1}} + {\end{minipage}\end{lrbox}\fbox{\usebox{\fmbox}}} + + % \newsavebox{\fmbox} + % \newenvironment{fmpage}[1] + % {\begin{lrbox}{\fmbox}\begin{minipage}{#1}} + % {\end{minipage}\end{lrbox}\fbox{\usebox{\fmbox}}} + \newcounter{exnum} \newenvironment{example}[1]{\penalty-2000\vskip1.5\parskip *************** *** 72,94 **** \begin{document} \maketitle \tableofcontents ! \listoffigures \listoftables ! ! \begin{abstract} ! Blah Blah put all the ANet abstract here. ! \end{abstract} ! ! % Since I wanted an appendix and I thought we would combine both h-l & ! % l-l designs, I thought we would need more sectionning, thus came the ! % report document style and the \part. The problem is the \part ! % sectionning does not affect the counter in the table of contents, ! % resulting with section numbers 0.1, 0.2. In reports only the ! % the level above \section is \chapter. But the \chapter command makes ! % a big bold chapter heading like in a book ( we don't want that). ! % Anyways I'm leaving it there for the time being. I'll try to ! % figure something out later. ! ! \setcounter{chapter}{1} ! \part{High-Level Design} \label{part:hld} \index{high-level design} This is the High-Level Design for ANet. It presents a non-technical view of the different components of ANet, how they work, how they --- 85,100 ---- \begin{document} \maketitle + \clearpage + \pagenumbering{roman} \tableofcontents ! \listoffigures ! \listoftables ! %do we need an abstract? ! %\clearpage ! %\begin{abstract} ! %Blah Blah put all the ANet abstract here. ! %\end{abstract} ! \clearpage ! \pagenumbering{arabic} This is the High-Level Design for ANet. It presents a non-technical view of the different components of ANet, how they work, how they *************** *** 116,120 **** direction. ! \subsubsection{What is a Module?} A module is an isolated group of code that can have one or more running instances in the ANet daemon. It is isolated by not being --- 122,126 ---- direction. ! \subsubsection{What is a Module?} \index{module} A module is an isolated group of code that can have one or more running instances in the ANet daemon. It is isolated by not being *************** *** 177,181 **** memory, mark it as temporary so its memory could be freed if memory is tight, and so on.\footnote{This was ``inspired'' by, you know ! \ldots\cite{macmem}} Second, whenever a function in a module is called, the module instance --- 183,187 ---- memory, mark it as temporary so its memory could be freed if memory is tight, and so on.\footnote{This was ``inspired'' by, you know ! \ldots\cite{applemem}} Second, whenever a function in a module is called, the module instance *************** *** 194,199 **** system: \begin{description} ! \item Files: create, open, read, write, close and delete. ! \item Directories: create, read, delete \end{description} Once opened, files and directories are identified by an ID. The files --- 200,205 ---- system: \begin{description} ! \item[Files]: create, open, read, write, close and delete. ! \item[Directories]: create, read, delete \end{description} Once opened, files and directories are identified by an ID. The files *************** *** 203,207 **** \item[UNIX] \verb|/directory/directory/.../file.| \\Up one directory: .. \item[MacOS] \verb|Disk:folder:folder:...:file.| \\Up one directory: :: ! \item[Win32] \verb|Disk:\directory\directory\...\file.ext.| \\Upone directory: .. \end{description} --- 209,213 ---- \item[UNIX] \verb|/directory/directory/.../file.| \\Up one directory: .. \item[MacOS] \verb|Disk:folder:folder:...:file.| \\Up one directory: :: ! \item[Win32] \verb|Disk:\directory\directory\...\file.ext.|\\Up one directory: .. \end{description} *************** *** 270,276 **** information through function calls in ways that are not explicitly required by the wrapper. Basically, an instance tells the wrapper ``I ! want to call function X with arguments Y in module instance M''. ! Then, the wrapper will call a function in M that will return true only ! if, for the given information from the calling instance, M accepts to get called by the other module. Then, if that's the case, then function will be called with the arguments. --- 276,282 ---- information through function calls in ways that are not explicitly required by the wrapper. Basically, an instance tells the wrapper ``I ! want to call function $X$ with arguments $Y$ in module instance $M$''. ! Then, the wrapper will call a function in $M$ that will return true only ! if, for the given information from the calling instance, $M$ accepts to get called by the other module. Then, if that's the case, then function will be called with the arguments. *************** *** 302,313 **** \subsection{DTD} See the complete DTD for more information see \xs{sec:dtd}. \begin{verbatim} ! <!-- Root element --> <!ELEMENT ANet (ClientConnection)+, BandwidthManager, (ClusterGroup)+, CoreModules, (Cluster)+> <!ATTLIST ANet %security;> \end{verbatim} \section{Client Connection Modules} \label{sec:ccm} ! Communication bridge between the ANet daemon and the clients. \section{Data Transformation Modules} \label{sec:dtm} Transform some data. --- 308,498 ---- \subsection{DTD} See the complete DTD for more information see \xs{sec:dtd}. + + \begin{figure}[!h] + \begin{fmpage}{\textwidth} \begin{verbatim} ! <!-- Root element --> ! <!ELEMENT ANet (ClientConnection)+, BandwidthManager, (ClusterGroup)+, CoreModules, ! (Cluster)+> <!ATTLIST ANet %security;> \end{verbatim} + \end{fmpage} + \caption{The Run Time Wrapper DTD} \label{fig:rtwdtd} + \end{figure} \section{Client Connection Modules} \label{sec:ccm} ! The Client Connection Modules act as a communication bridge between ! the various programs that use the ANet networks (the clients) and the ! program that manages the network (the ANet daemon). ! ! \subsection{Design} ! \subsubsection{Clients and Daemon} ! From the point of view of its architecture, ANet is actually several ! programs. Only one program manages the network: the ANet ! daemon\footnote{You can have more than one ANet daemon in the same ! machine, but why? ANet is flexible enough to allow isolated network to ! coexist in the same system.}. It is consisting of the run-time wrapper ! \xs{sec:rtw} and of different modules. The daemon itself does not ! ``use'' the network. The programs that want to use an ANet network ! will have to communicate with the daemon in order to do so. Those ! programs are the ANet Clients. ! ! The major advantage of doing so is that each time a developer wants to ! implement a new application for an anonymous network, that person does ! not need to re-implement the entire protocol again. This is similar to ! TCP, since it is being implemented in the operating system, the ! programmers won't have to re-implement TCP for each program that will ! be using it. ! ! \subsubsection{Services} ! Since ANet is a protocol, it doesn't know what kind of data it is ! distributing. So, the same network could be used for completely ! different things, yet it is not aware of it. ! ! But then, the clients ultimately care about what kind of data they are ! going to send and receive. As a result, each packet of information ! will be identified by a Service Number. A Service is a specific use of ! the network, and as a result, a group of information that can be ! consistently created, analyzed and modified. This is similar to a ! "port" in IP\cite{uscip}. ! ! \subsubsection{Interaction Summary} ! The Clients Connection Modules are modules that fully represent, by ! themselves, entire clients. Downwards \xs{sec:rtw}, they receive ! commands\footnote{This what inspired by HyperTalk, the programming ! language of HyperCard\cite{applehyp}. Here's an example: ask "What is your name?" ! if the result is "Benad" then answer "Wow! I have the same name!" ! Here, "ask" and "answer" are commands, while "the result" is a ! function and "is" is an operator. This is not a joke! } from the ! clients and they transfer them downwards in the daemon. Upwards ! \xs{sec:rtw}, they receive relevent data from the rest of the daemon ! and they tranfer that data to the proper clients. ! ! Here is a summary of the interaction between a client, its client ! connection module and the daemon within a session, from a high-level ! point of view. ! ! \begin{itemize} ! \item The user starts the ANet daemon. Thus, the clent connection ! module is started. ! \item The user starts the ANet client. ! \item The client connects itself to the client connection module. ! \item The client registers the services it will use. The client can ! receive and send data only for the services it registered for. ! \item The client connection module sends those registration requests ! to the rest of the daemon. Registration is actually made for the ! client connection module, so if more than one client connect to the ! module, then it has to remember which client requested what services. ! \item The client starts sending some commands to the client connection ! module, and the module in turn sends the commands to the rest of the ! daemon. ! \item For all the data received from the network that have service ! numbers registered by the client connetion module, the daemon makes a ! copy of the data and sends it to the module. Also, for all commands ! that returns some value, the daemon sends the resulting data to the ! client connection module. ! \item As it receives data from the rest of the daemon, the client ! connection module sends the data to the client (or the proper clients, ! if more than one client requested the same service or made the same ! command). ! \end{itemize} ! ! \subsubsection{Commands} ! Here is a list of commands that can be sent downwards by a client ! connection module to the rest of the daemon. ! ! \begin{description} ! \item[Register/Unregister service] Given some service number, it ! registers that service for its calling module instance. You can also ! unregister some service you don't want to use anymore. If you pass a ! flag saying ``all services'', then the service number given will be ! ignored and all possible service numbers will be registered or ! unregistered. If you register all services, all other calls to this ! command will be ignored except the next ``unregister all services'' ! command. ! \item[Send packet] Sends an ANet packet, query[3] or static data[4], ! to the ANet network. The cluster group[5] where the packet will be ! sent has to be specified. Use the "Get Config" command (read below) to ! know which cluster groups you can use. The format of the "internal ! ANet packet" will be described in "Cluster Group Modules"[5]. ! \item[Get Status] Will make the ANet daemon return a packet describing ! its current status. The contents of this packet will be implementation ! specific and outside the scope of the high-level design, though it ! will contain enough relevant information to let the user know what's ! going on in the daemon. ! \item[Get Status - Start/Stop polling] From the time the daemon gets ! the "Start Polling" command to the time it gets the "Stop Polling" ! command, the daemon will regularly send status packets the the client ! connection module. This is usefull for clients that want to monitor ! the status of the ANet daemon. With the "Start Polling" command, you ! can also specify what is the delay between when ANet will send the ! status packets, though if that value is too small, the command will be ! ignored. ! \item[Get Static Data] Given a primary and/or the secondary key, this ! will make ANet return all the static packets currectly stored locally ! that matches the key (or keys). ! \item[Change/Delete Static Data] Those commands will allow the module ! to change or delete some static packets currently stored locally. ! \item[Open TWDTC] Given the protocol, the ``unique address'' and the ! "subnet" of the other node, ANet will try to establish a Two-Way Data ! Transfer [3] Channel (TWDTC) to the other node through the network. If ! ANet didn't already find which node to use as a proxy (that can have ! access to the protocol and subnet you specified), it might take some ! time to establich the connection. Use the ``Get status'' commands to ! know what's going on. ANet will return a packet containing an ID that ! can be used to identify the TWDTC with the other TWDTC commands. ! \item[Read/Write TWDTC] Read or write some data in the TWDTC. This is ! similar to reading or writing data in a TCP socket. ! \item[Close TWDTC] Given an open TWDTC ID\footnote{If you know what ! "TWDTC ID" means, then you're ready to be a developer for ANet!}, ! closes the identified channel. ! \item[Get Config] Returns the readeable tags in the configuration ! files \xs{sec:rtw}. Each tag in the configuration files can have ! access rights, that is read, write or both. If specified, it affects ! the tag, and recursively overwriting the access rights of the tags it ! contain. Otherwise, they remain to their default value. ! \item[Change Config] Allows the client connection module to change ! tags in the configuration file, it it has the right to do so. The ! change can be saved to the hard disk, instead of being temporary, if ! the user has configured ANet to do so. ! \end{description} + \subsection{Implementation Notes} + There is no point of making one instance of the client connection + module per connection to a client. Most instances should be made + before having any connection to clients. Note that an instance cannot + "instantiate itself" as the daemon receives a connection: the instance + should exist to make whatever kind of connection it supports. A + client connection module doesn't have to allow all the commands + allowed the the daemon. Actually, those modules can be very + sophisticated, for example gateways[7] + + \subsection{DTD} + See the complete DTD for more information. + + \begin{figure}[!h] + \begin{fmpage}{\textwidth} + \begin{verbatim} + <!-- Client Connection Module --> + <!ELEMENT ClientConnection EMPTY> + <!ATTLIST ClientConnection %moduleName; %args; %security;> + \end{verbatim} + \end{fmpage} + \caption{The Client Connection Module DTD} \label{fig:ccmdtd} + \end{figure} + + % References + + % About the references... + + % [1] Benad: "Run-Time Wrapper". Local link. + % [2] University of Southern California , "Internet Protocol". External link. Cached. + % [3] Benad: "Queries". Local link. + % [4] Benad: "Static Data". Local link. + % [5] Benad: "Gateways and Clusters". Local link. + % [6] Benad: "Anonymous Two-Way Data Transfers". Local link. + % [7] Benad: "Gateways and Clusters". Local link. + % [8] Apple: HyperCard. External link. + \section{Data Transformation Modules} \label{sec:dtm} Transform some data. *************** *** 343,356 **** \section{Document Type Definition (DTD)} \label{sec:dtd} This is the DTD file for the ANet configuration files. - - \setcounter{chapter}{2} - \part{Low-Level Design} - %\chapter{Low-Level Design} - \bibliographystyle{plain} \bibliography{anet} \appendix \appendixpage \addappheadtotoc ! \chapter{Graphs} \begin{figure}[!h] \begin{center} --- 528,539 ---- \section{Document Type Definition (DTD)} \label{sec:dtd} This is the DTD file for the ANet configuration files. + \clearpage + \pagenumbering{roman} \appendix \appendixpage \addappheadtotoc ! \section{Graphs} ! \begin{figure}[!h] \begin{center} *************** *** 360,363 **** --- 543,551 ---- \end{figure} + \clearpage + \bibliographystyle{plain} + \bibliography{anet} + + \clearpage \printindex \end{document} |
From: Christopher J. <cwj...@us...> - 2001-12-29 00:40:34
|
Update of /cvsroot/anet/Documentation/design/latex In directory usw-pr-cvs1:/tmp/cvs-serv20957/design/latex Added Files: Makefile anet.bib anetdesign.tex appendix.sty daemon.eps url.sty Log Message: Initial checkin of latex design docs --- NEW FILE: Makefile --- # Christopher Jensen # Makefile that produces documents in many formats # Sep 9, 2001 PROJECT=anetdesign BIBFILE=anet.bib TEXFILE=$(PROJECT).tex DVIFILE=$(PROJECT).dvi PSFILE=$(PROJECT).ps all: dvi dvi: latex $(TEXFILE) latex $(TEXFILE) bibtex $(PROJECT) makeindex $(PROJECT) latex $(TEXFILE) latex $(TEXFILE) ps: dvi dvips $(DVIFILE) -o $(PSFILE) pdf: dvi ps2pdf $(PSFILE) html: dvi latex2html -transparent $(TEXFILE) zip: tar cvzf $(PROJECT).tgz $(TEXFILE) $(BIBFILE) Makefile clean: rm *.cache *~ *.dvi *.toc *.bbl *.blg *.ilg *.ind *.idx *.lof *.log *.lot *.toc *.aux $(PSFILE) *.pdf -rf $(PROJECT)/ --- NEW FILE: anet.bib --- % file: anet.bib % ANet bibtex file % Note: there is no special entry-type for web sites. % Misc is recommended by http://www.tex.ac.uk/cgi-bin/texfaq2html?question=89 % To typeset url's you will need the url.sty package that should be provided with the source % The makefile should take care of generating the bibliography correctly. @Misc{w3xml, OPTkey = {}, OPTauthor = {}, title = {The World Wide Web Consortium: ``Extensible Markup Language (XML)''}, howpublished = {\url"http://www.w3.org/XML"}, OPTmonth = {}, OPTyear = {}, OPTnote = {}, OPTannote = {} } @Misc{macmem, OPTkey = {}, OPTauthor = {}, title = {Inside Macintosh: Memory}, howpublished = {\url"http://developer.apple.com/techpubs/mac/Memory/Memory-2.html"}, OPTmonth = {}, OPTyear = {}, OPTnote = {}, OPTannote = {} } @Misc{perl, OPTkey = {}, OPTauthor = {}, title = {Perl Mongers}, howpublished = {\url"http://www.perl.org"}, OPTmonth = {}, OPTyear = {}, OPTnote = {}, OPTannote = {} } --- NEW FILE: anetdesign.tex --- %===================================================================== % Christopher Jensen % file: highdesign.tex % latex source file % %===================================================================== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Editing Rules % % - If you add macros document them. % - If you use packages don't forget to add them in the directory. % - Please make your editor wrap the text. It's easier to read. I % speak for myself, I like having a split screen with 2 views on the % document. Under emacs this easily done with the auto-fill-mode. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %=====================================================================% % Preamble % % % %=====================================================================% \documentclass[letterpaper]{report} \usepackage{latexsym} % Use special symbols. \usepackage{makeidx} % Make an index. \usepackage{url} \usepackage{appendix} %\usepackage{fancyhdr} %\usepackage{pandora} % use the pandora fonts, they seem more modern \usepackage{concrete} \usepackage[dvips]{graphicx} % needed to load the correct driver when including graphics \makeindex % Dimensions for 8.5" x 11" paper \textwidth 6.5in \textheight 9in % The default top margin is 1". The following command adjusts it to 0.5". \topmargin -0.5in % There are two margin widths to allow for two-sided printing. \oddsidemargin 0pt \evensidemargin 0pt \topmargin 0pt % \parskip is the vertical space between paragraphs. % \parindent is the horizontal indentation at the beginning of a paragraph. \parskip 1.5ex plus 1ex minus 0.5ex %\parindent 0em % Let Latex write the pages headings. \pagestyle{headings} % Number all sections, but include only section and subsections in the ToC. \setcounter{secnumdepth}{5} \setcounter{tocdepth}{2} % Cross-reference commands. \newcommand{\xf}[1]{Figure~\ref{#1}} \newcommand{\xp}[1]{page~\pageref{#1}} \newcommand{\xs}[1]{Section~\ref{#1}} \newcommand{\xa}[1]{Appendix~\ref{#1}} \newcommand{\tx}{\TeX} \newcommand{\ltx}{\LaTeX2e} \newcommand{\la}{\mathopen{<}} \newcommand{\ra}{\mathopen{>}} \newcounter{exnum} \newenvironment{example}[1]{\penalty-2000\vskip1.5\parskip \refstepcounter{exnum}{\bfseries Example \arabic{exnum}: #1}% \penalty 10000\vskip0.5\parskip}% {$\Box$} % New environments defined specifically for this document. \newenvironment{prog}{\def\-{\hskip 1em}\penalty-1000\vskip\parskip \parskip0pt\leftskip2em\obeylines\ttfamily}{\par} \title{ANet Software Design Document} \author{Benoit Nadeau\thanks{thanks to Christopher Jensen for porting the HTML documentation to beautiful \ltx}} \date{\today} \begin{document} \maketitle \tableofcontents \listoffigures \listoftables \begin{abstract} Blah Blah put all the ANet abstract here. \end{abstract} % Since I wanted an appendix and I thought we would combine both h-l & % l-l designs, I thought we would need more sectionning, thus came the % report document style and the \part. The problem is the \part % sectionning does not affect the counter in the table of contents, % resulting with section numbers 0.1, 0.2. In reports only the % the level above \section is \chapter. But the \chapter command makes % a big bold chapter heading like in a book ( we don't want that). % Anyways I'm leaving it there for the time being. I'll try to % figure something out later. \setcounter{chapter}{1} \part{High-Level Design} \label{part:hld} \index{high-level design} This is the High-Level Design for ANet. It presents a non-technical view of the different components of ANet, how they work, how they interact with each other and how they will be implemented. \section{Run-Time Wrapper} \label{sec:rtw} \index{run-time wrapper} Manages the creation, destruction and the communication of the different modules of ANet. Makes an abstraction of memory and file management. Maitains configuration files. \subsection{Design} \subsubsection{The Wrapper} \index{wrapper} The ``wrapper'' is, simply said, the program that the user has to launch to run the ANet daemon. Actually, is is the running program, because it controls the data flow inside the daemon. The actual implementation in done within what we call ``Modules'', so the wrapper has to load, set-up and run those modules. Also, it has to transfer the data between the different modules. The wrapper might run as a single thread. Thus, any long Input/Output should be done asynchronously, or the whole process will be blocked. The data flow is done in ``passes'', in two directions: upwards, from the network to the client interface, and downwards, in the other direction. \subsubsection{What is a Module?} A module is an isolated group of code that can have one or more running instances in the ANet daemon. It is isolated by not being able to make any assumption about its environment, other than the run-time wrapper and the other modules it is allowed to communicate with. A module can be stored in a static library, a dynamic loading library (DLL) or compiled with the rest of the daemon. A module can have multiple running instances in the daemon by having more than one ``context''. The context is some global data, unique for each different instance, and maintained by the wrapper. \subsubsection{Loading Modules} First, the wrapper has to load the code of the module. It does so by assuming that all modules will implement a function that returns a list of the function names supported by the module, the name of the module and its version. Secondly, the wrapper has to load instances of the module. It does that by calling an initialization function, if implemented\footnote{From the previous step, the wrapper already ``knows'' all the functions that are implemented, so it already ``knows'' if the initialization function exists.}, in the module, and then assigns an unique number, the module instance ID, to the new instance. Thirdly, it has to assign some ``global space'' (more on this below) to the module instance. Whenever a function in a module is called, the module instance ID is passed to the function, allowing it to restore the global space of the current instance. \subsubsection{Memory Management} I know. Everybody loves the ``new'' operator in C++. Or the ``malloc'' function in C. But then, in something as modular as ANet, using them could break up the whole program. This is not only for controlling memory leaks,but especially to control, at all times, the entire data used by modules outside the program stack. An example. Let's say you want to close the ANet daemon for 5 minutes, then restore ANet to its exact same state as before. If every module does its own memory management, then the modules may not be ``smart'' enough to store to the hard disk the data they allocated themselves. More importantly, each module has multiple instances running in ANet, and thus the data used by a module, that should stay in memory between calls to the module, has to be maintained by whatever ``knows'' what are those instances. To solve all of these problems, the run-time wrapper has to do two things. First, no module should do any memory management other than the one offered by the run-time wrapper. Given a module instance ID and the size of the wanted memory block, the wrapper can create a new ``memory tag'' that can be used to get the memory location of the memory block. Only those ``memory tags'' should be remembered, as the actual memory locations can change between the different calls to a module. A module can change the size of a memory block, lock its position in memory, mark it as temporary so its memory could be freed if memory is tight, and so on.\footnote{This was ``inspired'' by, you know \ldots\cite{macmem}} Second, whenever a function in a module is called, the module instance ID is passed to the function. With that, the module instance can get the address of its own ``global space''. A module instance's global space is a small block of memory that is created when the instance is created. The module instance can get its global space with no other information than its own ID (which it always gets), and, for obvious reasons, the global space cannot be marked as temporary or deleted. Usually, instances should use their global space to store the other memory tags that they allocated\footnote{Unless you're already having some fun time making memory leaks \ldots}. \subsubsection{File Management} The wrapper will allow modules to do several things with the file system: \begin{description} \item Files: create, open, read, write, close and delete. \item Directories: create, read, delete \end{description} Once opened, files and directories are identified by an ID. The files and directories can be identified on the file system with three kind of paths: \begin{description} \item[UNIX] \verb|/directory/directory/.../file.| \\Up one directory: .. \item[MacOS] \verb|Disk:folder:folder:...:file.| \\Up one directory: :: \item[Win32] \verb|Disk:\directory\directory\...\file.ext.| \\Upone directory: .. \end{description} Those three kind of paths will be supported on all operating systems that ANet will support, with the following restrictions: \begin{description} \item Win32 systems assume that there is a file extension. If none is given, a generic one will be added when the file is created. The generic file extension for ANet can be changed in the configuration files. \item The ``Disk'' part of the Win32 paths will be ignored on UNIX systems, except Mac OS X. \item On Mac OS 9, the file type and creator will be based on the file name extension. If the extension is missing, a generic type/creator pair will be given to the file when created. The default pair can be changed in the configuration file. \item Files and directories will be created with the default access privileges, which can be changed in the configuration file. \end{description} As said before, the wrapper could be a single thread. So, all the file management functions are only asynchronous; they won't have any synchronous version. This is to make sure that no module will block the entire daemon because it is waiting for some Input/Output from the file system. Obviously, some timing functions will be available, so that modules can know when their I/O functions have timed out. \subsubsection{Configuration Management} The run-time wrapper will also manage the configuration files. The configuration files are XML\cite{w3xml} files\footnote{Why XML? The first thing is that I don't want the ANet configuration files to be too difficult to edit. Since ANet needs to have a structured configuration file, anything else won't be as good. Also, you can use multiple XML files that will ``patch'' each other, in the order they are loaded. Finally, with all the hype around XML (why all this hype anyways?), a lot of tools and code is already available.}. At least one of these files has to contain the root element, which represents the whole ANet daemon, and contains the settings of the run-time wrapper. All module instances have their settings in the XML files. Thus, when an instance is initialized, it is given access to their XML tags. The instance is free to change their own XML tag and the tags it contains, and the modified XML can be seen or saved back to the hard disk, if the user wants it. \subsubsection{Log Management} The run-time wrapper will also offer functions that will allow module instances to log messages to the hard disk. The wrapper will try to write those logs as fast as possible, so the write cache will be small. This can really help if you want to log something before crashing. Because of this small cache, even if the output to the disk is asynchronous, it could result is a severe speed hit if abused, by being too ``verbose''. So, don't abuse of it. Speaking of crashes, module instances can call a ``die'' function, which logs something before terminating the module instance\footnote{A bit like the ``die'' function in Perl\cite{perl}.}. Since the global space and all memory allocated to the instance is destroyed, the instance should return from the function call as soon as possible. \subsubsection{Inter-Module Communication} Finally, the run-time wrapper will allow module instances to exchange information through function calls in ways that are not explicitly required by the wrapper. Basically, an instance tells the wrapper ``I want to call function X with arguments Y in module instance M''. Then, the wrapper will call a function in M that will return true only if, for the given information from the calling instance, M accepts to get called by the other module. Then, if that's the case, then function will be called with the arguments. Actually, before trying to make an inter-module call, the instance will have to ask from the wrapper a list of instances that can accept inter-module calls. Based on that information, the instance decides which instance to call. \subsection{Implementation Notes} Ideally, the wrapper would be multi-threaded. But that would really make everything more complex. But then, cooperative multitasking (or ``fibers'' in Win32) is easy to implement. The only problem is that it has to be an explicit function call, made from time to time in all the modules. Even if it is too easy to forget to call that function from time to time, it might be the best way to do multitasking, so this will become a requirement in all the modules. The memory management functions could simply be wrappers around the ``malloc'' function, and its related functions. A simple hash table and a linked list are also needed. There are several open-source XML parsers and checkers out there, but surprisingly, most of them are not under the GNU Public Licence. So, we can use them, as long as they're not in the same ``package'' as the rest of the source code from ANet. The Inter-Module Communication system could be as complex or as simple as we want. We should aim for simple, as it won't be used much, except for weird optimizations (hacks) when modules ``know'' about each other. \subsection{DTD} See the complete DTD for more information see \xs{sec:dtd}. \begin{verbatim} <!-- Root element --> <!ELEMENT ANet (ClientConnection)+, BandwidthManager, (ClusterGroup)+, CoreModules, (Cluster)+> <!ATTLIST ANet %security;> \end{verbatim} \section{Client Connection Modules} \label{sec:ccm} Communication bridge between the ANet daemon and the clients. \section{Data Transformation Modules} \label{sec:dtm} Transform some data. \section{Client SDK} \label{sec:csdk} Group of libraries to simplify the process of building clients for ANet. \section{Cluster Group Modules} \label{sec:cgm} Define data duplication between different clusters. \section{Cluster Filter Modules} \label{sec:clus} Define data filtering for a cluster. \section{ANet Core} \label{sec:ac} Does the actual data duplication within a cluster. Contains the query, static data and TWDT modules. \section{Handshaking Protocol Modules} \label{sec:hpm} Define what and how connections should be made and manage resumed connections. \section{Packet Protocol Modules} \label{sec:ppm} Define the way the data will be streamed between two nodes. \section{Connection Protocol Modules} \label{sec:cpm} Define how network connections, from a low-level point of view, should be made between two nodes. \section{Bandwidth Manager Module} \label{sec:bbm} Monitors the network connections to maintain bandwidth statistics. \section{Document Type Definition (DTD)} \label{sec:dtd} This is the DTD file for the ANet configuration files. \setcounter{chapter}{2} \part{Low-Level Design} %\chapter{Low-Level Design} \bibliographystyle{plain} \bibliography{anet} \appendix \appendixpage \addappheadtotoc \chapter{Graphs} \begin{figure}[!h] \begin{center} \includegraphics[scale=.5]{daemon} \end{center} \label{fig:daemon} \caption{High-Level Structure of the ANet Daemon} \end{figure} \printindex \end{document} --- NEW FILE: appendix.sty --- %% %% This is file `appendix.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% appendix.dtx (with options: `usc') %% %% Author: Peter Wilson (CUA and NIST) %% now at: pet...@bo... %% %% Copyright 1998 Peter R. Wilson %% %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License distributed from CTAN %% archives in directory macros/latex/base/lppl.txt. %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{appendix}[2001/03/15 v1.1 extra appendix facilities] \RequirePackage{ifthen} \newif\if@chapter@pp\@chapter@ppfalse \newif\if@knownclass@pp\@knownclass@ppfalse \@ifundefined{chapter}{% \@ifundefined{section}{}{\@knownclass@pptrue}}{% \@chapter@pptrue\@knownclass@pptrue} \newif\if@dotoc@pp\@dotoc@ppfalse \newif\if@dotitle@pp\@dotitle@ppfalse \newif\if@dotitletoc@pp\@dotitletoc@ppfalse \newif\if@dohead@pp\@dohead@ppfalse \newif\if@dopage@pp\@dopage@ppfalse \DeclareOption{toc}{\@dotoc@pptrue} \DeclareOption{title}{\@dotitle@pptrue} \DeclareOption{titletoc}{\@dotitletoc@pptrue} \DeclareOption{header}{\@dohead@pptrue} \DeclareOption{page}{\@dopage@pptrue} \ProcessOptions\relax \newcommand{\@ppendinput}{} \if@knownclass@pp\else \PackageWarningNoLine{appendix}% {There is no \protect\chapter\space or \protect\section\space command.\MessageBreak The appendix package will not be used} \renewcommand{\@ppendinput}{\endinput} \fi \@ppendinput \newcounter{@ppsavesec} \newcounter{@ppsaveapp} \setcounter{@ppsaveapp}{0} \newcommand{\@ppsavesec}{% \if@chapter@pp \setcounter{@ppsavesec}{\value{chapter}} \else \setcounter{@ppsavesec}{\value{section}} \fi} \newcommand{\@pprestoresec}{% \if@chapter@pp \setcounter{chapter}{\value{@ppsavesec}} \else \setcounter{section}{\value{@ppsavesec}} \fi} \newcommand{\@ppsaveapp}{% \if@chapter@pp \setcounter{@ppsaveapp}{\value{chapter}} \else \setcounter{@ppsaveapp}{\value{section}} \fi} \newcommand{\restoreapp}{% \if@chapter@pp \setcounter{chapter}{\value{@ppsaveapp}} \else \setcounter{section}{\value{@ppsaveapp}} \fi} \providecommand{\appendixname}{Appendix} \newcommand{\appendixtocname}{Appendices} \newcommand{\appendixpagename}{Appendices} \newcommand{\appendixpage}{% \if@chapter@pp \@chap@pppage \else \@sec@pppage \fi } \newcommand{\clear@ppage}{% \if@openright\cleardoublepage\else\clearpage\fi} \newcommand{\@chap@pppage}{% \clear@ppage \thispagestyle{plain}% \if@twocolumn\onecolumn\@tempswatrue\else\@tempswafalse\fi \null\vfil \markboth{}{}% {\centering \interlinepenalty \@M \normalfont \Huge \bfseries \appendixpagename\par}% \vfil\newpage \if@twoside \if@openright \null \thispagestyle{empty}% \newpage \fi \fi \if@tempswa \twocolumn \fi } \newcommand{\@sec@pppage}{% \par \addvspace{4ex}% \@afterindentfalse {\parindent \z@ \raggedright \interlinepenalty \@M \normalfont \huge \bfseries \appendixpagename% \markboth{}{}\par}% \nobreak \vskip 3ex \@afterheading } \newcommand{\addappheadtotoc}{% \if@chapter@pp \addcontentsline{toc}{chapter}{\appendixtocname} \else \addcontentsline{toc}{section}{\appendixtocname} \fi } \newcommand{\@resets@pp}{ \par \@ppsavesec \setcounter{section}{0} \if@chapter@pp \setcounter{chapter}{0} \renewcommand\@chapapp{\appendixname} \renewcommand\thechapter{\@Alph\c@chapter} \else \setcounter{subsection}{0} \renewcommand\thesection{\@Alph\c@section} \fi \restoreapp } \newenvironment{appendices}{% \@resets@pp \if@dotoc@pp \if@dopage@pp % both page and toc \if@chapter@pp % chapters \clear@ppage \addappheadtotoc\appendixpage \else % non-chaptered \appendixpage\addappheadtotoc \fi \else % toc only \if@chapter@pp % chapters \clear@ppage \fi \addappheadtotoc \fi \else \if@dopage@pp % page only \appendixpage \fi \fi \if@chapter@pp \if@dotitletoc@pp \@redotocentry@pp{chapter} \fi \else \if@dotitletoc@pp \@redotocentry@pp{section} \fi \if@dohead@pp \def\sectionmark##1{% \if@twoside \markboth{\@formatsecmark@pp{##1}}{} \else \markright{\@formatsecmark@pp{##1}}{} \fi} \fi \if@dotitle@pp \def\sectionname{\appendixname} \def\@seccntformat##1{\@ifundefined{##1name}{}{\csname ##1name\endcsname\ }% \csname the##1\endcsname\quad} \fi \fi}{% \@ppsaveapp\@pprestoresec} \newcommand{\setthesection}{\thechapter.\Alph{section}} \newcommand{\setthesubsection}{\thesection.\Alph{subsection}} \newcommand{\@resets@ppsub}{ \par \if@chapter@pp \setcounter{section}{0} \renewcommand{\thesection}{\setthesection} \else \setcounter{subsection}{0} \renewcommand{\thesubsection}{\setthesubsection} \fi } \newenvironment{subappendices}{% \@resets@ppsub \if@chapter@pp \if@dotitletoc@pp \@redotocentry@pp{section} \fi \if@dotitle@pp \def\sectionname{\appendixname} \def\@seccntformat##1{\@ifundefined{##1name}{}{\csname ##1name\endcsname\ }% \csname the##1\endcsname\quad} \fi \else \if@dotitletoc@pp \@redotocentry@pp{subsection} \fi \if@dotitle@pp \def\subsectionname{\appendixname} \def\@seccntformat##1{\@ifundefined{##1name}{}{\csname ##1name\endcsname\ }% \csname the##1\endcsname\quad} \fi \fi}{} \newcommand{\@formatsecmark@pp}[1]{% \MakeUppercase{\appendixname\space \ifnum \c@secnumdepth >\z@ \thesection\quad \fi #1}} \newcommand{\@redotocentry@pp}[1]{% \let\oldacl@pp=\addcontentsline \def\addcontentsline##1##2##3{% \ifthenelse{\equal{##1}{toc}}{% \ifthenelse{\equal{##2}{#1}}{% \addtocontents{##1}{\protect\contentsline{##2}% {\appendixname\space ##3}{\thepage}}}% {\oldacl@pp{##1}{##2}{##3}}}% {\oldacl@pp{##1}{##2}{##3}}}} \endinput %% %% End of file `appendix.sty'. --- NEW FILE: daemon.eps --- %!PS-Adobe-2.0 EPSF-2.0 %%Title: daemon.dia %%Creator: Dia v0.88.1 %%CreationDate: Thu Dec 27 12:35:37 2001 %%For: cjensen %%Magnification: 1.0000 %%Orientation: Portrait %%BoundingBox: 0 0 986 1106 %%Pages: 1 %%BeginSetup %%EndSetup %%EndComments %%BeginProlog [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def /Times-Roman-latin1 /Times-Roman findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Times-Italic-latin1 /Times-Italic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Times-Bold-latin1 /Times-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Times-BoldItalic-latin1 /Times-BoldItalic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /AvantGarde-Book-latin1 /AvantGarde-Book findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /AvantGarde-BookOblique-latin1 /AvantGarde-BookOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /AvantGarde-Demi-latin1 /AvantGarde-Demi findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /AvantGarde-DemiOblique-latin1 /AvantGarde-DemiOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Bookman-Light-latin1 /Bookman-Light findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Bookman-LightItalic-latin1 /Bookman-LightItalic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Bookman-Demi-latin1 /Bookman-Demi findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Bookman-DemiItalic-latin1 /Bookman-DemiItalic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Courier-latin1 /Courier findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Courier-Oblique-latin1 /Courier-Oblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Courier-Bold-latin1 /Courier-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Courier-BoldOblique-latin1 /Courier-BoldOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-latin1 /Helvetica findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-Oblique-latin1 /Helvetica-Oblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-Bold-latin1 /Helvetica-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-BoldOblique-latin1 /Helvetica-BoldOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-Narrow-latin1 /Helvetica-Narrow findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-Narrow-Oblique-latin1 /Helvetica-Narrow-Oblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-Narrow-Bold-latin1 /Helvetica-Narrow-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-Narrow-BoldOblique-latin1 /Helvetica-Narrow-BoldOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /NewCenturySchoolbook-Roman-latin1 /NewCenturySchoolbook-Roman findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /NewCenturySchoolbook-Italic-latin1 /NewCenturySchoolbook-Italic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /NewCenturySchoolbook-Bold-latin1 /NewCenturySchoolbook-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /NewCenturySchoolbook-BoldItalic-latin1 /NewCenturySchoolbook-BoldItalic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Palatino-Roman-latin1 /Palatino-Roman findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Palatino-Italic-latin1 /Palatino-Italic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Palatino-Bold-latin1 /Palatino-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Palatino-BoldItalic-latin1 /Palatino-BoldItalic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Symbol-latin1 /Symbol findfont definefont pop /ZapfChancery-MediumItalic-latin1 /ZapfChancery-MediumItalic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /ZapfDingbats-latin1 /ZapfDingbats findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /cp {closepath} bind def /c {curveto} bind def /f {fill} bind def /a {arc} bind def /ef {eofill} bind def /ex {exch} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth pop} bind def /tr {translate} bind def /ellipsedict 8 dict def ellipsedict /mtrx matrix put /ellipse { ellipsedict begin /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y tr xrad yrad sc 0 0 1 startangle endangle arc savematrix setmatrix end } def /mergeprocs { dup length 3 -1 roll dup length dup 5 1 roll 3 -1 roll add array cvx dup 3 -1 roll 0 exch putinterval dup 4 2 roll putinterval } bind def 28.346000 -28.346000 scale 0.750000 -36.250000 translate %%EndProlog /Times-Roman-latin1 ff 0.700000 scf sf 0.000000 0.000000 0.000000 srgb (Anonymous Distributed Networking Protocol \(ANet\) Daemon ) dup sw 2 div 17.000000 ex sub -1.000000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 12.000000 3.500000 m 12.000000 4.500000 l 13.000000 4.500000 l 13.000000 3.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 12.000000 3.500000 m 12.000000 4.500000 l 13.000000 4.500000 l 13.000000 3.500000 l cp s 1.000000 1.000000 1.000000 srgb n 15.000000 3.500000 m 15.000000 4.500000 l 16.000000 4.500000 l 16.000000 3.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 15.000000 3.500000 m 15.000000 4.500000 l 16.000000 4.500000 l 16.000000 3.500000 l cp s 1.000000 1.000000 1.000000 srgb n 18.000000 3.500000 m 18.000000 4.500000 l 19.000000 4.500000 l 19.000000 3.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 18.000000 3.500000 m 18.000000 4.500000 l 19.000000 4.500000 l 19.000000 3.500000 l cp s /Times-Roman-latin1 ff 0.700000 scf sf (IPC or local TCP/IP) dup sw 2 div 15.500000 ex sub 2.500000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 23.000000 3.500000 m 23.000000 4.500000 l 24.000000 4.500000 l 24.000000 3.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 23.000000 3.500000 m 23.000000 4.500000 l 24.000000 4.500000 l 24.000000 3.500000 l cp s /Times-Roman-latin1 ff 0.700000 scf sf (TCP/IP) dup sw 2 div 23.500000 ex sub 2.500000 m gs 1 -1 sc sh gr /Times-Roman-latin1 ff 0.700000 scf sf (Other ANet Daemon) dup sw 2 div 29.500000 ex sub 2.500000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 29.000000 3.500000 m 29.000000 4.500000 l 30.000000 4.500000 l 30.000000 3.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 29.000000 3.500000 m 29.000000 4.500000 l 30.000000 4.500000 l 30.000000 3.500000 l cp s /Times-Roman-latin1 ff 0.700000 scf sf (Client) dup sw 9.500000 ex sub 8.000000 m gs 1 -1 sc sh gr (Connection) dup sw 9.500000 ex sub 8.700000 m gs 1 -1 sc sh gr (Modules) dup sw 9.500000 ex sub 9.400000 m gs 1 -1 sc sh gr 0.070000 slw [] 0 sd [] 0 sd 0 slc n 23.500000 4.500000 m 23.000000 7.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 22.802721 6.858844 m 23.000000 7.500000 l 23.394558 6.957483 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 29.500000 4.500000 m 30.000000 7.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 29.605442 6.957483 m 30.000000 7.500000 l 30.197279 6.858844 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 12.500000 4.500000 m 14.500000 7.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 13.917565 7.167180 m 14.500000 7.500000 l 14.416795 6.834360 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 15.500000 4.500000 m 15.500000 7.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 15.200000 6.900000 m 15.500000 7.500000 l 15.800000 6.900000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 18.500000 4.500000 m 16.500000 7.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 16.583205 6.834360 m 16.500000 7.500000 l 17.082435 7.167180 l s 1.000000 1.000000 1.000000 srgb n 0.400000 3.000000 m 0.400000 5.000000 l 3.600000 5.000000 l 3.600000 3.000000 l f n 0.400000 3.400000 m 0.400000 3.400000 0.400000 0.400000 180.000000 270.000000 ellipse f n 3.600000 3.400000 m 3.600000 3.400000 0.400000 0.400000 270.000000 360.000000 ellipse f n 0.000000 3.400000 m 0.000000 4.600000 l 4.000000 4.600000 l 4.000000 3.400000 l f n 0.400000 4.600000 m 0.400000 4.600000 0.400000 0.400000 90.000000 180.000000 ellipse f n 3.600000 4.600000 m 3.600000 4.600000 0.400000 0.400000 0.000000 90.000000 ellipse f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 0.400000 3.000000 m 3.600000 3.000000 l s n 0.400000 5.000000 m 3.600000 5.000000 l s n 0.400000 3.400000 0.400000 0.400000 180.000000 270.000000 ellipse s n 3.600000 3.400000 0.400000 0.400000 270.000000 360.000000 ellipse s n 0.000000 3.400000 m 0.000000 4.600000 l s n 4.000000 3.400000 m 4.000000 4.600000 l s n 0.400000 4.600000 0.400000 0.400000 90.000000 180.000000 ellipse s n 3.600000 4.600000 0.400000 0.400000 0.000000 90.000000 ellipse s /Times-Italic-latin1 ff 0.700000 scf sf (Clients) dup sw 2 div 2.000000 ex sub 4.000000 m gs 1 -1 sc sh gr (\(add/drop\)) dup sw 2 div 2.000000 ex sub 4.700000 m gs 1 -1 sc sh gr 0.070000 slw [] 0 sd [] 0 sd 0 slc n 10.000000 7.000000 m 11.000000 7.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 10.000000 7.000000 m 10.000000 10.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 10.000000 10.000000 m 11.000000 10.000000 l s 1.000000 1.000000 1.000000 srgb n 14.500000 7.500000 m 14.500000 9.000000 l 16.500000 9.000000 l 16.500000 7.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 14.500000 7.500000 m 14.500000 9.000000 l 16.500000 9.000000 l 16.500000 7.500000 l cp s /Times-Roman-latin1 ff 0.700000 scf sf (Local) dup sw 2 div 15.500000 ex sub 8.500000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 20.500000 7.500000 m 20.500000 9.000000 l 25.500000 9.000000 l 25.500000 7.500000 l f n 20.500000 7.500000 m 20.500000 7.500000 0.000000 0.000000 180.000000 270.000000 ellipse f n 25.500000 7.500000 m 25.500000 7.500000 0.000000 0.000000 270.000000 360.000000 ellipse f n 20.500000 7.500000 m 20.500000 9.000000 l 25.500000 9.000000 l 25.500000 7.500000 l f n 20.500000 9.000000 m 20.500000 9.000000 0.000000 0.000000 90.000000 180.000000 ellipse f n 25.500000 9.000000 m 25.500000 9.000000 0.000000 0.000000 0.000000 90.000000 ellipse f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 20.500000 7.500000 m 25.500000 7.500000 l s n 20.500000 9.000000 m 25.500000 9.000000 l s n 20.500000 7.500000 0.000000 0.000000 180.000000 270.000000 ellipse s n 25.500000 7.500000 0.000000 0.000000 270.000000 360.000000 ellipse s n 20.500000 7.500000 m 20.500000 9.000000 l s n 25.500000 7.500000 m 25.500000 9.000000 l s n 20.500000 9.000000 0.000000 0.000000 90.000000 180.000000 ellipse s n 25.500000 9.000000 0.000000 0.000000 0.000000 90.000000 ellipse s /Times-Roman-latin1 ff 0.700000 scf sf (TCP/IP remote) dup sw 2 div 23.000000 ex sub 8.500000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 28.000000 7.500000 m 28.000000 9.000000 l 32.000000 9.000000 l 32.000000 7.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 28.000000 7.500000 m 28.000000 9.000000 l 32.000000 9.000000 l 32.000000 7.500000 l cp s /Times-Roman-latin1 ff 0.700000 scf sf (Gateway) dup sw 2 div 30.000000 ex sub 8.500000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 0.400000 8.000000 m 0.400000 9.500000 l 4.600000 9.500000 l 4.600000 8.000000 l f n 0.400000 8.400000 m 0.400000 8.400000 0.400000 0.400000 180.000000 270.000000 ellipse f n 4.600000 8.400000 m 4.600000 8.400000 0.400000 0.400000 270.000000 360.000000 ellipse f n 0.000000 8.400000 m 0.000000 9.100000 l 5.000000 9.100000 l 5.000000 8.400000 l f n 0.400000 9.100000 m 0.400000 9.100000 0.400000 0.400000 90.000000 180.000000 ellipse f n 4.600000 9.100000 m 4.600000 9.100000 0.400000 0.400000 0.000000 90.000000 ellipse f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 0.400000 8.000000 m 4.600000 8.000000 l s n 0.400000 9.500000 m 4.600000 9.500000 l s n 0.400000 8.400000 0.400000 0.400000 180.000000 270.000000 ellipse s n 4.600000 8.400000 0.400000 0.400000 270.000000 360.000000 ellipse s n 0.000000 8.400000 m 0.000000 9.100000 l s n 5.000000 8.400000 m 5.000000 9.100000 l s n 0.400000 9.100000 0.400000 0.400000 90.000000 180.000000 ellipse s n 4.600000 9.100000 0.400000 0.400000 0.000000 90.000000 ellipse s /Times-Italic-latin1 ff 0.700000 scf sf ("Server" Layer) dup sw 2 div 2.500000 ex sub 9.000000 m gs 1 -1 sc sh gr /Times-Roman-latin1 ff 0.700000 scf sf (Cluster) dup sw 9.500000 ex sub 13.500000 m gs 1 -1 sc sh gr (Groups) dup sw 9.500000 ex sub 14.200000 m gs 1 -1 sc sh gr 0.070000 slw [] 0 sd [] 0 sd 0 slc n 10.000000 12.000000 m 11.000000 12.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 10.000000 12.000000 m 10.000000 15.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 10.000000 15.000000 m 11.000000 15.000000 l s 1.000000 1.000000 1.000000 srgb n 0.400000 13.000000 m 0.400000 14.500000 l 5.600000 14.500000 l 5.600000 13.000000 l f n 0.400000 13.400000 m 0.400000 13.400000 0.400000 0.400000 180.000000 270.000000 ellipse f n 5.600000 13.400000 m 5.600000 13.400000 0.400000 0.400000 270.000000 360.000000 ellipse f n 0.000000 13.400000 m 0.000000 14.100000 l 6.000000 14.100000 l 6.000000 13.400000 l f n 0.400000 14.100000 m 0.400000 14.100000 0.400000 0.400000 90.000000 180.000000 ellipse f n 5.600000 14.100000 m 5.600000 14.100000 0.400000 0.400000 0.000000 90.000000 ellipse f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 0.400000 13.000000 m 5.600000 13.000000 l s n 0.400000 14.500000 m 5.600000 14.500000 l s n 0.400000 13.400000 0.400000 0.400000 180.000000 270.000000 ellipse s n 5.600000 13.400000 0.400000 0.400000 270.000000 360.000000 ellipse s n 0.000000 13.400000 m 0.000000 14.100000 l s n 6.000000 13.400000 m 6.000000 14.100000 l s n 0.400000 14.100000 0.400000 0.400000 90.000000 180.000000 ellipse s n 5.600000 14.100000 0.400000 0.400000 0.000000 90.000000 ellipse s /Times-Italic-latin1 ff 0.700000 scf sf (Data Duplication) dup sw 2 div 3.000000 ex sub 14.000000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 16.500000 12.500000 m 16.500000 14.000000 l 18.500000 14.000000 l 18.500000 12.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 16.500000 12.500000 m 16.500000 14.000000 l 18.500000 14.000000 l 18.500000 12.500000 l cp s /Times-Roman-latin1 ff 0.700000 scf sf (Chat) dup sw 2 div 17.500000 ex sub 13.500000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 26.000000 12.500000 m 26.000000 14.000000 l 28.000000 14.000000 l 28.000000 12.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 26.000000 12.500000 m 26.000000 14.000000 l 28.000000 14.000000 l 28.000000 12.500000 l cp s /Times-Roman-latin1 ff 0.700000 scf sf (FTP) dup sw 2 div 27.000000 ex sub 13.500000 m gs 1 -1 sc sh gr 0.070000 slw [] 0 sd [] 0 sd 0 slc n 15.500000 9.000000 m 17.500000 12.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 16.941844 12.127896 m 17.500000 12.500000 l 17.462790 11.830212 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 15.500000 9.000000 m 26.000000 12.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 25.335922 12.594868 m 26.000000 12.500000 l 25.525658 12.025658 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 23.000000 9.000000 m 18.500000 12.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 18.789429 11.894830 m 18.500000 12.500000 l 19.157794 12.368441 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 23.000000 9.000000 m 27.000000 12.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 26.350903 12.330670 m 27.000000 12.500000 l 26.746005 11.879124 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 30.000000 9.000000 m 28.000000 12.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 28.037210 11.830212 m 28.000000 12.500000 l 28.558156 12.127896 l s 1.000000 1.000000 1.000000 srgb n 0.400000 17.500000 m 0.400000 19.000000 l 4.600000 19.000000 l 4.600000 17.500000 l f n 0.400000 17.900000 m 0.400000 17.900000 0.400000 0.400000 180.000000 270.000000 ellipse f n 4.600000 17.900000 m 4.600000 17.900000 0.400000 0.400000 270.000000 360.000000 ellipse f n 0.000000 17.900000 m 0.000000 18.600000 l 5.000000 18.600000 l 5.000000 17.900000 l f n 0.400000 18.600000 m 0.400000 18.600000 0.400000 0.400000 90.000000 180.000000 ellipse f n 4.600000 18.600000 m 4.600000 18.600000 0.400000 0.400000 0.000000 90.000000 ellipse f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 0.400000 17.500000 m 4.600000 17.500000 l s n 0.400000 19.000000 m 4.600000 19.000000 l s n 0.400000 17.900000 0.400000 0.400000 180.000000 270.000000 ellipse s n 4.600000 17.900000 0.400000 0.400000 270.000000 360.000000 ellipse s n 0.000000 17.900000 m 0.000000 18.600000 l s n 5.000000 17.900000 m 5.000000 18.600000 l s n 0.400000 18.600000 0.400000 0.400000 90.000000 180.000000 ellipse s n 4.600000 18.600000 0.400000 0.400000 0.000000 90.000000 ellipse s /Times-Italic-latin1 ff 0.700000 scf sf (Data Filtering) dup sw 2 div 2.500000 ex sub 18.500000 m gs 1 -1 sc sh gr /Times-Roman-latin1 ff 0.700000 scf sf (Clusters) dup sw 9.500000 ex sub 18.500000 m gs 1 -1 sc sh gr 0.070000 slw [] 0 sd [] 0 sd 0 slc n 10.000000 17.000000 m 11.000000 17.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 10.000000 17.000000 m 10.000000 20.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 10.000000 20.000000 m 11.000000 20.000000 l s 1.000000 1.000000 1.000000 srgb n 28.000000 17.500000 m 28.000000 19.000000 l 32.000000 19.000000 l 32.000000 17.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 28.000000 17.500000 m 28.000000 19.000000 l 32.000000 19.000000 l 32.000000 17.500000 l cp s /Times-Roman-latin1 ff 0.700000 scf sf (FTP only) dup sw 2 div 30.000000 ex sub 18.500000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 21.500000 17.500000 m 21.500000 19.000000 l 24.500000 19.000000 l 24.500000 17.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 21.500000 17.500000 m 21.500000 19.000000 l 24.500000 19.000000 l 24.500000 17.500000 l cp s /Times-Roman-latin1 ff 0.700000 scf sf (Generic) dup sw 2 div 23.000000 ex sub 18.500000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 13.500000 17.500000 m 13.500000 19.000000 l 17.500000 19.000000 l 17.500000 17.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 13.500000 17.500000 m 13.500000 19.000000 l 17.500000 19.000000 l 17.500000 17.500000 l cp s /Times-Roman-latin1 ff 0.700000 scf sf (Chat only) dup sw 2 div 15.500000 ex sub 18.500000 m gs 1 -1 sc sh gr 0.070000 slw [] 0 sd [] 0 sd 0 slc n 17.500000 14.000000 m 15.500000 17.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 15.537210 16.830212 m 15.500000 17.500000 l 16.058156 17.127896 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 17.500000 14.000000 m 21.500000 17.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 20.850903 17.330670 m 21.500000 17.500000 l 21.246005 16.879124 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 27.000000 14.000000 m 24.500000 17.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 24.604623 16.837388 m 24.500000 17.500000 l 25.092863 17.186131 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 27.000000 14.000000 m 30.000000 17.500000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 29.381748 17.239683 m 30.000000 17.500000 l 29.837302 16.849209 l s 1.000000 1.000000 1.000000 srgb n 0.400000 22.500000 m 0.400000 24.000000 l 4.600000 24.000000 l 4.600000 22.500000 l f n 0.400000 22.900000 m 0.400000 22.900000 0.400000 0.400000 180.000000 270.000000 ellipse f n 4.600000 22.900000 m 4.600000 22.900000 0.400000 0.400000 270.000000 360.000000 ellipse f n 0.000000 22.900000 m 0.000000 23.600000 l 5.000000 23.600000 l 5.000000 22.900000 l f n 0.400000 23.600000 m 0.400000 23.600000 0.400000 0.400000 90.000000 180.000000 ellipse f n 4.600000 23.600000 m 4.600000 23.600000 0.400000 0.400000 0.000000 90.000000 ellipse f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 0.400000 22.500000 m 4.600000 22.500000 l s n 0.400000 24.000000 m 4.600000 24.000000 l s n 0.400000 22.900000 0.400000 0.400000 180.000000 270.000000 ellipse s n 4.600000 22.900000 0.400000 0.400000 270.000000 360.000000 ellipse s n 0.000000 22.900000 m 0.000000 23.600000 l s n 5.000000 22.900000 m 5.000000 23.600000 l s n 0.400000 23.600000 0.400000 0.400000 90.000000 180.000000 ellipse s n 4.600000 23.600000 0.400000 0.400000 0.000000 90.000000 ellipse s /Times-Italic-latin1 ff 0.700000 scf sf (Transmission) dup sw 2 div 2.500000 ex sub 23.500000 m gs 1 -1 sc sh gr /Times-Roman-latin1 ff 0.700000 scf sf (Connections) dup sw 2 div 7.500000 ex sub 23.500000 m gs 1 -1 sc sh gr /Times-Roman-latin1 ff 0.700000 scf sf (Packet) dup sw 2 div 15.500000 ex sub 23.500000 m gs 1 -1 sc sh gr (Protocol) dup sw 2 div 15.500000 ex sub 24.200000 m gs 1 -1 sc sh gr /Times-Roman-latin1 ff 0.700000 scf sf (Connection) dup sw 2 div 26.750000 ex sub 23.500000 m gs 1 -1 sc sh gr (Protocol) dup sw 2 div 26.750000 ex sub 24.200000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 14.250000 29.000000 m 14.250000 30.000000 l 16.750000 30.000000 l 16.750000 29.000000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 14.250000 29.000000 m 14.250000 30.000000 l 16.750000 30.000000 l 16.750000 29.000000 l cp s /Times-Roman-latin1 ff 0.600000 scf sf (Gateway) dup sw 2 div 15.500000 ex sub 29.750000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 14.250000 27.500000 m 14.250000 28.500000 l 16.750000 28.500000 l 16.750000 27.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 14.250000 27.500000 m 14.250000 28.500000 l 16.750000 28.500000 l 16.750000 27.500000 l cp s /Times-Roman-latin1 ff 0.600000 scf sf (Gnutella) dup sw 2 div 15.500000 ex sub 28.250000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 14.750000 26.000000 m 14.750000 27.000000 l 16.250000 27.000000 l 16.250000 26.000000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 14.750000 26.000000 m 14.750000 27.000000 l 16.250000 27.000000 l 16.250000 26.000000 l cp s /Times-Roman-latin1 ff 0.600000 scf sf (ANet) dup sw 2 div 15.500000 ex sub 26.750000 m gs 1 -1 sc sh gr /Times-Roman-latin1 ff 0.700000 scf sf (...) dup sw 2 div 15.500000 ex sub 31.250000 m gs 1 -1 sc sh gr 0.070000 slw [] 0 sd [] 0 sd 0 slc n 24.250000 25.500000 m 24.250000 25.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 24.250000 25.000000 m 29.250000 25.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 29.250000 25.000000 m 29.250000 25.500000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 13.000000 25.500000 m 13.000000 25.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 13.000000 25.000000 m 18.000000 25.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 18.000000 25.000000 m 18.000000 25.500000 l s 1.000000 1.000000 1.000000 srgb n 26.000000 26.000000 m 26.000000 27.000000 l 27.500000 27.000000 l 27.500000 26.000000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 26.000000 26.000000 m 26.000000 27.000000 l 27.500000 27.000000 l 27.500000 26.000000 l cp s /Times-Roman-latin1 ff 0.600000 scf sf (TCP) dup sw 2 div 26.750000 ex sub 26.750000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 26.000000 27.500000 m 26.000000 28.500000 l 27.500000 28.500000 l 27.500000 27.500000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 26.000000 27.500000 m 26.000000 28.500000 l 27.500000 28.500000 l 27.500000 27.500000 l cp s /Times-Roman-latin1 ff 0.600000 scf sf (UDP) dup sw 2 div 26.750000 ex sub 28.250000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 25.750000 29.000000 m 25.750000 30.000000 l 27.750000 30.000000 l 27.750000 29.000000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 25.750000 29.000000 m 25.750000 30.000000 l 27.750000 30.000000 l 27.750000 29.000000 l cp s /Times-Roman-latin1 ff 0.600000 scf sf (HTTP) dup sw 2 div 26.750000 ex sub 29.750000 m gs 1 -1 sc sh gr /Times-Roman-latin1 ff 0.700000 scf sf (...) dup sw 2 div 26.750000 ex sub 31.250000 m gs 1 -1 sc sh gr 0.070000 slw [] 0 sd [] 0 sd 0 slc n 20.250000 26.000000 m 22.250000 28.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 22.250000 26.000000 m 20.250000 28.000000 l s 1.000000 1.000000 1.000000 srgb n 19.500000 33.250000 m 19.500000 34.750000 l 23.000000 34.750000 l 23.000000 33.250000 l f 0.070000 slw [] 0 sd [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 19.500000 33.250000 m 19.500000 34.750000 l 23.000000 34.750000 l 23.000000 33.250000 l cp s /Times-Roman-latin1 ff 0.700000 scf sf (Network) dup sw 2 div 21.250000 ex sub 34.250000 m gs 1 -1 sc sh gr 0.070000 slw [] 0 sd [] 0 sd 0 slc n 21.250000 28.500000 m 21.250000 33.250000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 21.550000 29.100000 m 21.250000 28.500000 l 20.950000 29.100000 l s 0.070000 slw [] 0 sd 0 slj 0 slc n 20.950000 32.650000 m 21.250000 33.250000 l 21.550000 32.650000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 10.000000 23.000000 m 11.000000 23.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 10.000000 23.000000 m 10.000000 32.000000 l s 0.070000 slw [] 0 sd [] 0 sd 0 slc n 10.000000 32.000000 m 11.000000 32.000000 l s 1.000000 1.000000 1.000000 srgb n 33.000000 35.000000 m 33.000000 36.250000 l 34.000000 36.250000 l 34.000000 35.000000 l f 0.000000 slw [] 0 sd [] 0 sd 0 slj n 33.000000 35.000000 m 33.000000 36.250000 l 34.000000 36.250000 l 34.000000 35.000000 l cp s n -0.750000 -2.750000 m -0.750000 -1.500000 l 0.250000 -1.500000 l 0.250000 -2.750000 l f 0.000000 slw [] 0 sd [] 0 sd 0 slj n -0.750000 -2.750000 m -0.750000 -1.500000 l 0.250000 -1.500000 l 0.250000 -2.750000 l cp s showpage --- NEW FILE: url.sty --- % url.sty ver 1.5 28-Mar-1999 Donald Arseneau as...@tr... % Copyright 1996-1999 Donald Arseneau, Vancouver, Canada. % This program can be used, distributed, and modified under the terms % of the LaTeX Project Public License. % % A form of \verb that allows linebreaks at certain characters or % combinations of characters, accepts reconfiguration, and can usually % be used in the argument to another command. It is intended for email % addresses, hypertext links, directories/paths, etc., which normally % have no spaces. The font may be selected using the \urlstyle command, % and new url-like commands can be defined using \urldef. % % Usage: Conditions: % \url{ } If the argument contains any "%", "#", or "^^", or ends with % "\", it can't be used in the argument to another command. % The argument must not contain unbalanced braces. % \url| | ...where "|" is any character not used in the argument and not % "{" or a space. The same restrictions as above except that the % argument may contain unbalanced braces. % \xyz for "\xyz" a defined-url; this can be used anywhere, no matter % what characters it contains. % % See further instructions after "\endinput" % \def\Url@ttdo{% style assignments for tt fonts or T1 encoding \def\UrlBreaks{\do\.\do\@\do\\\do\/\do\!\do\_\do\|\do\%\do\;\do\>\do\]% \do\)\do\,\do\?\do\'\do\+\do\=\do\#}% \def\UrlBigBreaks{\do\:\do@url@hyp}% \def\UrlNoBreaks{\do\(\do\[\do\{\do\<}% (unnecessary) \def\UrlSpecials{\do\ {\ }}% \def\UrlOrds{\do\*\do\-\do\~}% any ordinary characters that aren't usually } \def\Url@do{% style assignments for OT1 fonts except tt \def\UrlBreaks{\do\.\do\@\do\/\do\!\do\%\do\;\do\]\do\)\do\,\do\?\do\+% \do\=\do\#}\def\UrlBigBreaks{\do\:\do@url@hyp}% \def\UrlNoBreaks{\do\(\do\[\do\{}% prevents breaks after *next* character \def\UrlSpecials{\do\<{\langle}\do\>{\mathbin{\rangle}}\do\_{\_% \penalty\@m}\do\|{\mid}\do\{{\lbrace}\do\}{\mathbin{\rbrace}}\do \\{\mathbin{\backslash}}\do\~{\raise.6ex\hbox{\m@th$\scriptstyle\sim$}}\do \ {\ }}% \def\UrlOrds{\do\'\do\"\do\-}% } \def\url@ttstyle{% \@ifundefined{selectfont}{\def\UrlFont{\tt}}{\def\UrlFont{\ttfamily}}\Url@ttdo } \def\url@rmstyle{% \@ifundefined{selectfont}{\def\UrlFont{\rm}}{\def\UrlFont{\rmfamily}}\Url@do } \def\url@sfstyle{% \@ifundefined{selectfont}{\def\UrlFont{\sf}}{\def\UrlFont{\sffamily}}\Url@do } \def\url@samestyle{\ifdim\fontdimen\thr@@\font=\z@ \url@ttstyle \else \url@rmstyle \fi \def\UrlFont{}} \@ifundefined{strip@prefix}{\def\strip@prefix#1>{}}{} \@ifundefined{verbatim@nolig@list}{\def\verbatim@nolig@list{\do\`}}{} \def\Url{% \begingroup \let\url@moving\relax\relax \endgroup \ifmmode\@nomatherr$\fi \UrlFont $\fam\z@ \textfont\z@\font \let\do\@makeother \dospecials % verbatim catcodes \catcode`{\@ne \catcode`}\tw@ \catcode`\ 10 % except braces and spaces \medmuskip\Urlmuskip \thickmuskip\medmuskip \thinmuskip0mu% \relpenalty\UrlBreakPenalty \binoppenalty\UrlBigBreakPenalty \@tempcnta\fam\multiply\@tempcnta\@cclvi \let\do\set@mathcode \UrlOrds % ordinary characters that were special \advance\@tempcnta 8192 \UrlBreaks % bin \advance\@tempcnta 4096 \UrlBigBreaks % rel \advance\@tempcnta 4096 \UrlNoBreaks % open \let\do\set@mathact \UrlSpecials % active \let\do\set@mathnolig \verbatim@nolig@list % prevent ligatures \@ifnextchar\bgroup\Url@z\Url@y} \def\Url@y#1{\catcode`{11 \catcode`}11 \def\@tempa##1#1{\Url@z{##1}}\@tempa} \def\Url@z#1{\def\@tempa{#1}\expandafter\expandafter\expandafter\Url@Hook \expandafter\strip@prefix\meaning\@tempa\UrlRight\m@th$\endgroup} \def\Url@Hook{\UrlLeft} \let\UrlRight\@empty \let\UrlLeft\@empty \def\set@mathcode#1{\count@`#1\advance\count@\@tempcnta\mathcode`#1\count@} \def\set@mathact#1#2{\mathcode`#132768 \lccode`\~`#1\lowercase{\def~{#2}}} \def\set@mathnolig#1{\ifnum\mathcode`#1<32768 \lccode`\~`#1\lowercase{\edef~{\mathchar\number\mathcode`#1_{\/}}}% \mathcode`#132768 \fi} \def\urldef#1#2{\begingroup \setbox\z@\hbox\bgroup \def\Url@z{\Url@def{#1}{#2}}#2} \expandafter\ifx\csname DeclareRobustCommand\endcsname\relax \def\Url@def#1#2#3{\m@th$\endgroup\egroup\endgroup \def#1{#2{#3}}} \else \def\Url@def#1#2#3{\m@th$\endgroup\egroup\endgroup \DeclareRobustCommand{#1}{#2{#3}}} \fi \def\urlstyle#1{\csname url@#1style\endcsname} % Sample (and default) configuration: % \newcommand\url{\begingroup \Url} % \newmuskip\Urlmuskip \Urlmuskip=0mu \mathchardef\UrlBigBreakPenalty=\binoppenalty \mathchardef\UrlBreakPenalty=\relpenalty % % picTeX defines \path, so declare it optionally: \@ifundefined{path}{\newcommand\path{\begingroup \urlstyle{tt}\Url}}{} % % too many styles define \email like \address, so I will not define it. % \newcommand\email{\begingroup \urls... [truncated message content] |
From: Christopher J. <cwj...@us...> - 2001-12-29 00:36:02
|
Update of /cvsroot/anet/Documentation/design/latex In directory usw-pr-cvs1:/tmp/cvs-serv19602/latex Log Message: Directory /cvsroot/anet/Documentation/design/latex added to the repository |
From: Christopher J. <cwj...@us...> - 2001-12-29 00:35:13
|
Update of /cvsroot/anet/Documentation/design In directory usw-pr-cvs1:/tmp/cvs-serv19404/design Log Message: Directory /cvsroot/anet/Documentation/design added to the repository |
From: Benoit N. <be...@us...> - 2001-12-23 20:22:22
|
Update of /cvsroot/anet/ANet/ANet_Daemon/Core In directory usw-pr-cvs1:/tmp/cvs-serv23411/ANet_Daemon/Core Modified Files: IMC.c ModuleLoader.c Added Files: IMC.h Log Message: "" --- NEW FILE: IMC.h --- /****************************************************************** ANet_Daemon/Core/IMC.h Inter-module communication declarations. Part of the run-time wrapper of the ANet project. Distributed under GPL: http://www.gnu.org/copyleft/gpl.html ******************************************************************/ #ifndef ANET_IMC #define ANET_IMC /*! \addtogroup core Core \brief Run-time Wrapper Core This is the core of the run-time wrapper of the ANet daemon. */ /*! \addtogroup modules Module Management \ingroup core \brief Module management functions This code manage the different modules running in the ANet daemon. \{ */ /*! \file \brief Inter-Module Communication declarations. \author Benad */ #include "Modules.h" /*! \brief Calls a function in a module \param moduleName The name of the module to call \param instanceName The name of the module instance \param funcID The function ID to call \param ... Arguments to pass to the function \return \li <CODE>3000</CODE>: Invalid module name \li <CODE>3001</CODE>: Invalid instance name \li <CODE>3002</CODE>: Unknown function ID \li <I>Otherwise</I>: The returned value of the function This function calls a function of a module instance. */ UInt32 CallModuleFunction(char *moduleName, char *instanceName, UInt32 funcID, ...); //! Returns the current global tag of the running module ANetMemoryTag ANetGetGlobals(); #endif /*! \} */ Index: IMC.c =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Core/IMC.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** IMC.c 2001/10/27 15:44:14 1.1 --- IMC.c 2001/12/23 20:22:18 1.2 *************** *** 1,6 **** ! #include "Modules.h" #include "IMC.h" - #include "StubModule.h" ANetMemoryTag currentGlobals; --- 1,25 ---- ! /****************************************************************** ! ANet_Daemon/Core/IMC.c ! Inter-module communication. ! ! Part of the run-time wrapper of the ANet project. ! ! Distributed under GPL: http://www.gnu.org/copyleft/gpl.html ! ******************************************************************/ ! #include "IMC.h" + /*! + \addtogroup modules + \{ + */ + + /*! + \file + \brief Inter-Module Communication functions. + \author Benad + \author Ajaya + */ + ANetMemoryTag currentGlobals; *************** *** 22,23 **** --- 41,44 ---- return currentGlobals; } + + /*! \} */ Index: ModuleLoader.c =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Core/ModuleLoader.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ModuleLoader.c 2001/11/07 21:31:54 1.3 --- ModuleLoader.c 2001/12/23 20:22:18 1.4 *************** *** 1,6 **** --- 1,27 ---- + /****************************************************************** + ANet_Daemon/Core/ModuleLoader.c + Module loading functions. + + Part of the run-time wrapper of the ANet project. + + Distributed under GPL: http://www.gnu.org/copyleft/gpl.html + ******************************************************************/ + #include "Modules.h" #include "IMC.h" //inter-module communication #include "StubModule.h" + /*! + \addtogroup modules + \{ + */ + + /*! + \file + \brief Module loading functions. + \author Benad + \author Ajaya + */ + // define some list of ANetModuleInfo here // also define some hash of (moduleName,instanceName) -> ANetMemoryTag here *************** *** 42,43 **** --- 63,66 ---- // I am not sure as yet. } + + /*! \} */ |
From: Benoit N. <be...@us...> - 2001-12-23 20:22:21
|
Update of /cvsroot/anet/ANet/ANet_Daemon/Common In directory usw-pr-cvs1:/tmp/cvs-serv23411/ANet_Daemon/Common Modified Files: Modules.h XMLCommon.h Log Message: "" Index: Modules.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Modules.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Modules.h 2001/11/05 23:27:03 1.4 --- Modules.h 2001/12/23 20:22:18 1.5 *************** *** 11,14 **** --- 11,25 ---- #define ANET_MODULES + /*! + \addtogroup modules + \{ + */ + + /*! + \file + \brief Various module management declarations. + \author Benad + */ + #include "ANetCommon.h" #include "Memory.h" *************** *** 18,58 **** typedef struct ANetFunctionMap { ! char *name; //Symbol name (can be NULL) ! UInt32 ID; //Module function ID ! void *funcPtr; //Actual function pointer (can be NULL) } ANetFunctionMap; ! // Module Function IDs enum { ! kUndefined = 0, // void* ! kModuleCreateInstance = 1, //ANetModuleCreateInstanceFuncPtr ! kModuleDestroyInstance = 2, //ANetModuleDestroyInstanceFuncPtr ! kClientConnectionMain = 3, //ANetClientConnectionMainFuncPtr ! kDataTransMain = 4, //ANetDataTransMainFuncPtr ! kDataTransGetSupportedTags = 12, //ANetDataTransGetSupportedTagsFuncPtr ! kClusterGroupMain = 5, //ANetClusterGroupMainFuncPtr ! kClusterFilterMain = 6, //ANetClusterFilterMainFuncPtr ! kClusterFilterForced = 13, //ANetClusterFilterForcedFuncPtr ! kHansdhakingProtocolMain = 7, //ANetHandshakingProtocolMainFuncPtr ! kPacketProtocolMain = 8, //ANetPacketProtocolMainFuncPtr ! kPacketProtocolStatus = 14, //ANetPacketProtocolStatusFuncPtr ! kConnectionProtocolMain = 9, //ANetConnectionProtocolMainFuncPtr ! kConnectionProtocolStatus = 15, //ANetConnectionProtocolStatusFuncPtr ! kBandwidthManagerMain = 10, //ANetBandwidthManagerMainFuncPtr ! kCoreModuleMain = 11, //ANetCoreModuleMainFuncPtr ! kStubMain = 50, //ANetStubMainFuncPtr ! kStubFunc1 = 51, //ANetStubFunc1Ptr ! kStubFunc2 = 52 //ANetStubFunc2Ptr }; --- 29,69 ---- typedef struct ANetFunctionMap { ! char *name; //!< Symbol name (can be NULL) ! UInt32 ID; //!< Module function ID ! void *funcPtr; //!< Actual function pointer (can be NULL) } ANetFunctionMap; ! //! Module Function IDs enum { ! kUndefined = 0, //!< void* ! kModuleCreateInstance = 1, //!< ANetModuleCreateInstanceFuncPtr() ! kModuleDestroyInstance = 2, //!< ANetModuleDestroyInstanceFuncPtr() ! kClientConnectionMain = 3, //!< ANetClientConnectionMainFuncPtr() ! kDataTransMain = 4, //!< ANetDataTransMainFuncPtr() ! kDataTransGetSupportedTags = 12, //!< ANetDataTransGetSupportedTagsFuncPtr() ! kClusterGroupMain = 5, //!< ANetClusterGroupMainFuncPtr() ! kClusterFilterMain = 6, //!< ANetClusterFilterMainFuncPtr() ! kClusterFilterForced = 13, //!< ANetClusterFilterForcedFuncPtr() ! kHansdhakingProtocolMain = 7, //!< ANetHandshakingProtocolMainFuncPtr() ! kPacketProtocolMain = 8, //!< ANetPacketProtocolMainFuncPtr() ! kPacketProtocolStatus = 14, //!< ANetPacketProtocolStatusFuncPtr() ! kConnectionProtocolMain = 9, //!< ANetConnectionProtocolMainFuncPtr() ! kConnectionProtocolStatus = 15, //!< ANetConnectionProtocolStatusFuncPtr() ! kBandwidthManagerMain = 10, //!< ANetBandwidthManagerMainFuncPtr() ! kCoreModuleMain = 11, //!< ANetCoreModuleMainFuncPtr() ! kStubMain = 50, //!< ANetStubMainFuncPtr() ! kStubFunc1 = 51, //!< ANetStubFunc1Ptr() ! kStubFunc2 = 52 //!< ANetStubFunc2Ptr() }; *************** *** 122,123 **** --- 133,136 ---- #endif + + /*! \} */ Index: XMLCommon.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/XMLCommon.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** XMLCommon.h 2001/11/05 23:27:03 1.4 --- XMLCommon.h 2001/12/23 20:22:18 1.5 *************** *** 14,17 **** --- 14,33 ---- #include "Memory.h" + /*! + \addtogroup xml XML Accessors + \ingroup common + \brief XML accessor functions + + Those functions are used to read and manipulate XML-formatted + data. + \{ + */ + + /*! + \file + \brief Common XML accessor declarations + \author Benad + */ + typedef struct ANetAttribute { UInt8 *name; *************** *** 80,81 **** --- 96,100 ---- #endif + + /*! /} */ + |
From: Benoit N. <be...@us...> - 2001-12-22 21:36:11
|
Update of /cvsroot/anet/ANet/ANet_Daemon/Core In directory usw-pr-cvs1:/tmp/cvs-serv21699/Core Removed Files: Memory.c Log Message: Documented MMStubs --- Memory.c DELETED --- |
From: Benoit N. <be...@us...> - 2001-12-22 21:36:10
|
Update of /cvsroot/anet/ANet/ANet_Daemon/Common In directory usw-pr-cvs1:/tmp/cvs-serv21699/Common Modified Files: Memory.h Added Files: Memory.c Log Message: Documented MMStubs --- NEW FILE: Memory.c --- /****************************************************************** ANet_Daemon/Common/Memory.c Memory management for the run-time wrapper of the daemon. Part of the ANet project. Distributed under GPL: http://www.gnu.org/copyleft/gpl.html ******************************************************************/ #include "Memory.h" #include <stdlib.h> /*! \addtogroup memory \{ */ /*! \file \brief Memory management code \author Benad */ /* Current memory format: ANetMemoryTag is a memory location. The first 4 bytes are the size of the block. The remaining bytes is the data itself. */ /*! \brief Checks if an <CODE>ANetMemoryTag</CODE> is valid. \param tag The tag to check. \return Any non-zero value if the tag is valid. <CODE>0</CODE> otherwise. This function checks for the validity of an <CODE>ANetMemoryTag</CODE>. */ UInt32 IsTagValid(ANetMemoryTag tag) { return (tag != 0); } /*! \brief Creates a new memory block \param size The size, in bytes, of the memory block to create. \param flags Flags for the new memory block. Currently ignored; use <CODE>0</CODE>. \return A memory tag that represents the new memory block. This function creates a new memory block. It returns a new <CODE>ANetMemoryTag</CODE> which can be used with other functions. \par Use <CODE>IsTagValid()</CODE> to make sure the tag was generated properly and no error occured. \see IsTagValid() */ ANetMemoryTag NewMemoryBlock(UInt32 size, UInt32 flags) { // Soft-limit of 500MB assumed UInt32 *mem; if (size & 0xC0000000) { return (ANetMemoryTag)(0); } mem = (UInt32*)(malloc(size + sizeof(UInt32))); mem[0] = size; return (ANetMemoryTag)(mem); } /*! \brief Deletes a memory block. \param tag <CODE>ANetMemoryTag</CODE> to the block to delete. \return \li <CODE>0</CODE>: No error. \li <CODE>1</CODE>: Tag is invalid. This deletes a memory block generated by a previous call to <CODE>NewMemoryBlock()</CODE>. \see NewMemoryBlock() */ UInt32 DeleteMemoryBlock(ANetMemoryTag tag) { if (!tag) return 1; free((char*)(tag)); return 0; } /*! \brief Gets the size of a memory block. \param tag <CODE>ANetMemoryTag</CODE> to the memory block. \return The size, in bytes, of the memory block. This function returns the size of a memory block. \par The returned value is unexpected if <CODE>tag</CODE> is not valid, but the function should not produce any other error. \see IsTagValid() */ UInt32 GetMemoryBlockSize(ANetMemoryTag tag) { return *(UInt32*)(tag); } /*! \brief Resolves an <CODE>ANetMemoryTag</CODE>. \param tag The <CODE>ANetMemoryTag</CODE>. \param ptr The address of the pointer to set. \return \li <CODE>0</CODE>: No error. \li <CODE>1</CODE>: Invalid <CODE>tag</CODE> value. \li <CODE>2</CODE>: Invalid <CODE>ptr</CODE> value. This function returns a pointer to the beginning of a memory block pointed by an <CODE>ANetMemoryTag</CODE>. \warning The pointer returned is valid only within the scope of the function that called <CODE>ResolveMemoryTag</CODE>. That pointer might become invalid as soon as your function returns. */ UInt32 ResolveMemoryTag(ANetMemoryTag tag, UInt8 **ptr) { // Soft-limit of 500MB assumed if (!tag) return 1; if (!ptr) return 2; if (*((UInt32*)(tag)) & 0xC0000000) return 1; *ptr = (UInt8*)((UInt32*)(tag) + 1); return 0; } /*! \} */ Index: Memory.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Memory.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Memory.h 2001/11/05 23:27:03 1.3 --- Memory.h 2001/12/22 21:36:08 1.4 *************** *** 11,18 **** --- 11,57 ---- #define ANET_MEMORY + /*! + \addtogroup memory Memory Management Utilities + \ingroup utils + \brief Memory management utilites for the daemon + + Those functions are used to create, change, delete and manage + memory blocks allocated in the daemon's memory partition. + \par + Their implementation is totoally cross-platform yet are much more + flexible than what is offered by the functions offered in the + ANSI C libraries. + \par + While use of those functions is not essential, it is + highly recommended. Any data stored in a memory block + generated by those functions can be tracked (for leak detection), + stored on hard disk and relocated transparently. + \{ + */ + + /*! + \file + \brief Memory management declarations + \author Benad + */ + #include "ANetCommon.h" + /*! + \struct ANetMemoryTag + \brief Opaque memory tag + + <CODE>ANetMemoryTag</CODE> represents a memory block in memory. + It is "opaque" in the sense that you are not supposed to know + what its contents are. To access to the contents of the memory + block represented by an <CODE>ANetMemoryTag</CODE>, use + the function <CODE>ResolveMemoryTag</CODE>. + \see ResolveMemoryTag() + */ + typedef UInt32 ANetMemoryTag; + UInt32 IsTagValid(ANetMemoryTag tag); + ANetMemoryTag NewMemoryBlock(UInt32 size, UInt32 flags); UInt32 DeleteMemoryBlock(ANetMemoryTag tag); *************** *** 21,22 **** --- 60,63 ---- #endif + + /*! \} */ |
From: Benoit N. <be...@us...> - 2001-12-18 01:45:30
|
Update of /cvsroot/anet/ANet/ANet_Daemon/Common In directory usw-pr-cvs1:/tmp/cvs-serv21218/ANet/ANet_Daemon/Common Modified Files: ANetCommon.h Args.c Args.h Files.h Utilities.h Log Message: "" Index: ANetCommon.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/ANetCommon.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ANetCommon.h 2001/12/18 01:16:29 1.3 --- ANetCommon.h 2001/12/18 01:45:27 1.4 *************** *** 13,23 **** /*! \addtogroup common Common Code commom between the various parts of the ANet Daemon and common throughout its various ports. - */ - - /*! - \addtogroup utils Utilities - \ingroup common - Useful stuff, but maybe not essential. */ --- 13,19 ---- /*! \addtogroup common Common + \brief Common code between ports. + Code commom between the various parts of the ANet Daemon and common throughout its various ports. */ Index: Args.c =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Args.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Args.c 2001/12/12 20:05:09 1.2 --- Args.c 2001/12/18 01:45:27 1.3 *************** *** 1,2 **** --- 1,11 ---- + /****************************************************************** + ANet_Daemon/Common/Args.c + Argument utilities for the ANet daemon. + + Part of the ANet project. + + Distributed under GPL: http://www.gnu.org/copyleft/gpl.html + ******************************************************************/ + #include "Args.h" *************** *** 4,7 **** --- 13,18 ---- \addtogroup argUtils Argument Utilities \ingroup utils + \brief Arguments parser/generator. + Here are the argument utilities. They help parse/generate argument lists in the style of command-line arguments. *************** *** 11,15 **** /*! \file ! \brief Argument utilities. \author Chyrag \author Benad --- 22,26 ---- /*! \file ! \brief Argument utilities code. \author Chyrag \author Benad Index: Args.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Args.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Args.h 2001/12/12 20:05:09 1.2 --- Args.h 2001/12/18 01:45:27 1.3 *************** *** 1,2 **** --- 1,11 ---- + /****************************************************************** + ANet_Daemon/Common/Args.h + Argument utilities for the ANet daemon. + + Part of the ANet project. + + Distributed under GPL: http://www.gnu.org/copyleft/gpl.html + ******************************************************************/ + #include <stdio.h> #include <stdlib.h> *************** *** 4,9 **** /*! \file ! \brief Argument utilities. \author Chyrag \author Benad --- 13,23 ---- /*! + \addtogroup argUtils + \{ + */ + + /*! \file ! \brief Argument utilities declarations. \author Chyrag \author Benad *************** *** 12,13 **** --- 26,29 ---- void MakeArgumentString(int argc, char ** argv, char * outArgs, int argsSize); int GetArgument(char * inString, char * inArg, char * outVal, int valSize); + + /*! \} */ Index: Files.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Files.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** Files.h 2001/12/18 01:16:29 1.6 --- Files.h 2001/12/18 01:45:27 1.7 *************** *** 20,23 **** --- 20,25 ---- \addtogroup files File Management Wrappers \ingroup common + \brief Cross-platform file management wrappers. + Here are the File Management Wrappers. They are "wrapper" functions that allow access to file management functions in a cross-platform way. \{ Index: Utilities.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Utilities.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Utilities.h 2001/10/14 23:16:35 1.2 --- Utilities.h 2001/12/18 01:45:27 1.3 *************** *** 12,16 **** #define ANET_COMMON_UTILITIES ! //Connection status enum { --- 12,28 ---- #define ANET_COMMON_UTILITIES ! /*! ! \addtogroup utils Utilities ! \ingroup common ! \brief Useful stuff, but maybe not essential. ! \{ ! */ ! ! /*! ! \file ! \brief Useful declarations. ! */ ! ! //! Connection status enum { *************** *** 19,20 **** --- 31,34 ---- kConnectionOnHold = 2 }; + + /*! \} */ |
From: Benoit N. <be...@us...> - 2001-12-18 01:25:59
|
Update of /cvsroot/anet/ANet/ANet_Daemon/Linux In directory usw-pr-cvs1:/tmp/cvs-serv16871/ANet/ANet_Daemon/Linux Modified Files: FilesSpecific.h Log Message: "" Index: FilesSpecific.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Linux/FilesSpecific.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** FilesSpecific.h 2001/12/18 01:16:29 1.2 --- FilesSpecific.h 2001/12/18 01:25:57 1.3 *************** *** 30,34 **** This is an "opaque" type that represents a file. It can be changed only through the functions described by this document. The data contained in the type contains all necessary information about the file and its state. If the file is closed, you can safely save to any long-term medium (hard disk, another computer...) the data contained in <CODE>ANetFile</CODE> and re-use the data later, even after a reboot. ! You can get the size of the ANetFile data structure with the sizeof operator: \verbatim sizeof(ANetFile)\endverbatim --- 30,34 ---- This is an "opaque" type that represents a file. It can be changed only through the functions described by this document. The data contained in the type contains all necessary information about the file and its state. If the file is closed, you can safely save to any long-term medium (hard disk, another computer...) the data contained in <CODE>ANetFile</CODE> and re-use the data later, even after a reboot. ! You can get the size of the <CODE>ANetFile</CODE> data structure with the sizeof operator: \verbatim sizeof(ANetFile)\endverbatim |
From: Benoit N. <be...@us...> - 2001-12-18 01:16:33
|
Update of /cvsroot/anet/Documentation In directory usw-pr-cvs1:/tmp/cvs-serv15311/Documentation Modified Files: Doxyfile Added Files: footer.html Log Message: "" --- NEW FILE: footer.html --- <hr><address><small> Generated on $datetime for $projectname by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.gif" alt="doxygen" align="middle" border=0 width=110 height=53> </a> $doxygenversion written by <a href="mailto:di...@st...">Dimitri van Heesch</a>, © 1997-2001</small></address> <p><a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.php?group_id=15189" width="88" height="31" border="0" alt="SourceForge Logo"></a></p> </body> </html> Index: Doxyfile =================================================================== RCS file: /cvsroot/anet/Documentation/Doxyfile,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Doxyfile 2001/12/12 20:04:41 1.1 --- Doxyfile 2001/12/18 01:16:29 1.2 *************** *** 433,437 **** # standard footer. ! HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user defined cascading --- 433,437 ---- # standard footer. ! HTML_FOOTER = footer.html # The HTML_STYLESHEET tag can be used to specify a user defined cascading |
From: Benoit N. <be...@us...> - 2001-12-18 01:16:32
|
Update of /cvsroot/anet/ANet/ANet_Daemon/Linux In directory usw-pr-cvs1:/tmp/cvs-serv15311/ANet/ANet_Daemon/Linux Modified Files: FilesSpecific.h Added Files: Files.c Log Message: "" --- NEW FILE: Files.c --- /****************************************************************** ANet_Daemon/Linux/Files.c Code for file management in the ANet deamon. This code is specific to Linux. Part of the run-time wrapper of the ANet project. Distributed under GPL: http://www.gnu.org/copyleft/gpl.html ******************************************************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include "Files.h" /*! \addtogroup files \{ */ /*! \file \brief Linux-specific code for the File Management Wrappers. \author Chyrag */ ANetFile ANetInitFile(void) { ANetFile f; f.busy = FALSE; f.open = FALSE; f.async = TRUE; f.path = NULL; return f; } UInt32 ANetGetSetFilePath(ANetFile *f, ANetMemoryTag path, UInt8 set) { int len; if (!f) return 2; // ? if (f->busy) return 60; if (f->open) return 4; if (set) { len = strlen(path); f->path = malloc(len + 1); if (!f->path) return 5; else { FILE * fp; strncpy(f->path, path, len); fp = fopen(f->path, "w"); // is there any better way to create a file? fclose(fp); return 0; } } else { //doubts } return 0; // ?? } UInt32 ANetGetSetFileAsync(ANetFile *f, UInt8 *async, UInt8 set) { if (!async) return 1; if (f->busy) return 60; if (set) { if (f->busy) return 60; if (f->async && *async) return 0; if (!(f->async || *async)) return 0; close(f->fd); if (*async) f->fd = open(f->path, O_RDWR | O_APPEND); else f->fd = open(f->path, O_RDWR | O_APPEND | O_SYNC); if (f->fd < 0) return -1; // open failed } else *async = f->async; return 0; } UInt8 ANetIsFileBusy(ANetFile * f) { return f->busy; } UInt32 ANetGetFileSize(ANetFile *f, UInt32 *size) { struct stat statbuf; extern int errno; if (f->busy) return 60; if (!size) return 3; if (stat(f->path, &statbuf) < 0) { switch(errno) { case ENOENT: return 2; default: return 1; } } *size = statbuf.st_size; return 0; } UInt32 ANetOpenFile(ANetFile *f) { if (f->busy) return 60; if (f->open) return 2; // this is not part of the doc if (f->async) f->fd = open(f->path, O_RDWR | O_APPEND); else f->fd = open(f->path, O_RDWR | O_APPEND | O_SYNC); if (f->fd < 0) return 1; return 0; } UInt32 ANetCloseFile(ANetFile *f) { if (f->busy) return 60; if (close(f->fd) < 0) return 1; return 0; } UInt32 ANetReadFile(ANetFile *f, UInt32 startPos, UInt32 length, ANetMemoryTag buffer, UInt32 *read) { return 0; } UInt32 ANetWriteFile(ANetFile *f, ANetMemoryTag buffer); UInt32 ANetWriteFileAt(ANetFile *f, ANetMemoryTag buffer, UInt32 pos); UInt32 ANetDeleteFile(ANetFile *f); UInt32 ANetCopyFile(ANetFile *source, ANetFile *dest); /*! \} */ Index: FilesSpecific.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Linux/FilesSpecific.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** FilesSpecific.h 2001/12/04 00:45:46 1.1 --- FilesSpecific.h 2001/12/18 01:16:29 1.2 *************** *** 14,22 **** #define ANET_FILES_SPECIFIC typedef struct { ! //... ! UInt8 busy; ! UInt8 async; } ANetFile; #endif --- 14,46 ---- #define ANET_FILES_SPECIFIC + /*! + \addtogroup files + \{ + */ + + /*! + \file + \brief Linux-specific declarations for the File Management Wrappers + \author Benad + \author Chyrag + */ + + /*! + \brief A cross-platform file identifier. + + This is an "opaque" type that represents a file. It can be changed only through the functions described by this document. The data contained in the type contains all necessary information about the file and its state. If the file is closed, you can safely save to any long-term medium (hard disk, another computer...) the data contained in <CODE>ANetFile</CODE> and re-use the data later, even after a reboot. + You can get the size of the ANetFile data structure with the sizeof operator: + \verbatim + sizeof(ANetFile)\endverbatim + */ typedef struct { ! boolean busy; //!< busy flag ! boolean open; //!< open flag ! boolean async; //!< async flag ! unsigned char * path; //!< path to the file ! int fd; //!< the file descriptor } ANetFile; #endif + + /*! \} */ |
From: Benoit N. <be...@us...> - 2001-12-18 01:16:32
|
Update of /cvsroot/anet/ANet/ANet_Daemon/Common In directory usw-pr-cvs1:/tmp/cvs-serv15311/ANet/ANet_Daemon/Common Modified Files: ANetCommon.h Files.h Log Message: "" Index: ANetCommon.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/ANetCommon.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ANetCommon.h 2001/12/12 20:05:09 1.2 --- ANetCommon.h 2001/12/18 01:16:29 1.3 *************** *** 44,46 **** --- 44,51 ---- #endif //__MACTYPES__ + typedef char boolean; + + #define FALSE 0 + #define TRUE 1 + #endif Index: Files.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Files.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** Files.h 2001/12/12 20:05:09 1.5 --- Files.h 2001/12/18 01:16:29 1.6 *************** *** 30,42 **** --- 30,225 ---- */ + /*! + \brief Initializes an <CODE>ANetFile</CODE> structure. + \return A properly initialized ANetFile structure + \see ANetGetSetFilePath() ANetWriteFile() + + This function returns a properly <CODE>ANetFile</CODE> structure. This does not + create any new file; to create a new file, set it's path to the new + file's location (with <CODE>ANetGetSetFilePath()</CODE>), then write some data in + the file (with <CODE>ANetWriteFile()</CODE>); + */ ANetFile ANetInitFile(); + + /*! + \brief Gets or sets the file path of an <CODE>ANetFile</CODE>. + \param f The file + \param path A memory block. It contains a NULL terminated string. + \param set If <CODE>0</CODE>, the function will put the file's path, as a NULL + terminated string, in path. Otherwise, the function will set the + file's path to function result. + + \return + \li <CODE>0</CODE>: No error + \li <CODE>1</CODE>: Can't change path + \li <CODE>2</CODE>: Invalid path + \li <CODE>3</CODE>: path is invalid or not big enough + \li <CODE>4</CODE>: file is open + \li <CODE>60</CODE>: File is busy ("busy" flag is true) + + This function will not set or get the file path of the <CODE>ANetFile</CODE> + structure pointed by <CODE>f</CODE>. You cannot change the path of the file while + it is open or busy. Also not, all paths are accepted on every + operating system, and so it is recommended that you do not go outside + the directory that contains the ANet daemon. + */ UInt32 ANetGetSetFilePath(ANetFile *f, ANetMemoryTag path, UInt8 set); + + /*! + \brief Gets or sets the asynchronous flag of an <CODE>ANetFile</CODE>. + \param f The file + \param async A byte containing the "async" flag value; if 0, the file is + used synchronously, otherwise it is used asynchronously. + \param set If 0, the value of the "async" flag of the file is put in the + byte pointed by async. Otherwise, the value of "async" of the file is + set to the value pointed by async. + + \return + \li <CODE>0</CODE>: No error + \li <CODE>1</CODE>: Invalid pointer for async + \li <CODE>60</CODE>: File is busy ("busy" flag is true). + + This function gets or sets the value of the "async" flag of a + <CODE>ANetFile</CODE> structure. If the "async" flag is true, then all the I/O + operations done on the file will be asynchronous. Note that on some + operating systems some functions might not support asynchronous I/O. + */ UInt32 ANetGetSetFileAsync(ANetFile *f, UInt8 *async, UInt8 set); + + /*! + \brief Returns the value of the "busy"flag of an <CODE>ANetFile</CODE>. + \param f The file + \result + \li <CODE>0</CODE>: the file is not busy + \li <CODE>1</CODE>: the file is busy + + This function returns the value of "busy" flag of the file. When the + "busy" flag is 1, the file is current busy doing some IO, because + it's "async" flag is true (see <CODE>ANetGetSetFileAsync()</CODE>) and some IO has + not finished. + \see ANetGetSetFileAsync() + */ UInt8 ANetIsFileBusy(ANetFile *f); + + + /*! + \brief Gets the size of a file pointed by an <CODE>ANetFile</CODE>. + \param f The file + \param size A pointer to an unsigned 32 bit value containing the file size, + in bytes. + + \return + \li <CODE>0</CODE>: no error + \li <CODE>1</CODE>: can't get the file size + \li <CODE>2</CODE>: file does not exist + \li <CODE>3</CODE>: invalid pointer for size + \li <CODE>60</CODE>: file is busy ("busy" flag is true) + + This function returns in the value pointed by size the size, in + bytes, of the file. The file must exists and not be busy to be able + to call this function. This function can be also used to know if a + file exists at some location. + */ UInt32 ANetGetFileSize(ANetFile *f, UInt32 *size); + + /*! + \brief Opens a file pointed by an <CODE>ANetFile</CODE>. + \param f The file to open + + \return + \li <CODE>0</CODE>: no error + \li <CODE>1</CODE>: can't open the file + \li <CODE>60</CODE>: file is busy ("busy" flag is true) + + This function opens the file pointed by <CODE>f</CODE>. While it is not required + to open the file before using any of the following file operations, + it is highly recommended that you open the file if you plan to do + several operations on it. If the file is set to asynchronous mode + (set <CODE>ANetGetSetFileAsync()</CODE>), then the function will immediately + return and will set the "busy" flag to true, until the operation is + done, when the "busy" flag will set to false again. + \see ANetGetSetFileAsync() + */ UInt32 ANetOpenFile(ANetFile *f); + + /*! + \brief Closes a file pointed by an <CODE>ANetFile</CODE>. + \param f The file to close + + \return + \li <CODE>0</CODE>: no error + \li <CODE>1</CODE>: can't close the file + \li <CODE>60</CODE>: file is busy ("busy" flag is true) + + Closes the file pointed by f that was previously opened by + <CODE>ANetOpenFile()</CODE>. If the file is set to asynchronous mode (see + <CODE>ANetGetSetFileAsync()</CODE>), then the function will immediately return and + will set the "async" flag to true until the operation is done, when + the "async" flag will be set to false again. + \see ANetOpenFile() ANetGetSetFileAsync() + */ UInt32 ANetCloseFile(ANetFile *f); + + /*! + \brief Reads data from a file pointed bu an <CODE>ANetFile</CODE>. + \param f The file to read from + \param startPos Starting position of the data to be read. + The first possible position in a file is 0. + \param length The amount of data to read + \param buffer Buffer in which the read data will be put. + \param read Pointer to the amount of bytes read. + + \return + \li <CODE>0</CODE>: No error + \li <CODE>1</CODE>: can't open the file + \li <CODE>2</CODE>: can't close the file after operation + \li <CODE>3</CODE>: can't read from the file + \li <CODE>4</CODE>: file doesn't exist + \li <CODE>5</CODE>: bad value for startPos (<CODE>startPos >= filesize</CODE>) + \li <CODE>6</CODE>: bad value for length (<CODE>startPos + length > filesize</CODE>) + \li <CODE>7</CODE>: buffer invalid or too small + \li <CODE>60</CODE>: file is busy ("busy" flag is true) + + This function reads bytes <CODE>startPos</CODE> to <CODE>endPos - 1</CODE> of the file into the + buffer. The buffer must be big enough to contain the data that was + read. Once the data is read, the value pointed by read will be + changed to the number of bytes read into the buffer. If the value of + read is smaller than <CODE>length</CODE>, then you can safely assume that the file + was fully read. If the <CODE>ANetOpenFile()</CODE> function was not previously + called on the file pointed by <CODE>f</CODE>, then this function will open the + file before the read operation and close the file after the read + operation. Otherwise, this function will not close the file after the + read operation. This function does not support files bigger than + <CODE>2^32</CODE> bytes. If the file is set to asynchronous mode (see + <CODE>ANetGetSetFileAsync()</CODE>), then the function will immediatly return and + will set the "async" flag to true until the operation is done, when + the "async" flag will be set to false again. + */ UInt32 ANetReadFile(ANetFile *f, UInt32 startPos, UInt32 length, ANetMemoryTag buffer, UInt32 *read); + + /*! + \brief Writes at the end of a file pointed by an <CODE>ANetFile</CODE>. + \param f The file + \param buffer the data to write + + \return + \li <CODE>0</CODE>: no error + \li <CODE>1</CODE>: can't open the file + \li <CODE>2</CODE>: can't close the file after operation + \li <CODE>3</CODE>: can't write to file + \li <CODE>4</CODE>: buffer is invalid + \li <CODE>60</CODE>: file is busy ("busy" flag is true) + + This function writes the bytes in buffer at the end of the file. If + the file does not already exist, a new file is created. If you want + to write to a new file, use <CODE>ANetDeleteFile()</CODE> first. If the file is set + to asynchronous mode (see <CODE>ANetGetSetFileAsync()</CODE>), then the function + will immediatly return and will set the "async" flag to true until + the operation is done, when the "async" flag will be set to false + again. + \see ANetDeleteFile() ANetGetSetFileAsync() + */ UInt32 ANetWriteFile(ANetFile *f, ANetMemoryTag buffer); + UInt32 ANetWriteFileAt(ANetFile *f, ANetMemoryTag buffer, UInt32 pos); UInt32 ANetDeleteFile(ANetFile *f); |
From: Benoit N. <be...@us...> - 2001-12-17 16:02:45
|
Update of /cvsroot/anet/ANet In directory usw-pr-cvs1:/tmp/cvs-serv20399 Modified Files: CONTRIB Log Message: "" Index: CONTRIB =================================================================== RCS file: /cvsroot/anet/ANet/CONTRIB,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** CONTRIB 2001/12/11 23:34:02 1.5 --- CONTRIB 2001/12/17 16:02:42 1.6 *************** *** 18,22 **** mailto:ch...@ya... mailto:ch...@us... ! http://chyrag.dhs.org/ Prasanna Gopinath: --- 18,22 ---- mailto:ch...@ya... mailto:ch...@us... ! http://symonds.net/~chyrag/ Prasanna Gopinath: |
From: Benoit N. <be...@us...> - 2001-12-12 20:05:13
|
Update of /cvsroot/anet/ANet/ANet_Daemon/Common/Lists In directory usw-pr-cvs1:/tmp/cvs-serv3540/ANet_Daemon/Common/Lists Modified Files: BinaryTrees.c DoubleLinkedLists.c LinkedLists.c LinkedLists.h Log Message: Starting low-level docs with doxygen Index: BinaryTrees.c =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Lists/BinaryTrees.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** BinaryTrees.c 2001/11/05 23:27:03 1.1 --- BinaryTrees.c 2001/12/12 20:05:09 1.2 *************** *** 1,7 **** --- 1,18 ---- /* Binary trees. */ + /*! + \addtogroup lists + \{ + */ + + /*! + \file + \brief Binary trees. + */ + #include <stdlib.h> #include "LinkedLists.h" + //! Inserts a node in a binary tree. void InsertInTree(BinaryNodePtr theNode, BinaryNodePtr *root, SInt8 (*CompareFunction)(NodePtr a, NodePtr b)) *************** *** 26,36 **** } BinaryNodePtr SortedDoubleToBinaryWithSize(DoubleNodePtr linkedList, UInt32 size) { - /* - Note: Ignores the "prev" pointers. So, if you want to pass the result - of BinaryToDouble to this function, you don't need to call FillPrev - first. - */ UInt32 halfSize = (size >> 1), counter, sizeA, sizeB; DoubleNodePtr middleNode; --- 37,48 ---- } + //! Transforms a sorted double linked list into a binary tree. + /*! + \note Ignores the "prev" pointers. So, if you want to pass the result + of BinaryToDouble to this function, you don't need to call FillPrev + first. + */ BinaryNodePtr SortedDoubleToBinaryWithSize(DoubleNodePtr linkedList, UInt32 size) { UInt32 halfSize = (size >> 1), counter, sizeA, sizeB; DoubleNodePtr middleNode; *************** *** 60,63 **** --- 72,76 ---- } + //! Transforms a (sorted) binary tree to a sorted double linked list. DoubleNodePtr BinaryToDouble(BinaryNodePtr root, UInt8 fillPrev) { *************** *** 73,81 **** } IndirectNodePtr* LeftNodeRight(BinaryNodePtr node, IndirectNodePtr *theList) { - /* - Used only for the BinaryToDouble function. - */ IndirectNodePtr newNode = malloc(sizeof(IndirectNode)); if (node->left) --- 86,95 ---- } + //! Used only for the <CODE>BinaryToDouble</CODE> function. + /*! + \see BinaryToDouble() + */ IndirectNodePtr* LeftNodeRight(BinaryNodePtr node, IndirectNodePtr *theList) { IndirectNodePtr newNode = malloc(sizeof(IndirectNode)); if (node->left) *************** *** 90,93 **** --- 104,111 ---- } + //! Balances a binary tree. + /*! + \note Can be quite slow. You've been warned. + */ void BalanceTree(BinaryNodePtr *root) { *************** *** 96,97 **** --- 114,117 ---- /* It's that small! Wow! */ } + + /*! \} */ Index: DoubleLinkedLists.c =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Lists/DoubleLinkedLists.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** DoubleLinkedLists.c 2001/11/05 23:27:03 1.1 --- DoubleLinkedLists.c 2001/12/12 20:05:09 1.2 *************** *** 1,12 **** /* Double linked lists. */ #include <stdlib.h> #include "LinkedLists.h" void InvertDoubleList(DoubleNodePtr *doubleLinkedListPtr) { - /* - Same as InvertList, but for double linked lists, and much faster. - */ DoubleNodePtr curNode = *doubleLinkedListPtr, copyPtr; while (1) --- 1,24 ---- /* Double linked lists. */ + /*! + \addtogroup lists + \{ + */ + + /*! + \file + \brief Double linked lists. + */ + #include <stdlib.h> #include "LinkedLists.h" + + //! Same as InvertList, but for double linked lists, and much faster. + /*! + \see InvertList() + */ void InvertDoubleList(DoubleNodePtr *doubleLinkedListPtr) { DoubleNodePtr curNode = *doubleLinkedListPtr, copyPtr; while (1) *************** *** 22,30 **** } UInt32 FindFirst(DoubleNodePtr linkedList, DoubleNodePtr* first) { - /* - Same as FindLast, but backwards with a double linked list. - */ DoubleNodePtr curNode; UInt32 nbrNodes = 0; --- 34,43 ---- } + //! Same as FindLast, but backwards with a double linked list. + /* + \see FindLast() + */ UInt32 FindFirst(DoubleNodePtr linkedList, DoubleNodePtr* first) { DoubleNodePtr curNode; UInt32 nbrNodes = 0; *************** *** 36,45 **** } void FillPrev(DoubleNodePtr linkedList) { - /* - Fills the 'prev' values based on the single linked list given - by the 'next' values. - */ DoubleNodePtr prev = NULL, curNode = linkedList; while (curNode) --- 49,59 ---- } + //! Fills the <CODE>"prev"</CODE> values. + /* + Fills the 'prev' values based on the single linked list given + by the 'next' values. + */ void FillPrev(DoubleNodePtr linkedList) { DoubleNodePtr prev = NULL, curNode = linkedList; while (curNode) *************** *** 50,51 **** --- 64,67 ---- } } + + /*! \} */ Index: LinkedLists.c =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Lists/LinkedLists.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** LinkedLists.c 2001/11/05 23:27:03 1.1 --- LinkedLists.c 2001/12/12 20:05:09 1.2 *************** *** 1,16 **** /* Single and indirect linked lists.*/ #include <stdlib.h> #include <math.h> #include "LinkedLists.h" UInt32 DestroyLinkedList(NodePtr linkedList, UInt8 (*DestructorFunction)(NodePtr theNode)) { ! /* ! Destroys all elements in a linked list pointed by "linkedList". ! The destructor function must destroy the node and return 0 only ! if no error occured. ! Returns the number of nodes successfully destroyed. ! */ NodePtr curNode, copyPtr; UInt32 nbrDestroyed = 0; --- 1,28 ---- /* Single and indirect linked lists.*/ + /*! + \addtogroup lists + \{ + */ + + /*! + \file + \brief Single and indirect linked lists. + */ + #include <stdlib.h> #include <math.h> #include "LinkedLists.h" + //! Destroys all elements in a linked list. + /*! + Destroys all elements in a linked list pointed by <CODE>"linkedList"</CODE>. + The destructor function must destroy the node and return 0 only + if no error occured. + Returns the number of nodes successfully destroyed. + */ UInt32 DestroyLinkedList(NodePtr linkedList, UInt8 (*DestructorFunction)(NodePtr theNode)) { ! NodePtr curNode, copyPtr; UInt32 nbrDestroyed = 0; *************** *** 28,31 **** --- 40,44 ---- } + //! Destroys an indirect node. UInt8 DestroyIndirectNode(NodePtr theNode) { *************** *** 34,45 **** } UInt32 FindLast(NodePtr linkedList, NodePtr* last) { ! /* ! Sets "*last" to point at the last node of the linked lisk pointed by ! "linkedList", unless "last" is NULL. ! Returns the numbers of nodes in the list. ! You can also use the macro function "NbrNodes(NodePtr linkedList);". ! */ NodePtr curNode; UInt32 nbrNodes = 0; --- 47,61 ---- } + //! Finds the last node in a linked list. + /*! + Sets <CODE>"*last"</CODE> to point at the last node of the linked lisk pointed by + <CODE>"linkedList"</CODE>, unless <CODE>"last"</CODE> is <CODE>NULL</CODE>. + Returns the numbers of nodes in the list. + You can also use the macro function <CODE>"NbrNodes(NodePtr linkedList);"</CODE>. + \see NbrNodes() + */ UInt32 FindLast(NodePtr linkedList, NodePtr* last) { ! NodePtr curNode; UInt32 nbrNodes = 0; *************** *** 51,60 **** } NodePtr GetNthNode(NodePtr linkedList, UInt32 n) { - /* - Returns a pointer to the Nth node of the linked list, the first node - being node 0 (the 0th node?), as with arrays. - */ NodePtr curNode = linkedList; while ( (n--) && (curNode) ) --- 67,77 ---- } + //! Finds the Nth node of a linked list. + /*! + Returns a pointer to the Nth node of the linked list, the first node + being node 0 (the 0th node), as with arrays. + */ NodePtr GetNthNode(NodePtr linkedList, UInt32 n) { NodePtr curNode = linkedList; while ( (n--) && (curNode) ) *************** *** 63,73 **** } NodePtr SplitAtNth(NodePtr linkedList, UInt32 n) { - /* - Splits the linked list pointed by "linkedList" into 2 linked lists - after node "n", the first node being node 0, as with arrays. - Returns a pointer to the beginning of the second linked list. - */ UInt32 curPos = 0; NodePtr curNode, copyPtr; --- 80,91 ---- } + //! Splits a linked list in two. + /*! + Splits the linked list pointed by <CODE>"linkedList"</CODE> into 2 linked lists + after node <CODE>"n"</CODE>, the first node being node 0, as with arrays. + Returns a pointer to the beginning of the second linked list. + */ NodePtr SplitAtNth(NodePtr linkedList, UInt32 n) { UInt32 curPos = 0; NodePtr curNode, copyPtr; *************** *** 82,94 **** } IndirectNodePtr FindAndList(NodePtr linkedList, UInt8 (*IsWhatIWant)(NodePtr theNode)) { - /* - Using the key function "IsWhatIWant", makes a new indirect list (made of - indirect nodes) that lists pointers to found nodes. They are listed in - the order that they were found. - Call "DestroyLinkedList((Node*)(returnedIndirectList), DestroyIndirectNode);" - to destroy the indirect linked list returned by this function. - */ NodePtr curNode; IndirectNodePtr foundList = NULL, lastInFoundList = NULL; --- 100,114 ---- } + //! Finds nodes in a linked list based on a "matching" function. + /*! + Using the key function <CODE>"IsWhatIWant"</CODE>, makes a new indirect list (made of + indirect nodes) that lists pointers to found nodes. They are listed in + the order that they were found. + Call <CODE>"DestroyLinkedList((Node*)(returnedIndirectList), DestroyIndirectNode);"</CODE> + to destroy the indirect linked list returned by this function. + \see DestroyLinkedList() + */ IndirectNodePtr FindAndList(NodePtr linkedList, UInt8 (*IsWhatIWant)(NodePtr theNode)) { NodePtr curNode; IndirectNodePtr foundList = NULL, lastInFoundList = NULL; *************** *** 117,126 **** } NodePtr FindAndMoveOut(NodePtr *linkedListPtr, UInt8 (*IsWhatIWant)(NodePtr theNode)) { - /* - Does the same thing as "FindAndList", but also removes all found nodes - and places them in a new single linked list, which is the returned value. - */ NodePtr *curNodePtrPtr, newList; IndirectNodePtr foundList = FindAndList(*linkedListPtr, IsWhatIWant), curIndirect; --- 137,148 ---- } + //! Finds and removes nodes based on a "matching" function. + /*! + Does the same thing as <CODE>"FindAndList"</CODE>, but also removes all found nodes + and places them in a new single linked list, which is the returned value. + \see FindAndList() + */ NodePtr FindAndMoveOut(NodePtr *linkedListPtr, UInt8 (*IsWhatIWant)(NodePtr theNode)) { NodePtr *curNodePtrPtr, newList; IndirectNodePtr foundList = FindAndList(*linkedListPtr, IsWhatIWant), curIndirect; *************** *** 150,162 **** } void ApplyIndirectOnSimple(IndirectNodePtr indirectList) { - /* - Applies the indirect linked list on the single list. - This means that if an indirect node IndB, that points to node B, is after - the indirect node IndA, that points to node A, in the indirect linked list, - then this function will make node B be after node A in the single linked - list. - */ IndirectNodePtr curIndirect; for (curIndirect = indirectList; curIndirect->nodeHeader.next; --- 172,185 ---- } + //! Applies an indirect linked list on a linked list. + /*! + Applies the ordering of an indirect linked list on the single list. + This means that if an indirect node IndB, that points to node B, is after + the indirect node IndA, that points to node A, in the indirect linked list, + then this function will make node B be after node A in the single linked + list. + */ void ApplyIndirectOnSimple(IndirectNodePtr indirectList) { IndirectNodePtr curIndirect; for (curIndirect = indirectList; curIndirect->nodeHeader.next; *************** *** 171,181 **** } void InvertList(NodePtr *linkedListPtr) { - /* - Inverts the list pointed by *linkedListPtr. So, a->b->c becomes c->b->a. - If you plan to do this often, use InvertDoubleList with a double linked list, - as it's much faster. - */ NodePtr newList, lastNode; UInt32 nbrNodes = NbrNodes(*linkedListPtr), curNth; --- 194,206 ---- } + //! Inverses a linked list. + /*! + Inverts the list pointed by *linkedListPtr. So, a->b->c becomes c->b->a. + If you plan to do this often, use InvertDoubleList with a double linked list, + as it's much faster. + \see InvertDoubleList + */ void InvertList(NodePtr *linkedListPtr) { NodePtr newList, lastNode; UInt32 nbrNodes = NbrNodes(*linkedListPtr), curNth; *************** *** 194,205 **** } void SplitAndMergeSort(NodePtr *linkedList, SInt8 (*CompareFunction)(NodePtr a, NodePtr b)) { - /* - Given a pointer to the beginning of a linked list and a compare function, - this function sorts the list using the "split-merge" algorythm. - CompareFunction(NodePtr a, NodePtr b) should return a value < 1 if and only if - a is smaller than b. - */ Node empty; NodePtr listA, listB, curNode = &empty, newList = ∅ --- 219,231 ---- } + //! Sorts a linked list. + /*! + Given a pointer to the beginning of a linked list and a compare function, + this function sorts the list using the "split-merge" algorythm. + <CODE>CompareFunction(NodePtr a, NodePtr b)</CODE> should return a value < 1 if and only if + a is smaller than b. + */ void SplitAndMergeSort(NodePtr *linkedList, SInt8 (*CompareFunction)(NodePtr a, NodePtr b)) { Node empty; NodePtr listA, listB, curNode = &empty, newList = ∅ *************** *** 210,214 **** listB = SplitAtNth(listA, nbrNodesFullList/2); ! /* ...(sorting)... */ if (floor((double)(nbrNodesFullList)/2) > 1) /* Size of listA */ SplitAndMergeSort(&listA, CompareFunction); --- 236,240 ---- listB = SplitAtNth(listA, nbrNodesFullList/2); ! /* ...(sorting)... */ if (floor((double)(nbrNodesFullList)/2) > 1) /* Size of listA */ SplitAndMergeSort(&listA, CompareFunction); *************** *** 216,220 **** SplitAndMergeSort(&listB, CompareFunction); ! /* ... and Merge */ while (listA && listB) { --- 242,246 ---- SplitAndMergeSort(&listB, CompareFunction); ! /* ... and Merge */ while (listA && listB) { *************** *** 249,250 **** --- 275,278 ---- *linkedList = newList; } + + /*! \} */ Index: LinkedLists.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Lists/LinkedLists.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** LinkedLists.h 2001/11/05 23:27:03 1.1 --- LinkedLists.h 2001/12/12 20:05:09 1.2 *************** *** 2,15 **** #define __BENAD_LINKED_LISTS__ ! #ifndef __MACTYPES__ ! /* ! This is assuming that: ! char = 8 bits, ! short = 16 bits and ! long = 32 bits. ! If this is false, just change those typedefs correctly. */ typedef unsigned char UInt8; typedef signed char SInt8; --- 2,34 ---- #define __BENAD_LINKED_LISTS__ ! /*! ! \addtogroup lists Linked Lists ! \ingroup utils ! \brief Linked list utilities. ! ! Those are Link List utility functions. ! They help the maintenance and use of single linked lists, double linked lists and of binary trees. ! They are very low-level, thus making use of it will require use of typecasting. The trick is to make a new structure that starts with the <I>exact</I> same contents as the <CODE>Node</CODE> structure. Here's an example: ! \code ! struct MyNode { ! Node n; ! int val; ! };\endcode ! \{ ! */ ! /*! ! \file ! \brief Linked lists header. ! ! This file assumes that: ! <UL><LI><CODE>char</CODE> = 8 bits,</LI> ! <LI><CODE>short</CODE> = 16 bits and</LI> ! <LI><CODE>long</CODE> = 32 bits.</LI></UL> ! If this is false, just change the typedefs correctly. */ + #ifndef __MACTYPES__ + typedef unsigned char UInt8; typedef signed char SInt8; *************** *** 21,24 **** --- 40,47 ---- #endif /* #ifndef __MACTYPES__ */ + //! A node in a single linked list. + /*! + The only thing that is assumed with the use of this function is that any structure that you want to use for a linked list node (whatever is the actual contents) starts with a pointer to the next node. + */ typedef struct Node { *************** *** 26,29 **** --- 49,56 ---- } Node, *NodePtr; + //! A node in a linked list that additionally points to a node in another list. + /*! + This is made to make an ordered list of some nodes in another, differently ordered list. + */ typedef struct IndirectNode { *************** *** 32,35 **** --- 59,66 ---- } IndirectNode, *IndirectNodePtr; + //! A node in a double linked list. + /*! + This node points to both directions in a linked list. Because it starts with the <CODE>next</CODE> pointer, it can be safely typecasted as a <CODE>Node</CODE>. + */ typedef struct DoubleNode { *************** *** 38,41 **** --- 69,76 ---- } DoubleNode, *DoubleNodePtr; + //! A node in a binary tree. + /*! + This node points to the left and right child in a binary tree. + */ typedef struct BinaryNode { *************** *** 46,49 **** --- 81,88 ---- UInt32 DestroyLinkedList(NodePtr linkedList, UInt8 (*DestructorFunction)(NodePtr theNode)); UInt32 FindLast(NodePtr linkedList, NodePtr* last); + //! Returns the number of nodes in a list. + /*! + This is actually a macro, so be careful. + */ #define NbrNodes(linkedList) FindLast(linkedList, NULL) NodePtr GetNthNode(NodePtr linkedList, UInt32 n); *************** *** 62,65 **** --- 101,109 ---- SInt8 (*CompareFunction)(NodePtr a, NodePtr b)); BinaryNodePtr SortedDoubleToBinaryWithSize(DoubleNodePtr linkedList, UInt32 size); + //! Transforms a double linked list into a binary tree. + /*! + This is a shortcut to the function <CODE>SortedDoubleToBinaryWithSize</CODE>. + \see SortedDoubleToBinaryWithSize() + */ #define SortedDoubleToBinary(l) SortedDoubleToBinaryWithSize(l, NbrNodes((NodePtr)(l))); DoubleNodePtr BinaryToDouble(BinaryNodePtr root, UInt8 fillPrev); *************** *** 70,71 **** --- 114,117 ---- #endif /* #ifndef __BENAD_LINKED_LISTS__ */ + + /*! \} */ |
From: Benoit N. <be...@us...> - 2001-12-12 20:05:13
|
Update of /cvsroot/anet/ANet/ANet_Daemon/Common In directory usw-pr-cvs1:/tmp/cvs-serv3540/ANet_Daemon/Common Modified Files: ANetCommon.h Args.c Args.h Files.h Log Message: Starting low-level docs with doxygen Index: ANetCommon.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/ANetCommon.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ANetCommon.h 2001/11/05 23:27:03 1.1 --- ANetCommon.h 2001/12/12 20:05:09 1.2 *************** *** 11,14 **** --- 11,35 ---- #define ANET_COMMON + /*! + \addtogroup common Common + Code commom between the various parts of the ANet Daemon and common throughout its various ports. + */ + + /*! + \addtogroup utils Utilities + \ingroup common + Useful stuff, but maybe not essential. + */ + + /*! + \addtogroup common + \{ + */ + + /*! + \file + \brief Common declarations in the ANet Daemon. + */ + #ifndef __MACTYPES__ Index: Args.c =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Args.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Args.c 2001/12/01 01:48:09 1.1 --- Args.c 2001/12/12 20:05:09 1.2 *************** *** 1,51 **** #include "Args.h" ! /* ! int main(int argc, char ** argv) ! { ! char * inString; ! char * ptr; ! char * argument; ! int i, argsSize; ! ! argsSize = 0; ! for(i = 0; i < argc; i++) ! { ! for(ptr = argv[i]; *ptr; ptr++, argsSize++); ! argsSize++; ! } ! ! printf("argsSize = %d\n", argsSize); ! ! if (!(inString = malloc(argsSize))) ! return -1; ! ! MakeArgumentString(argc, argv, inString, argsSize); ! ! printf("The argument string is [%s]\n", inString); ! ! if (!(argument = malloc(80))) ! return -1; ! ! if (GetArgument(inString, "d", argument, 80) != 0) ! printf("Argument -d is not passed\n"); ! else ! printf("argument -d is [%s]\n", argument); ! ! free(argument); ! if (!(argument = malloc(80))) ! return -1; ! ! if (GetArgument(inString, "c", argument, 80) != 0) ! printf("Argument -c is not passed\n"); ! else ! printf("argument -c is [%s]\n", argument); ! ! free(inString); ! return 0; ! } */ void MakeArgumentString(int argc, char ** argv, char * outArgs, int argsSize) { --- 1,26 ---- #include "Args.h" ! /*! ! \addtogroup argUtils Argument Utilities ! \ingroup utils ! Here are the argument utilities. They help parse/generate argument ! lists in the style of command-line arguments. ! \{ ! */ ! /*! ! \file ! \brief Argument utilities. ! \author Chyrag ! \author Benad */ + //! Makes a string from main-style argc and argv. + /*! + \param argc The number of arguments. + \param argv Array to a list of argument strings of size argc. + \param outArgs The generated string. Memory must already be allocated. + \param argsSize The size, in bytes, of the pre-allocated <CODE>outArgs</CODE>. + */ void MakeArgumentString(int argc, char ** argv, char * outArgs, int argsSize) { *************** *** 63,66 **** --- 38,52 ---- } + //! Gets a specified argument from an argument string. + /*! + This function tries to find the argument and, if possible, its value. + One-letter arguments can be grouped together as in "<CODE>-xzf</CODE>" but in this case all these arguments cannot have a value. + Otherwise, values can be assigned with "<CODE>--argument value</CODE>" or "<CODE>-a value</CODE>". + \param inString The argument string to parse. + \param inArg The argument to get. Must be a proper NULL-terminated string, even if it is a single letter. + \param outVal The value of the argument. Memory must already be allocated. + \param valSize The size, in bytes, of the pre-allocated <CODE>outVal</CODE>. + \return 1 if and only if the argument is in the string. + */ int GetArgument(char * inString, char * inArg, char * outVal, int valSize) { *************** *** 161,162 **** --- 147,149 ---- } + /*! \} */ Index: Args.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Args.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Args.h 2001/12/01 01:48:09 1.1 --- Args.h 2001/12/12 20:05:09 1.2 *************** *** 3,6 **** --- 3,13 ---- #include <string.h> + /*! + \file + \brief Argument utilities. + \author Chyrag + \author Benad + */ + void MakeArgumentString(int argc, char ** argv, char * outArgs, int argsSize); int GetArgument(char * inString, char * inArg, char * outVal, int valSize); Index: Files.h =================================================================== RCS file: /cvsroot/anet/ANet/ANet_Daemon/Common/Files.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Files.h 2001/12/04 00:50:03 1.4 --- Files.h 2001/12/12 20:05:09 1.5 *************** *** 17,20 **** --- 17,33 ---- #include "FilesSpecific.h" + /*! + \addtogroup files File Management Wrappers + \ingroup common + Here are the File Management Wrappers. They are "wrapper" functions that allow access to file management functions in a cross-platform way. + \{ + */ + + /*! + \file + \brief File management declarations. + \author Benad + */ + ANetFile ANetInitFile(); UInt32 ANetGetSetFilePath(ANetFile *f, ANetMemoryTag path, UInt8 set); *************** *** 31,32 **** --- 44,47 ---- #endif + + /*! \} */ |
From: Benoit N. <be...@us...> - 2001-12-12 20:04:45
|
Update of /cvsroot/anet/Documentation In directory usw-pr-cvs1:/tmp/cvs-serv3284 Added Files: Doxyfile Log Message: Starting low-level docs with doxygen --- NEW FILE: Doxyfile --- # Doxyfile 1.2.12 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # General configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = ANet # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French, # German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, # Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish. OUTPUT_LANGUAGE = English # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these class will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. It is allowed to use relative paths in the argument list. STRIP_FROM_PATH = # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower case letters. If set to YES upper case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # users are adviced to set this option to NO. CASE_SENSE_NAMES = YES # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explict @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # reimplements. INHERIT_DOCS = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 2 # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consist of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../ANet/ANet_Daemon/Common ../ANet/ANet_Daemon/Common/Lists ../ANet/ANet_Daemon/Core ../ANet/ANet_Daemon/ ../ANet/ANet_Daemon/Linux # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank file matching one of the following patterns are included: # *.c *.cc *.cxx *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = sample.c IMC.c StubModule.c ModuleLoader.c # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command <filter> <input-file>, where <filter> # is the value of the INPUT_FILTER tag, and <input-file> is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. INPUT_FILTER = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse. FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the Html help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript and frames is required (for instance Mozilla, Netscape 4.0+, # or Internet explorer 4.0+). Note that for large projects the tree generation # can take a very long time. In such cases it is better to disable this feature. # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimised for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assigments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_XML = NO #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line and do not end with a semicolon. Such function macros are typically # used for boiler-plate code, and will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::addtions related to external references #--------------------------------------------------------------------------- # The TAGFILES tag can be used to specify one or more tagfiles. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superceded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yield more powerful graphs. CLASS_DIAGRAMS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermedate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::addtions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO # The CGI_NAME tag should be the name of the CGI script that # starts the search engine (doxysearch) with the correct parameters. # A script with this name will be generated by doxygen. CGI_NAME = # The CGI_URL tag should be the absolute URL to the directory where the # cgi binaries are located. See the documentation of your http daemon for # details. CGI_URL = # The DOC_URL tag should be the absolute URL to the directory where the # documentation is located. If left blank the absolute path to the # documentation, with file:// prepended to it, will be used. DOC_URL = # The DOC_ABSPATH tag should be the absolute path to the directory where the # documentation is located. If left blank the directory on the local machine # will be used. DOC_ABSPATH = # The BIN_ABSPATH tag must point to the directory where the doxysearch binary # is installed. BIN_ABSPATH = # The EXT_DOC_PATHS tag can be used to specify one or more paths to # documentation generated for other projects. This allows doxysearch to search # the documentation for these projects as well. EXT_DOC_PATHS = |
From: Benoit N. <be...@us...> - 2001-12-11 23:34:04
|
Update of /cvsroot/anet/ANet In directory usw-pr-cvs1:/tmp/cvs-serv28827 Modified Files: CONTRIB Log Message: "" Index: CONTRIB =================================================================== RCS file: /cvsroot/anet/ANet/CONTRIB,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** CONTRIB 2001/12/05 14:43:55 1.4 --- CONTRIB 2001/12/11 23:34:02 1.5 *************** *** 15,19 **** mailto:aj...@us... ! Chirag Kantharia: mailto:ch...@ya... mailto:ch...@us... --- 15,19 ---- mailto:aj...@us... ! Chirag Kantharia (Chyrag): mailto:ch...@ya... mailto:ch...@us... |
From: Benoit N. <be...@us...> - 2001-12-05 14:43:58
|
Update of /cvsroot/anet/ANet In directory usw-pr-cvs1:/tmp/cvs-serv17770 Modified Files: CONTRIB Log Message: "" Index: CONTRIB =================================================================== RCS file: /cvsroot/anet/ANet/CONTRIB,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** CONTRIB 2001/12/01 01:55:39 1.3 --- CONTRIB 2001/12/05 14:43:55 1.4 *************** *** 18,19 **** --- 18,24 ---- mailto:ch...@ya... mailto:ch...@us... + http://chyrag.dhs.org/ + + Prasanna Gopinath: + mailto:gpr...@us... + mailto:pra...@ho... |
From: Benoit N. <be...@us...> - 2001-12-04 20:47:08
|
Update of /cvsroot/anet/ANet/ANet_Daemon/Linux/IP_Sample In directory usw-pr-cvs1:/tmp/cvs-serv27272 Added Files: syncserver.c tcpclient.c udpclient.c Log Message: "" --- NEW FILE: syncserver.c --- #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <unistd.h> /* close */ #define SUCCESS 0 #define ERROR 1 #define END_LINE 0x0A #define SERVER_PORT 1500 #define MAX_MSG 100 /* function readline */ int read_line(); int main (int argc, char *argv[]) { int n, sd, newSd, cliLen; struct sockaddr_in cliAddr, servAddr; char line[MAX_MSG]; if(argc < 2) { printf("usage: %s <TCP | UDP>\n",argv[0]); exit(1); } /* create socket */ if (strcmp(argv[1],"TCP") == 0) { sd = socket(AF_INET, SOCK_STREAM, 0); if(sd<0) { perror("cannot open socket "); return ERROR; } } else if (strcmp(argv[1],"UDP") == 0) { sd = socket(AF_INET, SOCK_DGRAM, 0); if(sd<0) { perror("cannot open socket "); return ERROR; } } /* bind server port */ servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(SERVER_PORT); if(bind(sd, (struct sockaddr *) &servAddr, sizeof(servAddr))<0) { perror("cannot bind port "); return ERROR; } if (strcmp(argv[1],"TCP") == 0) { listen(sd,5); } while(1) { /* init line */ memset(line,0x0,MAX_MSG); cliLen = sizeof(cliAddr); if (strcmp(argv[1],"UDP") == 0) { printf("%s: waiting for data on port UDP %u\n",argv[0],SERVER_PORT); n = recvfrom(sd,line,MAX_MSG,0,(struct sockaddr *) &cliAddr,&cliLen); if (n < 0) { printf("%s : cannot receive data\n",argv[1]); continue; } printf("%s: from %s : UDP %u :%s \n", argv[0],inet_ntoa(cliAddr.sin_addr),ntohs(cliAddr.sin_port), line); } else { printf("%s: waiting for data on port TCP %u\n",argv[0],SERVER_PORT); newSd = accept(sd, (struct sockaddr *) &cliAddr, &cliLen); if(newSd<0) { perror("cannot accept connection "); return ERROR; } /* receive segments */ while(read_line(newSd,line)!=ERROR) { printf("%s: received from %s:TCP%d : %s\n", argv[0], inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port), line); } /* while(read_line) */ } /* if else */ } /* while (1) */ } int read_line(int newSd, char *line_to_return) { static int rcv_ptr=0; static char rcv_msg[MAX_MSG]; static int n; int offset; offset=0; while(1) { if(rcv_ptr==0) { /* read data from socket */ memset(rcv_msg,0x0,MAX_MSG); /* init buffer */ n = recv(newSd, rcv_msg, MAX_MSG, 0); /* wait for data */ if (n<0) { perror(" cannot receive data "); return ERROR; } else if (n==0) { printf(" connection closed by client\n"); close(newSd); return ERROR; } } /* copy line into 'line_to_return' */ while(*(rcv_msg+rcv_ptr)!=END_LINE && rcv_ptr<n) { memcpy(line_to_return+offset,rcv_msg+rcv_ptr,1); offset++; rcv_ptr++; } /* end of line + end of buffer => return line */ if(rcv_ptr==n-1) { /* set last byte to END_LINE */ *(line_to_return+offset)=END_LINE; rcv_ptr=0; return ++offset; } /* end of line but still some data in buffer => return line */ if(rcv_ptr <n-1) { /* set last byte to END_LINE */ *(line_to_return+offset)=END_LINE; rcv_ptr++; return ++offset; } printf("Recived Message -> %s\n",rcv_msg); /* end of buffer but line is not ended => */ /* wait for more data to arrive on socket */ if(rcv_ptr == n) { rcv_ptr = 0; } } /* while */ } --- NEW FILE: tcpclient.c --- #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <unistd.h> /* close */ #define SERVER_PORT 1600 #define MAX_MSG 512 int main (int argc, char *argv[]) { int sd, rc, i; struct sockaddr_in localAddr, servAddr; struct hostent *h; if(argc < 3) { printf("usage: %s <server> <data1> <data2> ... <dataN>\n",argv[0]); exit(1); } h = gethostbyname(argv[1]); if(h==NULL) { printf("%s: unknown host '%s'\n",argv[0],argv[1]); exit(1); } servAddr.sin_family = h->h_addrtype; memcpy((char *) &servAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length); servAddr.sin_port = htons(SERVER_PORT); /* create socket */ sd = socket(AF_INET, SOCK_STREAM, 0); if(sd<0) { perror("cannot open socket "); exit(1); } /* bind any port number */ localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = htonl(INADDR_ANY); localAddr.sin_port = htons(0); rc = bind(sd, (struct sockaddr *) &localAddr, sizeof(localAddr)); if(rc<0) { printf("%s: cannot bind port TCP %u\n",argv[0],SERVER_PORT); perror("error "); exit(1); } /* connect to server */ rc = connect(sd, (struct sockaddr *) &servAddr, sizeof(servAddr)); if(rc<0) { perror("cannot connect "); exit(1); } for(i=2;i<argc;i++) { rc = send(sd, argv[i], strlen(argv[i]) + 1, 0); if(rc<0) { perror("cannot send data "); close(sd); exit(1); } printf("%s: data%u sent (%s)\n",argv[0],i-1,argv[i]); } return 0; } --- NEW FILE: udpclient.c --- #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <unistd.h> #include <string.h> /* memset() */ #include <sys/time.h> /* select() */ #define REMOTE_SERVER_PORT 1600 #define MAX_MSG 512 int main(int argc, char *argv[]) { int sd, rc, i; struct sockaddr_in cliAddr, remoteServAddr; struct hostent *h; /* check command line args */ if(argc<3) { printf("usage : %s <server> <data1> ... <dataN> \n", argv[0]); exit(1); } /* get server IP address (no check if input is IP address or DNS name */ h = gethostbyname(argv[1]); if(h==NULL) { printf("%s: unknown host '%s' \n", argv[0], argv[1]); exit(1); } printf("%s: sending data to '%s' (IP : %s) \n", argv[0], h->h_name, inet_ntoa(*(struct in_addr *)h->h_addr_list[0])); remoteServAddr.sin_family = h->h_addrtype; memcpy((char *) &remoteServAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length); remoteServAddr.sin_port = htons(REMOTE_SERVER_PORT); /* socket creation */ sd = socket(AF_INET,SOCK_DGRAM,0); if(sd<0) { printf("%s: cannot open socket \n",argv[0]); exit(1); } /* bind any port */ cliAddr.sin_family = AF_INET; cliAddr.sin_addr.s_addr = htonl(INADDR_ANY); cliAddr.sin_port = htons(0); rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr)); if(rc<0) { printf("%s: cannot bind port\n", argv[0]); exit(1); } /* send data */ for(i=2;i<argc;i++) { rc = sendto(sd, argv[i], strlen(argv[i])+1, 0, (struct sockaddr *) &remoteServAddr, sizeof(remoteServAddr)); if(rc<0) { printf("%s: cannot send data %d \n",argv[0],i-1); close(sd); exit(1); } } return 1; } |
From: Benoit N. <be...@us...> - 2001-12-04 20:46:35
|
Update of /cvsroot/anet/ANet/ANet_Daemon/Linux/IP_Sample In directory usw-pr-cvs1:/tmp/cvs-serv27104/IP_Sample Log Message: Directory /cvsroot/anet/ANet/ANet_Daemon/Linux/IP_Sample added to the repository |