diff --git a/semester3/spca/code-examples/.clang-format b/semester3/spca/code-examples/.clang-format new file mode 100644 index 0000000..ea63d60 --- /dev/null +++ b/semester3/spca/code-examples/.clang-format @@ -0,0 +1,276 @@ +# ───────────────────────────────────────────────────────────────────── +# ╭─────────────────────────────────────────────────╮ +# │ clang-format config │ +# ╰─────────────────────────────────────────────────╯ +# ───────────────────────────────────────────────────────────────────── +BasedOnStyle: LLVM +AccessModifierOffset: -2 +AlignAfterOpenBracket: BlockIndent +AlignArrayOfStructures: Left +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: true + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveMacros: + Enabled: true + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveShortCaseStatements: + Enabled: true + AcrossEmptyLines: false + AcrossComments: false + AlignCaseArrows: false + AlignCaseColons: false +AlignConsecutiveTableGenBreakingDAGArgColons: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveTableGenCondOperatorColons: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveTableGenDefinitionColons: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignEscapedNewlines: Right +AlignOperands: Align +AlignTrailingComments: + Kind: Always + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowBreakBeforeNoexceptSpecifier: Never +AllowShortBlocksOnASingleLine: Never +AllowShortCaseExpressionOnASingleLine: true +AllowShortCaseLabelsOnASingleLine: false +AllowShortCompoundRequirementOnASingleLine: true +AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: Empty +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AttributeMacros: + - __capability +BinPackArguments: false +BinPackParameters: false +BitFieldColonSpacing: Both +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: true + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakAdjacentStringLiterals: true +BreakAfterAttributes: Always +BreakAfterJavaFieldAnnotations: false +BreakAfterReturnType: None +BreakArrays: true +BreakBeforeBinaryOperators: All +BreakBeforeBraces: Attach +BreakBeforeConceptDeclarations: Always +BreakBeforeInlineASMColon: OnlyMultiline +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeColon +BreakFunctionDefinitionParameters: false +BreakInheritanceList: BeforeColon +BreakStringLiterals: true +BreakTemplateDeclarations: MultiLine +ColumnLimit: 100 +CommentPragmas: "^ IWYU pragma:" +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: true +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: Always +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: ^"(llvm|llvm-c|clang|clang-c)/ + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: ^(<|"(gtest|gmock|isl|json)/) + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: .* + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: (Test)?$ +IncludeIsMainSourceRegex: "" +IndentAccessModifiers: true +IndentCaseBlocks: true +IndentCaseLabels: true +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: BeforeHash +IndentRequiresClause: true +IndentWidth: 4 +IndentWrappedFunctionNames: true +InsertBraces: false +InsertNewlineAtEOF: false +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLines: + AtEndOfFile: false + AtStartOfBlock: true + AtStartOfFile: true +LambdaBodyIndentation: Signature +LineEnding: DeriveLF +MacroBlockBegin: "" +MacroBlockEnd: "" +MainIncludeChar: Quote +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PPIndentWidth: -1 +PackConstructorInitializers: BinPack +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakScopeResolution: 500 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +QualifierAlignment: Left +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: true +RemoveParentheses: MultipleParentheses +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Always +ShortNamespaceLines: 1 +SkipMacroDefinitionBody: false +SortIncludes: CaseSensitive +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: true +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: true +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeJsonColon: false +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDeclarationName: true + AfterFunctionDefinitionName: true + AfterIfMacros: true + AfterOverloadedOperator: false + AfterPlacementOperator: true + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParens: Custom +SpacesInParensOptions: + ExceptDoubleParentheses: false + InConditionalStatements: true + InCStyleCasts: false + InEmptyParentheses: false + Other: true +SpacesInSquareBrackets: true +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 4 +TableGenBreakInsideDAGArg: DontBreak +UseTab: Never +VerilogBreakBetweenInstancePorts: true +WhitespaceSensitiveMacros: + - BOOST_PP_STRINGIZE + - CF_SWIFT_NAME + - NS_SWIFT_NAME + - PP_STRINGIZE + - STRINGIZE diff --git a/semester3/spca/code-examples/00_c/01_syntax/00_intro.c b/semester3/spca/code-examples/00_c/01_syntax/00_intro.c new file mode 100644 index 0000000..f503d99 --- /dev/null +++ b/semester3/spca/code-examples/00_c/01_syntax/00_intro.c @@ -0,0 +1,16 @@ +// This is a line comment +/* this is a block comment */ +#include "01_func.h" // Relative import + +int i = 0; // This allocates an integer on the stack + +int main( int argc, char *argv[] ) { + // This is the function body of a function (here the main function) + // which serves as the entrypoint to the program in C and has arguments + printf( "Argc: %d\n", argc ); // Number of arguments passed, always >= 1 + // (first argument is the executable name) + for ( int i = 0; i < argc; i++ ) // For loop just like any other sane programming language + printf( "Arg %d: %s\n", i, argv[ i ] ); // Outputs the i-th argument from CLI + + get_user_input_int( "Select a number" ); +} diff --git a/semester3/spca/code-examples/00_c/01_syntax/01_func.c b/semester3/spca/code-examples/00_c/01_syntax/01_func.c new file mode 100644 index 0000000..63df54d --- /dev/null +++ b/semester3/spca/code-examples/00_c/01_syntax/01_func.c @@ -0,0 +1,37 @@ +#include "01_func.h" + +int get_user_input_int( char prompt[] ) { + int input_data; + printf( "%s", prompt ); // Always wrap strings like this for printf + scanf( "%d", &input_data ); // Get user input from CLI + + // If statements just like any other language + if ( input_data ) + printf( "Not 0" ); + else + printf( "Input is zero" ); + + switch ( input_data ) { + case 5: + printf( "You win!" ); + break; // Doesn't fall through + case 6: + printf( "You were close" ); // Falls through + default: + printf( "No win" ); // Case for any not covered input + } + + int input_data_copy = input_data; + + while ( input_data > 1 ) { + input_data -= 1; + printf( "Hello World" ); + } + + do { + input_data -= 1; + printf( "Bye World" ); + } while ( input_data_copy > 1 ); + + return 0; +} diff --git a/semester3/spca/code-examples/00_c/01_syntax/01_func.h b/semester3/spca/code-examples/00_c/01_syntax/01_func.h new file mode 100644 index 0000000..f0e9cb1 --- /dev/null +++ b/semester3/spca/code-examples/00_c/01_syntax/01_func.h @@ -0,0 +1,4 @@ +#include // Import from system path + // (like library imports in other languages) + +int get_user_input_int( char prompt[] ); diff --git a/semester3/spca/parts/00_c/00_intro.tex b/semester3/spca/parts/00_c/00_intro.tex index 90e44f4..7e75a14 100644 --- a/semester3/spca/parts/00_c/00_intro.tex +++ b/semester3/spca/parts/00_c/00_intro.tex @@ -1,8 +1,13 @@ I can clearly C why you'd want to use C. Already sorry in advance for all the bad C jokes that are going to be part of this section -\texttt{C} is a compiled, low-level programming language, lacking many features modern high-level programming languages offer, like Object Oriented programming, true Functional Programming, Garbage Collection, complex abstract datatypes and vectors, just to name a few. (It is possible to replicate these, more on this later). +\texttt{C} is a compiled, low-level programming language, lacking many features modern high-level programming languages offer, like Object Oriented programming, +true Functional Programming (like Haskell implements), Garbage Collection, complex abstract datatypes and vectors, just to name a few. +(It is possible to replicate these using Preprocessor macros, more on this later). -On the other hand, it offers the ability to directly integrate assembly code into the \texttt{.c} files, as well as bit level data manipulation and extensive memory management options, again just to name a few. +On the other hand, it offers the ability to directly integrate assembly code into the \texttt{.c} files, +as well as bit level data manipulation and extensive memory management options, again just to name a few. -This of course leads to \texttt{C} performing excellently and there are many programming languages who's compiler doesn't directly produce machine code or assembly, but instead optimized \texttt{C} code that is then compiled into machine code using a \texttt{C} compiler. -This has a number of benefits, most notably that \texttt{C} compilers can produce very efficient assembly, as lots of effort is put into the \texttt{C} compilers by the hardware manufacturers. +This of course leads to \texttt{C} performing excellently and there are many programming languages who's compiler doesn't directly produce machine code or assembly, +but instead optimized \texttt{C} code that is then compiled into machine code using a \texttt{C} compiler. +This has a number of benefits, most notably that \texttt{C} compilers can produce very efficient assembly, +as lots of effort is put into the \texttt{C} compilers by the hardware manufacturers. diff --git a/semester3/spca/parts/00_c/01_syntax.tex b/semester3/spca/parts/00_c/01_syntax.tex new file mode 100644 index 0000000..2193dba --- /dev/null +++ b/semester3/spca/parts/00_c/01_syntax.tex @@ -0,0 +1,6 @@ +\subsection{The Syntax} +\texttt{C} uses a very similar syntax as many other programming languages, like \texttt{Java}, \texttt{JavaScript} and many more\dots +to be precise, it is \textit{them} that use the \texttt{C} syntax, not the other way around. So: +\inputcodewithfilename{c}{code-examples/00_c/01_syntax/}{00_intro.c} +\inputcodewithfilename{c}{code-examples/00_c/01_syntax/}{01_func.h} +\inputcodewithfilename{c}{code-examples/00_c/01_syntax/}{01_func.c} diff --git a/semester3/spca/spca-summary.pdf b/semester3/spca/spca-summary.pdf index e08d2c3..4101d0b 100644 Binary files a/semester3/spca/spca-summary.pdf and b/semester3/spca/spca-summary.pdf differ diff --git a/semester3/spca/spca-summary.tex b/semester3/spca/spca-summary.tex index bc394a6..916d125 100644 --- a/semester3/spca/spca-summary.tex +++ b/semester3/spca/spca-summary.tex @@ -1,8 +1,6 @@ \documentclass{article} -\newcommand{\dir}{~/projects/latex} -\input{\dir/include.tex} -\load{recommended} +\input{~/projects/latex/dist/full.tex} \setup{Systems Programming and Computer Architecture} @@ -57,6 +55,7 @@ \newsection \section{The C Programming Language} \input{parts/00_c/00_intro.tex} +\input{parts/00_c/01_syntax.tex} % ── Intro to x86 asm ────────────────────────────────────────────────